@jay-framework/stack-client-runtime 0.13.0 → 0.14.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/dist/index.cjs +124 -18
- package/dist/index.d.ts +26 -4
- package/dist/index.js +124 -18
- package/package.json +8 -8
package/dist/index.cjs
CHANGED
|
@@ -80,24 +80,56 @@ function mergeArraysByTrackBy$1(baseArray, overlayArray, trackByField, trackByMa
|
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
const HEADLESS_INSTANCES = runtime.createJayContext();
|
|
83
|
-
function makeSignals$
|
|
83
|
+
function makeSignals$2(obj) {
|
|
84
84
|
return Object.keys(obj).reduce((signals, key) => {
|
|
85
85
|
signals[key] = component.createSignal(obj[key]);
|
|
86
86
|
return signals;
|
|
87
87
|
}, {});
|
|
88
88
|
}
|
|
89
|
-
function makeHeadlessInstanceComponent(preRender,
|
|
90
|
-
const
|
|
89
|
+
function makeHeadlessInstanceComponent(preRender, componentDef, coordinateKey) {
|
|
90
|
+
const interactiveConstructor = componentDef.comp;
|
|
91
|
+
const resolvedContexts = componentDef.contexts ?? [];
|
|
92
|
+
const clientDefaults = componentDef.clientDefaults;
|
|
93
|
+
const wrappedConstructor = (signalProps, refs, ...pluginResolvedContexts) => {
|
|
91
94
|
const instanceData = runtime.useContext(HEADLESS_INSTANCES);
|
|
92
95
|
const resolvedKey = typeof coordinateKey === "function" ? coordinateKey(runtime.currentConstructionContext()?.dataIds ?? []) : coordinateKey;
|
|
93
|
-
const
|
|
94
|
-
const
|
|
95
|
-
const
|
|
96
|
-
|
|
96
|
+
const suffixKey = resolvedKey.includes("/") && resolvedKey.includes(":") ? resolvedKey.split("/").find((s) => s.includes(":")) ?? resolvedKey : resolvedKey;
|
|
97
|
+
const fastVS = instanceData?.viewStates?.[resolvedKey] ?? instanceData?.viewStates?.[suffixKey];
|
|
98
|
+
const cf = instanceData?.carryForwards?.[resolvedKey] ?? instanceData?.carryForwards?.[suffixKey];
|
|
99
|
+
let resolvedFastVS;
|
|
100
|
+
let resolvedCf;
|
|
101
|
+
if (fastVS) {
|
|
102
|
+
resolvedFastVS = fastVS;
|
|
103
|
+
resolvedCf = cf || {};
|
|
104
|
+
} else if (clientDefaults) {
|
|
105
|
+
const rawProps = signalProps.props();
|
|
106
|
+
const defaults = clientDefaults(rawProps);
|
|
107
|
+
resolvedFastVS = defaults.viewState;
|
|
108
|
+
resolvedCf = defaults.carryForward ?? {};
|
|
109
|
+
} else {
|
|
110
|
+
console.warn(
|
|
111
|
+
`[Jay] Headless instance "${resolvedKey}" has no server data and no clientDefaults. Add .withClientDefaults() to the component definition to provide fallback values.`
|
|
112
|
+
);
|
|
113
|
+
resolvedFastVS = {};
|
|
114
|
+
resolvedCf = {};
|
|
115
|
+
}
|
|
116
|
+
const signalVS = makeSignals$2(resolvedFastVS);
|
|
117
|
+
const compCore = interactiveConstructor(
|
|
118
|
+
signalProps,
|
|
119
|
+
refs,
|
|
120
|
+
signalVS,
|
|
121
|
+
resolvedCf,
|
|
122
|
+
...pluginResolvedContexts
|
|
123
|
+
);
|
|
124
|
+
const originalRender = compCore.render;
|
|
125
|
+
compCore.render = () => {
|
|
126
|
+
return { ...resolvedFastVS, ...originalRender() };
|
|
127
|
+
};
|
|
128
|
+
return compCore;
|
|
97
129
|
};
|
|
98
|
-
return component.makeJayComponent(preRender, wrappedConstructor, ...
|
|
130
|
+
return component.makeJayComponent(preRender, wrappedConstructor, ...resolvedContexts);
|
|
99
131
|
}
|
|
100
|
-
function makeSignals(obj) {
|
|
132
|
+
function makeSignals$1(obj) {
|
|
101
133
|
return Object.keys(obj).reduce((signals, key) => {
|
|
102
134
|
signals[key] = component.createSignal(obj[key]);
|
|
103
135
|
return signals;
|
|
@@ -113,21 +145,93 @@ function makeCompositeJayComponent(preRender, defaultViewState, fastCarryForward
|
|
|
113
145
|
if (headlessInstanceCarryForwards)
|
|
114
146
|
delete fastCarryForward.__headlessInstances;
|
|
115
147
|
const comp = (props, refs, ...contexts) => {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
148
|
+
const componentContext = runtime.useContext(component.COMPONENT_CONTEXT);
|
|
149
|
+
const instancesData = {
|
|
150
|
+
viewStates: headlessInstanceViewStates || {},
|
|
151
|
+
carryForwards: headlessInstanceCarryForwards || {}
|
|
152
|
+
};
|
|
153
|
+
componentContext.provideContexts.push([HEADLESS_INSTANCES, instancesData]);
|
|
154
|
+
const instances = interactiveParts.map(
|
|
155
|
+
(part) => {
|
|
156
|
+
const partRefs = part.key ? refs[part.key] : refs;
|
|
157
|
+
let partContexts;
|
|
158
|
+
if (hasFastRendering) {
|
|
159
|
+
const partViewState = part.key ? defaultViewState?.[part.key] : defaultViewState;
|
|
160
|
+
const partFastViewState = partViewState ? makeSignals$1(partViewState) : makeSignals$1({});
|
|
161
|
+
const partCarryForward = part.key ? fastCarryForward?.[part.key] : fastCarryForward;
|
|
162
|
+
partContexts = [
|
|
163
|
+
partFastViewState,
|
|
164
|
+
partCarryForward,
|
|
165
|
+
...contexts.splice(0, part.contextMarkers.length)
|
|
166
|
+
];
|
|
167
|
+
} else {
|
|
168
|
+
partContexts = [...contexts.splice(0, part.contextMarkers.length)];
|
|
169
|
+
}
|
|
170
|
+
return [part.key, part.comp(props, partRefs, ...partContexts)];
|
|
171
|
+
}
|
|
172
|
+
);
|
|
173
|
+
return {
|
|
174
|
+
render: () => {
|
|
175
|
+
let viewState = defaultViewState;
|
|
176
|
+
instances.forEach(([key, instance]) => {
|
|
177
|
+
const rendered = component.materializeViewState(instance.render());
|
|
178
|
+
if (key) {
|
|
179
|
+
viewState[key] = deepMergeViewStates$1(
|
|
180
|
+
defaultViewState[key],
|
|
181
|
+
rendered,
|
|
182
|
+
trackByMap,
|
|
183
|
+
key
|
|
184
|
+
);
|
|
185
|
+
} else {
|
|
186
|
+
viewState = deepMergeViewStates$1(
|
|
187
|
+
viewState,
|
|
188
|
+
rendered,
|
|
189
|
+
trackByMap
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
return viewState;
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
};
|
|
197
|
+
const contextMarkers = interactiveParts.reduce((cm, part) => {
|
|
198
|
+
return [...cm, ...part.contextMarkers];
|
|
199
|
+
}, []);
|
|
200
|
+
return component.makeJayComponent(
|
|
201
|
+
preRender,
|
|
202
|
+
comp,
|
|
203
|
+
...contextMarkers
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
function makeSignals(obj) {
|
|
207
|
+
return Object.keys(obj).reduce((signals, key) => {
|
|
208
|
+
signals[key] = component.createSignal(obj[key]);
|
|
209
|
+
return signals;
|
|
210
|
+
}, {});
|
|
211
|
+
}
|
|
212
|
+
function hydrateCompositeJayComponent(hydratePreRender, defaultViewState, fastCarryForward, parts, trackByMap = {}, rootElement) {
|
|
213
|
+
const interactiveParts = parts.filter((part) => part.comp !== void 0);
|
|
214
|
+
const hasFastRendering = defaultViewState !== null && defaultViewState !== void 0;
|
|
215
|
+
const headlessInstanceViewStates = defaultViewState?.__headlessInstances;
|
|
216
|
+
const headlessInstanceCarryForwards = fastCarryForward?.__headlessInstances;
|
|
217
|
+
if (headlessInstanceViewStates)
|
|
218
|
+
delete defaultViewState.__headlessInstances;
|
|
219
|
+
if (headlessInstanceCarryForwards)
|
|
220
|
+
delete fastCarryForward.__headlessInstances;
|
|
221
|
+
const comp = (props, refs, ...contexts) => {
|
|
222
|
+
const componentContext = runtime.useContext(component.COMPONENT_CONTEXT);
|
|
223
|
+
const instancesData = {
|
|
224
|
+
viewStates: headlessInstanceViewStates || {},
|
|
225
|
+
carryForwards: headlessInstanceCarryForwards || {}
|
|
226
|
+
};
|
|
227
|
+
componentContext.provideContexts.push([HEADLESS_INSTANCES, instancesData]);
|
|
124
228
|
const instances = interactiveParts.map(
|
|
125
229
|
(part) => {
|
|
126
230
|
const partRefs = part.key ? refs[part.key] : refs;
|
|
127
231
|
let partContexts;
|
|
128
232
|
if (hasFastRendering) {
|
|
129
233
|
const partViewState = part.key ? defaultViewState?.[part.key] : defaultViewState;
|
|
130
|
-
const partFastViewState = partViewState ? makeSignals(partViewState) :
|
|
234
|
+
const partFastViewState = partViewState ? makeSignals(partViewState) : makeSignals({});
|
|
131
235
|
const partCarryForward = part.key ? fastCarryForward?.[part.key] : fastCarryForward;
|
|
132
236
|
partContexts = [
|
|
133
237
|
partFastViewState,
|
|
@@ -167,6 +271,7 @@ function makeCompositeJayComponent(preRender, defaultViewState, fastCarryForward
|
|
|
167
271
|
const contextMarkers = interactiveParts.reduce((cm, part) => {
|
|
168
272
|
return [...cm, ...part.contextMarkers];
|
|
169
273
|
}, []);
|
|
274
|
+
const preRender = (options) => hydratePreRender(rootElement, options);
|
|
170
275
|
return component.makeJayComponent(
|
|
171
276
|
preRender,
|
|
172
277
|
comp,
|
|
@@ -570,6 +675,7 @@ exports.AUTOMATION_CONTEXT = AUTOMATION_CONTEXT;
|
|
|
570
675
|
exports.ActionError = ActionError;
|
|
571
676
|
exports.HEADLESS_INSTANCES = HEADLESS_INSTANCES;
|
|
572
677
|
exports.createActionCaller = createActionCaller;
|
|
678
|
+
exports.hydrateCompositeJayComponent = hydrateCompositeJayComponent;
|
|
573
679
|
exports.makeCompositeJayComponent = makeCompositeJayComponent;
|
|
574
680
|
exports.makeHeadlessInstanceComponent = makeHeadlessInstanceComponent;
|
|
575
681
|
exports.setActionCallerOptions = setActionCallerOptions;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as _jay_framework_component from '@jay-framework/component';
|
|
2
|
-
import { ComponentConstructor, ContextMarkers, JayComponentCore } from '@jay-framework/component';
|
|
3
|
-
import { JayElement, PreRenderElement, ContextMarker } from '@jay-framework/runtime';
|
|
2
|
+
import { ComponentConstructor, ContextMarkers, JayComponentCore, ConcreteJayComponent } from '@jay-framework/component';
|
|
3
|
+
import { JayElement, PreRenderElement, RenderElementOptions, RenderElement, ContextMarker } from '@jay-framework/runtime';
|
|
4
4
|
import { TrackByMap } from '@jay-framework/view-state-merge';
|
|
5
5
|
export { AUTOMATION_CONTEXT, AutomationAPI, AutomationWrappedComponent, Coordinate, Interaction, PageState, wrapWithAutomation } from '@jay-framework/runtime-automation';
|
|
6
6
|
|
|
@@ -17,6 +17,15 @@ interface CompositePart {
|
|
|
17
17
|
|
|
18
18
|
declare function makeCompositeJayComponent<PropsT extends object, ViewState extends object, Refs extends object, JayElementT extends JayElement<ViewState, Refs>, CompCore extends JayComponentCore<PropsT, ViewState>>(preRender: PreRenderElement<ViewState, Refs, JayElementT>, defaultViewState: ViewState, fastCarryForward: object, parts: Array<CompositePart>, trackByMap?: TrackByMap): (props: PropsT) => _jay_framework_component.ConcreteJayComponent<PropsT, ViewState, Refs, CompCore, JayElementT>;
|
|
19
19
|
|
|
20
|
+
/**
|
|
21
|
+
* Hydrate variant of makeCompositeJayComponent.
|
|
22
|
+
*
|
|
23
|
+
* Instead of creating new DOM, this adopts the server-rendered DOM by using
|
|
24
|
+
* the hydrate target's function signature: (rootElement, options?) => [Refs, RenderElement].
|
|
25
|
+
* The rootElement is the SSR-rendered DOM already present in the page.
|
|
26
|
+
*/
|
|
27
|
+
declare function hydrateCompositeJayComponent<PropsT extends object, ViewState extends object, Refs extends object, JayElementT extends JayElement<ViewState, Refs>, CompCore extends JayComponentCore<PropsT, ViewState>>(hydratePreRender: (rootElement: Element, options?: RenderElementOptions) => [Refs, RenderElement<ViewState, Refs, JayElementT>], defaultViewState: ViewState, fastCarryForward: object, parts: Array<CompositePart>, trackByMap: TrackByMap, rootElement: Element): (props: PropsT) => _jay_framework_component.ConcreteJayComponent<PropsT, ViewState, Refs, CompCore, JayElementT>;
|
|
28
|
+
|
|
20
29
|
/**
|
|
21
30
|
* Client-side context and helpers for headless component instances.
|
|
22
31
|
*
|
|
@@ -58,7 +67,20 @@ declare const HEADLESS_INSTANCES: ContextMarker<HeadlessInstancesData>;
|
|
|
58
67
|
* (accumulated trackBy values from ancestor forEach loops) and returns the key.
|
|
59
68
|
* @param pluginContexts - Additional context markers from the plugin (if any)
|
|
60
69
|
*/
|
|
61
|
-
|
|
70
|
+
/**
|
|
71
|
+
* Component definition shape expected by makeHeadlessInstanceComponent.
|
|
72
|
+
* `clientDefaults` receives raw props (not signal-wrapped) since it's called
|
|
73
|
+
* before the component construction context is set up.
|
|
74
|
+
*/
|
|
75
|
+
interface HeadlessComponentDef {
|
|
76
|
+
comp: ComponentConstructor<any, any, any, any, any>;
|
|
77
|
+
contexts?: ContextMarkers<any>;
|
|
78
|
+
clientDefaults?: (props: any) => {
|
|
79
|
+
viewState: any;
|
|
80
|
+
carryForward?: any;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
declare function makeHeadlessInstanceComponent<PropsT extends object, ViewState extends object, Refs extends object, JayElementT extends JayElement<ViewState, Refs>, CompCore extends JayComponentCore<PropsT, ViewState>>(preRender: PreRenderElement<ViewState, Refs, JayElementT>, componentDef: HeadlessComponentDef, coordinateKey: string | ((dataIds: string[]) => string)): (props: PropsT) => ConcreteJayComponent<PropsT, ViewState, Refs, CompCore, JayElementT>;
|
|
62
84
|
|
|
63
85
|
/**
|
|
64
86
|
* Client-side action caller for Jay Stack.
|
|
@@ -125,4 +147,4 @@ declare function setActionCallerOptions(options: ActionCallerOptions): void;
|
|
|
125
147
|
*/
|
|
126
148
|
declare function createActionCaller<Input, Output>(actionName: string, method?: HttpMethod): (input: Input) => Promise<Output>;
|
|
127
149
|
|
|
128
|
-
export { type ActionCallerOptions, ActionError, type CompositePart, HEADLESS_INSTANCES, type HeadlessInstancesData, type HttpMethod, createActionCaller, makeCompositeJayComponent, makeHeadlessInstanceComponent, setActionCallerOptions };
|
|
150
|
+
export { type ActionCallerOptions, ActionError, type CompositePart, HEADLESS_INSTANCES, type HeadlessComponentDef, type HeadlessInstancesData, type HttpMethod, createActionCaller, hydrateCompositeJayComponent, makeCompositeJayComponent, makeHeadlessInstanceComponent, setActionCallerOptions };
|
package/dist/index.js
CHANGED
|
@@ -78,24 +78,56 @@ function mergeArraysByTrackBy$1(baseArray, overlayArray, trackByField, trackByMa
|
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
80
|
const HEADLESS_INSTANCES = createJayContext();
|
|
81
|
-
function makeSignals$
|
|
81
|
+
function makeSignals$2(obj) {
|
|
82
82
|
return Object.keys(obj).reduce((signals, key) => {
|
|
83
83
|
signals[key] = createSignal(obj[key]);
|
|
84
84
|
return signals;
|
|
85
85
|
}, {});
|
|
86
86
|
}
|
|
87
|
-
function makeHeadlessInstanceComponent(preRender,
|
|
88
|
-
const
|
|
87
|
+
function makeHeadlessInstanceComponent(preRender, componentDef, coordinateKey) {
|
|
88
|
+
const interactiveConstructor = componentDef.comp;
|
|
89
|
+
const resolvedContexts = componentDef.contexts ?? [];
|
|
90
|
+
const clientDefaults = componentDef.clientDefaults;
|
|
91
|
+
const wrappedConstructor = (signalProps, refs, ...pluginResolvedContexts) => {
|
|
89
92
|
const instanceData = useContext(HEADLESS_INSTANCES);
|
|
90
93
|
const resolvedKey = typeof coordinateKey === "function" ? coordinateKey(currentConstructionContext()?.dataIds ?? []) : coordinateKey;
|
|
91
|
-
const
|
|
92
|
-
const
|
|
93
|
-
const
|
|
94
|
-
|
|
94
|
+
const suffixKey = resolvedKey.includes("/") && resolvedKey.includes(":") ? resolvedKey.split("/").find((s) => s.includes(":")) ?? resolvedKey : resolvedKey;
|
|
95
|
+
const fastVS = instanceData?.viewStates?.[resolvedKey] ?? instanceData?.viewStates?.[suffixKey];
|
|
96
|
+
const cf = instanceData?.carryForwards?.[resolvedKey] ?? instanceData?.carryForwards?.[suffixKey];
|
|
97
|
+
let resolvedFastVS;
|
|
98
|
+
let resolvedCf;
|
|
99
|
+
if (fastVS) {
|
|
100
|
+
resolvedFastVS = fastVS;
|
|
101
|
+
resolvedCf = cf || {};
|
|
102
|
+
} else if (clientDefaults) {
|
|
103
|
+
const rawProps = signalProps.props();
|
|
104
|
+
const defaults = clientDefaults(rawProps);
|
|
105
|
+
resolvedFastVS = defaults.viewState;
|
|
106
|
+
resolvedCf = defaults.carryForward ?? {};
|
|
107
|
+
} else {
|
|
108
|
+
console.warn(
|
|
109
|
+
`[Jay] Headless instance "${resolvedKey}" has no server data and no clientDefaults. Add .withClientDefaults() to the component definition to provide fallback values.`
|
|
110
|
+
);
|
|
111
|
+
resolvedFastVS = {};
|
|
112
|
+
resolvedCf = {};
|
|
113
|
+
}
|
|
114
|
+
const signalVS = makeSignals$2(resolvedFastVS);
|
|
115
|
+
const compCore = interactiveConstructor(
|
|
116
|
+
signalProps,
|
|
117
|
+
refs,
|
|
118
|
+
signalVS,
|
|
119
|
+
resolvedCf,
|
|
120
|
+
...pluginResolvedContexts
|
|
121
|
+
);
|
|
122
|
+
const originalRender = compCore.render;
|
|
123
|
+
compCore.render = () => {
|
|
124
|
+
return { ...resolvedFastVS, ...originalRender() };
|
|
125
|
+
};
|
|
126
|
+
return compCore;
|
|
95
127
|
};
|
|
96
|
-
return makeJayComponent(preRender, wrappedConstructor, ...
|
|
128
|
+
return makeJayComponent(preRender, wrappedConstructor, ...resolvedContexts);
|
|
97
129
|
}
|
|
98
|
-
function makeSignals(obj) {
|
|
130
|
+
function makeSignals$1(obj) {
|
|
99
131
|
return Object.keys(obj).reduce((signals, key) => {
|
|
100
132
|
signals[key] = createSignal(obj[key]);
|
|
101
133
|
return signals;
|
|
@@ -111,21 +143,93 @@ function makeCompositeJayComponent(preRender, defaultViewState, fastCarryForward
|
|
|
111
143
|
if (headlessInstanceCarryForwards)
|
|
112
144
|
delete fastCarryForward.__headlessInstances;
|
|
113
145
|
const comp = (props, refs, ...contexts) => {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
146
|
+
const componentContext = useContext(COMPONENT_CONTEXT);
|
|
147
|
+
const instancesData = {
|
|
148
|
+
viewStates: headlessInstanceViewStates || {},
|
|
149
|
+
carryForwards: headlessInstanceCarryForwards || {}
|
|
150
|
+
};
|
|
151
|
+
componentContext.provideContexts.push([HEADLESS_INSTANCES, instancesData]);
|
|
152
|
+
const instances = interactiveParts.map(
|
|
153
|
+
(part) => {
|
|
154
|
+
const partRefs = part.key ? refs[part.key] : refs;
|
|
155
|
+
let partContexts;
|
|
156
|
+
if (hasFastRendering) {
|
|
157
|
+
const partViewState = part.key ? defaultViewState?.[part.key] : defaultViewState;
|
|
158
|
+
const partFastViewState = partViewState ? makeSignals$1(partViewState) : makeSignals$1({});
|
|
159
|
+
const partCarryForward = part.key ? fastCarryForward?.[part.key] : fastCarryForward;
|
|
160
|
+
partContexts = [
|
|
161
|
+
partFastViewState,
|
|
162
|
+
partCarryForward,
|
|
163
|
+
...contexts.splice(0, part.contextMarkers.length)
|
|
164
|
+
];
|
|
165
|
+
} else {
|
|
166
|
+
partContexts = [...contexts.splice(0, part.contextMarkers.length)];
|
|
167
|
+
}
|
|
168
|
+
return [part.key, part.comp(props, partRefs, ...partContexts)];
|
|
169
|
+
}
|
|
170
|
+
);
|
|
171
|
+
return {
|
|
172
|
+
render: () => {
|
|
173
|
+
let viewState = defaultViewState;
|
|
174
|
+
instances.forEach(([key, instance]) => {
|
|
175
|
+
const rendered = materializeViewState(instance.render());
|
|
176
|
+
if (key) {
|
|
177
|
+
viewState[key] = deepMergeViewStates$1(
|
|
178
|
+
defaultViewState[key],
|
|
179
|
+
rendered,
|
|
180
|
+
trackByMap,
|
|
181
|
+
key
|
|
182
|
+
);
|
|
183
|
+
} else {
|
|
184
|
+
viewState = deepMergeViewStates$1(
|
|
185
|
+
viewState,
|
|
186
|
+
rendered,
|
|
187
|
+
trackByMap
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
return viewState;
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
};
|
|
195
|
+
const contextMarkers = interactiveParts.reduce((cm, part) => {
|
|
196
|
+
return [...cm, ...part.contextMarkers];
|
|
197
|
+
}, []);
|
|
198
|
+
return makeJayComponent(
|
|
199
|
+
preRender,
|
|
200
|
+
comp,
|
|
201
|
+
...contextMarkers
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
function makeSignals(obj) {
|
|
205
|
+
return Object.keys(obj).reduce((signals, key) => {
|
|
206
|
+
signals[key] = createSignal(obj[key]);
|
|
207
|
+
return signals;
|
|
208
|
+
}, {});
|
|
209
|
+
}
|
|
210
|
+
function hydrateCompositeJayComponent(hydratePreRender, defaultViewState, fastCarryForward, parts, trackByMap = {}, rootElement) {
|
|
211
|
+
const interactiveParts = parts.filter((part) => part.comp !== void 0);
|
|
212
|
+
const hasFastRendering = defaultViewState !== null && defaultViewState !== void 0;
|
|
213
|
+
const headlessInstanceViewStates = defaultViewState?.__headlessInstances;
|
|
214
|
+
const headlessInstanceCarryForwards = fastCarryForward?.__headlessInstances;
|
|
215
|
+
if (headlessInstanceViewStates)
|
|
216
|
+
delete defaultViewState.__headlessInstances;
|
|
217
|
+
if (headlessInstanceCarryForwards)
|
|
218
|
+
delete fastCarryForward.__headlessInstances;
|
|
219
|
+
const comp = (props, refs, ...contexts) => {
|
|
220
|
+
const componentContext = useContext(COMPONENT_CONTEXT);
|
|
221
|
+
const instancesData = {
|
|
222
|
+
viewStates: headlessInstanceViewStates || {},
|
|
223
|
+
carryForwards: headlessInstanceCarryForwards || {}
|
|
224
|
+
};
|
|
225
|
+
componentContext.provideContexts.push([HEADLESS_INSTANCES, instancesData]);
|
|
122
226
|
const instances = interactiveParts.map(
|
|
123
227
|
(part) => {
|
|
124
228
|
const partRefs = part.key ? refs[part.key] : refs;
|
|
125
229
|
let partContexts;
|
|
126
230
|
if (hasFastRendering) {
|
|
127
231
|
const partViewState = part.key ? defaultViewState?.[part.key] : defaultViewState;
|
|
128
|
-
const partFastViewState = partViewState ? makeSignals(partViewState) :
|
|
232
|
+
const partFastViewState = partViewState ? makeSignals(partViewState) : makeSignals({});
|
|
129
233
|
const partCarryForward = part.key ? fastCarryForward?.[part.key] : fastCarryForward;
|
|
130
234
|
partContexts = [
|
|
131
235
|
partFastViewState,
|
|
@@ -165,6 +269,7 @@ function makeCompositeJayComponent(preRender, defaultViewState, fastCarryForward
|
|
|
165
269
|
const contextMarkers = interactiveParts.reduce((cm, part) => {
|
|
166
270
|
return [...cm, ...part.contextMarkers];
|
|
167
271
|
}, []);
|
|
272
|
+
const preRender = (options) => hydratePreRender(rootElement, options);
|
|
168
273
|
return makeJayComponent(
|
|
169
274
|
preRender,
|
|
170
275
|
comp,
|
|
@@ -569,6 +674,7 @@ export {
|
|
|
569
674
|
ActionError,
|
|
570
675
|
HEADLESS_INSTANCES,
|
|
571
676
|
createActionCaller,
|
|
677
|
+
hydrateCompositeJayComponent,
|
|
572
678
|
makeCompositeJayComponent,
|
|
573
679
|
makeHeadlessInstanceComponent,
|
|
574
680
|
setActionCallerOptions,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jay-framework/stack-client-runtime",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -27,15 +27,15 @@
|
|
|
27
27
|
"test:watch": "vitest"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@jay-framework/component": "^0.
|
|
31
|
-
"@jay-framework/fullstack-component": "^0.
|
|
32
|
-
"@jay-framework/runtime": "^0.
|
|
33
|
-
"@jay-framework/runtime-automation": "^0.
|
|
34
|
-
"@jay-framework/view-state-merge": "^0.
|
|
30
|
+
"@jay-framework/component": "^0.14.0",
|
|
31
|
+
"@jay-framework/fullstack-component": "^0.14.0",
|
|
32
|
+
"@jay-framework/runtime": "^0.14.0",
|
|
33
|
+
"@jay-framework/runtime-automation": "^0.14.0",
|
|
34
|
+
"@jay-framework/view-state-merge": "^0.14.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@jay-framework/dev-environment": "^0.
|
|
38
|
-
"@jay-framework/jay-cli": "^0.
|
|
37
|
+
"@jay-framework/dev-environment": "^0.14.0",
|
|
38
|
+
"@jay-framework/jay-cli": "^0.14.0",
|
|
39
39
|
"@types/express": "^5.0.2",
|
|
40
40
|
"@types/node": "^22.15.21",
|
|
41
41
|
"nodemon": "^3.0.3",
|