sygnal 5.4.0 → 6.0.0
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 +646 -0
- package/README.md +24 -9
- package/dist/astro/client.cjs.js +16 -9
- package/dist/astro/client.cjs.js.map +1 -1
- package/dist/astro/client.mjs +16 -9
- package/dist/astro/client.mjs.map +1 -1
- package/dist/astro/index.cjs.js +362 -91
- package/dist/astro/index.cjs.js.map +1 -1
- package/dist/astro/index.mjs +362 -92
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/server.cjs.js +3396 -165
- package/dist/astro/server.cjs.js.map +1 -1
- package/dist/astro/server.mjs +3396 -165
- package/dist/astro/server.mjs.map +1 -1
- package/dist/devtools.cjs.js +1431 -0
- package/dist/devtools.cjs.js.map +1 -0
- package/dist/devtools.esm.js +1419 -0
- package/dist/devtools.esm.js.map +1 -0
- package/dist/diagnostics.cjs.js +3032 -296
- package/dist/diagnostics.cjs.js.map +1 -1
- package/dist/diagnostics.esm.js +3032 -296
- package/dist/diagnostics.esm.js.map +1 -1
- package/dist/element.cjs.js +230 -0
- package/dist/element.cjs.js.map +1 -0
- package/dist/element.esm.js +228 -0
- package/dist/element.esm.js.map +1 -0
- package/dist/guide/accessibility.md +257 -0
- package/dist/guide/adapters.md +221 -0
- package/dist/guide/behaviors.md +312 -0
- package/dist/guide/browser-sources.md +203 -0
- package/dist/guide/drag-and-drop.md +342 -0
- package/dist/guide/element-commands.md +306 -0
- package/dist/guide/error-boundaries.md +169 -0
- package/dist/guide/forms-reference.md +381 -0
- package/dist/guide/forms.md +250 -0
- package/dist/guide/http.md +299 -0
- package/dist/guide/inputs.md +173 -0
- package/dist/guide/persistence.md +245 -0
- package/dist/guide/recipes/carousel.md +155 -0
- package/dist/guide/recipes/charts.md +177 -0
- package/dist/guide/recipes/code-editor.md +135 -0
- package/dist/guide/recipes/data-grid.md +155 -0
- package/dist/guide/recipes/data-table.md +196 -0
- package/dist/guide/recipes/i18n.md +222 -0
- package/dist/guide/recipes/icons.md +115 -0
- package/dist/guide/recipes/overview.md +33 -0
- package/dist/guide/recipes/rich-text.md +154 -0
- package/dist/guide/resources.md +471 -0
- package/dist/guide/ssr.md +255 -0
- package/dist/guide/timers.md +178 -0
- package/dist/guide/ui/accordion.md +93 -0
- package/dist/guide/ui/combobox.md +144 -0
- package/dist/guide/ui/dialog.md +124 -0
- package/dist/guide/ui/disclosure.md +60 -0
- package/dist/guide/ui/menu.md +125 -0
- package/dist/guide/ui/overview.md +166 -0
- package/dist/guide/ui/popover.md +101 -0
- package/dist/guide/ui/select.md +114 -0
- package/dist/guide/ui/tabs.md +161 -0
- package/dist/guide/ui/toaster.md +152 -0
- package/dist/guide/ui/tooltip.md +103 -0
- package/dist/guide/undo.md +178 -0
- package/dist/guide/virtual-collections.md +183 -0
- package/dist/guide/web-components.md +179 -0
- package/dist/guide/widgets.md +217 -0
- package/dist/index.cjs.js +13178 -5769
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +2908 -276
- package/dist/index.esm.js +13149 -5779
- package/dist/index.esm.js.map +1 -1
- package/dist/jsx-dev-runtime.cjs.js +26 -334
- package/dist/jsx-dev-runtime.cjs.js.map +1 -1
- package/dist/jsx-dev-runtime.esm.js +19 -327
- package/dist/jsx-dev-runtime.esm.js.map +1 -1
- package/dist/jsx-runtime.cjs.js +26 -334
- package/dist/jsx-runtime.cjs.js.map +1 -1
- package/dist/jsx-runtime.esm.js +19 -327
- package/dist/jsx-runtime.esm.js.map +1 -1
- package/dist/jsx.cjs.js +10 -314
- package/dist/jsx.cjs.js.map +1 -1
- package/dist/jsx.esm.js +8 -315
- package/dist/jsx.esm.js.map +1 -1
- package/dist/react.cjs.js +117 -0
- package/dist/react.cjs.js.map +1 -0
- package/dist/react.esm.js +115 -0
- package/dist/react.esm.js.map +1 -0
- package/dist/shims/globalthis.cjs +20 -0
- package/dist/sygnal.min.js +1 -1
- package/dist/sygnal.min.js.map +1 -1
- package/dist/ui-combobox.cjs.js +169 -0
- package/dist/ui-combobox.cjs.js.map +1 -0
- package/dist/ui-combobox.esm.js +148 -0
- package/dist/ui-combobox.esm.js.map +1 -0
- package/dist/ui-menu.cjs.js +87 -0
- package/dist/ui-menu.cjs.js.map +1 -0
- package/dist/ui-menu.esm.js +66 -0
- package/dist/ui-menu.esm.js.map +1 -0
- package/dist/ui-select.cjs.js +104 -0
- package/dist/ui-select.cjs.js.map +1 -0
- package/dist/ui-select.esm.js +83 -0
- package/dist/ui-select.esm.js.map +1 -0
- package/dist/ui.cjs.js +738 -0
- package/dist/ui.cjs.js.map +1 -0
- package/dist/ui.esm.js +727 -0
- package/dist/ui.esm.js.map +1 -0
- package/dist/vike/ClientOnly.cjs.js +4 -14
- package/dist/vike/ClientOnly.cjs.js.map +1 -1
- package/dist/vike/ClientOnly.mjs +4 -14
- package/dist/vike/ClientOnly.mjs.map +1 -1
- package/dist/vike/{+config.js → config/+config.js} +9 -1
- package/dist/vike/config/+config.js.map +1 -0
- package/dist/vike/config/package.json +6 -0
- package/dist/vike/onRenderClient.cjs.js +165 -95
- package/dist/vike/onRenderClient.cjs.js.map +1 -1
- package/dist/vike/onRenderClient.mjs +165 -95
- package/dist/vike/onRenderClient.mjs.map +1 -1
- package/dist/vike/onRenderHtml.cjs.js +59 -24
- package/dist/vike/onRenderHtml.cjs.js.map +1 -1
- package/dist/vike/onRenderHtml.mjs +60 -25
- package/dist/vike/onRenderHtml.mjs.map +1 -1
- package/dist/vite/plugin.cjs.js +323 -88
- package/dist/vite/plugin.cjs.js.map +1 -1
- package/dist/vite/plugin.mjs +323 -89
- package/dist/vite/plugin.mjs.map +1 -1
- package/dist/zag.cjs.js +408 -0
- package/dist/zag.cjs.js.map +1 -0
- package/dist/zag.esm.js +405 -0
- package/dist/zag.esm.js.map +1 -0
- package/llms.txt +166 -103
- package/package.json +98 -14
- package/src/astro/client.ts +27 -16
- package/src/astro/index.d.ts +24 -0
- package/src/astro/index.ts +69 -3
- package/src/astro/server.ts +8 -2
- package/src/collection.ts +6 -93
- package/src/core/actions.ts +134 -0
- package/src/core/cell.ts +202 -0
- package/src/core/debug.ts +23 -0
- package/src/core/define.ts +242 -0
- package/src/core/hooks.ts +314 -0
- package/src/core/hosts/collection.ts +325 -0
- package/src/core/hosts/switchable.ts +146 -0
- package/src/core/instance.ts +592 -0
- package/src/core/markers/clientonly.ts +13 -0
- package/src/core/markers/lazy.ts +40 -0
- package/src/core/markers/portal.ts +96 -0
- package/src/core/markers/suspense.ts +41 -0
- package/src/core/markers/transition.ts +70 -0
- package/src/core/registry.ts +25 -0
- package/src/core/runtime.ts +573 -0
- package/src/core/statics.ts +104 -0
- package/src/core/teardown.ts +60 -0
- package/src/core/view.ts +37 -0
- package/src/cycle/dom/DocumentDOMSource.ts +13 -8
- package/src/cycle/dom/ElementFinder.ts +7 -9
- package/src/cycle/dom/EventDelegator.ts +174 -223
- package/src/cycle/dom/IsolateModule.ts +65 -35
- package/src/cycle/dom/MainDOMSource.ts +9 -2
- package/src/cycle/dom/PriorityQueue.ts +4 -2
- package/src/cycle/dom/SymbolTree.ts +18 -47
- package/src/cycle/dom/classNameModule.ts +9 -7
- package/src/cycle/dom/controlledInputModule.ts +23 -6
- package/src/cycle/dom/enrichEventStream.ts +25 -47
- package/src/cycle/dom/fragment.ts +7 -0
- package/src/cycle/dom/isolate.ts +30 -27
- package/src/cycle/dom/makeDOMDriver.ts +115 -56
- package/src/cycle/dom/mockDOMSource.ts +21 -1
- package/src/cycle/dom/modules.ts +16 -3
- package/src/cycle/dom/propsModule.ts +65 -0
- package/src/cycle/dom/selectModule.ts +22 -17
- package/src/cycle/dom/snabbdom.ts +1 -6
- package/src/cycle/dom/thunk.ts +3 -0
- package/src/cycle/dom/utils.ts +98 -0
- package/src/cycle/dom/viewTransition.ts +43 -0
- package/src/cycle/state/StateSource.ts +19 -3
- package/src/cycle/state/objIsEqual.ts +50 -0
- package/src/cycle/state/types.ts +0 -10
- package/src/defineComponent.ts +34 -0
- package/src/devtools.d.ts +151 -0
- package/src/devtools.ts +34 -0
- package/src/element.d.ts +59 -0
- package/src/element.ts +235 -0
- package/src/extra/backoff.ts +9 -0
- package/src/extra/behaviors.ts +169 -0
- package/src/extra/browserSignals.ts +23 -0
- package/src/extra/browserSources.ts +326 -0
- package/src/extra/command.ts +3 -3
- package/src/extra/controls.ts +47 -0
- package/src/extra/copyAsTest.ts +286 -0
- package/src/extra/devtools.ts +101 -31
- package/src/extra/devtoolsActions.ts +379 -0
- package/src/extra/devtoolsHook.ts +9 -0
- package/src/extra/devtoolsNext.ts +83 -0
- package/src/extra/diagnostics/checks/actionLog.ts +108 -0
- package/src/extra/diagnostics/checks/behaviors.ts +49 -0
- package/src/extra/diagnostics/checks/browserSources.ts +96 -0
- package/src/extra/diagnostics/checks/collections.ts +1 -1
- package/src/extra/diagnostics/checks/controls.ts +148 -0
- package/src/extra/diagnostics/checks/dataset.ts +57 -0
- package/src/extra/diagnostics/checks/dom.ts +20 -11
- package/src/extra/diagnostics/checks/elementCommands.ts +175 -0
- package/src/extra/diagnostics/checks/events.ts +17 -2
- package/src/extra/diagnostics/checks/fetch.ts +135 -0
- package/src/extra/diagnostics/checks/forms.ts +163 -0
- package/src/extra/diagnostics/checks/index.ts +97 -4
- package/src/extra/diagnostics/checks/inspect.ts +140 -32
- package/src/extra/diagnostics/checks/next.ts +417 -0
- package/src/extra/diagnostics/checks/persist.ts +54 -0
- package/src/extra/diagnostics/checks/props.ts +10 -5
- package/src/extra/diagnostics/checks/public.d.ts +98 -7
- package/src/extra/diagnostics/checks/replies.ts +128 -0
- package/src/extra/diagnostics/checks/router.ts +100 -0
- package/src/extra/diagnostics/checks/rxjsHints.ts +1 -1
- package/src/extra/diagnostics/checks/shared.ts +86 -2
- package/src/extra/diagnostics/checks/shorthand.ts +115 -0
- package/src/extra/diagnostics/checks/sortable.ts +129 -0
- package/src/extra/diagnostics/checks/state.ts +100 -7
- package/src/extra/diagnostics/checks/statics.ts +48 -0
- package/src/extra/diagnostics/checks/strict.ts +10 -67
- package/src/extra/diagnostics/checks/timers.ts +80 -0
- package/src/extra/diagnostics/checks/viewTransitions.ts +47 -0
- package/src/extra/diagnostics/checks/virtual.ts +73 -0
- package/src/extra/diagnostics/checks/widgets.ts +109 -0
- package/src/extra/diagnostics/checks/wiring.ts +66 -10
- package/src/extra/diagnostics/codes.ts +268 -23
- package/src/extra/diagnostics/index.ts +34 -9
- package/src/extra/diagnostics/legacy.ts +17 -0
- package/src/extra/driverFactories.ts +83 -19
- package/src/extra/elementCommands.ts +53 -0
- package/src/extra/fetchDriver.ts +519 -0
- package/src/extra/focusWithin.ts +27 -0
- package/src/extra/form.ts +268 -0
- package/src/extra/formHelpers.ts +139 -0
- package/src/extra/head.ts +106 -0
- package/src/extra/hmr.ts +2 -3
- package/src/extra/owned.ts +24 -0
- package/src/extra/pager.ts +50 -0
- package/src/extra/persist.ts +133 -0
- package/src/extra/pwa.ts +1 -1
- package/src/extra/queryCache.ts +107 -0
- package/src/extra/reducers.ts +1 -1
- package/src/extra/reduxDevtools.ts +92 -0
- package/src/extra/replies.ts +54 -0
- package/src/extra/router.ts +323 -0
- package/src/extra/run.ts +90 -217
- package/src/extra/selection.ts +76 -0
- package/src/extra/socketDriver.ts +265 -0
- package/src/extra/sortable.ts +377 -0
- package/src/extra/ssr.ts +427 -160
- package/src/extra/standardSchema.ts +27 -0
- package/src/extra/testing.ts +2433 -175
- package/src/extra/timers.ts +95 -0
- package/src/extra/undo.ts +261 -0
- package/src/extra/viewTransitions.ts +38 -0
- package/src/extra/virtual.ts +513 -0
- package/src/extra/widget.ts +201 -0
- package/src/index.d.ts +2631 -117
- package/src/index.ts +25 -4
- package/src/jsx-runtime.ts +15 -1
- package/src/jsx.ts +2 -1
- package/src/lazy.ts +50 -7
- package/src/portal.ts +3 -1
- package/src/pragma/index.ts +256 -133
- package/src/react-peers.d.ts +5 -0
- package/src/react.d.ts +43 -0
- package/src/react.ts +110 -0
- package/src/shared.ts +48 -0
- package/src/slot.ts +1 -1
- package/src/suspense.ts +3 -1
- package/src/switchable.ts +6 -121
- package/src/transition.ts +3 -1
- package/src/ui/accordion.ts +64 -0
- package/src/ui/dialog.ts +129 -0
- package/src/ui/disclosure.ts +35 -0
- package/src/ui/popover.ts +45 -0
- package/src/ui/shared.ts +94 -0
- package/src/ui/tabs.ts +82 -0
- package/src/ui/toaster.ts +198 -0
- package/src/ui/tooltip.ts +70 -0
- package/src/ui/zag/combobox.ts +115 -0
- package/src/ui/zag/menu.ts +40 -0
- package/src/ui/zag/select.ts +54 -0
- package/src/ui/zag/shared.ts +43 -0
- package/src/ui-combobox.d.ts +20 -0
- package/src/ui-combobox.ts +6 -0
- package/src/ui-menu.d.ts +30 -0
- package/src/ui-menu.ts +6 -0
- package/src/ui-select.d.ts +17 -0
- package/src/ui-select.ts +6 -0
- package/src/ui-zag-types.d.ts +42 -0
- package/src/ui.d.ts +208 -0
- package/src/ui.ts +15 -0
- package/src/vike/+config.ts +9 -1
- package/src/vike/ClientOnly.ts +1 -1
- package/src/vike/onRenderClient.ts +144 -96
- package/src/vike/onRenderHtml.ts +69 -26
- package/src/vike/types.ts +7 -1
- package/src/vite/globalthis-shim.ts +18 -0
- package/src/vite/globalthis.ts +56 -0
- package/src/vite/plugin.d.ts +22 -3
- package/src/vite/plugin.ts +222 -24
- package/src/zag.d.ts +64 -0
- package/src/zag.ts +238 -0
- package/dist/vike/+config.cjs.js +0 -66
- package/dist/vike/+config.cjs.js.map +0 -1
- package/dist/vike/+config.js.map +0 -1
- package/src/component.ts +0 -2301
- package/src/cycle/isolate/index.ts +0 -196
- package/src/cycle/run/index.ts +0 -151
- package/src/cycle/run/internals.ts +0 -143
- package/src/cycle/state/Collection.ts +0 -184
- package/src/cycle/state/index.ts +0 -5
- package/src/cycle/state/pickCombine.ts +0 -201
- package/src/cycle/state/pickMerge.ts +0 -122
- package/src/cycle/state/withState.ts +0 -47
- package/src/pragma/fn.ts +0 -55
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
import { run } from 'sygnal';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* PLAN-4.5 G-275: marks an initial state that a wrapper built from its caller's values (an
|
|
5
|
+
* element's host props, Vike's pageContext.data or hydrated state, renderComponent's
|
|
6
|
+
* initialState option). The dev statics freeze (D152, checks/statics.ts) leaves a marked object
|
|
7
|
+
* and everything in it alone: the caller may still change those values. A non-enumerable symbol
|
|
8
|
+
* key: spreads, JSON and Object.keys don't see it.
|
|
9
|
+
*/
|
|
10
|
+
const OWNED = Symbol.for('sygnal.owned');
|
|
11
|
+
const owned = (v) => {
|
|
12
|
+
// G-289: an object that refuses the key (a Proxy) is returned as is
|
|
13
|
+
try {
|
|
14
|
+
if (v && typeof v == 'object' && Object.isExtensible(v))
|
|
15
|
+
Object.defineProperty(v, OWNED, { value: 1 });
|
|
16
|
+
}
|
|
17
|
+
catch { }
|
|
18
|
+
return v;
|
|
19
|
+
};
|
|
20
|
+
|
|
3
21
|
/**
|
|
4
22
|
* Vike client-side render hook for Sygnal.
|
|
5
23
|
*
|
|
@@ -30,40 +48,55 @@ let currentPageData = {};
|
|
|
30
48
|
let currentRouteParams = {};
|
|
31
49
|
let currentUrlPathname = '';
|
|
32
50
|
let pageNavCounter = 0;
|
|
51
|
+
/**
|
|
52
|
+
* PLAN-4 G-207: the uid() path part of a shell component or the Page: wrapper_0 → 'w0',
|
|
53
|
+
* layout_1 → 'l1', page → 'p'. Given as the nested vnode's `id` prop, so the Page's uid is
|
|
54
|
+
* 'u-w0-l0-p' however the shell nests it; onRenderHtml renders each one with the same root
|
|
55
|
+
* (renderToString's `uid`), so server and client ids match. (Same helper in onRenderHtml.ts.)
|
|
56
|
+
*/
|
|
57
|
+
function uidPart(key) {
|
|
58
|
+
return key == 'page' ? 'p' : key[0] + key.slice(key.indexOf('_') + 1);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* PLAN-4.6 R4 (04 §3.11): the core instantiates a component from the vnode's `data.c`, a
|
|
62
|
+
* component function, and reads its statics there (no options object). A shell component or a
|
|
63
|
+
* Page is wrapped once (a per-app / per-navigation function) with the statics the options
|
|
64
|
+
* gave the 5.x core: isolatedState, and the initial state.
|
|
65
|
+
*/
|
|
66
|
+
const shellFns = new WeakMap();
|
|
67
|
+
function shellFn(comp, initialState, cache = true) {
|
|
68
|
+
let f = cache ? shellFns.get(comp) : undefined;
|
|
69
|
+
if (!f) {
|
|
70
|
+
f = Object.assign((p) => comp(p), comp, { isolatedState: true, initialState });
|
|
71
|
+
try {
|
|
72
|
+
Object.defineProperty(f, 'name', { value: comp.name, configurable: true });
|
|
73
|
+
}
|
|
74
|
+
catch (_) { }
|
|
75
|
+
if (cache)
|
|
76
|
+
shellFns.set(comp, f);
|
|
77
|
+
}
|
|
78
|
+
return f;
|
|
79
|
+
}
|
|
80
|
+
let pageFn, pageFnNav = -1;
|
|
33
81
|
/**
|
|
34
82
|
* Build a component vnode that matches what the JSX pragma produces.
|
|
35
83
|
*/
|
|
36
|
-
function componentVNode(comp, stateField, children, compInitialState) {
|
|
84
|
+
function componentVNode(comp, key, stateField, children, compInitialState) {
|
|
37
85
|
const name = comp.componentName || comp.name || 'FUNCTION_COMPONENT';
|
|
38
86
|
return {
|
|
39
87
|
sel: name,
|
|
40
88
|
data: {
|
|
89
|
+
c: shellFn(comp, owned(comp.initialState)),
|
|
41
90
|
props: {
|
|
42
91
|
state: stateField,
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
view: comp,
|
|
46
|
-
model: comp.model,
|
|
47
|
-
intent: comp.intent,
|
|
48
|
-
hmrActions: comp.hmrActions,
|
|
49
|
-
context: comp.context,
|
|
50
|
-
peers: comp.peers,
|
|
51
|
-
components: comp.components,
|
|
52
|
-
initialState: compInitialState,
|
|
53
|
-
isolatedState: true,
|
|
54
|
-
calculated: comp.calculated,
|
|
55
|
-
storeCalculatedInState: comp.storeCalculatedInState,
|
|
56
|
-
DOMSourceName: comp.DOMSourceName,
|
|
57
|
-
stateSourceName: comp.stateSourceName,
|
|
58
|
-
onError: comp.onError,
|
|
59
|
-
debug: comp.debug,
|
|
60
|
-
},
|
|
92
|
+
// G-207: the uid() base, as onRenderHtml gives this shell component (see uidPart)
|
|
93
|
+
id: uidPart(key),
|
|
61
94
|
},
|
|
62
95
|
},
|
|
63
96
|
children,
|
|
64
97
|
text: undefined,
|
|
65
98
|
elm: undefined,
|
|
66
|
-
key: '__vike_' +
|
|
99
|
+
key: '__vike_' + key + '__',
|
|
67
100
|
};
|
|
68
101
|
}
|
|
69
102
|
/**
|
|
@@ -71,33 +104,22 @@ function componentVNode(comp, stateField, children, compInitialState) {
|
|
|
71
104
|
* Reads from mutable `currentPage` / `currentPageName` so the wrapper
|
|
72
105
|
* view picks up the new Page component on navigation without being recreated.
|
|
73
106
|
*/
|
|
74
|
-
function pageChildVNode(pageState) {
|
|
75
|
-
//
|
|
76
|
-
//
|
|
107
|
+
function pageChildVNode(pageState, stateField = 'page') {
|
|
108
|
+
// a new function per navigation, so the Page is made again even when both pages are the same
|
|
109
|
+
// function (e.g. 'Page'); the nav counter in `sel` keeps the vnodes apart
|
|
77
110
|
const sel = currentPageName + '__nav' + pageNavCounter;
|
|
111
|
+
if (pageFnNav !== pageNavCounter) {
|
|
112
|
+
pageFnNav = pageNavCounter;
|
|
113
|
+
pageFn = shellFn(currentPage, undefined, false);
|
|
114
|
+
}
|
|
78
115
|
return {
|
|
79
116
|
sel,
|
|
80
117
|
data: {
|
|
118
|
+
c: pageFn,
|
|
81
119
|
props: {
|
|
82
|
-
state:
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
view: currentPage,
|
|
86
|
-
model: currentPage.model,
|
|
87
|
-
intent: currentPage.intent,
|
|
88
|
-
hmrActions: currentPage.hmrActions,
|
|
89
|
-
context: currentPage.context,
|
|
90
|
-
peers: currentPage.peers,
|
|
91
|
-
components: currentPage.components,
|
|
92
|
-
initialState: pageState,
|
|
93
|
-
isolatedState: true,
|
|
94
|
-
calculated: currentPage.calculated,
|
|
95
|
-
storeCalculatedInState: currentPage.storeCalculatedInState,
|
|
96
|
-
DOMSourceName: currentPage.DOMSourceName,
|
|
97
|
-
stateSourceName: currentPage.stateSourceName,
|
|
98
|
-
onError: currentPage.onError,
|
|
99
|
-
debug: currentPage.debug,
|
|
100
|
-
},
|
|
120
|
+
state: stateField,
|
|
121
|
+
// G-207: the Page's uid() base, as onRenderHtml gives it (the same across navigations)
|
|
122
|
+
id: uidPart('page'),
|
|
101
123
|
},
|
|
102
124
|
},
|
|
103
125
|
children: [],
|
|
@@ -119,24 +141,47 @@ function pageChildVNode(pageState) {
|
|
|
119
141
|
function createLayoutWrapper(wrappers, layouts, Page) {
|
|
120
142
|
currentPage = Page;
|
|
121
143
|
currentPageName = Page.componentName || Page.name || 'VikePageComponent';
|
|
122
|
-
// Combined shell = wrappers (outermost) + layouts (innermost around Page)
|
|
123
|
-
//
|
|
124
|
-
//
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
144
|
+
// Combined shell = wrappers (outermost) + layouts (innermost around Page).
|
|
145
|
+
// D50: the root state holds every slice as a sibling, as in 5.4.0 but with the Page at the
|
|
146
|
+
// root too: { wrapper_0, ..., layout_0, ..., page }. A component's `state` prop selects from
|
|
147
|
+
// its parent component's state, and the shell components are nested in each other, so each
|
|
148
|
+
// one (and the Page) gets a { get, set } lens onto its own ROOT slice: an outer component's
|
|
149
|
+
// reducer replacing its state can't wipe the inner slices (R2-2), and no view sees another
|
|
150
|
+
// component's slice.
|
|
151
|
+
const keys = shellKeys(wrappers, layouts);
|
|
152
|
+
const shell = [...wrappers, ...layouts].map((comp, i) => ({ comp, key: keys[i] }));
|
|
153
|
+
// The latest root state. Only the outermost lens gets the root itself; the nested lenses get
|
|
154
|
+
// their parent shell component's state. In both directions the outermost lens runs first and
|
|
155
|
+
// synchronously (state: root -> outer get -> inner get; a reducer: outer get, inner get, inner
|
|
156
|
+
// set, outer set), so the nested lenses read and write through `root`.
|
|
157
|
+
let root = {};
|
|
158
|
+
const rootLens = (key, outermost, fresh) => ({
|
|
159
|
+
get: (state) => {
|
|
160
|
+
if (outermost)
|
|
161
|
+
root = state || {};
|
|
162
|
+
const slice = root[key];
|
|
163
|
+
// a shell slice is a new object on every root state, so the components nested in the
|
|
164
|
+
// shell component see every change (their state stream drops repeated objects)
|
|
165
|
+
return fresh && slice && typeof slice === 'object' && !Array.isArray(slice) ? { ...slice } : slice;
|
|
166
|
+
},
|
|
167
|
+
set: (state, slice) => {
|
|
168
|
+
root = { ...root, [key]: slice };
|
|
169
|
+
// a nested lens returns a changed parent state, so the parent's lens writes `root` back
|
|
170
|
+
return outermost ? root : { ...state };
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
const lenses = keys.map((key, i) => rootLens(key, i === 0, true));
|
|
174
|
+
const pageLens = rootLens('page', false, false);
|
|
129
175
|
function LayoutWrapperView({ state }) {
|
|
130
176
|
if (shell.length === 0) {
|
|
131
177
|
// No wrappers or layouts — render Page directly
|
|
132
178
|
return pageChildVNode(state.page);
|
|
133
179
|
}
|
|
134
180
|
const lastIdx = shell.length - 1;
|
|
135
|
-
|
|
136
|
-
let inner = componentVNode(shell[lastIdx].comp, shell[lastIdx].key, [pageChildVNode(innermostState.page)], innermostState);
|
|
181
|
+
let inner = componentVNode(shell[lastIdx].comp, shell[lastIdx].key, lenses[lastIdx], [pageChildVNode(state.page, pageLens)], state[shell[lastIdx].key]);
|
|
137
182
|
// Wrap with outer shell components
|
|
138
183
|
for (let i = lastIdx - 1; i >= 0; i--) {
|
|
139
|
-
inner = componentVNode(shell[i].comp, shell[i].key, [inner], state[shell[i].key]);
|
|
184
|
+
inner = componentVNode(shell[i].comp, shell[i].key, lenses[i], [inner], state[shell[i].key]);
|
|
140
185
|
}
|
|
141
186
|
// Wrap in a plain div so the view returns a regular DOM vnode.
|
|
142
187
|
// Sub-component vnodes at the root position are not processed correctly
|
|
@@ -151,17 +196,18 @@ function createLayoutWrapper(wrappers, layouts, Page) {
|
|
|
151
196
|
};
|
|
152
197
|
}
|
|
153
198
|
LayoutWrapperView.componentName = 'VikeLayoutWrapper';
|
|
154
|
-
//
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
}
|
|
164
|
-
|
|
199
|
+
// run() names the root by `name` first
|
|
200
|
+
try {
|
|
201
|
+
Object.defineProperty(LayoutWrapperView, 'name', { value: 'VikeLayoutWrapper', configurable: true });
|
|
202
|
+
}
|
|
203
|
+
catch (_) { }
|
|
204
|
+
// The wrapper's initial state: a sibling slice for each shell component and the Page.
|
|
205
|
+
// Must match onRenderHtml's serialized state.
|
|
206
|
+
const initialState = {};
|
|
207
|
+
shell.forEach(({ comp, key }) => { initialState[key] = { ...(comp.initialState || {}) }; });
|
|
208
|
+
initialState.page = Page.initialState || {};
|
|
209
|
+
// G-275: owned (built from the hydrated state and pageContext.data: never frozen in dev)
|
|
210
|
+
LayoutWrapperView.initialState = root = owned(initialState);
|
|
165
211
|
// Context uses mutable references so navigation updates are picked up.
|
|
166
212
|
// Wrapper and Layout contexts are merged once; page-level context
|
|
167
213
|
// (pageData, routeParams, urlPathname) reads from mutable variables
|
|
@@ -181,6 +227,13 @@ function createLayoutWrapper(wrappers, layouts, Page) {
|
|
|
181
227
|
};
|
|
182
228
|
return LayoutWrapperView;
|
|
183
229
|
}
|
|
230
|
+
/** State keys of the shell components, outermost first: wrapper_0, ..., layout_0, ... */
|
|
231
|
+
function shellKeys(wrappers, layouts) {
|
|
232
|
+
return [
|
|
233
|
+
...wrappers.map((_, i) => 'wrapper_' + i),
|
|
234
|
+
...layouts.map((_, i) => 'layout_' + i),
|
|
235
|
+
];
|
|
236
|
+
}
|
|
184
237
|
/**
|
|
185
238
|
* Normalize a cumulative config value into an array of functions.
|
|
186
239
|
*/
|
|
@@ -195,34 +248,39 @@ function onRenderClient(pageContext) {
|
|
|
195
248
|
const wrappers = toComponentArray(config.Wrapper);
|
|
196
249
|
const layouts = toComponentArray(config.Layout);
|
|
197
250
|
const hasShell = wrappers.length > 0 || layouts.length > 0;
|
|
198
|
-
// The shell is wrappers (outermost) + layouts
|
|
199
|
-
//
|
|
200
|
-
const shell =
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
251
|
+
// The shell is wrappers (outermost) + layouts; their state slices and the Page's are
|
|
252
|
+
// siblings at the root (D50).
|
|
253
|
+
const shell = shellKeys(wrappers, layouts);
|
|
254
|
+
// PLAN-3 5-5 (H-7): seed the caches of the fetch drivers (makeFetchDriver({ cache: queryCache() })
|
|
255
|
+
// exposes it as driver.cache) before the page renders, so its resources start at 'success'
|
|
256
|
+
if (pageContext.queryCache) {
|
|
257
|
+
for (const d of Object.values(config.drivers || {}))
|
|
258
|
+
d?.cache?.hydrate?.(pageContext.queryCache);
|
|
259
|
+
}
|
|
205
260
|
// Update mutable context references (used by the wrapper's context functions)
|
|
206
261
|
currentPageData = data;
|
|
207
262
|
currentRouteParams = pageContext.routeParams || {};
|
|
208
|
-
|
|
263
|
+
// urlPathname is built in on the client with Client Routing (G-046: it is
|
|
264
|
+
// not in passToClient); fall back to the location with Server Routing.
|
|
265
|
+
currentUrlPathname = pageContext.urlPathname
|
|
266
|
+
|| (typeof window !== 'undefined' && window.location ? window.location.pathname : '');
|
|
209
267
|
// --- Shell path: hot-swap Page, keep Layout/Wrapper alive ---
|
|
210
268
|
if (hasShell) {
|
|
211
269
|
if (currentApp) {
|
|
212
270
|
// Client-side navigation: swap the Page without disposing the shell.
|
|
271
|
+
// PLAN-3 5-4b: a router given Vike's navigate() (makeRouter({ routes, navigate })) re-reads
|
|
272
|
+
// the route on this event; sent before the swap, so the new Page declares after it
|
|
273
|
+
if (typeof window !== 'undefined')
|
|
274
|
+
window.dispatchEvent?.(new Event('sygnal:navigate'));
|
|
213
275
|
currentPage = Page;
|
|
214
276
|
currentPageName = Page.componentName || Page.name || 'VikePageComponent';
|
|
215
277
|
pageNavCounter++;
|
|
216
278
|
const newPageState = { ...(Page.initialState || {}), ...data };
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
[innermostKey]: { ...shellState, page: newPageState },
|
|
223
|
-
};
|
|
224
|
-
});
|
|
225
|
-
}
|
|
279
|
+
// replace the page slice, keeping every shell slice (G-106, D50)
|
|
280
|
+
const swapPage = (state) => ({ ...state, page: newPageState });
|
|
281
|
+
// (PLAN-4.6 core: through the runtime API, 04 §3.11)
|
|
282
|
+
const rt = currentApp.__runtime;
|
|
283
|
+
rt?.setState('root', swapPage);
|
|
226
284
|
}
|
|
227
285
|
else {
|
|
228
286
|
// First load: read hydrated state or build from initialState
|
|
@@ -234,25 +292,28 @@ function onRenderClient(pageContext) {
|
|
|
234
292
|
else {
|
|
235
293
|
initialState = null;
|
|
236
294
|
}
|
|
237
|
-
if (initialState &&
|
|
238
|
-
// Hydrated
|
|
295
|
+
if (initialState && initialState[shell[shell.length - 1]] !== undefined) {
|
|
296
|
+
// Hydrated shell state: sibling slices (D50), or the 5.4.0 shape with the Page state
|
|
297
|
+
// under the innermost shell slice (R2-9) — distribute the slices to each component
|
|
239
298
|
const allShellComps = [...wrappers, ...layouts];
|
|
299
|
+
let pageState = initialState.page;
|
|
240
300
|
shell.forEach((key, i) => {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
}
|
|
301
|
+
let slice = initialState[key];
|
|
302
|
+
if (slice === undefined)
|
|
303
|
+
return;
|
|
304
|
+
if (i === shell.length - 1 && slice && 'page' in slice) {
|
|
305
|
+
const { page, ...rest } = slice;
|
|
306
|
+
if (pageState === undefined)
|
|
307
|
+
pageState = page;
|
|
308
|
+
slice = rest;
|
|
250
309
|
}
|
|
310
|
+
allShellComps[i].initialState = owned(slice);
|
|
251
311
|
});
|
|
312
|
+
Page.initialState = owned(pageState || { ...(Page.initialState || {}), ...data });
|
|
252
313
|
}
|
|
253
314
|
else {
|
|
254
315
|
// SPA mode or client-side first navigation
|
|
255
|
-
Page.initialState = { ...(Page.initialState || {}), ...data };
|
|
316
|
+
Page.initialState = owned({ ...(Page.initialState || {}), ...data });
|
|
256
317
|
}
|
|
257
318
|
// Inject page-level context into Page (for SSR renderToString compat)
|
|
258
319
|
Page.context = {
|
|
@@ -263,7 +324,9 @@ function onRenderClient(pageContext) {
|
|
|
263
324
|
};
|
|
264
325
|
const Component = createLayoutWrapper(wrappers, layouts, Page);
|
|
265
326
|
try {
|
|
266
|
-
|
|
327
|
+
// 3-B2: `__vike` marks the shell's components (Page, Layouts, Wrappers: sub-components of
|
|
328
|
+
// the shell root) for the dev entry, whose SYG224 then says persist() isn't supported there
|
|
329
|
+
currentApp = run(Component, { ...config.drivers, __vike: () => 1 }, { mountPoint: '#page-view', onError: config.sygnalOnError });
|
|
267
330
|
}
|
|
268
331
|
catch (err) {
|
|
269
332
|
console.error('[sygnal/vike] Client render error:', err);
|
|
@@ -284,14 +347,17 @@ function onRenderClient(pageContext) {
|
|
|
284
347
|
currentApp = null;
|
|
285
348
|
}
|
|
286
349
|
let initialState;
|
|
350
|
+
// 3-B2: the server's state is here when the page hydrates its HTML
|
|
351
|
+
let serverState = false;
|
|
287
352
|
if (typeof window !== 'undefined' && window.__VIKE_SYGNAL_STATE__ !== undefined) {
|
|
288
353
|
initialState = window.__VIKE_SYGNAL_STATE__;
|
|
289
354
|
delete window.__VIKE_SYGNAL_STATE__;
|
|
355
|
+
serverState = true;
|
|
290
356
|
}
|
|
291
357
|
else {
|
|
292
358
|
initialState = { ...(Page.initialState || {}), ...data };
|
|
293
359
|
}
|
|
294
|
-
Page.initialState = initialState;
|
|
360
|
+
Page.initialState = owned(initialState);
|
|
295
361
|
Page.context = {
|
|
296
362
|
...Page.context,
|
|
297
363
|
pageData: () => currentPageData,
|
|
@@ -299,7 +365,11 @@ function onRenderClient(pageContext) {
|
|
|
299
365
|
urlPathname: () => currentUrlPathname,
|
|
300
366
|
};
|
|
301
367
|
try {
|
|
302
|
-
|
|
368
|
+
// 3-B2: the Page is the root, so its persist() restores after the first render when this
|
|
369
|
+
// is a hydration (`__hydrate`), keeping that render equal to the server's HTML. A client-side
|
|
370
|
+
// navigation isn't one, though the previous page's markup is still in #page-view
|
|
371
|
+
const hydrating = pageContext.isHydration ?? serverState;
|
|
372
|
+
currentApp = run(Page, { ...config.drivers, __hydrate: () => hydrating }, { mountPoint: '#page-view', onError: config.sygnalOnError });
|
|
303
373
|
}
|
|
304
374
|
catch (err) {
|
|
305
375
|
console.error('[sygnal/vike] Client render error:', err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onRenderClient.mjs","sources":["../../src/vike/onRenderClient.ts"],"sourcesContent":["/**\n * Vike client-side render hook for Sygnal.\n *\n * On first page load (hydration): reads server-serialized state and\n * boots the Sygnal app via run().\n *\n * On client-side navigation with a Layout/Wrapper: the Layout and Wrapper\n * stay mounted and only the Page sub-component is hot-swapped. Layout and\n * Wrapper state persists across navigations. Without either, the app is\n * disposed and recreated.\n *\n * Nesting order: Wrapper > Layout > Page\n * - Wrappers are outermost (context providers, state management)\n * - Layouts are inside wrappers (visual structure, navigation chrome)\n * - Page is innermost (route-specific content, swapped on navigation)\n */\n\n// Import from the package entry so rollup externalizes it\n// @ts-ignore — resolved at runtime via package exports\nimport { run } from 'sygnal'\n\ndeclare global {\n interface Window {\n __VIKE_SYGNAL_STATE__?: any\n }\n}\n\ninterface PageContext {\n Page: any\n data?: any\n routeParams?: Record<string, string>\n urlPathname?: string\n isHydration?: boolean\n config: {\n Layout?: any | any[]\n Wrapper?: any | any[]\n title?: string\n ssr?: boolean\n drivers?: Record<string, (sink: any) => any>\n }\n}\n\n/** Track the running Sygnal app for disposal on navigation */\nlet currentApp: { sources: any; sinks: any; dispose: () => void } | null = null\n\n/**\n * Mutable references read by the wrapper's view function.\n * Updated on navigation to swap the Page without disposing the Layout.\n */\nlet currentPage: any = null\nlet currentPageName: string = ''\nlet currentPageData: any = {}\nlet currentRouteParams: any = {}\nlet currentUrlPathname: string = ''\nlet pageNavCounter: number = 0\n\n/**\n * Build a component vnode that matches what the JSX pragma produces.\n */\nfunction componentVNode(comp: any, stateField: string, children: any[], compInitialState?: any): any {\n const name = comp.componentName || comp.name || 'FUNCTION_COMPONENT'\n return {\n sel: name,\n data: {\n props: {\n state: stateField,\n sygnalOptions: {\n name,\n view: comp,\n model: comp.model,\n intent: comp.intent,\n hmrActions: comp.hmrActions,\n context: comp.context,\n peers: comp.peers,\n components: comp.components,\n initialState: compInitialState,\n isolatedState: true,\n calculated: comp.calculated,\n storeCalculatedInState: comp.storeCalculatedInState,\n DOMSourceName: comp.DOMSourceName,\n stateSourceName: comp.stateSourceName,\n onError: comp.onError,\n debug: comp.debug,\n },\n },\n },\n children,\n text: undefined,\n elm: undefined,\n key: '__vike_' + stateField + '__',\n }\n}\n\n/**\n * Build a vnode for the current Page as a child of the Layout.\n * Reads from mutable `currentPage` / `currentPageName` so the wrapper\n * view picks up the new Page component on navigation without being recreated.\n */\nfunction pageChildVNode(pageState: any): any {\n // Include pageNavCounter in sel so instantiateSubComponents detects a\n // component swap even when both pages have the same function name (e.g. 'Page').\n const sel = currentPageName + '__nav' + pageNavCounter\n return {\n sel,\n data: {\n props: {\n state: 'page',\n sygnalOptions: {\n name: sel,\n view: currentPage,\n model: currentPage.model,\n intent: currentPage.intent,\n hmrActions: currentPage.hmrActions,\n context: currentPage.context,\n peers: currentPage.peers,\n components: currentPage.components,\n initialState: pageState,\n isolatedState: true,\n calculated: currentPage.calculated,\n storeCalculatedInState: currentPage.storeCalculatedInState,\n DOMSourceName: currentPage.DOMSourceName,\n stateSourceName: currentPage.stateSourceName,\n onError: currentPage.onError,\n debug: currentPage.debug,\n },\n },\n },\n children: [],\n text: undefined,\n elm: undefined,\n key: '__vike_page__',\n }\n}\n\n/**\n * Create a synthetic wrapper component that nests Page inside Layout(s)\n * inside Wrapper(s).\n *\n * Nesting order: Wrapper(s) > Layout(s) > Page\n *\n * The wrapper's view reads `currentPage` from the mutable closure, so\n * on client-side navigation only the Page sub-component changes while\n * the Layout and Wrapper stay mounted with their state preserved.\n */\nfunction createLayoutWrapper(wrappers: any[], layouts: any[], Page: any): any {\n currentPage = Page\n currentPageName = Page.componentName || Page.name || 'VikePageComponent'\n\n // Combined shell = wrappers (outermost) + layouts (innermost around Page)\n // State keys: wrapper_0, wrapper_1, ..., layout_0, layout_1, ...\n // Page state lives under the innermost shell component's slice.\n const shell = [\n ...wrappers.map((w: any, i: number) => ({ comp: w, key: 'wrapper_' + i })),\n ...layouts.map((l: any, i: number) => ({ comp: l, key: 'layout_' + i })),\n ]\n\n function LayoutWrapperView({ state }: any) {\n if (shell.length === 0) {\n // No wrappers or layouts — render Page directly\n return pageChildVNode(state.page)\n }\n\n const lastIdx = shell.length - 1\n const innermostState = state[shell[lastIdx].key] || {}\n let inner: any = componentVNode(\n shell[lastIdx].comp,\n shell[lastIdx].key,\n [pageChildVNode(innermostState.page)],\n innermostState\n )\n\n // Wrap with outer shell components\n for (let i = lastIdx - 1; i >= 0; i--) {\n inner = componentVNode(shell[i].comp, shell[i].key, [inner], state[shell[i].key])\n }\n\n // Wrap in a plain div so the view returns a regular DOM vnode.\n // Sub-component vnodes at the root position are not processed correctly\n // by the rendering pipeline — they must be children of a DOM element.\n return {\n sel: 'div',\n data: { attrs: { id: 'vike-shell' } },\n children: [inner],\n text: undefined,\n elm: undefined,\n key: '__vike_shell__',\n }\n }\n\n LayoutWrapperView.componentName = 'VikeLayoutWrapper'\n\n // Build the wrapper's initial state with a slice for each shell component.\n // Page state is nested under the innermost shell component's slice.\n const wrapperInitialState: any = {}\n shell.forEach(({ comp, key }: any, i: number) => {\n const sliceState: any = { ...(comp.initialState || {}) }\n if (i === shell.length - 1) {\n sliceState.page = Page.initialState || {}\n }\n wrapperInitialState[key] = sliceState\n })\n\n LayoutWrapperView.initialState = wrapperInitialState\n\n // Context uses mutable references so navigation updates are picked up.\n // Wrapper and Layout contexts are merged once; page-level context\n // (pageData, routeParams, urlPathname) reads from mutable variables\n // updated on each navigation.\n const shellContext: any = {}\n shell.forEach(({ comp }: any) => {\n if (comp.context) {\n Object.assign(shellContext, comp.context)\n }\n })\n\n LayoutWrapperView.context = {\n ...shellContext,\n ...(Page.context || {}),\n pageData: () => currentPageData,\n routeParams: () => currentRouteParams,\n urlPathname: () => currentUrlPathname,\n }\n\n return LayoutWrapperView\n}\n\n/**\n * Normalize a cumulative config value into an array of functions.\n */\nfunction toComponentArray(val: any): any[] {\n if (!val) return []\n return (Array.isArray(val) ? val : [val]).filter((c: any) => typeof c === 'function')\n}\n\nexport function onRenderClient(pageContext: PageContext) {\n const { Page, config } = pageContext\n const data = pageContext.data || {}\n\n const wrappers = toComponentArray(config.Wrapper)\n const layouts = toComponentArray(config.Layout)\n const hasShell = wrappers.length > 0 || layouts.length > 0\n\n // The shell is wrappers (outermost) + layouts. The innermost component\n // holds the Page state as a nested sub-component.\n const shell = [\n ...wrappers.map((_: any, i: number) => 'wrapper_' + i),\n ...layouts.map((_: any, i: number) => 'layout_' + i),\n ]\n const innermostKey = shell.length > 0 ? shell[shell.length - 1] : null\n\n // Update mutable context references (used by the wrapper's context functions)\n currentPageData = data\n currentRouteParams = pageContext.routeParams || {}\n currentUrlPathname = pageContext.urlPathname || ''\n\n // --- Shell path: hot-swap Page, keep Layout/Wrapper alive ---\n if (hasShell) {\n if (currentApp) {\n // Client-side navigation: swap the Page without disposing the shell.\n currentPage = Page\n currentPageName = Page.componentName || Page.name || 'VikePageComponent'\n pageNavCounter++\n\n const newPageState = { ...(Page.initialState || {}), ...data }\n if (currentApp.sinks?.STATE?.shamefullySendNext) {\n currentApp.sinks.STATE.shamefullySendNext((state: any) => {\n const shellState = state[innermostKey!] || {}\n return {\n ...state,\n [innermostKey!]: { ...shellState, page: newPageState },\n }\n })\n }\n } else {\n // First load: read hydrated state or build from initialState\n let initialState: any\n if (typeof window !== 'undefined' && window.__VIKE_SYGNAL_STATE__ !== undefined) {\n initialState = window.__VIKE_SYGNAL_STATE__\n delete window.__VIKE_SYGNAL_STATE__\n } else {\n initialState = null\n }\n\n if (initialState && innermostKey && initialState[innermostKey] !== undefined) {\n // Hydrated combined state — distribute slices to each shell component\n const allShellComps = [...wrappers, ...layouts]\n shell.forEach((key: string, i: number) => {\n if (initialState[key] !== undefined) {\n if (i === shell.length - 1) {\n const { page: pageState, ...compState } = initialState[key]\n allShellComps[i].initialState = compState\n Page.initialState = pageState || { ...(Page.initialState || {}), ...data }\n } else {\n allShellComps[i].initialState = initialState[key]\n }\n }\n })\n } else {\n // SPA mode or client-side first navigation\n Page.initialState = { ...(Page.initialState || {}), ...data }\n }\n\n // Inject page-level context into Page (for SSR renderToString compat)\n Page.context = {\n ...Page.context,\n pageData: () => currentPageData,\n routeParams: () => currentRouteParams,\n urlPathname: () => currentUrlPathname,\n }\n\n const Component = createLayoutWrapper(wrappers, layouts, Page)\n\n try {\n currentApp = run(Component, config.drivers || {}, { mountPoint: '#page-view' }) as any\n } catch (err: any) {\n console.error('[sygnal/vike] Client render error:', err)\n const container = document.getElementById('page-view')\n if (container) {\n container.innerHTML = `<div data-sygnal-error style=\"padding:2rem;color:#e74c3c;font-family:monospace\">\n <h2>Render Error</h2>\n <pre>${String(err.message || err)}</pre>\n </div>`\n }\n }\n }\n\n // --- No shell path: dispose and recreate ---\n } else {\n if (currentApp) {\n currentApp.dispose()\n currentApp = null\n }\n\n let initialState: any\n if (typeof window !== 'undefined' && window.__VIKE_SYGNAL_STATE__ !== undefined) {\n initialState = window.__VIKE_SYGNAL_STATE__\n delete window.__VIKE_SYGNAL_STATE__\n } else {\n initialState = { ...(Page.initialState || {}), ...data }\n }\n\n Page.initialState = initialState\n Page.context = {\n ...Page.context,\n pageData: () => currentPageData,\n routeParams: () => currentRouteParams,\n urlPathname: () => currentUrlPathname,\n }\n\n try {\n currentApp = run(Page, config.drivers || {}, { mountPoint: '#page-view' }) as any\n } catch (err: any) {\n console.error('[sygnal/vike] Client render error:', err)\n const container = document.getElementById('page-view')\n if (container) {\n container.innerHTML = `<div data-sygnal-error style=\"padding:2rem;color:#e74c3c;font-family:monospace\">\n <h2>Render Error</h2>\n <pre>${String(err.message || err)}</pre>\n </div>`\n }\n }\n }\n\n // Update document title on client navigation\n if (config.title) {\n document.title = config.title\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"onRenderClient.mjs","sources":["../../src/extra/owned.ts","../../src/vike/onRenderClient.ts"],"sourcesContent":["/**\n * PLAN-4.5 G-275: marks an initial state that a wrapper built from its caller's values (an\n * element's host props, Vike's pageContext.data or hydrated state, renderComponent's\n * initialState option). The dev statics freeze (D152, checks/statics.ts) leaves a marked object\n * and everything in it alone: the caller may still change those values. A non-enumerable symbol\n * key: spreads, JSON and Object.keys don't see it.\n */\nexport const OWNED = Symbol.for('sygnal.owned')\n\nexport const owned = <T>(v: T): T => {\n // G-289: an object that refuses the key (a Proxy) is returned as is\n try { if (v && typeof v == 'object' && Object.isExtensible(v)) Object.defineProperty(v, OWNED, {value: 1}) } catch {}\n return v\n}\n\n/**\n * G-289: owned() of a shallow copy of a plain object or array (the caller's own object stays\n * unmarked: it may be a component's static, which the freeze must still cover, or sealed, which\n * can't be marked); anything else as owned()\n */\nexport const ownedCopy = <T>(v: T): T => {\n const p = v && typeof v == 'object' ? Object.getPrototypeOf(v) : 0\n return owned(Array.isArray(v) ? [...v] as any : p == Object.prototype || p === null ? {...v} : v)\n}\n","/**\n * Vike client-side render hook for Sygnal.\n *\n * On first page load (hydration): reads server-serialized state and\n * boots the Sygnal app via run().\n *\n * On client-side navigation with a Layout/Wrapper: the Layout and Wrapper\n * stay mounted and only the Page sub-component is hot-swapped. Layout and\n * Wrapper state persists across navigations. Without either, the app is\n * disposed and recreated.\n *\n * Nesting order: Wrapper > Layout > Page\n * - Wrappers are outermost (context providers, state management)\n * - Layouts are inside wrappers (visual structure, navigation chrome)\n * - Page is innermost (route-specific content, swapped on navigation)\n */\n\n// Import from the package entry so rollup externalizes it\n// @ts-ignore — resolved at runtime via package exports\nimport { run } from 'sygnal'\nimport { owned } from '../extra/owned'\n\ndeclare global {\n interface Window {\n __VIKE_SYGNAL_STATE__?: any\n }\n}\n\ninterface PageContext {\n Page: any\n data?: any\n routeParams?: Record<string, string>\n urlPathname?: string\n isHydration?: boolean\n /** PLAN-3 5-5 (H-7): the queryCache() snapshot a loader seeded (see onRenderHtml) */\n queryCache?: any\n config: {\n Layout?: any | any[]\n Wrapper?: any | any[]\n title?: string\n ssr?: boolean\n drivers?: Record<string, (sink: any) => any>\n // PLAN-4 GS-11: the app-level error hook (not Vike's own onError)\n sygnalOnError?: (error: any, info: any) => void\n }\n}\n\n/** Track the running Sygnal app for disposal on navigation */\nlet currentApp: { sources: any; sinks: any; dispose: () => void } | null = null\n\n/**\n * Mutable references read by the wrapper's view function.\n * Updated on navigation to swap the Page without disposing the Layout.\n */\nlet currentPage: any = null\nlet currentPageName: string = ''\nlet currentPageData: any = {}\nlet currentRouteParams: any = {}\nlet currentUrlPathname: string = ''\nlet pageNavCounter: number = 0\n\n/**\n * PLAN-4 G-207: the uid() path part of a shell component or the Page: wrapper_0 → 'w0',\n * layout_1 → 'l1', page → 'p'. Given as the nested vnode's `id` prop, so the Page's uid is\n * 'u-w0-l0-p' however the shell nests it; onRenderHtml renders each one with the same root\n * (renderToString's `uid`), so server and client ids match. (Same helper in onRenderHtml.ts.)\n */\nfunction uidPart(key: string): string {\n return key == 'page' ? 'p' : key[0] + key.slice(key.indexOf('_') + 1)\n}\n\n/**\n * PLAN-4.6 R4 (04 §3.11): the core instantiates a component from the vnode's `data.c`, a\n * component function, and reads its statics there (no options object). A shell component or a\n * Page is wrapped once (a per-app / per-navigation function) with the statics the options\n * gave the 5.x core: isolatedState, and the initial state.\n */\nconst shellFns = new WeakMap<any, any>()\nfunction shellFn(comp: any, initialState: any, cache = true): any {\n let f = cache ? shellFns.get(comp) : undefined\n if (!f) {\n f = Object.assign((p: any) => comp(p), comp, { isolatedState: true, initialState })\n try { Object.defineProperty(f, 'name', { value: comp.name, configurable: true }) } catch (_) {}\n if (cache) shellFns.set(comp, f)\n }\n return f\n}\nlet pageFn: any, pageFnNav = -1\n\n/**\n * Build a component vnode that matches what the JSX pragma produces.\n */\nfunction componentVNode(comp: any, key: string, stateField: any, children: any[], compInitialState?: any): any {\n const name = comp.componentName || comp.name || 'FUNCTION_COMPONENT'\n return {\n sel: name,\n data: {\n c: shellFn(comp, owned(comp.initialState)),\n props: {\n state: stateField,\n // G-207: the uid() base, as onRenderHtml gives this shell component (see uidPart)\n id: uidPart(key),\n },\n },\n children,\n text: undefined,\n elm: undefined,\n key: '__vike_' + key + '__',\n }\n}\n\n/**\n * Build a vnode for the current Page as a child of the Layout.\n * Reads from mutable `currentPage` / `currentPageName` so the wrapper\n * view picks up the new Page component on navigation without being recreated.\n */\nfunction pageChildVNode(pageState: any, stateField: any = 'page'): any {\n // a new function per navigation, so the Page is made again even when both pages are the same\n // function (e.g. 'Page'); the nav counter in `sel` keeps the vnodes apart\n const sel = currentPageName + '__nav' + pageNavCounter\n if (pageFnNav !== pageNavCounter) { pageFnNav = pageNavCounter; pageFn = shellFn(currentPage, undefined, false) }\n return {\n sel,\n data: {\n c: pageFn,\n props: {\n state: stateField,\n // G-207: the Page's uid() base, as onRenderHtml gives it (the same across navigations)\n id: uidPart('page'),\n },\n },\n children: [],\n text: undefined,\n elm: undefined,\n key: '__vike_page__',\n }\n}\n\n/**\n * Create a synthetic wrapper component that nests Page inside Layout(s)\n * inside Wrapper(s).\n *\n * Nesting order: Wrapper(s) > Layout(s) > Page\n *\n * The wrapper's view reads `currentPage` from the mutable closure, so\n * on client-side navigation only the Page sub-component changes while\n * the Layout and Wrapper stay mounted with their state preserved.\n */\nfunction createLayoutWrapper(wrappers: any[], layouts: any[], Page: any): any {\n currentPage = Page\n currentPageName = Page.componentName || Page.name || 'VikePageComponent'\n\n // Combined shell = wrappers (outermost) + layouts (innermost around Page).\n // D50: the root state holds every slice as a sibling, as in 5.4.0 but with the Page at the\n // root too: { wrapper_0, ..., layout_0, ..., page }. A component's `state` prop selects from\n // its parent component's state, and the shell components are nested in each other, so each\n // one (and the Page) gets a { get, set } lens onto its own ROOT slice: an outer component's\n // reducer replacing its state can't wipe the inner slices (R2-2), and no view sees another\n // component's slice.\n const keys = shellKeys(wrappers, layouts)\n const shell = [...wrappers, ...layouts].map((comp: any, i: number) => ({ comp, key: keys[i] }))\n\n // The latest root state. Only the outermost lens gets the root itself; the nested lenses get\n // their parent shell component's state. In both directions the outermost lens runs first and\n // synchronously (state: root -> outer get -> inner get; a reducer: outer get, inner get, inner\n // set, outer set), so the nested lenses read and write through `root`.\n let root: any = {}\n const rootLens = (key: string, outermost: boolean, fresh: boolean) => ({\n get: (state: any) => {\n if (outermost) root = state || {}\n const slice = root[key]\n // a shell slice is a new object on every root state, so the components nested in the\n // shell component see every change (their state stream drops repeated objects)\n return fresh && slice && typeof slice === 'object' && !Array.isArray(slice) ? { ...slice } : slice\n },\n set: (state: any, slice: any) => {\n root = { ...root, [key]: slice }\n // a nested lens returns a changed parent state, so the parent's lens writes `root` back\n return outermost ? root : { ...state }\n },\n })\n const lenses = keys.map((key, i) => rootLens(key, i === 0, true))\n const pageLens = rootLens('page', false, false)\n\n function LayoutWrapperView({ state }: any) {\n if (shell.length === 0) {\n // No wrappers or layouts — render Page directly\n return pageChildVNode(state.page)\n }\n\n const lastIdx = shell.length - 1\n let inner: any = componentVNode(\n shell[lastIdx].comp,\n shell[lastIdx].key,\n lenses[lastIdx],\n [pageChildVNode(state.page, pageLens)],\n state[shell[lastIdx].key]\n )\n\n // Wrap with outer shell components\n for (let i = lastIdx - 1; i >= 0; i--) {\n inner = componentVNode(shell[i].comp, shell[i].key, lenses[i], [inner], state[shell[i].key])\n }\n\n // Wrap in a plain div so the view returns a regular DOM vnode.\n // Sub-component vnodes at the root position are not processed correctly\n // by the rendering pipeline — they must be children of a DOM element.\n return {\n sel: 'div',\n data: { attrs: { id: 'vike-shell' } },\n children: [inner],\n text: undefined,\n elm: undefined,\n key: '__vike_shell__',\n }\n }\n\n LayoutWrapperView.componentName = 'VikeLayoutWrapper'\n // run() names the root by `name` first\n try { Object.defineProperty(LayoutWrapperView, 'name', { value: 'VikeLayoutWrapper', configurable: true }) } catch (_) {}\n\n // The wrapper's initial state: a sibling slice for each shell component and the Page.\n // Must match onRenderHtml's serialized state.\n const initialState: any = {}\n shell.forEach(({ comp, key }: any) => { initialState[key] = { ...(comp.initialState || {}) } })\n initialState.page = Page.initialState || {}\n // G-275: owned (built from the hydrated state and pageContext.data: never frozen in dev)\n LayoutWrapperView.initialState = root = owned(initialState)\n\n // Context uses mutable references so navigation updates are picked up.\n // Wrapper and Layout contexts are merged once; page-level context\n // (pageData, routeParams, urlPathname) reads from mutable variables\n // updated on each navigation.\n const shellContext: any = {}\n shell.forEach(({ comp }: any) => {\n if (comp.context) {\n Object.assign(shellContext, comp.context)\n }\n })\n\n LayoutWrapperView.context = {\n ...shellContext,\n ...(Page.context || {}),\n pageData: () => currentPageData,\n routeParams: () => currentRouteParams,\n urlPathname: () => currentUrlPathname,\n }\n\n return LayoutWrapperView\n}\n\n/** State keys of the shell components, outermost first: wrapper_0, ..., layout_0, ... */\nfunction shellKeys(wrappers: any[], layouts: any[]): string[] {\n return [\n ...wrappers.map((_: any, i: number) => 'wrapper_' + i),\n ...layouts.map((_: any, i: number) => 'layout_' + i),\n ]\n}\n\n/**\n * Normalize a cumulative config value into an array of functions.\n */\nfunction toComponentArray(val: any): any[] {\n if (!val) return []\n return (Array.isArray(val) ? val : [val]).filter((c: any) => typeof c === 'function')\n}\n\nexport function onRenderClient(pageContext: PageContext) {\n const { Page, config } = pageContext\n const data = pageContext.data || {}\n\n const wrappers = toComponentArray(config.Wrapper)\n const layouts = toComponentArray(config.Layout)\n const hasShell = wrappers.length > 0 || layouts.length > 0\n\n // The shell is wrappers (outermost) + layouts; their state slices and the Page's are\n // siblings at the root (D50).\n const shell = shellKeys(wrappers, layouts)\n\n // PLAN-3 5-5 (H-7): seed the caches of the fetch drivers (makeFetchDriver({ cache: queryCache() })\n // exposes it as driver.cache) before the page renders, so its resources start at 'success'\n if (pageContext.queryCache) {\n for (const d of Object.values(config.drivers || {})) (d as any)?.cache?.hydrate?.(pageContext.queryCache)\n }\n\n // Update mutable context references (used by the wrapper's context functions)\n currentPageData = data\n currentRouteParams = pageContext.routeParams || {}\n // urlPathname is built in on the client with Client Routing (G-046: it is\n // not in passToClient); fall back to the location with Server Routing.\n currentUrlPathname = pageContext.urlPathname\n || (typeof window !== 'undefined' && window.location ? window.location.pathname : '')\n\n // --- Shell path: hot-swap Page, keep Layout/Wrapper alive ---\n if (hasShell) {\n if (currentApp) {\n // Client-side navigation: swap the Page without disposing the shell.\n // PLAN-3 5-4b: a router given Vike's navigate() (makeRouter({ routes, navigate })) re-reads\n // the route on this event; sent before the swap, so the new Page declares after it\n if (typeof window !== 'undefined') window.dispatchEvent?.(new Event('sygnal:navigate'))\n currentPage = Page\n currentPageName = Page.componentName || Page.name || 'VikePageComponent'\n pageNavCounter++\n\n const newPageState = { ...(Page.initialState || {}), ...data }\n // replace the page slice, keeping every shell slice (G-106, D50)\n const swapPage = (state: any) => ({ ...state, page: newPageState })\n // (PLAN-4.6 core: through the runtime API, 04 §3.11)\n const rt = (currentApp as any).__runtime\n rt?.setState('root', swapPage)\n } else {\n // First load: read hydrated state or build from initialState\n let initialState: any\n if (typeof window !== 'undefined' && window.__VIKE_SYGNAL_STATE__ !== undefined) {\n initialState = window.__VIKE_SYGNAL_STATE__\n delete window.__VIKE_SYGNAL_STATE__\n } else {\n initialState = null\n }\n\n if (initialState && initialState[shell[shell.length - 1]] !== undefined) {\n // Hydrated shell state: sibling slices (D50), or the 5.4.0 shape with the Page state\n // under the innermost shell slice (R2-9) — distribute the slices to each component\n const allShellComps = [...wrappers, ...layouts]\n let pageState = initialState.page\n shell.forEach((key: string, i: number) => {\n let slice = initialState[key]\n if (slice === undefined) return\n if (i === shell.length - 1 && slice && 'page' in slice) {\n const { page, ...rest } = slice\n if (pageState === undefined) pageState = page\n slice = rest\n }\n allShellComps[i].initialState = owned(slice)\n })\n Page.initialState = owned(pageState || { ...(Page.initialState || {}), ...data })\n } else {\n // SPA mode or client-side first navigation\n Page.initialState = owned({ ...(Page.initialState || {}), ...data })\n }\n\n // Inject page-level context into Page (for SSR renderToString compat)\n Page.context = {\n ...Page.context,\n pageData: () => currentPageData,\n routeParams: () => currentRouteParams,\n urlPathname: () => currentUrlPathname,\n }\n\n const Component = createLayoutWrapper(wrappers, layouts, Page)\n\n try {\n // 3-B2: `__vike` marks the shell's components (Page, Layouts, Wrappers: sub-components of\n // the shell root) for the dev entry, whose SYG224 then says persist() isn't supported there\n currentApp = run(Component, { ...config.drivers, __vike: () => 1 }, { mountPoint: '#page-view', onError: config.sygnalOnError }) as any\n } catch (err: any) {\n console.error('[sygnal/vike] Client render error:', err)\n const container = document.getElementById('page-view')\n if (container) {\n container.innerHTML = `<div data-sygnal-error style=\"padding:2rem;color:#e74c3c;font-family:monospace\">\n <h2>Render Error</h2>\n <pre>${String(err.message || err)}</pre>\n </div>`\n }\n }\n }\n\n // --- No shell path: dispose and recreate ---\n } else {\n if (currentApp) {\n currentApp.dispose()\n currentApp = null\n }\n\n let initialState: any\n // 3-B2: the server's state is here when the page hydrates its HTML\n let serverState = false\n if (typeof window !== 'undefined' && window.__VIKE_SYGNAL_STATE__ !== undefined) {\n initialState = window.__VIKE_SYGNAL_STATE__\n delete window.__VIKE_SYGNAL_STATE__\n serverState = true\n } else {\n initialState = { ...(Page.initialState || {}), ...data }\n }\n\n Page.initialState = owned(initialState)\n Page.context = {\n ...Page.context,\n pageData: () => currentPageData,\n routeParams: () => currentRouteParams,\n urlPathname: () => currentUrlPathname,\n }\n\n try {\n // 3-B2: the Page is the root, so its persist() restores after the first render when this\n // is a hydration (`__hydrate`), keeping that render equal to the server's HTML. A client-side\n // navigation isn't one, though the previous page's markup is still in #page-view\n const hydrating = pageContext.isHydration ?? serverState\n currentApp = run(Page, { ...config.drivers, __hydrate: () => hydrating }, { mountPoint: '#page-view', onError: config.sygnalOnError }) as any\n } catch (err: any) {\n console.error('[sygnal/vike] Client render error:', err)\n const container = document.getElementById('page-view')\n if (container) {\n container.innerHTML = `<div data-sygnal-error style=\"padding:2rem;color:#e74c3c;font-family:monospace\">\n <h2>Render Error</h2>\n <pre>${String(err.message || err)}</pre>\n </div>`\n }\n }\n }\n\n // Update document title on client navigation\n if (config.title) {\n document.title = config.title\n }\n}\n"],"names":[],"mappings":"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"}
|