From 6da89e8a14319b499a1809ab497b89d06e39436a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 18:38:51 +0000 Subject: [PATCH] Version packages (rc) --- .changeset/pre.json | 48 +++++++++- packages/babel-plugin/CHANGELOG.md | 7 ++ packages/babel-plugin/package.json | 2 +- packages/compiler/CHANGELOG.md | 14 +++ .../compiler/npm/darwin-arm64/package.json | 2 +- packages/compiler/npm/darwin-x64/package.json | 2 +- .../compiler/npm/linux-arm64-gnu/package.json | 2 +- .../compiler/npm/linux-x64-gnu/package.json | 2 +- .../compiler/npm/wasm32-wasi/package.json | 2 +- .../compiler/npm/win32-x64-msvc/package.json | 2 +- packages/compiler/package.json | 14 +-- packages/diagnostics/CHANGELOG.md | 33 +++++++ packages/diagnostics/package.json | 4 +- packages/element/CHANGELOG.md | 38 ++++++++ packages/element/package.json | 6 +- packages/h/CHANGELOG.md | 34 +++++++ packages/h/package.json | 4 +- packages/html/CHANGELOG.md | 34 +++++++ packages/html/package.json | 4 +- packages/signals/CHANGELOG.md | 89 +++++++++++++++++ packages/signals/package.json | 2 +- packages/solid/CHANGELOG.md | 52 ++++++++++ packages/solid/package.json | 4 +- packages/test-integration/CHANGELOG.md | 56 +++++++++++ packages/test-integration/package.json | 2 +- packages/universal/CHANGELOG.md | 14 +++ packages/universal/package.json | 4 +- packages/web/CHANGELOG.md | 96 +++++++++++++++++++ packages/web/package.json | 4 +- pnpm-lock.yaml | 19 ---- 30 files changed, 545 insertions(+), 51 deletions(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index 63df10252..bba174388 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -28,6 +28,7 @@ "action-in-owned-scope-guard", "action-thenable-assimilation-settle", "add-diagnostics-package", + "add-per-call-invoke", "add-refresh-subpath", "add-serialization-subpath", "add-server-functions-subpath", @@ -50,6 +51,7 @@ "async-slot-args-value-tier", "attribution-unstable-memo-output", "attribution-wide-write", + "audit-driver-family-decline-multi-slot", "avoid-reconcile-key-recompute", "bare-client-source-suspends-as-final-hole", "behavior-claims-delegate-glue", @@ -70,6 +72,7 @@ "bump-dom-expressions-next-4", "bump-dom-expressions-next-5", "bump-dom-expressions-next-8", + "clarify-invoke-wrapper-contract", "clean-bikes-teach", "client-only-preload-hints", "client-only-sibling-id-drift", @@ -77,6 +80,8 @@ "cold-field-extension-split", "companion-oracle-census", "companion-shadow-redesign", + "compiler-loader-accepts-patch-driver", + "compiler-loader-prefer-local-build", "container-tier-projection-traces", "context-default-less-throws", "core-hot-path-shape-alignment", @@ -95,6 +100,7 @@ "dev-tools-cleanup", "dev-warn-unhandled-async", "diagnostic-code-prefix", + "diagnostic-console-footers", "document-action-await-contract", "document-action-mutation-navigation-framing", "document-control-flow-callback-shapes", @@ -114,6 +120,7 @@ "eliminate-optimistic-revert-targets", "export-memo-options", "expose-enableExternalSource-loading-on", + "fetch-option-retry-contract", "fill-cleanup-occurrence-scope", "fix-absorbed-compiler-parity", "fix-action-falsy-generator-throw", @@ -127,6 +134,7 @@ "fix-affects-first-statement-lane", "fix-affects-mark-read-transparency", "fix-array-index-write-detection", + "fix-array-target-dictionary-mode", "fix-asset-preload-rejection", "fix-async-boundary-diagnostic", "fix-async-generator-action-freeze", @@ -166,10 +174,12 @@ "fix-hybrid-iterable-signal-takeover", "fix-hydrated-nullish-values", "fix-hydration-and-signals-baseline", + "fix-hydration-latched-divergence-lost", "fix-insert-sibling-rerender", "fix-insert-text-node-reuse", "fix-ispending-dev-prod-divergence", "fix-ispending-errored-source-loop", + "fix-ispending-memo-consistency", "fix-ispending-optimistic-refresh", "fix-keyed-affects-cross-family", "fix-keyed-show-strict-read", @@ -224,9 +234,12 @@ "fix-projection-refresh-pending", "fix-projection-refresh-stale-pending", "fix-projection-splice-overrides", + "fix-projection-ssr-flush-loop-hang", "fix-projection-ssr-promise-resolution", + "fix-projection-store-effect-phase-visibility", "fix-projection-store-root-chaining", "fix-projection-streaming-without-loading-boundary", + "fix-projection-transition-isolation", "fix-reaction-zero-dep-dispose", "fix-reconcile-array-node-sync", "fix-reconcile-array-object-type-mismatch", @@ -250,6 +263,7 @@ "fix-resting-optimistic-async-commit", "fix-reveal-frontier-errored-boundary", "fix-scheduler-child-queue-removal", + "fix-select-empty-value-ssr", "fix-server-dynamic-promise-source", "fix-server-effect-error-swallow", "fix-server-effect-pending-read-loop", @@ -261,6 +275,7 @@ "fix-shallow-store-proxy-children", "fix-show-ssr-hydration-placement", "fix-silent-error-recovery-stale-reveal", + "fix-slot-emission-append-race", "fix-snapshot-array-length-zero", "fix-snapshot-derived-store-row-proxy-leak", "fix-snapshot-optimistic-overlay", @@ -281,6 +296,7 @@ "fix-ssrsource-client-hybrid-hydration", "fix-storage-types-path", "fix-store-cold-write-batching", + "fix-store-fold-scheduling-strand", "fix-store-in-store-track-chaining", "fix-store-prototype-getters", "fix-store-proxy-invariants", @@ -295,10 +311,10 @@ "fix-throwing-effect-cleanup", "fix-transition-merge-optimistic-dup", "fix-transparent-insert-alignment", + "fix-usehead-prelude-hydration-walk", "flatten-promise-of-async-iterable", "fluffy-bananas-smoke", "fold-runtime-wrappers", - "forbid-wrapped-module-server-exports", "format-ssr-hydration-followups", "fragment-ledger-one-reveal-owner", "fragment-reveal-policy-registry", @@ -328,6 +344,7 @@ "ispending-loading-guard", "ispending-wrapper-fresh-hold", "iterate-bare-step-tolerance", + "jfb-driver-and-write-bound", "keep-ambient-batch-on-stash", "late-boundary-held-fragment-wait", "latest-lazy-companion-backfill", @@ -355,12 +372,14 @@ "migrate-web-runtime-to-ts", "missing-effect-fn-loud-failure", "mode-specific-control-flow-callbacks", + "module-server-exports-register-by-value", "move-loading-wrapper-into-flow", "move-to-beta", "multi-root-pending-boundaries", "nohydration-lazy-maparray-deps", "notready-skip-stack-capture", "npm-descriptions", + "optimistic-lists-drivable", "optimistic-mask-effective-writes-only", "optimistic-mask-ispending", "optimize-effect-creation", @@ -369,11 +388,25 @@ "option-a-mid-transition-observability", "owned-non-lazy-memo-autodispose", "pass-2-collapse", + "patch-channel-pay-for-use", + "patch-channel-pr-a", + "patch-channel-reaudit-2", + "patch-channel-reaudit-3", + "patch-channel-reaudit-5", + "patch-channel-reaudit-hardening", + "patch-channel-row-ops", + "patch-fallback-semantics", + "patch-held-on-transition", + "patch-list-hydration-claim", + "patch-list-identity-ruling", + "patch-mode-list-driver", + "patch-two-tier-arming", "pay-for-use-treeshaking-phase-1", "pay-for-use-treeshaking-phase-2", "pay-for-use-treeshaking-phase-3", "pending-hold-provenance-and-a20", "per-root-boundary-resume", + "per-row-patch-unbinds", "perf-2893-guard-cleanup", "perf-dep-revalidation-and-reconcile", "perfect-spies-pretend", @@ -384,6 +417,7 @@ "portal-marker-cleanup", "predigested-flight-outcome", "preserve-store-symbol-snapshots", + "projection-lists-drivable", "projection-root-entity-swap", "propagation-hot-path-regression", "protect-server-functions-csrf", @@ -394,11 +428,13 @@ "reconcile-array-object-shape-guard", "reconcile-default-id-positional-null", "reconcile-symbol-keyed-nodes", + "reconcile-walk-guard-hoist", "recover-from-halt-in-dev-workflows", "redesign-refresh-targets", "refactor-ssr-stream-blocking", "refactor-widen-prop-value-printwidth", "refine-server-boundary-settlement", + "refresh-call-expr-registration", "refresh-lifts-stale-manual-write-mask", "refreshable-type-alias", "remove-derived-initial-values", @@ -421,20 +457,29 @@ "reveal-ssr-streaming-support", "reveal-string-ssr-collapsed", "reveal-together-nested", + "row-proof-admission", "rude-pillows-tell", "rxcore-ssr-async-value", + "scope-function-children-holes", "serialization-decode-entry", "server-component-context-barrier", "server-first-value-lock", "server-function-call-observers", "server-function-extension-surface", + "server-function-http-hygiene", + "server-function-path-addressing", + "server-functions-client-fetch", "server-memo-commit-liveness", "server-memo-scaffold-diet", "server-mock-csp-nonce", "server-slot-store-and-boundary-trims", "server-store-replacement-optimistic-noop", + "setter-row-ops-tentative-lists", "sever-reveal-group-at-boundaries", + "shallow-compiled-slot-channel", + "shallow-slot-alignment-samevaluezero", "shallow-stores-markraw", + "shared-effect-status-notifier", "shell-gate-first-apply", "signals-disposed-stay-disposed", "simplify-pending-latest-internals", @@ -491,6 +536,7 @@ "tiny-lions-jam", "transparent-devcomponent", "transparent-effect-option-typed", + "transport-failure-on-foreign-response", "truncation-sweep-all-registry-refs", "two-weeks-smell", "unwrap-status-error-nullish", diff --git a/packages/babel-plugin/CHANGELOG.md b/packages/babel-plugin/CHANGELOG.md index 1342661f7..ed69b816c 100644 --- a/packages/babel-plugin/CHANGELOG.md +++ b/packages/babel-plugin/CHANGELOG.md @@ -1,5 +1,12 @@ # @solidjs/babel-plugin +## 2.0.0-rc.4 + +### Patch Changes + +- 8d249c7: Patch-channel contract hardening from the stage-2 re-audit: ordinary `patchDriver` registrations unbind with their owner (entries no longer leak past unmount); merged transitions move their held-patch stash so no patch strands; the optimistic drain shares the normal drain's per-entry error isolation and boundary routing; accessor-bearing records are excluded at admission (scan-before-trust) and records that acquire accessors demote their patches to tracked effect fallbacks; writable projection arrays emit setter row ops at their fold-commit visibility moment; row-ops/slot registrations resolve chained backings to the ultimate owner; duplicate keys match occurrence-aware instead of first-wins; the production dev-token typo (`_DX_DEV_`) is fixed; `patchDriver: true` normalizes identically in Babel and the native loader, the option is typed in `TransformOptions`, and a `dom-patch` parity tier ratchets patch-mode output across both compilers (currently byte-identical on all fixtures). +- b534733: Scope-wrap bare function children in hydratable mode. A function child (`
{() => }
`, including via the `children` attribute) is a deferred hole at runtime, but it never classified as `dynamic`, so neither generate reserved an id scope for it — its owner ids drifted across async retry passes on the server and desynced from the client (the #2900 hydration-id-parity class). Both compilers now treat syntactic function expressions as scope-eligible alongside dynamic values, emitting `_$scope(...)` in the ssr generate and around the matching insert accessor in the dom generate. The native compiler also unwraps TS casts in the allocate-ids predicate, matching Babel (fixes a scope-emission desync for `{call() as any}` children). + ## 2.0.0-rc.3 ### Minor Changes diff --git a/packages/babel-plugin/package.json b/packages/babel-plugin/package.json index 62392f140..8db3d74a9 100644 --- a/packages/babel-plugin/package.json +++ b/packages/babel-plugin/package.json @@ -1,7 +1,7 @@ { "name": "@solidjs/babel-plugin", "description": "Babel compiler plugin for Solid templates", - "version": "2.0.0-rc.3", + "version": "2.0.0-rc.4", "author": "Ryan Carniato", "license": "MIT", "repository": { diff --git a/packages/compiler/CHANGELOG.md b/packages/compiler/CHANGELOG.md index cac5f2769..0acc96eda 100644 --- a/packages/compiler/CHANGELOG.md +++ b/packages/compiler/CHANGELOG.md @@ -1,5 +1,19 @@ # @solidjs/compiler +## 2.0.0-rc.4 + +### Minor Changes + +- 5455320: Register call-shaped component bindings in the refresh (HMR) pass (#3090). A component produced by a factory call — `styled(...)`, an HOC, a tagged template — was never registered, and once a registered sibling made the module self-accept, `hot.accept()` disabled the very module invalidation its staleness relied on: the export went permanently stale, silently. Two compile-time admission gates fix this. A call-shaped top-level binding rendered as a JSX tag in its own module is proven a component and registers automatically (resolution is scope-aware — shadowing locals don't count). For export-only shapes with no in-module usage, the per-binding `@refresh component` pragma asserts it: `export const Badge = /* @refresh component */ styled.span\`...\``. Registered call bindings get the full treatment — location, granular signature, and dependencies, with same-module registered components excluded from the dependency set (edits propagate through the proxy chain; counting them would remount the consumer on every edit of the module). This is a deliberate native-first divergence from the frozen Babel-plugin reference. + +### Patch Changes + +- 3a2d214: The native compiler's JS loader accepts the `patchDriver` option and normalizes the boolean opt-in: the Rust core supports the option (dormant by default), but `validateOptions`' whitelist rejected it, and the napi wrapper mapping collapses `true` into `Wrapper::Default` — which `patch_driver` uniquely treats as disabled. The loader now whitelists the option and maps `true` to the default `"patchDriver"` import name so an explicit opt-in through `@solidjs/vite-plugin` reaches the native core. +- bfc834e: Prefer a local development build (`compiler.node`) over the installed `@solidjs/compiler-*` platform package when loading the native binding. The published package ships no local binary, so a local build can only mean development — but the loader tried the platform package first, which made the monorepo's own tests (locally and in CI) silently run against the last published release instead of the code under test. A present-but-unloadable local build now fails loudly instead of degrading to the published binary. +- 2f01f23: Module-level "use server" exports now register by value: the server build registers each export's evaluated terminal initializer whole, so server-side wrappers compose onto every call path — `export const getUser = withValidation(schema, fn)` applies the wrapper to HTTP dispatch and in-process SSR calls alike, and patterns like `withDelay(fn, 400)` work for server mocks. The client build always emits bare references, so wrappers, schemas, and helpers stay server-only by construction. The compiler never inspects the initializer's shape; `registerServerReference` now throws at module eval when handed a non-function, turning stray non-function exports into loud boot errors instead of dead references. Anonymous default expressions (`export default withDelay(...)`, `export default async () => ...`) get a synthesized binding and register too — previously they were silently dropped from both builds. Supersedes the unreleased wrapped-export compile error. +- 8d249c7: Patch-channel contract hardening from the stage-2 re-audit: ordinary `patchDriver` registrations unbind with their owner (entries no longer leak past unmount); merged transitions move their held-patch stash so no patch strands; the optimistic drain shares the normal drain's per-entry error isolation and boundary routing; accessor-bearing records are excluded at admission (scan-before-trust) and records that acquire accessors demote their patches to tracked effect fallbacks; writable projection arrays emit setter row ops at their fold-commit visibility moment; row-ops/slot registrations resolve chained backings to the ultimate owner; duplicate keys match occurrence-aware instead of first-wins; the production dev-token typo (`_DX_DEV_`) is fixed; `patchDriver: true` normalizes identically in Babel and the native loader, the option is typed in `TransformOptions`, and a `dom-patch` parity tier ratchets patch-mode output across both compilers (currently byte-identical on all fixtures). +- b534733: Scope-wrap bare function children in hydratable mode. A function child (`
{() => }
`, including via the `children` attribute) is a deferred hole at runtime, but it never classified as `dynamic`, so neither generate reserved an id scope for it — its owner ids drifted across async retry passes on the server and desynced from the client (the #2900 hydration-id-parity class). Both compilers now treat syntactic function expressions as scope-eligible alongside dynamic values, emitting `_$scope(...)` in the ssr generate and around the matching insert accessor in the dom generate. The native compiler also unwraps TS casts in the allocate-ids predicate, matching Babel (fixes a scope-emission desync for `{call() as any}` children). + ## 2.0.0-rc.3 ### Minor Changes diff --git a/packages/compiler/npm/darwin-arm64/package.json b/packages/compiler/npm/darwin-arm64/package.json index 8b1d19e8a..dc3c1b689 100644 --- a/packages/compiler/npm/darwin-arm64/package.json +++ b/packages/compiler/npm/darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@solidjs/compiler-darwin-arm64", - "version": "2.0.0-rc.3", + "version": "2.0.0-rc.4", "cpu": [ "arm64" ], diff --git a/packages/compiler/npm/darwin-x64/package.json b/packages/compiler/npm/darwin-x64/package.json index be6b8516b..440b67e26 100644 --- a/packages/compiler/npm/darwin-x64/package.json +++ b/packages/compiler/npm/darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@solidjs/compiler-darwin-x64", - "version": "2.0.0-rc.3", + "version": "2.0.0-rc.4", "cpu": [ "x64" ], diff --git a/packages/compiler/npm/linux-arm64-gnu/package.json b/packages/compiler/npm/linux-arm64-gnu/package.json index bcd0c588d..b59bb8bc6 100644 --- a/packages/compiler/npm/linux-arm64-gnu/package.json +++ b/packages/compiler/npm/linux-arm64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@solidjs/compiler-linux-arm64-gnu", - "version": "2.0.0-rc.3", + "version": "2.0.0-rc.4", "cpu": [ "arm64" ], diff --git a/packages/compiler/npm/linux-x64-gnu/package.json b/packages/compiler/npm/linux-x64-gnu/package.json index e2cdda38d..4cd72a7e2 100644 --- a/packages/compiler/npm/linux-x64-gnu/package.json +++ b/packages/compiler/npm/linux-x64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@solidjs/compiler-linux-x64-gnu", - "version": "2.0.0-rc.3", + "version": "2.0.0-rc.4", "cpu": [ "x64" ], diff --git a/packages/compiler/npm/wasm32-wasi/package.json b/packages/compiler/npm/wasm32-wasi/package.json index c984f1b49..7c4d30791 100644 --- a/packages/compiler/npm/wasm32-wasi/package.json +++ b/packages/compiler/npm/wasm32-wasi/package.json @@ -1,6 +1,6 @@ { "name": "@solidjs/compiler-wasm32-wasi", - "version": "2.0.0-rc.3", + "version": "2.0.0-rc.4", "main": "compiler.wasi.cjs", "files": [ "compiler.wasm32-wasi.wasm", diff --git a/packages/compiler/npm/win32-x64-msvc/package.json b/packages/compiler/npm/win32-x64-msvc/package.json index 14261e54d..83d33a750 100644 --- a/packages/compiler/npm/win32-x64-msvc/package.json +++ b/packages/compiler/npm/win32-x64-msvc/package.json @@ -1,6 +1,6 @@ { "name": "@solidjs/compiler-win32-x64-msvc", - "version": "2.0.0-rc.3", + "version": "2.0.0-rc.4", "cpu": [ "x64" ], diff --git a/packages/compiler/package.json b/packages/compiler/package.json index 4668d1271..1f68f3b96 100644 --- a/packages/compiler/package.json +++ b/packages/compiler/package.json @@ -1,7 +1,7 @@ { "name": "@solidjs/compiler", "description": "Solid's native Oxc JSX compiler", - "version": "2.0.0-rc.3", + "version": "2.0.0-rc.4", "author": "Ryan Carniato", "license": "MIT", "repository": { @@ -62,11 +62,11 @@ "emnapi": "^1.11.3" }, "optionalDependencies": { - "@solidjs/compiler-darwin-x64": "2.0.0-rc.3", - "@solidjs/compiler-darwin-arm64": "2.0.0-rc.3", - "@solidjs/compiler-linux-x64-gnu": "2.0.0-rc.3", - "@solidjs/compiler-linux-arm64-gnu": "2.0.0-rc.3", - "@solidjs/compiler-win32-x64-msvc": "2.0.0-rc.3", - "@solidjs/compiler-wasm32-wasi": "2.0.0-rc.3" + "@solidjs/compiler-darwin-x64": "2.0.0-rc.4", + "@solidjs/compiler-darwin-arm64": "2.0.0-rc.4", + "@solidjs/compiler-linux-x64-gnu": "2.0.0-rc.4", + "@solidjs/compiler-linux-arm64-gnu": "2.0.0-rc.4", + "@solidjs/compiler-win32-x64-msvc": "2.0.0-rc.4", + "@solidjs/compiler-wasm32-wasi": "2.0.0-rc.4" } } diff --git a/packages/diagnostics/CHANGELOG.md b/packages/diagnostics/CHANGELOG.md index 81f28d4b2..27aa4b1fe 100644 --- a/packages/diagnostics/CHANGELOG.md +++ b/packages/diagnostics/CHANGELOG.md @@ -1,5 +1,38 @@ # @solidjs/diagnostics +## 2.0.0-rc.4 + +### Patch Changes + +- Updated dependencies [8d249c7] +- Updated dependencies [f0c3692] +- Updated dependencies [8d249c7] +- Updated dependencies [505c73d] +- Updated dependencies [de9e3cb] +- Updated dependencies [0e37f90] +- Updated dependencies [8d249c7] +- Updated dependencies [b96d7ce] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [ba6c0b6] + - @solidjs/signals@2.0.0-rc.4 + ## 2.0.0-rc.3 ### Minor Changes diff --git a/packages/diagnostics/package.json b/packages/diagnostics/package.json index 645761d8c..948030908 100644 --- a/packages/diagnostics/package.json +++ b/packages/diagnostics/package.json @@ -1,6 +1,6 @@ { "name": "@solidjs/diagnostics", - "version": "2.0.0-rc.3", + "version": "2.0.0-rc.4", "description": "Agent-consumable diagnostics harness for Solid: capture the dev-mode diagnostic and attribution channels as structured artifacts, with assertion helpers for tests and agent loops.", "author": "Ryan Carniato", "license": "MIT", @@ -52,7 +52,7 @@ "test:watch": "vitest watch tests" }, "dependencies": { - "@solidjs/signals": "^2.0.0-rc.3" + "@solidjs/signals": "^2.0.0-rc.4" }, "peerDependencies": { "vitest": ">=2.0.0" diff --git a/packages/element/CHANGELOG.md b/packages/element/CHANGELOG.md index d41b958cf..5fe9fd873 100644 --- a/packages/element/CHANGELOG.md +++ b/packages/element/CHANGELOG.md @@ -1,5 +1,43 @@ # solid-element +## 2.0.0-rc.4 + +### Patch Changes + +- Updated dependencies [475744c] +- Updated dependencies [8d249c7] +- Updated dependencies [54506e0] +- Updated dependencies [f0c3692] +- Updated dependencies [0043643] +- Updated dependencies [f3da41e] +- Updated dependencies [a10cf1a] +- Updated dependencies [c9b4f2a] +- Updated dependencies [8c48a2e] +- Updated dependencies [8d249c7] +- Updated dependencies [2f01f23] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [258c76a] +- Updated dependencies [79b96cf] +- Updated dependencies [82b4e14] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [c07edcb] + - @solidjs/web@2.0.0-rc.4 + - solid-js@2.0.0-rc.4 + ## 2.0.0-rc.3 ### Patch Changes diff --git a/packages/element/package.json b/packages/element/package.json index 7f0503c0a..e7f024d15 100644 --- a/packages/element/package.json +++ b/packages/element/package.json @@ -3,7 +3,7 @@ "description": "Webcomponents wrapper for Solid", "author": "Ryan Carniato", "license": "MIT", - "version": "2.0.0-rc.3", + "version": "2.0.0-rc.4", "homepage": "https://github.com/solidjs/solid/blob/main/packages/element#readme", "repository": { "type": "git", @@ -30,8 +30,8 @@ "component-register": "^0.8.7" }, "peerDependencies": { - "solid-js": "^2.0.0-rc.3", - "@solidjs/web": "^2.0.0-rc.3" + "solid-js": "^2.0.0-rc.4", + "@solidjs/web": "^2.0.0-rc.4" }, "devDependencies": { "solid-js": "workspace:*", diff --git a/packages/h/CHANGELOG.md b/packages/h/CHANGELOG.md index fbc7a622d..6c18bc0b6 100644 --- a/packages/h/CHANGELOG.md +++ b/packages/h/CHANGELOG.md @@ -1,5 +1,39 @@ # @solidjs/h +## 2.0.0-rc.4 + +### Patch Changes + +- Updated dependencies [475744c] +- Updated dependencies [8d249c7] +- Updated dependencies [54506e0] +- Updated dependencies [0043643] +- Updated dependencies [c9b4f2a] +- Updated dependencies [8c48a2e] +- Updated dependencies [8d249c7] +- Updated dependencies [2f01f23] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [258c76a] +- Updated dependencies [79b96cf] +- Updated dependencies [82b4e14] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [c07edcb] + - @solidjs/web@2.0.0-rc.4 + ## 2.0.0-rc.3 ### Minor Changes diff --git a/packages/h/package.json b/packages/h/package.json index fcb681a84..7818e3306 100644 --- a/packages/h/package.json +++ b/packages/h/package.json @@ -1,7 +1,7 @@ { "name": "@solidjs/h", "description": "Hyperscript / h() factory for Solid — write components without compiled JSX.", - "version": "2.0.0-rc.3", + "version": "2.0.0-rc.4", "author": "Ryan Carniato", "license": "MIT", "homepage": "https://solidjs.com", @@ -76,7 +76,7 @@ "test": "vitest run" }, "peerDependencies": { - "@solidjs/web": "^2.0.0-rc.3" + "@solidjs/web": "^2.0.0-rc.4" }, "devDependencies": { "@solidjs/web": "workspace:*", diff --git a/packages/html/CHANGELOG.md b/packages/html/CHANGELOG.md index baafa0073..daf1f1ec6 100644 --- a/packages/html/CHANGELOG.md +++ b/packages/html/CHANGELOG.md @@ -1,5 +1,39 @@ # @solidjs/html +## 2.0.0-rc.4 + +### Patch Changes + +- Updated dependencies [475744c] +- Updated dependencies [8d249c7] +- Updated dependencies [54506e0] +- Updated dependencies [0043643] +- Updated dependencies [c9b4f2a] +- Updated dependencies [8c48a2e] +- Updated dependencies [8d249c7] +- Updated dependencies [2f01f23] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [258c76a] +- Updated dependencies [79b96cf] +- Updated dependencies [82b4e14] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [c07edcb] + - @solidjs/web@2.0.0-rc.4 + ## 2.0.0-rc.3 ### Minor Changes diff --git a/packages/html/package.json b/packages/html/package.json index 305ae9d61..e2e8d04e7 100644 --- a/packages/html/package.json +++ b/packages/html/package.json @@ -1,7 +1,7 @@ { "name": "@solidjs/html", "description": "Tagged-template-literal templating for Solid — write components with no build step.", - "version": "2.0.0-rc.3", + "version": "2.0.0-rc.4", "author": "Ryan Carniato", "license": "MIT", "homepage": "https://solidjs.com", @@ -47,7 +47,7 @@ "test": "vitest run" }, "peerDependencies": { - "@solidjs/web": "^2.0.0-rc.3" + "@solidjs/web": "^2.0.0-rc.4" }, "devDependencies": { "@solidjs/web": "workspace:*", diff --git a/packages/signals/CHANGELOG.md b/packages/signals/CHANGELOG.md index ddb807925..f1d26be20 100644 --- a/packages/signals/CHANGELOG.md +++ b/packages/signals/CHANGELOG.md @@ -1,5 +1,94 @@ # @solidjs/signals +## 2.0.0-rc.4 + +### Minor Changes + +- f0c3692: Point-of-pain discovery for diagnostics: `DEV.diagnostics.setConsoleFooter(fn)` registers a footer printed once per diagnostic code after that code's first console report. solid-js registers a footer in dev pointing at its shipped repair skill (`node_modules/solid-js/skills/reactivity-diagnostics/SKILL.md`), so anyone — human or agent — hitting a diagnostic warning learns where the prescribed fix lives without prior knowledge of the skill system. +- 8d249c7: Patch-mode list driver: keyed `` over a store array is offered to the + runtime's row-ops driver (create/bind at op-apply, LIS moves, node removal — + no mapArray, no per-row owners, no DOM-side reconcile). `For` carries `$ll` + metadata on a lazy classic accessor so unaware renderers and declined lists + (non-store subject, impure rows proven by a bind-time owner probe, fallback + or index usage) fall through to today's mapArray path unchanged. Array + identity swaps keep keyed semantics by raw-identity matching. Adds + `ownerIsBlank` (signals) for the purity probe and `driveList` (web, rxcore + seam) for the runtime. +- 8d249c7: Close two list-driver coverage gaps found by the JFB store scenario: setter- + channel structural mutation (push/splice/index assignment/permutation) now + emits identity-keyed row ops at the fold — a driven list stays DOM-correct + for stores mutated without reconcile — and empty-initial lists engage + TENTATIVELY, deferring the purity probe to the first created row, with a + late decline handing the region to the classic mapArray path through the + runtime's re-entry thunk +- 8d249c7: Shallow store lists through the compiled driver: slot patches graduate from + prototype to channel semantics (key-aligned value-replaced slots only — + structure rides row ops — queued at effect phase under the registration + owner), and the list driver collects a shallow row's compiled bodies at bind + (rows are raw; nothing to register on) and dispatches them from the array's + slot channel, rebasing indices with structural ops. Adds storeIsShallow; + kind-changing subject swaps (shallow <-> deep) hand off to classic. + +### Patch Changes + +- 8d249c7: External-audit fixes on the patch-list driver surface: family (projection/optimistic) arrays now decline the driver — their structural changes emit no row/slot ops and the proxy identity is stable, so an engaged list would freeze on optimistic or projection structure (classic mapArray handles them correctly, including on identity-swap handoff). Shallow slot-patch registration is now multi-consumer — two driven lists over one shallow array previously overwrote each other's channel. Adds `storeHasFamily` (with server stub) and regression tests for both. +- 8d249c7: Group the write-side patch-channel fields (`wk`, `p`, `ro`, `sp`) into one lazily-allocated `pc` extension on store targets and delete the dead prototype binding registry (`b`). Array proxy targets carry their fields as named properties on a real array, and V8 normalizes arrays to dictionary properties as the named count grows — at 24 fields every trap read had become a hash lookup (~15% uibench, tree-heavy scenarios worst). The target is capped at 20 named fields with the shape rule documented; future patch-channel state goes inside `pc`. +- 505c73d: Fix `isPending` memos reading inconsistently during an action-held transition (#3078) + + Two defects stacked in the report: + - Untracked top-level reads of subscriber-less auto-dispose memos were destructive: `read()` tore the node down inline (`unobserved`) and the next read revived it with a full recompute in the ambient transition/lane context, so consecutive reads could answer `false → true → false` with no write in between. Reads now queue the node for a re-validating dormancy sweep at the top of the next flush — reads are idempotent within a tick, the leak protection is preserved (reclamation within one microtask; the enqueue arms `schedule()`), and a same-tick dirtying is reclaimed instead of recomputed, matching the old compute counts across flushes. + - The fresh-read pairing rule (#2831/#3028) suppressed the pending verdict for any compute that saw a staged plain write while an action still held the transition, making `createMemo(() => isPending(x))` report `false` while a direct `isPending(x)` probe reported `true` for the whole action window. A plain signal's staged write is an input to a computation still in flight, not a landed answer awaiting reveal: `heldAwaitingAsync` now treats an unsettled action as "still computing" for input-staged (non-computed) nodes, while a computed's landed async answer keeps the pairing rule even inside an open action. + +- de9e3cb: Fix projection stores leaking unsettled writes to effect-phase readers (#3082) + + A derived (projection) store's pending backing is authoritative-elect and served to context-free readers, but that clause also caught CHILDREN_FORBIDDEN execution scopes (`onSettled` / `createTrackedEffect` callbacks), so `setStore(...)` followed by a read inside the callback returned the staged draft while a signal write in the same scope correctly read committed. Projection reads in those scopes now get committed visibility, restoring the #3006 contract (a callback never observes its own unsettled write) and store/signal parity. + +- 0e37f90: Fix projection transition isolation and `latest()` parity (#3074, #3075). A projection recompute deriving from transition-held sources committed its output through the eager adoption channel, so untracked readers saw the uncommitted value after `flush()` while reads of the source signal correctly stayed committed. Adoption under a live hold now stages a held view: committed-visibility readers keep the pre-hold backing until the transition commits (speculative readers — drafts, owner-context computeds, `latest()` — see the adopted backing). And `latest()` now works through projections: store traps never reach core `read()` without an observer, so the get trap pulls the projection computed up to date under the latest window and serves the in-flight derivation — signal/memo parity. +- 8d249c7: Fix shallow slot-patch emission racing row creation: appended positions past a fully-aligned prefix (vacuously aligned when the previous list was empty) emitted slot value-ticks for rows that do not exist yet — the slot queue applies before the row ops that create them, crashing the list driver on clear-then-refill and pure appends. Slots now dispatch only for indices with a previous slot; appends are structure-only. Found by the driver/classic equivalence matrix. +- b96d7ce: Fix store folds silently stranding while any transition is in flight (#3089). The fold queue armed a drain only when it was empty, assuming every drain clears it — but a held re-queue or an incomplete-transition flush (which skips `commitPendingNodes` entirely) leaves entries behind after `scheduled` is consumed, and every later fold was then queued without ever scheduling a drain: the committed backing froze at stale state (a derived store's seed) while its nodes committed, and readers on different rails saw torn state — `length` 0, `Object.keys` `["0"]`, the element intact. `queueFold` now always arms the scheduler, and folds carry a write-time transition stamp so drafts written under a still-running transition — including unobserved keys, which have no pending node for the drain's held check to see — defer to that transition's settle instead of landing in whichever flush drains next. +- 8d249c7: Optimistic family arrays are drivable by the patch-mode list driver, completing the family channel: structural optimism (push/splice/reorder/replace in optimistic drafts) emits identity-diffed row ops at lane timing from the override channel — visible in flight, bypassing the transition stash like optimistic record patches — and reverts emit an identity RESYNC the driver resolves against the live post-revert view. The driver binds optimistic lists from the optimistic view (classic reads the same view through the proxy), and the identity-swap matcher is shared between swaps and resyncs. Equivalence matrix extended with async optimistic scenarios (mounted → in-flight → settled, revert and land, element-level and parent-key structural writes). +- 8d249c7: Patch channel is pay-for-use: the list driver and `patchDriver` moved out of the always-retained web runtime into `patch-driver.ts`, arming the insert seam lazily from `rowProof`/`patchDriver` (which only compiled patch-mode output imports); the store's emitters ride hooks installed at first registration (`patch-hooks.ts`) instead of static imports. Apps without patch-mode output retain only a ~100 B insert hook; the store write-path seams cost ~490 B on the store floor. Before this, every client app carried the full driver (~2.4 KB brotli). +- 8d249c7: Stage 2 (PR-A): the patch channel. Compiled per-record patch consumers + (`registerPatch`, undocumented compiler-contract export) dispatched by store + visibility transitions at all four sites: adoption walk and setter notify + (plain stores, with ancestor bubbling for targeted nested writes), fold + commit (projections — held folds hold their patches), and the override + lifecycle (application emits the visible draft; consumption and engine + reverts force-reapply from the live view). Application timing: per-flush + apply queue at render-effect phase; transition-stamped emissions release + when THEIR batch commits (reverted transactions drop by GC); optimistic + emissions drain at lane-effect timing so in-flight visibility works while + actions stash the regular queues. Unpatched stores pay a null check and the + module tree-shakes out of non-store bundles. Gauntlet: effect-phase timing, + reconcile prev pairing, nested-write bubbling, unbind/multi-consumer, + transition hold, optimistic in-flight + DOM revert, projection refetch, + disposed-owner drop. +- 8d249c7: Second re-audit hardening of the patch channel: adoption seams demote accessor-bearing adoptees to tracked effects in development, with a loud diagnostic (production emits directly — per-adoption accessor scans cost ~12% of dbmon's tick, and getter-bearing adoptees on patched records are a development-caught shape); setter-returned root replacements and chained-store swaps emit their patches and row ops at fold commit; the list driver's ops application builds every new row before any destructive step (a throwing row factory leaves DOM and bookkeeping atomically unchanged); patch errors route to the nearest computed ancestor so `Errored.reset()` can recompute it (reset also skips non-computed sources), and unhandled patch errors halt like unhandled effect errors; key equality is SameValueZero and occurrence-aware everywhere keys compare — NaN keys stay retained and duplicate keys adopt per occurrence on both channels; same-batch duplicate patch emissions coalesce (one application per batch, effect parity). +- 8d249c7: Third re-audit hardening of the patch channel: same-batch coalescing updates the queued entry in place (latest `next` wins — adoption replaces the captured object, so dropping later emissions applied stale state) and the drain clears the channel stamps (no batch retention on quiet records); the adoption remainder window builds from the misalignment point so prefix-consumed rows are never re-offered to duplicate keys; optimistic tentative matching gains SameValueZero + occurrence-aware parity with the plain channel; a failed row-ops application forces an identity resync on the next update (the store committed the failed topology while DOM kept the old one — positional ops would mis-index) and suppresses slot ticks until the baseline is restored; a throwing row factory also severs its own partial registrations. +- 8d249c7: Fifth-round hardening of the patch channel: no-op adoptions (A→B→A in one batch) clear the adopted flag so later setter row ops never freeze a driven list; transition merges retarget the moved entries' coalescing stamps (post-merge emissions coalesce instead of double-applying at commit); multi-consumer patch dispatch snapshots the registration list (a callback unbinding a sibling no longer skips consumers); the list driver's initial construction severs partial registrations on throw like update-time builds (one failed initial render no longer elevates patchCount globally); a failed apply actively resyncs from the next slot tick instead of waiting for a structural update; and identity swaps register the new subject's channels before applying so a throwing swap stays recoverable. +- 8d249c7: Patch-channel contract hardening from the stage-2 re-audit: ordinary `patchDriver` registrations unbind with their owner (entries no longer leak past unmount); merged transitions move their held-patch stash so no patch strands; the optimistic drain shares the normal drain's per-entry error isolation and boundary routing; accessor-bearing records are excluded at admission (scan-before-trust) and records that acquire accessors demote their patches to tracked effect fallbacks; writable projection arrays emit setter row ops at their fold-commit visibility moment; row-ops/slot registrations resolve chained backings to the ultimate owner; duplicate keys match occurrence-aware instead of first-wins; the production dev-token typo (`_DX_DEV_`) is fixed; `patchDriver: true` normalizes identically in Babel and the native loader, the option is typed in `TransformOptions`, and a `dom-patch` parity tier ratchets patch-mode output across both compilers (currently byte-identical on all fixtures). +- 8d249c7: Stage 2 (PR-B): row ops. The keyed adoption walk emits structural list ops + (`registerRowOps`: prefix, sources, removed) through the same apply queue as + record patches — aligned value ticks emit nothing; consumers apply minimal + DOM moves via one LIS over data ops instead of re-deriving moves from DOM + node arrays. Measured on dbmon: sort 10.7 → 4.5ms, remount 25.7 → 9.3ms + (octane 4.0/8.5), while ticks stay ahead (3.0/0.9 vs 3.2/1.3). +- 8d249c7: Patch-channel semantics completion: a throwing patch now routes through its + registering owner's queue chain to the enclosing error boundary (render- + effect parity; sibling isolation preserved, unhandled errors still rethrow), + and the dual-driver effect fallback splits phases with the same compiled + body — a next===prev read pass tracks in compute, the force apply writes in + the effect phase where transitions and batching expect DOM writes +- 8d249c7: Patch-channel held emissions stash directly on their transition object + instead of a WeakMap — the every-flush commit-hook check becomes one + property read, and reverted transitions drop their stash with the object +- 8d249c7: Patch-channel arming is two-tier so the default-on cost stays proportional: `patchDriver` no longer retains the list driver (only `rowProof` — the compiled marker of a patch-mode list — arms the insert seam), and the store emitters split into value hooks (armed by `registerPatch`) and row hooks (armed by list registrations), so non-list patch templates never retain row binding, LIS, or reconcile's diff builders. Flip-preview size scenarios pin both tiers. +- 8d249c7: Projection (non-optimistic) family arrays are drivable by the patch-mode list driver: their recomputes walk reconcile, whose row/slot emissions were never family-gated and ride the transition-stamped apply queue. The blanket family decline narrows to optimistic families only (`storeHasOptimisticFamily`), whose user writes ride node overrides and emit no structural ops. Fixes chained-backing patch registration: a projection wrapper's backing is another store's proxy, so `registerPatch`/`patchableRaw` now resolve through the chain to the ultimate owner target — patches registered on wrapped projection rows previously never fired (value transitions fold on the source). Equivalence matrix extended with 13 projection scenarios including recompute-driven structure and retention topology. +- 8d249c7: The reconcile walk's patch-emission guards short-circuit on the installed-hooks binding before touching target fields, so stores without any patch consumer pay no per-record loads in the adoption walk (CodSpeed caught −7.7% on the 12k-path listened-paths bench). +- 8d249c7: Patch-mode list admission moves entirely to compile time: driveList engages only for row functions carrying the compiler's `rowProof` stamp (exported from @solidjs/web), and the runtime purity probe is deleted — no speculative execution of user row code, no probeMark/probeGate seams, no ownerIsBlank, no tentative empty-list engagement with late decline. Unstamped rows take the classic mapArray path before any DOM work; `lateClassic` remains only for engaged lists whose subject later leaves the contract (identity swap to a derived array, shallow/deep kind switch). +- 8d249c7: The shallow branch's slot-alignment prefix compares keys with SameValueZero: strict equality broke alignment on NaN keys, suppressing the slot's value ticks while the ops builder retained the row — a permanently stale DOM row (found by a full-surface self-sweep of every key-comparison site). +- ba6c0b6: Effects dispatch status through one shared notifier instead of storing it per node: `effect()` stored the module-level `notifyEffectStatus` on every effect through `ext()`, allocating the full 19-field `NodeExtension` at every effect creation — +127 B/node and +23% effect creation time, shipped unnoticed with the stage-3 cold-field split. Status walks now resolve the notifier via `statusNotifierOf` (an own `_x` channel — boundaries — wins; effect nodes fall back to the shared one), which preserves the walks' display-consumer membership semantics exactly. Effect nodes drop to 488 B (below even the pre-stage-3 528) and creation recovers to ~1.07 ms/10k from 1.26. + ## 2.0.0-rc.3 ### Patch Changes diff --git a/packages/signals/package.json b/packages/signals/package.json index 07d132a36..daa9dd783 100644 --- a/packages/signals/package.json +++ b/packages/signals/package.json @@ -1,6 +1,6 @@ { "name": "@solidjs/signals", - "version": "2.0.0-rc.3", + "version": "2.0.0-rc.4", "description": "Solid's reactive primitives: signals, memos, effects, stores, and async-aware computations.", "author": "Ryan Carniato", "license": "MIT", diff --git a/packages/solid/CHANGELOG.md b/packages/solid/CHANGELOG.md index 246450cf7..134e5e79d 100644 --- a/packages/solid/CHANGELOG.md +++ b/packages/solid/CHANGELOG.md @@ -1,5 +1,57 @@ # solid-js +## 2.0.0-rc.4 + +### Minor Changes + +- f0c3692: Point-of-pain discovery for diagnostics: `DEV.diagnostics.setConsoleFooter(fn)` registers a footer printed once per diagnostic code after that code's first console report. solid-js registers a footer in dev pointing at its shipped repair skill (`node_modules/solid-js/skills/reactivity-diagnostics/SKILL.md`), so anyone — human or agent — hitting a diagnostic warning learns where the prescribed fix lives without prior knowledge of the skill system. +- 8d249c7: Patch-mode list driver: keyed `` over a store array is offered to the + runtime's row-ops driver (create/bind at op-apply, LIS moves, node removal — + no mapArray, no per-row owners, no DOM-side reconcile). `For` carries `$ll` + metadata on a lazy classic accessor so unaware renderers and declined lists + (non-store subject, impure rows proven by a bind-time owner probe, fallback + or index usage) fall through to today's mapArray path unchanged. Array + identity swaps keep keyed semantics by raw-identity matching. Adds + `ownerIsBlank` (signals) for the purity probe and `driveList` (web, rxcore + seam) for the runtime. + +### Patch Changes + +- 8d249c7: External-audit fixes on the patch-list driver surface: family (projection/optimistic) arrays now decline the driver — their structural changes emit no row/slot ops and the proxy identity is stable, so an engaged list would freeze on optimistic or projection structure (classic mapArray handles them correctly, including on identity-swap handoff). Shallow slot-patch registration is now multi-consumer — two driven lists over one shallow array previously overwrote each other's channel. Adds `storeHasFamily` (with server stub) and regression tests for both. +- f3da41e: Fix mid-stream dependency changes being silently lost by hydration-latched computations. A node adopting its serialized server value re-serves it on every recompute while the stream is open (orphaning protection) — but that recompute left the node clean, so a dependency that changed during the hydration window never re-ran the compute afterwards: the change was lost, not deferred. Re-entry into the serialized-adoption path now arms the hydration-end takeover gate (the same mechanism live-branded sources use), re-running exactly the diverged nodes against their live sources once hydration completes. Applies to the default/"server" `ssrSource` paths; hybrid's sync/promise adopt-and-latch semantics are unchanged. +- a10cf1a: Fix streaming SSR hanging permanently (0 bytes, 100% CPU) when a component body reads a property of a pending `createProjection`/`createStore(asyncFn)` store (#3068). An async projection can never be ready at creation-scope read time, so the read threw NotReadyError and the retry re-ran the scope — but `createProjection` allocated a fresh generator, deferred, and serialized promise on every pass, so the read could never succeed and the flush loop spun forever. Server projections now keep by-slot flight memory (the #3003 memo mechanism): a re-created projection at a known slot returns the same in-flight proxy — one generator run, one trace, one serialized channel — and post-settle passes read through it synchronously. +- 8d249c7: Patch-mode lists now implement the identity semantics the view declares instead of the reconcile key's. Deep lists are unaffected (adoption preserves proxy identity, so key ops and reference semantics coincide). Shallow reference-keyed lists rebuild rows whose records were replaced — matching classic `mapArray` exactly, where the driver previously patched them in place (a default-on compiler mode must never change observable DOM identity). `For` forwards its `keyed` prop on the list metadata; explicit `keyed={fn}` lists decline the driver until the accessor-row binding contract lands. +- 8d249c7: Projection (non-optimistic) family arrays are drivable by the patch-mode list driver: their recomputes walk reconcile, whose row/slot emissions were never family-gated and ride the transition-stamped apply queue. The blanket family decline narrows to optimistic families only (`storeHasOptimisticFamily`), whose user writes ride node overrides and emit no structural ops. Fixes chained-backing patch registration: a projection wrapper's backing is another store's proxy, so `registerPatch`/`patchableRaw` now resolve through the chain to the ultimate owner target — patches registered on wrapped projection rows previously never fired (value transitions fold on the source). Equivalence matrix extended with 13 projection scenarios including recompute-driven structure and retention topology. +- 8d249c7: Patch-mode list admission moves entirely to compile time: driveList engages only for row functions carrying the compiler's `rowProof` stamp (exported from @solidjs/web), and the runtime purity probe is deleted — no speculative execution of user row code, no probeMark/probeGate seams, no ownerIsBlank, no tentative empty-list engagement with late decline. Unstamped rows take the classic mapArray path before any DOM work; `lateClassic` remains only for engaged lists whose subject later leaves the contract (identity swap to a derived array, shallow/deep kind switch). +- Updated dependencies [8d249c7] +- Updated dependencies [f0c3692] +- Updated dependencies [8d249c7] +- Updated dependencies [505c73d] +- Updated dependencies [de9e3cb] +- Updated dependencies [0e37f90] +- Updated dependencies [8d249c7] +- Updated dependencies [b96d7ce] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [ba6c0b6] + - @solidjs/signals@2.0.0-rc.4 + ## 2.0.0-rc.3 ### Patch Changes diff --git a/packages/solid/package.json b/packages/solid/package.json index f9f4ccf66..1a4aae4c7 100644 --- a/packages/solid/package.json +++ b/packages/solid/package.json @@ -1,7 +1,7 @@ { "name": "solid-js", "description": "Reactive JavaScript library for building user interfaces. Compiles JSX to real DOM with fine-grained signal-based updates — no virtual DOM.", - "version": "2.0.0-rc.3", + "version": "2.0.0-rc.4", "author": "Ryan Carniato", "license": "MIT", "homepage": "https://solidjs.com", @@ -141,7 +141,7 @@ "performance" ], "dependencies": { - "@solidjs/signals": "^2.0.0-rc.3", + "@solidjs/signals": "^2.0.0-rc.4", "csstype": "^3.1.0", "seroval": "~1.5.4", "seroval-plugins": "~1.5.4" diff --git a/packages/test-integration/CHANGELOG.md b/packages/test-integration/CHANGELOG.md index 8fe6ad242..e78332eab 100644 --- a/packages/test-integration/CHANGELOG.md +++ b/packages/test-integration/CHANGELOG.md @@ -1,5 +1,61 @@ # test-integration +## 2.0.0-rc.4 + +### Patch Changes + +- Updated dependencies [475744c] +- Updated dependencies [8d249c7] +- Updated dependencies [54506e0] +- Updated dependencies [f0c3692] +- Updated dependencies [0043643] +- Updated dependencies [8d249c7] +- Updated dependencies [f3da41e] +- Updated dependencies [505c73d] +- Updated dependencies [a10cf1a] +- Updated dependencies [de9e3cb] +- Updated dependencies [0e37f90] +- Updated dependencies [c9b4f2a] +- Updated dependencies [8d249c7] +- Updated dependencies [b96d7ce] +- Updated dependencies [8c48a2e] +- Updated dependencies [8d249c7] +- Updated dependencies [2f01f23] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [b534733] +- Updated dependencies [258c76a] +- Updated dependencies [79b96cf] +- Updated dependencies [82b4e14] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [ba6c0b6] +- Updated dependencies [c07edcb] + - @solidjs/web@2.0.0-rc.4 + - @solidjs/signals@2.0.0-rc.4 + - solid-js@2.0.0-rc.4 + - @solidjs/babel-plugin@2.0.0-rc.4 + - @solidjs/h@2.0.0-rc.4 + - @solidjs/html@2.0.0-rc.4 + - @solidjs/universal@2.0.0-rc.4 + ## 2.0.0-rc.3 ### Patch Changes diff --git a/packages/test-integration/package.json b/packages/test-integration/package.json index 6b0634576..c6d0290e5 100644 --- a/packages/test-integration/package.json +++ b/packages/test-integration/package.json @@ -20,5 +20,5 @@ "gitly": "^2.2.1", "shelljs": "^0.8.5" }, - "version": "2.0.0-rc.3" + "version": "2.0.0-rc.4" } diff --git a/packages/universal/CHANGELOG.md b/packages/universal/CHANGELOG.md index 5a2d396f9..f6d143a95 100644 --- a/packages/universal/CHANGELOG.md +++ b/packages/universal/CHANGELOG.md @@ -1,5 +1,19 @@ # @solidjs/universal +## 2.0.0-rc.4 + +### Patch Changes + +- Updated dependencies [8d249c7] +- Updated dependencies [f0c3692] +- Updated dependencies [f3da41e] +- Updated dependencies [a10cf1a] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] +- Updated dependencies [8d249c7] + - solid-js@2.0.0-rc.4 + ## 2.0.0-rc.3 ### Minor Changes diff --git a/packages/universal/package.json b/packages/universal/package.json index f15a26fa0..493bab244 100644 --- a/packages/universal/package.json +++ b/packages/universal/package.json @@ -1,7 +1,7 @@ { "name": "@solidjs/universal", "description": "Solid's universal runtime for creating custom renderers", - "version": "2.0.0-rc.3", + "version": "2.0.0-rc.4", "author": "Ryan Carniato", "license": "MIT", "homepage": "https://solidjs.com", @@ -58,7 +58,7 @@ "test": "vitest run" }, "peerDependencies": { - "solid-js": "^2.0.0-rc.3" + "solid-js": "^2.0.0-rc.4" }, "devDependencies": { "solid-js": "workspace:*" diff --git a/packages/web/CHANGELOG.md b/packages/web/CHANGELOG.md index 03bcfe653..240df2f4f 100644 --- a/packages/web/CHANGELOG.md +++ b/packages/web/CHANGELOG.md @@ -1,5 +1,101 @@ # @solidjs/web +## 2.0.0-rc.4 + +### Minor Changes + +- 475744c: Add `invoke(fn, options, ...args)` — the per-call server function invocator (#3057). Applies one call with invocation-scoped options: `signal` (aborting rejects the call and cancels the request; ends a live source's iteration across reconnects), `keepalive`, and `priority`. Longer-lived concerns are refused with a redirect to their home (`prepareRequest`, `withMeta`/`GET`, the data layer via `signal`) — never a `RequestInit` passthrough. Dispatch rides a registered-symbol invocation channel (`SERVER_FUNCTION_INVOKE`) that wrappers forward like declaration metadata, so `invoke` composes through `GET`, `live`, and integration wrappers that adapt it. On the server the call runs in-process: `signal` rejects the caller, transport hints are no-ops. +- 8d249c7: Patch-mode list hydration: claim + register only. The list driver claims each + server row positionally through the row's own `_hk` key (a row-scoped + explicit-id owner makes the compiled template's getNextElement resolve it), + and patchDriver skips the initial force-apply while hydrating — server HTML + stays the truth until the first transition. All driver-side `each` reads and + the probe are id-isolated (throwaway/private explicit-id owners), so lazily + minted prop-getter memos can no longer shift the ambient hydration id chain + on either the engage or decline path. +- 8d249c7: Patch-mode list driver: keyed `` over a store array is offered to the + runtime's row-ops driver (create/bind at op-apply, LIS moves, node removal — + no mapArray, no per-row owners, no DOM-side reconcile). `For` carries `$ll` + metadata on a lazy classic accessor so unaware renderers and declined lists + (non-store subject, impure rows proven by a bind-time owner probe, fallback + or index usage) fall through to today's mapArray path unchanged. Array + identity swaps keep keyed semantics by raw-identity matching. Adds + `ownerIsBlank` (signals) for the purity probe and `driveList` (web, rxcore + seam) for the runtime. +- 8d249c7: Close two list-driver coverage gaps found by the JFB store scenario: setter- + channel structural mutation (push/splice/index assignment/permutation) now + emits identity-keyed row ops at the fold — a driven list stays DOM-correct + for stores mutated without reconcile — and empty-initial lists engage + TENTATIVELY, deferring the purity probe to the first created row, with a + late decline handing the region to the classic mapArray path through the + runtime's re-entry thunk +- 8d249c7: Shallow store lists through the compiled driver: slot patches graduate from + prototype to channel semantics (key-aligned value-replaced slots only — + structure rides row ops — queued at effect phase under the registration + owner), and the list driver collects a shallow row's compiled bodies at bind + (rows are raw; nothing to register on) and dispatches them from the array's + slot channel, rebasing indices with structural ops. Adds storeIsShallow; + kind-changing subject swaps (shallow <-> deep) hand off to classic. + +### Patch Changes + +- 8d249c7: External-audit fixes on the patch-list driver surface: family (projection/optimistic) arrays now decline the driver — their structural changes emit no row/slot ops and the proxy identity is stable, so an engaged list would freeze on optimistic or projection structure (classic mapArray handles them correctly, including on identity-swap handoff). Shallow slot-patch registration is now multi-consumer — two driven lists over one shallow array previously overwrote each other's channel. Adds `storeHasFamily` (with server stub) and regression tests for both. +- 54506e0: Clarify invoke's wrapper contract: declaration wrappers (GET, live) forward the invocation channel mechanically (1:1 call mapping); wrappers that share calls (deduping caches, multicast channels) opt in deliberately or decline, and invoke's error now directs callers to the underlying reference or the wrapper's own idioms. +- 0043643: Document two boundaries of the client `fetch` option's contract: a retrying wrapper may re-send a request that got no response but must never replay one whose response ended (mid-body death may have executed a mutation; live-source reconnection is the runtime's job), and the call-to-request mapping is delivery detail, not contract. +- c9b4f2a: SSR ``, `