@jfdevelops/react-layout 0.2.0 → 0.4.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 (143) hide show
  1. package/dist/create-config/define-layout.cjs +149 -0
  2. package/dist/create-config/define-layout.cjs.map +1 -0
  3. package/dist/create-config/define-layout.d.cts +107 -0
  4. package/dist/create-config/define-layout.d.cts.map +1 -0
  5. package/dist/create-config/define-layout.d.mts +107 -0
  6. package/dist/create-config/define-layout.d.mts.map +1 -0
  7. package/dist/create-config/define-layout.mjs +149 -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 +83 -11
  24. package/dist/index.d.cts +5 -7
  25. package/dist/index.d.mts +5 -7
  26. package/dist/index.mjs +5 -6
  27. package/dist/props.d.cts +6 -6
  28. package/dist/props.d.cts.map +1 -1
  29. package/dist/props.d.mts +6 -6
  30. package/dist/props.d.mts.map +1 -1
  31. package/dist/resource.cjs.map +1 -1
  32. package/dist/resource.d.cts +23 -3
  33. package/dist/resource.d.cts.map +1 -1
  34. package/dist/resource.d.mts +23 -3
  35. package/dist/resource.d.mts.map +1 -1
  36. package/dist/resource.mjs.map +1 -1
  37. package/dist/utils.cjs +5 -12
  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 -12
  44. package/dist/utils.mjs.map +1 -1
  45. package/package.json +5 -1
  46. package/dist/composable.cjs +0 -72
  47. package/dist/composable.cjs.map +0 -1
  48. package/dist/composable.d.cts +0 -44
  49. package/dist/composable.d.cts.map +0 -1
  50. package/dist/composable.d.mts +0 -44
  51. package/dist/composable.d.mts.map +0 -1
  52. package/dist/composable.mjs +0 -70
  53. package/dist/composable.mjs.map +0 -1
  54. package/dist/create-config.cjs +0 -101
  55. package/dist/create-config.cjs.map +0 -1
  56. package/dist/create-config.d.cts +0 -67
  57. package/dist/create-config.d.cts.map +0 -1
  58. package/dist/create-config.d.mts +0 -67
  59. package/dist/create-config.d.mts.map +0 -1
  60. package/dist/create-config.mjs +0 -101
  61. package/dist/create-config.mjs.map +0 -1
  62. package/dist/utils/capitalize.d.cts +0 -7
  63. package/dist/utils/capitalize.d.cts.map +0 -1
  64. package/dist/utils/capitalize.d.mts +0 -7
  65. package/dist/utils/capitalize.d.mts.map +0 -1
  66. package/dist/validators/base.cjs +0 -41
  67. package/dist/validators/base.cjs.map +0 -1
  68. package/dist/validators/base.d.cts +0 -18
  69. package/dist/validators/base.d.cts.map +0 -1
  70. package/dist/validators/base.d.mts +0 -18
  71. package/dist/validators/base.d.mts.map +0 -1
  72. package/dist/validators/base.mjs +0 -39
  73. package/dist/validators/base.mjs.map +0 -1
  74. package/dist/validators/builders.cjs +0 -137
  75. package/dist/validators/builders.cjs.map +0 -1
  76. package/dist/validators/builders.d.cts +0 -156
  77. package/dist/validators/builders.d.cts.map +0 -1
  78. package/dist/validators/builders.d.mts +0 -156
  79. package/dist/validators/builders.d.mts.map +0 -1
  80. package/dist/validators/builders.mjs +0 -136
  81. package/dist/validators/builders.mjs.map +0 -1
  82. package/dist/validators/component.cjs +0 -73
  83. package/dist/validators/component.cjs.map +0 -1
  84. package/dist/validators/component.d.cts +0 -28
  85. package/dist/validators/component.d.cts.map +0 -1
  86. package/dist/validators/component.d.mts +0 -28
  87. package/dist/validators/component.d.mts.map +0 -1
  88. package/dist/validators/component.mjs +0 -71
  89. package/dist/validators/component.mjs.map +0 -1
  90. package/dist/validators/enum.cjs +0 -27
  91. package/dist/validators/enum.cjs.map +0 -1
  92. package/dist/validators/enum.d.cts +0 -14
  93. package/dist/validators/enum.d.cts.map +0 -1
  94. package/dist/validators/enum.d.mts +0 -14
  95. package/dist/validators/enum.d.mts.map +0 -1
  96. package/dist/validators/enum.mjs +0 -27
  97. package/dist/validators/enum.mjs.map +0 -1
  98. package/dist/validators/index.d.cts +0 -10
  99. package/dist/validators/index.d.mts +0 -10
  100. package/dist/validators/literal.cjs +0 -25
  101. package/dist/validators/literal.cjs.map +0 -1
  102. package/dist/validators/literal.d.cts +0 -14
  103. package/dist/validators/literal.d.cts.map +0 -1
  104. package/dist/validators/literal.d.mts +0 -14
  105. package/dist/validators/literal.d.mts.map +0 -1
  106. package/dist/validators/literal.mjs +0 -25
  107. package/dist/validators/literal.mjs.map +0 -1
  108. package/dist/validators/object.cjs +0 -53
  109. package/dist/validators/object.cjs.map +0 -1
  110. package/dist/validators/object.d.cts +0 -14
  111. package/dist/validators/object.d.cts.map +0 -1
  112. package/dist/validators/object.d.mts +0 -14
  113. package/dist/validators/object.d.mts.map +0 -1
  114. package/dist/validators/object.mjs +0 -53
  115. package/dist/validators/object.mjs.map +0 -1
  116. package/dist/validators/primitive.cjs +0 -80
  117. package/dist/validators/primitive.cjs.map +0 -1
  118. package/dist/validators/primitive.d.cts +0 -33
  119. package/dist/validators/primitive.d.cts.map +0 -1
  120. package/dist/validators/primitive.d.mts +0 -33
  121. package/dist/validators/primitive.d.mts.map +0 -1
  122. package/dist/validators/primitive.mjs +0 -78
  123. package/dist/validators/primitive.mjs.map +0 -1
  124. package/dist/validators/types.d.cts +0 -71
  125. package/dist/validators/types.d.cts.map +0 -1
  126. package/dist/validators/types.d.mts +0 -71
  127. package/dist/validators/types.d.mts.map +0 -1
  128. package/dist/validators/union.cjs +0 -27
  129. package/dist/validators/union.cjs.map +0 -1
  130. package/dist/validators/union.d.cts +0 -14
  131. package/dist/validators/union.d.cts.map +0 -1
  132. package/dist/validators/union.d.mts +0 -14
  133. package/dist/validators/union.d.mts.map +0 -1
  134. package/dist/validators/union.mjs +0 -27
  135. package/dist/validators/union.mjs.map +0 -1
  136. package/dist/validators/validate-props.cjs +0 -20
  137. package/dist/validators/validate-props.cjs.map +0 -1
  138. package/dist/validators/validate-props.d.cts +0 -7
  139. package/dist/validators/validate-props.d.cts.map +0 -1
  140. package/dist/validators/validate-props.d.mts +0 -7
  141. package/dist/validators/validate-props.d.mts.map +0 -1
  142. package/dist/validators/validate-props.mjs +0 -19
  143. package/dist/validators/validate-props.mjs.map +0 -1
