@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.
Files changed (59) hide show
  1. package/dist/create-config/create-defined-resource-layout.cjs +14 -7
  2. package/dist/create-config/create-defined-resource-layout.cjs.map +1 -1
  3. package/dist/create-config/create-defined-resource-layout.d.cts +30 -17
  4. package/dist/create-config/create-defined-resource-layout.d.cts.map +1 -1
  5. package/dist/create-config/create-defined-resource-layout.d.mts +30 -17
  6. package/dist/create-config/create-defined-resource-layout.d.mts.map +1 -1
  7. package/dist/create-config/create-defined-resource-layout.mjs +14 -7
  8. package/dist/create-config/create-defined-resource-layout.mjs.map +1 -1
  9. package/dist/create-config/define-layout.cjs +61 -23
  10. package/dist/create-config/define-layout.cjs.map +1 -1
  11. package/dist/create-config/define-layout.d.cts +88 -71
  12. package/dist/create-config/define-layout.d.cts.map +1 -1
  13. package/dist/create-config/define-layout.d.mts +88 -71
  14. package/dist/create-config/define-layout.d.mts.map +1 -1
  15. package/dist/create-config/define-layout.mjs +61 -23
  16. package/dist/create-config/define-layout.mjs.map +1 -1
  17. package/dist/create-config/for-resource.cjs.map +1 -1
  18. package/dist/create-config/for-resource.d.cts +24 -16
  19. package/dist/create-config/for-resource.d.cts.map +1 -1
  20. package/dist/create-config/for-resource.d.mts +24 -16
  21. package/dist/create-config/for-resource.d.mts.map +1 -1
  22. package/dist/create-config/for-resource.mjs.map +1 -1
  23. package/dist/create-config/for-resources/create-for-resources.cjs +1 -0
  24. package/dist/create-config/for-resources/create-for-resources.cjs.map +1 -1
  25. package/dist/create-config/for-resources/create-for-resources.mjs +1 -0
  26. package/dist/create-config/for-resources/create-for-resources.mjs.map +1 -1
  27. package/dist/create-config/for-resources/scoped-layout.d.cts +14 -12
  28. package/dist/create-config/for-resources/scoped-layout.d.cts.map +1 -1
  29. package/dist/create-config/for-resources/scoped-layout.d.mts +14 -12
  30. package/dist/create-config/for-resources/scoped-layout.d.mts.map +1 -1
  31. package/dist/create-config/index.d.cts +2 -1
  32. package/dist/create-config/index.d.mts +2 -1
  33. package/dist/create-config/lazy-resource-layout.cjs +1 -1
  34. package/dist/create-config/lazy-resource-layout.cjs.map +1 -1
  35. package/dist/create-config/lazy-resource-layout.d.cts +4 -1
  36. package/dist/create-config/lazy-resource-layout.d.cts.map +1 -1
  37. package/dist/create-config/lazy-resource-layout.d.mts +4 -1
  38. package/dist/create-config/lazy-resource-layout.d.mts.map +1 -1
  39. package/dist/create-config/lazy-resource-layout.mjs +1 -1
  40. package/dist/create-config/lazy-resource-layout.mjs.map +1 -1
  41. package/dist/create-config/render-state.cjs +17 -3
  42. package/dist/create-config/render-state.cjs.map +1 -1
  43. package/dist/create-config/render-state.d.cts +66 -18
  44. package/dist/create-config/render-state.d.cts.map +1 -1
  45. package/dist/create-config/render-state.d.mts +66 -18
  46. package/dist/create-config/render-state.d.mts.map +1 -1
  47. package/dist/create-config/render-state.mjs +18 -3
  48. package/dist/create-config/render-state.mjs.map +1 -1
  49. package/dist/create-config/state-composable.cjs +44 -0
  50. package/dist/create-config/state-composable.cjs.map +1 -0
  51. package/dist/create-config/state-composable.d.cts +27 -0
  52. package/dist/create-config/state-composable.d.cts.map +1 -0
  53. package/dist/create-config/state-composable.d.mts +27 -0
  54. package/dist/create-config/state-composable.d.mts.map +1 -0
  55. package/dist/create-config/state-composable.mjs +42 -0
  56. package/dist/create-config/state-composable.mjs.map +1 -0
  57. package/dist/index.d.cts +3 -2
  58. package/dist/index.d.mts +3 -2
  59. 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
- }) : composables;
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(RenderDefaultState, { renderProps: layoutRenderProps })
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
- }) : composables;
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(layoutOptions);
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
- return attachComponentPropDefinitions(Object.assign(Component, {
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(options);
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 defaultState = getSynchronousRenderStateDefinition((typeof layout.render === "function" ? { default: layout.render } : layout.render).default, layout.props);
416
- const defaultComposables = defaultState?.composables ? (create) => ({
417
- ...layout.composables?.(create) ?? {},
418
- ...defaultState.composables?.(create)
419
- }) : layout.composables;
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);