diff --git a/.changeset/type-hydrate-layers-generic.md b/.changeset/type-hydrate-layers-generic.md deleted file mode 100644 index a4b2427..0000000 --- a/.changeset/type-hydrate-layers-generic.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -"@effex/dom": patch -"create-effex": patch ---- - -fix(hydrate): make element requirements provably match `options.layers` - -`hydrate`'s element parameter was locked to `Element`, so any element that also required a user-provided service (`NavigationContext`, `RouteDataProvider`, etc.) had to be cast — `as never` or `as unknown as Element` — even though `options.layers` was providing exactly those services at runtime. - -`HydrateOptions` and `hydrate` are now generic over the layer type. The layer's provided services flow through `Layer.Layer.Success` into the element's allowed `R`, so: - -- Passing an element that needs a service without providing a layer for it is a type error. -- Providing a layer that only covers some of the element's requirements is a type error. -- `hydrate(App(), root, { layers: Platform.makeClientLayer(router) })` typechecks with no casts when the layer fully covers what `App()` needs. - -`NoInfer` on the extracted layer type keeps TypeScript from inferring `L` from the element's requirements — inference flows one way, from `options.layers` into the element, so forgetting a service is a compile-time error rather than a silent runtime failure. - -Removed the now-obsolete casts from `create-effex`'s SSG and SSR templates, `apps/docs`, and the hydrate regression test. diff --git a/apps/docs/CHANGELOG.md b/apps/docs/CHANGELOG.md index 1406381..865afd3 100644 --- a/apps/docs/CHANGELOG.md +++ b/apps/docs/CHANGELOG.md @@ -1,5 +1,13 @@ # docs +## 0.0.31 + +### Patch Changes + +- Updated dependencies [2b57548] + - @effex/dom@1.4.7 + - @effex/router@1.3.8 + ## 0.0.30 ### Patch Changes diff --git a/apps/docs/package.json b/apps/docs/package.json index 764c3b0..1cbfc55 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -1,6 +1,6 @@ { "name": "docs", - "version": "0.0.30", + "version": "0.0.31", "private": true, "type": "module", "scripts": { diff --git a/packages/create-effex/CHANGELOG.md b/packages/create-effex/CHANGELOG.md index 63959f7..bad84bc 100644 --- a/packages/create-effex/CHANGELOG.md +++ b/packages/create-effex/CHANGELOG.md @@ -1,5 +1,22 @@ # create-effex +## 1.1.3 + +### Patch Changes + +- 2b57548: fix(hydrate): make element requirements provably match `options.layers` + + `hydrate`'s element parameter was locked to `Element`, so any element that also required a user-provided service (`NavigationContext`, `RouteDataProvider`, etc.) had to be cast — `as never` or `as unknown as Element` — even though `options.layers` was providing exactly those services at runtime. + + `HydrateOptions` and `hydrate` are now generic over the layer type. The layer's provided services flow through `Layer.Layer.Success` into the element's allowed `R`, so: + - Passing an element that needs a service without providing a layer for it is a type error. + - Providing a layer that only covers some of the element's requirements is a type error. + - `hydrate(App(), root, { layers: Platform.makeClientLayer(router) })` typechecks with no casts when the layer fully covers what `App()` needs. + + `NoInfer` on the extracted layer type keeps TypeScript from inferring `L` from the element's requirements — inference flows one way, from `options.layers` into the element, so forgetting a service is a compile-time error rather than a silent runtime failure. + + Removed the now-obsolete casts from `create-effex`'s SSG and SSR templates, `apps/docs`, and the hydrate regression test. + ## 1.1.2 ### Patch Changes diff --git a/packages/create-effex/package.json b/packages/create-effex/package.json index dccc13b..26dc6d3 100644 --- a/packages/create-effex/package.json +++ b/packages/create-effex/package.json @@ -1,6 +1,6 @@ { "name": "create-effex", - "version": "1.1.2", + "version": "1.1.3", "description": "Create a new Effex application", "type": "module", "license": "MIT", diff --git a/packages/dom/CHANGELOG.md b/packages/dom/CHANGELOG.md index 2dbf5e2..c973736 100644 --- a/packages/dom/CHANGELOG.md +++ b/packages/dom/CHANGELOG.md @@ -1,5 +1,22 @@ # @effex/dom +## 1.4.7 + +### Patch Changes + +- 2b57548: fix(hydrate): make element requirements provably match `options.layers` + + `hydrate`'s element parameter was locked to `Element`, so any element that also required a user-provided service (`NavigationContext`, `RouteDataProvider`, etc.) had to be cast — `as never` or `as unknown as Element` — even though `options.layers` was providing exactly those services at runtime. + + `HydrateOptions` and `hydrate` are now generic over the layer type. The layer's provided services flow through `Layer.Layer.Success` into the element's allowed `R`, so: + - Passing an element that needs a service without providing a layer for it is a type error. + - Providing a layer that only covers some of the element's requirements is a type error. + - `hydrate(App(), root, { layers: Platform.makeClientLayer(router) })` typechecks with no casts when the layer fully covers what `App()` needs. + + `NoInfer` on the extracted layer type keeps TypeScript from inferring `L` from the element's requirements — inference flows one way, from `options.layers` into the element, so forgetting a service is a compile-time error rather than a silent runtime failure. + + Removed the now-obsolete casts from `create-effex`'s SSG and SSR templates, `apps/docs`, and the hydrate regression test. + ## 1.4.6 ### Patch Changes diff --git a/packages/dom/package.json b/packages/dom/package.json index 0c35a59..eaf9e1b 100644 --- a/packages/dom/package.json +++ b/packages/dom/package.json @@ -1,6 +1,6 @@ { "name": "@effex/dom", - "version": "1.4.6", + "version": "1.4.7", "description": "DOM rendering for Effex - a reactive UI framework built on Effect.ts", "type": "module", "license": "MIT", diff --git a/packages/router/CHANGELOG.md b/packages/router/CHANGELOG.md index 6bd942e..3fb1972 100644 --- a/packages/router/CHANGELOG.md +++ b/packages/router/CHANGELOG.md @@ -1,5 +1,12 @@ # @effex/router +## 1.3.8 + +### Patch Changes + +- Updated dependencies [2b57548] + - @effex/dom@1.4.7 + ## 1.3.7 ### Patch Changes diff --git a/packages/router/package.json b/packages/router/package.json index ed61aef..0ab4bef 100644 --- a/packages/router/package.json +++ b/packages/router/package.json @@ -1,6 +1,6 @@ { "name": "@effex/router", - "version": "1.3.7", + "version": "1.3.8", "description": "Router for Effex applications", "type": "module", "license": "MIT",