@vidact/start 0.2.0-beta.4 → 0.2.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @vidact/start
2
2
 
3
+ ## 0.2.0-beta.5
4
+
5
+ ### Patch Changes
6
+
7
+ - f7fe490: Hydration fixes for server-rendered content the client cannot reproduce immediately.
8
+
9
+ - Keep hydration markers out of raw-text elements. The server no longer emits `<!--vidact:v1:*-->` comments inside `<textarea>`, `<title>`, `<script>` and `<style>`, where the HTML parser turned them into literal text that stayed visible until hydration recovered from the mismatch. The hydrator synthesizes those markers around the element's parsed text node instead, so such elements hydrate in place.
10
+ - Dehydrated Suspense boundaries. When a Suspense child suspends while hydrating server-rendered content — a `lazy` chunk that has not loaded yet, for example — the boundary now keeps the server DOM on screen and swaps in the client render once the resource resolves, instead of publishing the fallback over it, mismatching, and re-mounting the whole root.
11
+ - `@vidact/start` renders the route tree inside a root component on the server. The client mounts the application under a compiled root of its own, which claims a component marker range; without a matching server root every client component claimed the range of the _next_ server component, which surfaced as a hydration mismatch (and a visible fallback flash) on any route whose component has more than one return.
12
+ - `hydrateStart` accepts `onRecoverableError`, and warns on the console by default when hydration has to recover by re-rendering. A silent recovery looks like a working page that merely flashes.
13
+ - Hydration mismatch messages describe the element (`DIV.class[data-x]`) instead of just its tag.
14
+ - Element claiming no longer prefers a candidate that contains an array marker unless the pending structural child is a list. A conditional or Suspense child triggered the same bias, so a class-less wrapper `<div>{cond ? <A/> : <B/>}</div>` could claim an unrelated sibling that happened to hold a keyed list.
15
+
16
+ - Hydration marker protocol `v2`. The server no longer wraps intrinsic elements (`s`) or scalar text (`t`) in marker comments — inside a child slot an element can only be the intrinsic child and a text node the scalar, so the hydrator infers them, splitting a text node that adjacent scalars parsed into. A scalar binding borrows its child-slot markers as its range (no DOM writes) and only creates anchor comments where there is nothing to borrow, such as inside `<textarea>`. The prefix shrank from `vidact:v1` to `v2`; together this removes about 40% of markers and 60% of marker bytes from server HTML. A `v1` render is rejected by a `v2` client and re-rendered, and vice versa.
17
+
18
+ - Updated dependencies [f7fe490]
19
+ - @vidact/runtime@0.2.0-beta.5
20
+ - @vidact/vite@0.2.0-beta.5
21
+
3
22
  ## 0.2.0-beta.4
4
23
 
5
24
  ### Patch Changes
