@jfdevelops/react-layout 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/create-config/define-layout.cjs +144 -0
  2. package/dist/create-config/define-layout.cjs.map +1 -0
  3. package/dist/create-config/define-layout.d.cts +106 -0
  4. package/dist/create-config/define-layout.d.cts.map +1 -0
  5. package/dist/create-config/define-layout.d.mts +106 -0
  6. package/dist/create-config/define-layout.d.mts.map +1 -0
  7. package/dist/create-config/define-layout.mjs +144 -0
  8. package/dist/create-config/define-layout.mjs.map +1 -0
  9. package/dist/create-config/get-component.cjs +52 -0
  10. package/dist/create-config/get-component.cjs.map +1 -0
  11. package/dist/create-config/get-component.d.cts +62 -0
  12. package/dist/create-config/get-component.d.cts.map +1 -0
  13. package/dist/create-config/get-component.d.mts +62 -0
  14. package/dist/create-config/get-component.d.mts.map +1 -0
  15. package/dist/create-config/get-component.mjs +51 -0
  16. package/dist/create-config/get-component.mjs.map +1 -0
  17. package/dist/create-config/index.d.cts +3 -0
  18. package/dist/create-config/index.d.mts +3 -0
  19. package/dist/create-config/types.d.cts +42 -0
  20. package/dist/create-config/types.d.cts.map +1 -0
  21. package/dist/create-config/types.d.mts +42 -0
  22. package/dist/create-config/types.d.mts.map +1 -0
  23. package/dist/index.cjs +2 -2
  24. package/dist/index.d.cts +1 -1
  25. package/dist/index.d.mts +1 -1
  26. package/dist/index.mjs +1 -1
  27. package/dist/props.d.cts +2 -2
  28. package/dist/props.d.cts.map +1 -1
  29. package/dist/props.d.mts +2 -2
  30. package/dist/props.d.mts.map +1 -1
  31. package/dist/resource.cjs.map +1 -1
  32. package/dist/resource.d.cts +22 -2
  33. package/dist/resource.d.cts.map +1 -1
  34. package/dist/resource.d.mts +22 -2
  35. package/dist/resource.d.mts.map +1 -1
  36. package/dist/resource.mjs.map +1 -1
  37. package/dist/utils.cjs +5 -0
  38. package/dist/utils.cjs.map +1 -1
  39. package/dist/utils.d.cts +2 -1
  40. package/dist/utils.d.cts.map +1 -1
  41. package/dist/utils.d.mts +2 -1
  42. package/dist/utils.d.mts.map +1 -1
  43. package/dist/utils.mjs +5 -1
  44. package/dist/utils.mjs.map +1 -1
  45. package/dist/validators/validate-props.cjs +3 -1
  46. package/dist/validators/validate-props.cjs.map +1 -1
  47. package/dist/validators/validate-props.mjs +3 -1
  48. package/dist/validators/validate-props.mjs.map +1 -1
  49. package/package.json +1 -1
  50. package/dist/create-config.cjs +0 -101
  51. package/dist/create-config.cjs.map +0 -1
  52. package/dist/create-config.d.cts +0 -67
  53. package/dist/create-config.d.cts.map +0 -1
  54. package/dist/create-config.d.mts +0 -67
  55. package/dist/create-config.d.mts.map +0 -1
  56. package/dist/create-config.mjs +0 -101
  57. package/dist/create-config.mjs.map +0 -1
