Skip to content

Commit 5e4976b

Browse files
committed
fix: declare @lessjs/signals dependency in core, adjust publish order, update release note
- packages/core/deno.json: add @lessjs/signals to imports (required by dsd-element.ts for effect()) - .github/workflows/publish-jsr.yml: move signals before core in publish order (core now depends on signals) - docs/releases/0.24.2.md: comprehensive update with all 4 production hotfixes, file changes, and JSX infrastructure verification All checks passing: - graph:check ✅ (18 packages, no cycles, consistent publish order) - fmt:check ✅ - lint ✅ - typecheck ✅ - test ✅ (939 passed, 0 failed)
1 parent ba45b3c commit 5e4976b

3 files changed

Lines changed: 40 additions & 17 deletions

File tree

‎.github/workflows/publish-jsr.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ jobs:
6464
publish_if_missing "@lessjs/protocols" "packages/protocols"
6565
publish_if_missing "@lessjs/style-sheet" "packages/style-sheet"
6666
publish_if_missing "@lessjs/create" "packages/create"
67-
# depend on core or low-level facades: signals, runtime, compat-check, cem, content, i18n, adapter-*, ui, hub
68-
publish_if_missing "@lessjs/core" "packages/core"
67+
# v0.24.3: @lessjs/signals is now a dependency of @lessjs/core (effect() for VNode signal tracking)
6968
publish_if_missing "@lessjs/signals" "packages/signals"
69+
publish_if_missing "@lessjs/core" "packages/core"
7070
publish_if_missing "@lessjs/runtime" "packages/runtime"
7171
publish_if_missing "@lessjs/cem" "packages/cem"
7272
publish_if_missing "@lessjs/compat-check" "packages/compat-check"

‎docs/releases/0.24.2.md‎

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
77
## Summary
88

9-
v0.24.2 completes the migration started in v0.24.1 by removing the old `html` tagged template component model entirely. All components now use JSX + `static props` + Signal, with zero backward-compatibility overhead.
9+
v0.24.2 completes the migration started in v0.24.1 by removing the old `html` tagged template component model entirely. All components now use JSX + `static props` + Signal, with zero backward-compatibility overhead. Four production hotfixes were applied post-release to fix JSX infrastructure gaps.
1010

1111
## What Changed
1212

@@ -22,15 +22,27 @@ v0.24.2 completes the migration started in v0.24.1 by removing the old `html` ta
2222
- JSX `IntrinsicElements` type declarations for TypeScript
2323
- Signal auto-unwrap in `renderToString` (JSX expressions `{signal}` auto-resolve `.value`)
2424
- `renderToDOM` integration in `_renderIntoShadowRoot` for proper event binding
25+
- **`@lessjs/signals` as explicit dependency of `@lessjs/core`**: Core now imports `effect()` from signals for VNode signal tracking. Publish order adjusted: signals (5) → core (6).
2526

2627
### Fixed
2728

29+
#### Production Hotfixes (post-release)
30+
31+
| # | Bug | Root Cause | Fix |
32+
|---|-----|-----------|-----|
33+
| 1 | Island components render `[object Object]` | `build-client.ts` and `build-ssg.ts` internal `viteBuild()` calls use `configFile: false`, ignoring user's `vite.config.ts` esbuild JSX config. esbuild defaults to classic `React.createElement`, producing objects DsdElement can't read. | Added `esbuild: { jsx: 'automatic', jsxImportSource: '@lessjs/core' }` to both internal build configs. |
34+
| 2 | SVG icons disappear after hydration | `renderToDOM` uses `document.createElement()` for all elements, placing SVG elements (circle, line, path, svg) in HTML namespace where browsers won't render them. | Added `SVG_TAGS` set (50+ elements) and `createElementForTag()` helper that routes SVG elements to `document.createElementNS()`. |
35+
| 3 | Theme toggle doesn't switch / theme lost on navigation | `_renderIntoShadowRoot`'s VNode branch renders DOM but never subscribes to signals. TemplateResult path has `_subscribeTemplateSignals()`; VNode path had no equivalent. | Wrapped `render()` in an alien-signals `effect()` that auto-tracks signal accesses and re-renders DOM on changes. Disposed in `_disposeSignalSubscriptions()`. |
36+
| 4 | `graph:check` fails: core imports signals without declaration | `dsd-element.ts` imports `effect` from `@lessjs/signals` but `packages/core/deno.json` didn't declare the dependency. | Added `@lessjs/signals` to core's imports; moved signals before core in CI publish order. |
37+
38+
#### Pre-release Fixes
39+
2840
- **VNode event binding**: `_renderIntoShadowRoot` previously used `renderToString` for VNode, which silently dropped `onClick`/`onInput` handlers. Now uses `renderToDOM` with `addEventListener`.
29-
- **SSG package resolver `.tsx` subpath resolution**: `resolveVirtualLessPackageRelative` in `ssg-package-resolver.ts` blindly appended `.ts` to all relative imports, causing `.tsx` UI components (`less-dialog`, `less-theme-toggle`, `less-layout`, etc.) to resolve to non-existent `.ts` files. Added `resolveSourcePathExtension` that consults `LESSJS_EXPORT_FILES` to preserve the exact source extension.
30-
- **JSX DOM renderer signal child unwrap**: `renderToDOM` now auto-unwraps Signal values in children (matching `renderToString` behavior), preventing `[object Object]` from appearing in CSR when JSX expressions contain signals.
31-
- **`www` stale `.js` search imports**: All route files and `_renderer.ts` still imported `less-search.js`, but the island file is `less-search.tsx`. Updated 6 import paths to `.tsx`.
32-
- **`@lessjs/runtime` missing `LessRenderer` export**: Added `export type { LessRenderer }` so that `www/app/shared/section-renderer.ts` and `registry/_renderer.ts` can import the type from the authoring facade.
33-
- **Generated project build test alias drift**: `packages/create/__tests__/cli.test.ts` local workspace aliases for `@lessjs/ui/*` components and `@lessjs/core/jsx-runtime` were still pointing to `.ts` files. Updated all UI component aliases to `.tsx` and added `jsx-runtime` / `jsx-dev-runtime` subpath aliases to prevent parent-alias ENOTDIR errors.
41+
- **SSG package resolver `.tsx` subpath resolution**: `resolveVirtualLessPackageRelative` in `ssg-package-resolver.ts` blindly appended `.ts` to all relative imports, causing `.tsx` UI components to resolve to non-existent `.ts` files. Added `resolveSourcePathExtension` that consults `LESSJS_EXPORT_FILES`.
42+
- **JSX DOM renderer signal child unwrap**: `renderToDOM` now auto-unwraps Signal values in children (matching `renderToString` behavior).
43+
- **`www` stale `.js` search imports**: All route files and `_renderer.ts` updated to `.tsx`.
44+
- **`@lessjs/runtime` missing `LessRenderer` export**: Added re-export.
45+
- **Generated project build test alias drift**: Updated all UI component aliases to `.tsx` and added `jsx-runtime` subpath aliases.
3446

