@jfdevelops/react-layout 0.15.0 → 0.16.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.
- package/dist/create-config/define-layout.cjs +15 -4
- package/dist/create-config/define-layout.cjs.map +1 -1
- package/dist/create-config/define-layout.d.cts +31 -5
- package/dist/create-config/define-layout.d.cts.map +1 -1
- package/dist/create-config/define-layout.d.mts +31 -5
- package/dist/create-config/define-layout.d.mts.map +1 -1
- package/dist/create-config/define-layout.mjs +14 -3
- package/dist/create-config/define-layout.mjs.map +1 -1
- package/dist/create-config/for-resources/create-component.d.cts +284 -0
- package/dist/create-config/for-resources/create-component.d.cts.map +1 -0
- package/dist/create-config/for-resources/create-component.d.mts +284 -0
- package/dist/create-config/for-resources/create-component.d.mts.map +1 -0
- package/dist/create-config/{for-resources.cjs → for-resources/create-for-resources.cjs} +82 -42
- package/dist/create-config/for-resources/create-for-resources.cjs.map +1 -0
- package/dist/create-config/for-resources/create-for-resources.d.cts +1 -0
- package/dist/create-config/for-resources/create-for-resources.d.mts +1 -0
- package/dist/create-config/{for-resources.mjs → for-resources/create-for-resources.mjs} +81 -41
- package/dist/create-config/for-resources/create-for-resources.mjs.map +1 -0
- package/dist/create-config/for-resources/index.d.cts +1 -0
- package/dist/create-config/for-resources/index.d.mts +1 -0
- package/dist/create-config/for-resources/resource-selection.d.cts +47 -0
- package/dist/create-config/for-resources/resource-selection.d.cts.map +1 -0
- package/dist/create-config/for-resources/resource-selection.d.mts +47 -0
- package/dist/create-config/for-resources/resource-selection.d.mts.map +1 -0
- package/dist/create-config/for-resources/scoped-layout.d.cts +185 -0
- package/dist/create-config/for-resources/scoped-layout.d.cts.map +1 -0
- package/dist/create-config/for-resources/scoped-layout.d.mts +185 -0
- package/dist/create-config/for-resources/scoped-layout.d.mts.map +1 -0
- package/dist/create-config/for-resources/scoped-render.cjs +103 -0
- package/dist/create-config/for-resources/scoped-render.cjs.map +1 -0
- package/dist/create-config/for-resources/scoped-render.d.cts +18 -0
- package/dist/create-config/for-resources/scoped-render.d.cts.map +1 -0
- package/dist/create-config/for-resources/scoped-render.d.mts +18 -0
- package/dist/create-config/for-resources/scoped-render.d.mts.map +1 -0
- package/dist/create-config/for-resources/scoped-render.mjs +100 -0
- package/dist/create-config/for-resources/scoped-render.mjs.map +1 -0
- package/dist/create-config/index.d.cts +1 -1
- package/dist/create-config/index.d.mts +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.mts +3 -3
- package/dist/props.d.cts +28 -2
- package/dist/props.d.cts.map +1 -1
- package/dist/props.d.mts +28 -2
- package/dist/props.d.mts.map +1 -1
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts.map +1 -1
- package/dist/utils.d.mts.map +1 -1
- package/dist/utils.mjs.map +1 -1
- package/package.json +3 -3
- package/dist/create-config/for-resources.cjs.map +0 -1
- package/dist/create-config/for-resources.d.cts +0 -358
- package/dist/create-config/for-resources.d.cts.map +0 -1
- package/dist/create-config/for-resources.d.mts +0 -358
- package/dist/create-config/for-resources.d.mts.map +0 -1
- package/dist/create-config/for-resources.mjs.map +0 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { LayoutResourceKey, ResourceDefinition } from "../../resource.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/create-config/for-resources/resource-selection.d.ts
|
|
4
|
+
type CapitalizedResource<Resource extends string> = Resource extends Resource ? {
|
|
5
|
+
toLowerCase: () => Lowercase<Capitalize<Resource>>;
|
|
6
|
+
} & Capitalize<Resource> : never;
|
|
7
|
+
type ResourceLayoutNames<Resource extends string, CallbackName extends string = string> = { [TargetResource in Resource]?: string | ((resource: CapitalizedResource<TargetResource>) => CallbackName) };
|
|
8
|
+
type AtLeastOneResourceLayoutNameKey<Resource extends string> = { [TargetResource in Resource]: Record<TargetResource, unknown> & Partial<Record<Exclude<Resource, TargetResource>, unknown>> }[Resource];
|
|
9
|
+
type SelectedResourceLayoutNames<Resource extends string, SelectedResource extends Resource, CallbackName extends string> = { [TargetResource in Resource as TargetResource extends SelectedResource ? TargetResource : never]?: string | ((resource: CapitalizedResource<TargetResource>) => CallbackName) };
|
|
10
|
+
type ResourceLayoutSelection<Resources extends ReadonlyArray<ResourceDefinition>, CallbackName extends string = string> = { [Resource in LayoutResourceKey<Resources>]?: {
|
|
11
|
+
name?: string | ((resource: CapitalizedResource<Resource>) => CallbackName);
|
|
12
|
+
} };
|
|
13
|
+
type AtLeastOneResourceLayoutSelection<Resources extends ReadonlyArray<ResourceDefinition>, CallbackName extends string> = { [Resource in LayoutResourceKey<Resources>]: Required<Pick<ResourceLayoutSelection<Resources, CallbackName>, Resource>> & Omit<ResourceLayoutSelection<Resources, CallbackName>, Resource> }[LayoutResourceKey<Resources>];
|
|
14
|
+
type SelectedLayoutResources<Resources extends ReadonlyArray<ResourceDefinition>, Arguments extends ReadonlyArray<unknown>> = Arguments extends ReadonlyArray<LayoutResourceKey<Resources>> ? Arguments[number] : Arguments[0] extends {
|
|
15
|
+
resources: ReadonlyArray<infer Resource>;
|
|
16
|
+
} ? Resource & LayoutResourceKey<Resources> : keyof Arguments[0] & LayoutResourceKey<Resources>;
|
|
17
|
+
type ResolveResourceLayoutName<Name> = Name extends ((...args: never[]) => infer Result) ? Result & string : Name extends string ? Name : string;
|
|
18
|
+
type NormalizeCapitalizedResourceName<Name extends string, Resource extends string> = Name extends Name ? NormalizeCapitalizedResourceNameMatch<Name, Resource> extends infer Match ? [Match] extends [never] ? Name : Match : never : never;
|
|
19
|
+
type NormalizeCapitalizedResourceNameMatch<Name extends string, Resource extends string> = Resource extends Resource ? Name extends `${CapitalizedResource<Resource>}${infer Suffix}` ? `${Capitalize<Resource>}${Suffix}` : never : never;
|
|
20
|
+
type SelectedResourceLayoutName<Arguments, Resource extends string> = Arguments extends ReadonlyArray<string> ? string : Arguments extends readonly [infer Options] ? Options extends {
|
|
21
|
+
resources: ReadonlyArray<string>;
|
|
22
|
+
name?: infer Name;
|
|
23
|
+
} ? Name extends ((...args: never[]) => unknown) ? ResolveResourceLayoutName<Name> : Name extends Record<Resource, infer ResourceName> ? ResolveResourceLayoutName<ResourceName> : string : Options extends Record<Resource, infer ResourceOptions> ? ResourceOptions extends {
|
|
24
|
+
name?: infer Name;
|
|
25
|
+
} ? ResolveResourceLayoutName<Name> : string : string : string;
|
|
26
|
+
type NormalizeResourceLayoutNames<Names, CallbackName extends string> = { [Resource in keyof Names]: Names[Resource] extends ((...args: never[]) => unknown) ? (resource: CapitalizedResource<Resource & string>) => NormalizeCapitalizedResourceName<CallbackName, Resource & string> : Names[Resource] };
|
|
27
|
+
type NormalizeResourceLayoutSelection<Selection> = { [Resource in keyof Selection]: Selection[Resource] extends {
|
|
28
|
+
name: infer Name;
|
|
29
|
+
} ? {
|
|
30
|
+
name: Name extends ((...args: never[]) => unknown) ? (resource: CapitalizedResource<Resource & string>) => NormalizeCapitalizedResourceName<ResolveResourceLayoutName<Name>, Resource & string> : Name;
|
|
31
|
+
} : Selection[Resource] };
|
|
32
|
+
type SharedResourceLayoutArguments<Resources extends ReadonlyArray<ResourceDefinition>, ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>, Name extends string> = readonly [{
|
|
33
|
+
resources: ResourceKeys;
|
|
34
|
+
name: (resource: CapitalizedResource<ResourceKeys[number]>) => NormalizeCapitalizedResourceName<Name, ResourceKeys[number]>;
|
|
35
|
+
}];
|
|
36
|
+
type MappedResourceLayoutArguments<Resources extends ReadonlyArray<ResourceDefinition>, ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>, Names, CallbackName extends string> = readonly [{
|
|
37
|
+
resources: ResourceKeys;
|
|
38
|
+
name: NormalizeResourceLayoutNames<Names, CallbackName>;
|
|
39
|
+
}];
|
|
40
|
+
type SelectedResourceLayoutArguments<Selection> = readonly [NormalizeResourceLayoutSelection<Selection>];
|
|
41
|
+
type HasResourceLayoutName<Arguments, Resource extends string> = Arguments extends ReadonlyArray<string> ? false : Arguments extends readonly [infer Options] ? Options extends {
|
|
42
|
+
resources: ReadonlyArray<string>;
|
|
43
|
+
name: infer Name;
|
|
44
|
+
} ? Name extends ((...args: never[]) => unknown) ? true : Name extends Record<Resource, unknown> ? true : false : Options extends Record<Resource, infer ResourceOptions> ? 'name' extends keyof ResourceOptions ? true : false : false : false;
|
|
45
|
+
//#endregion
|
|
46
|
+
export { AtLeastOneResourceLayoutNameKey, AtLeastOneResourceLayoutSelection, CapitalizedResource, HasResourceLayoutName, MappedResourceLayoutArguments, ResourceLayoutNames, ResourceLayoutSelection, SelectedLayoutResources, SelectedResourceLayoutArguments, SelectedResourceLayoutName, SelectedResourceLayoutNames, SharedResourceLayoutArguments };
|
|
47
|
+
//# sourceMappingURL=resource-selection.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-selection.d.mts","names":[],"sources":["../../../src/create-config/for-resources/resource-selection.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { LayoutResourceKey, ResourceDefinition } from "../../resource.cjs";
|
|
2
|
+
import { InPropsDefinition, InPropsObject } from "../../props.cjs";
|
|
3
|
+
import { CreateLayoutForResourceOptions, CreateResourceLayoutOptionsBase, CreatedLayoutForResource, SetDefaultPropForResourceFn } from "../for-resource.cjs";
|
|
4
|
+
import { AtLeastOneResourceLayoutNameKey, AtLeastOneResourceLayoutSelection, CapitalizedResource, HasResourceLayoutName, MappedResourceLayoutArguments, ResourceLayoutNames, ResourceLayoutSelection, SelectedLayoutResources, SelectedResourceLayoutArguments, SelectedResourceLayoutName, SelectedResourceLayoutNames, SharedResourceLayoutArguments } from "./resource-selection.cjs";
|
|
5
|
+
import { ScopedCreateComponent } from "./create-component.cjs";
|
|
6
|
+
import { LayoutIncludeProps, LayoutPropsForResource, ResourceLayoutComponent } from "../define-layout.cjs";
|
|
7
|
+
import { ComposableComponents, ComposableResourceLayout } from "@jfdevelops/react-layout-composables";
|
|
8
|
+
|
|
9
|
+
//#region src/create-config/for-resources/scoped-layout.d.ts
|
|
10
|
+
type ScopedCreateResourceLayoutOptions<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Arguments extends ReadonlyArray<unknown>, Name extends string, Resource extends SelectedLayoutResources<Resources, Arguments>, Props extends InPropsObject> = LayoutPropsForResource<Resources, InProps, Composables> & {
|
|
11
|
+
resource: Resource;
|
|
12
|
+
props?: Props;
|
|
13
|
+
} & (HasResourceLayoutName<Arguments, Resource> extends true ? {
|
|
14
|
+
name?: Name;
|
|
15
|
+
} : {
|
|
16
|
+
name: Name;
|
|
17
|
+
});
|
|
18
|
+
type ScopedCreateResourceLayoutFnImpl<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Arguments extends ReadonlyArray<unknown>, CustomProps extends InPropsObject> = <Resource extends SelectedLayoutResources<Resources, Arguments>, Name extends string = SelectedResourceLayoutName<Arguments, Resource>, Props extends InPropsObject = {}>(options: ScopedCreateResourceLayoutOptions<Resources, InProps, Composables, Arguments, Name, Resource, Props>) => ResourceLayoutComponent<Name, CustomProps, Composables, Resource>;
|
|
19
|
+
type ScopedCreateLayoutForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Arguments extends ReadonlyArray<unknown>, CustomProps extends InPropsObject> = <Resource extends SelectedLayoutResources<Resources, Arguments>, Name extends string = SelectedResourceLayoutName<Arguments, Resource>>(options: CreateLayoutForResourceOptions<Resources, Name, Resource>) => CreatedLayoutForResource<Resources, InProps, Composables, Name, Resource, CustomProps> & {
|
|
20
|
+
setDefaults: SetDefaultPropForResourceFn<Resources, InProps, Composables, Name, Resource, CustomProps>;
|
|
21
|
+
};
|
|
22
|
+
type ScopedCreateResourceLayoutMakeComposableFn<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Arguments extends ReadonlyArray<unknown>> = <Resource extends SelectedLayoutResources<Resources, Arguments>, Name extends string = SelectedResourceLayoutName<Arguments, Resource>, Props extends InPropsObject = {}>(options: Omit<CreateResourceLayoutOptionsBase<Resources, Name, Resource>, 'name'> & Partial<LayoutPropsForResource<Resources, InProps, Composables>> & {
|
|
23
|
+
props?: Props;
|
|
24
|
+
} & (HasResourceLayoutName<Arguments, Resource> extends true ? {
|
|
25
|
+
name?: Name;
|
|
26
|
+
} : {
|
|
27
|
+
name: Name;
|
|
28
|
+
})) => ComposableResourceLayout<Composables, Name, any, any, any>;
|
|
29
|
+
type ScopedCreateResourceLayoutFn<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Arguments extends ReadonlyArray<unknown>, CustomProps extends InPropsObject> = ScopedCreateResourceLayoutFnImpl<Resources, InProps, Composables, Arguments, CustomProps> & {
|
|
30
|
+
/**
|
|
31
|
+
* Creates a component shared by the target resources. Included layout props
|
|
32
|
+
* become component props, and `children` is always available as an optional
|
|
33
|
+
* prop in both the render callback and at the call site.
|
|
34
|
+
*
|
|
35
|
+
* Each key of `resources` holds that resource's scoped `components` and
|
|
36
|
+
* `render`. Layout option values like `title` are call-site props on
|
|
37
|
+
* `context.<Resource>` / the outer component — not fields on the entry.
|
|
38
|
+
* The render context exposes `Root` and one capitalized component per key
|
|
39
|
+
* present in `resources`.
|
|
40
|
+
*
|
|
41
|
+
* Each entry may also declare `components` — components scoped to that
|
|
42
|
+
* resource, available to the entry's own `render`, on `context.<Resource>`,
|
|
43
|
+
* and on the component returned by `asHOF()`.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* const Directory = createDirectoryLayout.createComponent({
|
|
47
|
+
* props: { include: { title: true, actions: 'optional' } },
|
|
48
|
+
* resources: {
|
|
49
|
+
* users: {
|
|
50
|
+
* components: {
|
|
51
|
+
* Toolbar: { render: ({ title }) => <nav>{title}</nav> },
|
|
52
|
+
* },
|
|
53
|
+
* render: ({ resource }, components) => (
|
|
54
|
+
* <>
|
|
55
|
+
* <components.Toolbar />
|
|
56
|
+
* <span>{resource}</span>
|
|
57
|
+
* </>
|
|
58
|
+
* ),
|
|
59
|
+
* },
|
|
60
|
+
* admins: {
|
|
61
|
+
* render: ({ resource }) => <span>{resource}</span>,
|
|
62
|
+
* },
|
|
63
|
+
* },
|
|
64
|
+
* render: ({ actions, children, resource }, context) => (
|
|
65
|
+
* <context.Root actions={actions}>
|
|
66
|
+
* {children}
|
|
67
|
+
* {resource === 'users' ? (
|
|
68
|
+
* <context.Users title="Users" />
|
|
69
|
+
* ) : (
|
|
70
|
+
* <context.Admins title="Admins" />
|
|
71
|
+
* )}
|
|
72
|
+
* <context.Users.Toolbar />
|
|
73
|
+
* </context.Root>
|
|
74
|
+
* ),
|
|
75
|
+
* })
|
|
76
|
+
*
|
|
77
|
+
* <Directory resource='users' title='Users' />
|
|
78
|
+
*
|
|
79
|
+
* @param options The props configuration, per-resource entries, and the
|
|
80
|
+
* shared component render function.
|
|
81
|
+
* @returns A component scoped to the selected resources.
|
|
82
|
+
*/
|
|
83
|
+
createComponent: ScopedCreateComponent<Resources, InProps, Composables, Arguments, CustomProps>;
|
|
84
|
+
forResource: ScopedCreateLayoutForResource<Resources, InProps, Composables, Arguments, CustomProps>;
|
|
85
|
+
/**
|
|
86
|
+
* Type-only property containing the target resource union. This property is
|
|
87
|
+
* `undefined` at runtime and exists solely for extracting the scoped type.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* type AccountResource = typeof createAccountLayout.resources;
|
|
91
|
+
*/
|
|
92
|
+
readonly resources: SelectedLayoutResources<Resources, Arguments>;
|
|
93
|
+
} & ([keyof Composables] extends [never] ? {} : {
|
|
94
|
+
makeComposable: ScopedCreateResourceLayoutMakeComposableFn<Resources, InProps, Composables, Arguments>;
|
|
95
|
+
});
|
|
96
|
+
type CreateResourceLayoutForResourcesFn<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}, IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {}, CustomProps extends InPropsObject = {}> = {
|
|
97
|
+
/**
|
|
98
|
+
* Creates a layout factory scoped to the listed resources.
|
|
99
|
+
*
|
|
100
|
+
* Layout names must be supplied when a layout is created.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* createResourceLayout.forResources('users', 'admins')
|
|
104
|
+
*
|
|
105
|
+
* @param resources Resources available from the returned layout factory.
|
|
106
|
+
* @returns A layout factory scoped to the selected resources.
|
|
107
|
+
*/
|
|
108
|
+
<const ResourceKeys extends readonly [LayoutResourceKey<Resources>, ...Array<LayoutResourceKey<Resources>>]>(...resources: ResourceKeys): ScopedCreateResourceLayoutFn<Resources, InProps, Composables, ResourceKeys, CustomProps>;
|
|
109
|
+
/**
|
|
110
|
+
* Creates a layout factory scoped to a resource list without default names.
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* createResourceLayout.forResources({ resources: ['users', 'admins'] })
|
|
114
|
+
*
|
|
115
|
+
* @param options The resources to expose without configured default names.
|
|
116
|
+
* @returns A layout factory scoped to the selected resources.
|
|
117
|
+
*/
|
|
118
|
+
<const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>>(options: {
|
|
119
|
+
resources: ResourceKeys;
|
|
120
|
+
name?: never;
|
|
121
|
+
}): ScopedCreateResourceLayoutFn<Resources, InProps, Composables, readonly [{
|
|
122
|
+
resources: ResourceKeys;
|
|
123
|
+
}], CustomProps>;
|
|
124
|
+
/**
|
|
125
|
+
* Creates a scoped layout factory with optional default names per resource.
|
|
126
|
+
*
|
|
127
|
+
* Each map key is limited to the resources selected in `resources`. Values
|
|
128
|
+
* can be strings or callbacks receiving that resource's capitalized name.
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* createResourceLayout.forResources({
|
|
132
|
+
* resources: ['users', 'admins'],
|
|
133
|
+
* name: {
|
|
134
|
+
* users: resource => `${resource}Page`,
|
|
135
|
+
* admins: 'AdminDirectory',
|
|
136
|
+
* },
|
|
137
|
+
* })
|
|
138
|
+
*
|
|
139
|
+
* @param options The selected resources and their optional default names.
|
|
140
|
+
* @returns A layout factory scoped to the selected resources.
|
|
141
|
+
*/
|
|
142
|
+
<const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>, const CallbackName extends string, const Names>(options: {
|
|
143
|
+
resources: ResourceKeys;
|
|
144
|
+
name: SelectedResourceLayoutNames<LayoutResourceKey<Resources>, NoInfer<ResourceKeys[number]>, CallbackName> & AtLeastOneResourceLayoutNameKey<NoInfer<ResourceKeys[number]>> & Record<string, NonNullable<ResourceLayoutNames<LayoutResourceKey<Resources>, CallbackName>[LayoutResourceKey<Resources>]>>;
|
|
145
|
+
} & {
|
|
146
|
+
name: Names & Record<Exclude<keyof Names, ResourceKeys[number]>, never>;
|
|
147
|
+
}): ScopedCreateResourceLayoutFn<Resources, InProps, Composables, MappedResourceLayoutArguments<Resources, ResourceKeys, Names, CallbackName>, CustomProps>;
|
|
148
|
+
/**
|
|
149
|
+
* Creates a scoped layout factory with one default-name callback shared by
|
|
150
|
+
* every selected resource. The callback receives a capitalized resource
|
|
151
|
+
* whose `toLowerCase()` result retains the corresponding literal type.
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* createResourceLayout.forResources({
|
|
155
|
+
* resources: ['users', 'admins'],
|
|
156
|
+
* name: resource => `${resource}Page`,
|
|
157
|
+
* })
|
|
158
|
+
*
|
|
159
|
+
* @param options The selected resources and shared default-name callback.
|
|
160
|
+
* @returns A layout factory scoped to the selected resources.
|
|
161
|
+
*/
|
|
162
|
+
<const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>, const Name extends string>(options: {
|
|
163
|
+
resources: ReadonlyArray<LayoutResourceKey<Resources>>;
|
|
164
|
+
name: (resource: CapitalizedResource<ResourceKeys[number]>) => Name;
|
|
165
|
+
} & {
|
|
166
|
+
resources: ResourceKeys;
|
|
167
|
+
}): ScopedCreateResourceLayoutFn<Resources, InProps, Composables, SharedResourceLayoutArguments<Resources, ResourceKeys, Name>, CustomProps>;
|
|
168
|
+
/**
|
|
169
|
+
* Creates a scoped layout factory from a resource-keyed configuration.
|
|
170
|
+
* Only configured resources are available from the returned factory.
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* createResourceLayout.forResources({
|
|
174
|
+
* users: { name: resource => `${resource}Page` },
|
|
175
|
+
* admins: { name: 'AdminDirectory' },
|
|
176
|
+
* })
|
|
177
|
+
*
|
|
178
|
+
* @param options Resource-keyed layout defaults.
|
|
179
|
+
* @returns A layout factory scoped to the configured resources.
|
|
180
|
+
*/
|
|
181
|
+
<const CallbackName extends string, const Selection extends ResourceLayoutSelection<Resources, CallbackName>>(options: Selection & AtLeastOneResourceLayoutSelection<Resources, CallbackName> & Partial<Record<Exclude<'resources', LayoutResourceKey<Resources>>, never>> & Record<Exclude<keyof Selection, LayoutResourceKey<Resources>>, never>): ScopedCreateResourceLayoutFn<Resources, InProps, Composables, SelectedResourceLayoutArguments<Selection>, CustomProps>;
|
|
182
|
+
};
|
|
183
|
+
//#endregion
|
|
184
|
+
export { CreateResourceLayoutForResourcesFn };
|
|
185
|
+
//# sourceMappingURL=scoped-layout.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoped-layout.d.cts","names":[],"sources":["../../../src/create-config/for-resources/scoped-layout.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { LayoutResourceKey, ResourceDefinition } from "../../resource.mjs";
|
|
2
|
+
import { InPropsDefinition, InPropsObject } from "../../props.mjs";
|
|
3
|
+
import { CreateLayoutForResourceOptions, CreateResourceLayoutOptionsBase, CreatedLayoutForResource, SetDefaultPropForResourceFn } from "../for-resource.mjs";
|
|
4
|
+
import { AtLeastOneResourceLayoutNameKey, AtLeastOneResourceLayoutSelection, CapitalizedResource, HasResourceLayoutName, MappedResourceLayoutArguments, ResourceLayoutNames, ResourceLayoutSelection, SelectedLayoutResources, SelectedResourceLayoutArguments, SelectedResourceLayoutName, SelectedResourceLayoutNames, SharedResourceLayoutArguments } from "./resource-selection.mjs";
|
|
5
|
+
import { ScopedCreateComponent } from "./create-component.mjs";
|
|
6
|
+
import { LayoutIncludeProps, LayoutPropsForResource, ResourceLayoutComponent } from "../define-layout.mjs";
|
|
7
|
+
import { ComposableComponents, ComposableResourceLayout } from "@jfdevelops/react-layout-composables";
|
|
8
|
+
|
|
9
|
+
//#region src/create-config/for-resources/scoped-layout.d.ts
|
|
10
|
+
type ScopedCreateResourceLayoutOptions<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Arguments extends ReadonlyArray<unknown>, Name extends string, Resource extends SelectedLayoutResources<Resources, Arguments>, Props extends InPropsObject> = LayoutPropsForResource<Resources, InProps, Composables> & {
|
|
11
|
+
resource: Resource;
|
|
12
|
+
props?: Props;
|
|
13
|
+
} & (HasResourceLayoutName<Arguments, Resource> extends true ? {
|
|
14
|
+
name?: Name;
|
|
15
|
+
} : {
|
|
16
|
+
name: Name;
|
|
17
|
+
});
|
|
18
|
+
type ScopedCreateResourceLayoutFnImpl<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Arguments extends ReadonlyArray<unknown>, CustomProps extends InPropsObject> = <Resource extends SelectedLayoutResources<Resources, Arguments>, Name extends string = SelectedResourceLayoutName<Arguments, Resource>, Props extends InPropsObject = {}>(options: ScopedCreateResourceLayoutOptions<Resources, InProps, Composables, Arguments, Name, Resource, Props>) => ResourceLayoutComponent<Name, CustomProps, Composables, Resource>;
|
|
19
|
+
type ScopedCreateLayoutForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Arguments extends ReadonlyArray<unknown>, CustomProps extends InPropsObject> = <Resource extends SelectedLayoutResources<Resources, Arguments>, Name extends string = SelectedResourceLayoutName<Arguments, Resource>>(options: CreateLayoutForResourceOptions<Resources, Name, Resource>) => CreatedLayoutForResource<Resources, InProps, Composables, Name, Resource, CustomProps> & {
|
|
20
|
+
setDefaults: SetDefaultPropForResourceFn<Resources, InProps, Composables, Name, Resource, CustomProps>;
|
|
21
|
+
};
|
|
22
|
+
type ScopedCreateResourceLayoutMakeComposableFn<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Arguments extends ReadonlyArray<unknown>> = <Resource extends SelectedLayoutResources<Resources, Arguments>, Name extends string = SelectedResourceLayoutName<Arguments, Resource>, Props extends InPropsObject = {}>(options: Omit<CreateResourceLayoutOptionsBase<Resources, Name, Resource>, 'name'> & Partial<LayoutPropsForResource<Resources, InProps, Composables>> & {
|
|
23
|
+
props?: Props;
|
|
24
|
+
} & (HasResourceLayoutName<Arguments, Resource> extends true ? {
|
|
25
|
+
name?: Name;
|
|
26
|
+
} : {
|
|
27
|
+
name: Name;
|
|
28
|
+
})) => ComposableResourceLayout<Composables, Name, any, any, any>;
|
|
29
|
+
type ScopedCreateResourceLayoutFn<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Arguments extends ReadonlyArray<unknown>, CustomProps extends InPropsObject> = ScopedCreateResourceLayoutFnImpl<Resources, InProps, Composables, Arguments, CustomProps> & {
|
|
30
|
+
/**
|
|
31
|
+
* Creates a component shared by the target resources. Included layout props
|
|
32
|
+
* become component props, and `children` is always available as an optional
|
|
33
|
+
* prop in both the render callback and at the call site.
|
|
34
|
+
*
|
|
35
|
+
* Each key of `resources` holds that resource's scoped `components` and
|
|
36
|
+
* `render`. Layout option values like `title` are call-site props on
|
|
37
|
+
* `context.<Resource>` / the outer component — not fields on the entry.
|
|
38
|
+
* The render context exposes `Root` and one capitalized component per key
|
|
39
|
+
* present in `resources`.
|
|
40
|
+
*
|
|
41
|
+
* Each entry may also declare `components` — components scoped to that
|
|
42
|
+
* resource, available to the entry's own `render`, on `context.<Resource>`,
|
|
43
|
+
* and on the component returned by `asHOF()`.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* const Directory = createDirectoryLayout.createComponent({
|
|
47
|
+
* props: { include: { title: true, actions: 'optional' } },
|
|
48
|
+
* resources: {
|
|
49
|
+
* users: {
|
|
50
|
+
* components: {
|
|
51
|
+
* Toolbar: { render: ({ title }) => <nav>{title}</nav> },
|
|
52
|
+
* },
|
|
53
|
+
* render: ({ resource }, components) => (
|
|
54
|
+
* <>
|
|
55
|
+
* <components.Toolbar />
|
|
56
|
+
* <span>{resource}</span>
|
|
57
|
+
* </>
|
|
58
|
+
* ),
|
|
59
|
+
* },
|
|
60
|
+
* admins: {
|
|
61
|
+
* render: ({ resource }) => <span>{resource}</span>,
|
|
62
|
+
* },
|
|
63
|
+
* },
|
|
64
|
+
* render: ({ actions, children, resource }, context) => (
|
|
65
|
+
* <context.Root actions={actions}>
|
|
66
|
+
* {children}
|
|
67
|
+
* {resource === 'users' ? (
|
|
68
|
+
* <context.Users title="Users" />
|
|
69
|
+
* ) : (
|
|
70
|
+
* <context.Admins title="Admins" />
|
|
71
|
+
* )}
|
|
72
|
+
* <context.Users.Toolbar />
|
|
73
|
+
* </context.Root>
|
|
74
|
+
* ),
|
|
75
|
+
* })
|
|
76
|
+
*
|
|
77
|
+
* <Directory resource='users' title='Users' />
|
|
78
|
+
*
|
|
79
|
+
* @param options The props configuration, per-resource entries, and the
|
|
80
|
+
* shared component render function.
|
|
81
|
+
* @returns A component scoped to the selected resources.
|
|
82
|
+
*/
|
|
83
|
+
createComponent: ScopedCreateComponent<Resources, InProps, Composables, Arguments, CustomProps>;
|
|
84
|
+
forResource: ScopedCreateLayoutForResource<Resources, InProps, Composables, Arguments, CustomProps>;
|
|
85
|
+
/**
|
|
86
|
+
* Type-only property containing the target resource union. This property is
|
|
87
|
+
* `undefined` at runtime and exists solely for extracting the scoped type.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* type AccountResource = typeof createAccountLayout.resources;
|
|
91
|
+
*/
|
|
92
|
+
readonly resources: SelectedLayoutResources<Resources, Arguments>;
|
|
93
|
+
} & ([keyof Composables] extends [never] ? {} : {
|
|
94
|
+
makeComposable: ScopedCreateResourceLayoutMakeComposableFn<Resources, InProps, Composables, Arguments>;
|
|
95
|
+
});
|
|
96
|
+
type CreateResourceLayoutForResourcesFn<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}, IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {}, CustomProps extends InPropsObject = {}> = {
|
|
97
|
+
/**
|
|
98
|
+
* Creates a layout factory scoped to the listed resources.
|
|
99
|
+
*
|
|
100
|
+
* Layout names must be supplied when a layout is created.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* createResourceLayout.forResources('users', 'admins')
|
|
104
|
+
*
|
|
105
|
+
* @param resources Resources available from the returned layout factory.
|
|
106
|
+
* @returns A layout factory scoped to the selected resources.
|
|
107
|
+
*/
|
|
108
|
+
<const ResourceKeys extends readonly [LayoutResourceKey<Resources>, ...Array<LayoutResourceKey<Resources>>]>(...resources: ResourceKeys): ScopedCreateResourceLayoutFn<Resources, InProps, Composables, ResourceKeys, CustomProps>;
|
|
109
|
+
/**
|
|
110
|
+
* Creates a layout factory scoped to a resource list without default names.
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* createResourceLayout.forResources({ resources: ['users', 'admins'] })
|
|
114
|
+
*
|
|
115
|
+
* @param options The resources to expose without configured default names.
|
|
116
|
+
* @returns A layout factory scoped to the selected resources.
|
|
117
|
+
*/
|
|
118
|
+
<const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>>(options: {
|
|
119
|
+
resources: ResourceKeys;
|
|
120
|
+
name?: never;
|
|
121
|
+
}): ScopedCreateResourceLayoutFn<Resources, InProps, Composables, readonly [{
|
|
122
|
+
resources: ResourceKeys;
|
|
123
|
+
}], CustomProps>;
|
|
124
|
+
/**
|
|
125
|
+
* Creates a scoped layout factory with optional default names per resource.
|
|
126
|
+
*
|
|
127
|
+
* Each map key is limited to the resources selected in `resources`. Values
|
|
128
|
+
* can be strings or callbacks receiving that resource's capitalized name.
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* createResourceLayout.forResources({
|
|
132
|
+
* resources: ['users', 'admins'],
|
|
133
|
+
* name: {
|
|
134
|
+
* users: resource => `${resource}Page`,
|
|
135
|
+
* admins: 'AdminDirectory',
|
|
136
|
+
* },
|
|
137
|
+
* })
|
|
138
|
+
*
|
|
139
|
+
* @param options The selected resources and their optional default names.
|
|
140
|
+
* @returns A layout factory scoped to the selected resources.
|
|
141
|
+
*/
|
|
142
|
+
<const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>, const CallbackName extends string, const Names>(options: {
|
|
143
|
+
resources: ResourceKeys;
|
|
144
|
+
name: SelectedResourceLayoutNames<LayoutResourceKey<Resources>, NoInfer<ResourceKeys[number]>, CallbackName> & AtLeastOneResourceLayoutNameKey<NoInfer<ResourceKeys[number]>> & Record<string, NonNullable<ResourceLayoutNames<LayoutResourceKey<Resources>, CallbackName>[LayoutResourceKey<Resources>]>>;
|
|
145
|
+
} & {
|
|
146
|
+
name: Names & Record<Exclude<keyof Names, ResourceKeys[number]>, never>;
|
|
147
|
+
}): ScopedCreateResourceLayoutFn<Resources, InProps, Composables, MappedResourceLayoutArguments<Resources, ResourceKeys, Names, CallbackName>, CustomProps>;
|
|
148
|
+
/**
|
|
149
|
+
* Creates a scoped layout factory with one default-name callback shared by
|
|
150
|
+
* every selected resource. The callback receives a capitalized resource
|
|
151
|
+
* whose `toLowerCase()` result retains the corresponding literal type.
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* createResourceLayout.forResources({
|
|
155
|
+
* resources: ['users', 'admins'],
|
|
156
|
+
* name: resource => `${resource}Page`,
|
|
157
|
+
* })
|
|
158
|
+
*
|
|
159
|
+
* @param options The selected resources and shared default-name callback.
|
|
160
|
+
* @returns A layout factory scoped to the selected resources.
|
|
161
|
+
*/
|
|
162
|
+
<const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>, const Name extends string>(options: {
|
|
163
|
+
resources: ReadonlyArray<LayoutResourceKey<Resources>>;
|
|
164
|
+
name: (resource: CapitalizedResource<ResourceKeys[number]>) => Name;
|
|
165
|
+
} & {
|
|
166
|
+
resources: ResourceKeys;
|
|
167
|
+
}): ScopedCreateResourceLayoutFn<Resources, InProps, Composables, SharedResourceLayoutArguments<Resources, ResourceKeys, Name>, CustomProps>;
|
|
168
|
+
/**
|
|
169
|
+
* Creates a scoped layout factory from a resource-keyed configuration.
|
|
170
|
+
* Only configured resources are available from the returned factory.
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* createResourceLayout.forResources({
|
|
174
|
+
* users: { name: resource => `${resource}Page` },
|
|
175
|
+
* admins: { name: 'AdminDirectory' },
|
|
176
|
+
* })
|
|
177
|
+
*
|
|
178
|
+
* @param options Resource-keyed layout defaults.
|
|
179
|
+
* @returns A layout factory scoped to the configured resources.
|
|
180
|
+
*/
|
|
181
|
+
<const CallbackName extends string, const Selection extends ResourceLayoutSelection<Resources, CallbackName>>(options: Selection & AtLeastOneResourceLayoutSelection<Resources, CallbackName> & Partial<Record<Exclude<'resources', LayoutResourceKey<Resources>>, never>> & Record<Exclude<keyof Selection, LayoutResourceKey<Resources>>, never>): ScopedCreateResourceLayoutFn<Resources, InProps, Composables, SelectedResourceLayoutArguments<Selection>, CustomProps>;
|
|
182
|
+
};
|
|
183
|
+
//#endregion
|
|
184
|
+
export { CreateResourceLayoutForResourcesFn };
|
|
185
|
+
//# sourceMappingURL=scoped-layout.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoped-layout.d.mts","names":[],"sources":["../../../src/create-config/for-resources/scoped-layout.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
let react = require("react");
|
|
2
|
+
|
|
3
|
+
//#region src/create-config/for-resources/scoped-render.ts
|
|
4
|
+
/**
|
|
5
|
+
* Names a scoped component cannot use. Scoped components are attached to
|
|
6
|
+
* function objects, so they collide with the component's own statics and with
|
|
7
|
+
* non-writable `Function.prototype` properties. `__proto__` is reserved so
|
|
8
|
+
* assignment cannot hit the prototype setter on a normal object.
|
|
9
|
+
*/
|
|
10
|
+
const reservedScopedComponentNames = new Set([
|
|
11
|
+
"__proto__",
|
|
12
|
+
"apply",
|
|
13
|
+
"arguments",
|
|
14
|
+
"bind",
|
|
15
|
+
"call",
|
|
16
|
+
"caller",
|
|
17
|
+
"displayName",
|
|
18
|
+
"length",
|
|
19
|
+
"name",
|
|
20
|
+
"props",
|
|
21
|
+
"prototype",
|
|
22
|
+
"resource"
|
|
23
|
+
]);
|
|
24
|
+
/**
|
|
25
|
+
* `$$typeof` tags for object component wrappers that `createElement` accepts
|
|
26
|
+
* as `type` (forwardRef, memo, lazy).
|
|
27
|
+
*
|
|
28
|
+
* Do not treat "any object with `$$typeof`" as a component: portals also have
|
|
29
|
+
* `$$typeof` (`Symbol.for('react.portal')`) and `isValidElement(portal)` is
|
|
30
|
+
* false, so a naive check would mis-classify them.
|
|
31
|
+
*/
|
|
32
|
+
const reactForwardRefType = Symbol.for("react.forward_ref");
|
|
33
|
+
const reactMemoType = Symbol.for("react.memo");
|
|
34
|
+
const reactLazyType = Symbol.for("react.lazy");
|
|
35
|
+
/**
|
|
36
|
+
* True when `value` can be passed as the `type` argument to `createElement`.
|
|
37
|
+
*
|
|
38
|
+
* Functions always qualify. Object wrappers qualify only for the forwardRef /
|
|
39
|
+
* memo / lazy tags above — not portals or other React nodes that happen to
|
|
40
|
+
* carry `$$typeof`.
|
|
41
|
+
*/
|
|
42
|
+
function isRenderableComponentType(value) {
|
|
43
|
+
if (typeof value === "function") return true;
|
|
44
|
+
if (typeof value !== "object" || value === null || Array.isArray(value) || (0, react.isValidElement)(value) || !("$$typeof" in value)) return false;
|
|
45
|
+
const typeTag = value.$$typeof;
|
|
46
|
+
return typeTag === reactForwardRefType || typeTag === reactMemoType || typeTag === reactLazyType;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* If `render` returned a component type, mount it with `props`; otherwise
|
|
50
|
+
* return the node as-is (elements, portals, null, etc.).
|
|
51
|
+
*/
|
|
52
|
+
function resolveScopedRenderResult(result, props = {}) {
|
|
53
|
+
if (isRenderableComponentType(result)) return (0, react.createElement)(result, props);
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Runtime counterpart of `ScopedComponentCompoundStaticKey` — keys that must
|
|
58
|
+
* not be treated as compound component statics on a scoped wrapper.
|
|
59
|
+
*/
|
|
60
|
+
const reservedScopedCompoundStaticKeys = new Set([
|
|
61
|
+
"apply",
|
|
62
|
+
"arguments",
|
|
63
|
+
"bind",
|
|
64
|
+
"call",
|
|
65
|
+
"caller",
|
|
66
|
+
"childContextTypes",
|
|
67
|
+
"contextTypes",
|
|
68
|
+
"defaultProps",
|
|
69
|
+
"displayName",
|
|
70
|
+
"length",
|
|
71
|
+
"name",
|
|
72
|
+
"propTypes",
|
|
73
|
+
"prototype",
|
|
74
|
+
"toLocaleString",
|
|
75
|
+
"toString",
|
|
76
|
+
"valueOf",
|
|
77
|
+
"$$typeof"
|
|
78
|
+
]);
|
|
79
|
+
/**
|
|
80
|
+
* Exposes compound statics (e.g. `DataTable.Loading`) on a scoped wrapper so
|
|
81
|
+
* runtime matches `ScopedComponentCompoundStatics`.
|
|
82
|
+
*
|
|
83
|
+
* Why a Proxy: JSX reads `components.DataTable.Loading` while building the
|
|
84
|
+
* element tree — before `DataTable` itself renders — so statics cannot be
|
|
85
|
+
* copied only after the first `render` call. Property access lazily creates a
|
|
86
|
+
* stable wrapper component that re-runs the scoped `render` under context and
|
|
87
|
+
* mounts the matching static from the returned component type.
|
|
88
|
+
*/
|
|
89
|
+
function withScopedCompoundStatics(wrapper, createCompoundStatic) {
|
|
90
|
+
return new Proxy(wrapper, { get(target, property, receiver) {
|
|
91
|
+
if (typeof property === "symbol" || reservedScopedCompoundStaticKeys.has(property) || property in target) return Reflect.get(target, property, receiver);
|
|
92
|
+
const CompoundStatic = createCompoundStatic(property);
|
|
93
|
+
target[property] = CompoundStatic;
|
|
94
|
+
return CompoundStatic;
|
|
95
|
+
} });
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
//#endregion
|
|
99
|
+
exports.isRenderableComponentType = isRenderableComponentType;
|
|
100
|
+
exports.reservedScopedComponentNames = reservedScopedComponentNames;
|
|
101
|
+
exports.resolveScopedRenderResult = resolveScopedRenderResult;
|
|
102
|
+
exports.withScopedCompoundStatics = withScopedCompoundStatics;
|
|
103
|
+
//# sourceMappingURL=scoped-render.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoped-render.cjs","names":[],"sources":["../../../src/create-config/for-resources/scoped-render.ts"],"sourcesContent":["import {\n createElement,\n isValidElement,\n type ComponentType,\n type JSX,\n type ReactNode,\n} from 'react';\n\n/**\n * Names a scoped component cannot use. Scoped components are attached to\n * function objects, so they collide with the component's own statics and with\n * non-writable `Function.prototype` properties. `__proto__` is reserved so\n * assignment cannot hit the prototype setter on a normal object.\n */\nexport const reservedScopedComponentNames = new Set([\n '__proto__',\n 'apply',\n 'arguments',\n 'bind',\n 'call',\n 'caller',\n 'displayName',\n 'length',\n 'name',\n 'props',\n 'prototype',\n 'resource',\n]);\n\n/**\n * Values a createComponent / scoped-component `render` may return.\n *\n * Alongside rendered nodes, a component type is allowed — the type constituent\n * of a React element — so factories like `createDataTable(columns)` can be\n * returned directly and mounted with the call-site props.\n *\n * At runtime, `resolveScopedRenderResult` distinguishes component types from\n * nodes (including portals). Getting that wrong mounts a portal via\n * `createElement` and blows up with an invalid-element-type error.\n */\n// Returned components declare their own props; a concrete props parameter would\n// be contravariant and reject the factories callers actually return.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- see above\nexport type ScopedRenderResult = ReactNode | ComponentType<any>;\n\n/**\n * `$$typeof` tags for object component wrappers that `createElement` accepts\n * as `type` (forwardRef, memo, lazy).\n *\n * Do not treat \"any object with `$$typeof`\" as a component: portals also have\n * `$$typeof` (`Symbol.for('react.portal')`) and `isValidElement(portal)` is\n * false, so a naive check would mis-classify them.\n */\nconst reactForwardRefType = Symbol.for('react.forward_ref');\nconst reactMemoType = Symbol.for('react.memo');\nconst reactLazyType = Symbol.for('react.lazy');\n\n/**\n * True when `value` can be passed as the `type` argument to `createElement`.\n *\n * Functions always qualify. Object wrappers qualify only for the forwardRef /\n * memo / lazy tags above — not portals or other React nodes that happen to\n * carry `$$typeof`.\n */\nexport function isRenderableComponentType(\n value: unknown,\n): value is ComponentType<Record<string, unknown>> {\n if (typeof value === 'function') {\n return true;\n }\n\n if (\n typeof value !== 'object' ||\n value === null ||\n Array.isArray(value) ||\n isValidElement(value) ||\n !('$$typeof' in value)\n ) {\n return false;\n }\n\n const typeTag = (value as { $$typeof: unknown }).$$typeof;\n\n return (\n typeTag === reactForwardRefType ||\n typeTag === reactMemoType ||\n typeTag === reactLazyType\n );\n}\n\n/**\n * If `render` returned a component type, mount it with `props`; otherwise\n * return the node as-is (elements, portals, null, etc.).\n */\nexport function resolveScopedRenderResult(\n result: ScopedRenderResult,\n props: Record<string, unknown> = {},\n): JSX.Element {\n if (isRenderableComponentType(result)) {\n return createElement(result, props);\n }\n\n return result as JSX.Element;\n}\n\n/**\n * Runtime counterpart of `ScopedComponentCompoundStaticKey` — keys that must\n * not be treated as compound component statics on a scoped wrapper.\n */\nconst reservedScopedCompoundStaticKeys = new Set<PropertyKey>([\n 'apply',\n 'arguments',\n 'bind',\n 'call',\n 'caller',\n 'childContextTypes',\n 'contextTypes',\n 'defaultProps',\n 'displayName',\n 'length',\n 'name',\n 'propTypes',\n 'prototype',\n 'toLocaleString',\n 'toString',\n 'valueOf',\n '$$typeof',\n]);\n\ntype ScopedComponentWrapper = ((\n props?: Record<string, unknown>,\n) => JSX.Element) &\n Record<string, unknown>;\n\n/**\n * Exposes compound statics (e.g. `DataTable.Loading`) on a scoped wrapper so\n * runtime matches `ScopedComponentCompoundStatics`.\n *\n * Why a Proxy: JSX reads `components.DataTable.Loading` while building the\n * element tree — before `DataTable` itself renders — so statics cannot be\n * copied only after the first `render` call. Property access lazily creates a\n * stable wrapper component that re-runs the scoped `render` under context and\n * mounts the matching static from the returned component type.\n */\nexport function withScopedCompoundStatics(\n wrapper: (props?: Record<string, unknown>) => JSX.Element,\n createCompoundStatic: (\n staticName: string,\n ) => (ownProps?: Record<string, unknown>) => JSX.Element,\n): ScopedComponentWrapper {\n return new Proxy(wrapper as ScopedComponentWrapper, {\n get(target, property, receiver) {\n if (\n typeof property === 'symbol' ||\n reservedScopedCompoundStaticKeys.has(property) ||\n property in target\n ) {\n return Reflect.get(target, property, receiver);\n }\n\n // Cache on the target so repeated `.Loading` access keeps one identity.\n const CompoundStatic = createCompoundStatic(property);\n target[property] = CompoundStatic;\n return CompoundStatic;\n },\n });\n}\n"],"mappings":";;;;;;;;;AAcA,MAAa,+BAA+B,IAAI,IAAI;CAClD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;;;;AA0BD,MAAM,sBAAsB,OAAO,IAAI,mBAAmB;AAC1D,MAAM,gBAAgB,OAAO,IAAI,YAAY;AAC7C,MAAM,gBAAgB,OAAO,IAAI,YAAY;;;;;;;;AAS7C,SAAgB,0BACd,OACiD;CACjD,IAAI,OAAO,UAAU,YACnB,OAAO;CAGT,IACE,OAAO,UAAU,YACjB,UAAU,QACV,MAAM,QAAQ,KAAK,+BACJ,KAAK,KACpB,EAAE,cAAc,QAEhB,OAAO;CAGT,MAAM,UAAW,MAAgC;CAEjD,OACE,YAAY,uBACZ,YAAY,iBACZ,YAAY;AAEhB;;;;;AAMA,SAAgB,0BACd,QACA,QAAiC,CAAC,GACrB;CACb,IAAI,0BAA0B,MAAM,GAClC,gCAAqB,QAAQ,KAAK;CAGpC,OAAO;AACT;;;;;AAMA,MAAM,mCAAmC,IAAI,IAAiB;CAC5D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;;;;;;AAiBD,SAAgB,0BACd,SACA,sBAGwB;CACxB,OAAO,IAAI,MAAM,SAAmC,EAClD,IAAI,QAAQ,UAAU,UAAU;EAC9B,IACE,OAAO,aAAa,YACpB,iCAAiC,IAAI,QAAQ,KAC7C,YAAY,QAEZ,OAAO,QAAQ,IAAI,QAAQ,UAAU,QAAQ;EAI/C,MAAM,iBAAiB,qBAAqB,QAAQ;EACpD,OAAO,YAAY;EACnB,OAAO;CACT,EACF,CAAC;AACH"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ComponentType, JSX, ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
//#region src/create-config/for-resources/scoped-render.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Values a createComponent / scoped-component `render` may return.
|
|
6
|
+
*
|
|
7
|
+
* Alongside rendered nodes, a component type is allowed — the type constituent
|
|
8
|
+
* of a React element — so factories like `createDataTable(columns)` can be
|
|
9
|
+
* returned directly and mounted with the call-site props.
|
|
10
|
+
*
|
|
11
|
+
* At runtime, `resolveScopedRenderResult` distinguishes component types from
|
|
12
|
+
* nodes (including portals). Getting that wrong mounts a portal via
|
|
13
|
+
* `createElement` and blows up with an invalid-element-type error.
|
|
14
|
+
*/
|
|
15
|
+
type ScopedRenderResult = ReactNode | ComponentType<any>;
|
|
16
|
+
//#endregion
|
|
17
|
+
export { ScopedRenderResult };
|
|
18
|
+
//# sourceMappingURL=scoped-render.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoped-render.d.cts","names":[],"sources":["../../../src/create-config/for-resources/scoped-render.ts"],"mappings":";;;;;;;;;;;;;;KA2CY,kBAAA,GAAqB,SAAA,GAAY,aAAa"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ComponentType, JSX, ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
//#region src/create-config/for-resources/scoped-render.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Values a createComponent / scoped-component `render` may return.
|
|
6
|
+
*
|
|
7
|
+
* Alongside rendered nodes, a component type is allowed — the type constituent
|
|
8
|
+
* of a React element — so factories like `createDataTable(columns)` can be
|
|
9
|
+
* returned directly and mounted with the call-site props.
|
|
10
|
+
*
|
|
11
|
+
* At runtime, `resolveScopedRenderResult` distinguishes component types from
|
|
12
|
+
* nodes (including portals). Getting that wrong mounts a portal via
|
|
13
|
+
* `createElement` and blows up with an invalid-element-type error.
|
|
14
|
+
*/
|
|
15
|
+
type ScopedRenderResult = ReactNode | ComponentType<any>;
|
|
16
|
+
//#endregion
|
|
17
|
+
export { ScopedRenderResult };
|
|
18
|
+
//# sourceMappingURL=scoped-render.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoped-render.d.mts","names":[],"sources":["../../../src/create-config/for-resources/scoped-render.ts"],"mappings":";;;;;;;;;;;;;;KA2CY,kBAAA,GAAqB,SAAA,GAAY,aAAa"}
|