@jfdevelops/react-layout 1.0.0 → 1.1.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/create-config/create-defined-resource-layout.cjs +14 -7
- package/dist/create-config/create-defined-resource-layout.cjs.map +1 -1
- package/dist/create-config/create-defined-resource-layout.d.cts +30 -17
- package/dist/create-config/create-defined-resource-layout.d.cts.map +1 -1
- package/dist/create-config/create-defined-resource-layout.d.mts +30 -17
- package/dist/create-config/create-defined-resource-layout.d.mts.map +1 -1
- package/dist/create-config/create-defined-resource-layout.mjs +14 -7
- package/dist/create-config/create-defined-resource-layout.mjs.map +1 -1
- package/dist/create-config/define-layout.cjs +61 -23
- package/dist/create-config/define-layout.cjs.map +1 -1
- package/dist/create-config/define-layout.d.cts +88 -71
- package/dist/create-config/define-layout.d.cts.map +1 -1
- package/dist/create-config/define-layout.d.mts +88 -71
- package/dist/create-config/define-layout.d.mts.map +1 -1
- package/dist/create-config/define-layout.mjs +61 -23
- package/dist/create-config/define-layout.mjs.map +1 -1
- package/dist/create-config/for-resource.cjs.map +1 -1
- package/dist/create-config/for-resource.d.cts +24 -16
- package/dist/create-config/for-resource.d.cts.map +1 -1
- package/dist/create-config/for-resource.d.mts +24 -16
- package/dist/create-config/for-resource.d.mts.map +1 -1
- package/dist/create-config/for-resource.mjs.map +1 -1
- package/dist/create-config/for-resources/create-for-resources.cjs +1 -0
- package/dist/create-config/for-resources/create-for-resources.cjs.map +1 -1
- package/dist/create-config/for-resources/create-for-resources.mjs +1 -0
- package/dist/create-config/for-resources/create-for-resources.mjs.map +1 -1
- package/dist/create-config/for-resources/scoped-layout.d.cts +14 -12
- package/dist/create-config/for-resources/scoped-layout.d.cts.map +1 -1
- package/dist/create-config/for-resources/scoped-layout.d.mts +14 -12
- package/dist/create-config/for-resources/scoped-layout.d.mts.map +1 -1
- package/dist/create-config/index.d.cts +2 -1
- package/dist/create-config/index.d.mts +2 -1
- package/dist/create-config/lazy-resource-layout.cjs +1 -1
- package/dist/create-config/lazy-resource-layout.cjs.map +1 -1
- package/dist/create-config/lazy-resource-layout.d.cts +4 -1
- package/dist/create-config/lazy-resource-layout.d.cts.map +1 -1
- package/dist/create-config/lazy-resource-layout.d.mts +4 -1
- package/dist/create-config/lazy-resource-layout.d.mts.map +1 -1
- package/dist/create-config/lazy-resource-layout.mjs +1 -1
- package/dist/create-config/lazy-resource-layout.mjs.map +1 -1
- package/dist/create-config/render-state.cjs +17 -3
- package/dist/create-config/render-state.cjs.map +1 -1
- package/dist/create-config/render-state.d.cts +66 -18
- package/dist/create-config/render-state.d.cts.map +1 -1
- package/dist/create-config/render-state.d.mts +66 -18
- package/dist/create-config/render-state.d.mts.map +1 -1
- package/dist/create-config/render-state.mjs +18 -3
- package/dist/create-config/render-state.mjs.map +1 -1
- package/dist/create-config/state-composable.cjs +44 -0
- package/dist/create-config/state-composable.cjs.map +1 -0
- package/dist/create-config/state-composable.d.cts +27 -0
- package/dist/create-config/state-composable.d.cts.map +1 -0
- package/dist/create-config/state-composable.d.mts +27 -0
- package/dist/create-config/state-composable.d.mts.map +1 -0
- package/dist/create-config/state-composable.mjs +42 -0
- package/dist/create-config/state-composable.mjs.map +1 -0
- package/dist/index.d.cts +3 -2
- package/dist/index.d.mts +3 -2
- package/package.json +1 -1
|
@@ -11,6 +11,7 @@ import { createResourceLinksFn } from "./create-resource-links.mjs";
|
|
|
11
11
|
import { createForResource } from "./for-resource.mjs";
|
|
12
12
|
import { createForResources } from "./for-resources/create-for-resources.mjs";
|
|
13
13
|
import { ResourceLayoutShellPublisherContext, useResourceLayoutShellPublisher } from "./shell-context.mjs";
|
|
14
|
+
import { StateComposableContext, createStateReferences } from "./state-composable.mjs";
|
|
14
15
|
import { deferredRenderStateSymbol, definedResourceLayoutComponentSymbol, findDefinedRenderState, isDeferredRenderState, isLazyRenderState, lazyRenderStateSymbol } from "./render-state.mjs";
|
|
15
16
|
import { LayoutComposablePresetProvider, collectComposablePresetEntries, makeComposable, resolveLayoutComposables } from "@jfdevelops/react-layout-composables";
|
|
16
17
|
import { Component, Suspense, createContext, lazy, useCallback, useContext, useLayoutEffect, useMemo, useReducer, useRef, useState } from "react";
|
|
@@ -137,8 +138,8 @@ function assertUnreservedResourceSlugs(resources, owner) {
|
|
|
137
138
|
if (typeof resource !== "string") assertUnreservedResourceSlugs(resource.subResources, slug);
|
|
138
139
|
}
|
|
139
140
|
}
|
|
140
|
-
function defineResourceLayoutImpl(options) {
|
|
141
|
-
const { options: inProps = {}, resources, layout } = options;
|
|
141
|
+
function defineResourceLayoutImpl(options, inheritedStateScope) {
|
|
142
|
+
const { options: inProps = {}, resources, layout, namespace: defaultNamespace = false } = options;
|
|
142
143
|
const shellId = options.shellId;
|
|
143
144
|
assertUnreservedResourceSlugs(resources);
|
|
144
145
|
const resourcesAccessor = createLayoutResourcesAccessor(resources);
|
|
@@ -157,7 +158,7 @@ function defineResourceLayoutImpl(options) {
|
|
|
157
158
|
const normalizedResources = normalizeResources(resources);
|
|
158
159
|
const resourcesEnum = createPrimitivePropBuilder("string").enum(toResourceEnum(normalizedResources));
|
|
159
160
|
const definedResourceLayout = ((layoutOptions) => {
|
|
160
|
-
const { name, props: instancePropDefinitions, ...layoutOptionProps } = layoutOptions;
|
|
161
|
+
const { name, props: instancePropDefinitions, namespace = defaultNamespace, ...layoutOptionProps } = layoutOptions;
|
|
161
162
|
const createComposableLayout = makeComposable();
|
|
162
163
|
const nameProp = createProp.string().literal(name);
|
|
163
164
|
const { resolvedInProps, splitInProps } = splitLayoutInProps({
|
|
@@ -170,6 +171,19 @@ function defineResourceLayoutImpl(options) {
|
|
|
170
171
|
});
|
|
171
172
|
const { composables, props: legacyLayoutProps } = layout;
|
|
172
173
|
const renderStates = typeof layout.render === "function" ? { default: layout.render } : layout.render;
|
|
174
|
+
const referenceComponents = /* @__PURE__ */ new Map();
|
|
175
|
+
const stateScope = inheritedStateScope ?? {
|
|
176
|
+
states: createStateReferences(renderStates),
|
|
177
|
+
resolve(source) {
|
|
178
|
+
for (const [stateName, input] of Object.entries(renderStates)) if (input === source.input) return stateName === "default" ? Component : stateComponents[stateName];
|
|
179
|
+
let reference = referenceComponents.get(source.input);
|
|
180
|
+
if (!reference) {
|
|
181
|
+
reference = createStateComponent(source.name, source.input, false);
|
|
182
|
+
referenceComponents.set(source.input, reference);
|
|
183
|
+
}
|
|
184
|
+
return reference;
|
|
185
|
+
}
|
|
186
|
+
};
|
|
173
187
|
const defaultRenderInput = renderStates.default;
|
|
174
188
|
const createdDefaultState = isDeferredRenderState(defaultRenderInput) || isLazyRenderState(defaultRenderInput);
|
|
175
189
|
const defaultRenderDefinition = getSynchronousRenderStateDefinition(defaultRenderInput, legacyLayoutProps) ?? { render: () => null };
|
|
@@ -190,10 +204,10 @@ function defineResourceLayoutImpl(options) {
|
|
|
190
204
|
layoutName: name,
|
|
191
205
|
resource: layoutContext.resource
|
|
192
206
|
};
|
|
193
|
-
const defaultComposables = defaultState.composables ? (create) => ({
|
|
194
|
-
...composables?.(create) ?? {},
|
|
195
|
-
...defaultState.composables?.(create)
|
|
196
|
-
}) :
|
|
207
|
+
const defaultComposables = composables || defaultState.composables ? (create) => ({
|
|
208
|
+
...composables?.(create, stateScope.states) ?? {},
|
|
209
|
+
...defaultState.composables?.(create, stateScope.states)
|
|
210
|
+
}) : void 0;
|
|
197
211
|
const resolvedComposables = defaultComposables ? resolveLayoutComposables(defaultComposables, layoutContext) : void 0;
|
|
198
212
|
const mergedResolvedInProps = { ...resolvedInProps };
|
|
199
213
|
for (const { props: presetPropDefinitions } of collectComposablePresetEntries(resolvedComposables)) Object.assign(mergedResolvedInProps, presetPropDefinitions);
|
|
@@ -254,7 +268,13 @@ function defineResourceLayoutImpl(options) {
|
|
|
254
268
|
resource: layoutContext.resource,
|
|
255
269
|
children: /* @__PURE__ */ jsx(LayoutComposablePresetProvider, {
|
|
256
270
|
value: composablePresetProps,
|
|
257
|
-
children: /* @__PURE__ */ jsx(
|
|
271
|
+
children: /* @__PURE__ */ jsx(StateComposableContext.Provider, {
|
|
272
|
+
value: {
|
|
273
|
+
scope: stateScope,
|
|
274
|
+
props: layoutRenderProps
|
|
275
|
+
},
|
|
276
|
+
children: /* @__PURE__ */ jsx(RenderDefaultState, { renderProps: layoutRenderProps })
|
|
277
|
+
})
|
|
258
278
|
})
|
|
259
279
|
});
|
|
260
280
|
const ErrorComponent = stateComponents.Error;
|
|
@@ -273,7 +293,7 @@ function defineResourceLayoutImpl(options) {
|
|
|
273
293
|
if (!compositionOptions.components) return {};
|
|
274
294
|
return { makeComposable: createComposableLayout(compositionOptions) };
|
|
275
295
|
}
|
|
276
|
-
function createStateComponent(stateName, input) {
|
|
296
|
+
function createStateComponent(stateName, input, validateStateName = true) {
|
|
277
297
|
if (isLazyRenderState(input)) {
|
|
278
298
|
const loadState = input[lazyRenderStateSymbol];
|
|
279
299
|
function createLazyState() {
|
|
@@ -281,8 +301,8 @@ function defineResourceLayoutImpl(options) {
|
|
|
281
301
|
const stateDefinition = findDefinedRenderState(await loadState().catch((error) => {
|
|
282
302
|
throw new ResourceModuleLoadError(String(layoutContext.resource), error);
|
|
283
303
|
}));
|
|
284
|
-
if (stateDefinition.state !== void 0 && stateDefinition.state !== stateName) throw new LayoutConfigurationError(`Lazy render state "${stateDefinition.state}" cannot be used as "${stateName}"`);
|
|
285
|
-
return { default: createLoadedStateComponent(stateName, stateDefinition) };
|
|
304
|
+
if (validateStateName && stateDefinition.state !== void 0 && stateDefinition.state !== stateName) throw new LayoutConfigurationError(`Lazy render state "${stateDefinition.state}" cannot be used as "${stateName}"`);
|
|
305
|
+
return { default: createLoadedStateComponent(validateStateName ? stateName : stateDefinition.state ?? stateName, stateDefinition) };
|
|
286
306
|
});
|
|
287
307
|
}
|
|
288
308
|
function LazyStateComponent(props) {
|
|
@@ -339,10 +359,10 @@ function defineResourceLayoutImpl(options) {
|
|
|
339
359
|
return DeferredStateComponent;
|
|
340
360
|
}
|
|
341
361
|
function createLoadedStateComponent(stateName, definition) {
|
|
342
|
-
const stateComposables = definition.composables ? (create) => ({
|
|
343
|
-
...composables?.(create) ?? {},
|
|
344
|
-
...definition.composables?.(create)
|
|
345
|
-
}) :
|
|
362
|
+
const stateComposables = composables || definition.composables ? (create) => ({
|
|
363
|
+
...composables?.(create, stateScope.states) ?? {},
|
|
364
|
+
...definition.composables?.(create, stateScope.states)
|
|
365
|
+
}) : void 0;
|
|
346
366
|
const stateRender = stateName === "Error" ? (props, context) => /* @__PURE__ */ jsx(RenderStateRetryContext.Consumer, { children: (retry) => definition.render(props, {
|
|
347
367
|
...context,
|
|
348
368
|
retry
|
|
@@ -355,7 +375,10 @@ function defineResourceLayoutImpl(options) {
|
|
|
355
375
|
props: definition.props,
|
|
356
376
|
render: stateRender
|
|
357
377
|
}
|
|
358
|
-
}).createResourceLayout(
|
|
378
|
+
}, stateScope).createResourceLayout({
|
|
379
|
+
...layoutOptions,
|
|
380
|
+
namespace: false
|
|
381
|
+
});
|
|
359
382
|
StateComponent.displayName = `${name}.${stateName}`;
|
|
360
383
|
return StateComponent;
|
|
361
384
|
}
|
|
@@ -364,6 +387,7 @@ function defineResourceLayoutImpl(options) {
|
|
|
364
387
|
if (stateName === "default") continue;
|
|
365
388
|
if ([
|
|
366
389
|
"__proto__",
|
|
390
|
+
"asComposable",
|
|
367
391
|
"apply",
|
|
368
392
|
"arguments",
|
|
369
393
|
"bind",
|
|
@@ -384,7 +408,7 @@ function defineResourceLayoutImpl(options) {
|
|
|
384
408
|
const definition = mergedResolvedInProps[key];
|
|
385
409
|
return [[key, isIncludedPropRequired(includeLayoutProps?.[key]) ? definition : definition.optional?.() ?? definition]];
|
|
386
410
|
}));
|
|
387
|
-
|
|
411
|
+
const rootComponent = attachComponentPropDefinitions(Object.assign(Component, {
|
|
388
412
|
displayName: name,
|
|
389
413
|
props: void 0,
|
|
390
414
|
resource: void 0,
|
|
@@ -398,10 +422,21 @@ function defineResourceLayoutImpl(options) {
|
|
|
398
422
|
...customLayoutProps,
|
|
399
423
|
...includedComponentDefinitions
|
|
400
424
|
});
|
|
425
|
+
if (namespace) {
|
|
426
|
+
if (Object.prototype.hasOwnProperty.call(stateComponents, "Root")) throw new LayoutConfigurationError("Render state name \"Root\" is reserved when namespace is true");
|
|
427
|
+
return {
|
|
428
|
+
Root: rootComponent,
|
|
429
|
+
...stateComponents
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
return rootComponent;
|
|
401
433
|
});
|
|
402
434
|
const createTopLevelMakeComposable = () => {
|
|
403
435
|
return (options) => {
|
|
404
|
-
const layout = definedResourceLayout(
|
|
436
|
+
const layout = definedResourceLayout({
|
|
437
|
+
...options,
|
|
438
|
+
namespace: false
|
|
439
|
+
});
|
|
405
440
|
if (!("makeComposable" in layout) || typeof layout.makeComposable !== "function") throw new LayoutConfigurationError("makeComposable requires composables to be defined in the layout");
|
|
406
441
|
return layout.makeComposable();
|
|
407
442
|
};
|
|
@@ -412,11 +447,13 @@ function defineResourceLayoutImpl(options) {
|
|
|
412
447
|
resource: resourcesEnum,
|
|
413
448
|
name: createProp.string().literal(componentName)
|
|
414
449
|
}) : inProps);
|
|
415
|
-
const
|
|
416
|
-
const
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
450
|
+
const renderStates = typeof layout.render === "function" ? { default: layout.render } : layout.render;
|
|
451
|
+
const defaultState = getSynchronousRenderStateDefinition(renderStates.default, layout.props);
|
|
452
|
+
const stateReferences = createStateReferences(renderStates);
|
|
453
|
+
const defaultComposables = layout.composables || defaultState?.composables ? (create) => ({
|
|
454
|
+
...layout.composables?.(create, stateReferences) ?? {},
|
|
455
|
+
...defaultState?.composables?.(create, stateReferences)
|
|
456
|
+
}) : void 0;
|
|
420
457
|
const resolvedComposables = defaultComposables ? resolveLayoutComposables(defaultComposables, {
|
|
421
458
|
resource,
|
|
422
459
|
name: componentName,
|
|
@@ -619,6 +656,7 @@ function defineResourceLayoutWithLayoutImpl(options) {
|
|
|
619
656
|
resources,
|
|
620
657
|
options: inProps,
|
|
621
658
|
layout: resolvedLayout,
|
|
659
|
+
namespace: options.namespace,
|
|
622
660
|
shellId
|
|
623
661
|
});
|
|
624
662
|
const Shell = createResourceLayoutShellComponent(resources, inProps ?? {}, shell, shellId);
|