@jfdevelops/react-layout 0.21.0 → 0.22.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/create-config/create-resource-links.cjs +50 -20
- package/dist/create-config/create-resource-links.cjs.map +1 -1
- package/dist/create-config/create-resource-links.d.cts +18 -2
- package/dist/create-config/create-resource-links.d.cts.map +1 -1
- package/dist/create-config/create-resource-links.d.mts +18 -2
- package/dist/create-config/create-resource-links.d.mts.map +1 -1
- package/dist/create-config/create-resource-links.mjs +51 -20
- package/dist/create-config/create-resource-links.mjs.map +1 -1
- package/dist/create-config/define-layout.cjs +3 -2
- package/dist/create-config/define-layout.cjs.map +1 -1
- package/dist/create-config/define-layout.d.cts.map +1 -1
- package/dist/create-config/define-layout.d.mts.map +1 -1
- package/dist/create-config/define-layout.mjs +3 -2
- package/dist/create-config/define-layout.mjs.map +1 -1
- package/dist/create-config/for-paths/builder.cjs +6 -6
- package/dist/create-config/for-paths/builder.cjs.map +1 -1
- package/dist/create-config/for-paths/builder.mjs +6 -6
- package/dist/create-config/for-paths/builder.mjs.map +1 -1
- package/dist/create-config/for-resource.cjs +2 -1
- package/dist/create-config/for-resource.cjs.map +1 -1
- package/dist/create-config/for-resource.d.cts.map +1 -1
- package/dist/create-config/for-resource.d.mts.map +1 -1
- package/dist/create-config/for-resource.mjs +2 -1
- package/dist/create-config/for-resource.mjs.map +1 -1
- package/dist/create-config/for-resources/create-for-resources.cjs +15 -14
- package/dist/create-config/for-resources/create-for-resources.cjs.map +1 -1
- package/dist/create-config/for-resources/create-for-resources.mjs +15 -14
- package/dist/create-config/for-resources/create-for-resources.mjs.map +1 -1
- package/dist/create-config/index.d.cts +1 -1
- package/dist/create-config/index.d.mts +1 -1
- package/dist/errors/invalid-component.cjs +15 -7
- package/dist/errors/invalid-component.cjs.map +1 -1
- package/dist/errors/invalid-component.d.cts +106 -10
- package/dist/errors/invalid-component.d.cts.map +1 -1
- package/dist/errors/invalid-component.d.mts +106 -10
- package/dist/errors/invalid-component.d.mts.map +1 -1
- package/dist/errors/invalid-component.mjs +15 -7
- package/dist/errors/invalid-component.mjs.map +1 -1
- package/dist/errors/invalid-config.cjs +8 -3
- package/dist/errors/invalid-config.cjs.map +1 -1
- package/dist/errors/invalid-config.d.cts +96 -6
- package/dist/errors/invalid-config.d.cts.map +1 -1
- package/dist/errors/invalid-config.d.mts +96 -6
- package/dist/errors/invalid-config.d.mts.map +1 -1
- package/dist/errors/invalid-config.mjs +8 -3
- package/dist/errors/invalid-config.mjs.map +1 -1
- package/dist/errors/invalid-path.cjs +11 -5
- package/dist/errors/invalid-path.cjs.map +1 -1
- package/dist/errors/invalid-path.d.cts +100 -8
- package/dist/errors/invalid-path.d.cts.map +1 -1
- package/dist/errors/invalid-path.d.mts +100 -8
- package/dist/errors/invalid-path.d.mts.map +1 -1
- package/dist/errors/invalid-path.mjs +11 -5
- package/dist/errors/invalid-path.mjs.map +1 -1
- package/dist/errors/invalid-resource.cjs +11 -5
- package/dist/errors/invalid-resource.cjs.map +1 -1
- package/dist/errors/invalid-resource.d.cts +100 -8
- package/dist/errors/invalid-resource.d.cts.map +1 -1
- package/dist/errors/invalid-resource.d.mts +100 -8
- package/dist/errors/invalid-resource.d.mts.map +1 -1
- package/dist/errors/invalid-resource.mjs +11 -5
- package/dist/errors/invalid-resource.mjs.map +1 -1
- package/dist/errors/invalid-sub-resource.cjs +12 -5
- package/dist/errors/invalid-sub-resource.cjs.map +1 -1
- package/dist/errors/invalid-sub-resource.d.cts +103 -9
- package/dist/errors/invalid-sub-resource.d.cts.map +1 -1
- package/dist/errors/invalid-sub-resource.d.mts +103 -9
- package/dist/errors/invalid-sub-resource.d.mts.map +1 -1
- package/dist/errors/invalid-sub-resource.mjs +12 -5
- package/dist/errors/invalid-sub-resource.mjs.map +1 -1
- package/dist/errors/layout-configuration-error.cjs +17 -0
- package/dist/errors/layout-configuration-error.cjs.map +1 -0
- package/dist/errors/layout-configuration-error.d.cts +99 -0
- package/dist/errors/layout-configuration-error.d.cts.map +1 -0
- package/dist/errors/layout-configuration-error.d.mts +99 -0
- package/dist/errors/layout-configuration-error.d.mts.map +1 -0
- package/dist/errors/layout-configuration-error.mjs +17 -0
- package/dist/errors/layout-configuration-error.mjs.map +1 -0
- package/dist/errors/missing-path-variable.cjs +12 -5
- package/dist/errors/missing-path-variable.cjs.map +1 -1
- package/dist/errors/missing-path-variable.d.cts +99 -7
- package/dist/errors/missing-path-variable.d.cts.map +1 -1
- package/dist/errors/missing-path-variable.d.mts +99 -7
- package/dist/errors/missing-path-variable.d.mts.map +1 -1
- package/dist/errors/missing-path-variable.mjs +12 -5
- package/dist/errors/missing-path-variable.mjs.map +1 -1
- package/dist/errors/react-layout-error.cjs +38 -43
- package/dist/errors/react-layout-error.cjs.map +1 -1
- package/dist/errors/react-layout-error.d.cts +81 -38
- package/dist/errors/react-layout-error.d.cts.map +1 -1
- package/dist/errors/react-layout-error.d.mts +81 -38
- package/dist/errors/react-layout-error.d.mts.map +1 -1
- package/dist/errors/react-layout-error.mjs +39 -43
- package/dist/errors/react-layout-error.mjs.map +1 -1
- package/dist/index.cjs +4 -3
- package/dist/index.d.cts +4 -2
- package/dist/index.d.mts +4 -2
- package/dist/index.mjs +5 -4
- package/dist/node_modules/.pnpm/@jfdevelops_create-error@0.2.0_patch_hash_afc71b16c3f866f54416d30f467784ddc31736feb04f281a5fc4772ea422f4a9/node_modules/@jfdevelops/create-error/dist/types.d.cts +107 -0
- package/dist/node_modules/.pnpm/@jfdevelops_create-error@0.2.0_patch_hash_afc71b16c3f866f54416d30f467784ddc31736feb04f281a5fc4772ea422f4a9/node_modules/@jfdevelops/create-error/dist/types.d.cts.map +1 -0
- package/dist/node_modules/.pnpm/@jfdevelops_create-error@0.2.0_patch_hash_afc71b16c3f866f54416d30f467784ddc31736feb04f281a5fc4772ea422f4a9/node_modules/@jfdevelops/create-error/dist/types.d.mts +107 -0
- package/dist/node_modules/.pnpm/@jfdevelops_create-error@0.2.0_patch_hash_afc71b16c3f866f54416d30f467784ddc31736feb04f281a5fc4772ea422f4a9/node_modules/@jfdevelops/create-error/dist/types.d.mts.map +1 -0
- package/dist/resource.cjs +2 -1
- package/dist/resource.cjs.map +1 -1
- package/dist/resource.d.cts.map +1 -1
- package/dist/resource.d.mts.map +1 -1
- package/dist/resource.mjs +3 -1
- package/dist/resource.mjs.map +1 -1
- package/package.json +8 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.mjs","names":[],"sources":["../../../src/create-config/for-paths/builder.ts"],"sourcesContent":["import type { JSX } from 'react';\nimport {\n InvalidComponentError,\n InvalidPathError,\n InvalidResourceError,\n InvalidSubResourceError,\n} from '../../errors';\nimport type { ResourceDefinition } from '../../resource';\nimport type { IsUnion, Show } from '../../utils';\nimport {\n collectPathComponentKeys,\n collectPathResources,\n collectPathSubResourceKeys,\n extractPathVariables,\n flattenSubResourceParam,\n generateResourceConfigPaths,\n} from '../paths';\nimport type {\n PathComponentKeys,\n PathVariables,\n SubResourceParamValue,\n} from '../paths';\nimport {\n createGetComponentForPath,\n type CreateGetComponentForPath,\n} from './get-component-for-path';\n\ntype UnwrapTargetPaths<Paths> = Paths extends readonly [\n infer First,\n ...infer Rest,\n]\n ? (First & string) | UnwrapTargetPaths<Rest>\n : Paths extends readonly (infer Path)[]\n ? Path & string\n : never;\n\ntype PathVariablesForPaths<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Config,\n Paths extends ReadonlyArray<string>,\n> =\n UnwrapTargetPaths<Paths> extends infer Path\n ? Path extends string\n ? PathVariables<Resources, Config, Path>\n : never\n : never;\n\ntype ComponentKeysForPaths<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Config,\n Paths extends ReadonlyArray<string>,\n> =\n UnwrapTargetPaths<Paths> extends infer Path\n ? Path extends string\n ? PathComponentKeys<Resources, Config, Path>\n : never\n : never;\n\ntype ValueOrFunction<Value, Input> = Value | ((input: Input) => Value);\n\n/** Context handed to `render` and to `setDisplayName`. */\nexport type ForPathsRenderContext<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Config,\n Paths extends ReadonlyArray<string>,\n Params,\n> = {\n /** Declared params merged with the props the component was called with. */\n params: Params;\n /** Creates a getter for any of the paths this component was built for. */\n getComponentForPath: CreateGetComponentForPath<\n Resources,\n Config,\n UnwrapTargetPaths<Paths>\n >;\n};\n\ntype HOFArgSelection<Params> = {\n [Key in keyof Params]?: true;\n};\n\n/**\n * Value closed over by `asHOF`. Selecting a single arg closes over that value directly;\n * selecting several closes over an object.\n */\ntype HOFClosureValue<Params, Args> = [keyof Args] extends [never]\n ? {}\n : IsUnion<keyof Args> extends false\n ? Params[keyof Args & keyof Params]\n : Show<Pick<Params, keyof Args & keyof Params>>;\n\nexport interface RenderedPathComponentHOF<Params, Args> {\n (closure: HOFClosureValue<Params, Args>): RenderedPathComponent<\n Show<Omit<Params, keyof Args>>\n >;\n /** Type-only view of the value this HOF closes over. At runtime this is `undefined`. */\n _args: HOFClosureValue<Params, Args>;\n}\n\nexport interface RenderedPathComponent<\n Params,\n DisplayName extends string = string,\n> {\n (props: Params): JSX.Element;\n displayName: DisplayName;\n /** Type-only view of the props this component accepts. */\n _args: Params;\n /**\n * Splits the props into a closure and the remaining props, so shared params can be\n * bound once and the component reused. Chained `asHOF` calls keep prior closures.\n */\n asHOF<Args extends HOFArgSelection<Params> = {}>(options?: {\n /** Params to close over. Anything omitted stays a prop. */\n args: Args;\n }): RenderedPathComponentHOF<Params, Args>;\n}\n\ntype WithComponentKeyParam<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Config,\n Paths extends ReadonlyArray<string>,\n Optional extends boolean,\n> = Optional extends true\n ? { componentKey?: ComponentKeysForPaths<Resources, Config, Paths> }\n : { componentKey: ComponentKeysForPaths<Resources, Config, Paths> };\n\ntype PickedPathParams<\n Variables,\n Picked,\n> = [keyof Picked] extends [never]\n ? Variables\n : Pick<Variables, keyof Picked & keyof Variables>;\n\nexport type TargetPathBuilder<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Config,\n Paths extends ReadonlyArray<string>,\n Params extends Record<string, unknown> = {},\n Used extends\n | 'addComponentKeyParams'\n | 'addPathParams'\n | 'addParams' = never,\n> = {\n render: (\n renderer: (\n context: ForPathsRenderContext<Resources, Config, Paths, Params>,\n ) => JSX.Element,\n ) => RenderedPathComponent<Params> & {\n /** Names the component, either statically or from the render context. */\n setDisplayName<Name extends string>(\n name: ValueOrFunction<\n Name,\n ForPathsRenderContext<Resources, Config, Paths, Params>\n >,\n ): RenderedPathComponent<Params, Name>;\n };\n} & ('addComponentKeyParams' extends Used\n ? {}\n : {\n /**\n * Adds a `componentKey` prop narrowed to the component slots configured for these\n * paths. Call it before `render` when building a reusable component.\n */\n addComponentKeyParams<Optional extends boolean = false>(options?: {\n /** Whether the caller may omit `componentKey`. */\n optional?: Optional;\n }): TargetPathBuilder<\n Resources,\n Config,\n Paths,\n Show<\n Params & WithComponentKeyParam<Resources, Config, Paths, Optional>\n >,\n Used | 'addComponentKeyParams'\n >;\n }) &\n ('addPathParams' extends Used\n ? {}\n : {\n /**\n * Turns the variables these paths leave open into props. Without `pick`, every\n * variable becomes a prop.\n */\n addPathParams<\n Variables extends PathVariablesForPaths<Resources, Config, Paths>,\n Picked extends { [Key in keyof Variables]?: true } = {},\n >(options?: {\n /** Variables to expose as props. Defaults to all of them. */\n pick?: Picked;\n }): TargetPathBuilder<\n Resources,\n Config,\n Paths,\n Show<Params & PickedPathParams<Variables, Picked>>,\n Used | 'addPathParams'\n >;\n }) &\n ('addParams' extends Used\n ? {}\n : {\n /**\n * Adds custom params with the given values as defaults. Defaults are\n * optional at the call site and filled in before `render` runs.\n */\n addParams<NewParams extends Record<string, unknown>>(\n params: NewParams,\n ): TargetPathBuilder<\n Resources,\n Config,\n Paths,\n Show<Params & Partial<NewParams>>,\n Used | 'addParams'\n >;\n });\n\nexport type ForPaths<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Config,\n AllowedPath extends string,\n> = <const Paths extends readonly [AllowedPath, ...AllowedPath[]]>(\n ...paths: Paths\n) => TargetPathBuilder<Resources, Config, Paths>;\n\nconst DEFAULT_DISPLAY_NAME = 'ResourcePathComponent';\n\ntype BuilderState = {\n paths: readonly string[];\n paramDefaults: Record<string, unknown>;\n declaredPathParams: readonly string[];\n componentKeyDeclared: boolean;\n componentKeyOptional: boolean;\n usedComponentKeyParams: boolean;\n usedPathParams: boolean;\n usedParams: boolean;\n};\n\ntype ValidationSets = {\n resources: readonly string[];\n subResources: readonly string[];\n components: readonly string[];\n};\n\nfunction collectValidationSets(\n config: Record<string, unknown>,\n paths: readonly string[],\n): ValidationSets {\n const resources = new Set<string>();\n const subResources = new Set<string>();\n const components = new Set<string>();\n\n for (const path of paths) {\n for (const resource of collectPathResources(config, path)) {\n resources.add(resource);\n }\n\n for (const subResource of collectPathSubResourceKeys(config, path)) {\n subResources.add(subResource);\n }\n\n for (const component of collectPathComponentKeys(config, path)) {\n components.add(component);\n }\n }\n\n return {\n resources: [...resources],\n subResources: [...subResources],\n components: [...components],\n };\n}\n\n/**\n * Validates the params a caller passed before the renderer runs, so a bad resource or\n * slot fails with a typed error naming what is available.\n */\nfunction validateParams(\n params: Record<string, unknown>,\n state: BuilderState,\n sets: ValidationSets,\n): void {\n const { resource, subResource, component, componentKey } = params as {\n resource?: unknown;\n subResource?: unknown;\n component?: unknown;\n componentKey?: unknown;\n };\n\n if (state.declaredPathParams.includes('resource') && resource !== undefined) {\n if (typeof resource !== 'string' || !sets.resources.includes(resource)) {\n throw new InvalidResourceError({\n resource,\n validResources: sets.resources,\n });\n }\n }\n\n if (\n state.declaredPathParams.includes('subResource') &&\n subResource !== undefined\n ) {\n const slugs = flattenSubResourceParam(subResource as SubResourceParamValue);\n\n for (const slug of slugs) {\n if (!sets.subResources.includes(slug)) {\n throw new InvalidSubResourceError({\n subResource: slug,\n resource: typeof resource === 'string' ? resource : undefined,\n validSubResources: sets.subResources,\n });\n }\n }\n }\n\n if (\n state.declaredPathParams.includes('component') &&\n component !== undefined\n ) {\n if (typeof component !== 'string' || !sets.components.includes(component)) {\n throw new InvalidComponentError({\n component,\n validComponents: sets.components,\n });\n }\n }\n\n if (!state.componentKeyDeclared) {\n return;\n }\n\n if (componentKey === undefined) {\n if (!state.componentKeyOptional) {\n throw new InvalidComponentError({\n component: componentKey,\n validComponents: sets.components,\n reason: 'A \"componentKey\" prop is required for this component',\n });\n }\n\n return;\n }\n\n if (\n typeof componentKey !== 'string' ||\n !sets.components.includes(componentKey)\n ) {\n throw new InvalidComponentError({\n component: componentKey,\n validComponents: sets.components,\n });\n }\n}\n\nfunction readClosureProps(\n selected: string[],\n closure: unknown,\n): Record<string, unknown> {\n if (selected.length === 0) {\n return {};\n }\n\n const [only] = selected;\n\n if (selected.length === 1 && only !== undefined) {\n return { [only]: closure };\n }\n\n if (\n typeof closure === 'object' &&\n closure !== null &&\n !Array.isArray(closure)\n ) {\n return { ...(closure as Record<string, unknown>) };\n }\n\n return {};\n}\n\nfunction createRenderedComponent(\n runRenderer: (props: Record<string, unknown>) => JSX.Element,\n paramTemplate: Record<string, unknown> | undefined,\n resolveDisplayName?: (props: Record<string, unknown>) => string,\n boundProps: Record<string, unknown> = {},\n) {\n function RenderedPathView(props: Record<string, unknown>): JSX.Element {\n const merged = { ...boundProps, ...props };\n\n if (resolveDisplayName) {\n RenderedPathView.displayName = resolveDisplayName(merged);\n }\n\n return runRenderer(merged);\n }\n\n RenderedPathView.displayName = DEFAULT_DISPLAY_NAME;\n\n function asHOF(options?: { args?: Record<string, true> }) {\n const selected = Object.entries(options?.args ?? {})\n .filter(([, enabled]) => enabled === true)\n .map(([key]) => key);\n\n function hof(closure: unknown) {\n const bound = createRenderedComponent(\n runRenderer,\n undefined,\n resolveDisplayName,\n { ...boundProps, ...readClosureProps(selected, closure) },\n );\n\n bound.displayName = RenderedPathView.displayName;\n\n return bound;\n }\n\n return Object.assign(hof, { _args: undefined as never });\n }\n\n return Object.assign(RenderedPathView, {\n _args: paramTemplate as never,\n asHOF,\n });\n}\n\nexport function createTargetPathBuilder<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Config extends Record<string, unknown>,\n Paths extends ReadonlyArray<string>,\n>(config: Config, paths: Paths): TargetPathBuilder<Resources, Config, Paths> {\n const validationSets = collectValidationSets(config, paths);\n\n const makeBuilder = (state: BuilderState): Record<string, unknown> => {\n const builder: Record<string, unknown> = {};\n\n if (!state.usedComponentKeyParams) {\n builder.addComponentKeyParams = (options?: { optional?: boolean }) =>\n makeBuilder({\n ...state,\n usedComponentKeyParams: true,\n componentKeyDeclared: true,\n componentKeyOptional: options?.optional === true,\n });\n }\n\n if (!state.usedPathParams) {\n builder.addPathParams = (options?: { pick?: Record<string, true> }) => {\n const available = new Set<string>();\n\n for (const path of state.paths) {\n for (const name of extractPathVariables(path)) {\n available.add(name);\n }\n }\n\n const picked = Object.entries(options?.pick ?? {})\n .filter(([, enabled]) => enabled === true)\n .map(([key]) => key);\n const declared =\n picked.length === 0\n ? [...available]\n : picked.filter((name) => available.has(name));\n\n return makeBuilder({\n ...state,\n usedPathParams: true,\n declaredPathParams: [...state.declaredPathParams, ...declared],\n });\n };\n }\n\n if (!state.usedParams) {\n builder.addParams = (params: Record<string, unknown>) =>\n makeBuilder({\n ...state,\n usedParams: true,\n paramDefaults: { ...state.paramDefaults, ...params },\n });\n }\n\n builder.render = (\n renderer: (context: {\n params: Record<string, unknown>;\n getComponentForPath: unknown;\n }) => JSX.Element,\n ) => {\n const buildContext = (props: Record<string, unknown>) => {\n const params = { ...state.paramDefaults, ...props };\n\n validateParams(params, state, validationSets);\n\n return {\n params,\n getComponentForPath: (path: string) => {\n if (!state.paths.includes(path)) {\n throw new InvalidPathError({\n path,\n validPaths: state.paths,\n reason: 'This component was not built for that path',\n });\n }\n\n return createGetComponentForPath(config, path);\n },\n };\n };\n\n const runRenderer = (props: Record<string, unknown>) =>\n renderer(buildContext(props));\n\n const component = createRenderedComponent(runRenderer, {\n ...state.paramDefaults,\n });\n\n return Object.assign(component, {\n setDisplayName: (\n name:\n | string\n | ((context: {\n params: Record<string, unknown>;\n getComponentForPath: unknown;\n }) => string),\n ) => {\n if (typeof name === 'string') {\n const named = createRenderedComponent(runRenderer, {\n ...state.paramDefaults,\n });\n\n named.displayName = name;\n\n return named;\n }\n\n return createRenderedComponent(\n runRenderer,\n { ...state.paramDefaults },\n (props) => name(buildContext(props)),\n );\n },\n });\n };\n\n return builder;\n };\n\n return makeBuilder({\n paths,\n paramDefaults: {},\n declaredPathParams: [],\n componentKeyDeclared: false,\n componentKeyOptional: false,\n usedComponentKeyParams: false,\n usedPathParams: false,\n usedParams: false,\n }) as unknown as TargetPathBuilder<Resources, Config, Paths>;\n}\n\nexport function createForPaths<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Config extends Record<string, unknown>,\n>(config: Config): ForPaths<Resources, Config, string> {\n const validPaths = generateResourceConfigPaths(config);\n\n return ((...paths: string[]) => {\n if (paths.length === 0) {\n throw new InvalidPathError({\n path: paths,\n validPaths,\n reason: 'At least one path is required',\n });\n }\n\n for (const path of paths) {\n if (!validPaths.includes(path)) {\n throw new InvalidPathError({ path, validPaths });\n }\n }\n\n return createTargetPathBuilder(config, paths);\n }) as unknown as ForPaths<Resources, Config, string>;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"builder.mjs","names":[],"sources":["../../../src/create-config/for-paths/builder.ts"],"sourcesContent":["import type { JSX } from 'react';\nimport {\n InvalidComponentError,\n InvalidPathError,\n InvalidResourceError,\n InvalidSubResourceError,\n} from '../../errors';\nimport type { ResourceDefinition } from '../../resource';\nimport type { IsUnion, Show } from '../../utils';\nimport {\n collectPathComponentKeys,\n collectPathResources,\n collectPathSubResourceKeys,\n extractPathVariables,\n flattenSubResourceParam,\n generateResourceConfigPaths,\n} from '../paths';\nimport type {\n PathComponentKeys,\n PathVariables,\n SubResourceParamValue,\n} from '../paths';\nimport {\n createGetComponentForPath,\n type CreateGetComponentForPath,\n} from './get-component-for-path';\n\ntype UnwrapTargetPaths<Paths> = Paths extends readonly [\n infer First,\n ...infer Rest,\n]\n ? (First & string) | UnwrapTargetPaths<Rest>\n : Paths extends readonly (infer Path)[]\n ? Path & string\n : never;\n\ntype PathVariablesForPaths<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Config,\n Paths extends ReadonlyArray<string>,\n> =\n UnwrapTargetPaths<Paths> extends infer Path\n ? Path extends string\n ? PathVariables<Resources, Config, Path>\n : never\n : never;\n\ntype ComponentKeysForPaths<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Config,\n Paths extends ReadonlyArray<string>,\n> =\n UnwrapTargetPaths<Paths> extends infer Path\n ? Path extends string\n ? PathComponentKeys<Resources, Config, Path>\n : never\n : never;\n\ntype ValueOrFunction<Value, Input> = Value | ((input: Input) => Value);\n\n/** Context handed to `render` and to `setDisplayName`. */\nexport type ForPathsRenderContext<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Config,\n Paths extends ReadonlyArray<string>,\n Params,\n> = {\n /** Declared params merged with the props the component was called with. */\n params: Params;\n /** Creates a getter for any of the paths this component was built for. */\n getComponentForPath: CreateGetComponentForPath<\n Resources,\n Config,\n UnwrapTargetPaths<Paths>\n >;\n};\n\ntype HOFArgSelection<Params> = {\n [Key in keyof Params]?: true;\n};\n\n/**\n * Value closed over by `asHOF`. Selecting a single arg closes over that value directly;\n * selecting several closes over an object.\n */\ntype HOFClosureValue<Params, Args> = [keyof Args] extends [never]\n ? {}\n : IsUnion<keyof Args> extends false\n ? Params[keyof Args & keyof Params]\n : Show<Pick<Params, keyof Args & keyof Params>>;\n\nexport interface RenderedPathComponentHOF<Params, Args> {\n (closure: HOFClosureValue<Params, Args>): RenderedPathComponent<\n Show<Omit<Params, keyof Args>>\n >;\n /** Type-only view of the value this HOF closes over. At runtime this is `undefined`. */\n _args: HOFClosureValue<Params, Args>;\n}\n\nexport interface RenderedPathComponent<\n Params,\n DisplayName extends string = string,\n> {\n (props: Params): JSX.Element;\n displayName: DisplayName;\n /** Type-only view of the props this component accepts. */\n _args: Params;\n /**\n * Splits the props into a closure and the remaining props, so shared params can be\n * bound once and the component reused. Chained `asHOF` calls keep prior closures.\n */\n asHOF<Args extends HOFArgSelection<Params> = {}>(options?: {\n /** Params to close over. Anything omitted stays a prop. */\n args: Args;\n }): RenderedPathComponentHOF<Params, Args>;\n}\n\ntype WithComponentKeyParam<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Config,\n Paths extends ReadonlyArray<string>,\n Optional extends boolean,\n> = Optional extends true\n ? { componentKey?: ComponentKeysForPaths<Resources, Config, Paths> }\n : { componentKey: ComponentKeysForPaths<Resources, Config, Paths> };\n\ntype PickedPathParams<\n Variables,\n Picked,\n> = [keyof Picked] extends [never]\n ? Variables\n : Pick<Variables, keyof Picked & keyof Variables>;\n\nexport type TargetPathBuilder<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Config,\n Paths extends ReadonlyArray<string>,\n Params extends Record<string, unknown> = {},\n Used extends\n | 'addComponentKeyParams'\n | 'addPathParams'\n | 'addParams' = never,\n> = {\n render: (\n renderer: (\n context: ForPathsRenderContext<Resources, Config, Paths, Params>,\n ) => JSX.Element,\n ) => RenderedPathComponent<Params> & {\n /** Names the component, either statically or from the render context. */\n setDisplayName<Name extends string>(\n name: ValueOrFunction<\n Name,\n ForPathsRenderContext<Resources, Config, Paths, Params>\n >,\n ): RenderedPathComponent<Params, Name>;\n };\n} & ('addComponentKeyParams' extends Used\n ? {}\n : {\n /**\n * Adds a `componentKey` prop narrowed to the component slots configured for these\n * paths. Call it before `render` when building a reusable component.\n */\n addComponentKeyParams<Optional extends boolean = false>(options?: {\n /** Whether the caller may omit `componentKey`. */\n optional?: Optional;\n }): TargetPathBuilder<\n Resources,\n Config,\n Paths,\n Show<\n Params & WithComponentKeyParam<Resources, Config, Paths, Optional>\n >,\n Used | 'addComponentKeyParams'\n >;\n }) &\n ('addPathParams' extends Used\n ? {}\n : {\n /**\n * Turns the variables these paths leave open into props. Without `pick`, every\n * variable becomes a prop.\n */\n addPathParams<\n Variables extends PathVariablesForPaths<Resources, Config, Paths>,\n Picked extends { [Key in keyof Variables]?: true } = {},\n >(options?: {\n /** Variables to expose as props. Defaults to all of them. */\n pick?: Picked;\n }): TargetPathBuilder<\n Resources,\n Config,\n Paths,\n Show<Params & PickedPathParams<Variables, Picked>>,\n Used | 'addPathParams'\n >;\n }) &\n ('addParams' extends Used\n ? {}\n : {\n /**\n * Adds custom params with the given values as defaults. Defaults are\n * optional at the call site and filled in before `render` runs.\n */\n addParams<NewParams extends Record<string, unknown>>(\n params: NewParams,\n ): TargetPathBuilder<\n Resources,\n Config,\n Paths,\n Show<Params & Partial<NewParams>>,\n Used | 'addParams'\n >;\n });\n\nexport type ForPaths<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Config,\n AllowedPath extends string,\n> = <const Paths extends readonly [AllowedPath, ...AllowedPath[]]>(\n ...paths: Paths\n) => TargetPathBuilder<Resources, Config, Paths>;\n\nconst DEFAULT_DISPLAY_NAME = 'ResourcePathComponent';\n\ntype BuilderState = {\n paths: readonly string[];\n paramDefaults: Record<string, unknown>;\n declaredPathParams: readonly string[];\n componentKeyDeclared: boolean;\n componentKeyOptional: boolean;\n usedComponentKeyParams: boolean;\n usedPathParams: boolean;\n usedParams: boolean;\n};\n\ntype ValidationSets = {\n resources: readonly string[];\n subResources: readonly string[];\n components: readonly string[];\n};\n\nfunction collectValidationSets(\n config: Record<string, unknown>,\n paths: readonly string[],\n): ValidationSets {\n const resources = new Set<string>();\n const subResources = new Set<string>();\n const components = new Set<string>();\n\n for (const path of paths) {\n for (const resource of collectPathResources(config, path)) {\n resources.add(resource);\n }\n\n for (const subResource of collectPathSubResourceKeys(config, path)) {\n subResources.add(subResource);\n }\n\n for (const component of collectPathComponentKeys(config, path)) {\n components.add(component);\n }\n }\n\n return {\n resources: [...resources],\n subResources: [...subResources],\n components: [...components],\n };\n}\n\n/**\n * Validates the params a caller passed before the renderer runs, so a bad resource or\n * slot fails with a typed error naming what is available.\n */\nfunction validateParams(\n params: Record<string, unknown>,\n state: BuilderState,\n sets: ValidationSets,\n): void {\n const { resource, subResource, component, componentKey } = params as {\n resource?: unknown;\n subResource?: unknown;\n component?: unknown;\n componentKey?: unknown;\n };\n\n if (state.declaredPathParams.includes('resource') && resource !== undefined) {\n if (typeof resource !== 'string' || !sets.resources.includes(resource)) {\n throw new InvalidResourceError({\n resource,\n validResources: [...sets.resources],\n });\n }\n }\n\n if (\n state.declaredPathParams.includes('subResource') &&\n subResource !== undefined\n ) {\n const slugs = flattenSubResourceParam(subResource as SubResourceParamValue);\n\n for (const slug of slugs) {\n if (!sets.subResources.includes(slug)) {\n throw new InvalidSubResourceError({\n subResource: slug,\n resource: typeof resource === 'string' ? resource : undefined,\n validSubResources: [...sets.subResources],\n });\n }\n }\n }\n\n if (\n state.declaredPathParams.includes('component') &&\n component !== undefined\n ) {\n if (typeof component !== 'string' || !sets.components.includes(component)) {\n throw new InvalidComponentError({\n component,\n validComponents: [...sets.components],\n });\n }\n }\n\n if (!state.componentKeyDeclared) {\n return;\n }\n\n if (componentKey === undefined) {\n if (!state.componentKeyOptional) {\n throw new InvalidComponentError({\n component: componentKey,\n validComponents: [...sets.components],\n reason: 'A \"componentKey\" prop is required for this component',\n });\n }\n\n return;\n }\n\n if (\n typeof componentKey !== 'string' ||\n !sets.components.includes(componentKey)\n ) {\n throw new InvalidComponentError({\n component: componentKey,\n validComponents: [...sets.components],\n });\n }\n}\n\nfunction readClosureProps(\n selected: string[],\n closure: unknown,\n): Record<string, unknown> {\n if (selected.length === 0) {\n return {};\n }\n\n const [only] = selected;\n\n if (selected.length === 1 && only !== undefined) {\n return { [only]: closure };\n }\n\n if (\n typeof closure === 'object' &&\n closure !== null &&\n !Array.isArray(closure)\n ) {\n return { ...(closure as Record<string, unknown>) };\n }\n\n return {};\n}\n\nfunction createRenderedComponent(\n runRenderer: (props: Record<string, unknown>) => JSX.Element,\n paramTemplate: Record<string, unknown> | undefined,\n resolveDisplayName?: (props: Record<string, unknown>) => string,\n boundProps: Record<string, unknown> = {},\n) {\n function RenderedPathView(props: Record<string, unknown>): JSX.Element {\n const merged = { ...boundProps, ...props };\n\n if (resolveDisplayName) {\n RenderedPathView.displayName = resolveDisplayName(merged);\n }\n\n return runRenderer(merged);\n }\n\n RenderedPathView.displayName = DEFAULT_DISPLAY_NAME;\n\n function asHOF(options?: { args?: Record<string, true> }) {\n const selected = Object.entries(options?.args ?? {})\n .filter(([, enabled]) => enabled === true)\n .map(([key]) => key);\n\n function hof(closure: unknown) {\n const bound = createRenderedComponent(\n runRenderer,\n undefined,\n resolveDisplayName,\n { ...boundProps, ...readClosureProps(selected, closure) },\n );\n\n bound.displayName = RenderedPathView.displayName;\n\n return bound;\n }\n\n return Object.assign(hof, { _args: undefined as never });\n }\n\n return Object.assign(RenderedPathView, {\n _args: paramTemplate as never,\n asHOF,\n });\n}\n\nexport function createTargetPathBuilder<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Config extends Record<string, unknown>,\n Paths extends ReadonlyArray<string>,\n>(config: Config, paths: Paths): TargetPathBuilder<Resources, Config, Paths> {\n const validationSets = collectValidationSets(config, paths);\n\n const makeBuilder = (state: BuilderState): Record<string, unknown> => {\n const builder: Record<string, unknown> = {};\n\n if (!state.usedComponentKeyParams) {\n builder.addComponentKeyParams = (options?: { optional?: boolean }) =>\n makeBuilder({\n ...state,\n usedComponentKeyParams: true,\n componentKeyDeclared: true,\n componentKeyOptional: options?.optional === true,\n });\n }\n\n if (!state.usedPathParams) {\n builder.addPathParams = (options?: { pick?: Record<string, true> }) => {\n const available = new Set<string>();\n\n for (const path of state.paths) {\n for (const name of extractPathVariables(path)) {\n available.add(name);\n }\n }\n\n const picked = Object.entries(options?.pick ?? {})\n .filter(([, enabled]) => enabled === true)\n .map(([key]) => key);\n const declared =\n picked.length === 0\n ? [...available]\n : picked.filter((name) => available.has(name));\n\n return makeBuilder({\n ...state,\n usedPathParams: true,\n declaredPathParams: [...state.declaredPathParams, ...declared],\n });\n };\n }\n\n if (!state.usedParams) {\n builder.addParams = (params: Record<string, unknown>) =>\n makeBuilder({\n ...state,\n usedParams: true,\n paramDefaults: { ...state.paramDefaults, ...params },\n });\n }\n\n builder.render = (\n renderer: (context: {\n params: Record<string, unknown>;\n getComponentForPath: unknown;\n }) => JSX.Element,\n ) => {\n const buildContext = (props: Record<string, unknown>) => {\n const params = { ...state.paramDefaults, ...props };\n\n validateParams(params, state, validationSets);\n\n return {\n params,\n getComponentForPath: (path: string) => {\n if (!state.paths.includes(path)) {\n throw new InvalidPathError({\n path,\n validPaths: [...state.paths],\n reason: 'This component was not built for that path',\n });\n }\n\n return createGetComponentForPath(config, path);\n },\n };\n };\n\n const runRenderer = (props: Record<string, unknown>) =>\n renderer(buildContext(props));\n\n const component = createRenderedComponent(runRenderer, {\n ...state.paramDefaults,\n });\n\n return Object.assign(component, {\n setDisplayName: (\n name:\n | string\n | ((context: {\n params: Record<string, unknown>;\n getComponentForPath: unknown;\n }) => string),\n ) => {\n if (typeof name === 'string') {\n const named = createRenderedComponent(runRenderer, {\n ...state.paramDefaults,\n });\n\n named.displayName = name;\n\n return named;\n }\n\n return createRenderedComponent(\n runRenderer,\n { ...state.paramDefaults },\n (props) => name(buildContext(props)),\n );\n },\n });\n };\n\n return builder;\n };\n\n return makeBuilder({\n paths,\n paramDefaults: {},\n declaredPathParams: [],\n componentKeyDeclared: false,\n componentKeyOptional: false,\n usedComponentKeyParams: false,\n usedPathParams: false,\n usedParams: false,\n }) as unknown as TargetPathBuilder<Resources, Config, Paths>;\n}\n\nexport function createForPaths<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Config extends Record<string, unknown>,\n>(config: Config): ForPaths<Resources, Config, string> {\n const validPaths = generateResourceConfigPaths(config);\n\n return ((...paths: string[]) => {\n if (paths.length === 0) {\n throw new InvalidPathError({\n path: paths,\n validPaths,\n reason: 'At least one path is required',\n });\n }\n\n for (const path of paths) {\n if (!validPaths.includes(path)) {\n throw new InvalidPathError({ path, validPaths });\n }\n }\n\n return createTargetPathBuilder(config, paths);\n }) as unknown as ForPaths<Resources, Config, string>;\n}\n"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const require_layout_configuration_error = require('../errors/layout-configuration-error.cjs');
|
|
1
2
|
const require_capitalize = require('../utils/capitalize.cjs');
|
|
2
3
|
|
|
3
4
|
//#region src/create-config/for-resource.ts
|
|
@@ -31,7 +32,7 @@ function createForResource({ createResourceLayout, resolveLayoutOptionDefaults }
|
|
|
31
32
|
name = options.name;
|
|
32
33
|
}
|
|
33
34
|
}
|
|
34
|
-
if (!resource) throw new
|
|
35
|
+
if (!resource) throw new require_layout_configuration_error.LayoutConfigurationError("\"resource\" is required when calling \"forResource\"");
|
|
35
36
|
const selectedName = name !== null && typeof name === "object" ? name[resource] : name;
|
|
36
37
|
let defaultName;
|
|
37
38
|
if (typeof selectedName === "function") defaultName = selectedName(require_capitalize.capitalize(resource));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"for-resource.cjs","names":["capitalize"],"sources":["../../src/create-config/for-resource.ts"],"sourcesContent":["import type { ComposableComponents } from '@jfdevelops/react-layout-composables';\nimport type {\n InPropsDefinition,\n InPropsObject,\n MergedLayoutInProps,\n ResolvedIncludedComponentProps,\n} from '../props';\nimport type {\n LayoutResourceKey,\n ResourceDefinition,\n} from '../resource';\nimport type { UnionToIntersection, Updater } from '../utils';\nimport { capitalize } from '../utils/capitalize';\nimport type {\n LayoutIncludeProps,\n LayoutPropsForResource,\n ResourceLayoutComponent,\n} from './define-layout';\n\ntype LayoutPropDefaults = Record<string, unknown>;\n\ntype CreateTimeLayoutPropWithDefault<\n LayoutProps extends LayoutPropDefaults,\n Key extends keyof LayoutProps,\n> = LayoutProps[Key] extends (...args: unknown[]) => unknown\n ? LayoutProps[Key]\n : Updater<LayoutProps[Key]>;\n\ntype ResolveLayoutPropsWithDefaults<\n LayoutProps extends LayoutPropDefaults,\n Defaults extends LayoutPropDefaults,\n> = Omit<LayoutProps, keyof Defaults> & {\n [Key in keyof Defaults & keyof LayoutProps]?: CreateTimeLayoutPropWithDefault<\n LayoutProps,\n Key\n >;\n};\n\nexport type CreateResourceLayoutOptionsBase<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n> = {\n name: Name;\n resource: Resource;\n props?: Props;\n};\n\nexport type CreateResourceLayoutOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n> = LayoutPropsForResource<Resources, InProps, Composables, IncludeProps> &\n CreateResourceLayoutOptionsBase<Resources, Name, Resource, Props>;\n\nexport type CreateLayoutForResourceOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n> = {\n name?: Name;\n resource: Resource;\n};\n\ntype CreatedLayoutForResourceOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Props extends InPropsObject = {},\n Defaults extends LayoutPropDefaults = {},\n> = ResolveLayoutPropsWithDefaults<\n LayoutPropsForResource<Resources, InProps, Composables, IncludeProps>,\n Defaults\n> & {\n props?: Props;\n};\n\ntype CreatedLayoutForResourceCallOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n OverrideName extends string,\n Props extends InPropsObject,\n Defaults extends LayoutPropDefaults,\n> = CreatedLayoutForResourceOptions<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Props,\n Defaults\n> & {\n name?: OverrideName;\n};\n\nexport type CreatedLayoutForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n CustomProps extends InPropsObject = {},\n Defaults extends LayoutPropDefaults = {},\n> = <OverrideName extends string = Name, Props extends InPropsObject = {}>(\n ...args: {} extends CreatedLayoutForResourceCallOptions<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n OverrideName,\n Props,\n Defaults\n >\n ? [options?: CreatedLayoutForResourceCallOptions<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n OverrideName,\n Props,\n Defaults\n >]\n : [options: CreatedLayoutForResourceCallOptions<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n OverrideName,\n Props,\n Defaults\n >]\n) => ResourceLayoutComponent<\n OverrideName,\n CustomProps,\n Composables,\n Resource,\n ResolvedIncludedComponentProps<\n MergedLayoutInProps<Resources, InProps, Composables>,\n IncludeProps\n >\n>;\n\ntype SetDefaultPropsForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents = {},\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {},\n> = Partial<\n LayoutPropsForResource<Resources, InProps, Composables, IncludeProps>\n>;\n\ntype ResolvedSetDefaultProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Defaults extends SetDefaultPropsForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps\n >,\n> = {\n [Key in keyof Defaults &\n keyof LayoutPropsForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps\n >]: LayoutPropsForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps\n >[Key];\n};\n\nexport type SetDefaultPropForResourceFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n CustomProps extends InPropsObject = {},\n> = <\n const Defaults extends SetDefaultPropsForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps\n >,\n>(\n /** Default values for layout props. Each prop can only be set once. */\n defaults: Defaults,\n) => CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps,\n ResolvedSetDefaultProps<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Defaults\n >\n>;\n\ntype CapitalizedResource<Resource extends string> =\n Resource extends Resource\n ? {\n toLowerCase: () => Lowercase<Capitalize<Resource>>;\n } & Capitalize<Resource>\n : never;\n\ntype ResourceLayoutNames<\n Resource extends string,\n CallbackName extends 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 NormalizeCapitalizedResourceName<\n Name extends string,\n Resource extends string,\n> = Name extends Name\n ? NormalizeCapitalizedResourceNameMatch<\n Name,\n Resource\n > extends infer Match extends string\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 ResourceLayoutBuilder<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n CustomProps extends InPropsObject,\n> = CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps\n> & {\n /** Set default values for layout props in a single call. */\n setDefaults: SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps\n >;\n};\n\ntype SingleResourceLayoutSelection<\n Resources extends ReadonlyArray<ResourceDefinition>,\n CallbackName extends string,\n> = {\n [Resource in LayoutResourceKey<Resources>]: Record<\n Resource,\n {\n name?:\n | string\n | ((resource: CapitalizedResource<Resource>) => CallbackName);\n }\n > &\n Partial<\n Record<\n Exclude<LayoutResourceKey<Resources>, Resource>,\n never\n >\n >;\n}[LayoutResourceKey<Resources>];\n\ntype SelectedResourceName<Selection, Resource extends string> =\n Selection extends Record<Resource, { name?: infer Name }>\n ? Name extends (...args: never[]) => infer CallbackName\n ? NormalizeCapitalizedResourceName<CallbackName & string, Resource>\n : Name extends string\n ? Name\n : string\n : string;\n\ntype MappedResourceName<\n Names,\n CallbackName extends string,\n Resource extends string,\n> = Names extends Record<Resource, infer Name>\n ? Name extends (...args: never[]) => unknown\n ? NormalizeCapitalizedResourceName<CallbackName, Resource>\n : Name & string\n : string;\n\n/**\n * Creates a layout builder with a resource-keyed default-name map.\n *\n * @example\n * createResourceLayout.forResource({\n * resource: 'users',\n * name: {\n * users: resource => `${resource}Page`,\n * },\n * })\n *\n * @param options The resource and its resource-keyed default name.\n * @returns A layout builder bound to the selected resource.\n */\ntype ResourceLayoutNameMapFn<\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 Resource extends LayoutResourceKey<Resources>,\n> = <const CallbackName extends string, const Names>(\n options: {\n resource: Resource;\n name: SelectedResourceLayoutNames<\n LayoutResourceKey<Resources>,\n Resource,\n CallbackName\n > &\n AtLeastOneResourceLayoutNameKey<Resource> &\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, Resource>, never>;\n },\n) => ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n MappedResourceName<Names, CallbackName, Resource>,\n Resource,\n CustomProps\n>;\n\ntype ResourceLayoutNameMapFns<\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> = UnionToIntersection<\n {\n [Resource in LayoutResourceKey<Resources>]: ResourceLayoutNameMapFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps,\n Resource\n >;\n }[LayoutResourceKey<Resources>]\n>;\n\nexport type CreateLayoutForResource<\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 builder for one resource without a default name.\n *\n * @example\n * createResourceLayout.forResource('users')\n *\n * @param resource The resource to bind to the returned layout builder.\n * @returns A layout builder bound to the selected resource.\n */\n <const Resource extends LayoutResourceKey<Resources>>(\n resource: Resource,\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n string,\n Resource,\n CustomProps\n >;\n\n /**\n * Creates a layout builder with a capitalized-resource naming callback.\n *\n * @example\n * createResourceLayout.forResource({\n * resource: 'users',\n * name: resource => `${resource}Page`,\n * })\n *\n * @param options The resource and its default-name callback.\n * @returns A layout builder bound to the selected resource.\n */\n <\n const Resource extends LayoutResourceKey<Resources>,\n const Name extends string,\n >(\n options: {\n name: (resource: CapitalizedResource<Resource>) => Name;\n resource: Resource;\n },\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n NormalizeCapitalizedResourceName<Name, Resource>,\n Resource,\n CustomProps\n >;\n\n /**\n * Creates a layout builder from the existing resource-options notation.\n *\n * @example\n * createResourceLayout.forResource({\n * resource: 'users',\n * name: 'UsersPage',\n * })\n *\n * @param options The resource and its optional default name.\n * @returns A layout builder bound to the selected resource.\n */\n <\n const Resource extends LayoutResourceKey<Resources>,\n const Name extends string = string,\n >(\n options: CreateLayoutForResourceOptions<Resources, Name, Resource>,\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps\n >;\n\n /**\n * Creates a layout builder from a single resource-keyed configuration.\n *\n * @example\n * createResourceLayout.forResource({\n * users: { name: resource => `${resource}Page` },\n * })\n *\n * @param options A single resource-keyed layout configuration.\n * @returns A layout builder bound to the configured resource.\n */\n <\n const CallbackName extends string,\n const Selection extends SingleResourceLayoutSelection<\n Resources,\n CallbackName\n >,\n >(\n options: Selection,\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n SelectedResourceName<\n Selection,\n keyof Selection & LayoutResourceKey<Resources>\n >,\n keyof Selection & LayoutResourceKey<Resources>,\n CustomProps\n >;\n} & ResourceLayoutNameMapFns<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n>;\n\ntype CreateForResourceOptions = {\n createResourceLayout: (options: Record<string, unknown>) => unknown;\n resolveLayoutOptionDefaults: (\n defaults: Record<string, unknown>,\n options: Record<string, unknown>,\n ) => Record<string, unknown>;\n};\n\nexport function createForResource<\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 createResourceLayout,\n resolveLayoutOptionDefaults,\n}: CreateForResourceOptions) {\n function createLayoutForResource<\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Defaults extends LayoutPropDefaults,\n >(\n defaultName: Name | undefined,\n resource: Resource,\n defaults: Record<string, unknown>,\n ) {\n return ((\n layoutOptions: { name?: string } & Record<string, unknown> = {},\n ) => {\n const { name, ...options } = layoutOptions;\n\n return createResourceLayout({\n ...defaults,\n name: name ?? defaultName,\n resource,\n ...resolveLayoutOptionDefaults(defaults, options),\n });\n }) as CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps,\n Defaults\n >;\n }\n\n function createLayoutForResourceBuilder<\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n >(defaultName: Name | undefined, resource: Resource) {\n const createLayout = createLayoutForResource(defaultName, resource, {});\n const setDefaults = ((defaults) =>\n createLayoutForResource(\n defaultName,\n resource,\n defaults,\n )) as SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps\n >;\n\n return Object.assign(createLayout, { setDefaults });\n }\n\n const forResource = ((resourceOrOptions: unknown) => {\n type ResourceName =\n | string\n | ((resource: CapitalizedResource<LayoutResourceKey<Resources>>) => string);\n let name:\n | ResourceName\n | Partial<Record<LayoutResourceKey<Resources>, ResourceName>>\n | undefined;\n let resource: LayoutResourceKey<Resources> | undefined;\n\n if (typeof resourceOrOptions === 'string') {\n resource = resourceOrOptions as LayoutResourceKey<Resources>;\n } else if (\n resourceOrOptions !== null &&\n typeof resourceOrOptions === 'object' &&\n ('resource' in resourceOrOptions || 'name' in resourceOrOptions)\n ) {\n ({ name, resource } = resourceOrOptions as {\n name?: typeof name;\n resource?: LayoutResourceKey<Resources>;\n });\n } else {\n const [selection] = Object.entries(resourceOrOptions ?? {});\n\n if (selection) {\n const [selectedResource, options] = selection;\n resource = selectedResource as LayoutResourceKey<Resources>;\n name = (options as { name?: typeof name }).name;\n }\n }\n\n if (!resource) {\n throw new Error('\"resource\" is required when calling \"forResource\"');\n }\n\n const selectedName =\n name !== null && typeof name === 'object' ? name[resource] : name;\n let defaultName: string | undefined;\n\n if (typeof selectedName === 'function') {\n defaultName = selectedName(\n capitalize(resource) as CapitalizedResource<\n LayoutResourceKey<Resources>\n >,\n );\n } else if (typeof selectedName === 'string') {\n defaultName = selectedName;\n }\n\n return createLayoutForResourceBuilder(defaultName, resource);\n }) as CreateLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n >;\n\n return { createLayoutForResourceBuilder, forResource };\n}\n"],"mappings":";;;AAmiBA,SAAgB,kBAMd,EACA,sBACA,+BAC2B;CAC3B,SAAS,wBAKP,aACA,UACA,UACA;EACA,SACE,gBAA6D,CAAC,MAC3D;GACH,MAAM,EAAE,MAAM,GAAG,YAAY;GAE7B,OAAO,qBAAqB;IAC1B,GAAG;IACH,MAAM,QAAQ;IACd;IACA,GAAG,4BAA4B,UAAU,OAAO;GAClD,CAAC;EACH;CAUF;CAEA,SAAS,+BAGP,aAA+B,UAAoB;EACnD,MAAM,eAAe,wBAAwB,aAAa,UAAU,CAAC,CAAC;EACtE,MAAM,gBAAgB,aACpB,wBACE,aACA,UACA,QACF;EAUF,OAAO,OAAO,OAAO,cAAc,EAAE,YAAY,CAAC;CACpD;CAEA,MAAM,gBAAgB,sBAA+B;EAInD,IAAI;EAIJ,IAAI;EAEJ,IAAI,OAAO,sBAAsB,UAC/B,WAAW;OACN,IACL,sBAAsB,QACtB,OAAO,sBAAsB,aAC5B,cAAc,qBAAqB,UAAU,oBAE9C,CAAC,CAAE,MAAM,YAAa;OAIjB;GACL,MAAM,CAAC,aAAa,OAAO,QAAQ,qBAAqB,CAAC,CAAC;GAE1D,IAAI,WAAW;IACb,MAAM,CAAC,kBAAkB,WAAW;IACpC,WAAW;IACX,OAAQ,QAAmC;GAC7C;EACF;EAEA,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,uDAAmD;EAGrE,MAAM,eACJ,SAAS,QAAQ,OAAO,SAAS,WAAW,KAAK,YAAY;EAC/D,IAAI;EAEJ,IAAI,OAAO,iBAAiB,YAC1B,cAAc,aACZA,8BAAW,QAAQ,CAGrB;OACK,IAAI,OAAO,iBAAiB,UACjC,cAAc;EAGhB,OAAO,+BAA+B,aAAa,QAAQ;CAC7D;CAQA,OAAO;EAAE;EAAgC;CAAY;AACvD"}
|
|
1
|
+
{"version":3,"file":"for-resource.cjs","names":["LayoutConfigurationError","capitalize"],"sources":["../../src/create-config/for-resource.ts"],"sourcesContent":["import type { ComposableComponents } from '@jfdevelops/react-layout-composables';\nimport type {\n InPropsDefinition,\n InPropsObject,\n MergedLayoutInProps,\n ResolvedIncludedComponentProps,\n} from '../props';\nimport type {\n LayoutResourceKey,\n ResourceDefinition,\n} from '../resource';\nimport type { UnionToIntersection, Updater } from '../utils';\nimport { LayoutConfigurationError } from '../errors';\nimport { capitalize } from '../utils/capitalize';\nimport type {\n LayoutIncludeProps,\n LayoutPropsForResource,\n ResourceLayoutComponent,\n} from './define-layout';\n\ntype LayoutPropDefaults = Record<string, unknown>;\n\ntype CreateTimeLayoutPropWithDefault<\n LayoutProps extends LayoutPropDefaults,\n Key extends keyof LayoutProps,\n> = LayoutProps[Key] extends (...args: unknown[]) => unknown\n ? LayoutProps[Key]\n : Updater<LayoutProps[Key]>;\n\ntype ResolveLayoutPropsWithDefaults<\n LayoutProps extends LayoutPropDefaults,\n Defaults extends LayoutPropDefaults,\n> = Omit<LayoutProps, keyof Defaults> & {\n [Key in keyof Defaults & keyof LayoutProps]?: CreateTimeLayoutPropWithDefault<\n LayoutProps,\n Key\n >;\n};\n\nexport type CreateResourceLayoutOptionsBase<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n> = {\n name: Name;\n resource: Resource;\n props?: Props;\n};\n\nexport type CreateResourceLayoutOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n> = LayoutPropsForResource<Resources, InProps, Composables, IncludeProps> &\n CreateResourceLayoutOptionsBase<Resources, Name, Resource, Props>;\n\nexport type CreateLayoutForResourceOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n> = {\n name?: Name;\n resource: Resource;\n};\n\ntype CreatedLayoutForResourceOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Props extends InPropsObject = {},\n Defaults extends LayoutPropDefaults = {},\n> = ResolveLayoutPropsWithDefaults<\n LayoutPropsForResource<Resources, InProps, Composables, IncludeProps>,\n Defaults\n> & {\n props?: Props;\n};\n\ntype CreatedLayoutForResourceCallOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n OverrideName extends string,\n Props extends InPropsObject,\n Defaults extends LayoutPropDefaults,\n> = CreatedLayoutForResourceOptions<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Props,\n Defaults\n> & {\n name?: OverrideName;\n};\n\nexport type CreatedLayoutForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n CustomProps extends InPropsObject = {},\n Defaults extends LayoutPropDefaults = {},\n> = <OverrideName extends string = Name, Props extends InPropsObject = {}>(\n ...args: {} extends CreatedLayoutForResourceCallOptions<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n OverrideName,\n Props,\n Defaults\n >\n ? [options?: CreatedLayoutForResourceCallOptions<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n OverrideName,\n Props,\n Defaults\n >]\n : [options: CreatedLayoutForResourceCallOptions<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n OverrideName,\n Props,\n Defaults\n >]\n) => ResourceLayoutComponent<\n OverrideName,\n CustomProps,\n Composables,\n Resource,\n ResolvedIncludedComponentProps<\n MergedLayoutInProps<Resources, InProps, Composables>,\n IncludeProps\n >\n>;\n\ntype SetDefaultPropsForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents = {},\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {},\n> = Partial<\n LayoutPropsForResource<Resources, InProps, Composables, IncludeProps>\n>;\n\ntype ResolvedSetDefaultProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Defaults extends SetDefaultPropsForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps\n >,\n> = {\n [Key in keyof Defaults &\n keyof LayoutPropsForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps\n >]: LayoutPropsForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps\n >[Key];\n};\n\nexport type SetDefaultPropForResourceFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n CustomProps extends InPropsObject = {},\n> = <\n const Defaults extends SetDefaultPropsForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps\n >,\n>(\n /** Default values for layout props. Each prop can only be set once. */\n defaults: Defaults,\n) => CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps,\n ResolvedSetDefaultProps<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Defaults\n >\n>;\n\ntype CapitalizedResource<Resource extends string> =\n Resource extends Resource\n ? {\n toLowerCase: () => Lowercase<Capitalize<Resource>>;\n } & Capitalize<Resource>\n : never;\n\ntype ResourceLayoutNames<\n Resource extends string,\n CallbackName extends 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 NormalizeCapitalizedResourceName<\n Name extends string,\n Resource extends string,\n> = Name extends Name\n ? NormalizeCapitalizedResourceNameMatch<\n Name,\n Resource\n > extends infer Match extends string\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 ResourceLayoutBuilder<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n CustomProps extends InPropsObject,\n> = CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps\n> & {\n /** Set default values for layout props in a single call. */\n setDefaults: SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps\n >;\n};\n\ntype SingleResourceLayoutSelection<\n Resources extends ReadonlyArray<ResourceDefinition>,\n CallbackName extends string,\n> = {\n [Resource in LayoutResourceKey<Resources>]: Record<\n Resource,\n {\n name?:\n | string\n | ((resource: CapitalizedResource<Resource>) => CallbackName);\n }\n > &\n Partial<\n Record<\n Exclude<LayoutResourceKey<Resources>, Resource>,\n never\n >\n >;\n}[LayoutResourceKey<Resources>];\n\ntype SelectedResourceName<Selection, Resource extends string> =\n Selection extends Record<Resource, { name?: infer Name }>\n ? Name extends (...args: never[]) => infer CallbackName\n ? NormalizeCapitalizedResourceName<CallbackName & string, Resource>\n : Name extends string\n ? Name\n : string\n : string;\n\ntype MappedResourceName<\n Names,\n CallbackName extends string,\n Resource extends string,\n> = Names extends Record<Resource, infer Name>\n ? Name extends (...args: never[]) => unknown\n ? NormalizeCapitalizedResourceName<CallbackName, Resource>\n : Name & string\n : string;\n\n/**\n * Creates a layout builder with a resource-keyed default-name map.\n *\n * @example\n * createResourceLayout.forResource({\n * resource: 'users',\n * name: {\n * users: resource => `${resource}Page`,\n * },\n * })\n *\n * @param options The resource and its resource-keyed default name.\n * @returns A layout builder bound to the selected resource.\n */\ntype ResourceLayoutNameMapFn<\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 Resource extends LayoutResourceKey<Resources>,\n> = <const CallbackName extends string, const Names>(\n options: {\n resource: Resource;\n name: SelectedResourceLayoutNames<\n LayoutResourceKey<Resources>,\n Resource,\n CallbackName\n > &\n AtLeastOneResourceLayoutNameKey<Resource> &\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, Resource>, never>;\n },\n) => ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n MappedResourceName<Names, CallbackName, Resource>,\n Resource,\n CustomProps\n>;\n\ntype ResourceLayoutNameMapFns<\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> = UnionToIntersection<\n {\n [Resource in LayoutResourceKey<Resources>]: ResourceLayoutNameMapFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps,\n Resource\n >;\n }[LayoutResourceKey<Resources>]\n>;\n\nexport type CreateLayoutForResource<\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 builder for one resource without a default name.\n *\n * @example\n * createResourceLayout.forResource('users')\n *\n * @param resource The resource to bind to the returned layout builder.\n * @returns A layout builder bound to the selected resource.\n */\n <const Resource extends LayoutResourceKey<Resources>>(\n resource: Resource,\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n string,\n Resource,\n CustomProps\n >;\n\n /**\n * Creates a layout builder with a capitalized-resource naming callback.\n *\n * @example\n * createResourceLayout.forResource({\n * resource: 'users',\n * name: resource => `${resource}Page`,\n * })\n *\n * @param options The resource and its default-name callback.\n * @returns A layout builder bound to the selected resource.\n */\n <\n const Resource extends LayoutResourceKey<Resources>,\n const Name extends string,\n >(\n options: {\n name: (resource: CapitalizedResource<Resource>) => Name;\n resource: Resource;\n },\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n NormalizeCapitalizedResourceName<Name, Resource>,\n Resource,\n CustomProps\n >;\n\n /**\n * Creates a layout builder from the existing resource-options notation.\n *\n * @example\n * createResourceLayout.forResource({\n * resource: 'users',\n * name: 'UsersPage',\n * })\n *\n * @param options The resource and its optional default name.\n * @returns A layout builder bound to the selected resource.\n */\n <\n const Resource extends LayoutResourceKey<Resources>,\n const Name extends string = string,\n >(\n options: CreateLayoutForResourceOptions<Resources, Name, Resource>,\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps\n >;\n\n /**\n * Creates a layout builder from a single resource-keyed configuration.\n *\n * @example\n * createResourceLayout.forResource({\n * users: { name: resource => `${resource}Page` },\n * })\n *\n * @param options A single resource-keyed layout configuration.\n * @returns A layout builder bound to the configured resource.\n */\n <\n const CallbackName extends string,\n const Selection extends SingleResourceLayoutSelection<\n Resources,\n CallbackName\n >,\n >(\n options: Selection,\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n SelectedResourceName<\n Selection,\n keyof Selection & LayoutResourceKey<Resources>\n >,\n keyof Selection & LayoutResourceKey<Resources>,\n CustomProps\n >;\n} & ResourceLayoutNameMapFns<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n>;\n\ntype CreateForResourceOptions = {\n createResourceLayout: (options: Record<string, unknown>) => unknown;\n resolveLayoutOptionDefaults: (\n defaults: Record<string, unknown>,\n options: Record<string, unknown>,\n ) => Record<string, unknown>;\n};\n\nexport function createForResource<\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 createResourceLayout,\n resolveLayoutOptionDefaults,\n}: CreateForResourceOptions) {\n function createLayoutForResource<\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Defaults extends LayoutPropDefaults,\n >(\n defaultName: Name | undefined,\n resource: Resource,\n defaults: Record<string, unknown>,\n ) {\n return ((\n layoutOptions: { name?: string } & Record<string, unknown> = {},\n ) => {\n const { name, ...options } = layoutOptions;\n\n return createResourceLayout({\n ...defaults,\n name: name ?? defaultName,\n resource,\n ...resolveLayoutOptionDefaults(defaults, options),\n });\n }) as CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps,\n Defaults\n >;\n }\n\n function createLayoutForResourceBuilder<\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n >(defaultName: Name | undefined, resource: Resource) {\n const createLayout = createLayoutForResource(defaultName, resource, {});\n const setDefaults = ((defaults) =>\n createLayoutForResource(\n defaultName,\n resource,\n defaults,\n )) as SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps\n >;\n\n return Object.assign(createLayout, { setDefaults });\n }\n\n const forResource = ((resourceOrOptions: unknown) => {\n type ResourceName =\n | string\n | ((resource: CapitalizedResource<LayoutResourceKey<Resources>>) => string);\n let name:\n | ResourceName\n | Partial<Record<LayoutResourceKey<Resources>, ResourceName>>\n | undefined;\n let resource: LayoutResourceKey<Resources> | undefined;\n\n if (typeof resourceOrOptions === 'string') {\n resource = resourceOrOptions as LayoutResourceKey<Resources>;\n } else if (\n resourceOrOptions !== null &&\n typeof resourceOrOptions === 'object' &&\n ('resource' in resourceOrOptions || 'name' in resourceOrOptions)\n ) {\n ({ name, resource } = resourceOrOptions as {\n name?: typeof name;\n resource?: LayoutResourceKey<Resources>;\n });\n } else {\n const [selection] = Object.entries(resourceOrOptions ?? {});\n\n if (selection) {\n const [selectedResource, options] = selection;\n resource = selectedResource as LayoutResourceKey<Resources>;\n name = (options as { name?: typeof name }).name;\n }\n }\n\n if (!resource) {\n throw new LayoutConfigurationError('\"resource\" is required when calling \"forResource\"');\n }\n\n const selectedName =\n name !== null && typeof name === 'object' ? name[resource] : name;\n let defaultName: string | undefined;\n\n if (typeof selectedName === 'function') {\n defaultName = selectedName(\n capitalize(resource) as CapitalizedResource<\n LayoutResourceKey<Resources>\n >,\n );\n } else if (typeof selectedName === 'string') {\n defaultName = selectedName;\n }\n\n return createLayoutForResourceBuilder(defaultName, resource);\n }) as CreateLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n >;\n\n return { createLayoutForResourceBuilder, forResource };\n}\n"],"mappings":";;;;AAoiBA,SAAgB,kBAMd,EACA,sBACA,+BAC2B;CAC3B,SAAS,wBAKP,aACA,UACA,UACA;EACA,SACE,gBAA6D,CAAC,MAC3D;GACH,MAAM,EAAE,MAAM,GAAG,YAAY;GAE7B,OAAO,qBAAqB;IAC1B,GAAG;IACH,MAAM,QAAQ;IACd;IACA,GAAG,4BAA4B,UAAU,OAAO;GAClD,CAAC;EACH;CAUF;CAEA,SAAS,+BAGP,aAA+B,UAAoB;EACnD,MAAM,eAAe,wBAAwB,aAAa,UAAU,CAAC,CAAC;EACtE,MAAM,gBAAgB,aACpB,wBACE,aACA,UACA,QACF;EAUF,OAAO,OAAO,OAAO,cAAc,EAAE,YAAY,CAAC;CACpD;CAEA,MAAM,gBAAgB,sBAA+B;EAInD,IAAI;EAIJ,IAAI;EAEJ,IAAI,OAAO,sBAAsB,UAC/B,WAAW;OACN,IACL,sBAAsB,QACtB,OAAO,sBAAsB,aAC5B,cAAc,qBAAqB,UAAU,oBAE9C,CAAC,CAAE,MAAM,YAAa;OAIjB;GACL,MAAM,CAAC,aAAa,OAAO,QAAQ,qBAAqB,CAAC,CAAC;GAE1D,IAAI,WAAW;IACb,MAAM,CAAC,kBAAkB,WAAW;IACpC,WAAW;IACX,OAAQ,QAAmC;GAC7C;EACF;EAEA,IAAI,CAAC,UACH,MAAM,IAAIA,4DAAyB,uDAAmD;EAGxF,MAAM,eACJ,SAAS,QAAQ,OAAO,SAAS,WAAW,KAAK,YAAY;EAC/D,IAAI;EAEJ,IAAI,OAAO,iBAAiB,YAC1B,cAAc,aACZC,8BAAW,QAAQ,CAGrB;OACK,IAAI,OAAO,iBAAiB,UACjC,cAAc;EAGhB,OAAO,+BAA+B,aAAa,QAAQ;CAC7D;CAQA,OAAO;EAAE;EAAgC;CAAY;AACvD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"for-resource.d.cts","names":[],"sources":["../../src/create-config/for-resource.ts"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"for-resource.d.cts","names":[],"sources":["../../src/create-config/for-resource.ts"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"for-resource.d.mts","names":[],"sources":["../../src/create-config/for-resource.ts"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"for-resource.d.mts","names":[],"sources":["../../src/create-config/for-resource.ts"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { LayoutConfigurationError } from "../errors/layout-configuration-error.mjs";
|
|
1
2
|
import { capitalize } from "../utils/capitalize.mjs";
|
|
2
3
|
|
|
3
4
|
//#region src/create-config/for-resource.ts
|
|
@@ -31,7 +32,7 @@ function createForResource({ createResourceLayout, resolveLayoutOptionDefaults }
|
|
|
31
32
|
name = options.name;
|
|
32
33
|
}
|
|
33
34
|
}
|
|
34
|
-
if (!resource) throw new
|
|
35
|
+
if (!resource) throw new LayoutConfigurationError("\"resource\" is required when calling \"forResource\"");
|
|
35
36
|
const selectedName = name !== null && typeof name === "object" ? name[resource] : name;
|
|
36
37
|
let defaultName;
|
|
37
38
|
if (typeof selectedName === "function") defaultName = selectedName(capitalize(resource));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"for-resource.mjs","names":[],"sources":["../../src/create-config/for-resource.ts"],"sourcesContent":["import type { ComposableComponents } from '@jfdevelops/react-layout-composables';\nimport type {\n InPropsDefinition,\n InPropsObject,\n MergedLayoutInProps,\n ResolvedIncludedComponentProps,\n} from '../props';\nimport type {\n LayoutResourceKey,\n ResourceDefinition,\n} from '../resource';\nimport type { UnionToIntersection, Updater } from '../utils';\nimport { capitalize } from '../utils/capitalize';\nimport type {\n LayoutIncludeProps,\n LayoutPropsForResource,\n ResourceLayoutComponent,\n} from './define-layout';\n\ntype LayoutPropDefaults = Record<string, unknown>;\n\ntype CreateTimeLayoutPropWithDefault<\n LayoutProps extends LayoutPropDefaults,\n Key extends keyof LayoutProps,\n> = LayoutProps[Key] extends (...args: unknown[]) => unknown\n ? LayoutProps[Key]\n : Updater<LayoutProps[Key]>;\n\ntype ResolveLayoutPropsWithDefaults<\n LayoutProps extends LayoutPropDefaults,\n Defaults extends LayoutPropDefaults,\n> = Omit<LayoutProps, keyof Defaults> & {\n [Key in keyof Defaults & keyof LayoutProps]?: CreateTimeLayoutPropWithDefault<\n LayoutProps,\n Key\n >;\n};\n\nexport type CreateResourceLayoutOptionsBase<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n> = {\n name: Name;\n resource: Resource;\n props?: Props;\n};\n\nexport type CreateResourceLayoutOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n> = LayoutPropsForResource<Resources, InProps, Composables, IncludeProps> &\n CreateResourceLayoutOptionsBase<Resources, Name, Resource, Props>;\n\nexport type CreateLayoutForResourceOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n> = {\n name?: Name;\n resource: Resource;\n};\n\ntype CreatedLayoutForResourceOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Props extends InPropsObject = {},\n Defaults extends LayoutPropDefaults = {},\n> = ResolveLayoutPropsWithDefaults<\n LayoutPropsForResource<Resources, InProps, Composables, IncludeProps>,\n Defaults\n> & {\n props?: Props;\n};\n\ntype CreatedLayoutForResourceCallOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n OverrideName extends string,\n Props extends InPropsObject,\n Defaults extends LayoutPropDefaults,\n> = CreatedLayoutForResourceOptions<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Props,\n Defaults\n> & {\n name?: OverrideName;\n};\n\nexport type CreatedLayoutForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n CustomProps extends InPropsObject = {},\n Defaults extends LayoutPropDefaults = {},\n> = <OverrideName extends string = Name, Props extends InPropsObject = {}>(\n ...args: {} extends CreatedLayoutForResourceCallOptions<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n OverrideName,\n Props,\n Defaults\n >\n ? [options?: CreatedLayoutForResourceCallOptions<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n OverrideName,\n Props,\n Defaults\n >]\n : [options: CreatedLayoutForResourceCallOptions<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n OverrideName,\n Props,\n Defaults\n >]\n) => ResourceLayoutComponent<\n OverrideName,\n CustomProps,\n Composables,\n Resource,\n ResolvedIncludedComponentProps<\n MergedLayoutInProps<Resources, InProps, Composables>,\n IncludeProps\n >\n>;\n\ntype SetDefaultPropsForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents = {},\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {},\n> = Partial<\n LayoutPropsForResource<Resources, InProps, Composables, IncludeProps>\n>;\n\ntype ResolvedSetDefaultProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Defaults extends SetDefaultPropsForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps\n >,\n> = {\n [Key in keyof Defaults &\n keyof LayoutPropsForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps\n >]: LayoutPropsForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps\n >[Key];\n};\n\nexport type SetDefaultPropForResourceFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n CustomProps extends InPropsObject = {},\n> = <\n const Defaults extends SetDefaultPropsForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps\n >,\n>(\n /** Default values for layout props. Each prop can only be set once. */\n defaults: Defaults,\n) => CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps,\n ResolvedSetDefaultProps<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Defaults\n >\n>;\n\ntype CapitalizedResource<Resource extends string> =\n Resource extends Resource\n ? {\n toLowerCase: () => Lowercase<Capitalize<Resource>>;\n } & Capitalize<Resource>\n : never;\n\ntype ResourceLayoutNames<\n Resource extends string,\n CallbackName extends 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 NormalizeCapitalizedResourceName<\n Name extends string,\n Resource extends string,\n> = Name extends Name\n ? NormalizeCapitalizedResourceNameMatch<\n Name,\n Resource\n > extends infer Match extends string\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 ResourceLayoutBuilder<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n CustomProps extends InPropsObject,\n> = CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps\n> & {\n /** Set default values for layout props in a single call. */\n setDefaults: SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps\n >;\n};\n\ntype SingleResourceLayoutSelection<\n Resources extends ReadonlyArray<ResourceDefinition>,\n CallbackName extends string,\n> = {\n [Resource in LayoutResourceKey<Resources>]: Record<\n Resource,\n {\n name?:\n | string\n | ((resource: CapitalizedResource<Resource>) => CallbackName);\n }\n > &\n Partial<\n Record<\n Exclude<LayoutResourceKey<Resources>, Resource>,\n never\n >\n >;\n}[LayoutResourceKey<Resources>];\n\ntype SelectedResourceName<Selection, Resource extends string> =\n Selection extends Record<Resource, { name?: infer Name }>\n ? Name extends (...args: never[]) => infer CallbackName\n ? NormalizeCapitalizedResourceName<CallbackName & string, Resource>\n : Name extends string\n ? Name\n : string\n : string;\n\ntype MappedResourceName<\n Names,\n CallbackName extends string,\n Resource extends string,\n> = Names extends Record<Resource, infer Name>\n ? Name extends (...args: never[]) => unknown\n ? NormalizeCapitalizedResourceName<CallbackName, Resource>\n : Name & string\n : string;\n\n/**\n * Creates a layout builder with a resource-keyed default-name map.\n *\n * @example\n * createResourceLayout.forResource({\n * resource: 'users',\n * name: {\n * users: resource => `${resource}Page`,\n * },\n * })\n *\n * @param options The resource and its resource-keyed default name.\n * @returns A layout builder bound to the selected resource.\n */\ntype ResourceLayoutNameMapFn<\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 Resource extends LayoutResourceKey<Resources>,\n> = <const CallbackName extends string, const Names>(\n options: {\n resource: Resource;\n name: SelectedResourceLayoutNames<\n LayoutResourceKey<Resources>,\n Resource,\n CallbackName\n > &\n AtLeastOneResourceLayoutNameKey<Resource> &\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, Resource>, never>;\n },\n) => ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n MappedResourceName<Names, CallbackName, Resource>,\n Resource,\n CustomProps\n>;\n\ntype ResourceLayoutNameMapFns<\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> = UnionToIntersection<\n {\n [Resource in LayoutResourceKey<Resources>]: ResourceLayoutNameMapFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps,\n Resource\n >;\n }[LayoutResourceKey<Resources>]\n>;\n\nexport type CreateLayoutForResource<\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 builder for one resource without a default name.\n *\n * @example\n * createResourceLayout.forResource('users')\n *\n * @param resource The resource to bind to the returned layout builder.\n * @returns A layout builder bound to the selected resource.\n */\n <const Resource extends LayoutResourceKey<Resources>>(\n resource: Resource,\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n string,\n Resource,\n CustomProps\n >;\n\n /**\n * Creates a layout builder with a capitalized-resource naming callback.\n *\n * @example\n * createResourceLayout.forResource({\n * resource: 'users',\n * name: resource => `${resource}Page`,\n * })\n *\n * @param options The resource and its default-name callback.\n * @returns A layout builder bound to the selected resource.\n */\n <\n const Resource extends LayoutResourceKey<Resources>,\n const Name extends string,\n >(\n options: {\n name: (resource: CapitalizedResource<Resource>) => Name;\n resource: Resource;\n },\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n NormalizeCapitalizedResourceName<Name, Resource>,\n Resource,\n CustomProps\n >;\n\n /**\n * Creates a layout builder from the existing resource-options notation.\n *\n * @example\n * createResourceLayout.forResource({\n * resource: 'users',\n * name: 'UsersPage',\n * })\n *\n * @param options The resource and its optional default name.\n * @returns A layout builder bound to the selected resource.\n */\n <\n const Resource extends LayoutResourceKey<Resources>,\n const Name extends string = string,\n >(\n options: CreateLayoutForResourceOptions<Resources, Name, Resource>,\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps\n >;\n\n /**\n * Creates a layout builder from a single resource-keyed configuration.\n *\n * @example\n * createResourceLayout.forResource({\n * users: { name: resource => `${resource}Page` },\n * })\n *\n * @param options A single resource-keyed layout configuration.\n * @returns A layout builder bound to the configured resource.\n */\n <\n const CallbackName extends string,\n const Selection extends SingleResourceLayoutSelection<\n Resources,\n CallbackName\n >,\n >(\n options: Selection,\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n SelectedResourceName<\n Selection,\n keyof Selection & LayoutResourceKey<Resources>\n >,\n keyof Selection & LayoutResourceKey<Resources>,\n CustomProps\n >;\n} & ResourceLayoutNameMapFns<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n>;\n\ntype CreateForResourceOptions = {\n createResourceLayout: (options: Record<string, unknown>) => unknown;\n resolveLayoutOptionDefaults: (\n defaults: Record<string, unknown>,\n options: Record<string, unknown>,\n ) => Record<string, unknown>;\n};\n\nexport function createForResource<\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 createResourceLayout,\n resolveLayoutOptionDefaults,\n}: CreateForResourceOptions) {\n function createLayoutForResource<\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Defaults extends LayoutPropDefaults,\n >(\n defaultName: Name | undefined,\n resource: Resource,\n defaults: Record<string, unknown>,\n ) {\n return ((\n layoutOptions: { name?: string } & Record<string, unknown> = {},\n ) => {\n const { name, ...options } = layoutOptions;\n\n return createResourceLayout({\n ...defaults,\n name: name ?? defaultName,\n resource,\n ...resolveLayoutOptionDefaults(defaults, options),\n });\n }) as CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps,\n Defaults\n >;\n }\n\n function createLayoutForResourceBuilder<\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n >(defaultName: Name | undefined, resource: Resource) {\n const createLayout = createLayoutForResource(defaultName, resource, {});\n const setDefaults = ((defaults) =>\n createLayoutForResource(\n defaultName,\n resource,\n defaults,\n )) as SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps\n >;\n\n return Object.assign(createLayout, { setDefaults });\n }\n\n const forResource = ((resourceOrOptions: unknown) => {\n type ResourceName =\n | string\n | ((resource: CapitalizedResource<LayoutResourceKey<Resources>>) => string);\n let name:\n | ResourceName\n | Partial<Record<LayoutResourceKey<Resources>, ResourceName>>\n | undefined;\n let resource: LayoutResourceKey<Resources> | undefined;\n\n if (typeof resourceOrOptions === 'string') {\n resource = resourceOrOptions as LayoutResourceKey<Resources>;\n } else if (\n resourceOrOptions !== null &&\n typeof resourceOrOptions === 'object' &&\n ('resource' in resourceOrOptions || 'name' in resourceOrOptions)\n ) {\n ({ name, resource } = resourceOrOptions as {\n name?: typeof name;\n resource?: LayoutResourceKey<Resources>;\n });\n } else {\n const [selection] = Object.entries(resourceOrOptions ?? {});\n\n if (selection) {\n const [selectedResource, options] = selection;\n resource = selectedResource as LayoutResourceKey<Resources>;\n name = (options as { name?: typeof name }).name;\n }\n }\n\n if (!resource) {\n throw new Error('\"resource\" is required when calling \"forResource\"');\n }\n\n const selectedName =\n name !== null && typeof name === 'object' ? name[resource] : name;\n let defaultName: string | undefined;\n\n if (typeof selectedName === 'function') {\n defaultName = selectedName(\n capitalize(resource) as CapitalizedResource<\n LayoutResourceKey<Resources>\n >,\n );\n } else if (typeof selectedName === 'string') {\n defaultName = selectedName;\n }\n\n return createLayoutForResourceBuilder(defaultName, resource);\n }) as CreateLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n >;\n\n return { createLayoutForResourceBuilder, forResource };\n}\n"],"mappings":";;;AAmiBA,SAAgB,kBAMd,EACA,sBACA,+BAC2B;CAC3B,SAAS,wBAKP,aACA,UACA,UACA;EACA,SACE,gBAA6D,CAAC,MAC3D;GACH,MAAM,EAAE,MAAM,GAAG,YAAY;GAE7B,OAAO,qBAAqB;IAC1B,GAAG;IACH,MAAM,QAAQ;IACd;IACA,GAAG,4BAA4B,UAAU,OAAO;GAClD,CAAC;EACH;CAUF;CAEA,SAAS,+BAGP,aAA+B,UAAoB;EACnD,MAAM,eAAe,wBAAwB,aAAa,UAAU,CAAC,CAAC;EACtE,MAAM,gBAAgB,aACpB,wBACE,aACA,UACA,QACF;EAUF,OAAO,OAAO,OAAO,cAAc,EAAE,YAAY,CAAC;CACpD;CAEA,MAAM,gBAAgB,sBAA+B;EAInD,IAAI;EAIJ,IAAI;EAEJ,IAAI,OAAO,sBAAsB,UAC/B,WAAW;OACN,IACL,sBAAsB,QACtB,OAAO,sBAAsB,aAC5B,cAAc,qBAAqB,UAAU,oBAE9C,CAAC,CAAE,MAAM,YAAa;OAIjB;GACL,MAAM,CAAC,aAAa,OAAO,QAAQ,qBAAqB,CAAC,CAAC;GAE1D,IAAI,WAAW;IACb,MAAM,CAAC,kBAAkB,WAAW;IACpC,WAAW;IACX,OAAQ,QAAmC;GAC7C;EACF;EAEA,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,uDAAmD;EAGrE,MAAM,eACJ,SAAS,QAAQ,OAAO,SAAS,WAAW,KAAK,YAAY;EAC/D,IAAI;EAEJ,IAAI,OAAO,iBAAiB,YAC1B,cAAc,aACZ,WAAW,QAAQ,CAGrB;OACK,IAAI,OAAO,iBAAiB,UACjC,cAAc;EAGhB,OAAO,+BAA+B,aAAa,QAAQ;CAC7D;CAQA,OAAO;EAAE;EAAgC;CAAY;AACvD"}
|
|
1
|
+
{"version":3,"file":"for-resource.mjs","names":[],"sources":["../../src/create-config/for-resource.ts"],"sourcesContent":["import type { ComposableComponents } from '@jfdevelops/react-layout-composables';\nimport type {\n InPropsDefinition,\n InPropsObject,\n MergedLayoutInProps,\n ResolvedIncludedComponentProps,\n} from '../props';\nimport type {\n LayoutResourceKey,\n ResourceDefinition,\n} from '../resource';\nimport type { UnionToIntersection, Updater } from '../utils';\nimport { LayoutConfigurationError } from '../errors';\nimport { capitalize } from '../utils/capitalize';\nimport type {\n LayoutIncludeProps,\n LayoutPropsForResource,\n ResourceLayoutComponent,\n} from './define-layout';\n\ntype LayoutPropDefaults = Record<string, unknown>;\n\ntype CreateTimeLayoutPropWithDefault<\n LayoutProps extends LayoutPropDefaults,\n Key extends keyof LayoutProps,\n> = LayoutProps[Key] extends (...args: unknown[]) => unknown\n ? LayoutProps[Key]\n : Updater<LayoutProps[Key]>;\n\ntype ResolveLayoutPropsWithDefaults<\n LayoutProps extends LayoutPropDefaults,\n Defaults extends LayoutPropDefaults,\n> = Omit<LayoutProps, keyof Defaults> & {\n [Key in keyof Defaults & keyof LayoutProps]?: CreateTimeLayoutPropWithDefault<\n LayoutProps,\n Key\n >;\n};\n\nexport type CreateResourceLayoutOptionsBase<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n> = {\n name: Name;\n resource: Resource;\n props?: Props;\n};\n\nexport type CreateResourceLayoutOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n> = LayoutPropsForResource<Resources, InProps, Composables, IncludeProps> &\n CreateResourceLayoutOptionsBase<Resources, Name, Resource, Props>;\n\nexport type CreateLayoutForResourceOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n> = {\n name?: Name;\n resource: Resource;\n};\n\ntype CreatedLayoutForResourceOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Props extends InPropsObject = {},\n Defaults extends LayoutPropDefaults = {},\n> = ResolveLayoutPropsWithDefaults<\n LayoutPropsForResource<Resources, InProps, Composables, IncludeProps>,\n Defaults\n> & {\n props?: Props;\n};\n\ntype CreatedLayoutForResourceCallOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n OverrideName extends string,\n Props extends InPropsObject,\n Defaults extends LayoutPropDefaults,\n> = CreatedLayoutForResourceOptions<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Props,\n Defaults\n> & {\n name?: OverrideName;\n};\n\nexport type CreatedLayoutForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n CustomProps extends InPropsObject = {},\n Defaults extends LayoutPropDefaults = {},\n> = <OverrideName extends string = Name, Props extends InPropsObject = {}>(\n ...args: {} extends CreatedLayoutForResourceCallOptions<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n OverrideName,\n Props,\n Defaults\n >\n ? [options?: CreatedLayoutForResourceCallOptions<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n OverrideName,\n Props,\n Defaults\n >]\n : [options: CreatedLayoutForResourceCallOptions<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n OverrideName,\n Props,\n Defaults\n >]\n) => ResourceLayoutComponent<\n OverrideName,\n CustomProps,\n Composables,\n Resource,\n ResolvedIncludedComponentProps<\n MergedLayoutInProps<Resources, InProps, Composables>,\n IncludeProps\n >\n>;\n\ntype SetDefaultPropsForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents = {},\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {},\n> = Partial<\n LayoutPropsForResource<Resources, InProps, Composables, IncludeProps>\n>;\n\ntype ResolvedSetDefaultProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Defaults extends SetDefaultPropsForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps\n >,\n> = {\n [Key in keyof Defaults &\n keyof LayoutPropsForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps\n >]: LayoutPropsForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps\n >[Key];\n};\n\nexport type SetDefaultPropForResourceFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n CustomProps extends InPropsObject = {},\n> = <\n const Defaults extends SetDefaultPropsForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps\n >,\n>(\n /** Default values for layout props. Each prop can only be set once. */\n defaults: Defaults,\n) => CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps,\n ResolvedSetDefaultProps<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Defaults\n >\n>;\n\ntype CapitalizedResource<Resource extends string> =\n Resource extends Resource\n ? {\n toLowerCase: () => Lowercase<Capitalize<Resource>>;\n } & Capitalize<Resource>\n : never;\n\ntype ResourceLayoutNames<\n Resource extends string,\n CallbackName extends 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 NormalizeCapitalizedResourceName<\n Name extends string,\n Resource extends string,\n> = Name extends Name\n ? NormalizeCapitalizedResourceNameMatch<\n Name,\n Resource\n > extends infer Match extends string\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 ResourceLayoutBuilder<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n CustomProps extends InPropsObject,\n> = CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps\n> & {\n /** Set default values for layout props in a single call. */\n setDefaults: SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps\n >;\n};\n\ntype SingleResourceLayoutSelection<\n Resources extends ReadonlyArray<ResourceDefinition>,\n CallbackName extends string,\n> = {\n [Resource in LayoutResourceKey<Resources>]: Record<\n Resource,\n {\n name?:\n | string\n | ((resource: CapitalizedResource<Resource>) => CallbackName);\n }\n > &\n Partial<\n Record<\n Exclude<LayoutResourceKey<Resources>, Resource>,\n never\n >\n >;\n}[LayoutResourceKey<Resources>];\n\ntype SelectedResourceName<Selection, Resource extends string> =\n Selection extends Record<Resource, { name?: infer Name }>\n ? Name extends (...args: never[]) => infer CallbackName\n ? NormalizeCapitalizedResourceName<CallbackName & string, Resource>\n : Name extends string\n ? Name\n : string\n : string;\n\ntype MappedResourceName<\n Names,\n CallbackName extends string,\n Resource extends string,\n> = Names extends Record<Resource, infer Name>\n ? Name extends (...args: never[]) => unknown\n ? NormalizeCapitalizedResourceName<CallbackName, Resource>\n : Name & string\n : string;\n\n/**\n * Creates a layout builder with a resource-keyed default-name map.\n *\n * @example\n * createResourceLayout.forResource({\n * resource: 'users',\n * name: {\n * users: resource => `${resource}Page`,\n * },\n * })\n *\n * @param options The resource and its resource-keyed default name.\n * @returns A layout builder bound to the selected resource.\n */\ntype ResourceLayoutNameMapFn<\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 Resource extends LayoutResourceKey<Resources>,\n> = <const CallbackName extends string, const Names>(\n options: {\n resource: Resource;\n name: SelectedResourceLayoutNames<\n LayoutResourceKey<Resources>,\n Resource,\n CallbackName\n > &\n AtLeastOneResourceLayoutNameKey<Resource> &\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, Resource>, never>;\n },\n) => ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n MappedResourceName<Names, CallbackName, Resource>,\n Resource,\n CustomProps\n>;\n\ntype ResourceLayoutNameMapFns<\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> = UnionToIntersection<\n {\n [Resource in LayoutResourceKey<Resources>]: ResourceLayoutNameMapFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps,\n Resource\n >;\n }[LayoutResourceKey<Resources>]\n>;\n\nexport type CreateLayoutForResource<\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 builder for one resource without a default name.\n *\n * @example\n * createResourceLayout.forResource('users')\n *\n * @param resource The resource to bind to the returned layout builder.\n * @returns A layout builder bound to the selected resource.\n */\n <const Resource extends LayoutResourceKey<Resources>>(\n resource: Resource,\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n string,\n Resource,\n CustomProps\n >;\n\n /**\n * Creates a layout builder with a capitalized-resource naming callback.\n *\n * @example\n * createResourceLayout.forResource({\n * resource: 'users',\n * name: resource => `${resource}Page`,\n * })\n *\n * @param options The resource and its default-name callback.\n * @returns A layout builder bound to the selected resource.\n */\n <\n const Resource extends LayoutResourceKey<Resources>,\n const Name extends string,\n >(\n options: {\n name: (resource: CapitalizedResource<Resource>) => Name;\n resource: Resource;\n },\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n NormalizeCapitalizedResourceName<Name, Resource>,\n Resource,\n CustomProps\n >;\n\n /**\n * Creates a layout builder from the existing resource-options notation.\n *\n * @example\n * createResourceLayout.forResource({\n * resource: 'users',\n * name: 'UsersPage',\n * })\n *\n * @param options The resource and its optional default name.\n * @returns A layout builder bound to the selected resource.\n */\n <\n const Resource extends LayoutResourceKey<Resources>,\n const Name extends string = string,\n >(\n options: CreateLayoutForResourceOptions<Resources, Name, Resource>,\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps\n >;\n\n /**\n * Creates a layout builder from a single resource-keyed configuration.\n *\n * @example\n * createResourceLayout.forResource({\n * users: { name: resource => `${resource}Page` },\n * })\n *\n * @param options A single resource-keyed layout configuration.\n * @returns A layout builder bound to the configured resource.\n */\n <\n const CallbackName extends string,\n const Selection extends SingleResourceLayoutSelection<\n Resources,\n CallbackName\n >,\n >(\n options: Selection,\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n SelectedResourceName<\n Selection,\n keyof Selection & LayoutResourceKey<Resources>\n >,\n keyof Selection & LayoutResourceKey<Resources>,\n CustomProps\n >;\n} & ResourceLayoutNameMapFns<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n>;\n\ntype CreateForResourceOptions = {\n createResourceLayout: (options: Record<string, unknown>) => unknown;\n resolveLayoutOptionDefaults: (\n defaults: Record<string, unknown>,\n options: Record<string, unknown>,\n ) => Record<string, unknown>;\n};\n\nexport function createForResource<\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 createResourceLayout,\n resolveLayoutOptionDefaults,\n}: CreateForResourceOptions) {\n function createLayoutForResource<\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Defaults extends LayoutPropDefaults,\n >(\n defaultName: Name | undefined,\n resource: Resource,\n defaults: Record<string, unknown>,\n ) {\n return ((\n layoutOptions: { name?: string } & Record<string, unknown> = {},\n ) => {\n const { name, ...options } = layoutOptions;\n\n return createResourceLayout({\n ...defaults,\n name: name ?? defaultName,\n resource,\n ...resolveLayoutOptionDefaults(defaults, options),\n });\n }) as CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps,\n Defaults\n >;\n }\n\n function createLayoutForResourceBuilder<\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n >(defaultName: Name | undefined, resource: Resource) {\n const createLayout = createLayoutForResource(defaultName, resource, {});\n const setDefaults = ((defaults) =>\n createLayoutForResource(\n defaultName,\n resource,\n defaults,\n )) as SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n Name,\n Resource,\n CustomProps\n >;\n\n return Object.assign(createLayout, { setDefaults });\n }\n\n const forResource = ((resourceOrOptions: unknown) => {\n type ResourceName =\n | string\n | ((resource: CapitalizedResource<LayoutResourceKey<Resources>>) => string);\n let name:\n | ResourceName\n | Partial<Record<LayoutResourceKey<Resources>, ResourceName>>\n | undefined;\n let resource: LayoutResourceKey<Resources> | undefined;\n\n if (typeof resourceOrOptions === 'string') {\n resource = resourceOrOptions as LayoutResourceKey<Resources>;\n } else if (\n resourceOrOptions !== null &&\n typeof resourceOrOptions === 'object' &&\n ('resource' in resourceOrOptions || 'name' in resourceOrOptions)\n ) {\n ({ name, resource } = resourceOrOptions as {\n name?: typeof name;\n resource?: LayoutResourceKey<Resources>;\n });\n } else {\n const [selection] = Object.entries(resourceOrOptions ?? {});\n\n if (selection) {\n const [selectedResource, options] = selection;\n resource = selectedResource as LayoutResourceKey<Resources>;\n name = (options as { name?: typeof name }).name;\n }\n }\n\n if (!resource) {\n throw new LayoutConfigurationError('\"resource\" is required when calling \"forResource\"');\n }\n\n const selectedName =\n name !== null && typeof name === 'object' ? name[resource] : name;\n let defaultName: string | undefined;\n\n if (typeof selectedName === 'function') {\n defaultName = selectedName(\n capitalize(resource) as CapitalizedResource<\n LayoutResourceKey<Resources>\n >,\n );\n } else if (typeof selectedName === 'string') {\n defaultName = selectedName;\n }\n\n return createLayoutForResourceBuilder(defaultName, resource);\n }) as CreateLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n >;\n\n return { createLayoutForResourceBuilder, forResource };\n}\n"],"mappings":";;;;AAoiBA,SAAgB,kBAMd,EACA,sBACA,+BAC2B;CAC3B,SAAS,wBAKP,aACA,UACA,UACA;EACA,SACE,gBAA6D,CAAC,MAC3D;GACH,MAAM,EAAE,MAAM,GAAG,YAAY;GAE7B,OAAO,qBAAqB;IAC1B,GAAG;IACH,MAAM,QAAQ;IACd;IACA,GAAG,4BAA4B,UAAU,OAAO;GAClD,CAAC;EACH;CAUF;CAEA,SAAS,+BAGP,aAA+B,UAAoB;EACnD,MAAM,eAAe,wBAAwB,aAAa,UAAU,CAAC,CAAC;EACtE,MAAM,gBAAgB,aACpB,wBACE,aACA,UACA,QACF;EAUF,OAAO,OAAO,OAAO,cAAc,EAAE,YAAY,CAAC;CACpD;CAEA,MAAM,gBAAgB,sBAA+B;EAInD,IAAI;EAIJ,IAAI;EAEJ,IAAI,OAAO,sBAAsB,UAC/B,WAAW;OACN,IACL,sBAAsB,QACtB,OAAO,sBAAsB,aAC5B,cAAc,qBAAqB,UAAU,oBAE9C,CAAC,CAAE,MAAM,YAAa;OAIjB;GACL,MAAM,CAAC,aAAa,OAAO,QAAQ,qBAAqB,CAAC,CAAC;GAE1D,IAAI,WAAW;IACb,MAAM,CAAC,kBAAkB,WAAW;IACpC,WAAW;IACX,OAAQ,QAAmC;GAC7C;EACF;EAEA,IAAI,CAAC,UACH,MAAM,IAAI,yBAAyB,uDAAmD;EAGxF,MAAM,eACJ,SAAS,QAAQ,OAAO,SAAS,WAAW,KAAK,YAAY;EAC/D,IAAI;EAEJ,IAAI,OAAO,iBAAiB,YAC1B,cAAc,aACZ,WAAW,QAAQ,CAGrB;OACK,IAAI,OAAO,iBAAiB,UACjC,cAAc;EAGhB,OAAO,+BAA+B,aAAa,QAAQ;CAC7D;CAQA,OAAO;EAAE;EAAgC;CAAY;AACvD"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const require_layout_configuration_error = require('../../errors/layout-configuration-error.cjs');
|
|
1
2
|
const require_capitalize = require('../../utils/capitalize.cjs');
|
|
2
3
|
const require_scoped_render = require('./scoped-render.cjs');
|
|
3
4
|
let react = require("react");
|
|
@@ -52,7 +53,7 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
|
|
|
52
53
|
const definedEntries = /* @__PURE__ */ new Map();
|
|
53
54
|
for (const [key, entry] of Object.entries(componentOptions.resources ?? {})) {
|
|
54
55
|
const resource = key;
|
|
55
|
-
if (!selectedResources.has(resource)) throw new
|
|
56
|
+
if (!selectedResources.has(resource)) throw new require_layout_configuration_error.LayoutConfigurationError(`Resource "${key}" is not available in this scoped component`);
|
|
56
57
|
definedEntries.set(resource, entry);
|
|
57
58
|
}
|
|
58
59
|
/** Resolved scoped components, per resource. */
|
|
@@ -60,9 +61,9 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
|
|
|
60
61
|
const contextResources = /* @__PURE__ */ new Map();
|
|
61
62
|
const renderContext = Object.fromEntries([...definedEntries].map(([resource, entry]) => {
|
|
62
63
|
const contextKey = require_capitalize.capitalize(resource);
|
|
63
|
-
if (contextKey === "Root") throw new
|
|
64
|
+
if (contextKey === "Root") throw new require_layout_configuration_error.LayoutConfigurationError(`Resource "${resource}" maps to the reserved render context key "Root"`);
|
|
64
65
|
const existingResource = contextResources.get(contextKey);
|
|
65
|
-
if (existingResource !== void 0) throw new
|
|
66
|
+
if (existingResource !== void 0) throw new require_layout_configuration_error.LayoutConfigurationError(`Resources "${existingResource}" and "${resource}" both map to render context key "${contextKey}"`);
|
|
66
67
|
contextResources.set(contextKey, resource);
|
|
67
68
|
/**
|
|
68
69
|
* Built once per resource so every scoped component keeps a stable
|
|
@@ -71,13 +72,13 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
|
|
|
71
72
|
*/
|
|
72
73
|
const scopedComponents = {};
|
|
73
74
|
for (const [name, definition] of Object.entries(entry.components ?? {})) {
|
|
74
|
-
if (require_scoped_render.reservedScopedComponentNames.has(name)) throw new
|
|
75
|
+
if (require_scoped_render.reservedScopedComponentNames.has(name)) throw new require_layout_configuration_error.LayoutConfigurationError(`Scoped component "${name}" for resource "${resource}" uses a reserved name`);
|
|
75
76
|
const ownPropDefinitions = definition.props ?? {};
|
|
76
77
|
let cachedOwnProps = {};
|
|
77
78
|
let cachedReturnedComponent;
|
|
78
79
|
function ScopedComponent(ownProps) {
|
|
79
80
|
const componentProps = (0, react.useContext)(componentPropsContext);
|
|
80
|
-
if (componentProps === void 0) throw new
|
|
81
|
+
if (componentProps === void 0) throw new require_layout_configuration_error.LayoutConfigurationError(`Scoped component "${name}" must be rendered inside its scoped component`);
|
|
81
82
|
const resolvedOwnProps = ownProps ?? {};
|
|
82
83
|
cachedOwnProps = resolvedOwnProps;
|
|
83
84
|
(0, _jfdevelops_react_layout_validator.validateProps)(ownPropDefinitions, resolvedOwnProps, {
|
|
@@ -95,16 +96,16 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
|
|
|
95
96
|
scopedComponents[name] = require_scoped_render.withScopedCompoundStatics(ScopedComponent, (staticName) => {
|
|
96
97
|
function CompoundStatic(ownProps) {
|
|
97
98
|
const componentProps = (0, react.useContext)(componentPropsContext);
|
|
98
|
-
if (componentProps === void 0) throw new
|
|
99
|
+
if (componentProps === void 0) throw new require_layout_configuration_error.LayoutConfigurationError(`Scoped component "${name}.${staticName}" must be rendered inside its scoped component`);
|
|
99
100
|
let result = cachedReturnedComponent;
|
|
100
101
|
if (!require_scoped_render.isRenderableComponentType(result)) result = definition.render({
|
|
101
102
|
...componentProps,
|
|
102
103
|
...cachedOwnProps,
|
|
103
104
|
resource
|
|
104
105
|
}, scopedComponents);
|
|
105
|
-
if (!require_scoped_render.isRenderableComponentType(result)) throw new
|
|
106
|
+
if (!require_scoped_render.isRenderableComponentType(result)) throw new require_layout_configuration_error.LayoutConfigurationError(`Scoped component "${name}" must return a component type to use static "${staticName}"`);
|
|
106
107
|
const staticComponent = result[staticName];
|
|
107
|
-
if (!require_scoped_render.isRenderableComponentType(staticComponent)) throw new
|
|
108
|
+
if (!require_scoped_render.isRenderableComponentType(staticComponent)) throw new require_layout_configuration_error.LayoutConfigurationError(`Scoped component "${name}" has no component static "${staticName}"`);
|
|
108
109
|
return (0, react.createElement)(staticComponent, ownProps ?? {});
|
|
109
110
|
}
|
|
110
111
|
CompoundStatic.displayName = `${name}.${staticName}`;
|
|
@@ -114,7 +115,7 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
|
|
|
114
115
|
resourceScopedComponents.set(resource, scopedComponents);
|
|
115
116
|
function ResourceRender(ownProps) {
|
|
116
117
|
const componentProps = (0, react.useContext)(componentPropsContext);
|
|
117
|
-
if (componentProps === void 0) throw new
|
|
118
|
+
if (componentProps === void 0) throw new require_layout_configuration_error.LayoutConfigurationError(`Render context component "${contextKey}" must be rendered inside its scoped component`);
|
|
118
119
|
const callProps = {
|
|
119
120
|
...componentProps,
|
|
120
121
|
...ownProps,
|
|
@@ -132,12 +133,12 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
|
|
|
132
133
|
const roots = /* @__PURE__ */ new Map();
|
|
133
134
|
function Root(rootProps) {
|
|
134
135
|
const componentProps = (0, react.useContext)(componentPropsContext);
|
|
135
|
-
if (componentProps === void 0) throw new
|
|
136
|
+
if (componentProps === void 0) throw new require_layout_configuration_error.LayoutConfigurationError("Render context component \"Root\" must be rendered inside its scoped component");
|
|
136
137
|
const resource = componentProps.resource;
|
|
137
138
|
let root = roots.get(resource);
|
|
138
139
|
if (root === void 0) {
|
|
139
140
|
const entry = definedEntries.get(resource);
|
|
140
|
-
if (entry === void 0) throw new
|
|
141
|
+
if (entry === void 0) throw new require_layout_configuration_error.LayoutConfigurationError(`Render context component "Root" requires a "resources.${resource}" entry to build the layout for resource "${resource}"`);
|
|
141
142
|
const availableDefinitions = getComponentPropDefinitions(resource);
|
|
142
143
|
const layoutOptions = {};
|
|
143
144
|
const defined = entry.props?.defined ?? {};
|
|
@@ -166,7 +167,7 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
|
|
|
166
167
|
renderContext.Root = Root;
|
|
167
168
|
function Component(componentProps) {
|
|
168
169
|
const componentResource = componentProps.resource;
|
|
169
|
-
if (!selectedResources.has(componentResource)) throw new
|
|
170
|
+
if (!selectedResources.has(componentResource)) throw new require_layout_configuration_error.LayoutConfigurationError(`Resource "${componentResource}" is not available in this scoped component`);
|
|
170
171
|
const resolvedComponentProps = {
|
|
171
172
|
...definedEntries.get(componentResource)?.props?.defined ?? {},
|
|
172
173
|
...componentProps
|
|
@@ -195,7 +196,7 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
|
|
|
195
196
|
*/
|
|
196
197
|
const boundComponents = /* @__PURE__ */ new Map();
|
|
197
198
|
function bindResource(resource) {
|
|
198
|
-
if (!selectedResources.has(resource)) throw new
|
|
199
|
+
if (!selectedResources.has(resource)) throw new require_layout_configuration_error.LayoutConfigurationError(`Resource "${resource}" is not available in this scoped component`);
|
|
199
200
|
let boundComponent = boundComponents.get(resource);
|
|
200
201
|
if (boundComponent === void 0) {
|
|
201
202
|
boundComponent = Object.assign((boundProps) => (0, react.createElement)(Component, {
|
|
@@ -231,7 +232,7 @@ function createForResources({ createLayoutForResource, createMakeComposableLayou
|
|
|
231
232
|
}
|
|
232
233
|
function createResourceComponents(options) {
|
|
233
234
|
const { resource, props, ...entry } = options;
|
|
234
|
-
if (!resourceOptions.some((resourceOption) => resourceOption.resource === resource)) throw new
|
|
235
|
+
if (!resourceOptions.some((resourceOption) => resourceOption.resource === resource)) throw new require_layout_configuration_error.LayoutConfigurationError(`Resource "${resource}" is not available in this scoped component`);
|
|
235
236
|
return {
|
|
236
237
|
...entry,
|
|
237
238
|
props: props ?? {}
|