3547
## Migration Guide
3648

@@ -83,20 +95,30 @@ class MyComp extends DsdElement {
8395

8496
| Package | Files Changed |
8597
| ----------------------- | ----------------------------------------------------------------------------------------------------------- |
86-
| `@lessjs/core` | `dsd-element.ts`, `index.ts`, `prop.ts`, `jsx-runtime.ts`, `jsx-render-string.ts`, `jsx-render-dom.ts` |
87-
| `@lessjs/adapter-vite` | `ssg-package-resolver.ts`, `__tests__/ssg-package-resolver.test.ts` |
98+
| `@lessjs/core` | `dsd-element.ts`, `index.ts`, `prop.ts`, `jsx-runtime.ts`, `jsx-render-string.ts`, `jsx-render-dom.ts`, `deno.json` |
99+
| `@lessjs/adapter-vite` | `build-client.ts`, `build-ssg.ts`, `ssg-package-resolver.ts`, `__tests__/ssg-package-resolver.test.ts` |
88100
| `@lessjs/runtime` | `src/index.ts` (added `LessRenderer` re-export) |
89101
| `@lessjs/ui` | 10 `.ts` → `.tsx` (all `less-*` components) |
90-
| `www/` | 6 island `.ts` → `.tsx`; 6 route files updated `less-search.js` → `less-search.tsx` |
102+
| `www/` | 6 island `.ts` → `.tsx`; `vite.config.ts` esbuild JSX config; 6 route files updated |
91103
| `packages/create/tests` | `__tests__/cli.test.ts` — updated local workspace aliases to `.tsx` and added `jsx-runtime` subpath aliases |
92-
| config | 27 `deno.json` version bumps, workspace import paths |
104+
| CI | `.github/workflows/publish-jsr.yml` — signals moved before core in publish order |
105+
| Docs | `CHANGELOG.md`, `docs/releases/0.24.2.md` |
93106

94107
## Verification
95108

96-
- `deno fmt` ✅
97-
- `deno lint` ✅
109+
- `deno fmt` ✅ (602 files)
110+
- `deno lint` ✅ (318 files)
98111
- `deno task typecheck` ✅
99-
- `deno task graph:check` ✅ (18 packages, no cycles)
112+
- `deno task graph:check` ✅ (18 packages, no cycles, publish order consistent)
100113
- `deno test` ✅ 939 passed, 0 failed
101-
- `deno task build` ✅ (www/dist generated, 466 URLs, 429 pages)
102-
- No `[object Object]` in build output
114+
- `deno task build` ✅ (www/dist generated)
115+
- No circular dependencies
116+
- All source-level `@lessjs/*` imports declared in respective `deno.json`
117+
118+
### JSX Infrastructure Verification
119+
120+
The four production hotfixes ensure the JSX pipeline works end-to-end:
121+
- **Build**: Vite/Rolldown transforms `.tsx` → LessJS VNode (not React)
122+
- **Render**: `renderToDOM` creates SVG elements in correct namespace
123+
- **Reactivity**: `effect()` drives VNode re-render on signal changes
124+
- **Publish**: Dependency graph is consistent (signals → core)

‎packages/core/deno.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
},
2121
"imports": {
2222
"parse5": "npm:parse5@7.0.0",
23+
"@lessjs/signals": "jsr:@lessjs/signals@^0.24.2",
2324
"@lessjs/style-sheet": "jsr:@lessjs/style-sheet@^0.24.2"
2425
},
2526
"publish": {

0 commit comments

Comments
 (0)