@jfdevelops/react-layout 0.12.0 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/create-config/for-resources.cjs +20 -11
- package/dist/create-config/for-resources.cjs.map +1 -1
- package/dist/create-config/for-resources.d.cts.map +1 -1
- package/dist/create-config/for-resources.d.mts.map +1 -1
- package/dist/create-config/for-resources.mjs +20 -11
- package/dist/create-config/for-resources.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const require_capitalize = require('../utils/capitalize.cjs');
|
|
2
2
|
let _jfdevelops_react_layout_validator = require("@jfdevelops/react-layout-validator");
|
|
3
|
+
let react = require("react");
|
|
3
4
|
|
|
4
5
|
//#region src/create-config/for-resources.ts
|
|
5
6
|
function createForResources({ createLayoutForResource, createMakeComposableLayout, createResourceLayout, getComponentPropDefinitions }) {
|
|
@@ -32,6 +33,24 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
|
|
|
32
33
|
const include = componentOptions.props?.include ?? {};
|
|
33
34
|
const custom = componentOptions.props?.custom ?? {};
|
|
34
35
|
const selectedResources = new Set(resourceOptions.map(({ resource }) => resource));
|
|
36
|
+
const componentPropsContext = (0, react.createContext)(void 0);
|
|
37
|
+
const contextResources = /* @__PURE__ */ new Map();
|
|
38
|
+
const renderContext = Object.fromEntries(resourceOptions.map(({ resource }) => {
|
|
39
|
+
const contextKey = require_capitalize.capitalize(resource);
|
|
40
|
+
const existingResource = contextResources.get(contextKey);
|
|
41
|
+
if (existingResource !== void 0) throw new Error(`Resources "${existingResource}" and "${resource}" both map to render context key "${contextKey}"`);
|
|
42
|
+
contextResources.set(contextKey, resource);
|
|
43
|
+
const resourceRenderOptions = componentOptions[resource];
|
|
44
|
+
function ResourceRender() {
|
|
45
|
+
const componentProps = (0, react.useContext)(componentPropsContext);
|
|
46
|
+
if (componentProps === void 0) throw new Error(`Render context component "${contextKey}" must be rendered inside its scoped component`);
|
|
47
|
+
return resourceRenderOptions?.render({
|
|
48
|
+
...componentProps,
|
|
49
|
+
resource
|
|
50
|
+
}) ?? null;
|
|
51
|
+
}
|
|
52
|
+
return [contextKey, ResourceRender];
|
|
53
|
+
}));
|
|
35
54
|
function Component(componentProps) {
|
|
36
55
|
const componentResource = componentProps.resource;
|
|
37
56
|
if (!selectedResources.has(componentResource)) throw new Error(`Resource "${componentResource}" is not available in this scoped component`);
|
|
@@ -49,17 +68,7 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
|
|
|
49
68
|
definitionsToValidate[propKey] = definition;
|
|
50
69
|
}
|
|
51
70
|
(0, _jfdevelops_react_layout_validator.validateProps)(definitionsToValidate, componentProps);
|
|
52
|
-
|
|
53
|
-
const resourceRenderOptions = componentOptions[resource];
|
|
54
|
-
function ResourceRender() {
|
|
55
|
-
return resourceRenderOptions?.render({
|
|
56
|
-
...componentProps,
|
|
57
|
-
resource
|
|
58
|
-
}) ?? null;
|
|
59
|
-
}
|
|
60
|
-
return [require_capitalize.capitalize(resource), ResourceRender];
|
|
61
|
-
}));
|
|
62
|
-
return componentOptions.render(componentProps, renderContext);
|
|
71
|
+
return (0, react.createElement)(componentPropsContext.Provider, { value: componentProps }, componentOptions.render(componentProps, renderContext));
|
|
63
72
|
}
|
|
64
73
|
return Object.assign(Component, {
|
|
65
74
|
displayName: "ScopedResourceComponent",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"for-resources.cjs","names":["capitalize"],"sources":["../../src/create-config/for-resources.ts"],"sourcesContent":["import type { JSX, ReactNode } from 'react';\nimport type {\n ComposableComponents,\n ComposableResourceLayout,\n} from '@jfdevelops/react-layout-composables';\nimport {\n type AnyBuiltPropDefinition,\n type ResolveProps,\n validateProps,\n} from '@jfdevelops/react-layout-validator';\nimport type {\n IncludedProps,\n InPropsDefinition,\n InPropsObject,\n MergedLayoutInProps,\n ResolvedIncludedProps,\n} from '../props';\nimport type { LayoutResourceKey, ResourceDefinition } from '../resource';\nimport { capitalize } from '../utils/capitalize';\nimport type { BaseComponent, Show } from '../utils';\nimport type {\n LayoutIncludeProps,\n LayoutPropsForResource,\n ResourceLayoutComponent,\n} from './define-layout';\nimport type {\n CreatedLayoutForResource,\n CreateLayoutForResourceOptions,\n CreateResourceLayoutOptionsBase,\n SetDefaultPropForResourceFn,\n} from './for-resource';\n\ntype CapitalizedResource<Resource extends string> = Resource extends Resource\n ? {\n toLowerCase: () => Lowercase<Capitalize<Resource>>;\n } & Capitalize<Resource>\n : never;\n\ntype ResourceLayoutName<\n Resource extends string,\n Name extends string = string,\n> = Name | ((resource: CapitalizedResource<Resource>) => Name);\n\ntype ResourceLayoutNames<\n Resource extends string,\n CallbackName extends string = string,\n> = {\n [TargetResource in Resource]?:\n | string\n | ((resource: CapitalizedResource<TargetResource>) => CallbackName);\n};\n\ntype AtLeastOneResourceLayoutNameKey<Resource extends string> = {\n [TargetResource in Resource]: Record<TargetResource, unknown> &\n Partial<Record<Exclude<Resource, TargetResource>, unknown>>;\n}[Resource];\n\ntype SelectedResourceLayoutNames<\n Resource extends string,\n SelectedResource extends Resource,\n CallbackName extends string,\n> = {\n [TargetResource in Resource as TargetResource extends SelectedResource\n ? TargetResource\n : never]?:\n | string\n | ((resource: CapitalizedResource<TargetResource>) => CallbackName);\n};\n\ntype ResourcesLayoutName<Resource extends string> =\n | Exclude<ResourceLayoutName<Resource>, string>\n | ResourceLayoutNames<Resource>;\n\ntype ResourceLayoutSelection<\n Resources extends ReadonlyArray<ResourceDefinition>,\n CallbackName extends string = string,\n> = {\n [Resource in LayoutResourceKey<Resources>]?: {\n name?: string | ((resource: CapitalizedResource<Resource>) => CallbackName);\n };\n};\n\ntype AtLeastOneResourceLayoutSelection<\n Resources extends ReadonlyArray<ResourceDefinition>,\n CallbackName extends string,\n> = {\n [Resource in LayoutResourceKey<Resources>]: Required<\n Pick<ResourceLayoutSelection<Resources, CallbackName>, Resource>\n > &\n Omit<ResourceLayoutSelection<Resources, CallbackName>, Resource>;\n}[LayoutResourceKey<Resources>];\n\ntype SelectedLayoutResources<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Arguments extends ReadonlyArray<unknown>,\n> =\n Arguments extends ReadonlyArray<LayoutResourceKey<Resources>>\n ? Arguments[number]\n : Arguments[0] extends {\n resources: ReadonlyArray<infer Resource>;\n }\n ? Resource & LayoutResourceKey<Resources>\n : keyof Arguments[0] & LayoutResourceKey<Resources>;\n\ntype ResolveResourceLayoutName<Name> = Name extends (\n ...args: never[]\n) => infer Result\n ? Result & string\n : Name extends string\n ? Name\n : string;\n\ntype NormalizeCapitalizedResourceName<\n Name extends string,\n Resource extends string,\n> = Name extends Name\n ? NormalizeCapitalizedResourceNameMatch<Name, Resource> extends infer Match\n ? [Match] extends [never]\n ? Name\n : Match\n : never\n : never;\n\ntype NormalizeCapitalizedResourceNameMatch<\n Name extends string,\n Resource extends string,\n> = Resource extends Resource\n ? Name extends `${CapitalizedResource<Resource>}${infer Suffix}`\n ? `${Capitalize<Resource>}${Suffix}`\n : never\n : never;\n\ntype SelectedResourceLayoutName<Arguments, Resource extends string> =\n Arguments extends ReadonlyArray<string>\n ? string\n : Arguments extends readonly [infer Options]\n ? Options extends {\n resources: ReadonlyArray<string>;\n name?: infer Name;\n }\n ? Name extends (...args: never[]) => unknown\n ? ResolveResourceLayoutName<Name>\n : Name extends Record<Resource, infer ResourceName>\n ? ResolveResourceLayoutName<ResourceName>\n : string\n : Options extends Record<Resource, infer ResourceOptions>\n ? ResourceOptions extends { name?: infer Name }\n ? ResolveResourceLayoutName<Name>\n : string\n : string\n : string;\n\ntype NormalizeResourceLayoutNames<Names, CallbackName extends string> = {\n [Resource in keyof Names]: Names[Resource] extends (\n ...args: never[]\n ) => unknown\n ? (\n resource: CapitalizedResource<Resource & string>,\n ) => NormalizeCapitalizedResourceName<CallbackName, Resource & string>\n : Names[Resource];\n};\n\ntype NormalizeResourceLayoutSelection<Selection> = {\n [Resource in keyof Selection]: Selection[Resource] extends {\n name: infer Name;\n }\n ? {\n name: Name extends (...args: never[]) => unknown\n ? (\n resource: CapitalizedResource<Resource & string>,\n ) => NormalizeCapitalizedResourceName<\n ResolveResourceLayoutName<Name>,\n Resource & string\n >\n : Name;\n }\n : Selection[Resource];\n};\n\ntype SharedResourceLayoutArguments<\n Resources extends ReadonlyArray<ResourceDefinition>,\n ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n Name extends string,\n> = readonly [\n {\n resources: ResourceKeys;\n name: (\n resource: CapitalizedResource<ResourceKeys[number]>,\n ) => NormalizeCapitalizedResourceName<Name, ResourceKeys[number]>;\n },\n];\n\ntype MappedResourceLayoutArguments<\n Resources extends ReadonlyArray<ResourceDefinition>,\n ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n Names,\n CallbackName extends string,\n> = readonly [\n {\n resources: ResourceKeys;\n name: NormalizeResourceLayoutNames<Names, CallbackName>;\n },\n];\n\ntype SelectedResourceLayoutArguments<Selection> = readonly [\n NormalizeResourceLayoutSelection<Selection>,\n];\n\ntype HasResourceLayoutName<Arguments, Resource extends string> =\n Arguments extends ReadonlyArray<string>\n ? false\n : Arguments extends readonly [infer Options]\n ? Options extends {\n resources: ReadonlyArray<string>;\n name: infer Name;\n }\n ? Name extends (...args: never[]) => unknown\n ? true\n : Name extends Record<Resource, unknown>\n ? true\n : false\n : Options extends Record<Resource, infer ResourceOptions>\n ? 'name' extends keyof ResourceOptions\n ? true\n : false\n : false\n : false;\n\ntype ScopedCreateResourceLayoutOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n Name extends string,\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Props extends InPropsObject,\n> = LayoutPropsForResource<Resources, InProps, Composables> & {\n resource: Resource;\n props?: Props;\n} & (HasResourceLayoutName<Arguments, Resource> extends true\n ? { name?: Name }\n : { name: Name });\n\ntype ScopedCreateResourceLayoutFnImpl<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n CustomProps extends InPropsObject,\n> = <\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Name extends string = SelectedResourceLayoutName<Arguments, Resource>,\n Props extends InPropsObject = {},\n>(\n options: ScopedCreateResourceLayoutOptions<\n Resources,\n InProps,\n Composables,\n Arguments,\n Name,\n Resource,\n Props\n >,\n) => ResourceLayoutComponent<Name, CustomProps, Composables, Resource>;\n\ntype ScopedCreateLayoutForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n CustomProps extends InPropsObject,\n> = <\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Name extends string = SelectedResourceLayoutName<Arguments, Resource>,\n>(\n options: CreateLayoutForResourceOptions<Resources, Name, Resource>,\n) => CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n> & {\n setDefaults: SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n >;\n};\n\ntype ScopedCreateResourceLayoutMakeComposableFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n> = <\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Name extends string = SelectedResourceLayoutName<Arguments, Resource>,\n Props extends InPropsObject = {},\n>(\n options: Omit<\n CreateResourceLayoutOptionsBase<Resources, Name, Resource>,\n 'name'\n > &\n Partial<LayoutPropsForResource<Resources, InProps, Composables>> & {\n props?: Props;\n } & (HasResourceLayoutName<Arguments, Resource> extends true\n ? { name?: Name }\n : { name: Name }),\n) => ComposableResourceLayout<Composables, Name, any, any, any>;\n\ntype ScopedComponentAvailableProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n LayoutCustomProps extends InPropsObject,\n> = MergedLayoutInProps<Resources, InProps, Composables> & LayoutCustomProps;\n\ntype ScopedResourceComponentProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n LayoutCustomProps extends InPropsObject,\n ComponentIncludeProps extends IncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >\n >,\n ComponentCustomProps extends InPropsObject,\n Resource extends string,\n> = Show<\n Omit<\n ResolvedIncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >,\n ComponentIncludeProps\n > &\n ResolveProps<ComponentCustomProps>,\n 'children' | 'resource'\n > & {\n children?: ReactNode;\n resource: Resource;\n }\n>;\n\ntype ScopedTargetResourceComponent<Resource extends string> = {\n (props: any): JSX.Element;\n readonly resource: Resource;\n};\n\ntype ScopedResourceComponentRenderOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n LayoutCustomProps extends InPropsObject,\n ComponentIncludeProps extends IncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >\n >,\n ComponentCustomProps extends InPropsObject,\n> = {\n [Resource in SelectedLayoutResources<Resources, Arguments>]?: {\n render: (\n props: ScopedResourceComponentProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps,\n Resource\n >,\n ) => JSX.Element;\n };\n};\n\ntype ScopedResourceComponentRenderContext<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Arguments extends ReadonlyArray<unknown>,\n> = {\n [Resource in SelectedLayoutResources<Resources, Arguments> as Capitalize<\n Resource\n >]: () => JSX.Element;\n};\n\ntype ScopedResourceComponent<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n LayoutCustomProps extends InPropsObject,\n ComponentIncludeProps extends IncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >\n >,\n ComponentCustomProps extends InPropsObject,\n> = BaseComponent<\n string,\n ScopedResourceComponentProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps,\n SelectedLayoutResources<Resources, Arguments>\n >\n> & {\n <\n const ResourceComponent extends ScopedTargetResourceComponent<\n SelectedLayoutResources<Resources, Arguments>\n > = ScopedTargetResourceComponent<\n SelectedLayoutResources<Resources, Arguments>\n >,\n >(\n props: ScopedResourceComponentProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps,\n ResourceComponent['resource']\n >,\n ): JSX.Element;\n};\n\ntype ScopedCreateComponent<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n LayoutCustomProps extends InPropsObject,\n> = <\n const ComponentIncludeProps extends IncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >\n > = {},\n ComponentCustomProps extends InPropsObject = {},\n>(options: {\n props?: {\n /** Props from the resource layout definition to expose to the component. */\n include?: ComponentIncludeProps;\n /** Additional props accepted by the component. */\n custom?: ComponentCustomProps;\n };\n /**\n * Renders the scoped component. `children` and `resource` are always\n * available. The context contains capitalized components for the selected\n * resources.\n */\n render: (\n props: ScopedResourceComponentProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps,\n SelectedLayoutResources<Resources, Arguments>\n >,\n context: ScopedResourceComponentRenderContext<Resources, Arguments>,\n ) => JSX.Element;\n} &\n ScopedResourceComponentRenderOptions<\n Resources,\n InProps,\n Composables,\n Arguments,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps\n >) => ScopedResourceComponent<\n Resources,\n InProps,\n Composables,\n Arguments,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps\n>;\n\ntype ScopedCreateResourceLayoutFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n CustomProps extends InPropsObject,\n> = ScopedCreateResourceLayoutFnImpl<\n Resources,\n InProps,\n Composables,\n Arguments,\n CustomProps\n> & {\n /**\n * Creates a component shared by the target resources. Included layout props\n * become component props, and `children` is always available as an optional\n * prop in both the render callback and at the call site.\n *\n * @example\n * const Directory = createDirectoryLayout.createComponent({\n * props: { include: { title: true, actions: 'optional' } },\n * users: {\n * render: ({ resource }) => <span>{resource}</span>,\n * },\n * render: ({ actions, children, resource, title }, context) => {\n * const ResourceRender = context.Users\n *\n * return (\n * <Page resource={resource} title={title} actions={actions}>\n * {children}\n * <ResourceRender />\n * </Page>\n * )\n * },\n * })\n *\n * <Directory<typeof UsersPage> resource='users' title='Users' />\n *\n * @param options The props configuration and component render function.\n * @returns A component scoped to the selected resources.\n */\n createComponent: ScopedCreateComponent<\n Resources,\n InProps,\n Composables,\n Arguments,\n CustomProps\n >;\n forResource: ScopedCreateLayoutForResource<\n Resources,\n InProps,\n Composables,\n Arguments,\n CustomProps\n >;\n /**\n * Type-only property containing the target resource union. This property is\n * `undefined` at runtime and exists solely for extracting the scoped type.\n *\n * @example\n * type AccountResource = typeof createAccountLayout.resources;\n */\n readonly resources: SelectedLayoutResources<Resources, Arguments>;\n} & ([keyof Composables] extends [never]\n ? {}\n : {\n makeComposable: ScopedCreateResourceLayoutMakeComposableFn<\n Resources,\n InProps,\n Composables,\n Arguments\n >;\n });\n\nexport type CreateResourceLayoutForResourcesFn<\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 /**\n * Creates a layout factory scoped to the listed resources.\n *\n * Layout names must be supplied when a layout is created.\n *\n * @example\n * createResourceLayout.forResources('users', 'admins')\n *\n * @param resources Resources available from the returned layout factory.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends readonly [\n LayoutResourceKey<Resources>,\n ...Array<LayoutResourceKey<Resources>>,\n ],\n >(\n ...resources: ResourceKeys\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n ResourceKeys,\n CustomProps\n >;\n\n /**\n * Creates a layout factory scoped to a resource list without default names.\n *\n * @example\n * createResourceLayout.forResources({ resources: ['users', 'admins'] })\n *\n * @param options The resources to expose without configured default names.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n >(options: {\n resources: ResourceKeys;\n name?: never;\n }): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n readonly [{ resources: ResourceKeys }],\n CustomProps\n >;\n\n /**\n * Creates a scoped layout factory with optional default names per resource.\n *\n * Each map key is limited to the resources selected in `resources`. Values\n * can be strings or callbacks receiving that resource's capitalized name.\n *\n * @example\n * createResourceLayout.forResources({\n * resources: ['users', 'admins'],\n * name: {\n * users: resource => `${resource}Page`,\n * admins: 'AdminDirectory',\n * },\n * })\n *\n * @param options The selected resources and their optional default names.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n const CallbackName extends string,\n const Names,\n >(\n options: {\n resources: ResourceKeys;\n name: SelectedResourceLayoutNames<\n LayoutResourceKey<Resources>,\n NoInfer<ResourceKeys[number]>,\n CallbackName\n > &\n AtLeastOneResourceLayoutNameKey<NoInfer<ResourceKeys[number]>> &\n Record<\n string,\n NonNullable<\n ResourceLayoutNames<\n LayoutResourceKey<Resources>,\n CallbackName\n >[LayoutResourceKey<Resources>]\n >\n >;\n } & {\n name: Names & Record<Exclude<keyof Names, ResourceKeys[number]>, never>;\n },\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n MappedResourceLayoutArguments<Resources, ResourceKeys, Names, CallbackName>,\n CustomProps\n >;\n\n /**\n * Creates a scoped layout factory with one default-name callback shared by\n * every selected resource. The callback receives a capitalized resource\n * whose `toLowerCase()` result retains the corresponding literal type.\n *\n * @example\n * createResourceLayout.forResources({\n * resources: ['users', 'admins'],\n * name: resource => `${resource}Page`,\n * })\n *\n * @param options The selected resources and shared default-name callback.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n const Name extends string,\n >(\n options: {\n resources: ReadonlyArray<LayoutResourceKey<Resources>>;\n name: (resource: CapitalizedResource<ResourceKeys[number]>) => Name;\n } & { resources: ResourceKeys },\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n SharedResourceLayoutArguments<Resources, ResourceKeys, Name>,\n CustomProps\n >;\n\n /**\n * Creates a scoped layout factory from a resource-keyed configuration.\n * Only configured resources are available from the returned factory.\n *\n * @example\n * createResourceLayout.forResources({\n * users: { name: resource => `${resource}Page` },\n * admins: { name: 'AdminDirectory' },\n * })\n *\n * @param options Resource-keyed layout defaults.\n * @returns A layout factory scoped to the configured resources.\n */\n <\n const CallbackName extends string,\n const Selection extends ResourceLayoutSelection<Resources, CallbackName>,\n >(\n options: Selection &\n AtLeastOneResourceLayoutSelection<Resources, CallbackName> &\n Partial<\n Record<Exclude<'resources', LayoutResourceKey<Resources>>, never>\n > &\n Record<Exclude<keyof Selection, LayoutResourceKey<Resources>>, never>,\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n SelectedResourceLayoutArguments<Selection>,\n CustomProps\n >;\n};\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 function createComponent(componentOptions: {\n [resource: string]: unknown;\n props?: {\n include?: Record<string, true | 'optional'>;\n custom?: Record<string, AnyBuiltPropDefinition>;\n };\n render: (\n props: Record<string, unknown>,\n context: Record<string, () => JSX.Element>,\n ) => JSX.Element;\n }) {\n const include = componentOptions.props?.include ?? {};\n const custom = componentOptions.props?.custom ?? {};\n const selectedResources = new Set(\n resourceOptions.map(({ resource }) => resource),\n );\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 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 const propKey =\n 'type' in definition && definition.type === 'JSX.Element'\n ? capitalize(key)\n : key;\n\n if (inclusion === true || propKey in componentProps) {\n definitionsToValidate[propKey] = definition;\n }\n }\n\n for (const [key, definition] of Object.entries(custom)) {\n if (key === 'children' || key === 'resource') {\n continue;\n }\n\n const propKey =\n 'type' in definition && definition.type === 'JSX.Element'\n ? capitalize(key)\n : key;\n definitionsToValidate[propKey] = definition;\n }\n\n validateProps(definitionsToValidate, componentProps);\n\n const renderContext = Object.fromEntries(\n resourceOptions.map(({ resource }) => {\n const resourceRenderOptions = componentOptions[resource] as\n | {\n render: (props: Record<string, unknown>) => JSX.Element;\n }\n | undefined;\n\n function ResourceRender() {\n return resourceRenderOptions?.render({\n ...componentProps,\n resource,\n }) ?? (null as unknown as JSX.Element);\n }\n\n return [capitalize(resource), ResourceRender];\n }),\n );\n\n return componentOptions.render(componentProps, renderContext);\n }\n\n return Object.assign(Component, {\n displayName: 'ScopedResourceComponent',\n props: undefined,\n });\n }\n\n const scopedExtras: {\n createComponent: typeof createComponent;\n forResource: typeof scopedForResource;\n makeComposable?: (options: Record<string, unknown>) => unknown;\n resources: undefined;\n } = {\n createComponent,\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":";;;;AA4vBA,SAAgB,mBAMd,EACA,yBACA,4BACA,sBACA,+BACuC;CACvC,SAAS,GAAG,uBAAuC;EACjD,MAAM,gBAAgB,mBAAmB;EACzC,IAAI;EASJ,IAAI,OAAO,kBAAkB,UAC3B,kBAAkB,mBAAmB,KAAK,cAAc,EAC5C,SACZ,EAAE;OACG,IACL,kBAAkB,QAClB,OAAO,kBAAkB,YACzB,eAAe,iBACf,MAAM,QAAQ,cAAc,SAAS,GACrC;GACA,MAAM,EAAE,MAAM,cAAc;GAI5B,kBAAkB,UAAU,KAAK,cAAc;IAC7C,MAAM,OAAO,SAAS,aAAa,OAAO,OAAO;IACjD;GACF,EAAE;EACJ,OACE,kBAAkB,OAAO,QAAQ,iBAAiB,CAAC,CAAC,EAAE,KACnD,CAAC,UAAU,cAAc;GACxB,GAAI;GAOM;EACZ,EACF;EAGF,MAAM,eAAe,IAAI,IACvB,gBAAgB,KAAK,EAAE,MAAM,eAAe,CAC1C,UACA,OAAO,SAAS,aACZ,KACEA,8BAAW,QAAQ,CAGrB,IACA,IACN,CAAC,CACH;EAEA,SAAS,2BAA2B,SAAkC;GACpE,MAAM,WAAW,QAAQ;GAEzB,OAAO,qBAAqB;IAC1B,GAAG;IACH,MAAM,QAAQ,QAAQ,aAAa,IAAI,QAAQ;GACjD,CAAC;EACH;EAEA,SAAS,kBAAkB,SAGxB;GACD,OAAO,wBACL,QAAQ,QAAQ,aAAa,IAAI,QAAQ,QAAQ,GACjD,QAAQ,QACV;EACF;EAEA,SAAS,gBAAgB,kBAUtB;GACD,MAAM,UAAU,iBAAiB,OAAO,WAAW,CAAC;GACpD,MAAM,SAAS,iBAAiB,OAAO,UAAU,CAAC;GAClD,MAAM,oBAAoB,IAAI,IAC5B,gBAAgB,KAAK,EAAE,eAAe,QAAQ,CAChD;GAEA,SAAS,UAAU,gBAAyC;IAC1D,MAAM,oBACJ,eAAe;IAEjB,IAAI,CAAC,kBAAkB,IAAI,iBAAiB,GAC1C,MAAM,IAAI,MACR,aAAa,kBAAkB,4CACjC;IAGF,MAAM,uBACJ,4BAA4B,iBAAiB;IAC/C,MAAM,wBACJ,CAAC;IAEH,KAAK,MAAM,CAAC,KAAK,cAAc,OAAO,QAAQ,OAAO,GAAG;KACtD,MAAM,aAAa,qBAAqB;KAExC,IAAI,CAAC,YACH;KAGF,MAAM,UACJ,UAAU,cAAc,WAAW,SAAS,gBACxCA,8BAAW,GAAG,IACd;KAEN,IAAI,cAAc,QAAQ,WAAW,gBACnC,sBAAsB,WAAW;IAErC;IAEA,KAAK,MAAM,CAAC,KAAK,eAAe,OAAO,QAAQ,MAAM,GAAG;KACtD,IAAI,QAAQ,cAAc,QAAQ,YAChC;KAGF,MAAM,UACJ,UAAU,cAAc,WAAW,SAAS,gBACxCA,8BAAW,GAAG,IACd;KACN,sBAAsB,WAAW;IACnC;IAEA,sDAAc,uBAAuB,cAAc;IAEnD,MAAM,gBAAgB,OAAO,YAC3B,gBAAgB,KAAK,EAAE,eAAe;KACpC,MAAM,wBAAwB,iBAAiB;KAM/C,SAAS,iBAAiB;MACxB,OAAO,uBAAuB,OAAO;OACnC,GAAG;OACH;MACF,CAAC,KAAM;KACT;KAEA,OAAO,CAACA,8BAAW,QAAQ,GAAG,cAAc;IAC9C,CAAC,CACH;IAEA,OAAO,iBAAiB,OAAO,gBAAgB,aAAa;GAC9D;GAEA,OAAO,OAAO,OAAO,WAAW;IAC9B,aAAa;IACb,OAAO;GACT,CAAC;EACH;EAEA,MAAM,eAKF;GACF;GACA,aAAa;GACb,WAAW;EACb;EAEA,IAAI,4BAA4B;GAC9B,MAAM,uBAAuB,2BAA2B;GAExD,aAAa,kBAAkB,YAAY;IACzC,MAAM,WAAW,QAAQ;IAEzB,OAAO,qBAAqB;KAC1B,GAAG;KACH,MAAM,QAAQ,QAAQ,aAAa,IAAI,QAAQ;IACjD,CAAC;GACH;EACF;EAEA,OAAO,OAAO,OAAO,4BAA4B,YAAY;CAC/D;AAOF"}
|
|
1
|
+
{"version":3,"file":"for-resources.cjs","names":["capitalize"],"sources":["../../src/create-config/for-resources.ts"],"sourcesContent":["import {\n createContext,\n createElement,\n type JSX,\n type ReactNode,\n useContext,\n} from 'react';\nimport type {\n ComposableComponents,\n ComposableResourceLayout,\n} from '@jfdevelops/react-layout-composables';\nimport {\n type AnyBuiltPropDefinition,\n type ResolveProps,\n validateProps,\n} from '@jfdevelops/react-layout-validator';\nimport type {\n IncludedProps,\n InPropsDefinition,\n InPropsObject,\n MergedLayoutInProps,\n ResolvedIncludedProps,\n} from '../props';\nimport type { LayoutResourceKey, ResourceDefinition } from '../resource';\nimport { capitalize } from '../utils/capitalize';\nimport type { BaseComponent, Show } from '../utils';\nimport type {\n LayoutIncludeProps,\n LayoutPropsForResource,\n ResourceLayoutComponent,\n} from './define-layout';\nimport type {\n CreatedLayoutForResource,\n CreateLayoutForResourceOptions,\n CreateResourceLayoutOptionsBase,\n SetDefaultPropForResourceFn,\n} from './for-resource';\n\ntype CapitalizedResource<Resource extends string> = Resource extends Resource\n ? {\n toLowerCase: () => Lowercase<Capitalize<Resource>>;\n } & Capitalize<Resource>\n : never;\n\ntype ResourceLayoutName<\n Resource extends string,\n Name extends string = string,\n> = Name | ((resource: CapitalizedResource<Resource>) => Name);\n\ntype ResourceLayoutNames<\n Resource extends string,\n CallbackName extends string = string,\n> = {\n [TargetResource in Resource]?:\n | string\n | ((resource: CapitalizedResource<TargetResource>) => CallbackName);\n};\n\ntype AtLeastOneResourceLayoutNameKey<Resource extends string> = {\n [TargetResource in Resource]: Record<TargetResource, unknown> &\n Partial<Record<Exclude<Resource, TargetResource>, unknown>>;\n}[Resource];\n\ntype SelectedResourceLayoutNames<\n Resource extends string,\n SelectedResource extends Resource,\n CallbackName extends string,\n> = {\n [TargetResource in Resource as TargetResource extends SelectedResource\n ? TargetResource\n : never]?:\n | string\n | ((resource: CapitalizedResource<TargetResource>) => CallbackName);\n};\n\ntype ResourcesLayoutName<Resource extends string> =\n | Exclude<ResourceLayoutName<Resource>, string>\n | ResourceLayoutNames<Resource>;\n\ntype ResourceLayoutSelection<\n Resources extends ReadonlyArray<ResourceDefinition>,\n CallbackName extends string = string,\n> = {\n [Resource in LayoutResourceKey<Resources>]?: {\n name?: string | ((resource: CapitalizedResource<Resource>) => CallbackName);\n };\n};\n\ntype AtLeastOneResourceLayoutSelection<\n Resources extends ReadonlyArray<ResourceDefinition>,\n CallbackName extends string,\n> = {\n [Resource in LayoutResourceKey<Resources>]: Required<\n Pick<ResourceLayoutSelection<Resources, CallbackName>, Resource>\n > &\n Omit<ResourceLayoutSelection<Resources, CallbackName>, Resource>;\n}[LayoutResourceKey<Resources>];\n\ntype SelectedLayoutResources<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Arguments extends ReadonlyArray<unknown>,\n> =\n Arguments extends ReadonlyArray<LayoutResourceKey<Resources>>\n ? Arguments[number]\n : Arguments[0] extends {\n resources: ReadonlyArray<infer Resource>;\n }\n ? Resource & LayoutResourceKey<Resources>\n : keyof Arguments[0] & LayoutResourceKey<Resources>;\n\ntype ResolveResourceLayoutName<Name> = Name extends (\n ...args: never[]\n) => infer Result\n ? Result & string\n : Name extends string\n ? Name\n : string;\n\ntype NormalizeCapitalizedResourceName<\n Name extends string,\n Resource extends string,\n> = Name extends Name\n ? NormalizeCapitalizedResourceNameMatch<Name, Resource> extends infer Match\n ? [Match] extends [never]\n ? Name\n : Match\n : never\n : never;\n\ntype NormalizeCapitalizedResourceNameMatch<\n Name extends string,\n Resource extends string,\n> = Resource extends Resource\n ? Name extends `${CapitalizedResource<Resource>}${infer Suffix}`\n ? `${Capitalize<Resource>}${Suffix}`\n : never\n : never;\n\ntype SelectedResourceLayoutName<Arguments, Resource extends string> =\n Arguments extends ReadonlyArray<string>\n ? string\n : Arguments extends readonly [infer Options]\n ? Options extends {\n resources: ReadonlyArray<string>;\n name?: infer Name;\n }\n ? Name extends (...args: never[]) => unknown\n ? ResolveResourceLayoutName<Name>\n : Name extends Record<Resource, infer ResourceName>\n ? ResolveResourceLayoutName<ResourceName>\n : string\n : Options extends Record<Resource, infer ResourceOptions>\n ? ResourceOptions extends { name?: infer Name }\n ? ResolveResourceLayoutName<Name>\n : string\n : string\n : string;\n\ntype NormalizeResourceLayoutNames<Names, CallbackName extends string> = {\n [Resource in keyof Names]: Names[Resource] extends (\n ...args: never[]\n ) => unknown\n ? (\n resource: CapitalizedResource<Resource & string>,\n ) => NormalizeCapitalizedResourceName<CallbackName, Resource & string>\n : Names[Resource];\n};\n\ntype NormalizeResourceLayoutSelection<Selection> = {\n [Resource in keyof Selection]: Selection[Resource] extends {\n name: infer Name;\n }\n ? {\n name: Name extends (...args: never[]) => unknown\n ? (\n resource: CapitalizedResource<Resource & string>,\n ) => NormalizeCapitalizedResourceName<\n ResolveResourceLayoutName<Name>,\n Resource & string\n >\n : Name;\n }\n : Selection[Resource];\n};\n\ntype SharedResourceLayoutArguments<\n Resources extends ReadonlyArray<ResourceDefinition>,\n ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n Name extends string,\n> = readonly [\n {\n resources: ResourceKeys;\n name: (\n resource: CapitalizedResource<ResourceKeys[number]>,\n ) => NormalizeCapitalizedResourceName<Name, ResourceKeys[number]>;\n },\n];\n\ntype MappedResourceLayoutArguments<\n Resources extends ReadonlyArray<ResourceDefinition>,\n ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n Names,\n CallbackName extends string,\n> = readonly [\n {\n resources: ResourceKeys;\n name: NormalizeResourceLayoutNames<Names, CallbackName>;\n },\n];\n\ntype SelectedResourceLayoutArguments<Selection> = readonly [\n NormalizeResourceLayoutSelection<Selection>,\n];\n\ntype HasResourceLayoutName<Arguments, Resource extends string> =\n Arguments extends ReadonlyArray<string>\n ? false\n : Arguments extends readonly [infer Options]\n ? Options extends {\n resources: ReadonlyArray<string>;\n name: infer Name;\n }\n ? Name extends (...args: never[]) => unknown\n ? true\n : Name extends Record<Resource, unknown>\n ? true\n : false\n : Options extends Record<Resource, infer ResourceOptions>\n ? 'name' extends keyof ResourceOptions\n ? true\n : false\n : false\n : false;\n\ntype ScopedCreateResourceLayoutOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n Name extends string,\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Props extends InPropsObject,\n> = LayoutPropsForResource<Resources, InProps, Composables> & {\n resource: Resource;\n props?: Props;\n} & (HasResourceLayoutName<Arguments, Resource> extends true\n ? { name?: Name }\n : { name: Name });\n\ntype ScopedCreateResourceLayoutFnImpl<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n CustomProps extends InPropsObject,\n> = <\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Name extends string = SelectedResourceLayoutName<Arguments, Resource>,\n Props extends InPropsObject = {},\n>(\n options: ScopedCreateResourceLayoutOptions<\n Resources,\n InProps,\n Composables,\n Arguments,\n Name,\n Resource,\n Props\n >,\n) => ResourceLayoutComponent<Name, CustomProps, Composables, Resource>;\n\ntype ScopedCreateLayoutForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n CustomProps extends InPropsObject,\n> = <\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Name extends string = SelectedResourceLayoutName<Arguments, Resource>,\n>(\n options: CreateLayoutForResourceOptions<Resources, Name, Resource>,\n) => CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n> & {\n setDefaults: SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n >;\n};\n\ntype ScopedCreateResourceLayoutMakeComposableFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n> = <\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Name extends string = SelectedResourceLayoutName<Arguments, Resource>,\n Props extends InPropsObject = {},\n>(\n options: Omit<\n CreateResourceLayoutOptionsBase<Resources, Name, Resource>,\n 'name'\n > &\n Partial<LayoutPropsForResource<Resources, InProps, Composables>> & {\n props?: Props;\n } & (HasResourceLayoutName<Arguments, Resource> extends true\n ? { name?: Name }\n : { name: Name }),\n) => ComposableResourceLayout<Composables, Name, any, any, any>;\n\ntype ScopedComponentAvailableProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n LayoutCustomProps extends InPropsObject,\n> = MergedLayoutInProps<Resources, InProps, Composables> & LayoutCustomProps;\n\ntype ScopedResourceComponentProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n LayoutCustomProps extends InPropsObject,\n ComponentIncludeProps extends IncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >\n >,\n ComponentCustomProps extends InPropsObject,\n Resource extends string,\n> = Show<\n Omit<\n ResolvedIncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >,\n ComponentIncludeProps\n > &\n ResolveProps<ComponentCustomProps>,\n 'children' | 'resource'\n > & {\n children?: ReactNode;\n resource: Resource;\n }\n>;\n\ntype ScopedTargetResourceComponent<Resource extends string> = {\n (props: any): JSX.Element;\n readonly resource: Resource;\n};\n\ntype ScopedResourceComponentRenderOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n LayoutCustomProps extends InPropsObject,\n ComponentIncludeProps extends IncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >\n >,\n ComponentCustomProps extends InPropsObject,\n> = {\n [Resource in SelectedLayoutResources<Resources, Arguments>]?: {\n render: (\n props: ScopedResourceComponentProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps,\n Resource\n >,\n ) => JSX.Element;\n };\n};\n\ntype ScopedResourceComponentRenderContext<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Arguments extends ReadonlyArray<unknown>,\n> = {\n [Resource in SelectedLayoutResources<Resources, Arguments> as Capitalize<\n Resource\n >]: () => JSX.Element;\n};\n\ntype ScopedResourceComponent<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n LayoutCustomProps extends InPropsObject,\n ComponentIncludeProps extends IncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >\n >,\n ComponentCustomProps extends InPropsObject,\n> = BaseComponent<\n string,\n ScopedResourceComponentProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps,\n SelectedLayoutResources<Resources, Arguments>\n >\n> & {\n <\n const ResourceComponent extends ScopedTargetResourceComponent<\n SelectedLayoutResources<Resources, Arguments>\n > = ScopedTargetResourceComponent<\n SelectedLayoutResources<Resources, Arguments>\n >,\n >(\n props: ScopedResourceComponentProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps,\n ResourceComponent['resource']\n >,\n ): JSX.Element;\n};\n\ntype ScopedCreateComponent<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n LayoutCustomProps extends InPropsObject,\n> = <\n const ComponentIncludeProps extends IncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >\n > = {},\n ComponentCustomProps extends InPropsObject = {},\n>(options: {\n props?: {\n /** Props from the resource layout definition to expose to the component. */\n include?: ComponentIncludeProps;\n /** Additional props accepted by the component. */\n custom?: ComponentCustomProps;\n };\n /**\n * Renders the scoped component. `children` and `resource` are always\n * available. The context contains capitalized components for the selected\n * resources.\n */\n render: (\n props: ScopedResourceComponentProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps,\n SelectedLayoutResources<Resources, Arguments>\n >,\n context: ScopedResourceComponentRenderContext<Resources, Arguments>,\n ) => JSX.Element;\n} &\n ScopedResourceComponentRenderOptions<\n Resources,\n InProps,\n Composables,\n Arguments,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps\n >) => ScopedResourceComponent<\n Resources,\n InProps,\n Composables,\n Arguments,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps\n>;\n\ntype ScopedCreateResourceLayoutFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n CustomProps extends InPropsObject,\n> = ScopedCreateResourceLayoutFnImpl<\n Resources,\n InProps,\n Composables,\n Arguments,\n CustomProps\n> & {\n /**\n * Creates a component shared by the target resources. Included layout props\n * become component props, and `children` is always available as an optional\n * prop in both the render callback and at the call site.\n *\n * @example\n * const Directory = createDirectoryLayout.createComponent({\n * props: { include: { title: true, actions: 'optional' } },\n * users: {\n * render: ({ resource }) => <span>{resource}</span>,\n * },\n * render: ({ actions, children, resource, title }, context) => {\n * const ResourceRender = context.Users\n *\n * return (\n * <Page resource={resource} title={title} actions={actions}>\n * {children}\n * <ResourceRender />\n * </Page>\n * )\n * },\n * })\n *\n * <Directory<typeof UsersPage> resource='users' title='Users' />\n *\n * @param options The props configuration and component render function.\n * @returns A component scoped to the selected resources.\n */\n createComponent: ScopedCreateComponent<\n Resources,\n InProps,\n Composables,\n Arguments,\n CustomProps\n >;\n forResource: ScopedCreateLayoutForResource<\n Resources,\n InProps,\n Composables,\n Arguments,\n CustomProps\n >;\n /**\n * Type-only property containing the target resource union. This property is\n * `undefined` at runtime and exists solely for extracting the scoped type.\n *\n * @example\n * type AccountResource = typeof createAccountLayout.resources;\n */\n readonly resources: SelectedLayoutResources<Resources, Arguments>;\n} & ([keyof Composables] extends [never]\n ? {}\n : {\n makeComposable: ScopedCreateResourceLayoutMakeComposableFn<\n Resources,\n InProps,\n Composables,\n Arguments\n >;\n });\n\nexport type CreateResourceLayoutForResourcesFn<\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 /**\n * Creates a layout factory scoped to the listed resources.\n *\n * Layout names must be supplied when a layout is created.\n *\n * @example\n * createResourceLayout.forResources('users', 'admins')\n *\n * @param resources Resources available from the returned layout factory.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends readonly [\n LayoutResourceKey<Resources>,\n ...Array<LayoutResourceKey<Resources>>,\n ],\n >(\n ...resources: ResourceKeys\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n ResourceKeys,\n CustomProps\n >;\n\n /**\n * Creates a layout factory scoped to a resource list without default names.\n *\n * @example\n * createResourceLayout.forResources({ resources: ['users', 'admins'] })\n *\n * @param options The resources to expose without configured default names.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n >(options: {\n resources: ResourceKeys;\n name?: never;\n }): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n readonly [{ resources: ResourceKeys }],\n CustomProps\n >;\n\n /**\n * Creates a scoped layout factory with optional default names per resource.\n *\n * Each map key is limited to the resources selected in `resources`. Values\n * can be strings or callbacks receiving that resource's capitalized name.\n *\n * @example\n * createResourceLayout.forResources({\n * resources: ['users', 'admins'],\n * name: {\n * users: resource => `${resource}Page`,\n * admins: 'AdminDirectory',\n * },\n * })\n *\n * @param options The selected resources and their optional default names.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n const CallbackName extends string,\n const Names,\n >(\n options: {\n resources: ResourceKeys;\n name: SelectedResourceLayoutNames<\n LayoutResourceKey<Resources>,\n NoInfer<ResourceKeys[number]>,\n CallbackName\n > &\n AtLeastOneResourceLayoutNameKey<NoInfer<ResourceKeys[number]>> &\n Record<\n string,\n NonNullable<\n ResourceLayoutNames<\n LayoutResourceKey<Resources>,\n CallbackName\n >[LayoutResourceKey<Resources>]\n >\n >;\n } & {\n name: Names & Record<Exclude<keyof Names, ResourceKeys[number]>, never>;\n },\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n MappedResourceLayoutArguments<Resources, ResourceKeys, Names, CallbackName>,\n CustomProps\n >;\n\n /**\n * Creates a scoped layout factory with one default-name callback shared by\n * every selected resource. The callback receives a capitalized resource\n * whose `toLowerCase()` result retains the corresponding literal type.\n *\n * @example\n * createResourceLayout.forResources({\n * resources: ['users', 'admins'],\n * name: resource => `${resource}Page`,\n * })\n *\n * @param options The selected resources and shared default-name callback.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n const Name extends string,\n >(\n options: {\n resources: ReadonlyArray<LayoutResourceKey<Resources>>;\n name: (resource: CapitalizedResource<ResourceKeys[number]>) => Name;\n } & { resources: ResourceKeys },\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n SharedResourceLayoutArguments<Resources, ResourceKeys, Name>,\n CustomProps\n >;\n\n /**\n * Creates a scoped layout factory from a resource-keyed configuration.\n * Only configured resources are available from the returned factory.\n *\n * @example\n * createResourceLayout.forResources({\n * users: { name: resource => `${resource}Page` },\n * admins: { name: 'AdminDirectory' },\n * })\n *\n * @param options Resource-keyed layout defaults.\n * @returns A layout factory scoped to the configured resources.\n */\n <\n const CallbackName extends string,\n const Selection extends ResourceLayoutSelection<Resources, CallbackName>,\n >(\n options: Selection &\n AtLeastOneResourceLayoutSelection<Resources, CallbackName> &\n Partial<\n Record<Exclude<'resources', LayoutResourceKey<Resources>>, never>\n > &\n Record<Exclude<keyof Selection, LayoutResourceKey<Resources>>, never>,\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n SelectedResourceLayoutArguments<Selection>,\n CustomProps\n >;\n};\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 function createComponent(componentOptions: {\n [resource: string]: unknown;\n props?: {\n include?: Record<string, true | 'optional'>;\n custom?: Record<string, AnyBuiltPropDefinition>;\n };\n render: (\n props: Record<string, unknown>,\n context: Record<string, () => JSX.Element>,\n ) => JSX.Element;\n }) {\n const include = componentOptions.props?.include ?? {};\n const custom = componentOptions.props?.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 contextResources = new Map<string, LayoutResourceKey<Resources>>();\n const renderContext = Object.fromEntries(\n resourceOptions.map(({ resource }) => {\n const contextKey = capitalize(resource);\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 const resourceRenderOptions = componentOptions[resource] as\n | {\n render: (props: Record<string, unknown>) => JSX.Element;\n }\n | undefined;\n\n function ResourceRender() {\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 return resourceRenderOptions?.render({\n ...componentProps,\n resource,\n }) ?? (null as unknown as JSX.Element);\n }\n\n return [contextKey, ResourceRender];\n }),\n );\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 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 const propKey =\n 'type' in definition && definition.type === 'JSX.Element'\n ? capitalize(key)\n : key;\n\n if (inclusion === true || propKey in componentProps) {\n definitionsToValidate[propKey] = definition;\n }\n }\n\n for (const [key, definition] of Object.entries(custom)) {\n if (key === 'children' || key === 'resource') {\n continue;\n }\n\n const propKey =\n 'type' in definition && definition.type === 'JSX.Element'\n ? capitalize(key)\n : key;\n definitionsToValidate[propKey] = definition;\n }\n\n validateProps(definitionsToValidate, componentProps);\n\n return createElement(\n componentPropsContext.Provider,\n { value: componentProps },\n componentOptions.render(componentProps, renderContext),\n );\n }\n\n return Object.assign(Component, {\n displayName: 'ScopedResourceComponent',\n props: undefined,\n });\n }\n\n const scopedExtras: {\n createComponent: typeof createComponent;\n forResource: typeof scopedForResource;\n makeComposable?: (options: Record<string, unknown>) => unknown;\n resources: undefined;\n } = {\n createComponent,\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"for-resources.d.cts","names":[],"sources":["../../src/create-config/for-resources.ts"],"mappings":";;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"for-resources.d.cts","names":[],"sources":["../../src/create-config/for-resources.ts"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"for-resources.d.mts","names":[],"sources":["../../src/create-config/for-resources.ts"],"mappings":";;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"for-resources.d.mts","names":[],"sources":["../../src/create-config/for-resources.ts"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { capitalize } from "../utils/capitalize.mjs";
|
|
2
2
|
import { validateProps } from "@jfdevelops/react-layout-validator";
|
|
3
|
+
import { createContext, createElement, useContext } from "react";
|
|
3
4
|
|
|
4
5
|
//#region src/create-config/for-resources.ts
|
|
5
6
|
function createForResources({ createLayoutForResource, createMakeComposableLayout, createResourceLayout, getComponentPropDefinitions }) {
|
|
@@ -32,6 +33,24 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
|
|
|
32
33
|
const include = componentOptions.props?.include ?? {};
|
|
33
34
|
const custom = componentOptions.props?.custom ?? {};
|
|
34
35
|
const selectedResources = new Set(resourceOptions.map(({ resource }) => resource));
|
|
36
|
+
const componentPropsContext = createContext(void 0);
|
|
37
|
+
const contextResources = /* @__PURE__ */ new Map();
|
|
38
|
+
const renderContext = Object.fromEntries(resourceOptions.map(({ resource }) => {
|
|
39
|
+
const contextKey = capitalize(resource);
|
|
40
|
+
const existingResource = contextResources.get(contextKey);
|
|
41
|
+
if (existingResource !== void 0) throw new Error(`Resources "${existingResource}" and "${resource}" both map to render context key "${contextKey}"`);
|
|
42
|
+
contextResources.set(contextKey, resource);
|
|
43
|
+
const resourceRenderOptions = componentOptions[resource];
|
|
44
|
+
function ResourceRender() {
|
|
45
|
+
const componentProps = useContext(componentPropsContext);
|
|
46
|
+
if (componentProps === void 0) throw new Error(`Render context component "${contextKey}" must be rendered inside its scoped component`);
|
|
47
|
+
return resourceRenderOptions?.render({
|
|
48
|
+
...componentProps,
|
|
49
|
+
resource
|
|
50
|
+
}) ?? null;
|
|
51
|
+
}
|
|
52
|
+
return [contextKey, ResourceRender];
|
|
53
|
+
}));
|
|
35
54
|
function Component(componentProps) {
|
|
36
55
|
const componentResource = componentProps.resource;
|
|
37
56
|
if (!selectedResources.has(componentResource)) throw new Error(`Resource "${componentResource}" is not available in this scoped component`);
|
|
@@ -49,17 +68,7 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
|
|
|
49
68
|
definitionsToValidate[propKey] = definition;
|
|
50
69
|
}
|
|
51
70
|
validateProps(definitionsToValidate, componentProps);
|
|
52
|
-
|
|
53
|
-
const resourceRenderOptions = componentOptions[resource];
|
|
54
|
-
function ResourceRender() {
|
|
55
|
-
return resourceRenderOptions?.render({
|
|
56
|
-
...componentProps,
|
|
57
|
-
resource
|
|
58
|
-
}) ?? null;
|
|
59
|
-
}
|
|
60
|
-
return [capitalize(resource), ResourceRender];
|
|
61
|
-
}));
|
|
62
|
-
return componentOptions.render(componentProps, renderContext);
|
|
71
|
+
return createElement(componentPropsContext.Provider, { value: componentProps }, componentOptions.render(componentProps, renderContext));
|
|
63
72
|
}
|
|
64
73
|
return Object.assign(Component, {
|
|
65
74
|
displayName: "ScopedResourceComponent",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"for-resources.mjs","names":[],"sources":["../../src/create-config/for-resources.ts"],"sourcesContent":["import type { JSX, ReactNode } from 'react';\nimport type {\n ComposableComponents,\n ComposableResourceLayout,\n} from '@jfdevelops/react-layout-composables';\nimport {\n type AnyBuiltPropDefinition,\n type ResolveProps,\n validateProps,\n} from '@jfdevelops/react-layout-validator';\nimport type {\n IncludedProps,\n InPropsDefinition,\n InPropsObject,\n MergedLayoutInProps,\n ResolvedIncludedProps,\n} from '../props';\nimport type { LayoutResourceKey, ResourceDefinition } from '../resource';\nimport { capitalize } from '../utils/capitalize';\nimport type { BaseComponent, Show } from '../utils';\nimport type {\n LayoutIncludeProps,\n LayoutPropsForResource,\n ResourceLayoutComponent,\n} from './define-layout';\nimport type {\n CreatedLayoutForResource,\n CreateLayoutForResourceOptions,\n CreateResourceLayoutOptionsBase,\n SetDefaultPropForResourceFn,\n} from './for-resource';\n\ntype CapitalizedResource<Resource extends string> = Resource extends Resource\n ? {\n toLowerCase: () => Lowercase<Capitalize<Resource>>;\n } & Capitalize<Resource>\n : never;\n\ntype ResourceLayoutName<\n Resource extends string,\n Name extends string = string,\n> = Name | ((resource: CapitalizedResource<Resource>) => Name);\n\ntype ResourceLayoutNames<\n Resource extends string,\n CallbackName extends string = string,\n> = {\n [TargetResource in Resource]?:\n | string\n | ((resource: CapitalizedResource<TargetResource>) => CallbackName);\n};\n\ntype AtLeastOneResourceLayoutNameKey<Resource extends string> = {\n [TargetResource in Resource]: Record<TargetResource, unknown> &\n Partial<Record<Exclude<Resource, TargetResource>, unknown>>;\n}[Resource];\n\ntype SelectedResourceLayoutNames<\n Resource extends string,\n SelectedResource extends Resource,\n CallbackName extends string,\n> = {\n [TargetResource in Resource as TargetResource extends SelectedResource\n ? TargetResource\n : never]?:\n | string\n | ((resource: CapitalizedResource<TargetResource>) => CallbackName);\n};\n\ntype ResourcesLayoutName<Resource extends string> =\n | Exclude<ResourceLayoutName<Resource>, string>\n | ResourceLayoutNames<Resource>;\n\ntype ResourceLayoutSelection<\n Resources extends ReadonlyArray<ResourceDefinition>,\n CallbackName extends string = string,\n> = {\n [Resource in LayoutResourceKey<Resources>]?: {\n name?: string | ((resource: CapitalizedResource<Resource>) => CallbackName);\n };\n};\n\ntype AtLeastOneResourceLayoutSelection<\n Resources extends ReadonlyArray<ResourceDefinition>,\n CallbackName extends string,\n> = {\n [Resource in LayoutResourceKey<Resources>]: Required<\n Pick<ResourceLayoutSelection<Resources, CallbackName>, Resource>\n > &\n Omit<ResourceLayoutSelection<Resources, CallbackName>, Resource>;\n}[LayoutResourceKey<Resources>];\n\ntype SelectedLayoutResources<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Arguments extends ReadonlyArray<unknown>,\n> =\n Arguments extends ReadonlyArray<LayoutResourceKey<Resources>>\n ? Arguments[number]\n : Arguments[0] extends {\n resources: ReadonlyArray<infer Resource>;\n }\n ? Resource & LayoutResourceKey<Resources>\n : keyof Arguments[0] & LayoutResourceKey<Resources>;\n\ntype ResolveResourceLayoutName<Name> = Name extends (\n ...args: never[]\n) => infer Result\n ? Result & string\n : Name extends string\n ? Name\n : string;\n\ntype NormalizeCapitalizedResourceName<\n Name extends string,\n Resource extends string,\n> = Name extends Name\n ? NormalizeCapitalizedResourceNameMatch<Name, Resource> extends infer Match\n ? [Match] extends [never]\n ? Name\n : Match\n : never\n : never;\n\ntype NormalizeCapitalizedResourceNameMatch<\n Name extends string,\n Resource extends string,\n> = Resource extends Resource\n ? Name extends `${CapitalizedResource<Resource>}${infer Suffix}`\n ? `${Capitalize<Resource>}${Suffix}`\n : never\n : never;\n\ntype SelectedResourceLayoutName<Arguments, Resource extends string> =\n Arguments extends ReadonlyArray<string>\n ? string\n : Arguments extends readonly [infer Options]\n ? Options extends {\n resources: ReadonlyArray<string>;\n name?: infer Name;\n }\n ? Name extends (...args: never[]) => unknown\n ? ResolveResourceLayoutName<Name>\n : Name extends Record<Resource, infer ResourceName>\n ? ResolveResourceLayoutName<ResourceName>\n : string\n : Options extends Record<Resource, infer ResourceOptions>\n ? ResourceOptions extends { name?: infer Name }\n ? ResolveResourceLayoutName<Name>\n : string\n : string\n : string;\n\ntype NormalizeResourceLayoutNames<Names, CallbackName extends string> = {\n [Resource in keyof Names]: Names[Resource] extends (\n ...args: never[]\n ) => unknown\n ? (\n resource: CapitalizedResource<Resource & string>,\n ) => NormalizeCapitalizedResourceName<CallbackName, Resource & string>\n : Names[Resource];\n};\n\ntype NormalizeResourceLayoutSelection<Selection> = {\n [Resource in keyof Selection]: Selection[Resource] extends {\n name: infer Name;\n }\n ? {\n name: Name extends (...args: never[]) => unknown\n ? (\n resource: CapitalizedResource<Resource & string>,\n ) => NormalizeCapitalizedResourceName<\n ResolveResourceLayoutName<Name>,\n Resource & string\n >\n : Name;\n }\n : Selection[Resource];\n};\n\ntype SharedResourceLayoutArguments<\n Resources extends ReadonlyArray<ResourceDefinition>,\n ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n Name extends string,\n> = readonly [\n {\n resources: ResourceKeys;\n name: (\n resource: CapitalizedResource<ResourceKeys[number]>,\n ) => NormalizeCapitalizedResourceName<Name, ResourceKeys[number]>;\n },\n];\n\ntype MappedResourceLayoutArguments<\n Resources extends ReadonlyArray<ResourceDefinition>,\n ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n Names,\n CallbackName extends string,\n> = readonly [\n {\n resources: ResourceKeys;\n name: NormalizeResourceLayoutNames<Names, CallbackName>;\n },\n];\n\ntype SelectedResourceLayoutArguments<Selection> = readonly [\n NormalizeResourceLayoutSelection<Selection>,\n];\n\ntype HasResourceLayoutName<Arguments, Resource extends string> =\n Arguments extends ReadonlyArray<string>\n ? false\n : Arguments extends readonly [infer Options]\n ? Options extends {\n resources: ReadonlyArray<string>;\n name: infer Name;\n }\n ? Name extends (...args: never[]) => unknown\n ? true\n : Name extends Record<Resource, unknown>\n ? true\n : false\n : Options extends Record<Resource, infer ResourceOptions>\n ? 'name' extends keyof ResourceOptions\n ? true\n : false\n : false\n : false;\n\ntype ScopedCreateResourceLayoutOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n Name extends string,\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Props extends InPropsObject,\n> = LayoutPropsForResource<Resources, InProps, Composables> & {\n resource: Resource;\n props?: Props;\n} & (HasResourceLayoutName<Arguments, Resource> extends true\n ? { name?: Name }\n : { name: Name });\n\ntype ScopedCreateResourceLayoutFnImpl<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n CustomProps extends InPropsObject,\n> = <\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Name extends string = SelectedResourceLayoutName<Arguments, Resource>,\n Props extends InPropsObject = {},\n>(\n options: ScopedCreateResourceLayoutOptions<\n Resources,\n InProps,\n Composables,\n Arguments,\n Name,\n Resource,\n Props\n >,\n) => ResourceLayoutComponent<Name, CustomProps, Composables, Resource>;\n\ntype ScopedCreateLayoutForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n CustomProps extends InPropsObject,\n> = <\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Name extends string = SelectedResourceLayoutName<Arguments, Resource>,\n>(\n options: CreateLayoutForResourceOptions<Resources, Name, Resource>,\n) => CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n> & {\n setDefaults: SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n >;\n};\n\ntype ScopedCreateResourceLayoutMakeComposableFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n> = <\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Name extends string = SelectedResourceLayoutName<Arguments, Resource>,\n Props extends InPropsObject = {},\n>(\n options: Omit<\n CreateResourceLayoutOptionsBase<Resources, Name, Resource>,\n 'name'\n > &\n Partial<LayoutPropsForResource<Resources, InProps, Composables>> & {\n props?: Props;\n } & (HasResourceLayoutName<Arguments, Resource> extends true\n ? { name?: Name }\n : { name: Name }),\n) => ComposableResourceLayout<Composables, Name, any, any, any>;\n\ntype ScopedComponentAvailableProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n LayoutCustomProps extends InPropsObject,\n> = MergedLayoutInProps<Resources, InProps, Composables> & LayoutCustomProps;\n\ntype ScopedResourceComponentProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n LayoutCustomProps extends InPropsObject,\n ComponentIncludeProps extends IncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >\n >,\n ComponentCustomProps extends InPropsObject,\n Resource extends string,\n> = Show<\n Omit<\n ResolvedIncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >,\n ComponentIncludeProps\n > &\n ResolveProps<ComponentCustomProps>,\n 'children' | 'resource'\n > & {\n children?: ReactNode;\n resource: Resource;\n }\n>;\n\ntype ScopedTargetResourceComponent<Resource extends string> = {\n (props: any): JSX.Element;\n readonly resource: Resource;\n};\n\ntype ScopedResourceComponentRenderOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n LayoutCustomProps extends InPropsObject,\n ComponentIncludeProps extends IncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >\n >,\n ComponentCustomProps extends InPropsObject,\n> = {\n [Resource in SelectedLayoutResources<Resources, Arguments>]?: {\n render: (\n props: ScopedResourceComponentProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps,\n Resource\n >,\n ) => JSX.Element;\n };\n};\n\ntype ScopedResourceComponentRenderContext<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Arguments extends ReadonlyArray<unknown>,\n> = {\n [Resource in SelectedLayoutResources<Resources, Arguments> as Capitalize<\n Resource\n >]: () => JSX.Element;\n};\n\ntype ScopedResourceComponent<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n LayoutCustomProps extends InPropsObject,\n ComponentIncludeProps extends IncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >\n >,\n ComponentCustomProps extends InPropsObject,\n> = BaseComponent<\n string,\n ScopedResourceComponentProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps,\n SelectedLayoutResources<Resources, Arguments>\n >\n> & {\n <\n const ResourceComponent extends ScopedTargetResourceComponent<\n SelectedLayoutResources<Resources, Arguments>\n > = ScopedTargetResourceComponent<\n SelectedLayoutResources<Resources, Arguments>\n >,\n >(\n props: ScopedResourceComponentProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps,\n ResourceComponent['resource']\n >,\n ): JSX.Element;\n};\n\ntype ScopedCreateComponent<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n LayoutCustomProps extends InPropsObject,\n> = <\n const ComponentIncludeProps extends IncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >\n > = {},\n ComponentCustomProps extends InPropsObject = {},\n>(options: {\n props?: {\n /** Props from the resource layout definition to expose to the component. */\n include?: ComponentIncludeProps;\n /** Additional props accepted by the component. */\n custom?: ComponentCustomProps;\n };\n /**\n * Renders the scoped component. `children` and `resource` are always\n * available. The context contains capitalized components for the selected\n * resources.\n */\n render: (\n props: ScopedResourceComponentProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps,\n SelectedLayoutResources<Resources, Arguments>\n >,\n context: ScopedResourceComponentRenderContext<Resources, Arguments>,\n ) => JSX.Element;\n} &\n ScopedResourceComponentRenderOptions<\n Resources,\n InProps,\n Composables,\n Arguments,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps\n >) => ScopedResourceComponent<\n Resources,\n InProps,\n Composables,\n Arguments,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps\n>;\n\ntype ScopedCreateResourceLayoutFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n CustomProps extends InPropsObject,\n> = ScopedCreateResourceLayoutFnImpl<\n Resources,\n InProps,\n Composables,\n Arguments,\n CustomProps\n> & {\n /**\n * Creates a component shared by the target resources. Included layout props\n * become component props, and `children` is always available as an optional\n * prop in both the render callback and at the call site.\n *\n * @example\n * const Directory = createDirectoryLayout.createComponent({\n * props: { include: { title: true, actions: 'optional' } },\n * users: {\n * render: ({ resource }) => <span>{resource}</span>,\n * },\n * render: ({ actions, children, resource, title }, context) => {\n * const ResourceRender = context.Users\n *\n * return (\n * <Page resource={resource} title={title} actions={actions}>\n * {children}\n * <ResourceRender />\n * </Page>\n * )\n * },\n * })\n *\n * <Directory<typeof UsersPage> resource='users' title='Users' />\n *\n * @param options The props configuration and component render function.\n * @returns A component scoped to the selected resources.\n */\n createComponent: ScopedCreateComponent<\n Resources,\n InProps,\n Composables,\n Arguments,\n CustomProps\n >;\n forResource: ScopedCreateLayoutForResource<\n Resources,\n InProps,\n Composables,\n Arguments,\n CustomProps\n >;\n /**\n * Type-only property containing the target resource union. This property is\n * `undefined` at runtime and exists solely for extracting the scoped type.\n *\n * @example\n * type AccountResource = typeof createAccountLayout.resources;\n */\n readonly resources: SelectedLayoutResources<Resources, Arguments>;\n} & ([keyof Composables] extends [never]\n ? {}\n : {\n makeComposable: ScopedCreateResourceLayoutMakeComposableFn<\n Resources,\n InProps,\n Composables,\n Arguments\n >;\n });\n\nexport type CreateResourceLayoutForResourcesFn<\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 /**\n * Creates a layout factory scoped to the listed resources.\n *\n * Layout names must be supplied when a layout is created.\n *\n * @example\n * createResourceLayout.forResources('users', 'admins')\n *\n * @param resources Resources available from the returned layout factory.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends readonly [\n LayoutResourceKey<Resources>,\n ...Array<LayoutResourceKey<Resources>>,\n ],\n >(\n ...resources: ResourceKeys\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n ResourceKeys,\n CustomProps\n >;\n\n /**\n * Creates a layout factory scoped to a resource list without default names.\n *\n * @example\n * createResourceLayout.forResources({ resources: ['users', 'admins'] })\n *\n * @param options The resources to expose without configured default names.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n >(options: {\n resources: ResourceKeys;\n name?: never;\n }): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n readonly [{ resources: ResourceKeys }],\n CustomProps\n >;\n\n /**\n * Creates a scoped layout factory with optional default names per resource.\n *\n * Each map key is limited to the resources selected in `resources`. Values\n * can be strings or callbacks receiving that resource's capitalized name.\n *\n * @example\n * createResourceLayout.forResources({\n * resources: ['users', 'admins'],\n * name: {\n * users: resource => `${resource}Page`,\n * admins: 'AdminDirectory',\n * },\n * })\n *\n * @param options The selected resources and their optional default names.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n const CallbackName extends string,\n const Names,\n >(\n options: {\n resources: ResourceKeys;\n name: SelectedResourceLayoutNames<\n LayoutResourceKey<Resources>,\n NoInfer<ResourceKeys[number]>,\n CallbackName\n > &\n AtLeastOneResourceLayoutNameKey<NoInfer<ResourceKeys[number]>> &\n Record<\n string,\n NonNullable<\n ResourceLayoutNames<\n LayoutResourceKey<Resources>,\n CallbackName\n >[LayoutResourceKey<Resources>]\n >\n >;\n } & {\n name: Names & Record<Exclude<keyof Names, ResourceKeys[number]>, never>;\n },\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n MappedResourceLayoutArguments<Resources, ResourceKeys, Names, CallbackName>,\n CustomProps\n >;\n\n /**\n * Creates a scoped layout factory with one default-name callback shared by\n * every selected resource. The callback receives a capitalized resource\n * whose `toLowerCase()` result retains the corresponding literal type.\n *\n * @example\n * createResourceLayout.forResources({\n * resources: ['users', 'admins'],\n * name: resource => `${resource}Page`,\n * })\n *\n * @param options The selected resources and shared default-name callback.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n const Name extends string,\n >(\n options: {\n resources: ReadonlyArray<LayoutResourceKey<Resources>>;\n name: (resource: CapitalizedResource<ResourceKeys[number]>) => Name;\n } & { resources: ResourceKeys },\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n SharedResourceLayoutArguments<Resources, ResourceKeys, Name>,\n CustomProps\n >;\n\n /**\n * Creates a scoped layout factory from a resource-keyed configuration.\n * Only configured resources are available from the returned factory.\n *\n * @example\n * createResourceLayout.forResources({\n * users: { name: resource => `${resource}Page` },\n * admins: { name: 'AdminDirectory' },\n * })\n *\n * @param options Resource-keyed layout defaults.\n * @returns A layout factory scoped to the configured resources.\n */\n <\n const CallbackName extends string,\n const Selection extends ResourceLayoutSelection<Resources, CallbackName>,\n >(\n options: Selection &\n AtLeastOneResourceLayoutSelection<Resources, CallbackName> &\n Partial<\n Record<Exclude<'resources', LayoutResourceKey<Resources>>, never>\n > &\n Record<Exclude<keyof Selection, LayoutResourceKey<Resources>>, never>,\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n SelectedResourceLayoutArguments<Selection>,\n CustomProps\n >;\n};\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 function createComponent(componentOptions: {\n [resource: string]: unknown;\n props?: {\n include?: Record<string, true | 'optional'>;\n custom?: Record<string, AnyBuiltPropDefinition>;\n };\n render: (\n props: Record<string, unknown>,\n context: Record<string, () => JSX.Element>,\n ) => JSX.Element;\n }) {\n const include = componentOptions.props?.include ?? {};\n const custom = componentOptions.props?.custom ?? {};\n const selectedResources = new Set(\n resourceOptions.map(({ resource }) => resource),\n );\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 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 const propKey =\n 'type' in definition && definition.type === 'JSX.Element'\n ? capitalize(key)\n : key;\n\n if (inclusion === true || propKey in componentProps) {\n definitionsToValidate[propKey] = definition;\n }\n }\n\n for (const [key, definition] of Object.entries(custom)) {\n if (key === 'children' || key === 'resource') {\n continue;\n }\n\n const propKey =\n 'type' in definition && definition.type === 'JSX.Element'\n ? capitalize(key)\n : key;\n definitionsToValidate[propKey] = definition;\n }\n\n validateProps(definitionsToValidate, componentProps);\n\n const renderContext = Object.fromEntries(\n resourceOptions.map(({ resource }) => {\n const resourceRenderOptions = componentOptions[resource] as\n | {\n render: (props: Record<string, unknown>) => JSX.Element;\n }\n | undefined;\n\n function ResourceRender() {\n return resourceRenderOptions?.render({\n ...componentProps,\n resource,\n }) ?? (null as unknown as JSX.Element);\n }\n\n return [capitalize(resource), ResourceRender];\n }),\n );\n\n return componentOptions.render(componentProps, renderContext);\n }\n\n return Object.assign(Component, {\n displayName: 'ScopedResourceComponent',\n props: undefined,\n });\n }\n\n const scopedExtras: {\n createComponent: typeof createComponent;\n forResource: typeof scopedForResource;\n makeComposable?: (options: Record<string, unknown>) => unknown;\n resources: undefined;\n } = {\n createComponent,\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":"for-resources.mjs","names":[],"sources":["../../src/create-config/for-resources.ts"],"sourcesContent":["import {\n createContext,\n createElement,\n type JSX,\n type ReactNode,\n useContext,\n} from 'react';\nimport type {\n ComposableComponents,\n ComposableResourceLayout,\n} from '@jfdevelops/react-layout-composables';\nimport {\n type AnyBuiltPropDefinition,\n type ResolveProps,\n validateProps,\n} from '@jfdevelops/react-layout-validator';\nimport type {\n IncludedProps,\n InPropsDefinition,\n InPropsObject,\n MergedLayoutInProps,\n ResolvedIncludedProps,\n} from '../props';\nimport type { LayoutResourceKey, ResourceDefinition } from '../resource';\nimport { capitalize } from '../utils/capitalize';\nimport type { BaseComponent, Show } from '../utils';\nimport type {\n LayoutIncludeProps,\n LayoutPropsForResource,\n ResourceLayoutComponent,\n} from './define-layout';\nimport type {\n CreatedLayoutForResource,\n CreateLayoutForResourceOptions,\n CreateResourceLayoutOptionsBase,\n SetDefaultPropForResourceFn,\n} from './for-resource';\n\ntype CapitalizedResource<Resource extends string> = Resource extends Resource\n ? {\n toLowerCase: () => Lowercase<Capitalize<Resource>>;\n } & Capitalize<Resource>\n : never;\n\ntype ResourceLayoutName<\n Resource extends string,\n Name extends string = string,\n> = Name | ((resource: CapitalizedResource<Resource>) => Name);\n\ntype ResourceLayoutNames<\n Resource extends string,\n CallbackName extends string = string,\n> = {\n [TargetResource in Resource]?:\n | string\n | ((resource: CapitalizedResource<TargetResource>) => CallbackName);\n};\n\ntype AtLeastOneResourceLayoutNameKey<Resource extends string> = {\n [TargetResource in Resource]: Record<TargetResource, unknown> &\n Partial<Record<Exclude<Resource, TargetResource>, unknown>>;\n}[Resource];\n\ntype SelectedResourceLayoutNames<\n Resource extends string,\n SelectedResource extends Resource,\n CallbackName extends string,\n> = {\n [TargetResource in Resource as TargetResource extends SelectedResource\n ? TargetResource\n : never]?:\n | string\n | ((resource: CapitalizedResource<TargetResource>) => CallbackName);\n};\n\ntype ResourcesLayoutName<Resource extends string> =\n | Exclude<ResourceLayoutName<Resource>, string>\n | ResourceLayoutNames<Resource>;\n\ntype ResourceLayoutSelection<\n Resources extends ReadonlyArray<ResourceDefinition>,\n CallbackName extends string = string,\n> = {\n [Resource in LayoutResourceKey<Resources>]?: {\n name?: string | ((resource: CapitalizedResource<Resource>) => CallbackName);\n };\n};\n\ntype AtLeastOneResourceLayoutSelection<\n Resources extends ReadonlyArray<ResourceDefinition>,\n CallbackName extends string,\n> = {\n [Resource in LayoutResourceKey<Resources>]: Required<\n Pick<ResourceLayoutSelection<Resources, CallbackName>, Resource>\n > &\n Omit<ResourceLayoutSelection<Resources, CallbackName>, Resource>;\n}[LayoutResourceKey<Resources>];\n\ntype SelectedLayoutResources<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Arguments extends ReadonlyArray<unknown>,\n> =\n Arguments extends ReadonlyArray<LayoutResourceKey<Resources>>\n ? Arguments[number]\n : Arguments[0] extends {\n resources: ReadonlyArray<infer Resource>;\n }\n ? Resource & LayoutResourceKey<Resources>\n : keyof Arguments[0] & LayoutResourceKey<Resources>;\n\ntype ResolveResourceLayoutName<Name> = Name extends (\n ...args: never[]\n) => infer Result\n ? Result & string\n : Name extends string\n ? Name\n : string;\n\ntype NormalizeCapitalizedResourceName<\n Name extends string,\n Resource extends string,\n> = Name extends Name\n ? NormalizeCapitalizedResourceNameMatch<Name, Resource> extends infer Match\n ? [Match] extends [never]\n ? Name\n : Match\n : never\n : never;\n\ntype NormalizeCapitalizedResourceNameMatch<\n Name extends string,\n Resource extends string,\n> = Resource extends Resource\n ? Name extends `${CapitalizedResource<Resource>}${infer Suffix}`\n ? `${Capitalize<Resource>}${Suffix}`\n : never\n : never;\n\ntype SelectedResourceLayoutName<Arguments, Resource extends string> =\n Arguments extends ReadonlyArray<string>\n ? string\n : Arguments extends readonly [infer Options]\n ? Options extends {\n resources: ReadonlyArray<string>;\n name?: infer Name;\n }\n ? Name extends (...args: never[]) => unknown\n ? ResolveResourceLayoutName<Name>\n : Name extends Record<Resource, infer ResourceName>\n ? ResolveResourceLayoutName<ResourceName>\n : string\n : Options extends Record<Resource, infer ResourceOptions>\n ? ResourceOptions extends { name?: infer Name }\n ? ResolveResourceLayoutName<Name>\n : string\n : string\n : string;\n\ntype NormalizeResourceLayoutNames<Names, CallbackName extends string> = {\n [Resource in keyof Names]: Names[Resource] extends (\n ...args: never[]\n ) => unknown\n ? (\n resource: CapitalizedResource<Resource & string>,\n ) => NormalizeCapitalizedResourceName<CallbackName, Resource & string>\n : Names[Resource];\n};\n\ntype NormalizeResourceLayoutSelection<Selection> = {\n [Resource in keyof Selection]: Selection[Resource] extends {\n name: infer Name;\n }\n ? {\n name: Name extends (...args: never[]) => unknown\n ? (\n resource: CapitalizedResource<Resource & string>,\n ) => NormalizeCapitalizedResourceName<\n ResolveResourceLayoutName<Name>,\n Resource & string\n >\n : Name;\n }\n : Selection[Resource];\n};\n\ntype SharedResourceLayoutArguments<\n Resources extends ReadonlyArray<ResourceDefinition>,\n ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n Name extends string,\n> = readonly [\n {\n resources: ResourceKeys;\n name: (\n resource: CapitalizedResource<ResourceKeys[number]>,\n ) => NormalizeCapitalizedResourceName<Name, ResourceKeys[number]>;\n },\n];\n\ntype MappedResourceLayoutArguments<\n Resources extends ReadonlyArray<ResourceDefinition>,\n ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n Names,\n CallbackName extends string,\n> = readonly [\n {\n resources: ResourceKeys;\n name: NormalizeResourceLayoutNames<Names, CallbackName>;\n },\n];\n\ntype SelectedResourceLayoutArguments<Selection> = readonly [\n NormalizeResourceLayoutSelection<Selection>,\n];\n\ntype HasResourceLayoutName<Arguments, Resource extends string> =\n Arguments extends ReadonlyArray<string>\n ? false\n : Arguments extends readonly [infer Options]\n ? Options extends {\n resources: ReadonlyArray<string>;\n name: infer Name;\n }\n ? Name extends (...args: never[]) => unknown\n ? true\n : Name extends Record<Resource, unknown>\n ? true\n : false\n : Options extends Record<Resource, infer ResourceOptions>\n ? 'name' extends keyof ResourceOptions\n ? true\n : false\n : false\n : false;\n\ntype ScopedCreateResourceLayoutOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n Name extends string,\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Props extends InPropsObject,\n> = LayoutPropsForResource<Resources, InProps, Composables> & {\n resource: Resource;\n props?: Props;\n} & (HasResourceLayoutName<Arguments, Resource> extends true\n ? { name?: Name }\n : { name: Name });\n\ntype ScopedCreateResourceLayoutFnImpl<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n CustomProps extends InPropsObject,\n> = <\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Name extends string = SelectedResourceLayoutName<Arguments, Resource>,\n Props extends InPropsObject = {},\n>(\n options: ScopedCreateResourceLayoutOptions<\n Resources,\n InProps,\n Composables,\n Arguments,\n Name,\n Resource,\n Props\n >,\n) => ResourceLayoutComponent<Name, CustomProps, Composables, Resource>;\n\ntype ScopedCreateLayoutForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n CustomProps extends InPropsObject,\n> = <\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Name extends string = SelectedResourceLayoutName<Arguments, Resource>,\n>(\n options: CreateLayoutForResourceOptions<Resources, Name, Resource>,\n) => CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n> & {\n setDefaults: SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n >;\n};\n\ntype ScopedCreateResourceLayoutMakeComposableFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n> = <\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Name extends string = SelectedResourceLayoutName<Arguments, Resource>,\n Props extends InPropsObject = {},\n>(\n options: Omit<\n CreateResourceLayoutOptionsBase<Resources, Name, Resource>,\n 'name'\n > &\n Partial<LayoutPropsForResource<Resources, InProps, Composables>> & {\n props?: Props;\n } & (HasResourceLayoutName<Arguments, Resource> extends true\n ? { name?: Name }\n : { name: Name }),\n) => ComposableResourceLayout<Composables, Name, any, any, any>;\n\ntype ScopedComponentAvailableProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n LayoutCustomProps extends InPropsObject,\n> = MergedLayoutInProps<Resources, InProps, Composables> & LayoutCustomProps;\n\ntype ScopedResourceComponentProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n LayoutCustomProps extends InPropsObject,\n ComponentIncludeProps extends IncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >\n >,\n ComponentCustomProps extends InPropsObject,\n Resource extends string,\n> = Show<\n Omit<\n ResolvedIncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >,\n ComponentIncludeProps\n > &\n ResolveProps<ComponentCustomProps>,\n 'children' | 'resource'\n > & {\n children?: ReactNode;\n resource: Resource;\n }\n>;\n\ntype ScopedTargetResourceComponent<Resource extends string> = {\n (props: any): JSX.Element;\n readonly resource: Resource;\n};\n\ntype ScopedResourceComponentRenderOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n LayoutCustomProps extends InPropsObject,\n ComponentIncludeProps extends IncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >\n >,\n ComponentCustomProps extends InPropsObject,\n> = {\n [Resource in SelectedLayoutResources<Resources, Arguments>]?: {\n render: (\n props: ScopedResourceComponentProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps,\n Resource\n >,\n ) => JSX.Element;\n };\n};\n\ntype ScopedResourceComponentRenderContext<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Arguments extends ReadonlyArray<unknown>,\n> = {\n [Resource in SelectedLayoutResources<Resources, Arguments> as Capitalize<\n Resource\n >]: () => JSX.Element;\n};\n\ntype ScopedResourceComponent<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n LayoutCustomProps extends InPropsObject,\n ComponentIncludeProps extends IncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >\n >,\n ComponentCustomProps extends InPropsObject,\n> = BaseComponent<\n string,\n ScopedResourceComponentProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps,\n SelectedLayoutResources<Resources, Arguments>\n >\n> & {\n <\n const ResourceComponent extends ScopedTargetResourceComponent<\n SelectedLayoutResources<Resources, Arguments>\n > = ScopedTargetResourceComponent<\n SelectedLayoutResources<Resources, Arguments>\n >,\n >(\n props: ScopedResourceComponentProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps,\n ResourceComponent['resource']\n >,\n ): JSX.Element;\n};\n\ntype ScopedCreateComponent<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n LayoutCustomProps extends InPropsObject,\n> = <\n const ComponentIncludeProps extends IncludedProps<\n ScopedComponentAvailableProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps\n >\n > = {},\n ComponentCustomProps extends InPropsObject = {},\n>(options: {\n props?: {\n /** Props from the resource layout definition to expose to the component. */\n include?: ComponentIncludeProps;\n /** Additional props accepted by the component. */\n custom?: ComponentCustomProps;\n };\n /**\n * Renders the scoped component. `children` and `resource` are always\n * available. The context contains capitalized components for the selected\n * resources.\n */\n render: (\n props: ScopedResourceComponentProps<\n Resources,\n InProps,\n Composables,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps,\n SelectedLayoutResources<Resources, Arguments>\n >,\n context: ScopedResourceComponentRenderContext<Resources, Arguments>,\n ) => JSX.Element;\n} &\n ScopedResourceComponentRenderOptions<\n Resources,\n InProps,\n Composables,\n Arguments,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps\n >) => ScopedResourceComponent<\n Resources,\n InProps,\n Composables,\n Arguments,\n LayoutCustomProps,\n ComponentIncludeProps,\n ComponentCustomProps\n>;\n\ntype ScopedCreateResourceLayoutFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n CustomProps extends InPropsObject,\n> = ScopedCreateResourceLayoutFnImpl<\n Resources,\n InProps,\n Composables,\n Arguments,\n CustomProps\n> & {\n /**\n * Creates a component shared by the target resources. Included layout props\n * become component props, and `children` is always available as an optional\n * prop in both the render callback and at the call site.\n *\n * @example\n * const Directory = createDirectoryLayout.createComponent({\n * props: { include: { title: true, actions: 'optional' } },\n * users: {\n * render: ({ resource }) => <span>{resource}</span>,\n * },\n * render: ({ actions, children, resource, title }, context) => {\n * const ResourceRender = context.Users\n *\n * return (\n * <Page resource={resource} title={title} actions={actions}>\n * {children}\n * <ResourceRender />\n * </Page>\n * )\n * },\n * })\n *\n * <Directory<typeof UsersPage> resource='users' title='Users' />\n *\n * @param options The props configuration and component render function.\n * @returns A component scoped to the selected resources.\n */\n createComponent: ScopedCreateComponent<\n Resources,\n InProps,\n Composables,\n Arguments,\n CustomProps\n >;\n forResource: ScopedCreateLayoutForResource<\n Resources,\n InProps,\n Composables,\n Arguments,\n CustomProps\n >;\n /**\n * Type-only property containing the target resource union. This property is\n * `undefined` at runtime and exists solely for extracting the scoped type.\n *\n * @example\n * type AccountResource = typeof createAccountLayout.resources;\n */\n readonly resources: SelectedLayoutResources<Resources, Arguments>;\n} & ([keyof Composables] extends [never]\n ? {}\n : {\n makeComposable: ScopedCreateResourceLayoutMakeComposableFn<\n Resources,\n InProps,\n Composables,\n Arguments\n >;\n });\n\nexport type CreateResourceLayoutForResourcesFn<\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 /**\n * Creates a layout factory scoped to the listed resources.\n *\n * Layout names must be supplied when a layout is created.\n *\n * @example\n * createResourceLayout.forResources('users', 'admins')\n *\n * @param resources Resources available from the returned layout factory.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends readonly [\n LayoutResourceKey<Resources>,\n ...Array<LayoutResourceKey<Resources>>,\n ],\n >(\n ...resources: ResourceKeys\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n ResourceKeys,\n CustomProps\n >;\n\n /**\n * Creates a layout factory scoped to a resource list without default names.\n *\n * @example\n * createResourceLayout.forResources({ resources: ['users', 'admins'] })\n *\n * @param options The resources to expose without configured default names.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n >(options: {\n resources: ResourceKeys;\n name?: never;\n }): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n readonly [{ resources: ResourceKeys }],\n CustomProps\n >;\n\n /**\n * Creates a scoped layout factory with optional default names per resource.\n *\n * Each map key is limited to the resources selected in `resources`. Values\n * can be strings or callbacks receiving that resource's capitalized name.\n *\n * @example\n * createResourceLayout.forResources({\n * resources: ['users', 'admins'],\n * name: {\n * users: resource => `${resource}Page`,\n * admins: 'AdminDirectory',\n * },\n * })\n *\n * @param options The selected resources and their optional default names.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n const CallbackName extends string,\n const Names,\n >(\n options: {\n resources: ResourceKeys;\n name: SelectedResourceLayoutNames<\n LayoutResourceKey<Resources>,\n NoInfer<ResourceKeys[number]>,\n CallbackName\n > &\n AtLeastOneResourceLayoutNameKey<NoInfer<ResourceKeys[number]>> &\n Record<\n string,\n NonNullable<\n ResourceLayoutNames<\n LayoutResourceKey<Resources>,\n CallbackName\n >[LayoutResourceKey<Resources>]\n >\n >;\n } & {\n name: Names & Record<Exclude<keyof Names, ResourceKeys[number]>, never>;\n },\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n MappedResourceLayoutArguments<Resources, ResourceKeys, Names, CallbackName>,\n CustomProps\n >;\n\n /**\n * Creates a scoped layout factory with one default-name callback shared by\n * every selected resource. The callback receives a capitalized resource\n * whose `toLowerCase()` result retains the corresponding literal type.\n *\n * @example\n * createResourceLayout.forResources({\n * resources: ['users', 'admins'],\n * name: resource => `${resource}Page`,\n * })\n *\n * @param options The selected resources and shared default-name callback.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n const Name extends string,\n >(\n options: {\n resources: ReadonlyArray<LayoutResourceKey<Resources>>;\n name: (resource: CapitalizedResource<ResourceKeys[number]>) => Name;\n } & { resources: ResourceKeys },\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n SharedResourceLayoutArguments<Resources, ResourceKeys, Name>,\n CustomProps\n >;\n\n /**\n * Creates a scoped layout factory from a resource-keyed configuration.\n * Only configured resources are available from the returned factory.\n *\n * @example\n * createResourceLayout.forResources({\n * users: { name: resource => `${resource}Page` },\n * admins: { name: 'AdminDirectory' },\n * })\n *\n * @param options Resource-keyed layout defaults.\n * @returns A layout factory scoped to the configured resources.\n */\n <\n const CallbackName extends string,\n const Selection extends ResourceLayoutSelection<Resources, CallbackName>,\n >(\n options: Selection &\n AtLeastOneResourceLayoutSelection<Resources, CallbackName> &\n Partial<\n Record<Exclude<'resources', LayoutResourceKey<Resources>>, never>\n > &\n Record<Exclude<keyof Selection, LayoutResourceKey<Resources>>, never>,\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n SelectedResourceLayoutArguments<Selection>,\n CustomProps\n >;\n};\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 function createComponent(componentOptions: {\n [resource: string]: unknown;\n props?: {\n include?: Record<string, true | 'optional'>;\n custom?: Record<string, AnyBuiltPropDefinition>;\n };\n render: (\n props: Record<string, unknown>,\n context: Record<string, () => JSX.Element>,\n ) => JSX.Element;\n }) {\n const include = componentOptions.props?.include ?? {};\n const custom = componentOptions.props?.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 contextResources = new Map<string, LayoutResourceKey<Resources>>();\n const renderContext = Object.fromEntries(\n resourceOptions.map(({ resource }) => {\n const contextKey = capitalize(resource);\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 const resourceRenderOptions = componentOptions[resource] as\n | {\n render: (props: Record<string, unknown>) => JSX.Element;\n }\n | undefined;\n\n function ResourceRender() {\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 return resourceRenderOptions?.render({\n ...componentProps,\n resource,\n }) ?? (null as unknown as JSX.Element);\n }\n\n return [contextKey, ResourceRender];\n }),\n );\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 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 const propKey =\n 'type' in definition && definition.type === 'JSX.Element'\n ? capitalize(key)\n : key;\n\n if (inclusion === true || propKey in componentProps) {\n definitionsToValidate[propKey] = definition;\n }\n }\n\n for (const [key, definition] of Object.entries(custom)) {\n if (key === 'children' || key === 'resource') {\n continue;\n }\n\n const propKey =\n 'type' in definition && definition.type === 'JSX.Element'\n ? capitalize(key)\n : key;\n definitionsToValidate[propKey] = definition;\n }\n\n validateProps(definitionsToValidate, componentProps);\n\n return createElement(\n componentPropsContext.Provider,\n { value: componentProps },\n componentOptions.render(componentProps, renderContext),\n );\n }\n\n return Object.assign(Component, {\n displayName: 'ScopedResourceComponent',\n props: undefined,\n });\n }\n\n const scopedExtras: {\n createComponent: typeof createComponent;\n forResource: typeof scopedForResource;\n makeComposable?: (options: Record<string, unknown>) => unknown;\n resources: undefined;\n } = {\n createComponent,\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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"}
|