@@ -0,0 +1,144 @@
1
+ const require_utils = require('../utils.cjs');
2
+ const require_composable = require('../composable.cjs');
3
+ const require_builders = require('../validators/builders.cjs');
4
+ const require_validate_props = require('../validators/validate-props.cjs');
5
+ const require_resource = require('../resource.cjs');
6
+ const require_capitalize = require('../utils/capitalize.cjs');
7
+ const require_get_component = require('./get-component.cjs');
8
+ let react_jsx_runtime = require("react/jsx-runtime");
9
+
10
+ //#region src/create-config/define-layout.tsx
11
+ function isBuiltPropDefinition(value) {
12
+ return typeof value === "function" && value !== null && "visibility" in value;
13
+ }
14
+ function isSplitLayoutInPropDefinition(value) {
15
+ return value !== null && typeof value === "object" && "render" in value && value.render !== void 0;
16
+ }
17
+ function isJSXElementDefinition(definition) {
18
+ return isBuiltPropDefinition(definition) && "type" in definition && definition.type === "JSX.Element";
19
+ }
20
+ function toLayoutRenderPropKey(includeKey, definition) {
21
+ return isJSXElementDefinition(definition) ? require_capitalize.capitalize(includeKey) : includeKey;
22
+ }
23
+ function readLayoutOptionValue(includeKey, definition, sources) {
24
+ const layoutOptionKeys = isJSXElementDefinition(definition) ? [require_capitalize.capitalize(includeKey), includeKey] : [includeKey, require_capitalize.capitalize(includeKey)];
25
+ for (const key of layoutOptionKeys) if (key in sources) return sources[key];
26
+ }
27
+ function splitLayoutInProps(inProps) {
28
+ const resolvedInProps = {};
29
+ const splitInProps = {};
30
+ for (const [key, value] of Object.entries(inProps)) {
31
+ if (isBuiltPropDefinition(value)) {
32
+ resolvedInProps[key] = value;
33
+ continue;
34
+ }
35
+ if (isSplitLayoutInPropDefinition(value)) {
36
+ splitInProps[key] = value.render;
37
+ if (value.props && typeof value.props === "object") Object.assign(resolvedInProps, value.props);
38
+ }
39
+ }
40
+ return {
41
+ resolvedInProps,
42
+ splitInProps
43
+ };
44
+ }
45
+ function resolveLayoutOptionDefaults(defaults, options) {
46
+ const resolved = { ...options };
47
+ for (const [key, defaultValue] of Object.entries(defaults)) if (key in options) if (typeof defaultValue === "function") resolved[key] = options[key];
48
+ else resolved[key] = require_utils.functionalUpdate(defaultValue, options[key]);
49
+ return resolved;
50
+ }
51
+ function defineResourceLayout(options) {
52
+ const { options: inProps, resources, layout } = options;
53
+ const normalizedResources = require_resource.normalizeResources(resources);
54
+ const resourcesEnum = require_builders.createPrimitivePropBuilder("string").enum(require_resource.toResourceEnum(normalizedResources));
55
+ const definedResourceLayout = (layoutOptions) => {
56
+ const { name, props: instancePropDefinitions, ...layoutOptionProps } = layoutOptions;
57
+ const createComposableLayout = require_composable.makeComposable();
58
+ const nameProp = require_builders.createProp.string().literal(name);
59
+ const { resolvedInProps, splitInProps } = splitLayoutInProps({
60
+ ...typeof inProps === "function" ? inProps({
61
+ resource: resourcesEnum,
62
+ name: nameProp
63
+ }) : inProps,
64
+ ...instancePropDefinitions,
65
+ ...layoutOptionProps
66
+ });
67
+ const { composables, render, props: layoutProps } = layout;
68
+ const customLayoutProps = layoutProps?.custom;
69
+ const includeLayoutProps = layoutProps?.include;
70
+ const resolvedLayoutProps = { ...customLayoutProps };
71
+ const layoutContext = {
72
+ resource: layoutOptions.resource,
73
+ name,
74
+ capitalize: require_capitalize.capitalize
75
+ };
76
+ const resolvedComposables = composables ? require_composable.resolveLayoutComposables(composables, layoutContext) : void 0;
77
+ const mergedRenderContext = {
78
+ composables: resolvedComposables,
79
+ resource: layoutContext.resource,
80
+ name: layoutContext.name,
81
+ inProps: splitInProps
82
+ };
83
+ function Component(props) {
84
+ const validatedProps = require_validate_props.validateProps(resolvedLayoutProps, props);
85
+ const includedPropKeys = Object.keys(includeLayoutProps ?? {});
86
+ const includedPropDefinitions = require_utils.pick(resolvedInProps, includedPropKeys);
87
+ const includedPropValues = { ...require_utils.resolvePropDefinitionValues(includedPropDefinitions) };
88
+ for (const key of includedPropKeys) {
89
+ const definition = resolvedInProps[key];
90
+ const layoutOptionValue = readLayoutOptionValue(key, definition, layoutOptionProps);
91
+ const splitValue = key in splitInProps ? splitInProps[key] : void 0;
92
+ const value = layoutOptionValue ?? splitValue;
93
+ if (value !== void 0) includedPropValues[key] = value;
94
+ }
95
+ const validatedIncludedProps = require_validate_props.validateProps(includedPropDefinitions, includedPropValues);
96
+ const layoutRenderIncludedProps = Object.fromEntries(includedPropKeys.flatMap((key) => {
97
+ if (!(key in validatedIncludedProps)) return [];
98
+ return [[toLayoutRenderPropKey(key, resolvedInProps[key]), validatedIncludedProps[key]]];
99
+ }));
100
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: render({
101
+ ...validatedProps,
102
+ ...layoutRenderIncludedProps
103
+ }, mergedRenderContext) });
104
+ }
105
+ function createComposition(compositionOptions) {
106
+ if (!compositionOptions.components) return {};
107
+ return { makeComposable: createComposableLayout(compositionOptions) };
108
+ }
109
+ return Object.assign(Component, {
110
+ displayName: name,
111
+ props: void 0,
112
+ ...createComposition({
113
+ components: resolvedComposables,
114
+ name
115
+ })
116
+ });
117
+ };
118
+ function createLayoutForResource(defaultName, resource, defaults) {
119
+ return (({ name, ...rest }) => definedResourceLayout({
120
+ ...defaults,
121
+ name: name ?? defaultName,
122
+ resource,
123
+ ...resolveLayoutOptionDefaults(defaults, rest)
124
+ }));
125
+ }
126
+ function createLayoutForResourceBuilder(defaultName, resource) {
127
+ const createLayout = createLayoutForResource(defaultName, resource, {});
128
+ const setDefaults = ((defaults) => createLayoutForResource(defaultName, resource, defaults));
129
+ return Object.assign(createLayout, { setDefaults });
130
+ }
131
+ const forResource = (options) => {
132
+ const { name: defaultName, resource } = options;
133
+ if (!resource) throw new Error("\"resource\" is required when calling \"forResource\"");
134
+ return createLayoutForResourceBuilder(defaultName, resource);
135
+ };
136
+ return {
137
+ createResourceConfig: require_get_component.createResourceConfig,
138
+ createResourceLayout: Object.assign(definedResourceLayout, { forResource })
139
+ };
140
+ }
141
+
142
+ //#endregion
143
+ exports.defineResourceLayout = defineResourceLayout;
144
+ //# sourceMappingURL=define-layout.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-layout.cjs","names":["capitalize","functionalUpdate","normalizeResources","createPrimitivePropBuilder","toResourceEnum","makeComposable","createProp","resolveLayoutComposables","validateProps","pick","resolvePropDefinitionValues"],"sources":["../../src/create-config/define-layout.tsx"],"sourcesContent":["import type { JSX } from 'react';\nimport {\n type ComposableComponents,\n type ComposableNameContext,\n type CreateLayoutComposable,\n MakeComposable,\n makeComposable,\n MakeComposableOptions,\n resolveLayoutComposables,\n} from '../composable';\nimport {\n type AnyBuiltPropDefinition,\n createPrimitivePropBuilder,\n createProp,\n type ResolveLayoutProps,\n type ResolveProps,\n validateProps,\n} from '../validators';\nimport {\n IncludedProps,\n InferredInProps,\n InPropsDefinition,\n InPropsObject,\n LayoutRenderProps,\n} from '../props';\nimport {\n normalizeResources,\n toResourceEnum,\n type LayoutResourceKey,\n type ResourceDefinition,\n} from '../resource';\nimport {\n BaseComponent,\n functionalUpdate,\n pick,\n resolvePropDefinitionValues,\n Show,\n Updater,\n} from '../utils';\nimport { capitalize } from '../utils/capitalize';\nimport {\n type CreateResourceConfigFn,\n createResourceConfig,\n} from './get-component';\n\ntype LayoutProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Options extends InPropsDefinition<Resources>,\n IncludeProps extends IncludedProps<InferredInProps<Resources, Options>> = {},\n CustomProps extends InPropsObject = {},\n> = {\n /**\n * Props to include in the layout.\n */\n include?: IncludeProps;\n /**\n * Custom props that the layout will receive.\n */\n custom?: CustomProps;\n};\n\ntype LayoutRenderContext<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Composables extends ComposableComponents,\n> = {\n composables: LayoutRenderComposables<Composables>;\n inProps: Record<string, unknown>;\n resource: LayoutResourceKey<Resources>;\n name: string;\n};\ntype LayoutRenderComposables<Composables extends ComposableComponents> = [\n keyof Composables,\n] extends [never]\n ? undefined\n : Composables;\n\ntype SplitLayoutInPropDefinition<\n Props extends InPropsObject = {},\n Content = unknown,\n> = {\n props?: Props;\n render: ((props: ResolveProps<Props>) => Content) | Content;\n};\n\nfunction isBuiltPropDefinition(\n value: unknown,\n): value is AnyBuiltPropDefinition {\n return typeof value === 'function' && value !== null && 'visibility' in value;\n}\n\nfunction isSplitLayoutInPropDefinition(\n value: unknown,\n): value is SplitLayoutInPropDefinition {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'render' in value &&\n (value as { render?: unknown }).render !== undefined\n );\n}\n\nfunction isJSXElementDefinition(\n definition: unknown,\n): definition is AnyBuiltPropDefinition & { type: 'JSX.Element' } {\n return (\n isBuiltPropDefinition(definition) &&\n 'type' in definition &&\n definition.type === 'JSX.Element'\n );\n}\n\nfunction toLayoutRenderPropKey(\n includeKey: string,\n definition: unknown,\n) {\n return isJSXElementDefinition(definition)\n ? capitalize(includeKey)\n : includeKey;\n}\n\nfunction readLayoutOptionValue(\n includeKey: string,\n definition: unknown,\n sources: Record<string, unknown>,\n) {\n const layoutOptionKeys = isJSXElementDefinition(definition)\n ? [capitalize(includeKey), includeKey]\n : [includeKey, capitalize(includeKey)];\n\n for (const key of layoutOptionKeys) {\n if (key in sources) {\n return sources[key];\n }\n }\n\n return undefined;\n}\n\nfunction splitLayoutInProps(inProps: Record<string, unknown>) {\n const resolvedInProps: Record<string, AnyBuiltPropDefinition> = {};\n const splitInProps: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(inProps)) {\n if (isBuiltPropDefinition(value)) {\n resolvedInProps[key] = value;\n continue;\n }\n\n if (isSplitLayoutInPropDefinition(value)) {\n splitInProps[key] = value.render;\n\n if (value.props && typeof value.props === 'object') {\n Object.assign(resolvedInProps, value.props);\n }\n }\n }\n\n return {\n resolvedInProps,\n splitInProps,\n };\n}\n\nfunction resolveLayoutOptionDefaults(\n defaults: Record<string, unknown>,\n options: Record<string, unknown>,\n) {\n const resolved = { ...options };\n\n for (const [key, defaultValue] of Object.entries(defaults)) {\n if (key in options) {\n if (typeof defaultValue === 'function') {\n resolved[key] = options[key];\n } else {\n resolved[key] = functionalUpdate(\n defaultValue,\n options[key] as Updater<unknown>,\n );\n }\n }\n }\n\n return resolved;\n}\n\ntype CreateViewMapOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Options extends InPropsDefinition<Resources>,\n IncludeProps extends IncludedProps<InferredInProps<Resources, Options>> = {},\n CustomProps extends InPropsObject = {},\n Composables extends ComposableComponents = {},\n> = {\n /**\n * An array of valid resource names to support.\n */\n resources: Resources;\n /**\n * The options that are passed into the created resource layout.\n */\n options: Options;\n layout: {\n /**\n * The props to pass to the layout.\n */\n props?: LayoutProps<Resources, Options, IncludeProps, CustomProps>;\n /**\n * Components used to compose the layout. Invoked per layout instance with\n * a scoped `create` that resolves composable `name` callbacks using the\n * layout's `resource` and `name`.\n */\n composables?: (\n create: CreateLayoutComposable<LayoutResourceKey<Resources>>,\n ) => Composables;\n /**\n * The render function for the layout.\n */\n render: (\n props: LayoutRenderProps<Resources, Options, IncludeProps, CustomProps>,\n context: LayoutRenderContext<Resources, Composables>,\n ) => JSX.Element;\n };\n};\n\ntype ResourceLayoutComposition<\n Name extends string,\n Composables extends ComposableComponents,\n> = [keyof Composables] extends [never]\n ? {}\n : {\n makeComposable: MakeComposable<Composables, Name>;\n };\ntype ResourceLayoutComponent<\n Name extends string,\n Props extends InPropsObject = {},\n Composables extends ComposableComponents = {},\n> = ResourceLayoutComposition<Name, Composables> &\n BaseComponent<Name, ResolveProps<Props>> & {\n (props: Show<ResolveProps<Props>>): JSX.Element;\n };\n\ntype LayoutPropDefaults = Record<string, unknown>;\n\ntype LayoutPropsForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n> = ResolveLayoutProps<InferredInProps<Resources, InProps>>;\n\ntype CreateTimeLayoutPropWithDefault<\n LayoutProps extends LayoutPropDefaults,\n K extends keyof LayoutProps,\n> = LayoutProps[K] extends (...args: unknown[]) => unknown\n ? LayoutProps[K]\n : Updater<LayoutProps[K]>;\n\ntype ResolveLayoutPropsWithDefaults<\n LayoutProps extends LayoutPropDefaults,\n Defaults extends LayoutPropDefaults,\n> = Omit<LayoutProps, keyof Defaults> & {\n [K in keyof Defaults & keyof LayoutProps]?: CreateTimeLayoutPropWithDefault<\n LayoutProps,\n K\n >;\n};\n\ntype CreateResourceLayoutOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n> = LayoutPropsForResource<Resources, InProps> & {\n name: Name;\n resource: Resource;\n props?: Props;\n};\ntype CreateLayoutForResourceOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n> = {\n name?: Name;\n resource: Resource;\n};\ntype CreatedLayoutForResourceOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Props extends InPropsObject = {},\n Defaults extends LayoutPropDefaults = {},\n> = ResolveLayoutPropsWithDefaults<\n LayoutPropsForResource<Resources, InProps>,\n Defaults\n> & {\n props?: Props;\n};\ntype CreatedLayoutForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n CustomProps extends InPropsObject = {},\n Composables extends ComposableComponents = {},\n Defaults extends LayoutPropDefaults = {},\n> = <OverrideName extends string = Name, Props extends InPropsObject = {}>(\n options: CreatedLayoutForResourceOptions<\n Resources,\n InProps,\n Props,\n Defaults\n > & {\n name?: OverrideName;\n },\n) => ResourceLayoutComponent<OverrideName, CustomProps, Composables>;\n\ntype SetDefaultPropsForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n> = Partial<LayoutPropsForResource<Resources, InProps>>;\n\ntype ResolvedSetDefaultProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Defaults extends SetDefaultPropsForResource<Resources, InProps>,\n> = {\n [K in keyof Defaults &\n keyof LayoutPropsForResource<Resources, InProps>]: LayoutPropsForResource<\n Resources,\n InProps\n >[K];\n};\n\ntype SetDefaultPropForResourceFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n CustomProps extends InPropsObject = {},\n Composables extends ComposableComponents = {},\n> = <const Defaults extends SetDefaultPropsForResource<Resources, InProps>>(\n /**\n * Default values for layout props. Each prop can only be set once.\n */\n defaults: Defaults,\n) => CreatedLayoutForResource<\n Resources,\n InProps,\n Name,\n Resource,\n CustomProps,\n Composables,\n ResolvedSetDefaultProps<Resources, InProps, Defaults>\n>;\n\ntype CreateLayoutForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {},\n CustomProps extends InPropsObject = {},\n Composables extends ComposableComponents = {},\n> = <Name extends string, Resource extends LayoutResourceKey<Resources>>(\n options: CreateLayoutForResourceOptions<Resources, Name, Resource>,\n) => CreatedLayoutForResource<\n Resources,\n InProps,\n Name,\n Resource,\n CustomProps,\n Composables\n> & {\n /**\n * Set default values for layout props in a single call.\n */\n setDefaults: SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Name,\n Resource,\n CustomProps,\n Composables\n >;\n};\ntype CreateResourceLayoutFnImpl<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {},\n CustomProps extends InPropsObject = {},\n Composables extends ComposableComponents = {},\n> = <\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n>(\n options: CreateResourceLayoutOptions<\n Resources,\n InProps,\n Name,\n Resource,\n Props\n >,\n) => ResourceLayoutComponent<Name, CustomProps, Composables>;\nexport interface CreateResourceLayoutFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {},\n CustomProps extends InPropsObject = {},\n Composables extends ComposableComponents = {},\n> extends CreateResourceLayoutFnImpl<\n Resources,\n InProps,\n IncludeProps,\n CustomProps,\n Composables\n> {\n /**\n * A function to create a resource layout for a specific resource.\n */\n forResource: CreateLayoutForResource<\n Resources,\n InProps,\n IncludeProps,\n CustomProps,\n Composables\n >;\n}\n\ntype DefinedResourceLayout<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {},\n CustomProps extends InPropsObject = {},\n Composables extends ComposableComponents = {},\n> = {\n createResourceConfig: CreateResourceConfigFn<Resources>;\n createResourceLayout: CreateResourceLayoutFn<\n Resources,\n InProps,\n IncludeProps,\n CustomProps,\n Composables\n >;\n};\n\nexport function defineResourceLayout<\n const Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {},\n CustomProps extends InPropsObject = {},\n Composables extends ComposableComponents = {},\n>(\n options: CreateViewMapOptions<\n Resources,\n InProps,\n IncludeProps,\n CustomProps,\n Composables\n >,\n) {\n const { options: inProps, resources, layout } = options;\n const normalizedResources = normalizeResources(resources);\n const resourcesEnum = createPrimitivePropBuilder('string').enum(\n toResourceEnum(normalizedResources),\n );\n const definedResourceLayout: CreateResourceLayoutFnImpl<\n Resources,\n InProps,\n IncludeProps,\n CustomProps,\n Composables\n > = (layoutOptions) => {\n const {\n name,\n props: instancePropDefinitions,\n ...layoutOptionProps\n } = layoutOptions;\n const createComposableLayout =\n makeComposable<\n LayoutRenderProps<Resources, InProps, IncludeProps, CustomProps>\n >();\n const nameProp = createProp.string().literal(name);\n const rawResolvedOptions =\n typeof inProps === 'function'\n ? inProps({\n resource: resourcesEnum,\n name: nameProp,\n })\n : inProps;\n const { resolvedInProps, splitInProps } = splitLayoutInProps({\n ...(rawResolvedOptions as Record<string, unknown>),\n ...(instancePropDefinitions as Record<string, unknown> | undefined),\n ...layoutOptionProps,\n });\n const { composables, render, props: layoutProps } = layout;\n const customLayoutProps = layoutProps?.custom;\n const includeLayoutProps = layoutProps?.include;\n const resolvedLayoutProps = {\n ...customLayoutProps,\n };\n const layoutContext: ComposableNameContext<\n LayoutResourceKey<Resources>,\n typeof name\n > = {\n resource: layoutOptions.resource,\n name,\n capitalize,\n };\n const resolvedComposables = composables\n ? resolveLayoutComposables(composables, layoutContext)\n : undefined;\n const mergedRenderContext = {\n composables: resolvedComposables as LayoutRenderComposables<Composables>,\n resource: layoutContext.resource,\n name: layoutContext.name,\n inProps: splitInProps,\n } as LayoutRenderContext<Resources, Composables>;\n\n function Component(props: Show<ResolveProps<CustomProps>>) {\n const validatedProps = validateProps(resolvedLayoutProps, props);\n const includedPropKeys = Object.keys(includeLayoutProps ?? {});\n const includedPropDefinitions = pick(\n resolvedInProps,\n includedPropKeys,\n ) as Record<string, unknown>;\n const includedPropValues = {\n ...resolvePropDefinitionValues(includedPropDefinitions),\n } as Record<string, unknown>;\n\n for (const key of includedPropKeys) {\n const definition = resolvedInProps[key];\n const layoutOptionValue = readLayoutOptionValue(\n key,\n definition,\n layoutOptionProps,\n );\n const splitValue = key in splitInProps ? splitInProps[key] : undefined;\n const value = layoutOptionValue ?? splitValue;\n\n if (value !== undefined) {\n includedPropValues[key] = value;\n }\n }\n\n const validatedIncludedProps = validateProps(\n includedPropDefinitions as Record<string, AnyBuiltPropDefinition>,\n includedPropValues,\n );\n const layoutRenderIncludedProps = Object.fromEntries(\n includedPropKeys.flatMap((key) => {\n if (!(key in validatedIncludedProps)) {\n return [];\n }\n\n return [\n [\n toLayoutRenderPropKey(key, resolvedInProps[key]),\n validatedIncludedProps[key as keyof typeof validatedIncludedProps],\n ],\n ];\n }),\n );\n const layoutRenderProps = {\n ...validatedProps,\n ...layoutRenderIncludedProps,\n } as unknown as LayoutRenderProps<\n Resources,\n InProps,\n IncludeProps,\n CustomProps\n >;\n\n return <>{render(layoutRenderProps, mergedRenderContext)}</>;\n }\n\n function createComposition<LayoutName extends string>(\n compositionOptions: MakeComposableOptions<Composables, LayoutName>,\n ) {\n if (!compositionOptions.components) {\n return {} as ResourceLayoutComposition<LayoutName, Composables>;\n }\n\n return {\n makeComposable: createComposableLayout(compositionOptions),\n };\n }\n\n return Object.assign(Component, {\n displayName: name,\n props: undefined as unknown as ResolveProps<CustomProps>,\n ...createComposition({\n components: resolvedComposables as Composables | undefined,\n name,\n }),\n });\n };\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 (({ name, ...rest }) =>\n definedResourceLayout({\n ...defaults,\n name: name ?? defaultName,\n resource,\n ...resolveLayoutOptionDefaults(defaults, rest),\n } as never) as never) as CreatedLayoutForResource<\n Resources,\n InProps,\n Name,\n Resource,\n CustomProps,\n Composables,\n Defaults\n >;\n }\n\n function createLayoutForResourceBuilder<\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n >(\n defaultName: Name | undefined,\n resource: Resource,\n ): CreatedLayoutForResource<\n Resources,\n InProps,\n Name,\n Resource,\n CustomProps,\n Composables\n > & {\n setDefaults: SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Name,\n Resource,\n CustomProps,\n Composables\n >;\n } {\n const createLayout = createLayoutForResource(defaultName, resource, {});\n\n const setDefaults = ((defaults) =>\n createLayoutForResource(defaultName, resource, defaults)) as SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Name,\n Resource,\n CustomProps,\n Composables\n >;\n\n return Object.assign(createLayout, { setDefaults });\n }\n const forResource: CreateLayoutForResource<\n Resources,\n InProps,\n IncludeProps,\n CustomProps,\n Composables\n > = (options) => {\n const { name: defaultName, resource } = options;\n\n if (!resource) {\n throw new Error('\"resource\" is required when calling \"forResource\"');\n }\n\n return createLayoutForResourceBuilder(defaultName, resource);\n };\n const createResourceLayout: CreateResourceLayoutFn<\n Resources,\n InProps,\n IncludeProps,\n CustomProps,\n Composables\n > = Object.assign(definedResourceLayout, {\n forResource,\n });\n\n return {\n createResourceConfig,\n createResourceLayout,\n } as DefinedResourceLayout<\n Resources,\n InProps,\n IncludeProps,\n CustomProps,\n Composables\n >;\n}\n"],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import { ResolveLayoutProps, ResolveProps } from "../validators/types.cjs";
2
+ import { BaseComponent, Show, Updater } from "../utils.cjs";
3
+ import { LayoutResourceKey, ResourceDefinition } from "../resource.cjs";
4
+ import { InPropsDefinition, InPropsObject, IncludedProps, InferredInProps, LayoutRenderProps } from "../props.cjs";
5
+ import { ComposableComponents, CreateLayoutComposable, MakeComposable } from "../composable.cjs";
6
+ import { CreateResourceConfigFn } from "./get-component.cjs";
7
+ import { JSX } from "react";
8
+
9
+ //#region src/create-config/define-layout.d.ts
10
+ type LayoutProps<Resources extends ReadonlyArray<ResourceDefinition>, Options extends InPropsDefinition<Resources>, IncludeProps extends IncludedProps<InferredInProps<Resources, Options>> = {}, CustomProps extends InPropsObject = {}> = {
11
+ /**
12
+ * Props to include in the layout.
13
+ */
14
+ include?: IncludeProps;
15
+ /**
16
+ * Custom props that the layout will receive.
17
+ */
18
+ custom?: CustomProps;
19
+ };
20
+ type LayoutRenderContext<Resources extends ReadonlyArray<ResourceDefinition>, Composables extends ComposableComponents> = {
21
+ composables: LayoutRenderComposables<Composables>;
22
+ inProps: Record<string, unknown>;
23
+ resource: LayoutResourceKey<Resources>;
24
+ name: string;
25
+ };
26
+ type LayoutRenderComposables<Composables extends ComposableComponents> = [keyof Composables] extends [never] ? undefined : Composables;
27
+ type CreateViewMapOptions<Resources extends ReadonlyArray<ResourceDefinition>, Options extends InPropsDefinition<Resources>, IncludeProps extends IncludedProps<InferredInProps<Resources, Options>> = {}, CustomProps extends InPropsObject = {}, Composables extends ComposableComponents = {}> = {
28
+ /**
29
+ * An array of valid resource names to support.
30
+ */
31
+ resources: Resources;
32
+ /**
33
+ * The options that are passed into the created resource layout.
34
+ */
35
+ options: Options;
36
+ layout: {
37
+ /**
38
+ * The props to pass to the layout.
39
+ */
40
+ props?: LayoutProps<Resources, Options, IncludeProps, CustomProps>;
41
+ /**
42
+ * Components used to compose the layout. Invoked per layout instance with
43
+ * a scoped `create` that resolves composable `name` callbacks using the
44
+ * layout's `resource` and `name`.
45
+ */
46
+ composables?: (create: CreateLayoutComposable<LayoutResourceKey<Resources>>) => Composables;
47
+ /**
48
+ * The render function for the layout.
49
+ */
50
+ render: (props: LayoutRenderProps<Resources, Options, IncludeProps, CustomProps>, context: LayoutRenderContext<Resources, Composables>) => JSX.Element;
51
+ };
52
+ };
53
+ type ResourceLayoutComposition<Name extends string, Composables extends ComposableComponents> = [keyof Composables] extends [never] ? {} : {
54
+ makeComposable: MakeComposable<Composables, Name>;
55
+ };
56
+ type ResourceLayoutComponent<Name extends string, Props extends InPropsObject = {}, Composables extends ComposableComponents = {}> = ResourceLayoutComposition<Name, Composables> & BaseComponent<Name, ResolveProps<Props>> & {
57
+ (props: Show<ResolveProps<Props>>): JSX.Element;
58
+ };
59
+ type LayoutPropDefaults = Record<string, unknown>;
60
+ type LayoutPropsForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>> = ResolveLayoutProps<InferredInProps<Resources, InProps>>;
61
+ type CreateTimeLayoutPropWithDefault<LayoutProps extends LayoutPropDefaults, K extends keyof LayoutProps> = LayoutProps[K] extends ((...args: unknown[]) => unknown) ? LayoutProps[K] : Updater<LayoutProps[K]>;
62
+ type ResolveLayoutPropsWithDefaults<LayoutProps extends LayoutPropDefaults, Defaults extends LayoutPropDefaults> = Omit<LayoutProps, keyof Defaults> & { [K in keyof Defaults & keyof LayoutProps]?: CreateTimeLayoutPropWithDefault<LayoutProps, K> };
63
+ type CreateResourceLayoutOptions<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Name extends string, Resource extends LayoutResourceKey<Resources>, Props extends InPropsObject = {}> = LayoutPropsForResource<Resources, InProps> & {
64
+ name: Name;
65
+ resource: Resource;
66
+ props?: Props;
67
+ };
68
+ type CreateLayoutForResourceOptions<Resources extends ReadonlyArray<ResourceDefinition>, Name extends string, Resource extends LayoutResourceKey<Resources>> = {
69
+ name?: Name;
70
+ resource: Resource;
71
+ };
72
+ type CreatedLayoutForResourceOptions<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Props extends InPropsObject = {}, Defaults extends LayoutPropDefaults = {}> = ResolveLayoutPropsWithDefaults<LayoutPropsForResource<Resources, InProps>, Defaults> & {
73
+ props?: Props;
74
+ };
75
+ type CreatedLayoutForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Name extends string, Resource extends LayoutResourceKey<Resources>, CustomProps extends InPropsObject = {}, Composables extends ComposableComponents = {}, Defaults extends LayoutPropDefaults = {}> = <OverrideName extends string = Name, Props extends InPropsObject = {}>(options: CreatedLayoutForResourceOptions<Resources, InProps, Props, Defaults> & {
76
+ name?: OverrideName;
77
+ }) => ResourceLayoutComponent<OverrideName, CustomProps, Composables>;
78
+ type SetDefaultPropsForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>> = Partial<LayoutPropsForResource<Resources, InProps>>;
79
+ type ResolvedSetDefaultProps<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Defaults extends SetDefaultPropsForResource<Resources, InProps>> = { [K in keyof Defaults & keyof LayoutPropsForResource<Resources, InProps>]: LayoutPropsForResource<Resources, InProps>[K] };
80
+ type SetDefaultPropForResourceFn<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Name extends string, Resource extends LayoutResourceKey<Resources>, CustomProps extends InPropsObject = {}, Composables extends ComposableComponents = {}> = <const Defaults extends SetDefaultPropsForResource<Resources, InProps>>(
81
+ /**
82
+ * Default values for layout props. Each prop can only be set once.
83
+ */
84
+
85
+ defaults: Defaults) => CreatedLayoutForResource<Resources, InProps, Name, Resource, CustomProps, Composables, ResolvedSetDefaultProps<Resources, InProps, Defaults>>;
86
+ type CreateLayoutForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {}, CustomProps extends InPropsObject = {}, Composables extends ComposableComponents = {}> = <Name extends string, Resource extends LayoutResourceKey<Resources>>(options: CreateLayoutForResourceOptions<Resources, Name, Resource>) => CreatedLayoutForResource<Resources, InProps, Name, Resource, CustomProps, Composables> & {
87
+ /**
88
+ * Set default values for layout props in a single call.
89
+ */
90
+ setDefaults: SetDefaultPropForResourceFn<Resources, InProps, Name, Resource, CustomProps, Composables>;
91
+ };
92
+ type CreateResourceLayoutFnImpl<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {}, CustomProps extends InPropsObject = {}, Composables extends ComposableComponents = {}> = <Name extends string, Resource extends LayoutResourceKey<Resources>, Props extends InPropsObject = {}>(options: CreateResourceLayoutOptions<Resources, InProps, Name, Resource, Props>) => ResourceLayoutComponent<Name, CustomProps, Composables>;
93
+ interface CreateResourceLayoutFn<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {}, CustomProps extends InPropsObject = {}, Composables extends ComposableComponents = {}> extends CreateResourceLayoutFnImpl<Resources, InProps, IncludeProps, CustomProps, Composables> {
94
+ /**
95
+ * A function to create a resource layout for a specific resource.
96
+ */
97
+ forResource: CreateLayoutForResource<Resources, InProps, IncludeProps, CustomProps, Composables>;
98
+ }
99
+ type DefinedResourceLayout<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {}, CustomProps extends InPropsObject = {}, Composables extends ComposableComponents = {}> = {
100
+ createResourceConfig: CreateResourceConfigFn<Resources>;
101
+ createResourceLayout: CreateResourceLayoutFn<Resources, InProps, IncludeProps, CustomProps, Composables>;
102
+ };
103
+ declare function defineResourceLayout<const Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {}, CustomProps extends InPropsObject = {}, Composables extends ComposableComponents = {}>(options: CreateViewMapOptions<Resources, InProps, IncludeProps, CustomProps, Composables>): DefinedResourceLayout<Resources, InProps, IncludeProps, CustomProps, Composables>;
104
+ //#endregion
105
+ export { CreateResourceLayoutFn, defineResourceLayout };
106
+ //# sourceMappingURL=define-layout.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-layout.d.cts","names":[],"sources":["../../src/create-config/define-layout.tsx"],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import { ResolveLayoutProps, ResolveProps } from "../validators/types.mjs";
2
+ import { BaseComponent, Show, Updater } from "../utils.mjs";
3
+ import { LayoutResourceKey, ResourceDefinition } from "../resource.mjs";
4
+ import { InPropsDefinition, InPropsObject, IncludedProps, InferredInProps, LayoutRenderProps } from "../props.mjs";
5
+ import { ComposableComponents, CreateLayoutComposable, MakeComposable } from "../composable.mjs";
6
+ import { CreateResourceConfigFn } from "./get-component.mjs";
7
+ import { JSX } from "react";
8
+
9
+ //#region src/create-config/define-layout.d.ts
10
+ type LayoutProps<Resources extends ReadonlyArray<ResourceDefinition>, Options extends InPropsDefinition<Resources>, IncludeProps extends IncludedProps<InferredInProps<Resources, Options>> = {}, CustomProps extends InPropsObject = {}> = {
11
+ /**
12
+ * Props to include in the layout.
13
+ */
14
+ include?: IncludeProps;
15
+ /**
16
+ * Custom props that the layout will receive.
17
+ */
18
+ custom?: CustomProps;
19
+ };
20
+ type LayoutRenderContext<Resources extends ReadonlyArray<ResourceDefinition>, Composables extends ComposableComponents> = {
21
+ composables: LayoutRenderComposables<Composables>;
22
+ inProps: Record<string, unknown>;
23
+ resource: LayoutResourceKey<Resources>;
24
+ name: string;
25
+ };
26
+ type LayoutRenderComposables<Composables extends ComposableComponents> = [keyof Composables] extends [never] ? undefined : Composables;
27
+ type CreateViewMapOptions<Resources extends ReadonlyArray<ResourceDefinition>, Options extends InPropsDefinition<Resources>, IncludeProps extends IncludedProps<InferredInProps<Resources, Options>> = {}, CustomProps extends InPropsObject = {}, Composables extends ComposableComponents = {}> = {
28
+ /**
29
+ * An array of valid resource names to support.
30
+ */
31
+ resources: Resources;
32
+ /**
33
+ * The options that are passed into the created resource layout.
34
+ */
35
+ options: Options;
36
+ layout: {
37
+ /**
38
+ * The props to pass to the layout.
39
+ */
40
+ props?: LayoutProps<Resources, Options, IncludeProps, CustomProps>;
41
+ /**
42
+ * Components used to compose the layout. Invoked per layout instance with
43
+ * a scoped `create` that resolves composable `name` callbacks using the
44
+ * layout's `resource` and `name`.
45
+ */
46
+ composables?: (create: CreateLayoutComposable<LayoutResourceKey<Resources>>) => Composables;
47
+ /**
48
+ * The render function for the layout.
49
+ */
50
+ render: (props: LayoutRenderProps<Resources, Options, IncludeProps, CustomProps>, context: LayoutRenderContext<Resources, Composables>) => JSX.Element;
51
+ };
52
+ };
53
+ type ResourceLayoutComposition<Name extends string, Composables extends ComposableComponents> = [keyof Composables] extends [never] ? {} : {
54
+ makeComposable: MakeComposable<Composables, Name>;
55
+ };
56
+ type ResourceLayoutComponent<Name extends string, Props extends InPropsObject = {}, Composables extends ComposableComponents = {}> = ResourceLayoutComposition<Name, Composables> & BaseComponent<Name, ResolveProps<Props>> & {
57
+ (props: Show<ResolveProps<Props>>): JSX.Element;
58
+ };
59
+ type LayoutPropDefaults = Record<string, unknown>;
60
+ type LayoutPropsForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>> = ResolveLayoutProps<InferredInProps<Resources, InProps>>;
61
+ type CreateTimeLayoutPropWithDefault<LayoutProps extends LayoutPropDefaults, K extends keyof LayoutProps> = LayoutProps[K] extends ((...args: unknown[]) => unknown) ? LayoutProps[K] : Updater<LayoutProps[K]>;
62
+ type ResolveLayoutPropsWithDefaults<LayoutProps extends LayoutPropDefaults, Defaults extends LayoutPropDefaults> = Omit<LayoutProps, keyof Defaults> & { [K in keyof Defaults & keyof LayoutProps]?: CreateTimeLayoutPropWithDefault<LayoutProps, K> };
63
+ type CreateResourceLayoutOptions<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Name extends string, Resource extends LayoutResourceKey<Resources>, Props extends InPropsObject = {}> = LayoutPropsForResource<Resources, InProps> & {
64
+ name: Name;
65
+ resource: Resource;
66
+ props?: Props;
67
+ };
68
+ type CreateLayoutForResourceOptions<Resources extends ReadonlyArray<ResourceDefinition>, Name extends string, Resource extends LayoutResourceKey<Resources>> = {
69
+ name?: Name;
70
+ resource: Resource;
71
+ };
72
+ type CreatedLayoutForResourceOptions<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Props extends InPropsObject = {}, Defaults extends LayoutPropDefaults = {}> = ResolveLayoutPropsWithDefaults<LayoutPropsForResource<Resources, InProps>, Defaults> & {
73
+ props?: Props;
74
+ };
75
+ type CreatedLayoutForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Name extends string, Resource extends LayoutResourceKey<Resources>, CustomProps extends InPropsObject = {}, Composables extends ComposableComponents = {}, Defaults extends LayoutPropDefaults = {}> = <OverrideName extends string = Name, Props extends InPropsObject = {}>(options: CreatedLayoutForResourceOptions<Resources, InProps, Props, Defaults> & {
76
+ name?: OverrideName;
77
+ }) => ResourceLayoutComponent<OverrideName, CustomProps, Composables>;
78
+ type SetDefaultPropsForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>> = Partial<LayoutPropsForResource<Resources, InProps>>;
79
+ type ResolvedSetDefaultProps<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Defaults extends SetDefaultPropsForResource<Resources, InProps>> = { [K in keyof Defaults & keyof LayoutPropsForResource<Resources, InProps>]: LayoutPropsForResource<Resources, InProps>[K] };
80
+ type SetDefaultPropForResourceFn<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Name extends string, Resource extends LayoutResourceKey<Resources>, CustomProps extends InPropsObject = {}, Composables extends ComposableComponents = {}> = <const Defaults extends SetDefaultPropsForResource<Resources, InProps>>(
81
+ /**
82
+ * Default values for layout props. Each prop can only be set once.
83
+ */
84
+
85
+ defaults: Defaults) => CreatedLayoutForResource<Resources, InProps, Name, Resource, CustomProps, Composables, ResolvedSetDefaultProps<Resources, InProps, Defaults>>;
86
+ type CreateLayoutForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {}, CustomProps extends InPropsObject = {}, Composables extends ComposableComponents = {}> = <Name extends string, Resource extends LayoutResourceKey<Resources>>(options: CreateLayoutForResourceOptions<Resources, Name, Resource>) => CreatedLayoutForResource<Resources, InProps, Name, Resource, CustomProps, Composables> & {
87
+ /**
88
+ * Set default values for layout props in a single call.
89
+ */
90
+ setDefaults: SetDefaultPropForResourceFn<Resources, InProps, Name, Resource, CustomProps, Composables>;
91
+ };
92
+ type CreateResourceLayoutFnImpl<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {}, CustomProps extends InPropsObject = {}, Composables extends ComposableComponents = {}> = <Name extends string, Resource extends LayoutResourceKey<Resources>, Props extends InPropsObject = {}>(options: CreateResourceLayoutOptions<Resources, InProps, Name, Resource, Props>) => ResourceLayoutComponent<Name, CustomProps, Composables>;
93
+ interface CreateResourceLayoutFn<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {}, CustomProps extends InPropsObject = {}, Composables extends ComposableComponents = {}> extends CreateResourceLayoutFnImpl<Resources, InProps, IncludeProps, CustomProps, Composables> {
94
+ /**
95
+ * A function to create a resource layout for a specific resource.
96
+ */
97
+ forResource: CreateLayoutForResource<Resources, InProps, IncludeProps, CustomProps, Composables>;
98
+ }
99
+ type DefinedResourceLayout<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {}, CustomProps extends InPropsObject = {}, Composables extends ComposableComponents = {}> = {
100
+ createResourceConfig: CreateResourceConfigFn<Resources>;
101
+ createResourceLayout: CreateResourceLayoutFn<Resources, InProps, IncludeProps, CustomProps, Composables>;
102
+ };
103
+ declare function defineResourceLayout<const Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {}, CustomProps extends InPropsObject = {}, Composables extends ComposableComponents = {}>(options: CreateViewMapOptions<Resources, InProps, IncludeProps, CustomProps, Composables>): DefinedResourceLayout<Resources, InProps, IncludeProps, CustomProps, Composables>;
104
+ //#endregion
105
+ export { CreateResourceLayoutFn, defineResourceLayout };
106
+ //# sourceMappingURL=define-layout.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-layout.d.mts","names":[],"sources":["../../src/create-config/define-layout.tsx"],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ import { functionalUpdate, pick, resolvePropDefinitionValues } from "../utils.mjs";
2
+ import { makeComposable, resolveLayoutComposables } from "../composable.mjs";
3
+ import { createPrimitivePropBuilder, createProp } from "../validators/builders.mjs";
4
+ import { validateProps } from "../validators/validate-props.mjs";
5
+ import { normalizeResources, toResourceEnum } from "../resource.mjs";
6
+ import { capitalize } from "../utils/capitalize.mjs";
7
+ import { createResourceConfig } from "./get-component.mjs";
8
+ import { Fragment, jsx } from "react/jsx-runtime";
9
+
10
+ //#region src/create-config/define-layout.tsx
11
+ function isBuiltPropDefinition(value) {
12
+ return typeof value === "function" && value !== null && "visibility" in value;
13
+ }
14
+ function isSplitLayoutInPropDefinition(value) {
15
+ return value !== null && typeof value === "object" && "render" in value && value.render !== void 0;
16
+ }
17
+ function isJSXElementDefinition(definition) {
18
+ return isBuiltPropDefinition(definition) && "type" in definition && definition.type === "JSX.Element";
19
+ }
20
+ function toLayoutRenderPropKey(includeKey, definition) {
21
+ return isJSXElementDefinition(definition) ? capitalize(includeKey) : includeKey;
22
+ }
23
+ function readLayoutOptionValue(includeKey, definition, sources) {
24
+ const layoutOptionKeys = isJSXElementDefinition(definition) ? [capitalize(includeKey), includeKey] : [includeKey, capitalize(includeKey)];
25
+ for (const key of layoutOptionKeys) if (key in sources) return sources[key];
26
+ }
27
+ function splitLayoutInProps(inProps) {
28
+ const resolvedInProps = {};
29
+ const splitInProps = {};
30
+ for (const [key, value] of Object.entries(inProps)) {
31
+ if (isBuiltPropDefinition(value)) {
32
+ resolvedInProps[key] = value;
33
+ continue;
34
+ }
35
+ if (isSplitLayoutInPropDefinition(value)) {
36
+ splitInProps[key] = value.render;
37
+ if (value.props && typeof value.props === "object") Object.assign(resolvedInProps, value.props);
38
+ }
39
+ }
40
+ return {
41
+ resolvedInProps,
42
+ splitInProps
43
+ };
44
+ }
45
+ function resolveLayoutOptionDefaults(defaults, options) {
46
+ const resolved = { ...options };
47
+ for (const [key, defaultValue] of Object.entries(defaults)) if (key in options) if (typeof defaultValue === "function") resolved[key] = options[key];
48
+ else resolved[key] = functionalUpdate(defaultValue, options[key]);
49
+ return resolved;
50
+ }
51
+ function defineResourceLayout(options) {
52
+ const { options: inProps, resources, layout } = options;
53
+ const normalizedResources = normalizeResources(resources);
54
+ const resourcesEnum = createPrimitivePropBuilder("string").enum(toResourceEnum(normalizedResources));
55
+ const definedResourceLayout = (layoutOptions) => {
56
+ const { name, props: instancePropDefinitions, ...layoutOptionProps } = layoutOptions;
57
+ const createComposableLayout = makeComposable();
58
+ const nameProp = createProp.string().literal(name);
59
+ const { resolvedInProps, splitInProps } = splitLayoutInProps({
60
+ ...typeof inProps === "function" ? inProps({
61
+ resource: resourcesEnum,
62
+ name: nameProp
63
+ }) : inProps,
64
+ ...instancePropDefinitions,
65
+ ...layoutOptionProps
66
+ });
67
+ const { composables, render, props: layoutProps } = layout;
68
+ const customLayoutProps = layoutProps?.custom;
69
+ const includeLayoutProps = layoutProps?.include;
70
+ const resolvedLayoutProps = { ...customLayoutProps };
71
+ const layoutContext = {
72
+ resource: layoutOptions.resource,
73
+ name,
74
+ capitalize
75
+ };
76
+ const resolvedComposables = composables ? resolveLayoutComposables(composables, layoutContext) : void 0;
77
+ const mergedRenderContext = {
78
+ composables: resolvedComposables,
79
+ resource: layoutContext.resource,
80
+ name: layoutContext.name,
81
+ inProps: splitInProps
82
+ };
83
+ function Component(props) {
84
+ const validatedProps = validateProps(resolvedLayoutProps, props);
85
+ const includedPropKeys = Object.keys(includeLayoutProps ?? {});
86
+ const includedPropDefinitions = pick(resolvedInProps, includedPropKeys);
87
+ const includedPropValues = { ...resolvePropDefinitionValues(includedPropDefinitions) };
88
+ for (const key of includedPropKeys) {
89
+ const definition = resolvedInProps[key];
90
+ const layoutOptionValue = readLayoutOptionValue(key, definition, layoutOptionProps);
91
+ const splitValue = key in splitInProps ? splitInProps[key] : void 0;
92
+ const value = layoutOptionValue ?? splitValue;
93
+ if (value !== void 0) includedPropValues[key] = value;
94
+ }
95
+ const validatedIncludedProps = validateProps(includedPropDefinitions, includedPropValues);
96
+ const layoutRenderIncludedProps = Object.fromEntries(includedPropKeys.flatMap((key) => {
97
+ if (!(key in validatedIncludedProps)) return [];
98
+ return [[toLayoutRenderPropKey(key, resolvedInProps[key]), validatedIncludedProps[key]]];
99
+ }));
100
+ return /* @__PURE__ */ jsx(Fragment, { children: render({
101
+ ...validatedProps,
102
+ ...layoutRenderIncludedProps
103
+ }, mergedRenderContext) });
104
+ }
105
+ function createComposition(compositionOptions) {
106
+ if (!compositionOptions.components) return {};
107
+ return { makeComposable: createComposableLayout(compositionOptions) };
108
+ }
109
+ return Object.assign(Component, {
110
+ displayName: name,
111
+ props: void 0,
112
+ ...createComposition({
113
+ components: resolvedComposables,
114
+ name
115
+ })
116
+ });
117
+ };
118
+ function createLayoutForResource(defaultName, resource, defaults) {
119
+ return (({ name, ...rest }) => definedResourceLayout({
120
+ ...defaults,
121
+ name: name ?? defaultName,
122
+ resource,
123
+ ...resolveLayoutOptionDefaults(defaults, rest)
124
+ }));
125
+ }
126
+ function createLayoutForResourceBuilder(defaultName, resource) {
127
+ const createLayout = createLayoutForResource(defaultName, resource, {});
128
+ const setDefaults = ((defaults) => createLayoutForResource(defaultName, resource, defaults));
129
+ return Object.assign(createLayout, { setDefaults });
130
+ }
131
+ const forResource = (options) => {
132
+ const { name: defaultName, resource } = options;
133
+ if (!resource) throw new Error("\"resource\" is required when calling \"forResource\"");
134
+ return createLayoutForResourceBuilder(defaultName, resource);
135
+ };
136
+ return {
137
+ createResourceConfig,
138
+ createResourceLayout: Object.assign(definedResourceLayout, { forResource })
139
+ };
140
+ }
141
+
142
+ //#endregion
143
+ export { defineResourceLayout };
144
+ //# sourceMappingURL=define-layout.mjs.map