Skip to content

Commit 3c90efd

Browse files
committed
merge origin/next into fix/3945-errored-store-refetch
2 parents a5d7ccb + 39051bf commit 3c90efd

197 files changed

Lines changed: 10508 additions & 2358 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
"@solidjs/babel-plugin": patch
3+
"@solidjs/compiler": patch
4+
---
5+
6+
Emit element claims after the element's initial attributes are applied (#3923), at parity across both compilers.
7+
8+
A fully static `a[href]` / `form[action]` is claimed at the end of its creation statements (after static writes and refs). An element with dynamic bindings captures its owner at creation (`var _o$ = _$getOwner()`) and is claimed as the last statement of its binding effect's callback — `_$claimElement(_el$, _o$)` — in both the single-binding and the multi-binding shapes, so the claim observes the applied values on the first run whether that run is synchronous or lands from a held flush. An element carrying a spread emits no compiled claim: the `spread` runtime claims it after the first application.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
"@solidjs/web": patch
3+
---
4+
5+
Element claims fire after an element's initial attributes are applied, and the attributes whose writes re-claim are consumer-declared (#3923).
6+
7+
A claim consumer (a router's link-state layer) is told about each `a[href]` / `form[action]` once per mount — with its dynamic `href`, `target`, `rel`, … already applied — instead of at creation before the binding effect's first run. Compiled output claims a static element at creation, an element with bindings at the tail of its binding effect's first run (under the owner captured at creation, since a held mount lands ownerless), and `spread` claims an `a`/`form` it applies after the first application (so `dynamic("a")` anchors are covered too). Writes before the mount claim never re-claim.
8+
9+
Public API:
10+
11+
- `registerElementClaim(handler, options?)` takes an options bag: `{ attributes?: readonly string[] }` names the attributes whose compiler-owned writes (`setAttribute`, `setAttributeNS`, `setProperty`, the spread's property path) re-claim an already claimed element — plain names; `prop:href` and `xlink:href` map to `href`. The write sites consult the union of every registered consumer's set. Default stays `["href", "action"]`, so existing consumers keep today's behaviour. New exported type `ElementClaimOptions`.
12+
- `claimElement(node, owner?)` (compiler-emitted primitive, `@internal`) takes the optional reactive owner the handlers run under.
13+
14+
Without a registered consumer every hook folds away: the three every-page size scenarios (`app: CSR`, `app: compiled CSR`, `app: compiled hydrating`) are byte-identical.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"solid-js": patch
3+
"@solidjs/web": patch
4+
---
5+
6+
Move `dynamicComponent` into `solid-js`. `@solidjs/web` keeps `dynamic` and re-exports `dynamicComponent`.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@solidjs/web": patch
3+
---
4+
5+
A 304 from a server function no longer stamps a body-format header onto the cache update, so a browser replaying a cached GET still decodes the stored value.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@solidjs/signals": patch
3+
---
4+
5+
Derived-store landings finalize their attribution flight
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"solid-js": patch
3+
---
4+
5+
Keep an SSR Errored fallback's hydration ids when its children slot is retried.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@solidjs/signals": patch
3+
---
4+
5+
Tracked store reads keep a data value that replaced an own getter
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@solidjs/signals": patch
3+
---
4+
5+
Fix `affects(store)` / `affects(store, key)` throwing `TypeError: _.O is not a function` in tree-shaken production and observe bundles (#3891). The store half of `affects()` was installed by a side-effect-only import that bundlers drop under `"sideEffects": false`; `affects()` now installs it on its first store-targeted call, and the store half reaches the store engine through hook slots instead of importing it — so a store app that never calls `affects()` carries none of it, and an app without stores never pulls in the store engine. Thanks to @nickshiro, whose #3912 proposed installing it from `affects()`.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@solidjs/web": patch
3+
---
4+
5+
Frames client: the adopt-time slot walk reads the server's tier announcement for the scan, not only the load — a page whose `sc:tiers` record names other tiers and not `bind` is never scanned for binding-slot markers (`_s:*`), and the bind tier is never loaded for it; an un-announced page keeps detection. `collectSlots` is one TreeWalker pass over comments (and elements only when markers may exist), testing a comment's data by prefix before any regex. Same slots found, in the same order; no public API change. Measured on the HN story page (652 occurrences, 17k comments): `collectSlots` 14.2 → 5.4 ms.

‎.changeset/lazy-module.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"solid-js": patch
3+
"@solidjs/compiler": patch
4+
---
5+
6+
Add `lazyModule()` so a lazy module that is not a component can be preloaded and hydrated by module id.

0 commit comments

Comments
 (0)