package/dist/client.d.ts CHANGED
@@ -4,6 +4,12 @@ import { CompiledRoot } from "@vidact/runtime";
4
4
  interface HydrateStartOptions {
5
5
  readonly fetch?: typeof globalThis.fetch;
6
6
  readonly manifest: RouteManifest;
7
+ /**
8
+ * Called when hydration could not attach to the server DOM and the root was rendered
9
+ * client-side instead. Defaults to a console warning: a silent recovery looks like a
10
+ * working page that merely flashes, and is far harder to notice than a warning.
11
+ */
12
+ readonly onRecoverableError?: (error: unknown) => void;
7
13
  readonly root?: ParentNode;
8
14
  readonly rootId?: string;
9
15
  readonly snapshot?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","names":[],"sources":["../src/client.ts"],"mappings":";;;UA0BiB;WACN,eAAe,WAAW;WAC1B,UAAU;WACV,OAAO;WACP;WACA;WACA;;UAGM;WACN;WACA;;UAGM,oBAAoB;WAC1B,WAAW,aAAa,KAAK,UAAU,yBAAyB;;iBAKrD,aAAa,SAAS,sBAAsB,QAAQ"}
1
+ {"version":3,"file":"client.d.ts","names":[],"sources":["../src/client.ts"],"mappings":";;;UA0BiB;WACN,eAAe,WAAW;WAC1B,UAAU;;;;;;WAMV,sBAAsB;WACtB,OAAO;WACP;WACA;WACA;;UAGM;WACN;WACA;;UAGM,oBAAoB;WAC1B,WAAW,aAAa,KAAK,UAAU,yBAAyB;;iBAKrD,aAAa,SAAS,sBAAsB,QAAQ"}
package/dist/client.js CHANGED
@@ -14,7 +14,7 @@ async function hydrateStart(options) {
14
14
  const loaded = await loadRouteMatches(matches, request, snapshot.loaderData);
15
15
  const host = options.root ?? document.querySelector(`#${CSS.escape(options.rootId ?? DEFAULT_ROOT_ID)}`);
16
16
  if (host === null) throw new Error("Vidact Start hydration root is missing");
17
- const root = hydrateRoot(host, createClientApplication(loaded, request.url));
17
+ const root = hydrateRoot(host, createClientApplication(loaded, request.url), { onRecoverableError: options.onRecoverableError ?? ((error) => console.warn("[vidact/start] hydration recovered by re-rendering:", error)) });
18
18
  const fetchNavigation = options.fetch ?? window.fetch.bind(window);
19
19
  let navigation = 0;
20
20
  let navigationController;
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":[],"sources":["../src/client.ts"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":[],"sources":["../src/client.ts"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","names":[],"sources":["../src/server.ts"],"mappings":";;UAwBiB;WACN;WACA;WACA;WACA;WACA;;UAGM;WACN;WACA,UAAU;WACV,YAAY,SAAS,YAAY,WAAW,QAAQ;WACpD,kBAAkB,SAAS,kCAAkC;WAC7D;WACA;;iBAGK,mBACd,SAAS,uBACP,SAAS,YAAY,QAAQ"}
1
+ {"version":3,"file":"server.d.ts","names":[],"sources":["../src/server.ts"],"mappings":";;UAkCiB;WACN;WACA;WACA;WACA;WACA;;UAGM;WACN;WACA,UAAU;WACV,YAAY,SAAS,YAAY,WAAW,QAAQ;WACpD,kBAAkB,SAAS,kCAAkC;WAC7D;WACA;;iBAGK,mBACd,SAAS,uBACP,SAAS,YAAY,QAAQ"}
package/dist/server.js CHANGED
@@ -3,6 +3,15 @@ import { VIDACT_START_PROTOCOL, VIDACT_START_SNAPSHOT_MEDIA_TYPE, encodeStartSna
3
3
  import { createElement } from "@vidact/runtime/server";
4
4
  import { renderToReadableStream } from "@vidact/runtime/framework/server";
5
5
  //#region src/server.ts
6
+ /**
7
+ * The client mounts the route tree under a compiled root of its own, and every compiled
8
+ * root claims a component marker range while hydrating. Rendering the tree inside a
9
+ * matching root component on the server keeps the two sides' component ranges aligned;
10
+ * without it each client component would claim the range of the *next* server one.
11
+ */
12
+ function StartApplication({ children }) {
13
+ return children;
14
+ }
6
15
  const DEFAULT_ROOT_ID = "vidact-start-root";
7
16
  const DEFAULT_SNAPSHOT_ID = "vidact-start-snapshot";
8
17
  function createStartHandler(options) {
@@ -41,7 +50,7 @@ function createStartHandler(options) {
41
50
  }));
42
51
  if (request.headers.get("x-vidact-start-navigation") === "1") return new Response(request.method === "HEAD" ? null : snapshot, { headers: { "content-type": `${VIDACT_START_SNAPSHOT_MEDIA_TYPE}; charset=utf-8` } });
43
52
  const application = composeRouteMatches(loaded, (component, props) => createElement(component, props), request.url);
44
- const stream = await renderToReadableStream(() => application, { identifierPrefix: "start-" });
53
+ const stream = await renderToReadableStream(() => createElement(StartApplication, { children: application }), { identifierPrefix: "start-" });
45
54
  const documentContext = {
46
55
  applicationHtml: await new Response(stream).text(),
47
56
  clientEntry: options.clientEntry,
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","names":[],"sources":["../src/server.ts"],"mappings":"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"}
1
+ {"version":3,"file":"server.js","names":[],"sources":["../src/server.ts"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vidact/start",
3
- "version": "0.2.0-beta.4",
3
+ "version": "0.2.0-beta.5",
4
4
  "description": "Full-stack application framework primitives for Vidact",
5
5
  "keywords": [
6
6
  "full-stack",
@@ -53,11 +53,11 @@
53
53
  "access": "public"
54
54
  },
55
55
  "dependencies": {
56
- "@vidact/runtime": "0.2.0-beta.4",
57
- "@vidact/vite": "0.2.0-beta.4"
56
+ "@vidact/runtime": "0.2.0-beta.5",
57
+ "@vidact/vite": "0.2.0-beta.5"
58
58
  },
59
59
  "devDependencies": {
60
- "@types/node": "^24.13.3",
60
+ "@types/node": "24.13.3",
61
61
  "tsdown": "0.22.14",
62
62
  "typescript": "7.0.2",
63
63
  "vite": "8.2.2",
package/src/client.ts CHANGED
@@ -27,6 +27,12 @@ const DEFAULT_SNAPSHOT_ID = 'vidact-start-snapshot'
27
27
  export interface HydrateStartOptions {
28
28
  readonly fetch?: typeof globalThis.fetch
29
29
  readonly manifest: RouteManifest
30
+ /**
31
+ * Called when hydration could not attach to the server DOM and the root was rendered
32
+ * client-side instead. Defaults to a console warning: a silent recovery looks like a
33
+ * working page that merely flashes, and is far harder to notice than a warning.
34
+ */
35
+ readonly onRecoverableError?: (error: unknown) => void
30
36
  readonly root?: ParentNode
31
37
  readonly rootId?: string
32
38
  readonly snapshot?: string
@@ -57,7 +63,11 @@ export async function hydrateStart(options: HydrateStartOptions): Promise<StartC
57
63
  options.root ?? document.querySelector(`#${CSS.escape(options.rootId ?? DEFAULT_ROOT_ID)}`)
58
64
  if (host === null) throw new Error('Vidact Start hydration root is missing')
59
65
 
60
- const root = hydrateRoot(host, createClientApplication(loaded, request.url))
66
+ const root = hydrateRoot(host, createClientApplication(loaded, request.url), {
67
+ onRecoverableError:
68
+ options.onRecoverableError ??
69
+ ((error) => console.warn('[vidact/start] hydration recovered by re-rendering:', error)),
70
+ })
61
71
  const fetchNavigation = options.fetch ?? window.fetch.bind(window)
62
72
  let navigation = 0
63
73
  let navigationController: AbortController | undefined
package/src/server.ts CHANGED
@@ -19,6 +19,16 @@ import {
19
19
  VIDACT_START_SNAPSHOT_MEDIA_TYPE,
20
20
  } from './snapshot.ts'
21
21
 
22
+ /**
23
+ * The client mounts the route tree under a compiled root of its own, and every compiled
24
+ * root claims a component marker range while hydrating. Rendering the tree inside a
25
+ * matching root component on the server keeps the two sides' component ranges aligned;
26
+ * without it each client component would claim the range of the *next* server one.
27
+ */
28
+ function StartApplication({ children }: { readonly children?: ServerChild }): ServerChild {
29
+ return children
30
+ }
31
+
22
32
  const DEFAULT_ROOT_ID = 'vidact-start-root'
23
33
  const DEFAULT_SNAPSHOT_ID = 'vidact-start-snapshot'
24
34
 
@@ -100,9 +110,10 @@ export function createStartHandler(
100
110
  createElement(component as unknown as ServerComponent, props) as ServerChild,
101
111
  request.url,
102
112
  ) as ServerChild
103
- const stream = await renderToReadableStream(() => application, {
104
- identifierPrefix: 'start-',
105
- })
113
+ const stream = await renderToReadableStream(
114
+ () => createElement(StartApplication, { children: application }) as ServerChild,
115
+ { identifierPrefix: 'start-' },
116
+ )
106
117
  const applicationHtml = await new Response(stream).text()
107
118
  const documentContext = {
108
119
  applicationHtml,