@jfdevelops/react-layout 0.22.0 → 0.22.2

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 (109) hide show
  1. package/dist/create-config/create-resource-links.cjs +31 -17
  2. package/dist/create-config/create-resource-links.cjs.map +1 -1
  3. package/dist/create-config/create-resource-links.d.cts +9 -2
  4. package/dist/create-config/create-resource-links.d.cts.map +1 -1
  5. package/dist/create-config/create-resource-links.d.mts +9 -2
  6. package/dist/create-config/create-resource-links.d.mts.map +1 -1
  7. package/dist/create-config/create-resource-links.mjs +32 -17
  8. package/dist/create-config/create-resource-links.mjs.map +1 -1
  9. package/dist/create-config/define-layout.cjs +3 -2
  10. package/dist/create-config/define-layout.cjs.map +1 -1
  11. package/dist/create-config/define-layout.d.cts.map +1 -1
  12. package/dist/create-config/define-layout.d.mts.map +1 -1
  13. package/dist/create-config/define-layout.mjs +3 -2
  14. package/dist/create-config/define-layout.mjs.map +1 -1
  15. package/dist/create-config/for-paths/builder.cjs +6 -6
  16. package/dist/create-config/for-paths/builder.cjs.map +1 -1
  17. package/dist/create-config/for-paths/builder.mjs +6 -6
  18. package/dist/create-config/for-paths/builder.mjs.map +1 -1
  19. package/dist/create-config/for-resource.cjs +2 -1
  20. package/dist/create-config/for-resource.cjs.map +1 -1
  21. package/dist/create-config/for-resource.d.cts.map +1 -1
  22. package/dist/create-config/for-resource.d.mts.map +1 -1
  23. package/dist/create-config/for-resource.mjs +2 -1
  24. package/dist/create-config/for-resource.mjs.map +1 -1
  25. package/dist/create-config/for-resources/create-for-resources.cjs +15 -14
  26. package/dist/create-config/for-resources/create-for-resources.cjs.map +1 -1
  27. package/dist/create-config/for-resources/create-for-resources.mjs +15 -14
  28. package/dist/create-config/for-resources/create-for-resources.mjs.map +1 -1
  29. package/dist/create-config/index.d.cts +1 -1
  30. package/dist/create-config/index.d.mts +1 -1
  31. package/dist/errors/invalid-component.cjs +15 -7
  32. package/dist/errors/invalid-component.cjs.map +1 -1
  33. package/dist/errors/invalid-component.d.cts +106 -10
  34. package/dist/errors/invalid-component.d.cts.map +1 -1
  35. package/dist/errors/invalid-component.d.mts +106 -10
  36. package/dist/errors/invalid-component.d.mts.map +1 -1
  37. package/dist/errors/invalid-component.mjs +15 -7
  38. package/dist/errors/invalid-component.mjs.map +1 -1
  39. package/dist/errors/invalid-config.cjs +8 -3
  40. package/dist/errors/invalid-config.cjs.map +1 -1
  41. package/dist/errors/invalid-config.d.cts +96 -6
  42. package/dist/errors/invalid-config.d.cts.map +1 -1
  43. package/dist/errors/invalid-config.d.mts +96 -6
  44. package/dist/errors/invalid-config.d.mts.map +1 -1
  45. package/dist/errors/invalid-config.mjs +8 -3
  46. package/dist/errors/invalid-config.mjs.map +1 -1
  47. package/dist/errors/invalid-path.cjs +11 -5
  48. package/dist/errors/invalid-path.cjs.map +1 -1
  49. package/dist/errors/invalid-path.d.cts +100 -8
  50. package/dist/errors/invalid-path.d.cts.map +1 -1
  51. package/dist/errors/invalid-path.d.mts +100 -8
  52. package/dist/errors/invalid-path.d.mts.map +1 -1
  53. package/dist/errors/invalid-path.mjs +11 -5
  54. package/dist/errors/invalid-path.mjs.map +1 -1
  55. package/dist/errors/invalid-resource.cjs +11 -5
  56. package/dist/errors/invalid-resource.cjs.map +1 -1
  57. package/dist/errors/invalid-resource.d.cts +100 -8
  58. package/dist/errors/invalid-resource.d.cts.map +1 -1
  59. package/dist/errors/invalid-resource.d.mts +100 -8
  60. package/dist/errors/invalid-resource.d.mts.map +1 -1
  61. package/dist/errors/invalid-resource.mjs +11 -5
  62. package/dist/errors/invalid-resource.mjs.map +1 -1
  63. package/dist/errors/invalid-sub-resource.cjs +12 -5
  64. package/dist/errors/invalid-sub-resource.cjs.map +1 -1
  65. package/dist/errors/invalid-sub-resource.d.cts +103 -9
  66. package/dist/errors/invalid-sub-resource.d.cts.map +1 -1
  67. package/dist/errors/invalid-sub-resource.d.mts +103 -9
  68. package/dist/errors/invalid-sub-resource.d.mts.map +1 -1
  69. package/dist/errors/invalid-sub-resource.mjs +12 -5
  70. package/dist/errors/invalid-sub-resource.mjs.map +1 -1
  71. package/dist/errors/layout-configuration-error.cjs +17 -0
  72. package/dist/errors/layout-configuration-error.cjs.map +1 -0
  73. package/dist/errors/layout-configuration-error.d.cts +99 -0
  74. package/dist/errors/layout-configuration-error.d.cts.map +1 -0
  75. package/dist/errors/layout-configuration-error.d.mts +99 -0
  76. package/dist/errors/layout-configuration-error.d.mts.map +1 -0
  77. package/dist/errors/layout-configuration-error.mjs +17 -0
  78. package/dist/errors/layout-configuration-error.mjs.map +1 -0
  79. package/dist/errors/missing-path-variable.cjs +12 -5
  80. package/dist/errors/missing-path-variable.cjs.map +1 -1
  81. package/dist/errors/missing-path-variable.d.cts +99 -7
  82. package/dist/errors/missing-path-variable.d.cts.map +1 -1
  83. package/dist/errors/missing-path-variable.d.mts +99 -7
  84. package/dist/errors/missing-path-variable.d.mts.map +1 -1
  85. package/dist/errors/missing-path-variable.mjs +12 -5
  86. package/dist/errors/missing-path-variable.mjs.map +1 -1
  87. package/dist/errors/react-layout-error.cjs +38 -43
  88. package/dist/errors/react-layout-error.cjs.map +1 -1
  89. package/dist/errors/react-layout-error.d.cts +81 -38
  90. package/dist/errors/react-layout-error.d.cts.map +1 -1
  91. package/dist/errors/react-layout-error.d.mts +81 -38
  92. package/dist/errors/react-layout-error.d.mts.map +1 -1
  93. package/dist/errors/react-layout-error.mjs +39 -43
  94. package/dist/errors/react-layout-error.mjs.map +1 -1
  95. package/dist/index.cjs +4 -3
  96. package/dist/index.d.cts +4 -2
  97. package/dist/index.d.mts +4 -2
  98. package/dist/index.mjs +5 -4
  99. package/dist/node_modules/.pnpm/@jfdevelops_create-error@0.2.0_patch_hash_afc71b16c3f866f54416d30f467784ddc31736feb04f281a5fc4772ea422f4a9/node_modules/@jfdevelops/create-error/dist/types.d.cts +107 -0
  100. package/dist/node_modules/.pnpm/@jfdevelops_create-error@0.2.0_patch_hash_afc71b16c3f866f54416d30f467784ddc31736feb04f281a5fc4772ea422f4a9/node_modules/@jfdevelops/create-error/dist/types.d.cts.map +1 -0
  101. package/dist/node_modules/.pnpm/@jfdevelops_create-error@0.2.0_patch_hash_afc71b16c3f866f54416d30f467784ddc31736feb04f281a5fc4772ea422f4a9/node_modules/@jfdevelops/create-error/dist/types.d.mts +107 -0
  102. package/dist/node_modules/.pnpm/@jfdevelops_create-error@0.2.0_patch_hash_afc71b16c3f866f54416d30f467784ddc31736feb04f281a5fc4772ea422f4a9/node_modules/@jfdevelops/create-error/dist/types.d.mts.map +1 -0
  103. package/dist/resource.cjs +2 -1
  104. package/dist/resource.cjs.map +1 -1
  105. package/dist/resource.d.cts.map +1 -1
  106. package/dist/resource.d.mts.map +1 -1
  107. package/dist/resource.mjs +3 -1
  108. package/dist/resource.mjs.map +1 -1
  109. package/package.json +8 -6