@@ -0,0 +1,149 @@
1
+ const require_resource = require('../resource.cjs');
2
+ const require_utils = require('../utils.cjs');
3
+ const require_capitalize = require('../utils/capitalize.cjs');
4
+ const require_get_component = require('./get-component.cjs');
5
+ let _jfdevelops_react_layout_composables = require("@jfdevelops/react-layout-composables");
6
+ let _jfdevelops_react_layout_validator = require("@jfdevelops/react-layout-validator");
7
+ let react_jsx_runtime = require("react/jsx-runtime");
8
+
9
+ //#region src/create-config/define-layout.tsx
10
+ function isBuiltPropDefinition(value) {
11
+ return typeof value === "function" && value !== null && "visibility" in value;
12
+ }
13
+ function isSplitLayoutInPropDefinition(value) {
14
+ return value !== null && typeof value === "object" && "render" in value && value.render !== void 0;
15
+ }
16
+ function isJSXElementDefinition(definition) {
17
+ return isBuiltPropDefinition(definition) && "type" in definition && definition.type === "JSX.Element";
18
+ }
19
+ function toLayoutRenderPropKey(includeKey, definition) {
20
+ return isJSXElementDefinition(definition) ? require_capitalize.capitalize(includeKey) : includeKey;
21
+ }
22
+ function readLayoutOptionValue(includeKey, definition, sources) {
23
+ const layoutOptionKeys = isJSXElementDefinition(definition) ? [require_capitalize.capitalize(includeKey), includeKey] : [includeKey, require_capitalize.capitalize(includeKey)];
24
+ for (const key of layoutOptionKeys) if (key in sources) return sources[key];
25
+ }
26
+ function splitLayoutInProps(inProps) {
27
+ const resolvedInProps = {};
28
+ const splitInProps = {};
29
+ for (const [key, value] of Object.entries(inProps)) {
30
+ if (isBuiltPropDefinition(value)) {
31
+ resolvedInProps[key] = value;
32
+ continue;
33
+ }
34
+ if (isSplitLayoutInPropDefinition(value)) {
35
+ splitInProps[key] = value.render;
36
+ if (value.props && typeof value.props === "object") Object.assign(resolvedInProps, value.props);
37
+ }
38
+ }
39
+ return {
40
+ resolvedInProps,
41
+ splitInProps
42
+ };
43
+ }
44
+ function resolveLayoutOptionDefaults(defaults, options) {
45
+ const resolved = { ...options };
46
+ for (const [key, defaultValue] of Object.entries(defaults)) if (key in options) if (typeof defaultValue === "function") resolved[key] = options[key];
47
+ else resolved[key] = require_utils.functionalUpdate(defaultValue, options[key]);
48
+ return resolved;
49
+ }
50
+ function defineResourceLayout(options) {
51
+ const { options: inProps, resources, layout } = options;
52
+ const normalizedResources = require_resource.normalizeResources(resources);
53
+ const resourcesEnum = (0, _jfdevelops_react_layout_validator.createPrimitivePropBuilder)("string").enum(require_resource.toResourceEnum(normalizedResources));
54
+ const definedResourceLayout = (layoutOptions) => {
55
+ const { name, props: instancePropDefinitions, ...layoutOptionProps } = layoutOptions;
56
+ const createComposableLayout = (0, _jfdevelops_react_layout_composables.makeComposable)();
57
+ const nameProp = _jfdevelops_react_layout_validator.createProp.string().literal(name);
58
+ const { resolvedInProps, splitInProps } = splitLayoutInProps({
59
+ ...typeof inProps === "function" ? inProps({
60
+ resource: resourcesEnum,
61
+ name: nameProp
62
+ }) : inProps,
63
+ ...instancePropDefinitions,
64
+ ...layoutOptionProps
65
+ });
66
+ const { composables, render, props: layoutProps } = layout;
67
+ const customLayoutProps = layoutProps?.custom;
68
+ const includeLayoutProps = layoutProps?.include;
69
+ const resolvedLayoutProps = { ...customLayoutProps };
70
+ const layoutContext = {
71
+ resource: layoutOptions.resource,
72
+ name,
73
+ capitalize: require_capitalize.capitalize
74
+ };
75
+ const resolvedComposables = composables ? (0, _jfdevelops_react_layout_composables.resolveLayoutComposables)(composables, layoutContext) : void 0;
76
+ const mergedResolvedInProps = { ...resolvedInProps };
77
+ for (const { props: presetPropDefinitions } of (0, _jfdevelops_react_layout_composables.collectComposablePresetEntries)(resolvedComposables)) Object.assign(mergedResolvedInProps, presetPropDefinitions);
78
+ const composablePresetProps = (0, _jfdevelops_react_layout_composables.resolveComposablePresetProps)(resolvedComposables, layoutOptionProps);
79
+ const mergedRenderContext = {
80
+ composables: resolvedComposables,
81
+ resource: layoutContext.resource,
82
+ name: layoutContext.name,
83
+ inProps: splitInProps
84
+ };
85
+ function Component(props) {
86
+ const validatedProps = (0, _jfdevelops_react_layout_validator.validateProps)(resolvedLayoutProps, props);
87
+ const includedPropKeys = Object.keys(includeLayoutProps ?? {});
88
+ const includedPropDefinitions = require_utils.pick(mergedResolvedInProps, includedPropKeys);
89
+ const includedPropValues = { ...(0, _jfdevelops_react_layout_validator.resolvePropDefinitionValues)(includedPropDefinitions) };
90
+ for (const key of includedPropKeys) {
91
+ const definition = mergedResolvedInProps[key];
92
+ const layoutOptionValue = readLayoutOptionValue(key, definition, layoutOptionProps);
93
+ const splitValue = key in splitInProps ? splitInProps[key] : void 0;
94
+ const value = layoutOptionValue ?? splitValue;
95
+ if (value !== void 0) includedPropValues[key] = value;
96
+ }
97
+ const validatedIncludedProps = (0, _jfdevelops_react_layout_validator.validateProps)(includedPropDefinitions, includedPropValues);
98
+ const layoutRenderIncludedProps = Object.fromEntries(includedPropKeys.flatMap((key) => {
99
+ if (!(key in validatedIncludedProps)) return [];
100
+ return [[toLayoutRenderPropKey(key, mergedResolvedInProps[key]), validatedIncludedProps[key]]];
101
+ }));
102
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_jfdevelops_react_layout_composables.LayoutComposablePresetProvider, {
103
+ value: composablePresetProps,
104
+ children: render({
105
+ ...validatedProps,
106
+ ...layoutRenderIncludedProps
107
+ }, mergedRenderContext)
108
+ });
109
+ }
110
+ function createComposition(compositionOptions) {
111
+ if (!compositionOptions.components) return {};
112
+ return { makeComposable: createComposableLayout(compositionOptions) };
113
+ }
114
+ return Object.assign(Component, {
115
+ displayName: name,
116
+ props: void 0,
117
+ ...createComposition({
118
+ components: resolvedComposables,
119
+ name
120
+ })
121
+ });
122
+ };
123
+ function createLayoutForResource(defaultName, resource, defaults) {
124
+ return (({ name, ...rest }) => definedResourceLayout({
125
+ ...defaults,
126
+ name: name ?? defaultName,
127
+ resource,
128
+ ...resolveLayoutOptionDefaults(defaults, rest)
129
+ }));
130
+ }
131
+ function createLayoutForResourceBuilder(defaultName, resource) {
132
+ const createLayout = createLayoutForResource(defaultName, resource, {});
133
+ const setDefaults = ((defaults) => createLayoutForResource(defaultName, resource, defaults));
134
+ return Object.assign(createLayout, { setDefaults });
135
+ }
136
+ const forResource = (options) => {
137
+ const { name: defaultName, resource } = options;
138
+ if (!resource) throw new Error("\"resource\" is required when calling \"forResource\"");
139
+ return createLayoutForResourceBuilder(defaultName, resource);
140
+ };
141
+ return {
142
+ createResourceConfig: require_get_component.createResourceConfig,
143
+ createResourceLayout: Object.assign(definedResourceLayout, { forResource })
144
+ };
145
+ }
146
+
147
+ //#endregion
148
+ exports.defineResourceLayout = defineResourceLayout;
149
+ //# sourceMappingURL=define-layout.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-layout.cjs","names":["capitalize","functionalUpdate","normalizeResources","toResourceEnum","createProp","pick","LayoutComposablePresetProvider"],"sources":["../../src/create-config/define-layout.tsx"],"sourcesContent":["import type { JSX } from 'react';\nimport {\n type ComposableComponents,\n type ComposableNameContext,\n type CreateLayoutComposable,\n collectComposablePresetEntries,\n LayoutComposablePresetProvider,\n MakeComposable,\n makeComposable,\n MakeComposableOptions,\n RequiredPresetLayoutProps,\n resolveComposablePresetProps,\n resolveLayoutComposables,\n} from '@jfdevelops/react-layout-composables';\nimport {\n type AnyBuiltPropDefinition,\n createPrimitivePropBuilder,\n createProp,\n type ResolveLayoutProps,\n type ResolveProps,\n resolvePropDefinitionValues,\n validateProps,\n} from '@jfdevelops/react-layout-validator';\nimport {\n IncludedProps,\n InferredInProps,\n InPropsDefinition,\n InPropsObject,\n LayoutRenderProps,\n MergedLayoutInProps,\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 Show,\n Updater,\n} from '../utils';\nimport { capitalize } from '../utils/capitalize';\nimport {\n type CreateResourceConfigFn,\n createResourceConfig,\n} from './get-component';\n\ntype LayoutIncludeProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Options extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n> = IncludedProps<MergedLayoutInProps<Resources, Options, Composables>>;\n\ntype LayoutProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Options extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<\n Resources,\n Options,\n Composables\n > = {},\n CustomProps extends InPropsObject = {},\n> = {\n /**\n * Props to include in the layout.\n */\n include?: LayoutIncludeProps<Resources, Options, Composables> & 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 Composables extends ComposableComponents = {},\n IncludeProps extends LayoutIncludeProps<\n Resources,\n Options,\n Composables\n > = {},\n CustomProps extends InPropsObject = {},\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<\n Resources,\n Options,\n Composables,\n IncludeProps,\n CustomProps\n >;\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<\n Resources,\n Options,\n Composables,\n IncludeProps,\n CustomProps\n >,\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 Composables extends ComposableComponents = {},\n> = ResolveLayoutProps<InferredInProps<Resources, InProps>> &\n RequiredPresetLayoutProps<Composables>;\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 Composables extends ComposableComponents,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n> = LayoutPropsForResource<Resources, InProps, Composables> & {\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 Composables extends ComposableComponents,\n Props extends InPropsObject = {},\n Defaults extends LayoutPropDefaults = {},\n> = ResolveLayoutPropsWithDefaults<\n LayoutPropsForResource<Resources, InProps, Composables>,\n Defaults\n> & {\n props?: Props;\n};\ntype CreatedLayoutForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\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 options: CreatedLayoutForResourceOptions<\n Resources,\n InProps,\n Composables,\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 Composables extends ComposableComponents = {},\n> = Partial<LayoutPropsForResource<Resources, InProps, Composables>>;\n\ntype ResolvedSetDefaultProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Defaults extends SetDefaultPropsForResource<Resources, InProps, Composables>,\n> = {\n [K in keyof Defaults &\n keyof LayoutPropsForResource<\n Resources,\n InProps,\n Composables\n >]: LayoutPropsForResource<Resources, InProps, Composables>[K];\n};\n\ntype SetDefaultPropForResourceFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n CustomProps extends InPropsObject = {},\n> = <\n const Defaults extends SetDefaultPropsForResource<Resources, InProps, Composables>,\n>(\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 Composables,\n Name,\n Resource,\n CustomProps,\n ResolvedSetDefaultProps<Resources, InProps, Composables, Defaults>\n>;\n\ntype CreateLayoutForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents = {},\n IncludeProps extends LayoutIncludeProps<\n Resources,\n InProps,\n Composables\n > = {},\n CustomProps extends InPropsObject = {},\n> = <Name extends string, Resource extends LayoutResourceKey<Resources>>(\n options: CreateLayoutForResourceOptions<Resources, Name, Resource>,\n) => CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n> & {\n /**\n * Set default values for layout props in a single call.\n */\n setDefaults: SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n >;\n};\ntype CreateResourceLayoutFnImpl<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<\n Resources,\n InProps,\n Composables\n > = {},\n CustomProps extends InPropsObject = {},\n> = <\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n>(\n options: CreateResourceLayoutOptions<\n Resources,\n InProps,\n Composables,\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 Composables extends ComposableComponents = {},\n IncludeProps extends LayoutIncludeProps<\n Resources,\n InProps,\n Composables\n > = {},\n CustomProps extends InPropsObject = {},\n> extends CreateResourceLayoutFnImpl<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n> {\n /**\n * A function to create a resource layout for a specific resource.\n */\n forResource: CreateLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n >;\n}\n\ntype DefinedResourceLayout<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents = {},\n IncludeProps extends LayoutIncludeProps<\n Resources,\n InProps,\n Composables\n > = {},\n CustomProps extends InPropsObject = {},\n> = {\n createResourceConfig: CreateResourceConfigFn<Resources>;\n createResourceLayout: CreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n >;\n};\n\nexport function defineResourceLayout<\n const Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents = {},\n const IncludeProps extends LayoutIncludeProps<\n Resources,\n InProps,\n Composables\n > = {},\n CustomProps extends InPropsObject = {},\n>(\n options: CreateViewMapOptions<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\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 Composables,\n IncludeProps,\n CustomProps\n > = (layoutOptions) => {\n const {\n name,\n props: instancePropDefinitions,\n ...layoutOptionProps\n } = layoutOptions;\n const createComposableLayout =\n makeComposable<\n LayoutRenderProps<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n >\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 mergedResolvedInProps = { ...resolvedInProps };\n\n for (const { props: presetPropDefinitions } of collectComposablePresetEntries(\n resolvedComposables,\n )) {\n Object.assign(mergedResolvedInProps, presetPropDefinitions);\n }\n\n const composablePresetProps = resolveComposablePresetProps(\n resolvedComposables,\n layoutOptionProps as Record<string, unknown>,\n );\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 mergedResolvedInProps,\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 = mergedResolvedInProps[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, mergedResolvedInProps[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 Composables,\n IncludeProps,\n CustomProps\n >;\n\n return (\n <LayoutComposablePresetProvider value={composablePresetProps}>\n {render(layoutRenderProps, mergedRenderContext)}\n </LayoutComposablePresetProvider>\n );\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 Composables,\n Name,\n Resource,\n CustomProps,\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 Composables,\n Name,\n Resource,\n CustomProps\n > & {\n setDefaults: SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n >;\n } {\n const createLayout = createLayoutForResource(defaultName, resource, {});\n\n const setDefaults = ((defaults) =>\n createLayoutForResource(defaultName, resource, defaults)) as SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n >;\n\n return Object.assign(createLayout, { setDefaults });\n }\n const forResource: CreateLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\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 Composables,\n IncludeProps,\n CustomProps\n > = Object.assign(definedResourceLayout, {\n forResource,\n });\n\n return {\n createResourceConfig,\n createResourceLayout,\n } as DefinedResourceLayout<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n >;\n}\n"],"mappings":";;;;;;;;;AAoGA,SAAS,sBACP,OACiC;CACjC,OAAO,OAAO,UAAU,cAAc,UAAU,QAAQ,gBAAgB;AAC1E;AAEA,SAAS,8BACP,OACsC;CACtC,OACE,UAAU,QACV,OAAO,UAAU,YACjB,YAAY,SACX,MAA+B,WAAW;AAE/C;AAEA,SAAS,uBACP,YACgE;CAChE,OACE,sBAAsB,UAAU,KAChC,UAAU,cACV,WAAW,SAAS;AAExB;AAEA,SAAS,sBACP,YACA,YACA;CACA,OAAO,uBAAuB,UAAU,IACpCA,8BAAW,UAAU,IACrB;AACN;AAEA,SAAS,sBACP,YACA,YACA,SACA;CACA,MAAM,mBAAmB,uBAAuB,UAAU,IACtD,CAACA,8BAAW,UAAU,GAAG,UAAU,IACnC,CAAC,YAAYA,8BAAW,UAAU,CAAC;CAEvC,KAAK,MAAM,OAAO,kBAChB,IAAI,OAAO,SACT,OAAO,QAAQ;AAKrB;AAEA,SAAS,mBAAmB,SAAkC;CAC5D,MAAM,kBAA0D,CAAC;CACjE,MAAM,eAAwC,CAAC;CAE/C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,GAAG;EAClD,IAAI,sBAAsB,KAAK,GAAG;GAChC,gBAAgB,OAAO;GACvB;EACF;EAEA,IAAI,8BAA8B,KAAK,GAAG;GACxC,aAAa,OAAO,MAAM;GAE1B,IAAI,MAAM,SAAS,OAAO,MAAM,UAAU,UACxC,OAAO,OAAO,iBAAiB,MAAM,KAAK;EAE9C;CACF;CAEA,OAAO;EACL;EACA;CACF;AACF;AAEA,SAAS,4BACP,UACA,SACA;CACA,MAAM,WAAW,EAAE,GAAG,QAAQ;CAE9B,KAAK,MAAM,CAAC,KAAK,iBAAiB,OAAO,QAAQ,QAAQ,GACvD,IAAI,OAAO,SACT,IAAI,OAAO,iBAAiB,YAC1B,SAAS,OAAO,QAAQ;MAExB,SAAS,OAAOC,+BACd,cACA,QAAQ,IACV;CAKN,OAAO;AACT;AA6SA,SAAgB,qBAWd,SAOA;CACA,MAAM,EAAE,SAAS,SAAS,WAAW,WAAW;CAChD,MAAM,sBAAsBC,oCAAmB,SAAS;CACxD,MAAM,mFAA2C,QAAQ,EAAE,KACzDC,gCAAe,mBAAmB,CACpC;CACA,MAAM,yBAMD,kBAAkB;EACrB,MAAM,EACJ,MACA,OAAO,yBACP,GAAG,sBACD;EACJ,MAAM,kFASF;EACJ,MAAM,WAAWC,8CAAW,OAAO,EAAE,QAAQ,IAAI;EAQjD,MAAM,EAAE,iBAAiB,iBAAiB,mBAAmB;GAC3D,GAPA,OAAO,YAAY,aACf,QAAQ;IACN,UAAU;IACV,MAAM;GACR,CAAC,IACD;GAGJ,GAAI;GACJ,GAAG;EACL,CAAC;EACD,MAAM,EAAE,aAAa,QAAQ,OAAO,gBAAgB;EACpD,MAAM,oBAAoB,aAAa;EACvC,MAAM,qBAAqB,aAAa;EACxC,MAAM,sBAAsB,EAC1B,GAAG,kBACL;EACA,MAAM,gBAGF;GACF,UAAU,cAAc;GACxB;GACA;EACF;EACA,MAAM,sBAAsB,iFACC,aAAa,aAAa,IACnD;EACJ,MAAM,wBAAwB,EAAE,GAAG,gBAAgB;EAEnD,KAAK,MAAM,EAAE,OAAO,oGAClB,mBACF,GACE,OAAO,OAAO,uBAAuB,qBAAqB;EAG5D,MAAM,+FACJ,qBACA,iBACF;EACA,MAAM,sBAAsB;GAC1B,aAAa;GACb,UAAU,cAAc;GACxB,MAAM,cAAc;GACpB,SAAS;EACX;EAEA,SAAS,UAAU,OAAwC;GACzD,MAAM,uEAA+B,qBAAqB,KAAK;GAC/D,MAAM,mBAAmB,OAAO,KAAK,sBAAsB,CAAC,CAAC;GAC7D,MAAM,0BAA0BC,mBAC9B,uBACA,gBACF;GACA,MAAM,qBAAqB,EACzB,uEAA+B,uBAAuB,EACxD;GAEA,KAAK,MAAM,OAAO,kBAAkB;IAClC,MAAM,aAAa,sBAAsB;IACzC,MAAM,oBAAoB,sBACxB,KACA,YACA,iBACF;IACA,MAAM,aAAa,OAAO,eAAe,aAAa,OAAO;IAC7D,MAAM,QAAQ,qBAAqB;IAEnC,IAAI,UAAU,QACZ,mBAAmB,OAAO;GAE9B;GAEA,MAAM,+EACJ,yBACA,kBACF;GACA,MAAM,4BAA4B,OAAO,YACvC,iBAAiB,SAAS,QAAQ;IAChC,IAAI,EAAE,OAAO,yBACX,OAAO,CAAC;IAGV,OAAO,CACL,CACE,sBAAsB,KAAK,sBAAsB,IAAI,GACrD,uBAAuB,IACzB,CACF;GACF,CAAC,CACH;GAYA,OACE,2CAACC,qEAAD;IAAgC,OAAO;cACpC,OAAO;KAZV,GAAG;KACH,GAAG;IAWuB,GAAG,mBAAmB;GAChB;EAEpC;EAEA,SAAS,kBACP,oBACA;GACA,IAAI,CAAC,mBAAmB,YACtB,OAAO,CAAC;GAGV,OAAO,EACL,gBAAgB,uBAAuB,kBAAkB,EAC3D;EACF;EAEA,OAAO,OAAO,OAAO,WAAW;GAC9B,aAAa;GACb,OAAO;GACP,GAAG,kBAAkB;IACnB,YAAY;IACZ;GACF,CAAC;EACH,CAAC;CACH;CACA,SAAS,wBAKP,aACA,UACA,UACA;EACA,SAAS,EAAE,MAAM,GAAG,WAClB,sBAAsB;GACpB,GAAG;GACH,MAAM,QAAQ;GACd;GACA,GAAG,4BAA4B,UAAU,IAAI;EAC/C,CAAU;CASd;CAEA,SAAS,+BAIP,aACA,UAiBA;EACA,MAAM,eAAe,wBAAwB,aAAa,UAAU,CAAC,CAAC;EAEtE,MAAM,gBAAgB,aACpB,wBAAwB,aAAa,UAAU,QAAQ;EASzD,OAAO,OAAO,OAAO,cAAc,EAAE,YAAY,CAAC;CACpD;CACA,MAAM,eAMD,YAAY;EACf,MAAM,EAAE,MAAM,aAAa,aAAa;EAExC,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,uDAAmD;EAGrE,OAAO,+BAA+B,aAAa,QAAQ;CAC7D;CAWA,OAAO;EACL;EACA,sBANE,OAAO,OAAO,uBAAuB,EACvC,YACF,CAIqB;CACrB;AAOF"}
@@ -0,0 +1,107 @@
1
+ import { BaseComponent, Show, Updater } from "../utils.cjs";
2
+ import { LayoutResourceKey, ResourceDefinition } from "../resource.cjs";
3
+ import { InPropsDefinition, InPropsObject, IncludedProps, InferredInProps, LayoutRenderProps, MergedLayoutInProps } from "../props.cjs";
4
+ import { CreateResourceConfigFn } from "./get-component.cjs";
5
+ import { ComposableComponents, CreateLayoutComposable, MakeComposable, RequiredPresetLayoutProps } from "@jfdevelops/react-layout-composables";
6
+ import { JSX } from "react";
7
+ import { ResolveLayoutProps, ResolveProps } from "@jfdevelops/react-layout-validator";
8
+
9
+ //#region src/create-config/define-layout.d.ts
10
+ type LayoutIncludeProps<Resources extends ReadonlyArray<ResourceDefinition>, Options extends InPropsDefinition<Resources>, Composables extends ComposableComponents> = IncludedProps<MergedLayoutInProps<Resources, Options, Composables>>;
11
+ type LayoutProps<Resources extends ReadonlyArray<ResourceDefinition>, Options extends InPropsDefinition<Resources>, Composables extends ComposableComponents, IncludeProps extends LayoutIncludeProps<Resources, Options, Composables> = {}, CustomProps extends InPropsObject = {}> = {
12
+ /**
13
+ * Props to include in the layout.
14
+ */
15
+ include?: LayoutIncludeProps<Resources, Options, Composables> & IncludeProps;
16
+ /**
17
+ * Custom props that the layout will receive.
18
+ */
19
+ custom?: CustomProps;
20
+ };
21
+ type LayoutRenderContext<Resources extends ReadonlyArray<ResourceDefinition>, Composables extends ComposableComponents> = {
22
+ composables: LayoutRenderComposables<Composables>;
23
+ inProps: Record<string, unknown>;
24
+ resource: LayoutResourceKey<Resources>;
25
+ name: string;
26
+ };
27
+ type LayoutRenderComposables<Composables extends ComposableComponents> = [keyof Composables] extends [never] ? undefined : Composables;
28
+ type CreateViewMapOptions<Resources extends ReadonlyArray<ResourceDefinition>, Options extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}, IncludeProps extends LayoutIncludeProps<Resources, Options, Composables> = {}, CustomProps extends InPropsObject = {}> = {
29
+ /**
30
+ * An array of valid resource names to support.
31
+ */
32
+ resources: Resources;
33
+ /**
34
+ * The options that are passed into the created resource layout.
35
+ */
36
+ options: Options;
37
+ layout: {
38
+ /**
39
+ * The props to pass to the layout.
40
+ */
41
+ props?: LayoutProps<Resources, Options, Composables, IncludeProps, CustomProps>;
42
+ /**
43
+ * Components used to compose the layout. Invoked per layout instance with
44
+ * a scoped `create` that resolves composable `name` callbacks using the
45
+ * layout's `resource` and `name`.
46
+ */
47
+ composables?: (create: CreateLayoutComposable<LayoutResourceKey<Resources>>) => Composables;
48
+ /**
49
+ * The render function for the layout.
50
+ */
51
+ render: (props: LayoutRenderProps<Resources, Options, Composables, IncludeProps, CustomProps>, context: LayoutRenderContext<Resources, Composables>) => JSX.Element;
52
+ };
53
+ };
54
+ type ResourceLayoutComposition<Name extends string, Composables extends ComposableComponents> = [keyof Composables] extends [never] ? {} : {
55
+ makeComposable: MakeComposable<Composables, Name>;
56
+ };
57
+ type ResourceLayoutComponent<Name extends string, Props extends InPropsObject = {}, Composables extends ComposableComponents = {}> = ResourceLayoutComposition<Name, Composables> & BaseComponent<Name, ResolveProps<Props>> & {
58
+ (props: Show<ResolveProps<Props>>): JSX.Element;
59
+ };
60
+ type LayoutPropDefaults = Record<string, unknown>;
61
+ type LayoutPropsForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}> = ResolveLayoutProps<InferredInProps<Resources, InProps>> & RequiredPresetLayoutProps<Composables>;
62
+ type CreateTimeLayoutPropWithDefault<LayoutProps extends LayoutPropDefaults, K extends keyof LayoutProps> = LayoutProps[K] extends ((...args: unknown[]) => unknown) ? LayoutProps[K] : Updater<LayoutProps[K]>;
63
+ type ResolveLayoutPropsWithDefaults<LayoutProps extends LayoutPropDefaults, Defaults extends LayoutPropDefaults> = Omit<LayoutProps, keyof Defaults> & { [K in keyof Defaults & keyof LayoutProps]?: CreateTimeLayoutPropWithDefault<LayoutProps, K> };
64
+ type CreateResourceLayoutOptions<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Name extends string, Resource extends LayoutResourceKey<Resources>, Props extends InPropsObject = {}> = LayoutPropsForResource<Resources, InProps, Composables> & {
65
+ name: Name;
66
+ resource: Resource;
67
+ props?: Props;
68
+ };
69
+ type CreateLayoutForResourceOptions<Resources extends ReadonlyArray<ResourceDefinition>, Name extends string, Resource extends LayoutResourceKey<Resources>> = {
70
+ name?: Name;
71
+ resource: Resource;
72
+ };
73
+ type CreatedLayoutForResourceOptions<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Props extends InPropsObject = {}, Defaults extends LayoutPropDefaults = {}> = ResolveLayoutPropsWithDefaults<LayoutPropsForResource<Resources, InProps, Composables>, Defaults> & {
74
+ props?: Props;
75
+ };
76
+ type CreatedLayoutForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Name extends string, Resource extends LayoutResourceKey<Resources>, CustomProps extends InPropsObject = {}, Defaults extends LayoutPropDefaults = {}> = <OverrideName extends string = Name, Props extends InPropsObject = {}>(options: CreatedLayoutForResourceOptions<Resources, InProps, Composables, Props, Defaults> & {
77
+ name?: OverrideName;
78
+ }) => ResourceLayoutComponent<OverrideName, CustomProps, Composables>;
79
+ type SetDefaultPropsForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}> = Partial<LayoutPropsForResource<Resources, InProps, Composables>>;
80
+ type ResolvedSetDefaultProps<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Defaults extends SetDefaultPropsForResource<Resources, InProps, Composables>> = { [K in keyof Defaults & keyof LayoutPropsForResource<Resources, InProps, Composables>]: LayoutPropsForResource<Resources, InProps, Composables>[K] };
81
+ type SetDefaultPropForResourceFn<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Name extends string, Resource extends LayoutResourceKey<Resources>, CustomProps extends InPropsObject = {}> = <const Defaults extends SetDefaultPropsForResource<Resources, InProps, Composables>>(
82
+ /**
83
+ * Default values for layout props. Each prop can only be set once.
84
+ */
85
+
86
+ defaults: Defaults) => CreatedLayoutForResource<Resources, InProps, Composables, Name, Resource, CustomProps, ResolvedSetDefaultProps<Resources, InProps, Composables, Defaults>>;
87
+ type CreateLayoutForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}, IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {}, CustomProps extends InPropsObject = {}> = <Name extends string, Resource extends LayoutResourceKey<Resources>>(options: CreateLayoutForResourceOptions<Resources, Name, Resource>) => CreatedLayoutForResource<Resources, InProps, Composables, Name, Resource, CustomProps> & {
88
+ /**
89
+ * Set default values for layout props in a single call.
90
+ */
91
+ setDefaults: SetDefaultPropForResourceFn<Resources, InProps, Composables, Name, Resource, CustomProps>;
92
+ };
93
+ type CreateResourceLayoutFnImpl<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {}, CustomProps extends InPropsObject = {}> = <Name extends string, Resource extends LayoutResourceKey<Resources>, Props extends InPropsObject = {}>(options: CreateResourceLayoutOptions<Resources, InProps, Composables, Name, Resource, Props>) => ResourceLayoutComponent<Name, CustomProps, Composables>;
94
+ interface CreateResourceLayoutFn<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}, IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {}, CustomProps extends InPropsObject = {}> extends CreateResourceLayoutFnImpl<Resources, InProps, Composables, IncludeProps, CustomProps> {
95
+ /**
96
+ * A function to create a resource layout for a specific resource.
97
+ */
98
+ forResource: CreateLayoutForResource<Resources, InProps, Composables, IncludeProps, CustomProps>;
99
+ }
100
+ type DefinedResourceLayout<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}, IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {}, CustomProps extends InPropsObject = {}> = {
101
+ createResourceConfig: CreateResourceConfigFn<Resources>;
102
+ createResourceLayout: CreateResourceLayoutFn<Resources, InProps, Composables, IncludeProps, CustomProps>;
103
+ };
104
+ declare function defineResourceLayout<const Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}, const IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {}, CustomProps extends InPropsObject = {}>(options: CreateViewMapOptions<Resources, InProps, Composables, IncludeProps, CustomProps>): DefinedResourceLayout<Resources, InProps, Composables, IncludeProps, CustomProps>;
105
+ //#endregion
106
+ export { CreateResourceLayoutFn, defineResourceLayout };
107
+ //# 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,107 @@
1
+ import { BaseComponent, Show, Updater } from "../utils.mjs";
2
+ import { LayoutResourceKey, ResourceDefinition } from "../resource.mjs";
3
+ import { InPropsDefinition, InPropsObject, IncludedProps, InferredInProps, LayoutRenderProps, MergedLayoutInProps } from "../props.mjs";
4
+ import { CreateResourceConfigFn } from "./get-component.mjs";
5
+ import { ComposableComponents, CreateLayoutComposable, MakeComposable, RequiredPresetLayoutProps } from "@jfdevelops/react-layout-composables";
6
+ import { ResolveLayoutProps, ResolveProps } from "@jfdevelops/react-layout-validator";
7
+ import { JSX } from "react";
8
+
9
+ //#region src/create-config/define-layout.d.ts
10
+ type LayoutIncludeProps<Resources extends ReadonlyArray<ResourceDefinition>, Options extends InPropsDefinition<Resources>, Composables extends ComposableComponents> = IncludedProps<MergedLayoutInProps<Resources, Options, Composables>>;
11
+ type LayoutProps<Resources extends ReadonlyArray<ResourceDefinition>, Options extends InPropsDefinition<Resources>, Composables extends ComposableComponents, IncludeProps extends LayoutIncludeProps<Resources, Options, Composables> = {}, CustomProps extends InPropsObject = {}> = {
12
+ /**
13
+ * Props to include in the layout.
14
+ */
15
+ include?: LayoutIncludeProps<Resources, Options, Composables> & IncludeProps;
16
+ /**
17
+ * Custom props that the layout will receive.
18
+ */
19
+ custom?: CustomProps;
20
+ };
21
+ type LayoutRenderContext<Resources extends ReadonlyArray<ResourceDefinition>, Composables extends ComposableComponents> = {
22
+ composables: LayoutRenderComposables<Composables>;
23
+ inProps: Record<string, unknown>;
24
+ resource: LayoutResourceKey<Resources>;
25
+ name: string;
26
+ };
27
+ type LayoutRenderComposables<Composables extends ComposableComponents> = [keyof Composables] extends [never] ? undefined : Composables;
28
+ type CreateViewMapOptions<Resources extends ReadonlyArray<ResourceDefinition>, Options extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}, IncludeProps extends LayoutIncludeProps<Resources, Options, Composables> = {}, CustomProps extends InPropsObject = {}> = {
29
+ /**
30
+ * An array of valid resource names to support.
31
+ */
32
+ resources: Resources;
33
+ /**
34
+ * The options that are passed into the created resource layout.
35
+ */
36
+ options: Options;
37
+ layout: {
38
+ /**
39
+ * The props to pass to the layout.
40
+ */
41
+ props?: LayoutProps<Resources, Options, Composables, IncludeProps, CustomProps>;
42
+ /**
43
+ * Components used to compose the layout. Invoked per layout instance with
44
+ * a scoped `create` that resolves composable `name` callbacks using the
45
+ * layout's `resource` and `name`.
46
+ */
47
+ composables?: (create: CreateLayoutComposable<LayoutResourceKey<Resources>>) => Composables;
48
+ /**
49
+ * The render function for the layout.
50
+ */
51
+ render: (props: LayoutRenderProps<Resources, Options, Composables, IncludeProps, CustomProps>, context: LayoutRenderContext<Resources, Composables>) => JSX.Element;
52
+ };
53
+ };
54
+ type ResourceLayoutComposition<Name extends string, Composables extends ComposableComponents> = [keyof Composables] extends [never] ? {} : {
55
+ makeComposable: MakeComposable<Composables, Name>;
56
+ };
57
+ type ResourceLayoutComponent<Name extends string, Props extends InPropsObject = {}, Composables extends ComposableComponents = {}> = ResourceLayoutComposition<Name, Composables> & BaseComponent<Name, ResolveProps<Props>> & {
58
+ (props: Show<ResolveProps<Props>>): JSX.Element;
59
+ };
60
+ type LayoutPropDefaults = Record<string, unknown>;
61
+ type LayoutPropsForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}> = ResolveLayoutProps<InferredInProps<Resources, InProps>> & RequiredPresetLayoutProps<Composables>;
62
+ type CreateTimeLayoutPropWithDefault<LayoutProps extends LayoutPropDefaults, K extends keyof LayoutProps> = LayoutProps[K] extends ((...args: unknown[]) => unknown) ? LayoutProps[K] : Updater<LayoutProps[K]>;
63
+ type ResolveLayoutPropsWithDefaults<LayoutProps extends LayoutPropDefaults, Defaults extends LayoutPropDefaults> = Omit<LayoutProps, keyof Defaults> & { [K in keyof Defaults & keyof LayoutProps]?: CreateTimeLayoutPropWithDefault<LayoutProps, K> };
64
+ type CreateResourceLayoutOptions<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Name extends string, Resource extends LayoutResourceKey<Resources>, Props extends InPropsObject = {}> = LayoutPropsForResource<Resources, InProps, Composables> & {
65
+ name: Name;
66
+ resource: Resource;
67
+ props?: Props;
68
+ };
69
+ type CreateLayoutForResourceOptions<Resources extends ReadonlyArray<ResourceDefinition>, Name extends string, Resource extends LayoutResourceKey<Resources>> = {
70
+ name?: Name;
71
+ resource: Resource;
72
+ };
73
+ type CreatedLayoutForResourceOptions<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Props extends InPropsObject = {}, Defaults extends LayoutPropDefaults = {}> = ResolveLayoutPropsWithDefaults<LayoutPropsForResource<Resources, InProps, Composables>, Defaults> & {
74
+ props?: Props;
75
+ };
76
+ type CreatedLayoutForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Name extends string, Resource extends LayoutResourceKey<Resources>, CustomProps extends InPropsObject = {}, Defaults extends LayoutPropDefaults = {}> = <OverrideName extends string = Name, Props extends InPropsObject = {}>(options: CreatedLayoutForResourceOptions<Resources, InProps, Composables, Props, Defaults> & {
77
+ name?: OverrideName;
78
+ }) => ResourceLayoutComponent<OverrideName, CustomProps, Composables>;
79
+ type SetDefaultPropsForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}> = Partial<LayoutPropsForResource<Resources, InProps, Composables>>;
80
+ type ResolvedSetDefaultProps<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Defaults extends SetDefaultPropsForResource<Resources, InProps, Composables>> = { [K in keyof Defaults & keyof LayoutPropsForResource<Resources, InProps, Composables>]: LayoutPropsForResource<Resources, InProps, Composables>[K] };
81
+ type SetDefaultPropForResourceFn<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Name extends string, Resource extends LayoutResourceKey<Resources>, CustomProps extends InPropsObject = {}> = <const Defaults extends SetDefaultPropsForResource<Resources, InProps, Composables>>(
82
+ /**
83
+ * Default values for layout props. Each prop can only be set once.
84
+ */
85
+
86
+ defaults: Defaults) => CreatedLayoutForResource<Resources, InProps, Composables, Name, Resource, CustomProps, ResolvedSetDefaultProps<Resources, InProps, Composables, Defaults>>;
87
+ type CreateLayoutForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}, IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {}, CustomProps extends InPropsObject = {}> = <Name extends string, Resource extends LayoutResourceKey<Resources>>(options: CreateLayoutForResourceOptions<Resources, Name, Resource>) => CreatedLayoutForResource<Resources, InProps, Composables, Name, Resource, CustomProps> & {
88
+ /**
89
+ * Set default values for layout props in a single call.
90
+ */
91
+ setDefaults: SetDefaultPropForResourceFn<Resources, InProps, Composables, Name, Resource, CustomProps>;
92
+ };
93
+ type CreateResourceLayoutFnImpl<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {}, CustomProps extends InPropsObject = {}> = <Name extends string, Resource extends LayoutResourceKey<Resources>, Props extends InPropsObject = {}>(options: CreateResourceLayoutOptions<Resources, InProps, Composables, Name, Resource, Props>) => ResourceLayoutComponent<Name, CustomProps, Composables>;
94
+ interface CreateResourceLayoutFn<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}, IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {}, CustomProps extends InPropsObject = {}> extends CreateResourceLayoutFnImpl<Resources, InProps, Composables, IncludeProps, CustomProps> {
95
+ /**
96
+ * A function to create a resource layout for a specific resource.
97
+ */
98
+ forResource: CreateLayoutForResource<Resources, InProps, Composables, IncludeProps, CustomProps>;
99
+ }
100
+ type DefinedResourceLayout<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}, IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {}, CustomProps extends InPropsObject = {}> = {
101
+ createResourceConfig: CreateResourceConfigFn<Resources>;
102
+ createResourceLayout: CreateResourceLayoutFn<Resources, InProps, Composables, IncludeProps, CustomProps>;
103
+ };
104
+ declare function defineResourceLayout<const Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}, const IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {}, CustomProps extends InPropsObject = {}>(options: CreateViewMapOptions<Resources, InProps, Composables, IncludeProps, CustomProps>): DefinedResourceLayout<Resources, InProps, Composables, IncludeProps, CustomProps>;
105
+ //#endregion
106
+ export { CreateResourceLayoutFn, defineResourceLayout };
107
+ //# 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,149 @@
1
+ import { normalizeResources, toResourceEnum } from "../resource.mjs";
2
+ import { functionalUpdate, pick } from "../utils.mjs";
3
+ import { capitalize } from "../utils/capitalize.mjs";
4
+ import { createResourceConfig } from "./get-component.mjs";
5
+ import { LayoutComposablePresetProvider, collectComposablePresetEntries, makeComposable, resolveComposablePresetProps, resolveLayoutComposables } from "@jfdevelops/react-layout-composables";
6
+ import { createPrimitivePropBuilder, createProp, resolvePropDefinitionValues, validateProps } from "@jfdevelops/react-layout-validator";
7
+ import { jsx } from "react/jsx-runtime";
8
+
9
+ //#region src/create-config/define-layout.tsx
10
+ function isBuiltPropDefinition(value) {
11
+ return typeof value === "function" && value !== null && "visibility" in value;
12
+ }
13
+ function isSplitLayoutInPropDefinition(value) {
14
+ return value !== null && typeof value === "object" && "render" in value && value.render !== void 0;
15
+ }
16
+ function isJSXElementDefinition(definition) {
17
+ return isBuiltPropDefinition(definition) && "type" in definition && definition.type === "JSX.Element";
18
+ }
19
+ function toLayoutRenderPropKey(includeKey, definition) {
20
+ return isJSXElementDefinition(definition) ? capitalize(includeKey) : includeKey;
21
+ }
22
+ function readLayoutOptionValue(includeKey, definition, sources) {
23
+ const layoutOptionKeys = isJSXElementDefinition(definition) ? [capitalize(includeKey), includeKey] : [includeKey, capitalize(includeKey)];
24
+ for (const key of layoutOptionKeys) if (key in sources) return sources[key];
25
+ }
26
+ function splitLayoutInProps(inProps) {
27
+ const resolvedInProps = {};
28
+ const splitInProps = {};
29
+ for (const [key, value] of Object.entries(inProps)) {
30
+ if (isBuiltPropDefinition(value)) {
31
+ resolvedInProps[key] = value;
32
+ continue;
33
+ }
34
+ if (isSplitLayoutInPropDefinition(value)) {
35
+ splitInProps[key] = value.render;
36
+ if (value.props && typeof value.props === "object") Object.assign(resolvedInProps, value.props);
37
+ }
38
+ }
39
+ return {
40
+ resolvedInProps,
41
+ splitInProps
42
+ };
43
+ }
44
+ function resolveLayoutOptionDefaults(defaults, options) {
45
+ const resolved = { ...options };
46
+ for (const [key, defaultValue] of Object.entries(defaults)) if (key in options) if (typeof defaultValue === "function") resolved[key] = options[key];
47
+ else resolved[key] = functionalUpdate(defaultValue, options[key]);
48
+ return resolved;
49
+ }
50
+ function defineResourceLayout(options) {
51
+ const { options: inProps, resources, layout } = options;
52
+ const normalizedResources = normalizeResources(resources);
53
+ const resourcesEnum = createPrimitivePropBuilder("string").enum(toResourceEnum(normalizedResources));
54
+ const definedResourceLayout = (layoutOptions) => {
55
+ const { name, props: instancePropDefinitions, ...layoutOptionProps } = layoutOptions;
56
+ const createComposableLayout = makeComposable();
57
+ const nameProp = createProp.string().literal(name);
58
+ const { resolvedInProps, splitInProps } = splitLayoutInProps({
59
+ ...typeof inProps === "function" ? inProps({
60
+ resource: resourcesEnum,
61
+ name: nameProp
62
+ }) : inProps,
63
+ ...instancePropDefinitions,
64
+ ...layoutOptionProps
65
+ });
66
+ const { composables, render, props: layoutProps } = layout;
67
+ const customLayoutProps = layoutProps?.custom;
68
+ const includeLayoutProps = layoutProps?.include;
69
+ const resolvedLayoutProps = { ...customLayoutProps };
70
+ const layoutContext = {
71
+ resource: layoutOptions.resource,
72
+ name,
73
+ capitalize
74
+ };
75
+ const resolvedComposables = composables ? resolveLayoutComposables(composables, layoutContext) : void 0;
76
+ const mergedResolvedInProps = { ...resolvedInProps };
77
+ for (const { props: presetPropDefinitions } of collectComposablePresetEntries(resolvedComposables)) Object.assign(mergedResolvedInProps, presetPropDefinitions);
78
+ const composablePresetProps = resolveComposablePresetProps(resolvedComposables, layoutOptionProps);
79
+ const mergedRenderContext = {
80
+ composables: resolvedComposables,
81
+ resource: layoutContext.resource,
82
+ name: layoutContext.name,
83
+ inProps: splitInProps
84
+ };
85
+ function Component(props) {
86
+ const validatedProps = validateProps(resolvedLayoutProps, props);
87
+ const includedPropKeys = Object.keys(includeLayoutProps ?? {});
88
+ const includedPropDefinitions = pick(mergedResolvedInProps, includedPropKeys);
89
+ const includedPropValues = { ...resolvePropDefinitionValues(includedPropDefinitions) };
90
+ for (const key of includedPropKeys) {
91
+ const definition = mergedResolvedInProps[key];
92
+ const layoutOptionValue = readLayoutOptionValue(key, definition, layoutOptionProps);
93
+ const splitValue = key in splitInProps ? splitInProps[key] : void 0;
94
+ const value = layoutOptionValue ?? splitValue;
95
+ if (value !== void 0) includedPropValues[key] = value;
96
+ }
97
+ const validatedIncludedProps = validateProps(includedPropDefinitions, includedPropValues);
98
+ const layoutRenderIncludedProps = Object.fromEntries(includedPropKeys.flatMap((key) => {
99
+ if (!(key in validatedIncludedProps)) return [];
100
+ return [[toLayoutRenderPropKey(key, mergedResolvedInProps[key]), validatedIncludedProps[key]]];
101
+ }));
102
+ return /* @__PURE__ */ jsx(LayoutComposablePresetProvider, {
103
+ value: composablePresetProps,
104
+ children: render({
105
+ ...validatedProps,
106
+ ...layoutRenderIncludedProps
107
+ }, mergedRenderContext)
108
+ });
109
+ }
110
+ function createComposition(compositionOptions) {
111
+ if (!compositionOptions.components) return {};
112
+ return { makeComposable: createComposableLayout(compositionOptions) };
113
+ }
114
+ return Object.assign(Component, {
115
+ displayName: name,
116
+ props: void 0,
117
+ ...createComposition({
118
+ components: resolvedComposables,
119
+ name
120
+ })
121
+ });
122
+ };
123
+ function createLayoutForResource(defaultName, resource, defaults) {
124
+ return (({ name, ...rest }) => definedResourceLayout({
125
+ ...defaults,
126
+ name: name ?? defaultName,
127
+ resource,
128
+ ...resolveLayoutOptionDefaults(defaults, rest)
129
+ }));
130
+ }
131
+ function createLayoutForResourceBuilder(defaultName, resource) {
132
+ const createLayout = createLayoutForResource(defaultName, resource, {});
133
+ const setDefaults = ((defaults) => createLayoutForResource(defaultName, resource, defaults));
134
+ return Object.assign(createLayout, { setDefaults });
135
+ }
136
+ const forResource = (options) => {
137
+ const { name: defaultName, resource } = options;
138
+ if (!resource) throw new Error("\"resource\" is required when calling \"forResource\"");
139
+ return createLayoutForResourceBuilder(defaultName, resource);
140
+ };
141
+ return {
142
+ createResourceConfig,
143
+ createResourceLayout: Object.assign(definedResourceLayout, { forResource })
144
+ };
145
+ }
146
+
147
+ //#endregion
148
+ export { defineResourceLayout };
149
+ //# sourceMappingURL=define-layout.mjs.map