@fluixi/dom 1.0.0-alpha.83 → 1.0.0-alpha.85
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/dist/cdn/dom-client.cjs +1427 -1
- package/dist/cdn/dom-client.d.ts +2 -2
- package/dist/cdn/dom-client.global.js +2 -1
- package/dist/cdn/dom-client.js +3 -3
- package/dist/cdn/dom-client.mjs +1430 -1
- package/dist/cdn/dom.cjs +3127 -1
- package/dist/cdn/dom.d.ts +2 -2
- package/dist/cdn/dom.global.js +2 -1
- package/dist/cdn/dom.js +4 -4
- package/dist/cdn/dom.mjs +3133 -1
- package/dist/index.cjs +3155 -1
- package/dist/index.js +2 -2
- package/dist/index.mjs +3149 -1
- package/dist/lib/component/index.cjs +128 -1
- package/dist/lib/component/index.mjs +105 -1
- package/dist/lib/component/modifiers.cjs +126 -1
- package/dist/lib/component/modifiers.d.ts +12 -0
- package/dist/lib/component/modifiers.d.ts.map +1 -1
- package/dist/lib/component/modifiers.js +12 -84
- package/dist/lib/component/modifiers.mjs +105 -1
- package/dist/lib/dom/delegate.cjs +60 -1
- package/dist/lib/dom/delegate.js +1 -1
- package/dist/lib/dom/delegate.mjs +39 -1
- package/dist/lib/dom/dynamic-element.cjs +949 -1
- package/dist/lib/dom/dynamic-element.d.ts +3 -3
- package/dist/lib/dom/dynamic-element.js +2 -2
- package/dist/lib/dom/dynamic-element.mjs +928 -1
- package/dist/lib/dom/hydration-state.cjs +93 -1
- package/dist/lib/dom/hydration-state.d.ts +1 -1
- package/dist/lib/dom/hydration-state.js +1 -1
- package/dist/lib/dom/hydration-state.mjs +72 -1
- package/dist/lib/dom/hydration.cjs +685 -1
- package/dist/lib/dom/hydration.js +8 -8
- package/dist/lib/dom/hydration.mjs +664 -1
- package/dist/lib/dom/index.cjs +2040 -1
- package/dist/lib/dom/index.js +1 -1
- package/dist/lib/dom/index.mjs +2020 -1
- package/dist/lib/dom/integration.cjs +71 -1
- package/dist/lib/dom/integration.js +3 -3
- package/dist/lib/dom/integration.mjs +51 -1
- package/dist/lib/dom/island.cjs +790 -1
- package/dist/lib/dom/island.d.ts +1 -1
- package/dist/lib/dom/island.js +11 -11
- package/dist/lib/dom/island.mjs +769 -1
- package/dist/lib/dom/runtime.cjs +1432 -1
- package/dist/lib/dom/runtime.d.ts +60 -17
- package/dist/lib/dom/runtime.d.ts.map +1 -1
- package/dist/lib/dom/runtime.js +122 -79
- package/dist/lib/dom/runtime.mjs +1414 -1
- package/dist/lib/dom/server/fx-data.cjs +53 -1
- package/dist/lib/dom/server/fx-data.d.ts +5 -5
- package/dist/lib/dom/server/fx-data.js +6 -6
- package/dist/lib/dom/server/fx-data.mjs +32 -1
- package/dist/lib/dom/server/host.cjs +66 -1
- package/dist/lib/dom/server/host.d.ts +6 -0
- package/dist/lib/dom/server/host.d.ts.map +1 -1
- package/dist/lib/dom/server/host.js +7 -1
- package/dist/lib/dom/server/host.mjs +45 -1
- package/dist/lib/dom/server/index.cjs +759 -1
- package/dist/lib/dom/server/index.d.ts +1 -1
- package/dist/lib/dom/server/index.js +1 -1
- package/dist/lib/dom/server/index.mjs +743 -1
- package/dist/lib/dom/server/nodes.cjs +302 -1
- package/dist/lib/dom/server/nodes.d.ts +2 -2
- package/dist/lib/dom/server/nodes.d.ts.map +1 -1
- package/dist/lib/dom/server/nodes.js +4 -4
- package/dist/lib/dom/server/nodes.mjs +279 -1
- package/dist/lib/dom/server/parse-template.cjs +395 -1
- package/dist/lib/dom/server/parse-template.d.ts +1 -1
- package/dist/lib/dom/server/parse-template.js +4 -4
- package/dist/lib/dom/server/parse-template.mjs +372 -1
- package/dist/lib/dom/server/render.cjs +691 -1
- package/dist/lib/dom/server/render.d.ts +9 -1
- package/dist/lib/dom/server/render.d.ts.map +1 -1
- package/dist/lib/dom/server/render.js +23 -15
- package/dist/lib/dom/server/render.mjs +677 -1
- package/dist/lib/dom/server/request-context.cjs +110 -1
- package/dist/lib/dom/server/request-context.d.ts +29 -9
- package/dist/lib/dom/server/request-context.d.ts.map +1 -1
- package/dist/lib/dom/server/request-context.js +28 -8
- package/dist/lib/dom/server/request-context.mjs +89 -1
- package/dist/lib/dom/server/serialize.cjs +187 -1
- package/dist/lib/dom/server/serialize.js +3 -3
- package/dist/lib/dom/server/serialize.mjs +164 -1
- package/dist/lib/dom/server-renderer.cjs +760 -1
- package/dist/lib/dom/server-renderer.js +1 -1
- package/dist/lib/dom/server-renderer.mjs +745 -1
- package/dist/lib/dom/types.cjs +18 -1
- package/dist/lib/dom/utils.cjs +381 -1
- package/dist/lib/dom/utils.d.ts +1 -88
- package/dist/lib/dom/utils.d.ts.map +1 -1
- package/dist/lib/dom/utils.js +2 -99
- package/dist/lib/dom/utils.mjs +361 -1
- package/dist/lib/dom/versions.cjs +60 -1
- package/dist/lib/dom/versions.d.ts +3 -3
- package/dist/lib/dom/versions.d.ts.map +1 -1
- package/dist/lib/dom/versions.js +17 -5
- package/dist/lib/dom/versions.mjs +37 -1
- package/dist/lib/element/attributes.cjs +19 -1
- package/dist/lib/element/attributes.d.ts +7 -7
- package/dist/lib/element/attributes.js +1 -1
- package/dist/lib/element/attributes.mjs +1 -0
- package/dist/lib/element/index.cjs +19 -1
- package/dist/lib/element/index.mjs +1 -0
- package/dist/lib/element/types.cjs +18 -1
- package/dist/lib/element/types.d.ts +4 -5
- package/dist/lib/element/types.d.ts.map +1 -1
- package/dist/lib/element/types.js +0 -1
- package/dist/lib/flow/class-map.cjs +38 -1
- package/dist/lib/flow/class-map.d.ts +3 -3
- package/dist/lib/flow/class-map.js +2 -2
- package/dist/lib/flow/class-map.mjs +17 -1
- package/dist/lib/flow/client-only.cjs +57 -1
- package/dist/lib/flow/client-only.d.ts +4 -4
- package/dist/lib/flow/client-only.js +3 -3
- package/dist/lib/flow/client-only.mjs +36 -1
- package/dist/lib/flow/dynamic.cjs +53 -1
- package/dist/lib/flow/dynamic.d.ts +2 -2
- package/dist/lib/flow/dynamic.js +3 -3
- package/dist/lib/flow/dynamic.mjs +32 -1
- package/dist/lib/flow/error-boundary.cjs +43 -1
- package/dist/lib/flow/error-boundary.d.ts +2 -2
- package/dist/lib/flow/error-boundary.js +3 -3
- package/dist/lib/flow/error-boundary.mjs +22 -1
- package/dist/lib/flow/for.cjs +66 -1
- package/dist/lib/flow/for.d.ts +9 -9
- package/dist/lib/flow/for.d.ts.map +1 -1
- package/dist/lib/flow/for.js +2 -2
- package/dist/lib/flow/for.mjs +45 -1
- package/dist/lib/flow/index-flow.cjs +67 -1
- package/dist/lib/flow/index-flow.d.ts +5 -5
- package/dist/lib/flow/index-flow.js +4 -4
- package/dist/lib/flow/index-flow.mjs +46 -1
- package/dist/lib/flow/index.cjs +805 -1
- package/dist/lib/flow/index.mjs +792 -1
- package/dist/lib/flow/portal.cjs +538 -1
- package/dist/lib/flow/portal.mjs +519 -1
- package/dist/lib/flow/show.cjs +81 -1
- package/dist/lib/flow/show.d.ts +1 -1
- package/dist/lib/flow/show.d.ts.map +1 -1
- package/dist/lib/flow/show.js +4 -115
- package/dist/lib/flow/show.mjs +67 -1
- package/dist/lib/flow/style-map.cjs +43 -1
- package/dist/lib/flow/style-map.d.ts +3 -3
- package/dist/lib/flow/style-map.js +3 -3
- package/dist/lib/flow/style-map.mjs +22 -1
- package/dist/lib/flow/switch.cjs +91 -1
- package/dist/lib/flow/switch.d.ts +3 -3
- package/dist/lib/flow/switch.d.ts.map +1 -1
- package/dist/lib/flow/switch.js +6 -6
- package/dist/lib/flow/switch.mjs +70 -1
- package/dist/lib/flow/utils.cjs +44 -1
- package/dist/lib/flow/utils.d.ts +1 -1
- package/dist/lib/flow/utils.js +1 -1
- package/dist/lib/flow/utils.mjs +23 -1
- package/dist/lib/html.cjs +32 -1
- package/dist/lib/html.d.ts +6 -6
- package/dist/lib/html.js +5 -5
- package/dist/lib/html.mjs +11 -1
- package/dist/lib/index.cjs +3104 -1
- package/dist/lib/index.d.ts +0 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +2 -3
- package/dist/lib/index.mjs +3097 -1
- package/dist/lib/shared/types.cjs +18 -1
- package/dist/lib/shared/types.d.ts +8 -8
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/version.generated.cjs +26 -1
- package/dist/version.generated.d.ts +1 -1
- package/dist/version.generated.js +2 -2
- package/dist/version.generated.mjs +5 -1
- package/package.json +7 -6
- package/dist/lib/jsx/control-flow/flow.cjs +0 -1
- package/dist/lib/jsx/control-flow/flow.d.ts +0 -2
- package/dist/lib/jsx/control-flow/flow.d.ts.map +0 -1
- package/dist/lib/jsx/control-flow/flow.js +0 -627
- package/dist/lib/jsx/control-flow/flow.mjs +0 -0
- package/dist/lib/jsx/control-flow/for-flow.cjs +0 -1
- package/dist/lib/jsx/control-flow/for-flow.d.ts +0 -2
- package/dist/lib/jsx/control-flow/for-flow.d.ts.map +0 -1
- package/dist/lib/jsx/control-flow/for-flow.js +0 -1
- package/dist/lib/jsx/control-flow/for-flow.mjs +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type RequestContext, type RequestEvent } from './request-context.js';
|
|
2
2
|
export interface RenderOptions {
|
|
3
|
-
/** request being rendered
|
|
3
|
+
/** request being rendered: exposed to the app via getRequestEvent() */
|
|
4
4
|
event?: RequestEvent;
|
|
5
5
|
/**
|
|
6
6
|
* Runs ONCE inside the request context, before the app renders. Use it to resolve
|
|
@@ -10,6 +10,14 @@ export interface RenderOptions {
|
|
|
10
10
|
*/
|
|
11
11
|
preload?: (event?: RequestEvent) => void | Promise<void>;
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Render an app to an HTML string.
|
|
15
|
+
*
|
|
16
|
+
* Turns on server mode for the duration, so `createNativeElement` builds serializable
|
|
17
|
+
* stand-ins rather than DOM, and restores whatever it was afterwards. Everything runs
|
|
18
|
+
* inside one request context and one owner, so a resource created during the render is
|
|
19
|
+
* collected and its data serialized for the client to hydrate from.
|
|
20
|
+
*/
|
|
13
21
|
export declare function renderToString(app: () => any, options?: RenderOptions): string;
|
|
14
22
|
/**
|
|
15
23
|
* Optional redactor: transform (or drop) each resource value before it's serialized
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../../src/lib/dom/server/render.ts"],"names":[],"mappings":"AAqCA,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,aAAa;IAC5B,
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../../src/lib/dom/server/render.ts"],"names":[],"mappings":"AAqCA,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAmBlF;AAqBD;;;;;;;;;;;;;;GAcG;AACH,KAAK,YAAY,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;AAE5D,wBAAgB,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAgCjE;AAKD,oFAAoF;AAEpF;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,GAAG,EACd,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAyDjB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Server rendering
|
|
2
|
+
* Server rendering: run an imperative app() under server mode and serialize the
|
|
3
3
|
* resulting node tree to HTML. `renderToString` is synchronous render-once (for
|
|
4
4
|
* loader-free apps); `renderToStringAsync` awaits in-flight resources/Suspense
|
|
5
5
|
* before serializing. Both wrap the render in createRoot so effects/owner are
|
|
@@ -28,6 +28,14 @@ function ensureServerNodes() {
|
|
|
28
28
|
}
|
|
29
29
|
import { escapeFxJson, FX_DATA_ID } from './fx-data.js';
|
|
30
30
|
import { createRequestContext, runWithRequestContext, getRequestContext, } from './request-context.js';
|
|
31
|
+
/**
|
|
32
|
+
* Render an app to an HTML string.
|
|
33
|
+
*
|
|
34
|
+
* Turns on server mode for the duration, so `createNativeElement` builds serializable
|
|
35
|
+
* stand-ins rather than DOM, and restores whatever it was afterwards. Everything runs
|
|
36
|
+
* inside one request context and one owner, so a resource created during the render is
|
|
37
|
+
* collected and its data serialized for the client to hydrate from.
|
|
38
|
+
*/
|
|
31
39
|
export function renderToString(app, options = {}) {
|
|
32
40
|
const prev = isServer();
|
|
33
41
|
ensureServerNodes();
|
|
@@ -49,7 +57,7 @@ export function renderToString(app, options = {}) {
|
|
|
49
57
|
}
|
|
50
58
|
}
|
|
51
59
|
// Install the SSR resource hooks once (never unset). They route to the *current*
|
|
52
|
-
// request context
|
|
60
|
+
// request context, so concurrent async renders stay isolated (with an
|
|
53
61
|
// AsyncLocalStorage store injected) instead of a per-call setter clobbering a
|
|
54
62
|
// sibling render's sink.
|
|
55
63
|
let _hooksInstalled = false;
|
|
@@ -84,7 +92,7 @@ export function serializeResourceData(ctx) {
|
|
|
84
92
|
for (const [k, v] of ctx.data) {
|
|
85
93
|
let out = v;
|
|
86
94
|
if (_redactor) {
|
|
87
|
-
// A throwing redactor must not crash the render or leak
|
|
95
|
+
// A throwing redactor must not crash the render or leak: omit on error.
|
|
88
96
|
try {
|
|
89
97
|
out = _redactor(v, k);
|
|
90
98
|
}
|
|
@@ -93,8 +101,8 @@ export function serializeResourceData(ctx) {
|
|
|
93
101
|
}
|
|
94
102
|
}
|
|
95
103
|
if (out === undefined)
|
|
96
|
-
continue; // redacted
|
|
97
|
-
// A value JSON cannot represent is not data the client can be seeded with
|
|
104
|
+
continue; // redacted -> omit (client refetches)
|
|
105
|
+
// A value JSON cannot represent is not data the client can be seeded with:
|
|
98
106
|
// JSON.stringify drops the key silently, so keeping it here only produces an
|
|
99
107
|
// entry that disappears later. A lazy route's resolved module is the common
|
|
100
108
|
// case: the resource holds the component function itself.
|
|
@@ -106,7 +114,7 @@ export function serializeResourceData(ctx) {
|
|
|
106
114
|
return '';
|
|
107
115
|
// Non-executable JSON block (CSP-friendly; never runs as JS), escaped with the standard
|
|
108
116
|
// SSR-JSON set so no value can break out of the <script>. The client reads it via
|
|
109
|
-
// getServerData()
|
|
117
|
+
// getServerData() -> JSON.parse(textContent).
|
|
110
118
|
const json = escapeFxJson(JSON.stringify(obj));
|
|
111
119
|
// Decided on the serialized form, not on the map: the checks above catch the
|
|
112
120
|
// values we know about, and this catches the rest (a nested undefined, a class
|
|
@@ -116,7 +124,7 @@ export function serializeResourceData(ctx) {
|
|
|
116
124
|
return '';
|
|
117
125
|
return `<script type="application/json" id="${FX_DATA_ID}">${json}</script>`;
|
|
118
126
|
}
|
|
119
|
-
/** Bound on resolve
|
|
127
|
+
/** Bound on resolve -> refetch waterfalls so a buggy loader can't spin forever. */
|
|
120
128
|
const MAX_ASYNC_ROUNDS = 50;
|
|
121
129
|
/** Ref-count of in-flight async renders, to scope eager stale-effect scheduling. */
|
|
122
130
|
/**
|
|
@@ -132,7 +140,7 @@ export async function renderToStringAsync(app, options = {}) {
|
|
|
132
140
|
const ctx = createRequestContext(options.event);
|
|
133
141
|
try {
|
|
134
142
|
return await runWithRequestContext(ctx, async () => {
|
|
135
|
-
// Resolve request-scoped state (region/locale/session)
|
|
143
|
+
// Resolve request-scoped state (region/locale/session) before the app renders,
|
|
136
144
|
// inside the request context so it can read the event and write into ctx.data
|
|
137
145
|
// for client transfer. Runs once per request. Guarded so the no-preload path
|
|
138
146
|
// keeps its original synchronous flow into createRoot (an extra `await undefined`
|
|
@@ -151,18 +159,18 @@ export async function renderToStringAsync(app, options = {}) {
|
|
|
151
159
|
// lazy subtrees to render, which can CREATE resources; running with the root as
|
|
152
160
|
// owner makes those resources owned by the root, so dispose() cancels them. If
|
|
153
161
|
// we serialized with Owner=null (the default after createRoot returns), a
|
|
154
|
-
// resource created during serialize would be unowned
|
|
155
|
-
// settles
|
|
162
|
+
// resource created during serialize would be unowned -> never cancelled -> it
|
|
163
|
+
// settles after the response is serialized and the root disposed, re-running an
|
|
156
164
|
// effect on a torn-down/detached tree (the storefront's "page shows, then errors
|
|
157
165
|
// ~2-3s later" crash). Wrapped because a suspended read may throw its promise.
|
|
158
166
|
const probe = () => {
|
|
159
167
|
try {
|
|
160
168
|
runWithOwner(rootOwner, () => serializeNode(tree));
|
|
161
169
|
}
|
|
162
|
-
catch { /* suspended read
|
|
170
|
+
catch { /* suspended read, resource self-registered */ }
|
|
163
171
|
};
|
|
164
172
|
// Force the (lazily-built) component tree to evaluate so every resource/lazy
|
|
165
|
-
// load is created and self-registers in ctx.pending
|
|
173
|
+
// load is created and self-registers in ctx.pending before we drain. A tree
|
|
166
174
|
// behind deferred memos (e.g. a router <Outlet/>) renders NOTHING until serialize.
|
|
167
175
|
probe();
|
|
168
176
|
let rounds = 0;
|
|
@@ -170,11 +178,11 @@ export async function renderToStringAsync(app, options = {}) {
|
|
|
170
178
|
const batch = Array.from(ctx.pending);
|
|
171
179
|
ctx.pending.clear();
|
|
172
180
|
await Promise.allSettled(batch);
|
|
173
|
-
// resource settle() queues the dependent render effects
|
|
181
|
+
// resource settle() queues the dependent render effects: run them so
|
|
174
182
|
// the tree reflects resolved data (and any waterfall fetch registers).
|
|
175
183
|
await flush();
|
|
176
|
-
// Re-probe: a freshly-resolved lazy/route reveals its
|
|
177
|
-
// when its subtree is evaluated
|
|
184
|
+
// Re-probe: a freshly-resolved lazy/route reveals its own resources only
|
|
185
|
+
// when its subtree is evaluated: force that so they register for the next round.
|
|
178
186
|
probe();
|
|
179
187
|
}
|
|
180
188
|
// Serialize the resolved resource data so the client seeds it (no refetch).
|