@@ -1 +1 @@
1
- {"version":3,"file":"create-for-resources.cjs","names":["capitalize","reservedScopedComponentNames","isRenderableComponentType","resolveScopedRenderResult","withScopedCompoundStatics"],"sources":["../../../src/create-config/for-resources/create-for-resources.ts"],"sourcesContent":["import {\n createContext,\n createElement,\n type ComponentType,\n type JSX,\n useContext,\n} from 'react';\nimport type { ComposableComponents } from '@jfdevelops/react-layout-composables';\nimport {\n type AnyBuiltPropDefinition,\n validateProps,\n} from '@jfdevelops/react-layout-validator';\nimport type { InPropsDefinition, InPropsObject } from '../../props';\nimport type { LayoutResourceKey, ResourceDefinition } from '../../resource';\nimport { capitalize } from '../../utils/capitalize';\nimport type { LayoutIncludeProps } from '../define-layout';\nimport type {\n CapitalizedResource,\n ResourcesLayoutName,\n} from './resource-selection';\nimport type { CreateResourceLayoutForResourcesFn } from './scoped-layout';\nimport {\n isRenderableComponentType,\n reservedScopedComponentNames,\n resolveScopedRenderResult,\n type ScopedRenderResult,\n withScopedCompoundStatics,\n} from './scoped-render';\n\ntype CreateForResourcesOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n> = {\n createLayoutForResource: (\n defaultName: string | undefined,\n resource: LayoutResourceKey<Resources>,\n ) => unknown;\n createMakeComposableLayout?: () => (\n options: Record<string, unknown>,\n ) => unknown;\n createResourceLayout: (options: Record<string, unknown>) => unknown;\n getComponentPropDefinitions: (\n resource: LayoutResourceKey<Resources>,\n ) => Record<string, AnyBuiltPropDefinition>;\n};\n\nexport function createForResources<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n CustomProps extends InPropsObject,\n>({\n createLayoutForResource,\n createMakeComposableLayout,\n createResourceLayout,\n getComponentPropDefinitions,\n}: CreateForResourcesOptions<Resources>) {\n return ((...resourcesOrOptions: Array<unknown>) => {\n const firstArgument = resourcesOrOptions[0];\n let resourceOptions: Array<{\n resource: LayoutResourceKey<Resources>;\n name?:\n | string\n | ((\n resource: CapitalizedResource<LayoutResourceKey<Resources>>,\n ) => string);\n }>;\n\n if (typeof firstArgument === 'string') {\n resourceOptions = resourcesOrOptions.map((resource) => ({\n resource: resource as LayoutResourceKey<Resources>,\n }));\n } else if (\n firstArgument !== null &&\n typeof firstArgument === 'object' &&\n 'resources' in firstArgument &&\n Array.isArray(firstArgument.resources)\n ) {\n const { name, resources } = firstArgument as {\n name?: ResourcesLayoutName<LayoutResourceKey<Resources>>;\n resources: Array<LayoutResourceKey<Resources>>;\n };\n resourceOptions = resources.map((resource) => ({\n name: typeof name === 'function' ? name : name?.[resource],\n resource,\n }));\n } else {\n resourceOptions = Object.entries(firstArgument ?? {}).map(\n ([resource, options]) => ({\n ...(options as {\n name?:\n | string\n | ((\n resource: CapitalizedResource<LayoutResourceKey<Resources>>,\n ) => string);\n }),\n resource: resource as LayoutResourceKey<Resources>,\n }),\n );\n }\n\n const defaultNames = new Map(\n resourceOptions.map(({ name, resource }) => [\n resource,\n typeof name === 'function'\n ? name(\n capitalize(resource) as CapitalizedResource<\n LayoutResourceKey<Resources>\n >,\n )\n : name,\n ]),\n );\n\n function scopedCreateResourceLayout(options: Record<string, unknown>) {\n const resource = options.resource as LayoutResourceKey<Resources>;\n\n return createResourceLayout({\n ...options,\n name: options.name ?? defaultNames.get(resource),\n });\n }\n\n function scopedForResource(options: {\n name?: string;\n resource: LayoutResourceKey<Resources>;\n }) {\n return createLayoutForResource(\n options.name ?? defaultNames.get(options.resource),\n options.resource,\n );\n }\n\n type ScopedComponentRenderFn = (\n props: Record<string, unknown>,\n components: Record<string, (props?: never) => JSX.Element>,\n ) => ScopedRenderResult;\n\n type ScopedResourceScopedComponentDefinition = {\n props?: Record<string, AnyBuiltPropDefinition>;\n render: ScopedComponentRenderFn;\n };\n\n type ScopedComponentEntry = {\n [option: string]: unknown;\n name?: string;\n props?: CreateComponentPropsBag;\n components?: Record<string, ScopedResourceScopedComponentDefinition>;\n render: ScopedComponentRenderFn;\n };\n\n type CreateComponentPropsBag = {\n include?: Record<string, true | 'optional'>;\n custom?: Record<string, AnyBuiltPropDefinition>;\n defined?: Record<string, unknown>;\n };\n\n function mergeCreateComponentProps(\n ...bags: Array<CreateComponentPropsBag | undefined>\n ): CreateComponentPropsBag {\n const include: Record<string, true | 'optional'> = {};\n const custom: Record<string, AnyBuiltPropDefinition> = {};\n\n for (const bag of bags) {\n Object.assign(include, bag?.include);\n Object.assign(custom, bag?.custom);\n\n for (const key of Object.keys(bag?.defined ?? {})) {\n include[key] = true;\n }\n }\n\n return { include, custom };\n }\n\n function createComponent(componentOptions: {\n props?: {\n include?: Record<string, true | 'optional'>;\n custom?: Record<string, AnyBuiltPropDefinition>;\n };\n resources?: Record<string, ScopedComponentEntry>;\n render: (\n props: Record<string, unknown>,\n context: Record<string, (props: never) => JSX.Element>,\n ) => ScopedRenderResult;\n }) {\n const mergedProps = mergeCreateComponentProps(\n componentOptions.props,\n ...Object.values(componentOptions.resources ?? {}).map(\n (entry) => entry.props,\n ),\n );\n const include = mergedProps.include ?? {};\n const custom = mergedProps.custom ?? {};\n const selectedResources = new Set(\n resourceOptions.map(({ resource }) => resource),\n );\n const componentPropsContext = createContext<\n Record<string, unknown> | undefined\n >(undefined);\n const definedEntries = new Map<\n LayoutResourceKey<Resources>,\n ScopedComponentEntry\n >();\n\n for (const [key, entry] of Object.entries(\n componentOptions.resources ?? {},\n )) {\n const resource = key as LayoutResourceKey<Resources>;\n\n if (!selectedResources.has(resource)) {\n throw new Error(\n `Resource \"${key}\" is not available in this scoped component`,\n );\n }\n\n definedEntries.set(resource, entry);\n }\n\n /** Resolved scoped components, per resource. */\n const resourceScopedComponents = new Map<\n LayoutResourceKey<Resources>,\n Record<string, (props?: never) => JSX.Element>\n >();\n const contextResources = new Map<string, LayoutResourceKey<Resources>>();\n const renderContext: Record<string, (props: never) => JSX.Element> =\n Object.fromEntries(\n [...definedEntries].map(([resource, entry]) => {\n const contextKey = capitalize(resource);\n\n if (contextKey === 'Root') {\n throw new Error(\n `Resource \"${resource}\" maps to the reserved render context key \"Root\"`,\n );\n }\n\n const existingResource = contextResources.get(contextKey);\n\n if (existingResource !== undefined) {\n throw new Error(\n `Resources \"${existingResource}\" and \"${resource}\" both map to render context key \"${contextKey}\"`,\n );\n }\n\n contextResources.set(contextKey, resource);\n\n /**\n * Built once per resource so every scoped component keeps a stable\n * identity, and shared by the resource render, the render context,\n * and any component bound through `asHOF()`.\n */\n const scopedComponents: Record<\n string,\n (props?: never) => JSX.Element\n > = {};\n\n for (const [name, definition] of Object.entries(\n entry.components ?? {},\n )) {\n if (reservedScopedComponentNames.has(name)) {\n throw new Error(\n `Scoped component \"${name}\" for resource \"${resource}\" uses a reserved name`,\n );\n }\n\n const ownPropDefinitions = definition.props ?? {};\n // Last call-site own-props / returned component for this scoped\n // entry. Compound statics re-run `render` with these so\n // `<DataTable variant=\"b\" />` then `<DataTable.Loading />` sees \"b\".\n let cachedOwnProps: Record<string, unknown> = {};\n let cachedReturnedComponent:\n | ComponentType<Record<string, unknown>>\n | undefined;\n\n function ScopedComponent(ownProps?: Record<string, unknown>) {\n const componentProps = useContext(componentPropsContext);\n\n if (componentProps === undefined) {\n throw new Error(\n `Scoped component \"${name}\" must be rendered inside its scoped component`,\n );\n }\n\n const resolvedOwnProps = ownProps ?? {};\n cachedOwnProps = resolvedOwnProps;\n\n validateProps(ownPropDefinitions, resolvedOwnProps, {\n layoutName:\n entry.name ??\n defaultNames.get(resource) ??\n capitalize(resource),\n resource,\n });\n\n // Mount a returned component type with call-site props; pass\n // nodes (elements, portals, null) through unchanged.\n const result = definition.render(\n { ...componentProps, ...resolvedOwnProps, resource },\n scopedComponents,\n );\n\n if (isRenderableComponentType(result)) {\n cachedReturnedComponent = result as ComponentType<\n Record<string, unknown>\n >;\n }\n\n return resolveScopedRenderResult(result, resolvedOwnProps);\n }\n\n // Types expose compound statics from the returned component\n // (`DataTable.Loading`); attach matching runtime wrappers.\n scopedComponents[name] = withScopedCompoundStatics(\n ScopedComponent,\n (staticName) => {\n function CompoundStatic(ownProps?: Record<string, unknown>) {\n const componentProps = useContext(componentPropsContext);\n\n if (componentProps === undefined) {\n throw new Error(\n `Scoped component \"${name}.${staticName}\" must be rendered inside its scoped component`,\n );\n }\n\n // Prefer the component from the last parent call (same\n // closure as that call's own-props). Fall back to re-running\n // render with cached parent props when needed.\n let result: unknown = cachedReturnedComponent;\n\n if (!isRenderableComponentType(result)) {\n result = definition.render(\n {\n ...componentProps,\n ...cachedOwnProps,\n resource,\n },\n scopedComponents,\n );\n }\n\n if (!isRenderableComponentType(result)) {\n throw new Error(\n `Scoped component \"${name}\" must return a component type to use static \"${staticName}\"`,\n );\n }\n\n const staticComponent = (\n result as ComponentType<Record<string, unknown>> &\n Record<string, unknown>\n )[staticName];\n\n if (!isRenderableComponentType(staticComponent)) {\n throw new Error(\n `Scoped component \"${name}\" has no component static \"${staticName}\"`,\n );\n }\n\n // Loading's props — those mount the static itself.\n return createElement(staticComponent, ownProps ?? {});\n }\n\n CompoundStatic.displayName = `${name}.${staticName}`;\n return CompoundStatic;\n },\n ) as (props?: never) => JSX.Element;\n }\n\n resourceScopedComponents.set(resource, scopedComponents);\n\n function ResourceRender(ownProps?: Record<string, unknown>) {\n const componentProps = useContext(componentPropsContext);\n\n if (componentProps === undefined) {\n throw new Error(\n `Render context component \"${contextKey}\" must be rendered inside its scoped component`,\n );\n }\n\n // Call-site props on `context.Users({ title, heading })` merge into\n // the resource render props and mount a returned component type.\n const callProps = { ...componentProps, ...ownProps, resource };\n return resolveScopedRenderResult(\n entry.render(callProps, scopedComponents),\n ownProps,\n );\n }\n\n return [\n contextKey,\n Object.assign(ResourceRender, scopedComponents),\n ];\n }),\n );\n\n /**\n * Layouts are created once per resource and cached. Creating one during\n * render would hand React a new component type on every pass, remounting\n * the whole subtree.\n */\n const roots = new Map<\n LayoutResourceKey<Resources>,\n (props: Record<string, unknown>) => JSX.Element\n >();\n\n function Root(rootProps: Record<string, unknown>) {\n const componentProps = useContext(componentPropsContext);\n\n if (componentProps === undefined) {\n throw new Error(\n 'Render context component \"Root\" must be rendered inside its scoped component',\n );\n }\n\n const resource =\n componentProps.resource as LayoutResourceKey<Resources>;\n let root = roots.get(resource);\n\n if (root === undefined) {\n const entry = definedEntries.get(resource);\n\n if (entry === undefined) {\n throw new Error(\n `Render context component \"Root\" requires a \"resources.${resource}\" entry to build the layout for resource \"${resource}\"`,\n );\n }\n\n // Layout option values come from the outer component call site\n // (`<Directory title=\"…\" />`), not from the resource entry.\n const availableDefinitions =\n getComponentPropDefinitions(resource);\n const layoutOptions: Record<string, unknown> = {};\n const defined = entry.props?.defined ?? {};\n\n for (const key of Object.keys(availableDefinitions)) {\n if (key in defined) {\n layoutOptions[key] = defined[key];\n }\n\n const capitalized = capitalize(key);\n if (capitalized in defined) {\n layoutOptions[capitalized] = defined[capitalized];\n }\n\n if (key in componentProps) {\n layoutOptions[key] = componentProps[key];\n }\n\n if (capitalized in componentProps) {\n layoutOptions[capitalized] = componentProps[capitalized];\n }\n }\n\n root = scopedCreateResourceLayout({\n ...layoutOptions,\n name:\n entry.name ??\n defaultNames.get(resource) ??\n capitalize(resource),\n resource,\n }) as (props: Record<string, unknown>) => JSX.Element;\n roots.set(resource, root);\n }\n\n const entry = definedEntries.get(resource);\n const definedCustom: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(\n entry?.props?.defined ?? {},\n )) {\n if (key in custom) {\n definedCustom[key] = value;\n }\n }\n\n return createElement(root, { ...definedCustom, ...rootProps });\n }\n\n renderContext.Root = Root;\n\n function Component(componentProps: Record<string, unknown>) {\n const componentResource =\n componentProps.resource as LayoutResourceKey<Resources>;\n\n if (!selectedResources.has(componentResource)) {\n throw new Error(\n `Resource \"${componentResource}\" is not available in this scoped component`,\n );\n }\n\n const defined =\n definedEntries.get(componentResource)?.props?.defined ?? {};\n const resolvedComponentProps = { ...defined, ...componentProps };\n const availableDefinitions =\n getComponentPropDefinitions(componentResource);\n const definitionsToValidate: Record<string, AnyBuiltPropDefinition> =\n {};\n\n for (const [key, inclusion] of Object.entries(include)) {\n const definition = availableDefinitions[key];\n\n if (!definition) {\n continue;\n }\n\n // Keep declared keys as-is — do not capitalize JSX.Element props.\n if (inclusion === true || key in resolvedComponentProps) {\n definitionsToValidate[key] = definition;\n }\n }\n\n for (const [key, definition] of Object.entries(custom)) {\n if (key === 'children' || key === 'resource') {\n continue;\n }\n\n definitionsToValidate[key] = definition;\n }\n\n validateProps(definitionsToValidate, resolvedComponentProps, {\n layoutName:\n definedEntries.get(componentResource)?.name ??\n defaultNames.get(componentResource) ??\n capitalize(componentResource),\n resource: componentResource,\n });\n\n // Top-level render may return a component type; mount it with the full\n // component props (include/custom + inferred return-type props).\n return createElement(\n componentPropsContext.Provider,\n { value: resolvedComponentProps },\n resolveScopedRenderResult(\n componentOptions.render(resolvedComponentProps, renderContext),\n resolvedComponentProps,\n ),\n );\n }\n\n /**\n * Bound components are created once per resource and cached. Returning a\n * fresh component from the factory would hand React a new component type\n * whenever the caller rebinds, remounting the subtree.\n */\n const boundComponents = new Map<\n LayoutResourceKey<Resources>,\n (props: Record<string, unknown>) => JSX.Element\n >();\n\n function bindResource(resource: LayoutResourceKey<Resources>) {\n if (!selectedResources.has(resource)) {\n throw new Error(\n `Resource \"${resource}\" is not available in this scoped component`,\n );\n }\n\n let boundComponent = boundComponents.get(resource);\n\n if (boundComponent === undefined) {\n boundComponent = Object.assign(\n (boundProps: Record<string, unknown>) =>\n createElement(Component, { ...boundProps, resource }),\n {\n displayName: `ScopedResourceComponent(${resource})`,\n props: undefined,\n resource: undefined,\n },\n resourceScopedComponents.get(resource) ?? {},\n );\n boundComponents.set(resource, boundComponent);\n }\n\n return boundComponent;\n }\n\n function asHOF() {\n return bindResource;\n }\n\n return Object.assign(Component, {\n asHOF,\n displayName: 'ScopedResourceComponent',\n props: undefined,\n });\n }\n\n function createComponentSetProps(baseProps: CreateComponentPropsBag) {\n function createWithProps(componentOptions: {\n props?: CreateComponentPropsBag;\n resources?: Record<string, ScopedComponentEntry>;\n render: (\n props: Record<string, unknown>,\n context: Record<string, (props: never) => JSX.Element>,\n ) => ScopedRenderResult;\n }) {\n return createComponent({\n ...componentOptions,\n props: mergeCreateComponentProps(baseProps, componentOptions.props),\n });\n }\n\n createWithProps.createResourceComponents = createResourceComponents;\n\n return createWithProps;\n }\n\n function createResourceComponents(options: {\n resource: LayoutResourceKey<Resources>;\n props?: CreateComponentPropsBag;\n name?: string;\n components?: Record<string, ScopedResourceScopedComponentDefinition>;\n render: ScopedComponentRenderFn;\n }) {\n const { resource, props, ...entry } = options;\n\n if (\n !resourceOptions.some(\n (resourceOption) => resourceOption.resource === resource,\n )\n ) {\n throw new Error(\n `Resource \"${resource}\" is not available in this scoped component`,\n );\n }\n\n return { ...entry, props: props ?? {} };\n }\n\n Object.assign(createComponent, {\n setProps: createComponentSetProps,\n });\n\n const scopedExtras: {\n createComponent: typeof createComponent;\n createResourceComponents: typeof createResourceComponents;\n forResource: typeof scopedForResource;\n makeComposable?: (options: Record<string, unknown>) => unknown;\n resources: undefined;\n } = {\n createComponent,\n createResourceComponents,\n forResource: scopedForResource,\n resources: undefined,\n };\n\n if (createMakeComposableLayout) {\n const makeComposableLayout = createMakeComposableLayout();\n\n scopedExtras.makeComposable = (options) => {\n const resource = options.resource as LayoutResourceKey<Resources>;\n\n return makeComposableLayout({\n ...options,\n name: options.name ?? defaultNames.get(resource),\n });\n };\n }\n\n return Object.assign(scopedCreateResourceLayout, scopedExtras);\n }) as unknown as CreateResourceLayoutForResourcesFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n >;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"create-for-resources.cjs","names":["capitalize","LayoutConfigurationError","reservedScopedComponentNames","isRenderableComponentType","resolveScopedRenderResult","withScopedCompoundStatics"],"sources":["../../../src/create-config/for-resources/create-for-resources.ts"],"sourcesContent":["import {\n createContext,\n createElement,\n type ComponentType,\n type JSX,\n useContext,\n} from 'react';\nimport type { ComposableComponents } from '@jfdevelops/react-layout-composables';\nimport {\n type AnyBuiltPropDefinition,\n validateProps,\n} from '@jfdevelops/react-layout-validator';\nimport type { InPropsDefinition, InPropsObject } from '../../props';\nimport type { LayoutResourceKey, ResourceDefinition } from '../../resource';\nimport { capitalize } from '../../utils/capitalize';\nimport { LayoutConfigurationError } from '../../errors';\nimport type { LayoutIncludeProps } from '../define-layout';\nimport type {\n CapitalizedResource,\n ResourcesLayoutName,\n} from './resource-selection';\nimport type { CreateResourceLayoutForResourcesFn } from './scoped-layout';\nimport {\n isRenderableComponentType,\n reservedScopedComponentNames,\n resolveScopedRenderResult,\n type ScopedRenderResult,\n withScopedCompoundStatics,\n} from './scoped-render';\n\ntype CreateForResourcesOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n> = {\n createLayoutForResource: (\n defaultName: string | undefined,\n resource: LayoutResourceKey<Resources>,\n ) => unknown;\n createMakeComposableLayout?: () => (\n options: Record<string, unknown>,\n ) => unknown;\n createResourceLayout: (options: Record<string, unknown>) => unknown;\n getComponentPropDefinitions: (\n resource: LayoutResourceKey<Resources>,\n ) => Record<string, AnyBuiltPropDefinition>;\n};\n\nexport function createForResources<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n CustomProps extends InPropsObject,\n>({\n createLayoutForResource,\n createMakeComposableLayout,\n createResourceLayout,\n getComponentPropDefinitions,\n}: CreateForResourcesOptions<Resources>) {\n return ((...resourcesOrOptions: Array<unknown>) => {\n const firstArgument = resourcesOrOptions[0];\n let resourceOptions: Array<{\n resource: LayoutResourceKey<Resources>;\n name?:\n | string\n | ((\n resource: CapitalizedResource<LayoutResourceKey<Resources>>,\n ) => string);\n }>;\n\n if (typeof firstArgument === 'string') {\n resourceOptions = resourcesOrOptions.map((resource) => ({\n resource: resource as LayoutResourceKey<Resources>,\n }));\n } else if (\n firstArgument !== null &&\n typeof firstArgument === 'object' &&\n 'resources' in firstArgument &&\n Array.isArray(firstArgument.resources)\n ) {\n const { name, resources } = firstArgument as {\n name?: ResourcesLayoutName<LayoutResourceKey<Resources>>;\n resources: Array<LayoutResourceKey<Resources>>;\n };\n resourceOptions = resources.map((resource) => ({\n name: typeof name === 'function' ? name : name?.[resource],\n resource,\n }));\n } else {\n resourceOptions = Object.entries(firstArgument ?? {}).map(\n ([resource, options]) => ({\n ...(options as {\n name?:\n | string\n | ((\n resource: CapitalizedResource<LayoutResourceKey<Resources>>,\n ) => string);\n }),\n resource: resource as LayoutResourceKey<Resources>,\n }),\n );\n }\n\n const defaultNames = new Map(\n resourceOptions.map(({ name, resource }) => [\n resource,\n typeof name === 'function'\n ? name(\n capitalize(resource) as CapitalizedResource<\n LayoutResourceKey<Resources>\n >,\n )\n : name,\n ]),\n );\n\n function scopedCreateResourceLayout(options: Record<string, unknown>) {\n const resource = options.resource as LayoutResourceKey<Resources>;\n\n return createResourceLayout({\n ...options,\n name: options.name ?? defaultNames.get(resource),\n });\n }\n\n function scopedForResource(options: {\n name?: string;\n resource: LayoutResourceKey<Resources>;\n }) {\n return createLayoutForResource(\n options.name ?? defaultNames.get(options.resource),\n options.resource,\n );\n }\n\n type ScopedComponentRenderFn = (\n props: Record<string, unknown>,\n components: Record<string, (props?: never) => JSX.Element>,\n ) => ScopedRenderResult;\n\n type ScopedResourceScopedComponentDefinition = {\n props?: Record<string, AnyBuiltPropDefinition>;\n render: ScopedComponentRenderFn;\n };\n\n type ScopedComponentEntry = {\n [option: string]: unknown;\n name?: string;\n props?: CreateComponentPropsBag;\n components?: Record<string, ScopedResourceScopedComponentDefinition>;\n render: ScopedComponentRenderFn;\n };\n\n type CreateComponentPropsBag = {\n include?: Record<string, true | 'optional'>;\n custom?: Record<string, AnyBuiltPropDefinition>;\n defined?: Record<string, unknown>;\n };\n\n function mergeCreateComponentProps(\n ...bags: Array<CreateComponentPropsBag | undefined>\n ): CreateComponentPropsBag {\n const include: Record<string, true | 'optional'> = {};\n const custom: Record<string, AnyBuiltPropDefinition> = {};\n\n for (const bag of bags) {\n Object.assign(include, bag?.include);\n Object.assign(custom, bag?.custom);\n\n for (const key of Object.keys(bag?.defined ?? {})) {\n include[key] = true;\n }\n }\n\n return { include, custom };\n }\n\n function createComponent(componentOptions: {\n props?: {\n include?: Record<string, true | 'optional'>;\n custom?: Record<string, AnyBuiltPropDefinition>;\n };\n resources?: Record<string, ScopedComponentEntry>;\n render: (\n props: Record<string, unknown>,\n context: Record<string, (props: never) => JSX.Element>,\n ) => ScopedRenderResult;\n }) {\n const mergedProps = mergeCreateComponentProps(\n componentOptions.props,\n ...Object.values(componentOptions.resources ?? {}).map(\n (entry) => entry.props,\n ),\n );\n const include = mergedProps.include ?? {};\n const custom = mergedProps.custom ?? {};\n const selectedResources = new Set(\n resourceOptions.map(({ resource }) => resource),\n );\n const componentPropsContext = createContext<\n Record<string, unknown> | undefined\n >(undefined);\n const definedEntries = new Map<\n LayoutResourceKey<Resources>,\n ScopedComponentEntry\n >();\n\n for (const [key, entry] of Object.entries(\n componentOptions.resources ?? {},\n )) {\n const resource = key as LayoutResourceKey<Resources>;\n\n if (!selectedResources.has(resource)) {\n throw new LayoutConfigurationError(\n `Resource \"${key}\" is not available in this scoped component`,\n );\n }\n\n definedEntries.set(resource, entry);\n }\n\n /** Resolved scoped components, per resource. */\n const resourceScopedComponents = new Map<\n LayoutResourceKey<Resources>,\n Record<string, (props?: never) => JSX.Element>\n >();\n const contextResources = new Map<string, LayoutResourceKey<Resources>>();\n const renderContext: Record<string, (props: never) => JSX.Element> =\n Object.fromEntries(\n [...definedEntries].map(([resource, entry]) => {\n const contextKey = capitalize(resource);\n\n if (contextKey === 'Root') {\n throw new LayoutConfigurationError(\n `Resource \"${resource}\" maps to the reserved render context key \"Root\"`,\n );\n }\n\n const existingResource = contextResources.get(contextKey);\n\n if (existingResource !== undefined) {\n throw new LayoutConfigurationError(\n `Resources \"${existingResource}\" and \"${resource}\" both map to render context key \"${contextKey}\"`,\n );\n }\n\n contextResources.set(contextKey, resource);\n\n /**\n * Built once per resource so every scoped component keeps a stable\n * identity, and shared by the resource render, the render context,\n * and any component bound through `asHOF()`.\n */\n const scopedComponents: Record<\n string,\n (props?: never) => JSX.Element\n > = {};\n\n for (const [name, definition] of Object.entries(\n entry.components ?? {},\n )) {\n if (reservedScopedComponentNames.has(name)) {\n throw new LayoutConfigurationError(\n `Scoped component \"${name}\" for resource \"${resource}\" uses a reserved name`,\n );\n }\n\n const ownPropDefinitions = definition.props ?? {};\n // Last call-site own-props / returned component for this scoped\n // entry. Compound statics re-run `render` with these so\n // `<DataTable variant=\"b\" />` then `<DataTable.Loading />` sees \"b\".\n let cachedOwnProps: Record<string, unknown> = {};\n let cachedReturnedComponent:\n | ComponentType<Record<string, unknown>>\n | undefined;\n\n function ScopedComponent(ownProps?: Record<string, unknown>) {\n const componentProps = useContext(componentPropsContext);\n\n if (componentProps === undefined) {\n throw new LayoutConfigurationError(\n `Scoped component \"${name}\" must be rendered inside its scoped component`,\n );\n }\n\n const resolvedOwnProps = ownProps ?? {};\n cachedOwnProps = resolvedOwnProps;\n\n validateProps(ownPropDefinitions, resolvedOwnProps, {\n layoutName:\n entry.name ??\n defaultNames.get(resource) ??\n capitalize(resource),\n resource,\n });\n\n // Mount a returned component type with call-site props; pass\n // nodes (elements, portals, null) through unchanged.\n const result = definition.render(\n { ...componentProps, ...resolvedOwnProps, resource },\n scopedComponents,\n );\n\n if (isRenderableComponentType(result)) {\n cachedReturnedComponent = result as ComponentType<\n Record<string, unknown>\n >;\n }\n\n return resolveScopedRenderResult(result, resolvedOwnProps);\n }\n\n // Types expose compound statics from the returned component\n // (`DataTable.Loading`); attach matching runtime wrappers.\n scopedComponents[name] = withScopedCompoundStatics(\n ScopedComponent,\n (staticName) => {\n function CompoundStatic(ownProps?: Record<string, unknown>) {\n const componentProps = useContext(componentPropsContext);\n\n if (componentProps === undefined) {\n throw new LayoutConfigurationError(\n `Scoped component \"${name}.${staticName}\" must be rendered inside its scoped component`,\n );\n }\n\n // Prefer the component from the last parent call (same\n // closure as that call's own-props). Fall back to re-running\n // render with cached parent props when needed.\n let result: unknown = cachedReturnedComponent;\n\n if (!isRenderableComponentType(result)) {\n result = definition.render(\n {\n ...componentProps,\n ...cachedOwnProps,\n resource,\n },\n scopedComponents,\n );\n }\n\n if (!isRenderableComponentType(result)) {\n throw new LayoutConfigurationError(\n `Scoped component \"${name}\" must return a component type to use static \"${staticName}\"`,\n );\n }\n\n const staticComponent = (\n result as ComponentType<Record<string, unknown>> &\n Record<string, unknown>\n )[staticName];\n\n if (!isRenderableComponentType(staticComponent)) {\n throw new LayoutConfigurationError(\n `Scoped component \"${name}\" has no component static \"${staticName}\"`,\n );\n }\n\n // Loading's props — those mount the static itself.\n return createElement(staticComponent, ownProps ?? {});\n }\n\n CompoundStatic.displayName = `${name}.${staticName}`;\n return CompoundStatic;\n },\n ) as (props?: never) => JSX.Element;\n }\n\n resourceScopedComponents.set(resource, scopedComponents);\n\n function ResourceRender(ownProps?: Record<string, unknown>) {\n const componentProps = useContext(componentPropsContext);\n\n if (componentProps === undefined) {\n throw new LayoutConfigurationError(\n `Render context component \"${contextKey}\" must be rendered inside its scoped component`,\n );\n }\n\n // Call-site props on `context.Users({ title, heading })` merge into\n // the resource render props and mount a returned component type.\n const callProps = { ...componentProps, ...ownProps, resource };\n return resolveScopedRenderResult(\n entry.render(callProps, scopedComponents),\n ownProps,\n );\n }\n\n return [\n contextKey,\n Object.assign(ResourceRender, scopedComponents),\n ];\n }),\n );\n\n /**\n * Layouts are created once per resource and cached. Creating one during\n * render would hand React a new component type on every pass, remounting\n * the whole subtree.\n */\n const roots = new Map<\n LayoutResourceKey<Resources>,\n (props: Record<string, unknown>) => JSX.Element\n >();\n\n function Root(rootProps: Record<string, unknown>) {\n const componentProps = useContext(componentPropsContext);\n\n if (componentProps === undefined) {\n throw new LayoutConfigurationError(\n 'Render context component \"Root\" must be rendered inside its scoped component',\n );\n }\n\n const resource =\n componentProps.resource as LayoutResourceKey<Resources>;\n let root = roots.get(resource);\n\n if (root === undefined) {\n const entry = definedEntries.get(resource);\n\n if (entry === undefined) {\n throw new LayoutConfigurationError(\n `Render context component \"Root\" requires a \"resources.${resource}\" entry to build the layout for resource \"${resource}\"`,\n );\n }\n\n // Layout option values come from the outer component call site\n // (`<Directory title=\"…\" />`), not from the resource entry.\n const availableDefinitions =\n getComponentPropDefinitions(resource);\n const layoutOptions: Record<string, unknown> = {};\n const defined = entry.props?.defined ?? {};\n\n for (const key of Object.keys(availableDefinitions)) {\n if (key in defined) {\n layoutOptions[key] = defined[key];\n }\n\n const capitalized = capitalize(key);\n if (capitalized in defined) {\n layoutOptions[capitalized] = defined[capitalized];\n }\n\n if (key in componentProps) {\n layoutOptions[key] = componentProps[key];\n }\n\n if (capitalized in componentProps) {\n layoutOptions[capitalized] = componentProps[capitalized];\n }\n }\n\n root = scopedCreateResourceLayout({\n ...layoutOptions,\n name:\n entry.name ??\n defaultNames.get(resource) ??\n capitalize(resource),\n resource,\n }) as (props: Record<string, unknown>) => JSX.Element;\n roots.set(resource, root);\n }\n\n const entry = definedEntries.get(resource);\n const definedCustom: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(\n entry?.props?.defined ?? {},\n )) {\n if (key in custom) {\n definedCustom[key] = value;\n }\n }\n\n return createElement(root, { ...definedCustom, ...rootProps });\n }\n\n renderContext.Root = Root;\n\n function Component(componentProps: Record<string, unknown>) {\n const componentResource =\n componentProps.resource as LayoutResourceKey<Resources>;\n\n if (!selectedResources.has(componentResource)) {\n throw new LayoutConfigurationError(\n `Resource \"${componentResource}\" is not available in this scoped component`,\n );\n }\n\n const defined =\n definedEntries.get(componentResource)?.props?.defined ?? {};\n const resolvedComponentProps = { ...defined, ...componentProps };\n const availableDefinitions =\n getComponentPropDefinitions(componentResource);\n const definitionsToValidate: Record<string, AnyBuiltPropDefinition> =\n {};\n\n for (const [key, inclusion] of Object.entries(include)) {\n const definition = availableDefinitions[key];\n\n if (!definition) {\n continue;\n }\n\n // Keep declared keys as-is — do not capitalize JSX.Element props.\n if (inclusion === true || key in resolvedComponentProps) {\n definitionsToValidate[key] = definition;\n }\n }\n\n for (const [key, definition] of Object.entries(custom)) {\n if (key === 'children' || key === 'resource') {\n continue;\n }\n\n definitionsToValidate[key] = definition;\n }\n\n validateProps(definitionsToValidate, resolvedComponentProps, {\n layoutName:\n definedEntries.get(componentResource)?.name ??\n defaultNames.get(componentResource) ??\n capitalize(componentResource),\n resource: componentResource,\n });\n\n // Top-level render may return a component type; mount it with the full\n // component props (include/custom + inferred return-type props).\n return createElement(\n componentPropsContext.Provider,\n { value: resolvedComponentProps },\n resolveScopedRenderResult(\n componentOptions.render(resolvedComponentProps, renderContext),\n resolvedComponentProps,\n ),\n );\n }\n\n /**\n * Bound components are created once per resource and cached. Returning a\n * fresh component from the factory would hand React a new component type\n * whenever the caller rebinds, remounting the subtree.\n */\n const boundComponents = new Map<\n LayoutResourceKey<Resources>,\n (props: Record<string, unknown>) => JSX.Element\n >();\n\n function bindResource(resource: LayoutResourceKey<Resources>) {\n if (!selectedResources.has(resource)) {\n throw new LayoutConfigurationError(\n `Resource \"${resource}\" is not available in this scoped component`,\n );\n }\n\n let boundComponent = boundComponents.get(resource);\n\n if (boundComponent === undefined) {\n boundComponent = Object.assign(\n (boundProps: Record<string, unknown>) =>\n createElement(Component, { ...boundProps, resource }),\n {\n displayName: `ScopedResourceComponent(${resource})`,\n props: undefined,\n resource: undefined,\n },\n resourceScopedComponents.get(resource) ?? {},\n );\n boundComponents.set(resource, boundComponent);\n }\n\n return boundComponent;\n }\n\n function asHOF() {\n return bindResource;\n }\n\n return Object.assign(Component, {\n asHOF,\n displayName: 'ScopedResourceComponent',\n props: undefined,\n });\n }\n\n function createComponentSetProps(baseProps: CreateComponentPropsBag) {\n function createWithProps(componentOptions: {\n props?: CreateComponentPropsBag;\n resources?: Record<string, ScopedComponentEntry>;\n render: (\n props: Record<string, unknown>,\n context: Record<string, (props: never) => JSX.Element>,\n ) => ScopedRenderResult;\n }) {\n return createComponent({\n ...componentOptions,\n props: mergeCreateComponentProps(baseProps, componentOptions.props),\n });\n }\n\n createWithProps.createResourceComponents = createResourceComponents;\n\n return createWithProps;\n }\n\n function createResourceComponents(options: {\n resource: LayoutResourceKey<Resources>;\n props?: CreateComponentPropsBag;\n name?: string;\n components?: Record<string, ScopedResourceScopedComponentDefinition>;\n render: ScopedComponentRenderFn;\n }) {\n const { resource, props, ...entry } = options;\n\n if (\n !resourceOptions.some(\n (resourceOption) => resourceOption.resource === resource,\n )\n ) {\n throw new LayoutConfigurationError(\n `Resource \"${resource}\" is not available in this scoped component`,\n );\n }\n\n return { ...entry, props: props ?? {} };\n }\n\n Object.assign(createComponent, {\n setProps: createComponentSetProps,\n });\n\n const scopedExtras: {\n createComponent: typeof createComponent;\n createResourceComponents: typeof createResourceComponents;\n forResource: typeof scopedForResource;\n makeComposable?: (options: Record<string, unknown>) => unknown;\n resources: undefined;\n } = {\n createComponent,\n createResourceComponents,\n forResource: scopedForResource,\n resources: undefined,\n };\n\n if (createMakeComposableLayout) {\n const makeComposableLayout = createMakeComposableLayout();\n\n scopedExtras.makeComposable = (options) => {\n const resource = options.resource as LayoutResourceKey<Resources>;\n\n return makeComposableLayout({\n ...options,\n name: options.name ?? defaultNames.get(resource),\n });\n };\n }\n\n return Object.assign(scopedCreateResourceLayout, scopedExtras);\n }) as unknown as CreateResourceLayoutForResourcesFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n >;\n}\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { LayoutConfigurationError } from "../../errors/layout-configuration-error.mjs";
1
2
  import { capitalize } from "../../utils/capitalize.mjs";
2
3
  import { isRenderableComponentType, reservedScopedComponentNames, resolveScopedRenderResult, withScopedCompoundStatics } from "./scoped-render.mjs";
3
4
  import { createContext, createElement, useContext } from "react";
@@ -52,7 +53,7 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
52
53
  const definedEntries = /* @__PURE__ */ new Map();
53
54
  for (const [key, entry] of Object.entries(componentOptions.resources ?? {})) {
54
55
  const resource = key;
55
- if (!selectedResources.has(resource)) throw new Error(`Resource "${key}" is not available in this scoped component`);
56
+ if (!selectedResources.has(resource)) throw new LayoutConfigurationError(`Resource "${key}" is not available in this scoped component`);
56
57
  definedEntries.set(resource, entry);
57
58
  }
58
59
  /** Resolved scoped components, per resource. */
@@ -60,9 +61,9 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
60
61
  const contextResources = /* @__PURE__ */ new Map();
61
62
  const renderContext = Object.fromEntries([...definedEntries].map(([resource, entry]) => {
62
63
  const contextKey = capitalize(resource);
63
- if (contextKey === "Root") throw new Error(`Resource "${resource}" maps to the reserved render context key "Root"`);
64
+ if (contextKey === "Root") throw new LayoutConfigurationError(`Resource "${resource}" maps to the reserved render context key "Root"`);
64
65
  const existingResource = contextResources.get(contextKey);
65
- if (existingResource !== void 0) throw new Error(`Resources "${existingResource}" and "${resource}" both map to render context key "${contextKey}"`);
66
+ if (existingResource !== void 0) throw new LayoutConfigurationError(`Resources "${existingResource}" and "${resource}" both map to render context key "${contextKey}"`);
66
67
  contextResources.set(contextKey, resource);
67
68
  /**
68
69
  * Built once per resource so every scoped component keeps a stable
@@ -71,13 +72,13 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
71
72
  */
72
73
  const scopedComponents = {};
73
74
  for (const [name, definition] of Object.entries(entry.components ?? {})) {
74
- if (reservedScopedComponentNames.has(name)) throw new Error(`Scoped component "${name}" for resource "${resource}" uses a reserved name`);
75
+ if (reservedScopedComponentNames.has(name)) throw new LayoutConfigurationError(`Scoped component "${name}" for resource "${resource}" uses a reserved name`);
75
76
  const ownPropDefinitions = definition.props ?? {};
76
77
  let cachedOwnProps = {};
77
78
  let cachedReturnedComponent;
78
79
  function ScopedComponent(ownProps) {
79
80
  const componentProps = useContext(componentPropsContext);
80
- if (componentProps === void 0) throw new Error(`Scoped component "${name}" must be rendered inside its scoped component`);
81
+ if (componentProps === void 0) throw new LayoutConfigurationError(`Scoped component "${name}" must be rendered inside its scoped component`);
81
82
  const resolvedOwnProps = ownProps ?? {};
82
83
  cachedOwnProps = resolvedOwnProps;
83
84
  validateProps(ownPropDefinitions, resolvedOwnProps, {
@@ -95,16 +96,16 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
95
96
  scopedComponents[name] = withScopedCompoundStatics(ScopedComponent, (staticName) => {
96
97
  function CompoundStatic(ownProps) {
97
98
  const componentProps = useContext(componentPropsContext);
98
- if (componentProps === void 0) throw new Error(`Scoped component "${name}.${staticName}" must be rendered inside its scoped component`);
99
+ if (componentProps === void 0) throw new LayoutConfigurationError(`Scoped component "${name}.${staticName}" must be rendered inside its scoped component`);
99
100
  let result = cachedReturnedComponent;
100
101
  if (!isRenderableComponentType(result)) result = definition.render({
101
102
  ...componentProps,
102
103
  ...cachedOwnProps,
103
104
  resource
104
105
  }, scopedComponents);
105
- if (!isRenderableComponentType(result)) throw new Error(`Scoped component "${name}" must return a component type to use static "${staticName}"`);
106
+ if (!isRenderableComponentType(result)) throw new LayoutConfigurationError(`Scoped component "${name}" must return a component type to use static "${staticName}"`);
106
107
  const staticComponent = result[staticName];
107
- if (!isRenderableComponentType(staticComponent)) throw new Error(`Scoped component "${name}" has no component static "${staticName}"`);
108
+ if (!isRenderableComponentType(staticComponent)) throw new LayoutConfigurationError(`Scoped component "${name}" has no component static "${staticName}"`);
108
109
  return createElement(staticComponent, ownProps ?? {});
109
110
  }
110
111
  CompoundStatic.displayName = `${name}.${staticName}`;
@@ -114,7 +115,7 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
114
115
  resourceScopedComponents.set(resource, scopedComponents);
115
116
  function ResourceRender(ownProps) {
116
117
  const componentProps = useContext(componentPropsContext);
117
- if (componentProps === void 0) throw new Error(`Render context component "${contextKey}" must be rendered inside its scoped component`);
118
+ if (componentProps === void 0) throw new LayoutConfigurationError(`Render context component "${contextKey}" must be rendered inside its scoped component`);
118
119
  const callProps = {
119
120
  ...componentProps,
120
121
  ...ownProps,
@@ -132,12 +133,12 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
132
133
  const roots = /* @__PURE__ */ new Map();
133
134
  function Root(rootProps) {
134
135
  const componentProps = useContext(componentPropsContext);
135
- if (componentProps === void 0) throw new Error("Render context component \"Root\" must be rendered inside its scoped component");
136
+ if (componentProps === void 0) throw new LayoutConfigurationError("Render context component \"Root\" must be rendered inside its scoped component");
136
137
  const resource = componentProps.resource;
137
138
  let root = roots.get(resource);
138
139
  if (root === void 0) {
139
140
  const entry = definedEntries.get(resource);
140
- if (entry === void 0) throw new Error(`Render context component "Root" requires a "resources.${resource}" entry to build the layout for resource "${resource}"`);
141
+ if (entry === void 0) throw new LayoutConfigurationError(`Render context component "Root" requires a "resources.${resource}" entry to build the layout for resource "${resource}"`);
141
142
  const availableDefinitions = getComponentPropDefinitions(resource);
142
143
  const layoutOptions = {};
143
144
  const defined = entry.props?.defined ?? {};
@@ -166,7 +167,7 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
166
167
  renderContext.Root = Root;
167
168
  function Component(componentProps) {
168
169
  const componentResource = componentProps.resource;
169
- if (!selectedResources.has(componentResource)) throw new Error(`Resource "${componentResource}" is not available in this scoped component`);
170
+ if (!selectedResources.has(componentResource)) throw new LayoutConfigurationError(`Resource "${componentResource}" is not available in this scoped component`);
170
171
  const resolvedComponentProps = {
171
172
  ...definedEntries.get(componentResource)?.props?.defined ?? {},
172
173
  ...componentProps
@@ -195,7 +196,7 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
195
196
  */
196
197
  const boundComponents = /* @__PURE__ */ new Map();
197
198
  function bindResource(resource) {
198
- if (!selectedResources.has(resource)) throw new Error(`Resource "${resource}" is not available in this scoped component`);
199
+ if (!selectedResources.has(resource)) throw new LayoutConfigurationError(`Resource "${resource}" is not available in this scoped component`);
199
200
  let boundComponent = boundComponents.get(resource);
200
201
  if (boundComponent === void 0) {
201
202
  boundComponent = Object.assign((boundProps) => createElement(Component, {
@@ -231,7 +232,7 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
231
232
  }
232
233
  function createResourceComponents(options) {
233
234
  const { resource, props, ...entry } = options;
234
- if (!resourceOptions.some((resourceOption) => resourceOption.resource === resource)) throw new Error(`Resource "${resource}" is not available in this scoped component`);
235
+ if (!resourceOptions.some((resourceOption) => resourceOption.resource === resource)) throw new LayoutConfigurationError(`Resource "${resource}" is not available in this scoped component`);
235
236
  return {
236
237
  ...entry,
237
238
  props: props ?? {}
@@ -1 +1 @@
1
- {"version":3,"file":"create-for-resources.mjs","names":[],"sources":["../../../src/create-config/for-resources/create-for-resources.ts"],"sourcesContent":["import {\n createContext,\n createElement,\n type ComponentType,\n type JSX,\n useContext,\n} from 'react';\nimport type { ComposableComponents } from '@jfdevelops/react-layout-composables';\nimport {\n type AnyBuiltPropDefinition,\n validateProps,\n} from '@jfdevelops/react-layout-validator';\nimport type { InPropsDefinition, InPropsObject } from '../../props';\nimport type { LayoutResourceKey, ResourceDefinition } from '../../resource';\nimport { capitalize } from '../../utils/capitalize';\nimport type { LayoutIncludeProps } from '../define-layout';\nimport type {\n CapitalizedResource,\n ResourcesLayoutName,\n} from './resource-selection';\nimport type { CreateResourceLayoutForResourcesFn } from './scoped-layout';\nimport {\n isRenderableComponentType,\n reservedScopedComponentNames,\n resolveScopedRenderResult,\n type ScopedRenderResult,\n withScopedCompoundStatics,\n} from './scoped-render';\n\ntype CreateForResourcesOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n> = {\n createLayoutForResource: (\n defaultName: string | undefined,\n resource: LayoutResourceKey<Resources>,\n ) => unknown;\n createMakeComposableLayout?: () => (\n options: Record<string, unknown>,\n ) => unknown;\n createResourceLayout: (options: Record<string, unknown>) => unknown;\n getComponentPropDefinitions: (\n resource: LayoutResourceKey<Resources>,\n ) => Record<string, AnyBuiltPropDefinition>;\n};\n\nexport function createForResources<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n CustomProps extends InPropsObject,\n>({\n createLayoutForResource,\n createMakeComposableLayout,\n createResourceLayout,\n getComponentPropDefinitions,\n}: CreateForResourcesOptions<Resources>) {\n return ((...resourcesOrOptions: Array<unknown>) => {\n const firstArgument = resourcesOrOptions[0];\n let resourceOptions: Array<{\n resource: LayoutResourceKey<Resources>;\n name?:\n | string\n | ((\n resource: CapitalizedResource<LayoutResourceKey<Resources>>,\n ) => string);\n }>;\n\n if (typeof firstArgument === 'string') {\n resourceOptions = resourcesOrOptions.map((resource) => ({\n resource: resource as LayoutResourceKey<Resources>,\n }));\n } else if (\n firstArgument !== null &&\n typeof firstArgument === 'object' &&\n 'resources' in firstArgument &&\n Array.isArray(firstArgument.resources)\n ) {\n const { name, resources } = firstArgument as {\n name?: ResourcesLayoutName<LayoutResourceKey<Resources>>;\n resources: Array<LayoutResourceKey<Resources>>;\n };\n resourceOptions = resources.map((resource) => ({\n name: typeof name === 'function' ? name : name?.[resource],\n resource,\n }));\n } else {\n resourceOptions = Object.entries(firstArgument ?? {}).map(\n ([resource, options]) => ({\n ...(options as {\n name?:\n | string\n | ((\n resource: CapitalizedResource<LayoutResourceKey<Resources>>,\n ) => string);\n }),\n resource: resource as LayoutResourceKey<Resources>,\n }),\n );\n }\n\n const defaultNames = new Map(\n resourceOptions.map(({ name, resource }) => [\n resource,\n typeof name === 'function'\n ? name(\n capitalize(resource) as CapitalizedResource<\n LayoutResourceKey<Resources>\n >,\n )\n : name,\n ]),\n );\n\n function scopedCreateResourceLayout(options: Record<string, unknown>) {\n const resource = options.resource as LayoutResourceKey<Resources>;\n\n return createResourceLayout({\n ...options,\n name: options.name ?? defaultNames.get(resource),\n });\n }\n\n function scopedForResource(options: {\n name?: string;\n resource: LayoutResourceKey<Resources>;\n }) {\n return createLayoutForResource(\n options.name ?? defaultNames.get(options.resource),\n options.resource,\n );\n }\n\n type ScopedComponentRenderFn = (\n props: Record<string, unknown>,\n components: Record<string, (props?: never) => JSX.Element>,\n ) => ScopedRenderResult;\n\n type ScopedResourceScopedComponentDefinition = {\n props?: Record<string, AnyBuiltPropDefinition>;\n render: ScopedComponentRenderFn;\n };\n\n type ScopedComponentEntry = {\n [option: string]: unknown;\n name?: string;\n props?: CreateComponentPropsBag;\n components?: Record<string, ScopedResourceScopedComponentDefinition>;\n render: ScopedComponentRenderFn;\n };\n\n type CreateComponentPropsBag = {\n include?: Record<string, true | 'optional'>;\n custom?: Record<string, AnyBuiltPropDefinition>;\n defined?: Record<string, unknown>;\n };\n\n function mergeCreateComponentProps(\n ...bags: Array<CreateComponentPropsBag | undefined>\n ): CreateComponentPropsBag {\n const include: Record<string, true | 'optional'> = {};\n const custom: Record<string, AnyBuiltPropDefinition> = {};\n\n for (const bag of bags) {\n Object.assign(include, bag?.include);\n Object.assign(custom, bag?.custom);\n\n for (const key of Object.keys(bag?.defined ?? {})) {\n include[key] = true;\n }\n }\n\n return { include, custom };\n }\n\n function createComponent(componentOptions: {\n props?: {\n include?: Record<string, true | 'optional'>;\n custom?: Record<string, AnyBuiltPropDefinition>;\n };\n resources?: Record<string, ScopedComponentEntry>;\n render: (\n props: Record<string, unknown>,\n context: Record<string, (props: never) => JSX.Element>,\n ) => ScopedRenderResult;\n }) {\n const mergedProps = mergeCreateComponentProps(\n componentOptions.props,\n ...Object.values(componentOptions.resources ?? {}).map(\n (entry) => entry.props,\n ),\n );\n const include = mergedProps.include ?? {};\n const custom = mergedProps.custom ?? {};\n const selectedResources = new Set(\n resourceOptions.map(({ resource }) => resource),\n );\n const componentPropsContext = createContext<\n Record<string, unknown> | undefined\n >(undefined);\n const definedEntries = new Map<\n LayoutResourceKey<Resources>,\n ScopedComponentEntry\n >();\n\n for (const [key, entry] of Object.entries(\n componentOptions.resources ?? {},\n )) {\n const resource = key as LayoutResourceKey<Resources>;\n\n if (!selectedResources.has(resource)) {\n throw new Error(\n `Resource \"${key}\" is not available in this scoped component`,\n );\n }\n\n definedEntries.set(resource, entry);\n }\n\n /** Resolved scoped components, per resource. */\n const resourceScopedComponents = new Map<\n LayoutResourceKey<Resources>,\n Record<string, (props?: never) => JSX.Element>\n >();\n const contextResources = new Map<string, LayoutResourceKey<Resources>>();\n const renderContext: Record<string, (props: never) => JSX.Element> =\n Object.fromEntries(\n [...definedEntries].map(([resource, entry]) => {\n const contextKey = capitalize(resource);\n\n if (contextKey === 'Root') {\n throw new Error(\n `Resource \"${resource}\" maps to the reserved render context key \"Root\"`,\n );\n }\n\n const existingResource = contextResources.get(contextKey);\n\n if (existingResource !== undefined) {\n throw new Error(\n `Resources \"${existingResource}\" and \"${resource}\" both map to render context key \"${contextKey}\"`,\n );\n }\n\n contextResources.set(contextKey, resource);\n\n /**\n * Built once per resource so every scoped component keeps a stable\n * identity, and shared by the resource render, the render context,\n * and any component bound through `asHOF()`.\n */\n const scopedComponents: Record<\n string,\n (props?: never) => JSX.Element\n > = {};\n\n for (const [name, definition] of Object.entries(\n entry.components ?? {},\n )) {\n if (reservedScopedComponentNames.has(name)) {\n throw new Error(\n `Scoped component \"${name}\" for resource \"${resource}\" uses a reserved name`,\n );\n }\n\n const ownPropDefinitions = definition.props ?? {};\n // Last call-site own-props / returned component for this scoped\n // entry. Compound statics re-run `render` with these so\n // `<DataTable variant=\"b\" />` then `<DataTable.Loading />` sees \"b\".\n let cachedOwnProps: Record<string, unknown> = {};\n let cachedReturnedComponent:\n | ComponentType<Record<string, unknown>>\n | undefined;\n\n function ScopedComponent(ownProps?: Record<string, unknown>) {\n const componentProps = useContext(componentPropsContext);\n\n if (componentProps === undefined) {\n throw new Error(\n `Scoped component \"${name}\" must be rendered inside its scoped component`,\n );\n }\n\n const resolvedOwnProps = ownProps ?? {};\n cachedOwnProps = resolvedOwnProps;\n\n validateProps(ownPropDefinitions, resolvedOwnProps, {\n layoutName:\n entry.name ??\n defaultNames.get(resource) ??\n capitalize(resource),\n resource,\n });\n\n // Mount a returned component type with call-site props; pass\n // nodes (elements, portals, null) through unchanged.\n const result = definition.render(\n { ...componentProps, ...resolvedOwnProps, resource },\n scopedComponents,\n );\n\n if (isRenderableComponentType(result)) {\n cachedReturnedComponent = result as ComponentType<\n Record<string, unknown>\n >;\n }\n\n return resolveScopedRenderResult(result, resolvedOwnProps);\n }\n\n // Types expose compound statics from the returned component\n // (`DataTable.Loading`); attach matching runtime wrappers.\n scopedComponents[name] = withScopedCompoundStatics(\n ScopedComponent,\n (staticName) => {\n function CompoundStatic(ownProps?: Record<string, unknown>) {\n const componentProps = useContext(componentPropsContext);\n\n if (componentProps === undefined) {\n throw new Error(\n `Scoped component \"${name}.${staticName}\" must be rendered inside its scoped component`,\n );\n }\n\n // Prefer the component from the last parent call (same\n // closure as that call's own-props). Fall back to re-running\n // render with cached parent props when needed.\n let result: unknown = cachedReturnedComponent;\n\n if (!isRenderableComponentType(result)) {\n result = definition.render(\n {\n ...componentProps,\n ...cachedOwnProps,\n resource,\n },\n scopedComponents,\n );\n }\n\n if (!isRenderableComponentType(result)) {\n throw new Error(\n `Scoped component \"${name}\" must return a component type to use static \"${staticName}\"`,\n );\n }\n\n const staticComponent = (\n result as ComponentType<Record<string, unknown>> &\n Record<string, unknown>\n )[staticName];\n\n if (!isRenderableComponentType(staticComponent)) {\n throw new Error(\n `Scoped component \"${name}\" has no component static \"${staticName}\"`,\n );\n }\n\n // Loading's props — those mount the static itself.\n return createElement(staticComponent, ownProps ?? {});\n }\n\n CompoundStatic.displayName = `${name}.${staticName}`;\n return CompoundStatic;\n },\n ) as (props?: never) => JSX.Element;\n }\n\n resourceScopedComponents.set(resource, scopedComponents);\n\n function ResourceRender(ownProps?: Record<string, unknown>) {\n const componentProps = useContext(componentPropsContext);\n\n if (componentProps === undefined) {\n throw new Error(\n `Render context component \"${contextKey}\" must be rendered inside its scoped component`,\n );\n }\n\n // Call-site props on `context.Users({ title, heading })` merge into\n // the resource render props and mount a returned component type.\n const callProps = { ...componentProps, ...ownProps, resource };\n return resolveScopedRenderResult(\n entry.render(callProps, scopedComponents),\n ownProps,\n );\n }\n\n return [\n contextKey,\n Object.assign(ResourceRender, scopedComponents),\n ];\n }),\n );\n\n /**\n * Layouts are created once per resource and cached. Creating one during\n * render would hand React a new component type on every pass, remounting\n * the whole subtree.\n */\n const roots = new Map<\n LayoutResourceKey<Resources>,\n (props: Record<string, unknown>) => JSX.Element\n >();\n\n function Root(rootProps: Record<string, unknown>) {\n const componentProps = useContext(componentPropsContext);\n\n if (componentProps === undefined) {\n throw new Error(\n 'Render context component \"Root\" must be rendered inside its scoped component',\n );\n }\n\n const resource =\n componentProps.resource as LayoutResourceKey<Resources>;\n let root = roots.get(resource);\n\n if (root === undefined) {\n const entry = definedEntries.get(resource);\n\n if (entry === undefined) {\n throw new Error(\n `Render context component \"Root\" requires a \"resources.${resource}\" entry to build the layout for resource \"${resource}\"`,\n );\n }\n\n // Layout option values come from the outer component call site\n // (`<Directory title=\"…\" />`), not from the resource entry.\n const availableDefinitions =\n getComponentPropDefinitions(resource);\n const layoutOptions: Record<string, unknown> = {};\n const defined = entry.props?.defined ?? {};\n\n for (const key of Object.keys(availableDefinitions)) {\n if (key in defined) {\n layoutOptions[key] = defined[key];\n }\n\n const capitalized = capitalize(key);\n if (capitalized in defined) {\n layoutOptions[capitalized] = defined[capitalized];\n }\n\n if (key in componentProps) {\n layoutOptions[key] = componentProps[key];\n }\n\n if (capitalized in componentProps) {\n layoutOptions[capitalized] = componentProps[capitalized];\n }\n }\n\n root = scopedCreateResourceLayout({\n ...layoutOptions,\n name:\n entry.name ??\n defaultNames.get(resource) ??\n capitalize(resource),\n resource,\n }) as (props: Record<string, unknown>) => JSX.Element;\n roots.set(resource, root);\n }\n\n const entry = definedEntries.get(resource);\n const definedCustom: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(\n entry?.props?.defined ?? {},\n )) {\n if (key in custom) {\n definedCustom[key] = value;\n }\n }\n\n return createElement(root, { ...definedCustom, ...rootProps });\n }\n\n renderContext.Root = Root;\n\n function Component(componentProps: Record<string, unknown>) {\n const componentResource =\n componentProps.resource as LayoutResourceKey<Resources>;\n\n if (!selectedResources.has(componentResource)) {\n throw new Error(\n `Resource \"${componentResource}\" is not available in this scoped component`,\n );\n }\n\n const defined =\n definedEntries.get(componentResource)?.props?.defined ?? {};\n const resolvedComponentProps = { ...defined, ...componentProps };\n const availableDefinitions =\n getComponentPropDefinitions(componentResource);\n const definitionsToValidate: Record<string, AnyBuiltPropDefinition> =\n {};\n\n for (const [key, inclusion] of Object.entries(include)) {\n const definition = availableDefinitions[key];\n\n if (!definition) {\n continue;\n }\n\n // Keep declared keys as-is — do not capitalize JSX.Element props.\n if (inclusion === true || key in resolvedComponentProps) {\n definitionsToValidate[key] = definition;\n }\n }\n\n for (const [key, definition] of Object.entries(custom)) {\n if (key === 'children' || key === 'resource') {\n continue;\n }\n\n definitionsToValidate[key] = definition;\n }\n\n validateProps(definitionsToValidate, resolvedComponentProps, {\n layoutName:\n definedEntries.get(componentResource)?.name ??\n defaultNames.get(componentResource) ??\n capitalize(componentResource),\n resource: componentResource,\n });\n\n // Top-level render may return a component type; mount it with the full\n // component props (include/custom + inferred return-type props).\n return createElement(\n componentPropsContext.Provider,\n { value: resolvedComponentProps },\n resolveScopedRenderResult(\n componentOptions.render(resolvedComponentProps, renderContext),\n resolvedComponentProps,\n ),\n );\n }\n\n /**\n * Bound components are created once per resource and cached. Returning a\n * fresh component from the factory would hand React a new component type\n * whenever the caller rebinds, remounting the subtree.\n */\n const boundComponents = new Map<\n LayoutResourceKey<Resources>,\n (props: Record<string, unknown>) => JSX.Element\n >();\n\n function bindResource(resource: LayoutResourceKey<Resources>) {\n if (!selectedResources.has(resource)) {\n throw new Error(\n `Resource \"${resource}\" is not available in this scoped component`,\n );\n }\n\n let boundComponent = boundComponents.get(resource);\n\n if (boundComponent === undefined) {\n boundComponent = Object.assign(\n (boundProps: Record<string, unknown>) =>\n createElement(Component, { ...boundProps, resource }),\n {\n displayName: `ScopedResourceComponent(${resource})`,\n props: undefined,\n resource: undefined,\n },\n resourceScopedComponents.get(resource) ?? {},\n );\n boundComponents.set(resource, boundComponent);\n }\n\n return boundComponent;\n }\n\n function asHOF() {\n return bindResource;\n }\n\n return Object.assign(Component, {\n asHOF,\n displayName: 'ScopedResourceComponent',\n props: undefined,\n });\n }\n\n function createComponentSetProps(baseProps: CreateComponentPropsBag) {\n function createWithProps(componentOptions: {\n props?: CreateComponentPropsBag;\n resources?: Record<string, ScopedComponentEntry>;\n render: (\n props: Record<string, unknown>,\n context: Record<string, (props: never) => JSX.Element>,\n ) => ScopedRenderResult;\n }) {\n return createComponent({\n ...componentOptions,\n props: mergeCreateComponentProps(baseProps, componentOptions.props),\n });\n }\n\n createWithProps.createResourceComponents = createResourceComponents;\n\n return createWithProps;\n }\n\n function createResourceComponents(options: {\n resource: LayoutResourceKey<Resources>;\n props?: CreateComponentPropsBag;\n name?: string;\n components?: Record<string, ScopedResourceScopedComponentDefinition>;\n render: ScopedComponentRenderFn;\n }) {\n const { resource, props, ...entry } = options;\n\n if (\n !resourceOptions.some(\n (resourceOption) => resourceOption.resource === resource,\n )\n ) {\n throw new Error(\n `Resource \"${resource}\" is not available in this scoped component`,\n );\n }\n\n return { ...entry, props: props ?? {} };\n }\n\n Object.assign(createComponent, {\n setProps: createComponentSetProps,\n });\n\n const scopedExtras: {\n createComponent: typeof createComponent;\n createResourceComponents: typeof createResourceComponents;\n forResource: typeof scopedForResource;\n makeComposable?: (options: Record<string, unknown>) => unknown;\n resources: undefined;\n } = {\n createComponent,\n createResourceComponents,\n forResource: scopedForResource,\n resources: undefined,\n };\n\n if (createMakeComposableLayout) {\n const makeComposableLayout = createMakeComposableLayout();\n\n scopedExtras.makeComposable = (options) => {\n const resource = options.resource as LayoutResourceKey<Resources>;\n\n return makeComposableLayout({\n ...options,\n name: options.name ?? defaultNames.get(resource),\n });\n };\n }\n\n return Object.assign(scopedCreateResourceLayout, scopedExtras);\n }) as unknown as CreateResourceLayoutForResourcesFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n >;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"create-for-resources.mjs","names":[],"sources":["../../../src/create-config/for-resources/create-for-resources.ts"],"sourcesContent":["import {\n createContext,\n createElement,\n type ComponentType,\n type JSX,\n useContext,\n} from 'react';\nimport type { ComposableComponents } from '@jfdevelops/react-layout-composables';\nimport {\n type AnyBuiltPropDefinition,\n validateProps,\n} from '@jfdevelops/react-layout-validator';\nimport type { InPropsDefinition, InPropsObject } from '../../props';\nimport type { LayoutResourceKey, ResourceDefinition } from '../../resource';\nimport { capitalize } from '../../utils/capitalize';\nimport { LayoutConfigurationError } from '../../errors';\nimport type { LayoutIncludeProps } from '../define-layout';\nimport type {\n CapitalizedResource,\n ResourcesLayoutName,\n} from './resource-selection';\nimport type { CreateResourceLayoutForResourcesFn } from './scoped-layout';\nimport {\n isRenderableComponentType,\n reservedScopedComponentNames,\n resolveScopedRenderResult,\n type ScopedRenderResult,\n withScopedCompoundStatics,\n} from './scoped-render';\n\ntype CreateForResourcesOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n> = {\n createLayoutForResource: (\n defaultName: string | undefined,\n resource: LayoutResourceKey<Resources>,\n ) => unknown;\n createMakeComposableLayout?: () => (\n options: Record<string, unknown>,\n ) => unknown;\n createResourceLayout: (options: Record<string, unknown>) => unknown;\n getComponentPropDefinitions: (\n resource: LayoutResourceKey<Resources>,\n ) => Record<string, AnyBuiltPropDefinition>;\n};\n\nexport function createForResources<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n CustomProps extends InPropsObject,\n>({\n createLayoutForResource,\n createMakeComposableLayout,\n createResourceLayout,\n getComponentPropDefinitions,\n}: CreateForResourcesOptions<Resources>) {\n return ((...resourcesOrOptions: Array<unknown>) => {\n const firstArgument = resourcesOrOptions[0];\n let resourceOptions: Array<{\n resource: LayoutResourceKey<Resources>;\n name?:\n | string\n | ((\n resource: CapitalizedResource<LayoutResourceKey<Resources>>,\n ) => string);\n }>;\n\n if (typeof firstArgument === 'string') {\n resourceOptions = resourcesOrOptions.map((resource) => ({\n resource: resource as LayoutResourceKey<Resources>,\n }));\n } else if (\n firstArgument !== null &&\n typeof firstArgument === 'object' &&\n 'resources' in firstArgument &&\n Array.isArray(firstArgument.resources)\n ) {\n const { name, resources } = firstArgument as {\n name?: ResourcesLayoutName<LayoutResourceKey<Resources>>;\n resources: Array<LayoutResourceKey<Resources>>;\n };\n resourceOptions = resources.map((resource) => ({\n name: typeof name === 'function' ? name : name?.[resource],\n resource,\n }));\n } else {\n resourceOptions = Object.entries(firstArgument ?? {}).map(\n ([resource, options]) => ({\n ...(options as {\n name?:\n | string\n | ((\n resource: CapitalizedResource<LayoutResourceKey<Resources>>,\n ) => string);\n }),\n resource: resource as LayoutResourceKey<Resources>,\n }),\n );\n }\n\n const defaultNames = new Map(\n resourceOptions.map(({ name, resource }) => [\n resource,\n typeof name === 'function'\n ? name(\n capitalize(resource) as CapitalizedResource<\n LayoutResourceKey<Resources>\n >,\n )\n : name,\n ]),\n );\n\n function scopedCreateResourceLayout(options: Record<string, unknown>) {\n const resource = options.resource as LayoutResourceKey<Resources>;\n\n return createResourceLayout({\n ...options,\n name: options.name ?? defaultNames.get(resource),\n });\n }\n\n function scopedForResource(options: {\n name?: string;\n resource: LayoutResourceKey<Resources>;\n }) {\n return createLayoutForResource(\n options.name ?? defaultNames.get(options.resource),\n options.resource,\n );\n }\n\n type ScopedComponentRenderFn = (\n props: Record<string, unknown>,\n components: Record<string, (props?: never) => JSX.Element>,\n ) => ScopedRenderResult;\n\n type ScopedResourceScopedComponentDefinition = {\n props?: Record<string, AnyBuiltPropDefinition>;\n render: ScopedComponentRenderFn;\n };\n\n type ScopedComponentEntry = {\n [option: string]: unknown;\n name?: string;\n props?: CreateComponentPropsBag;\n components?: Record<string, ScopedResourceScopedComponentDefinition>;\n render: ScopedComponentRenderFn;\n };\n\n type CreateComponentPropsBag = {\n include?: Record<string, true | 'optional'>;\n custom?: Record<string, AnyBuiltPropDefinition>;\n defined?: Record<string, unknown>;\n };\n\n function mergeCreateComponentProps(\n ...bags: Array<CreateComponentPropsBag | undefined>\n ): CreateComponentPropsBag {\n const include: Record<string, true | 'optional'> = {};\n const custom: Record<string, AnyBuiltPropDefinition> = {};\n\n for (const bag of bags) {\n Object.assign(include, bag?.include);\n Object.assign(custom, bag?.custom);\n\n for (const key of Object.keys(bag?.defined ?? {})) {\n include[key] = true;\n }\n }\n\n return { include, custom };\n }\n\n function createComponent(componentOptions: {\n props?: {\n include?: Record<string, true | 'optional'>;\n custom?: Record<string, AnyBuiltPropDefinition>;\n };\n resources?: Record<string, ScopedComponentEntry>;\n render: (\n props: Record<string, unknown>,\n context: Record<string, (props: never) => JSX.Element>,\n ) => ScopedRenderResult;\n }) {\n const mergedProps = mergeCreateComponentProps(\n componentOptions.props,\n ...Object.values(componentOptions.resources ?? {}).map(\n (entry) => entry.props,\n ),\n );\n const include = mergedProps.include ?? {};\n const custom = mergedProps.custom ?? {};\n const selectedResources = new Set(\n resourceOptions.map(({ resource }) => resource),\n );\n const componentPropsContext = createContext<\n Record<string, unknown> | undefined\n >(undefined);\n const definedEntries = new Map<\n LayoutResourceKey<Resources>,\n ScopedComponentEntry\n >();\n\n for (const [key, entry] of Object.entries(\n componentOptions.resources ?? {},\n )) {\n const resource = key as LayoutResourceKey<Resources>;\n\n if (!selectedResources.has(resource)) {\n throw new LayoutConfigurationError(\n `Resource \"${key}\" is not available in this scoped component`,\n );\n }\n\n definedEntries.set(resource, entry);\n }\n\n /** Resolved scoped components, per resource. */\n const resourceScopedComponents = new Map<\n LayoutResourceKey<Resources>,\n Record<string, (props?: never) => JSX.Element>\n >();\n const contextResources = new Map<string, LayoutResourceKey<Resources>>();\n const renderContext: Record<string, (props: never) => JSX.Element> =\n Object.fromEntries(\n [...definedEntries].map(([resource, entry]) => {\n const contextKey = capitalize(resource);\n\n if (contextKey === 'Root') {\n throw new LayoutConfigurationError(\n `Resource \"${resource}\" maps to the reserved render context key \"Root\"`,\n );\n }\n\n const existingResource = contextResources.get(contextKey);\n\n if (existingResource !== undefined) {\n throw new LayoutConfigurationError(\n `Resources \"${existingResource}\" and \"${resource}\" both map to render context key \"${contextKey}\"`,\n );\n }\n\n contextResources.set(contextKey, resource);\n\n /**\n * Built once per resource so every scoped component keeps a stable\n * identity, and shared by the resource render, the render context,\n * and any component bound through `asHOF()`.\n */\n const scopedComponents: Record<\n string,\n (props?: never) => JSX.Element\n > = {};\n\n for (const [name, definition] of Object.entries(\n entry.components ?? {},\n )) {\n if (reservedScopedComponentNames.has(name)) {\n throw new LayoutConfigurationError(\n `Scoped component \"${name}\" for resource \"${resource}\" uses a reserved name`,\n );\n }\n\n const ownPropDefinitions = definition.props ?? {};\n // Last call-site own-props / returned component for this scoped\n // entry. Compound statics re-run `render` with these so\n // `<DataTable variant=\"b\" />` then `<DataTable.Loading />` sees \"b\".\n let cachedOwnProps: Record<string, unknown> = {};\n let cachedReturnedComponent:\n | ComponentType<Record<string, unknown>>\n | undefined;\n\n function ScopedComponent(ownProps?: Record<string, unknown>) {\n const componentProps = useContext(componentPropsContext);\n\n if (componentProps === undefined) {\n throw new LayoutConfigurationError(\n `Scoped component \"${name}\" must be rendered inside its scoped component`,\n );\n }\n\n const resolvedOwnProps = ownProps ?? {};\n cachedOwnProps = resolvedOwnProps;\n\n validateProps(ownPropDefinitions, resolvedOwnProps, {\n layoutName:\n entry.name ??\n defaultNames.get(resource) ??\n capitalize(resource),\n resource,\n });\n\n // Mount a returned component type with call-site props; pass\n // nodes (elements, portals, null) through unchanged.\n const result = definition.render(\n { ...componentProps, ...resolvedOwnProps, resource },\n scopedComponents,\n );\n\n if (isRenderableComponentType(result)) {\n cachedReturnedComponent = result as ComponentType<\n Record<string, unknown>\n >;\n }\n\n return resolveScopedRenderResult(result, resolvedOwnProps);\n }\n\n // Types expose compound statics from the returned component\n // (`DataTable.Loading`); attach matching runtime wrappers.\n scopedComponents[name] = withScopedCompoundStatics(\n ScopedComponent,\n (staticName) => {\n function CompoundStatic(ownProps?: Record<string, unknown>) {\n const componentProps = useContext(componentPropsContext);\n\n if (componentProps === undefined) {\n throw new LayoutConfigurationError(\n `Scoped component \"${name}.${staticName}\" must be rendered inside its scoped component`,\n );\n }\n\n // Prefer the component from the last parent call (same\n // closure as that call's own-props). Fall back to re-running\n // render with cached parent props when needed.\n let result: unknown = cachedReturnedComponent;\n\n if (!isRenderableComponentType(result)) {\n result = definition.render(\n {\n ...componentProps,\n ...cachedOwnProps,\n resource,\n },\n scopedComponents,\n );\n }\n\n if (!isRenderableComponentType(result)) {\n throw new LayoutConfigurationError(\n `Scoped component \"${name}\" must return a component type to use static \"${staticName}\"`,\n );\n }\n\n const staticComponent = (\n result as ComponentType<Record<string, unknown>> &\n Record<string, unknown>\n )[staticName];\n\n if (!isRenderableComponentType(staticComponent)) {\n throw new LayoutConfigurationError(\n `Scoped component \"${name}\" has no component static \"${staticName}\"`,\n );\n }\n\n // Loading's props — those mount the static itself.\n return createElement(staticComponent, ownProps ?? {});\n }\n\n CompoundStatic.displayName = `${name}.${staticName}`;\n return CompoundStatic;\n },\n ) as (props?: never) => JSX.Element;\n }\n\n resourceScopedComponents.set(resource, scopedComponents);\n\n function ResourceRender(ownProps?: Record<string, unknown>) {\n const componentProps = useContext(componentPropsContext);\n\n if (componentProps === undefined) {\n throw new LayoutConfigurationError(\n `Render context component \"${contextKey}\" must be rendered inside its scoped component`,\n );\n }\n\n // Call-site props on `context.Users({ title, heading })` merge into\n // the resource render props and mount a returned component type.\n const callProps = { ...componentProps, ...ownProps, resource };\n return resolveScopedRenderResult(\n entry.render(callProps, scopedComponents),\n ownProps,\n );\n }\n\n return [\n contextKey,\n Object.assign(ResourceRender, scopedComponents),\n ];\n }),\n );\n\n /**\n * Layouts are created once per resource and cached. Creating one during\n * render would hand React a new component type on every pass, remounting\n * the whole subtree.\n */\n const roots = new Map<\n LayoutResourceKey<Resources>,\n (props: Record<string, unknown>) => JSX.Element\n >();\n\n function Root(rootProps: Record<string, unknown>) {\n const componentProps = useContext(componentPropsContext);\n\n if (componentProps === undefined) {\n throw new LayoutConfigurationError(\n 'Render context component \"Root\" must be rendered inside its scoped component',\n );\n }\n\n const resource =\n componentProps.resource as LayoutResourceKey<Resources>;\n let root = roots.get(resource);\n\n if (root === undefined) {\n const entry = definedEntries.get(resource);\n\n if (entry === undefined) {\n throw new LayoutConfigurationError(\n `Render context component \"Root\" requires a \"resources.${resource}\" entry to build the layout for resource \"${resource}\"`,\n );\n }\n\n // Layout option values come from the outer component call site\n // (`<Directory title=\"…\" />`), not from the resource entry.\n const availableDefinitions =\n getComponentPropDefinitions(resource);\n const layoutOptions: Record<string, unknown> = {};\n const defined = entry.props?.defined ?? {};\n\n for (const key of Object.keys(availableDefinitions)) {\n if (key in defined) {\n layoutOptions[key] = defined[key];\n }\n\n const capitalized = capitalize(key);\n if (capitalized in defined) {\n layoutOptions[capitalized] = defined[capitalized];\n }\n\n if (key in componentProps) {\n layoutOptions[key] = componentProps[key];\n }\n\n if (capitalized in componentProps) {\n layoutOptions[capitalized] = componentProps[capitalized];\n }\n }\n\n root = scopedCreateResourceLayout({\n ...layoutOptions,\n name:\n entry.name ??\n defaultNames.get(resource) ??\n capitalize(resource),\n resource,\n }) as (props: Record<string, unknown>) => JSX.Element;\n roots.set(resource, root);\n }\n\n const entry = definedEntries.get(resource);\n const definedCustom: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(\n entry?.props?.defined ?? {},\n )) {\n if (key in custom) {\n definedCustom[key] = value;\n }\n }\n\n return createElement(root, { ...definedCustom, ...rootProps });\n }\n\n renderContext.Root = Root;\n\n function Component(componentProps: Record<string, unknown>) {\n const componentResource =\n componentProps.resource as LayoutResourceKey<Resources>;\n\n if (!selectedResources.has(componentResource)) {\n throw new LayoutConfigurationError(\n `Resource \"${componentResource}\" is not available in this scoped component`,\n );\n }\n\n const defined =\n definedEntries.get(componentResource)?.props?.defined ?? {};\n const resolvedComponentProps = { ...defined, ...componentProps };\n const availableDefinitions =\n getComponentPropDefinitions(componentResource);\n const definitionsToValidate: Record<string, AnyBuiltPropDefinition> =\n {};\n\n for (const [key, inclusion] of Object.entries(include)) {\n const definition = availableDefinitions[key];\n\n if (!definition) {\n continue;\n }\n\n // Keep declared keys as-is — do not capitalize JSX.Element props.\n if (inclusion === true || key in resolvedComponentProps) {\n definitionsToValidate[key] = definition;\n }\n }\n\n for (const [key, definition] of Object.entries(custom)) {\n if (key === 'children' || key === 'resource') {\n continue;\n }\n\n definitionsToValidate[key] = definition;\n }\n\n validateProps(definitionsToValidate, resolvedComponentProps, {\n layoutName:\n definedEntries.get(componentResource)?.name ??\n defaultNames.get(componentResource) ??\n capitalize(componentResource),\n resource: componentResource,\n });\n\n // Top-level render may return a component type; mount it with the full\n // component props (include/custom + inferred return-type props).\n return createElement(\n componentPropsContext.Provider,\n { value: resolvedComponentProps },\n resolveScopedRenderResult(\n componentOptions.render(resolvedComponentProps, renderContext),\n resolvedComponentProps,\n ),\n );\n }\n\n /**\n * Bound components are created once per resource and cached. Returning a\n * fresh component from the factory would hand React a new component type\n * whenever the caller rebinds, remounting the subtree.\n */\n const boundComponents = new Map<\n LayoutResourceKey<Resources>,\n (props: Record<string, unknown>) => JSX.Element\n >();\n\n function bindResource(resource: LayoutResourceKey<Resources>) {\n if (!selectedResources.has(resource)) {\n throw new LayoutConfigurationError(\n `Resource \"${resource}\" is not available in this scoped component`,\n );\n }\n\n let boundComponent = boundComponents.get(resource);\n\n if (boundComponent === undefined) {\n boundComponent = Object.assign(\n (boundProps: Record<string, unknown>) =>\n createElement(Component, { ...boundProps, resource }),\n {\n displayName: `ScopedResourceComponent(${resource})`,\n props: undefined,\n resource: undefined,\n },\n resourceScopedComponents.get(resource) ?? {},\n );\n boundComponents.set(resource, boundComponent);\n }\n\n return boundComponent;\n }\n\n function asHOF() {\n return bindResource;\n }\n\n return Object.assign(Component, {\n asHOF,\n displayName: 'ScopedResourceComponent',\n props: undefined,\n });\n }\n\n function createComponentSetProps(baseProps: CreateComponentPropsBag) {\n function createWithProps(componentOptions: {\n props?: CreateComponentPropsBag;\n resources?: Record<string, ScopedComponentEntry>;\n render: (\n props: Record<string, unknown>,\n context: Record<string, (props: never) => JSX.Element>,\n ) => ScopedRenderResult;\n }) {\n return createComponent({\n ...componentOptions,\n props: mergeCreateComponentProps(baseProps, componentOptions.props),\n });\n }\n\n createWithProps.createResourceComponents = createResourceComponents;\n\n return createWithProps;\n }\n\n function createResourceComponents(options: {\n resource: LayoutResourceKey<Resources>;\n props?: CreateComponentPropsBag;\n name?: string;\n components?: Record<string, ScopedResourceScopedComponentDefinition>;\n render: ScopedComponentRenderFn;\n }) {\n const { resource, props, ...entry } = options;\n\n if (\n !resourceOptions.some(\n (resourceOption) => resourceOption.resource === resource,\n )\n ) {\n throw new LayoutConfigurationError(\n `Resource \"${resource}\" is not available in this scoped component`,\n );\n }\n\n return { ...entry, props: props ?? {} };\n }\n\n Object.assign(createComponent, {\n setProps: createComponentSetProps,\n });\n\n const scopedExtras: {\n createComponent: typeof createComponent;\n createResourceComponents: typeof createResourceComponents;\n forResource: typeof scopedForResource;\n makeComposable?: (options: Record<string, unknown>) => unknown;\n resources: undefined;\n } = {\n createComponent,\n createResourceComponents,\n forResource: scopedForResource,\n resources: undefined,\n };\n\n if (createMakeComposableLayout) {\n const makeComposableLayout = createMakeComposableLayout();\n\n scopedExtras.makeComposable = (options) => {\n const resource = options.resource as LayoutResourceKey<Resources>;\n\n return makeComposableLayout({\n ...options,\n name: options.name ?? defaultNames.get(resource),\n });\n };\n }\n\n return Object.assign(scopedCreateResourceLayout, scopedExtras);\n }) as unknown as CreateResourceLayoutForResourcesFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n >;\n}\n"],"mappings":"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"}
@@ -5,6 +5,6 @@ import { CreateGetComponentForPath, GetComponentForPath, GetComponentForPathApi,
5
5
  import { ForPaths, ForPathsRenderContext, RenderedPathComponent, RenderedPathComponentHOF, TargetPathBuilder } from "./for-paths/builder.cjs";
6
6
  import { IsSubResourceKey, IsSubResourceKeyOptions, IsSubResourceKeyResult } from "./is-sub-resource-key.cjs";
7
7
  import { ComponentTypes, CreateResourceConfigFn, CreatedResourceConfig, GetComponent, GetComponentAtBound, GetComponentForResource, GetComponentForResourceOptions, GetComponentOptions, GetComponentOptionsForResource, ResourceConfigPath, ResourceFromGetComponentBound, SubResourceFromGetComponentBound, ValidateForResourceBound } from "./get-component.cjs";
8
- import { CreateResourceLinkConfig, CreateResourceLinkGroupInput, CreateResourceLinkGroupOptions, CreateResourceLinkOptions, CreateResourceLinksFn, CreateResourceLinksWithGroups, CreateResourceLinksWithGroupsFn, CreatedResourceHref, CreatedResourceLink, CreatedResourceLinkBase, InferHashFromResourceLinkHref, ResourceAnchorLinkFn, ResourceLinkHref } from "./create-resource-links.cjs";
8
+ import { CreateResourceLinkConfig, CreateResourceLinkGroupInput, CreateResourceLinkGroupOptions, CreateResourceLinkOptions, CreateResourceLinksFn, CreateResourceLinksWithGroups, CreateResourceLinksWithGroupsFn, CreateResourceMap, CreateResourceMapFn, CreatedResourceHref, CreatedResourceLink, CreatedResourceLinkBase, InferHashFromResourceLinkHref, ResourceAnchorLinkFn, ResourceLinkHref } from "./create-resource-links.cjs";
9
9
  import { CreateResourceLayoutFn, CreateResourceLayoutMakeComposableOptions, CreateResourceLayoutWithLayoutOptions, DefineResourceLayout, DefineResourceLayoutFn, DefineResourceLayoutForResources, DefineResourceLayoutForResourcesFactory, DefineResourceLayoutWithLayoutFn, DefineResourcesFn, DefinedResourceLayoutWithShell, LayoutRenderResourcesAccessor, LayoutResourcesAccessor, ResourceLayoutShellComponent, ResourceLayoutShellProps, ResourceSelection, ShellLayoutDefinition, ShellRenderContext, defineResourceLayout } from "./define-layout.cjs";
10
10
  import { ResourceLayoutShellPublisher } from "./shell-context.cjs";
@@ -5,6 +5,6 @@ import { CreateGetComponentForPath, GetComponentForPath, GetComponentForPathApi,
5
5
  import { ForPaths, ForPathsRenderContext, RenderedPathComponent, RenderedPathComponentHOF, TargetPathBuilder } from "./for-paths/builder.mjs";
6
6
  import { IsSubResourceKey, IsSubResourceKeyOptions, IsSubResourceKeyResult } from "./is-sub-resource-key.mjs";
7
7
  import { ComponentTypes, CreateResourceConfigFn, CreatedResourceConfig, GetComponent, GetComponentAtBound, GetComponentForResource, GetComponentForResourceOptions, GetComponentOptions, GetComponentOptionsForResource, ResourceConfigPath, ResourceFromGetComponentBound, SubResourceFromGetComponentBound, ValidateForResourceBound } from "./get-component.mjs";
8
- import { CreateResourceLinkConfig, CreateResourceLinkGroupInput, CreateResourceLinkGroupOptions, CreateResourceLinkOptions, CreateResourceLinksFn, CreateResourceLinksWithGroups, CreateResourceLinksWithGroupsFn, CreatedResourceHref, CreatedResourceLink, CreatedResourceLinkBase, InferHashFromResourceLinkHref, ResourceAnchorLinkFn, ResourceLinkHref } from "./create-resource-links.mjs";
8
+ import { CreateResourceLinkConfig, CreateResourceLinkGroupInput, CreateResourceLinkGroupOptions, CreateResourceLinkOptions, CreateResourceLinksFn, CreateResourceLinksWithGroups, CreateResourceLinksWithGroupsFn, CreateResourceMap, CreateResourceMapFn, CreatedResourceHref, CreatedResourceLink, CreatedResourceLinkBase, InferHashFromResourceLinkHref, ResourceAnchorLinkFn, ResourceLinkHref } from "./create-resource-links.mjs";
9
9
  import { CreateResourceLayoutFn, CreateResourceLayoutMakeComposableOptions, CreateResourceLayoutWithLayoutOptions, DefineResourceLayout, DefineResourceLayoutFn, DefineResourceLayoutForResources, DefineResourceLayoutForResourcesFactory, DefineResourceLayoutWithLayoutFn, DefineResourcesFn, DefinedResourceLayoutWithShell, LayoutRenderResourcesAccessor, LayoutResourcesAccessor, ResourceLayoutShellComponent, ResourceLayoutShellProps, ResourceSelection, ShellLayoutDefinition, ShellRenderContext, defineResourceLayout } from "./define-layout.mjs";
10
10
  import { ResourceLayoutShellPublisher } from "./shell-context.mjs";
@@ -1,19 +1,27 @@
1
1
  const require_react_layout_error = require('./react-layout-error.cjs');
2
+ let arktype = require("arktype");
2
3
 
3
4
  //#region src/errors/invalid-component.ts
4
- const scope = "component";
5
+ const context = (0, arktype.type)({
6
+ component: "unknown",
7
+ "path?": "string",
8
+ "reason?": "string",
9
+ "resource?": "string",
10
+ scope: "'component'",
11
+ "validComponents?": "string[]"
12
+ });
5
13
  /** Thrown when a requested component slot cannot be resolved. */
6
14
  var InvalidComponentError = class extends require_react_layout_error.createReactLayoutError({
7
15
  code: "invalidComponent",
8
- scope
9
- })((scope, { component, path, resource, validComponents, reason }) => {
10
- const quotedComponent = JSON.stringify(component) ?? `"${String(component)}"`;
11
- const locationParts = [path ? `path "${path}"` : void 0, resource ? `resource "${resource}"` : void 0].filter((part) => part !== void 0);
16
+ scope: "component"
17
+ }).defineContext(context).implement(({ context, scope }) => {
18
+ const quotedComponent = JSON.stringify(context.component) ?? `"${String(context.component)}"`;
19
+ const locationParts = [context.path ? `path "${context.path}"` : void 0, context.resource ? `resource "${context.resource}"` : void 0].filter((part) => part !== void 0);
12
20
  const locationMessage = locationParts.length > 0 ? ` for ${locationParts.join(" and ")}` : "";
13
- return `[${scope}]: ${reason ?? `Component slot ${quotedComponent}${locationMessage} is not configured.`}${validComponents && validComponents.length > 0 ? ` Available component slots are ${new Intl.ListFormat("en", {
21
+ return `[${scope}]: ${context.reason ?? `Component slot ${quotedComponent}${locationMessage} is not configured.`}${context.validComponents && context.validComponents.length > 0 ? ` Available component slots are ${new Intl.ListFormat("en", {
14
22
  style: "long",
15
23
  type: "disjunction"
16
- }).format(validComponents)}.` : ""}`;
24
+ }).format(context.validComponents)}.` : ""}`;
17
25
  }) {};
18
26
 
19
27
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"invalid-component.cjs","names":["createReactLayoutError"],"sources":["../../src/errors/invalid-component.ts"],"sourcesContent":["import {\n createReactLayoutError,\n type ReactLayoutErrorContext,\n} from './react-layout-error';\n\nconst scope = 'component' as const;\n\n/** Context describing an invalid or unconfigured component slot. */\nexport interface InvalidComponentContext\n extends ReactLayoutErrorContext<typeof scope> {\n component: unknown;\n path?: string;\n resource?: string;\n validComponents?: readonly string[];\n reason?: string;\n}\n\n/** Thrown when a requested component slot cannot be resolved. */\nexport class InvalidComponentError extends createReactLayoutError(\n { code: 'invalidComponent', scope },\n)(\n (\n scope,\n {\n component,\n path,\n resource,\n validComponents,\n reason,\n }: InvalidComponentContext,\n ) => {\n const quotedComponent =\n JSON.stringify(component) ?? `\"${String(component)}\"`;\n const locationParts = [\n path ? `path \"${path}\"` : undefined,\n resource ? `resource \"${resource}\"` : undefined,\n ].filter((part): part is string => part !== undefined);\n const locationMessage =\n locationParts.length > 0 ? ` for ${locationParts.join(' and ')}` : '';\n const body =\n reason ??\n `Component slot ${quotedComponent}${locationMessage} is not configured.`;\n const validComponentsMessage =\n validComponents && validComponents.length > 0\n ? ` Available component slots are ${new Intl.ListFormat('en', {\n style: 'long',\n type: 'disjunction',\n }).format(validComponents)}.`\n : '';\n\n return `[${scope}]: ${body}${validComponentsMessage}`;\n },\n) {}\n"],"mappings":";;;AAKA,MAAM,QAAQ;;AAad,IAAa,wBAAb,cAA2CA,kDACzC;CAAE,MAAM;CAAoB;AAAM,CACpC,GAEI,OACA,EACE,WACA,MACA,UACA,iBACA,aAEC;CACH,MAAM,kBACJ,KAAK,UAAU,SAAS,KAAK,IAAI,OAAO,SAAS,EAAE;CACrD,MAAM,gBAAgB,CACpB,OAAO,SAAS,KAAK,KAAK,QAC1B,WAAW,aAAa,SAAS,KAAK,MACxC,EAAE,QAAQ,SAAyB,SAAS,MAAS;CACrD,MAAM,kBACJ,cAAc,SAAS,IAAI,QAAQ,cAAc,KAAK,OAAO,MAAM;CAYrE,OAAO,IAAI,MAAM,KAVf,UACA,kBAAkB,kBAAkB,gBAAgB,uBAEpD,mBAAmB,gBAAgB,SAAS,IACxC,kCAAkC,IAAI,KAAK,WAAW,MAAM;EAC1D,OAAO;EACP,MAAM;CACR,CAAC,EAAE,OAAO,eAAe,EAAE,KAC3B;AAGR,CACF,EAAE,CAAC"}
1
+ {"version":3,"file":"invalid-component.cjs","names":["createReactLayoutError"],"sources":["../../src/errors/invalid-component.ts"],"sourcesContent":["import { type } from 'arktype';\nimport { createReactLayoutError } from './react-layout-error';\n\nconst context = type({\n component: 'unknown',\n 'path?': 'string',\n 'reason?': 'string',\n 'resource?': 'string',\n scope: \"'component'\",\n 'validComponents?': 'string[]',\n});\n\nexport type InvalidComponentContext = typeof context.infer;\n\n/** Thrown when a requested component slot cannot be resolved. */\nexport class InvalidComponentError extends createReactLayoutError({\n code: 'invalidComponent',\n scope: 'component',\n})\n .defineContext(context)\n .implement(({ context, scope }) => {\n const quotedComponent =\n JSON.stringify(context.component) ?? `\"${String(context.component)}\"`;\n const locationParts = [\n context.path ? `path \"${context.path}\"` : undefined,\n context.resource ? `resource \"${context.resource}\"` : undefined,\n ].filter((part): part is string => part !== undefined);\n const locationMessage =\n locationParts.length > 0 ? ` for ${locationParts.join(' and ')}` : '';\n const body =\n context.reason ??\n `Component slot ${quotedComponent}${locationMessage} is not configured.`;\n const validComponentsMessage =\n context.validComponents && context.validComponents.length > 0\n ? ` Available component slots are ${new Intl.ListFormat('en', {\n style: 'long',\n type: 'disjunction',\n }).format(context.validComponents)}.`\n : '';\n\n return `[${scope}]: ${body}${validComponentsMessage}`;\n }) {}\n"],"mappings":";;;;AAGA,MAAM,4BAAe;CACnB,WAAW;CACX,SAAS;CACT,WAAW;CACX,aAAa;CACb,OAAO;CACP,oBAAoB;AACtB,CAAC;;AAKD,IAAa,wBAAb,cAA2CA,kDAAuB;CAChE,MAAM;CACN,OAAO;AACT,CAAC,EACE,cAAc,OAAO,EACrB,WAAW,EAAE,SAAS,YAAY;CACjC,MAAM,kBACJ,KAAK,UAAU,QAAQ,SAAS,KAAK,IAAI,OAAO,QAAQ,SAAS,EAAE;CACrE,MAAM,gBAAgB,CACpB,QAAQ,OAAO,SAAS,QAAQ,KAAK,KAAK,QAC1C,QAAQ,WAAW,aAAa,QAAQ,SAAS,KAAK,MACxD,EAAE,QAAQ,SAAyB,SAAS,MAAS;CACrD,MAAM,kBACJ,cAAc,SAAS,IAAI,QAAQ,cAAc,KAAK,OAAO,MAAM;CAYrE,OAAO,IAAI,MAAM,KAVf,QAAQ,UACR,kBAAkB,kBAAkB,gBAAgB,uBAEpD,QAAQ,mBAAmB,QAAQ,gBAAgB,SAAS,IACxD,kCAAkC,IAAI,KAAK,WAAW,MAAM;EAC1D,OAAO;EACP,MAAM;CACR,CAAC,EAAE,OAAO,QAAQ,eAAe,EAAE,KACnC;AAGR,CAAC,EAAE,CAAC"}
@@ -1,16 +1,112 @@
1
- import { CreatedReactLayoutError, ReactLayoutErrorContext } from "./react-layout-error.cjs";
1
+ import { ImplementedErrorClass } from "../node_modules/.pnpm/@jfdevelops_create-error@0.2.0_patch_hash_afc71b16c3f866f54416d30f467784ddc31736feb04f281a5fc4772ea422f4a9/node_modules/@jfdevelops/create-error/dist/types.cjs";
2
2
 
3
3
  //#region src/errors/invalid-component.d.ts
4
- declare const scope: "component";
5
- /** Context describing an invalid or unconfigured component slot. */
6
- interface InvalidComponentContext extends ReactLayoutErrorContext<typeof scope> {
4
+ declare const context: import("arktype/internal/variants/object.ts").ObjectType<{
7
5
  component: unknown;
8
- path?: string;
9
- resource?: string;
10
- validComponents?: readonly string[];
11
- reason?: string;
12
- }
13
- declare const InvalidComponentError_base: CreatedReactLayoutError<"invalidComponent", "component", InvalidComponentContext>;
6
+ scope: "component";
7
+ path?: string | undefined;
8
+ reason?: string | undefined;
9
+ resource?: string | undefined;
10
+ validComponents?: string[] | undefined;
11
+ }, {}>;
12
+ type InvalidComponentContext = typeof context.infer;
13
+ declare const InvalidComponentError_base: ImplementedErrorClass<{
14
+ definition: import("arktype/internal/variants/object.ts").ObjectType<{
15
+ code: string;
16
+ scope: string;
17
+ }, {}>;
18
+ } & {
19
+ data: {
20
+ readonly property: "context";
21
+ readonly resolve: ({
22
+ definition,
23
+ input
24
+ }: import("@jfdevelops/create-error/types").ResolveContext<import("arktype/internal/variants/object.ts").ObjectType<{
25
+ code: string;
26
+ scope: string;
27
+ }, {}>>) => {
28
+ scope: string & import("@jfdevelops/create-error/types").TypeSlot<"definition", "scope">;
29
+ };
30
+ };
31
+ message: ({
32
+ definition,
33
+ data,
34
+ implementation
35
+ }: import("@jfdevelops/create-error/types").BlueprintContext<import("arktype/internal/variants/object.ts").ObjectType<{
36
+ code: string;
37
+ scope: string;
38
+ }, {}>>) => string & import("@jfdevelops/create-error/types").TypeSlot<"implementationArgument", {
39
+ readonly context: import("@jfdevelops/create-error/types").DataSlot;
40
+ readonly scope: string & import("@jfdevelops/create-error/types").TypeSlot<"definition", "scope">;
41
+ }>;
42
+ } & {
43
+ properties(context: import("@jfdevelops/create-error/types").BlueprintContext<import("arktype/internal/variants/object.ts").ObjectType<{
44
+ code: string;
45
+ scope: string;
46
+ }, {}>>): {
47
+ readonly code: string & import("@jfdevelops/create-error/types").TypeSlot<"definition", "code">;
48
+ readonly scope: string & import("@jfdevelops/create-error/types").TypeSlot<"definition", "scope">;
49
+ readonly renderMessage: (renderer?: (scope: string & import("@jfdevelops/create-error/types").TypeSlot<"definition", "scope">, context: import("@jfdevelops/create-error/types").DataSlot) => string) => string;
50
+ };
51
+ } & {
52
+ toJSON(error: import("@jfdevelops/create-error/types").BlueprintErrorTemplate<NoInfer<{
53
+ data: {
54
+ readonly property: "context";
55
+ readonly resolve: ({
56
+ definition,
57
+ input
58
+ }: import("@jfdevelops/create-error/types").ResolveContext<import("arktype/internal/variants/object.ts").ObjectType<{
59
+ code: string;
60
+ scope: string;
61
+ }, {}>>) => {
62
+ scope: string & import("@jfdevelops/create-error/types").TypeSlot<"definition", "scope">;
63
+ };
64
+ };
65
+ message: ({
66
+ definition,
67
+ data,
68
+ implementation
69
+ }: import("@jfdevelops/create-error/types").BlueprintContext<import("arktype/internal/variants/object.ts").ObjectType<{
70
+ code: string;
71
+ scope: string;
72
+ }, {}>>) => string & import("@jfdevelops/create-error/types").TypeSlot<"implementationArgument", {
73
+ readonly context: import("@jfdevelops/create-error/types").DataSlot;
74
+ readonly scope: string & import("@jfdevelops/create-error/types").TypeSlot<"definition", "scope">;
75
+ }>;
76
+ } & {
77
+ properties(context: import("@jfdevelops/create-error/types").BlueprintContext<import("arktype/internal/variants/object.ts").ObjectType<{
78
+ code: string;
79
+ scope: string;
80
+ }, {}>>): {
81
+ readonly code: string & import("@jfdevelops/create-error/types").TypeSlot<"definition", "code">;
82
+ readonly scope: string & import("@jfdevelops/create-error/types").TypeSlot<"definition", "scope">;
83
+ readonly renderMessage: (renderer?: (scope: string & import("@jfdevelops/create-error/types").TypeSlot<"definition", "scope">, context: import("@jfdevelops/create-error/types").DataSlot) => string) => string;
84
+ };
85
+ }>>): {
86
+ name: string;
87
+ code: string & import("@jfdevelops/create-error/types").TypeSlot<"definition", "code">;
88
+ scope: string & import("@jfdevelops/create-error/types").TypeSlot<"definition", "scope">;
89
+ message: string;
90
+ context: unknown;
91
+ };
92
+ }, {
93
+ readonly code: string;
94
+ readonly scope: string;
95
+ }, {
96
+ component: unknown;
97
+ scope: "component";
98
+ path?: string | undefined;
99
+ reason?: string | undefined;
100
+ resource?: string | undefined;
101
+ validComponents?: string[] | undefined;
102
+ }, {
103
+ component: unknown;
104
+ scope: "component";
105
+ path?: string | undefined;
106
+ reason?: string | undefined;
107
+ resource?: string | undefined;
108
+ validComponents?: string[] | undefined;
109
+ }>;
14
110
  /** Thrown when a requested component slot cannot be resolved. */
15
111
  declare class InvalidComponentError extends InvalidComponentError_base {}
16
112
  //#endregion