@jfdevelops/react-layout 0.8.2 → 0.10.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/create-resource-links.cjs +6 -9
- package/dist/create-config/create-resource-links.cjs.map +1 -1
- package/dist/create-config/create-resource-links.d.cts +8 -7
- package/dist/create-config/create-resource-links.d.cts.map +1 -1
- package/dist/create-config/create-resource-links.d.mts +8 -7
- package/dist/create-config/create-resource-links.d.mts.map +1 -1
- package/dist/create-config/create-resource-links.mjs +6 -10
- package/dist/create-config/create-resource-links.mjs.map +1 -1
- package/dist/create-config/define-layout.cjs +14 -19
- package/dist/create-config/define-layout.cjs.map +1 -1
- package/dist/create-config/define-layout.d.cts +8 -35
- package/dist/create-config/define-layout.d.cts.map +1 -1
- package/dist/create-config/define-layout.d.mts +8 -35
- package/dist/create-config/define-layout.d.mts.map +1 -1
- package/dist/create-config/define-layout.mjs +14 -19
- package/dist/create-config/define-layout.mjs.map +1 -1
- package/dist/create-config/for-resource.cjs +49 -0
- package/dist/create-config/for-resource.cjs.map +1 -0
- package/dist/create-config/for-resource.d.cts +127 -0
- package/dist/create-config/for-resource.d.cts.map +1 -0
- package/dist/create-config/for-resource.d.mts +127 -0
- package/dist/create-config/for-resource.d.mts.map +1 -0
- package/dist/create-config/for-resource.mjs +49 -0
- package/dist/create-config/for-resource.mjs.map +1 -0
- package/dist/create-config/for-resources.cjs +47 -0
- package/dist/create-config/for-resources.cjs.map +1 -0
- package/dist/create-config/for-resources.d.cts +162 -0
- package/dist/create-config/for-resources.d.cts.map +1 -0
- package/dist/create-config/for-resources.d.mts +162 -0
- package/dist/create-config/for-resources.d.mts.map +1 -0
- package/dist/create-config/for-resources.mjs +47 -0
- package/dist/create-config/for-resources.mjs.map +1 -0
- package/dist/resource.cjs +0 -6
- package/dist/resource.cjs.map +1 -1
- package/dist/resource.mjs +1 -6
- package/dist/resource.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { UnionToIntersection, Updater } from "../utils.cjs";
|
|
2
|
+
import { LayoutResourceKey, ResourceDefinition } from "../resource.cjs";
|
|
3
|
+
import { InPropsDefinition, InPropsObject } from "../props.cjs";
|
|
4
|
+
import { LayoutIncludeProps, LayoutPropsForResource, ResourceLayoutComponent } from "./define-layout.cjs";
|
|
5
|
+
import { ComposableComponents } from "@jfdevelops/react-layout-composables";
|
|
6
|
+
|
|
7
|
+
//#region src/create-config/for-resource.d.ts
|
|
8
|
+
type LayoutPropDefaults = Record<string, unknown>;
|
|
9
|
+
type CreateTimeLayoutPropWithDefault<LayoutProps extends LayoutPropDefaults, Key extends keyof LayoutProps> = LayoutProps[Key] extends ((...args: unknown[]) => unknown) ? LayoutProps[Key] : Updater<LayoutProps[Key]>;
|
|
10
|
+
type ResolveLayoutPropsWithDefaults<LayoutProps extends LayoutPropDefaults, Defaults extends LayoutPropDefaults> = Omit<LayoutProps, keyof Defaults> & { [Key in keyof Defaults & keyof LayoutProps]?: CreateTimeLayoutPropWithDefault<LayoutProps, Key> };
|
|
11
|
+
type CreateResourceLayoutOptionsBase<Resources extends ReadonlyArray<ResourceDefinition>, Name extends string, Resource extends LayoutResourceKey<Resources>, Props extends InPropsObject = {}> = {
|
|
12
|
+
name: Name;
|
|
13
|
+
resource: Resource;
|
|
14
|
+
props?: Props;
|
|
15
|
+
};
|
|
16
|
+
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> & CreateResourceLayoutOptionsBase<Resources, Name, Resource, Props>;
|
|
17
|
+
type CreateLayoutForResourceOptions<Resources extends ReadonlyArray<ResourceDefinition>, Name extends string, Resource extends LayoutResourceKey<Resources>> = {
|
|
18
|
+
name?: Name;
|
|
19
|
+
resource: Resource;
|
|
20
|
+
};
|
|
21
|
+
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> & {
|
|
22
|
+
props?: Props;
|
|
23
|
+
};
|
|
24
|
+
type CreatedLayoutForResourceCallOptions<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, OverrideName extends string, Props extends InPropsObject, Defaults extends LayoutPropDefaults> = CreatedLayoutForResourceOptions<Resources, InProps, Composables, Props, Defaults> & {
|
|
25
|
+
name?: OverrideName;
|
|
26
|
+
};
|
|
27
|
+
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 = {}>(...args: {} extends CreatedLayoutForResourceCallOptions<Resources, InProps, Composables, OverrideName, Props, Defaults> ? [options?: CreatedLayoutForResourceCallOptions<Resources, InProps, Composables, OverrideName, Props, Defaults>] : [options: CreatedLayoutForResourceCallOptions<Resources, InProps, Composables, OverrideName, Props, Defaults>]) => ResourceLayoutComponent<OverrideName, CustomProps, Composables>;
|
|
28
|
+
type SetDefaultPropsForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}> = Partial<LayoutPropsForResource<Resources, InProps, Composables>>;
|
|
29
|
+
type ResolvedSetDefaultProps<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Defaults extends SetDefaultPropsForResource<Resources, InProps, Composables>> = { [Key in keyof Defaults & keyof LayoutPropsForResource<Resources, InProps, Composables>]: LayoutPropsForResource<Resources, InProps, Composables>[Key] };
|
|
30
|
+
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>>(/** Default values for layout props. Each prop can only be set once. */
|
|
31
|
+
|
|
32
|
+
defaults: Defaults) => CreatedLayoutForResource<Resources, InProps, Composables, Name, Resource, CustomProps, ResolvedSetDefaultProps<Resources, InProps, Composables, Defaults>>;
|
|
33
|
+
type CapitalizedResource<Resource extends string> = Resource extends Resource ? {
|
|
34
|
+
toLowerCase: () => Lowercase<Capitalize<Resource>>;
|
|
35
|
+
} & Capitalize<Resource> : never;
|
|
36
|
+
type ResourceLayoutNames<Resource extends string, CallbackName extends string> = { [TargetResource in Resource]?: string | ((resource: CapitalizedResource<TargetResource>) => CallbackName) };
|
|
37
|
+
type AtLeastOneResourceLayoutNameKey<Resource extends string> = { [TargetResource in Resource]: Record<TargetResource, unknown> & Partial<Record<Exclude<Resource, TargetResource>, unknown>> }[Resource];
|
|
38
|
+
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) };
|
|
39
|
+
type NormalizeCapitalizedResourceName<Name extends string, Resource extends string> = Name extends Name ? NormalizeCapitalizedResourceNameMatch<Name, Resource> extends infer Match extends string ? [Match] extends [never] ? Name : Match : never : never;
|
|
40
|
+
type NormalizeCapitalizedResourceNameMatch<Name extends string, Resource extends string> = Resource extends Resource ? Name extends `${CapitalizedResource<Resource>}${infer Suffix}` ? `${Capitalize<Resource>}${Suffix}` : never : never;
|
|
41
|
+
type ResourceLayoutBuilder<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Name extends string, Resource extends LayoutResourceKey<Resources>, CustomProps extends InPropsObject> = CreatedLayoutForResource<Resources, InProps, Composables, Name, Resource, CustomProps> & {
|
|
42
|
+
/** Set default values for layout props in a single call. */setDefaults: SetDefaultPropForResourceFn<Resources, InProps, Composables, Name, Resource, CustomProps>;
|
|
43
|
+
};
|
|
44
|
+
type SingleResourceLayoutSelection<Resources extends ReadonlyArray<ResourceDefinition>, CallbackName extends string> = { [Resource in LayoutResourceKey<Resources>]: Record<Resource, {
|
|
45
|
+
name?: string | ((resource: CapitalizedResource<Resource>) => CallbackName);
|
|
46
|
+
}> & Partial<Record<Exclude<LayoutResourceKey<Resources>, Resource>, never>> }[LayoutResourceKey<Resources>];
|
|
47
|
+
type SelectedResourceName<Selection, Resource extends string> = Selection extends Record<Resource, {
|
|
48
|
+
name?: infer Name;
|
|
49
|
+
}> ? Name extends ((...args: never[]) => infer CallbackName) ? NormalizeCapitalizedResourceName<CallbackName & string, Resource> : Name extends string ? Name : string : string;
|
|
50
|
+
type MappedResourceName<Names, CallbackName extends string, Resource extends string> = Names extends Record<Resource, infer Name> ? Name extends ((...args: never[]) => unknown) ? NormalizeCapitalizedResourceName<CallbackName, Resource> : Name & string : string;
|
|
51
|
+
/**
|
|
52
|
+
* Creates a layout builder with a resource-keyed default-name map.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* createResourceLayout.forResource({
|
|
56
|
+
* resource: 'users',
|
|
57
|
+
* name: {
|
|
58
|
+
* users: resource => `${resource}Page`,
|
|
59
|
+
* },
|
|
60
|
+
* })
|
|
61
|
+
*
|
|
62
|
+
* @param options The resource and its resource-keyed default name.
|
|
63
|
+
* @returns A layout builder bound to the selected resource.
|
|
64
|
+
*/
|
|
65
|
+
type ResourceLayoutNameMapFn<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, CustomProps extends InPropsObject, Resource extends LayoutResourceKey<Resources>> = <const CallbackName extends string, const Names>(options: {
|
|
66
|
+
resource: Resource;
|
|
67
|
+
name: SelectedResourceLayoutNames<LayoutResourceKey<Resources>, Resource, CallbackName> & AtLeastOneResourceLayoutNameKey<Resource> & Record<string, NonNullable<ResourceLayoutNames<LayoutResourceKey<Resources>, CallbackName>[LayoutResourceKey<Resources>]>>;
|
|
68
|
+
} & {
|
|
69
|
+
name: Names & Record<Exclude<keyof Names, Resource>, never>;
|
|
70
|
+
}) => ResourceLayoutBuilder<Resources, InProps, Composables, MappedResourceName<Names, CallbackName, Resource>, Resource, CustomProps>;
|
|
71
|
+
type ResourceLayoutNameMapFns<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, CustomProps extends InPropsObject> = UnionToIntersection<{ [Resource in LayoutResourceKey<Resources>]: ResourceLayoutNameMapFn<Resources, InProps, Composables, CustomProps, Resource> }[LayoutResourceKey<Resources>]>;
|
|
72
|
+
type CreateLayoutForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}, IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {}, CustomProps extends InPropsObject = {}> = {
|
|
73
|
+
/**
|
|
74
|
+
* Creates a layout builder for one resource without a default name.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* createResourceLayout.forResource('users')
|
|
78
|
+
*
|
|
79
|
+
* @param resource The resource to bind to the returned layout builder.
|
|
80
|
+
* @returns A layout builder bound to the selected resource.
|
|
81
|
+
*/
|
|
82
|
+
<const Resource extends LayoutResourceKey<Resources>>(resource: Resource): ResourceLayoutBuilder<Resources, InProps, Composables, string, Resource, CustomProps>;
|
|
83
|
+
/**
|
|
84
|
+
* Creates a layout builder with a capitalized-resource naming callback.
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* createResourceLayout.forResource({
|
|
88
|
+
* resource: 'users',
|
|
89
|
+
* name: resource => `${resource}Page`,
|
|
90
|
+
* })
|
|
91
|
+
*
|
|
92
|
+
* @param options The resource and its default-name callback.
|
|
93
|
+
* @returns A layout builder bound to the selected resource.
|
|
94
|
+
*/
|
|
95
|
+
<const Resource extends LayoutResourceKey<Resources>, const Name extends string>(options: {
|
|
96
|
+
name: (resource: CapitalizedResource<Resource>) => Name;
|
|
97
|
+
resource: Resource;
|
|
98
|
+
}): ResourceLayoutBuilder<Resources, InProps, Composables, NormalizeCapitalizedResourceName<Name, Resource>, Resource, CustomProps>;
|
|
99
|
+
/**
|
|
100
|
+
* Creates a layout builder from the existing resource-options notation.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* createResourceLayout.forResource({
|
|
104
|
+
* resource: 'users',
|
|
105
|
+
* name: 'UsersPage',
|
|
106
|
+
* })
|
|
107
|
+
*
|
|
108
|
+
* @param options The resource and its optional default name.
|
|
109
|
+
* @returns A layout builder bound to the selected resource.
|
|
110
|
+
*/
|
|
111
|
+
<const Resource extends LayoutResourceKey<Resources>, const Name extends string = string>(options: CreateLayoutForResourceOptions<Resources, Name, Resource>): ResourceLayoutBuilder<Resources, InProps, Composables, Name, Resource, CustomProps>;
|
|
112
|
+
/**
|
|
113
|
+
* Creates a layout builder from a single resource-keyed configuration.
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* createResourceLayout.forResource({
|
|
117
|
+
* users: { name: resource => `${resource}Page` },
|
|
118
|
+
* })
|
|
119
|
+
*
|
|
120
|
+
* @param options A single resource-keyed layout configuration.
|
|
121
|
+
* @returns A layout builder bound to the configured resource.
|
|
122
|
+
*/
|
|
123
|
+
<const CallbackName extends string, const Selection extends SingleResourceLayoutSelection<Resources, CallbackName>>(options: Selection): ResourceLayoutBuilder<Resources, InProps, Composables, SelectedResourceName<Selection, keyof Selection & LayoutResourceKey<Resources>>, keyof Selection & LayoutResourceKey<Resources>, CustomProps>;
|
|
124
|
+
} & ResourceLayoutNameMapFns<Resources, InProps, Composables, CustomProps>;
|
|
125
|
+
//#endregion
|
|
126
|
+
export { CreateLayoutForResource, CreateLayoutForResourceOptions, CreateResourceLayoutOptions, CreateResourceLayoutOptionsBase, CreatedLayoutForResource, SetDefaultPropForResourceFn };
|
|
127
|
+
//# sourceMappingURL=for-resource.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"for-resource.d.cts","names":[],"sources":["../../src/create-config/for-resource.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { UnionToIntersection, Updater } from "../utils.mjs";
|
|
2
|
+
import { LayoutResourceKey, ResourceDefinition } from "../resource.mjs";
|
|
3
|
+
import { InPropsDefinition, InPropsObject } from "../props.mjs";
|
|
4
|
+
import { LayoutIncludeProps, LayoutPropsForResource, ResourceLayoutComponent } from "./define-layout.mjs";
|
|
5
|
+
import { ComposableComponents } from "@jfdevelops/react-layout-composables";
|
|
6
|
+
|
|
7
|
+
//#region src/create-config/for-resource.d.ts
|
|
8
|
+
type LayoutPropDefaults = Record<string, unknown>;
|
|
9
|
+
type CreateTimeLayoutPropWithDefault<LayoutProps extends LayoutPropDefaults, Key extends keyof LayoutProps> = LayoutProps[Key] extends ((...args: unknown[]) => unknown) ? LayoutProps[Key] : Updater<LayoutProps[Key]>;
|
|
10
|
+
type ResolveLayoutPropsWithDefaults<LayoutProps extends LayoutPropDefaults, Defaults extends LayoutPropDefaults> = Omit<LayoutProps, keyof Defaults> & { [Key in keyof Defaults & keyof LayoutProps]?: CreateTimeLayoutPropWithDefault<LayoutProps, Key> };
|
|
11
|
+
type CreateResourceLayoutOptionsBase<Resources extends ReadonlyArray<ResourceDefinition>, Name extends string, Resource extends LayoutResourceKey<Resources>, Props extends InPropsObject = {}> = {
|
|
12
|
+
name: Name;
|
|
13
|
+
resource: Resource;
|
|
14
|
+
props?: Props;
|
|
15
|
+
};
|
|
16
|
+
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> & CreateResourceLayoutOptionsBase<Resources, Name, Resource, Props>;
|
|
17
|
+
type CreateLayoutForResourceOptions<Resources extends ReadonlyArray<ResourceDefinition>, Name extends string, Resource extends LayoutResourceKey<Resources>> = {
|
|
18
|
+
name?: Name;
|
|
19
|
+
resource: Resource;
|
|
20
|
+
};
|
|
21
|
+
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> & {
|
|
22
|
+
props?: Props;
|
|
23
|
+
};
|
|
24
|
+
type CreatedLayoutForResourceCallOptions<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, OverrideName extends string, Props extends InPropsObject, Defaults extends LayoutPropDefaults> = CreatedLayoutForResourceOptions<Resources, InProps, Composables, Props, Defaults> & {
|
|
25
|
+
name?: OverrideName;
|
|
26
|
+
};
|
|
27
|
+
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 = {}>(...args: {} extends CreatedLayoutForResourceCallOptions<Resources, InProps, Composables, OverrideName, Props, Defaults> ? [options?: CreatedLayoutForResourceCallOptions<Resources, InProps, Composables, OverrideName, Props, Defaults>] : [options: CreatedLayoutForResourceCallOptions<Resources, InProps, Composables, OverrideName, Props, Defaults>]) => ResourceLayoutComponent<OverrideName, CustomProps, Composables>;
|
|
28
|
+
type SetDefaultPropsForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}> = Partial<LayoutPropsForResource<Resources, InProps, Composables>>;
|
|
29
|
+
type ResolvedSetDefaultProps<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Defaults extends SetDefaultPropsForResource<Resources, InProps, Composables>> = { [Key in keyof Defaults & keyof LayoutPropsForResource<Resources, InProps, Composables>]: LayoutPropsForResource<Resources, InProps, Composables>[Key] };
|
|
30
|
+
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>>(/** Default values for layout props. Each prop can only be set once. */
|
|
31
|
+
|
|
32
|
+
defaults: Defaults) => CreatedLayoutForResource<Resources, InProps, Composables, Name, Resource, CustomProps, ResolvedSetDefaultProps<Resources, InProps, Composables, Defaults>>;
|
|
33
|
+
type CapitalizedResource<Resource extends string> = Resource extends Resource ? {
|
|
34
|
+
toLowerCase: () => Lowercase<Capitalize<Resource>>;
|
|
35
|
+
} & Capitalize<Resource> : never;
|
|
36
|
+
type ResourceLayoutNames<Resource extends string, CallbackName extends string> = { [TargetResource in Resource]?: string | ((resource: CapitalizedResource<TargetResource>) => CallbackName) };
|
|
37
|
+
type AtLeastOneResourceLayoutNameKey<Resource extends string> = { [TargetResource in Resource]: Record<TargetResource, unknown> & Partial<Record<Exclude<Resource, TargetResource>, unknown>> }[Resource];
|
|
38
|
+
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) };
|
|
39
|
+
type NormalizeCapitalizedResourceName<Name extends string, Resource extends string> = Name extends Name ? NormalizeCapitalizedResourceNameMatch<Name, Resource> extends infer Match extends string ? [Match] extends [never] ? Name : Match : never : never;
|
|
40
|
+
type NormalizeCapitalizedResourceNameMatch<Name extends string, Resource extends string> = Resource extends Resource ? Name extends `${CapitalizedResource<Resource>}${infer Suffix}` ? `${Capitalize<Resource>}${Suffix}` : never : never;
|
|
41
|
+
type ResourceLayoutBuilder<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, Name extends string, Resource extends LayoutResourceKey<Resources>, CustomProps extends InPropsObject> = CreatedLayoutForResource<Resources, InProps, Composables, Name, Resource, CustomProps> & {
|
|
42
|
+
/** Set default values for layout props in a single call. */setDefaults: SetDefaultPropForResourceFn<Resources, InProps, Composables, Name, Resource, CustomProps>;
|
|
43
|
+
};
|
|
44
|
+
type SingleResourceLayoutSelection<Resources extends ReadonlyArray<ResourceDefinition>, CallbackName extends string> = { [Resource in LayoutResourceKey<Resources>]: Record<Resource, {
|
|
45
|
+
name?: string | ((resource: CapitalizedResource<Resource>) => CallbackName);
|
|
46
|
+
}> & Partial<Record<Exclude<LayoutResourceKey<Resources>, Resource>, never>> }[LayoutResourceKey<Resources>];
|
|
47
|
+
type SelectedResourceName<Selection, Resource extends string> = Selection extends Record<Resource, {
|
|
48
|
+
name?: infer Name;
|
|
49
|
+
}> ? Name extends ((...args: never[]) => infer CallbackName) ? NormalizeCapitalizedResourceName<CallbackName & string, Resource> : Name extends string ? Name : string : string;
|
|
50
|
+
type MappedResourceName<Names, CallbackName extends string, Resource extends string> = Names extends Record<Resource, infer Name> ? Name extends ((...args: never[]) => unknown) ? NormalizeCapitalizedResourceName<CallbackName, Resource> : Name & string : string;
|
|
51
|
+
/**
|
|
52
|
+
* Creates a layout builder with a resource-keyed default-name map.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* createResourceLayout.forResource({
|
|
56
|
+
* resource: 'users',
|
|
57
|
+
* name: {
|
|
58
|
+
* users: resource => `${resource}Page`,
|
|
59
|
+
* },
|
|
60
|
+
* })
|
|
61
|
+
*
|
|
62
|
+
* @param options The resource and its resource-keyed default name.
|
|
63
|
+
* @returns A layout builder bound to the selected resource.
|
|
64
|
+
*/
|
|
65
|
+
type ResourceLayoutNameMapFn<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, CustomProps extends InPropsObject, Resource extends LayoutResourceKey<Resources>> = <const CallbackName extends string, const Names>(options: {
|
|
66
|
+
resource: Resource;
|
|
67
|
+
name: SelectedResourceLayoutNames<LayoutResourceKey<Resources>, Resource, CallbackName> & AtLeastOneResourceLayoutNameKey<Resource> & Record<string, NonNullable<ResourceLayoutNames<LayoutResourceKey<Resources>, CallbackName>[LayoutResourceKey<Resources>]>>;
|
|
68
|
+
} & {
|
|
69
|
+
name: Names & Record<Exclude<keyof Names, Resource>, never>;
|
|
70
|
+
}) => ResourceLayoutBuilder<Resources, InProps, Composables, MappedResourceName<Names, CallbackName, Resource>, Resource, CustomProps>;
|
|
71
|
+
type ResourceLayoutNameMapFns<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents, CustomProps extends InPropsObject> = UnionToIntersection<{ [Resource in LayoutResourceKey<Resources>]: ResourceLayoutNameMapFn<Resources, InProps, Composables, CustomProps, Resource> }[LayoutResourceKey<Resources>]>;
|
|
72
|
+
type CreateLayoutForResource<Resources extends ReadonlyArray<ResourceDefinition>, InProps extends InPropsDefinition<Resources>, Composables extends ComposableComponents = {}, IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {}, CustomProps extends InPropsObject = {}> = {
|
|
73
|
+
/**
|
|
74
|
+
* Creates a layout builder for one resource without a default name.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* createResourceLayout.forResource('users')
|
|
78
|
+
*
|
|
79
|
+
* @param resource The resource to bind to the returned layout builder.
|
|
80
|
+
* @returns A layout builder bound to the selected resource.
|
|
81
|
+
*/
|
|
82
|
+
<const Resource extends LayoutResourceKey<Resources>>(resource: Resource): ResourceLayoutBuilder<Resources, InProps, Composables, string, Resource, CustomProps>;
|
|
83
|
+
/**
|
|
84
|
+
* Creates a layout builder with a capitalized-resource naming callback.
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* createResourceLayout.forResource({
|
|
88
|
+
* resource: 'users',
|
|
89
|
+
* name: resource => `${resource}Page`,
|
|
90
|
+
* })
|
|
91
|
+
*
|
|
92
|
+
* @param options The resource and its default-name callback.
|
|
93
|
+
* @returns A layout builder bound to the selected resource.
|
|
94
|
+
*/
|
|
95
|
+
<const Resource extends LayoutResourceKey<Resources>, const Name extends string>(options: {
|
|
96
|
+
name: (resource: CapitalizedResource<Resource>) => Name;
|
|
97
|
+
resource: Resource;
|
|
98
|
+
}): ResourceLayoutBuilder<Resources, InProps, Composables, NormalizeCapitalizedResourceName<Name, Resource>, Resource, CustomProps>;
|
|
99
|
+
/**
|
|
100
|
+
* Creates a layout builder from the existing resource-options notation.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* createResourceLayout.forResource({
|
|
104
|
+
* resource: 'users',
|
|
105
|
+
* name: 'UsersPage',
|
|
106
|
+
* })
|
|
107
|
+
*
|
|
108
|
+
* @param options The resource and its optional default name.
|
|
109
|
+
* @returns A layout builder bound to the selected resource.
|
|
110
|
+
*/
|
|
111
|
+
<const Resource extends LayoutResourceKey<Resources>, const Name extends string = string>(options: CreateLayoutForResourceOptions<Resources, Name, Resource>): ResourceLayoutBuilder<Resources, InProps, Composables, Name, Resource, CustomProps>;
|
|
112
|
+
/**
|
|
113
|
+
* Creates a layout builder from a single resource-keyed configuration.
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* createResourceLayout.forResource({
|
|
117
|
+
* users: { name: resource => `${resource}Page` },
|
|
118
|
+
* })
|
|
119
|
+
*
|
|
120
|
+
* @param options A single resource-keyed layout configuration.
|
|
121
|
+
* @returns A layout builder bound to the configured resource.
|
|
122
|
+
*/
|
|
123
|
+
<const CallbackName extends string, const Selection extends SingleResourceLayoutSelection<Resources, CallbackName>>(options: Selection): ResourceLayoutBuilder<Resources, InProps, Composables, SelectedResourceName<Selection, keyof Selection & LayoutResourceKey<Resources>>, keyof Selection & LayoutResourceKey<Resources>, CustomProps>;
|
|
124
|
+
} & ResourceLayoutNameMapFns<Resources, InProps, Composables, CustomProps>;
|
|
125
|
+
//#endregion
|
|
126
|
+
export { CreateLayoutForResource, CreateLayoutForResourceOptions, CreateResourceLayoutOptions, CreateResourceLayoutOptionsBase, CreatedLayoutForResource, SetDefaultPropForResourceFn };
|
|
127
|
+
//# sourceMappingURL=for-resource.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"for-resource.d.mts","names":[],"sources":["../../src/create-config/for-resource.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { capitalize } from "../utils/capitalize.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/create-config/for-resource.ts
|
|
4
|
+
function createForResource({ createResourceLayout, resolveLayoutOptionDefaults }) {
|
|
5
|
+
function createLayoutForResource(defaultName, resource, defaults) {
|
|
6
|
+
return ((layoutOptions = {}) => {
|
|
7
|
+
const { name, ...options } = layoutOptions;
|
|
8
|
+
return createResourceLayout({
|
|
9
|
+
...defaults,
|
|
10
|
+
name: name ?? defaultName,
|
|
11
|
+
resource,
|
|
12
|
+
...resolveLayoutOptionDefaults(defaults, options)
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
function createLayoutForResourceBuilder(defaultName, resource) {
|
|
17
|
+
const createLayout = createLayoutForResource(defaultName, resource, {});
|
|
18
|
+
const setDefaults = ((defaults) => createLayoutForResource(defaultName, resource, defaults));
|
|
19
|
+
return Object.assign(createLayout, { setDefaults });
|
|
20
|
+
}
|
|
21
|
+
const forResource = ((resourceOrOptions) => {
|
|
22
|
+
let name;
|
|
23
|
+
let resource;
|
|
24
|
+
if (typeof resourceOrOptions === "string") resource = resourceOrOptions;
|
|
25
|
+
else if (resourceOrOptions !== null && typeof resourceOrOptions === "object" && ("resource" in resourceOrOptions || "name" in resourceOrOptions)) ({name, resource} = resourceOrOptions);
|
|
26
|
+
else {
|
|
27
|
+
const [selection] = Object.entries(resourceOrOptions ?? {});
|
|
28
|
+
if (selection) {
|
|
29
|
+
const [selectedResource, options] = selection;
|
|
30
|
+
resource = selectedResource;
|
|
31
|
+
name = options.name;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (!resource) throw new Error("\"resource\" is required when calling \"forResource\"");
|
|
35
|
+
const selectedName = name !== null && typeof name === "object" ? name[resource] : name;
|
|
36
|
+
let defaultName;
|
|
37
|
+
if (typeof selectedName === "function") defaultName = selectedName(capitalize(resource));
|
|
38
|
+
else if (typeof selectedName === "string") defaultName = selectedName;
|
|
39
|
+
return createLayoutForResourceBuilder(defaultName, resource);
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
createLayoutForResourceBuilder,
|
|
43
|
+
forResource
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
//#endregion
|
|
48
|
+
export { createForResource };
|
|
49
|
+
//# sourceMappingURL=for-resource.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"for-resource.mjs","names":[],"sources":["../../src/create-config/for-resource.ts"],"sourcesContent":["import type { ComposableComponents } from '@jfdevelops/react-layout-composables';\nimport type {\n InPropsDefinition,\n InPropsObject,\n} from '../props';\nimport type {\n LayoutResourceKey,\n ResourceDefinition,\n} from '../resource';\nimport type { UnionToIntersection, Updater } from '../utils';\nimport { capitalize } from '../utils/capitalize';\nimport type {\n LayoutIncludeProps,\n LayoutPropsForResource,\n ResourceLayoutComponent,\n} from './define-layout';\n\ntype LayoutPropDefaults = Record<string, unknown>;\n\ntype CreateTimeLayoutPropWithDefault<\n LayoutProps extends LayoutPropDefaults,\n Key extends keyof LayoutProps,\n> = LayoutProps[Key] extends (...args: unknown[]) => unknown\n ? LayoutProps[Key]\n : Updater<LayoutProps[Key]>;\n\ntype ResolveLayoutPropsWithDefaults<\n LayoutProps extends LayoutPropDefaults,\n Defaults extends LayoutPropDefaults,\n> = Omit<LayoutProps, keyof Defaults> & {\n [Key in keyof Defaults & keyof LayoutProps]?: CreateTimeLayoutPropWithDefault<\n LayoutProps,\n Key\n >;\n};\n\nexport type CreateResourceLayoutOptionsBase<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n> = {\n name: Name;\n resource: Resource;\n props?: Props;\n};\n\nexport type CreateResourceLayoutOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n> = LayoutPropsForResource<Resources, InProps, Composables> &\n CreateResourceLayoutOptionsBase<Resources, Name, Resource, Props>;\n\nexport type CreateLayoutForResourceOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n> = {\n name?: Name;\n resource: Resource;\n};\n\ntype CreatedLayoutForResourceOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Props extends InPropsObject = {},\n Defaults extends LayoutPropDefaults = {},\n> = ResolveLayoutPropsWithDefaults<\n LayoutPropsForResource<Resources, InProps, Composables>,\n Defaults\n> & {\n props?: Props;\n};\n\ntype CreatedLayoutForResourceCallOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n OverrideName extends string,\n Props extends InPropsObject,\n Defaults extends LayoutPropDefaults,\n> = CreatedLayoutForResourceOptions<\n Resources,\n InProps,\n Composables,\n Props,\n Defaults\n> & {\n name?: OverrideName;\n};\n\nexport type CreatedLayoutForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n CustomProps extends InPropsObject = {},\n Defaults extends LayoutPropDefaults = {},\n> = <OverrideName extends string = Name, Props extends InPropsObject = {}>(\n ...args: {} extends CreatedLayoutForResourceCallOptions<\n Resources,\n InProps,\n Composables,\n OverrideName,\n Props,\n Defaults\n >\n ? [options?: CreatedLayoutForResourceCallOptions<\n Resources,\n InProps,\n Composables,\n OverrideName,\n Props,\n Defaults\n >]\n : [options: CreatedLayoutForResourceCallOptions<\n Resources,\n InProps,\n Composables,\n OverrideName,\n Props,\n Defaults\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 [Key in keyof Defaults &\n keyof LayoutPropsForResource<\n Resources,\n InProps,\n Composables\n >]: LayoutPropsForResource<Resources, InProps, Composables>[Key];\n};\n\nexport type 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<\n Resources,\n InProps,\n Composables\n >,\n>(\n /** Default values for layout props. Each prop can only be set once. */\n defaults: Defaults,\n) => CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps,\n ResolvedSetDefaultProps<Resources, InProps, Composables, Defaults>\n>;\n\ntype CapitalizedResource<Resource extends string> =\n Resource extends Resource\n ? {\n toLowerCase: () => Lowercase<Capitalize<Resource>>;\n } & Capitalize<Resource>\n : never;\n\ntype ResourceLayoutNames<\n Resource extends string,\n CallbackName extends string,\n> = {\n [TargetResource in Resource]?:\n | string\n | ((resource: CapitalizedResource<TargetResource>) => CallbackName);\n};\n\ntype AtLeastOneResourceLayoutNameKey<Resource extends string> = {\n [TargetResource in Resource]: Record<TargetResource, unknown> &\n Partial<Record<Exclude<Resource, TargetResource>, unknown>>;\n}[Resource];\n\ntype SelectedResourceLayoutNames<\n Resource extends string,\n SelectedResource extends Resource,\n CallbackName extends string,\n> = {\n [TargetResource in Resource as TargetResource extends SelectedResource\n ? TargetResource\n : never]?:\n | string\n | ((resource: CapitalizedResource<TargetResource>) => CallbackName);\n};\n\ntype NormalizeCapitalizedResourceName<\n Name extends string,\n Resource extends string,\n> = Name extends Name\n ? NormalizeCapitalizedResourceNameMatch<\n Name,\n Resource\n > extends infer Match extends string\n ? [Match] extends [never]\n ? Name\n : Match\n : never\n : never;\n\ntype NormalizeCapitalizedResourceNameMatch<\n Name extends string,\n Resource extends string,\n> = Resource extends Resource\n ? Name extends `${CapitalizedResource<Resource>}${infer Suffix}`\n ? `${Capitalize<Resource>}${Suffix}`\n : never\n : never;\n\ntype ResourceLayoutBuilder<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n CustomProps extends InPropsObject,\n> = CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n> & {\n /** Set default values for layout props in a single call. */\n setDefaults: SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n >;\n};\n\ntype SingleResourceLayoutSelection<\n Resources extends ReadonlyArray<ResourceDefinition>,\n CallbackName extends string,\n> = {\n [Resource in LayoutResourceKey<Resources>]: Record<\n Resource,\n {\n name?:\n | string\n | ((resource: CapitalizedResource<Resource>) => CallbackName);\n }\n > &\n Partial<\n Record<\n Exclude<LayoutResourceKey<Resources>, Resource>,\n never\n >\n >;\n}[LayoutResourceKey<Resources>];\n\ntype SelectedResourceName<Selection, Resource extends string> =\n Selection extends Record<Resource, { name?: infer Name }>\n ? Name extends (...args: never[]) => infer CallbackName\n ? NormalizeCapitalizedResourceName<CallbackName & string, Resource>\n : Name extends string\n ? Name\n : string\n : string;\n\ntype MappedResourceName<\n Names,\n CallbackName extends string,\n Resource extends string,\n> = Names extends Record<Resource, infer Name>\n ? Name extends (...args: never[]) => unknown\n ? NormalizeCapitalizedResourceName<CallbackName, Resource>\n : Name & string\n : string;\n\n/**\n * Creates a layout builder with a resource-keyed default-name map.\n *\n * @example\n * createResourceLayout.forResource({\n * resource: 'users',\n * name: {\n * users: resource => `${resource}Page`,\n * },\n * })\n *\n * @param options The resource and its resource-keyed default name.\n * @returns A layout builder bound to the selected resource.\n */\ntype ResourceLayoutNameMapFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n CustomProps extends InPropsObject,\n Resource extends LayoutResourceKey<Resources>,\n> = <const CallbackName extends string, const Names>(\n options: {\n resource: Resource;\n name: SelectedResourceLayoutNames<\n LayoutResourceKey<Resources>,\n Resource,\n CallbackName\n > &\n AtLeastOneResourceLayoutNameKey<Resource> &\n Record<\n string,\n NonNullable<\n ResourceLayoutNames<\n LayoutResourceKey<Resources>,\n CallbackName\n >[LayoutResourceKey<Resources>]\n >\n >;\n } & {\n name: Names & Record<Exclude<keyof Names, Resource>, never>;\n },\n) => ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n MappedResourceName<Names, CallbackName, Resource>,\n Resource,\n CustomProps\n>;\n\ntype ResourceLayoutNameMapFns<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n CustomProps extends InPropsObject,\n> = UnionToIntersection<\n {\n [Resource in LayoutResourceKey<Resources>]: ResourceLayoutNameMapFn<\n Resources,\n InProps,\n Composables,\n CustomProps,\n Resource\n >;\n }[LayoutResourceKey<Resources>]\n>;\n\nexport type CreateLayoutForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents = {},\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {},\n CustomProps extends InPropsObject = {},\n> = {\n /**\n * Creates a layout builder for one resource without a default name.\n *\n * @example\n * createResourceLayout.forResource('users')\n *\n * @param resource The resource to bind to the returned layout builder.\n * @returns A layout builder bound to the selected resource.\n */\n <const Resource extends LayoutResourceKey<Resources>>(\n resource: Resource,\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n string,\n Resource,\n CustomProps\n >;\n\n /**\n * Creates a layout builder with a capitalized-resource naming callback.\n *\n * @example\n * createResourceLayout.forResource({\n * resource: 'users',\n * name: resource => `${resource}Page`,\n * })\n *\n * @param options The resource and its default-name callback.\n * @returns A layout builder bound to the selected resource.\n */\n <\n const Resource extends LayoutResourceKey<Resources>,\n const Name extends string,\n >(\n options: {\n name: (resource: CapitalizedResource<Resource>) => Name;\n resource: Resource;\n },\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n NormalizeCapitalizedResourceName<Name, Resource>,\n Resource,\n CustomProps\n >;\n\n /**\n * Creates a layout builder from the existing resource-options notation.\n *\n * @example\n * createResourceLayout.forResource({\n * resource: 'users',\n * name: 'UsersPage',\n * })\n *\n * @param options The resource and its optional default name.\n * @returns A layout builder bound to the selected resource.\n */\n <\n const Resource extends LayoutResourceKey<Resources>,\n const Name extends string = string,\n >(\n options: CreateLayoutForResourceOptions<Resources, Name, Resource>,\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n >;\n\n /**\n * Creates a layout builder from a single resource-keyed configuration.\n *\n * @example\n * createResourceLayout.forResource({\n * users: { name: resource => `${resource}Page` },\n * })\n *\n * @param options A single resource-keyed layout configuration.\n * @returns A layout builder bound to the configured resource.\n */\n <\n const CallbackName extends string,\n const Selection extends SingleResourceLayoutSelection<\n Resources,\n CallbackName\n >,\n >(\n options: Selection,\n ): ResourceLayoutBuilder<\n Resources,\n InProps,\n Composables,\n SelectedResourceName<\n Selection,\n keyof Selection & LayoutResourceKey<Resources>\n >,\n keyof Selection & LayoutResourceKey<Resources>,\n CustomProps\n >;\n} & ResourceLayoutNameMapFns<\n Resources,\n InProps,\n Composables,\n CustomProps\n>;\n\ntype CreateForResourceOptions = {\n createResourceLayout: (options: Record<string, unknown>) => unknown;\n resolveLayoutOptionDefaults: (\n defaults: Record<string, unknown>,\n options: Record<string, unknown>,\n ) => Record<string, unknown>;\n};\n\nexport function createForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n CustomProps extends InPropsObject,\n>({\n createResourceLayout,\n resolveLayoutOptionDefaults,\n}: CreateForResourceOptions) {\n function createLayoutForResource<\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Defaults extends LayoutPropDefaults,\n >(\n defaultName: Name | undefined,\n resource: Resource,\n defaults: Record<string, unknown>,\n ) {\n return ((\n layoutOptions: { name?: string } & Record<string, unknown> = {},\n ) => {\n const { name, ...options } = layoutOptions;\n\n return createResourceLayout({\n ...defaults,\n name: name ?? defaultName,\n resource,\n ...resolveLayoutOptionDefaults(defaults, options),\n });\n }) as CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps,\n Defaults\n >;\n }\n\n function createLayoutForResourceBuilder<\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n >(defaultName: Name | undefined, resource: Resource) {\n const createLayout = createLayoutForResource(defaultName, resource, {});\n const setDefaults = ((defaults) =>\n createLayoutForResource(\n defaultName,\n resource,\n defaults,\n )) as SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n >;\n\n return Object.assign(createLayout, { setDefaults });\n }\n\n const forResource = ((resourceOrOptions: unknown) => {\n type ResourceName =\n | string\n | ((resource: CapitalizedResource<LayoutResourceKey<Resources>>) => string);\n let name:\n | ResourceName\n | Partial<Record<LayoutResourceKey<Resources>, ResourceName>>\n | undefined;\n let resource: LayoutResourceKey<Resources> | undefined;\n\n if (typeof resourceOrOptions === 'string') {\n resource = resourceOrOptions as LayoutResourceKey<Resources>;\n } else if (\n resourceOrOptions !== null &&\n typeof resourceOrOptions === 'object' &&\n ('resource' in resourceOrOptions || 'name' in resourceOrOptions)\n ) {\n ({ name, resource } = resourceOrOptions as {\n name?: typeof name;\n resource?: LayoutResourceKey<Resources>;\n });\n } else {\n const [selection] = Object.entries(resourceOrOptions ?? {});\n\n if (selection) {\n const [selectedResource, options] = selection;\n resource = selectedResource as LayoutResourceKey<Resources>;\n name = (options as { name?: typeof name }).name;\n }\n }\n\n if (!resource) {\n throw new Error('\"resource\" is required when calling \"forResource\"');\n }\n\n const selectedName =\n name !== null && typeof name === 'object' ? name[resource] : name;\n let defaultName: string | undefined;\n\n if (typeof selectedName === 'function') {\n defaultName = selectedName(\n capitalize(resource) as CapitalizedResource<\n LayoutResourceKey<Resources>\n >,\n );\n } else if (typeof selectedName === 'string') {\n defaultName = selectedName;\n }\n\n return createLayoutForResourceBuilder(defaultName, resource);\n }) as CreateLayoutForResource<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n >;\n\n return { createLayoutForResourceBuilder, forResource };\n}\n"],"mappings":";;;AA4eA,SAAgB,kBAMd,EACA,sBACA,+BAC2B;CAC3B,SAAS,wBAKP,aACA,UACA,UACA;EACA,SACE,gBAA6D,CAAC,MAC3D;GACH,MAAM,EAAE,MAAM,GAAG,YAAY;GAE7B,OAAO,qBAAqB;IAC1B,GAAG;IACH,MAAM,QAAQ;IACd;IACA,GAAG,4BAA4B,UAAU,OAAO;GAClD,CAAC;EACH;CASF;CAEA,SAAS,+BAGP,aAA+B,UAAoB;EACnD,MAAM,eAAe,wBAAwB,aAAa,UAAU,CAAC,CAAC;EACtE,MAAM,gBAAgB,aACpB,wBACE,aACA,UACA,QACF;EASF,OAAO,OAAO,OAAO,cAAc,EAAE,YAAY,CAAC;CACpD;CAEA,MAAM,gBAAgB,sBAA+B;EAInD,IAAI;EAIJ,IAAI;EAEJ,IAAI,OAAO,sBAAsB,UAC/B,WAAW;OACN,IACL,sBAAsB,QACtB,OAAO,sBAAsB,aAC5B,cAAc,qBAAqB,UAAU,oBAE9C,CAAC,CAAE,MAAM,YAAa;OAIjB;GACL,MAAM,CAAC,aAAa,OAAO,QAAQ,qBAAqB,CAAC,CAAC;GAE1D,IAAI,WAAW;IACb,MAAM,CAAC,kBAAkB,WAAW;IACpC,WAAW;IACX,OAAQ,QAAmC;GAC7C;EACF;EAEA,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,uDAAmD;EAGrE,MAAM,eACJ,SAAS,QAAQ,OAAO,SAAS,WAAW,KAAK,YAAY;EAC/D,IAAI;EAEJ,IAAI,OAAO,iBAAiB,YAC1B,cAAc,aACZ,WAAW,QAAQ,CAGrB;OACK,IAAI,OAAO,iBAAiB,UACjC,cAAc;EAGhB,OAAO,+BAA+B,aAAa,QAAQ;CAC7D;CAQA,OAAO;EAAE;EAAgC;CAAY;AACvD"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const require_capitalize = require('../utils/capitalize.cjs');
|
|
2
|
+
|
|
3
|
+
//#region src/create-config/for-resources.ts
|
|
4
|
+
function createForResources({ createLayoutForResource, createMakeComposableLayout, createResourceLayout }) {
|
|
5
|
+
return ((...resourcesOrOptions) => {
|
|
6
|
+
const firstArgument = resourcesOrOptions[0];
|
|
7
|
+
let resourceOptions;
|
|
8
|
+
if (typeof firstArgument === "string") resourceOptions = resourcesOrOptions.map((resource) => ({ resource }));
|
|
9
|
+
else if (firstArgument !== null && typeof firstArgument === "object" && "resources" in firstArgument && Array.isArray(firstArgument.resources)) {
|
|
10
|
+
const { name, resources } = firstArgument;
|
|
11
|
+
resourceOptions = resources.map((resource) => ({
|
|
12
|
+
name: typeof name === "function" ? name : name?.[resource],
|
|
13
|
+
resource
|
|
14
|
+
}));
|
|
15
|
+
} else resourceOptions = Object.entries(firstArgument ?? {}).map(([resource, options]) => ({
|
|
16
|
+
...options,
|
|
17
|
+
resource
|
|
18
|
+
}));
|
|
19
|
+
const defaultNames = new Map(resourceOptions.map(({ name, resource }) => [resource, typeof name === "function" ? name(require_capitalize.capitalize(resource)) : name]));
|
|
20
|
+
function scopedCreateResourceLayout(options) {
|
|
21
|
+
const resource = options.resource;
|
|
22
|
+
return createResourceLayout({
|
|
23
|
+
...options,
|
|
24
|
+
name: options.name ?? defaultNames.get(resource)
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function scopedForResource(options) {
|
|
28
|
+
return createLayoutForResource(options.name ?? defaultNames.get(options.resource), options.resource);
|
|
29
|
+
}
|
|
30
|
+
const scopedExtras = { forResource: scopedForResource };
|
|
31
|
+
if (createMakeComposableLayout) {
|
|
32
|
+
const makeComposableLayout = createMakeComposableLayout();
|
|
33
|
+
scopedExtras.makeComposable = (options) => {
|
|
34
|
+
const resource = options.resource;
|
|
35
|
+
return makeComposableLayout({
|
|
36
|
+
...options,
|
|
37
|
+
name: options.name ?? defaultNames.get(resource)
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return Object.assign(scopedCreateResourceLayout, scopedExtras);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
//#endregion
|
|
46
|
+
exports.createForResources = createForResources;
|
|
47
|
+
//# sourceMappingURL=for-resources.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"for-resources.cjs","names":["capitalize"],"sources":["../../src/create-config/for-resources.ts"],"sourcesContent":["import type {\n ComposableComponents,\n ComposableResourceLayout,\n} from '@jfdevelops/react-layout-composables';\nimport type {\n InPropsDefinition,\n InPropsObject,\n} from '../props';\nimport type {\n LayoutResourceKey,\n ResourceDefinition,\n} from '../resource';\nimport { capitalize } from '../utils/capitalize';\nimport type {\n LayoutIncludeProps,\n LayoutPropsForResource,\n ResourceLayoutComponent,\n} from './define-layout';\nimport type {\n CreatedLayoutForResource,\n CreateLayoutForResourceOptions,\n CreateResourceLayoutOptionsBase,\n SetDefaultPropForResourceFn,\n} from './for-resource';\n\ntype CapitalizedResource<Resource extends string> =\n Resource extends Resource\n ? {\n toLowerCase: () => Lowercase<Capitalize<Resource>>;\n } & Capitalize<Resource>\n : never;\n\ntype ResourceLayoutName<\n Resource extends string,\n Name extends string = string,\n> = Name | ((resource: CapitalizedResource<Resource>) => Name);\n\ntype ResourceLayoutNames<\n Resource extends string,\n CallbackName extends string = string,\n> = {\n [TargetResource in Resource]?:\n | string\n | ((resource: CapitalizedResource<TargetResource>) => CallbackName);\n};\n\ntype AtLeastOneResourceLayoutNameKey<Resource extends string> = {\n [TargetResource in Resource]: Record<TargetResource, unknown> &\n Partial<Record<Exclude<Resource, TargetResource>, unknown>>;\n}[Resource];\n\ntype SelectedResourceLayoutNames<\n Resource extends string,\n SelectedResource extends Resource,\n CallbackName extends string,\n> = {\n [TargetResource in Resource as TargetResource extends SelectedResource\n ? TargetResource\n : never]?:\n | string\n | ((resource: CapitalizedResource<TargetResource>) => CallbackName);\n};\n\ntype ResourcesLayoutName<Resource extends string> =\n | Exclude<ResourceLayoutName<Resource>, string>\n | ResourceLayoutNames<Resource>;\n\ntype ResourceLayoutSelection<\n Resources extends ReadonlyArray<ResourceDefinition>,\n CallbackName extends string = string,\n> = {\n [Resource in LayoutResourceKey<Resources>]?: {\n name?:\n | string\n | ((resource: CapitalizedResource<Resource>) => CallbackName);\n };\n};\n\ntype AtLeastOneResourceLayoutSelection<\n Resources extends ReadonlyArray<ResourceDefinition>,\n CallbackName extends string,\n> = {\n [Resource in LayoutResourceKey<Resources>]: Required<\n Pick<ResourceLayoutSelection<Resources, CallbackName>, Resource>\n > &\n Omit<ResourceLayoutSelection<Resources, CallbackName>, Resource>;\n}[LayoutResourceKey<Resources>];\n\ntype SelectedLayoutResources<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Arguments extends ReadonlyArray<unknown>,\n> = Arguments extends ReadonlyArray<LayoutResourceKey<Resources>>\n ? Arguments[number]\n : Arguments[0] extends {\n resources: ReadonlyArray<infer Resource>;\n }\n ? Resource & LayoutResourceKey<Resources>\n : keyof Arguments[0] & LayoutResourceKey<Resources>;\n\ntype ResolveResourceLayoutName<Name> =\n Name extends (...args: never[]) => infer Result\n ? Result & string\n : Name extends string\n ? Name\n : string;\n\ntype NormalizeCapitalizedResourceName<\n Name extends string,\n Resource extends string,\n> = Name extends Name\n ? NormalizeCapitalizedResourceNameMatch<Name, Resource> extends infer Match\n ? [Match] extends [never]\n ? Name\n : Match\n : never\n : never;\n\ntype NormalizeCapitalizedResourceNameMatch<\n Name extends string,\n Resource extends string,\n> = Resource extends Resource\n ? Name extends `${CapitalizedResource<Resource>}${infer Suffix}`\n ? `${Capitalize<Resource>}${Suffix}`\n : never\n : never;\n\ntype SelectedResourceLayoutName<\n Arguments,\n Resource extends string,\n> = Arguments extends ReadonlyArray<string>\n ? string\n : Arguments extends readonly [infer Options]\n ? Options extends {\n resources: ReadonlyArray<string>;\n name?: infer Name;\n }\n ? Name extends (...args: never[]) => unknown\n ? ResolveResourceLayoutName<Name>\n : Name extends Record<Resource, infer ResourceName>\n ? ResolveResourceLayoutName<ResourceName>\n : string\n : Options extends Record<Resource, infer ResourceOptions>\n ? ResourceOptions extends { name?: infer Name }\n ? ResolveResourceLayoutName<Name>\n : string\n : string\n : string;\n\ntype NormalizeResourceLayoutNames<\n Names,\n CallbackName extends string,\n> = {\n [Resource in keyof Names]: Names[Resource] extends (\n ...args: never[]\n ) => unknown\n ? (\n resource: CapitalizedResource<Resource & string>,\n ) => NormalizeCapitalizedResourceName<\n CallbackName,\n Resource & string\n >\n : Names[Resource];\n};\n\ntype NormalizeResourceLayoutSelection<Selection> = {\n [Resource in keyof Selection]: Selection[Resource] extends {\n name: infer Name;\n }\n ? {\n name: Name extends (...args: never[]) => unknown\n ? (\n resource: CapitalizedResource<Resource & string>,\n ) => NormalizeCapitalizedResourceName<\n ResolveResourceLayoutName<Name>,\n Resource & string\n >\n : Name;\n }\n : Selection[Resource];\n};\n\ntype SharedResourceLayoutArguments<\n Resources extends ReadonlyArray<ResourceDefinition>,\n ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n Name extends string,\n> = readonly [\n {\n resources: ResourceKeys;\n name: (\n resource: CapitalizedResource<ResourceKeys[number]>,\n ) => NormalizeCapitalizedResourceName<Name, ResourceKeys[number]>;\n },\n];\n\ntype MappedResourceLayoutArguments<\n Resources extends ReadonlyArray<ResourceDefinition>,\n ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n Names,\n CallbackName extends string,\n> = readonly [\n {\n resources: ResourceKeys;\n name: NormalizeResourceLayoutNames<Names, CallbackName>;\n },\n];\n\ntype SelectedResourceLayoutArguments<Selection> = readonly [\n NormalizeResourceLayoutSelection<Selection>,\n];\n\ntype HasResourceLayoutName<Arguments, Resource extends string> =\n Arguments extends ReadonlyArray<string>\n ? false\n : Arguments extends readonly [infer Options]\n ? Options extends {\n resources: ReadonlyArray<string>;\n name: infer Name;\n }\n ? Name extends (...args: never[]) => unknown\n ? true\n : Name extends Record<Resource, unknown>\n ? true\n : false\n : Options extends Record<Resource, infer ResourceOptions>\n ? 'name' extends keyof ResourceOptions\n ? true\n : false\n : false\n : false;\n\ntype ScopedCreateResourceLayoutOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n Name extends string,\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Props extends InPropsObject,\n> = LayoutPropsForResource<Resources, InProps, Composables> &\n {\n resource: Resource;\n props?: Props;\n } & (HasResourceLayoutName<Arguments, Resource> extends true\n ? { name?: Name }\n : { name: Name });\n\ntype ScopedCreateResourceLayoutFnImpl<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n CustomProps extends InPropsObject,\n> = <\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Name extends string = SelectedResourceLayoutName<Arguments, Resource>,\n Props extends InPropsObject = {},\n>(\n options: ScopedCreateResourceLayoutOptions<\n Resources,\n InProps,\n Composables,\n Arguments,\n Name,\n Resource,\n Props\n >,\n) => ResourceLayoutComponent<Name, CustomProps, Composables>;\n\ntype ScopedCreateLayoutForResource<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n CustomProps extends InPropsObject,\n> = <\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Name extends string = SelectedResourceLayoutName<Arguments, Resource>,\n>(\n options: CreateLayoutForResourceOptions<Resources, Name, Resource>,\n) => CreatedLayoutForResource<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n> & {\n setDefaults: SetDefaultPropForResourceFn<\n Resources,\n InProps,\n Composables,\n Name,\n Resource,\n CustomProps\n >;\n};\n\ntype ScopedCreateResourceLayoutMakeComposableFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n> = <\n Resource extends SelectedLayoutResources<Resources, Arguments>,\n Name extends string = SelectedResourceLayoutName<Arguments, Resource>,\n Props extends InPropsObject = {},\n>(\n options: Omit<\n CreateResourceLayoutOptionsBase<Resources, Name, Resource>,\n 'name'\n > &\n Partial<LayoutPropsForResource<Resources, InProps, Composables>> & {\n props?: Props;\n } & (HasResourceLayoutName<Arguments, Resource> extends true\n ? { name?: Name }\n : { name: Name }),\n) => ComposableResourceLayout<Composables, Name, any, any, any>;\n\ntype ScopedCreateResourceLayoutFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n Arguments extends ReadonlyArray<unknown>,\n CustomProps extends InPropsObject,\n> = ScopedCreateResourceLayoutFnImpl<\n Resources,\n InProps,\n Composables,\n Arguments,\n CustomProps\n> & {\n forResource: ScopedCreateLayoutForResource<\n Resources,\n InProps,\n Composables,\n Arguments,\n CustomProps\n >;\n} & ([keyof Composables] extends [never]\n ? {}\n : {\n makeComposable: ScopedCreateResourceLayoutMakeComposableFn<\n Resources,\n InProps,\n Composables,\n Arguments\n >;\n });\n\nexport type CreateResourceLayoutForResourcesFn<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents = {},\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables> = {},\n CustomProps extends InPropsObject = {},\n> = {\n /**\n * Creates a layout factory scoped to the listed resources.\n *\n * Layout names must be supplied when a layout is created.\n *\n * @example\n * createResourceLayout.forResources('users', 'admins')\n *\n * @param resources Resources available from the returned layout factory.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends readonly [\n LayoutResourceKey<Resources>,\n ...Array<LayoutResourceKey<Resources>>,\n ],\n >(\n ...resources: ResourceKeys\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n ResourceKeys,\n CustomProps\n >;\n\n /**\n * Creates a layout factory scoped to a resource list without default names.\n *\n * @example\n * createResourceLayout.forResources({ resources: ['users', 'admins'] })\n *\n * @param options The resources to expose without configured default names.\n * @returns A layout factory scoped to the selected resources.\n */\n <const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>>(\n options: { resources: ResourceKeys; name?: never },\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n readonly [{ resources: ResourceKeys }],\n CustomProps\n >;\n\n /**\n * Creates a scoped layout factory with optional default names per resource.\n *\n * Each map key is limited to the resources selected in `resources`. Values\n * can be strings or callbacks receiving that resource's capitalized name.\n *\n * @example\n * createResourceLayout.forResources({\n * resources: ['users', 'admins'],\n * name: {\n * users: resource => `${resource}Page`,\n * admins: 'AdminDirectory',\n * },\n * })\n *\n * @param options The selected resources and their optional default names.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n const CallbackName extends string,\n const Names,\n >(\n options: {\n resources: ResourceKeys;\n name: SelectedResourceLayoutNames<\n LayoutResourceKey<Resources>,\n NoInfer<ResourceKeys[number]>,\n CallbackName\n > &\n AtLeastOneResourceLayoutNameKey<NoInfer<ResourceKeys[number]>> &\n Record<\n string,\n NonNullable<\n ResourceLayoutNames<\n LayoutResourceKey<Resources>,\n CallbackName\n >[LayoutResourceKey<Resources>]\n >\n >;\n } & {\n name: Names &\n Record<Exclude<keyof Names, ResourceKeys[number]>, never>;\n },\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n MappedResourceLayoutArguments<\n Resources,\n ResourceKeys,\n Names,\n CallbackName\n >,\n CustomProps\n >;\n\n /**\n * Creates a scoped layout factory with one default-name callback shared by\n * every selected resource. The callback receives a capitalized resource\n * whose `toLowerCase()` result retains the corresponding literal type.\n *\n * @example\n * createResourceLayout.forResources({\n * resources: ['users', 'admins'],\n * name: resource => `${resource}Page`,\n * })\n *\n * @param options The selected resources and shared default-name callback.\n * @returns A layout factory scoped to the selected resources.\n */\n <\n const ResourceKeys extends ReadonlyArray<LayoutResourceKey<Resources>>,\n const Name extends string,\n >(\n options: {\n resources: ReadonlyArray<LayoutResourceKey<Resources>>;\n name: (\n resource: CapitalizedResource<ResourceKeys[number]>,\n ) => Name;\n } & { resources: ResourceKeys },\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n SharedResourceLayoutArguments<Resources, ResourceKeys, Name>,\n CustomProps\n >;\n\n /**\n * Creates a scoped layout factory from a resource-keyed configuration.\n * Only configured resources are available from the returned factory.\n *\n * @example\n * createResourceLayout.forResources({\n * users: { name: resource => `${resource}Page` },\n * admins: { name: 'AdminDirectory' },\n * })\n *\n * @param options Resource-keyed layout defaults.\n * @returns A layout factory scoped to the configured resources.\n */\n <\n const CallbackName extends string,\n const Selection extends ResourceLayoutSelection<Resources, CallbackName>,\n >(\n options: Selection &\n AtLeastOneResourceLayoutSelection<Resources, CallbackName> &\n Partial<\n Record<Exclude<'resources', LayoutResourceKey<Resources>>, never>\n > &\n Record<\n Exclude<keyof Selection, LayoutResourceKey<Resources>>,\n never\n >,\n ): ScopedCreateResourceLayoutFn<\n Resources,\n InProps,\n Composables,\n SelectedResourceLayoutArguments<Selection>,\n CustomProps\n >;\n};\n\ntype CreateForResourcesOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n> = {\n createLayoutForResource: (\n defaultName: string | undefined,\n resource: LayoutResourceKey<Resources>,\n ) => unknown;\n createMakeComposableLayout?: () => (\n options: Record<string, unknown>,\n ) => unknown;\n createResourceLayout: (options: Record<string, unknown>) => unknown;\n};\n\nexport function createForResources<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Composables extends ComposableComponents,\n IncludeProps extends LayoutIncludeProps<Resources, InProps, Composables>,\n CustomProps extends InPropsObject,\n>({\n createLayoutForResource,\n createMakeComposableLayout,\n createResourceLayout,\n}: CreateForResourcesOptions<Resources>) {\n return ((...resourcesOrOptions: Array<unknown>) => {\n const firstArgument = resourcesOrOptions[0];\n let resourceOptions: Array<{\n resource: LayoutResourceKey<Resources>;\n name?:\n | string\n | ((\n resource: CapitalizedResource<LayoutResourceKey<Resources>>,\n ) => string);\n }>;\n\n if (typeof firstArgument === 'string') {\n resourceOptions = resourcesOrOptions.map((resource) => ({\n resource: resource as LayoutResourceKey<Resources>,\n }));\n } else if (\n firstArgument !== null &&\n typeof firstArgument === 'object' &&\n 'resources' in firstArgument &&\n Array.isArray(firstArgument.resources)\n ) {\n const { name, resources } = firstArgument as {\n name?: ResourcesLayoutName<LayoutResourceKey<Resources>>;\n resources: Array<LayoutResourceKey<Resources>>;\n };\n resourceOptions = resources.map((resource) => ({\n name: typeof name === 'function' ? name : name?.[resource],\n resource,\n }));\n } else {\n resourceOptions = Object.entries(firstArgument ?? {}).map(\n ([resource, options]) => ({\n ...(options as {\n name?:\n | string\n | ((\n resource: CapitalizedResource<\n LayoutResourceKey<Resources>\n >,\n ) => string);\n }),\n resource: resource as LayoutResourceKey<Resources>,\n }),\n );\n }\n\n const defaultNames = new Map(\n resourceOptions.map(({ name, resource }) => [\n resource,\n typeof name === 'function'\n ? name(\n capitalize(resource) as CapitalizedResource<\n LayoutResourceKey<Resources>\n >,\n )\n : name,\n ]),\n );\n\n function scopedCreateResourceLayout(options: Record<string, unknown>) {\n const resource = options.resource as LayoutResourceKey<Resources>;\n\n return createResourceLayout({\n ...options,\n name: options.name ?? defaultNames.get(resource),\n });\n }\n\n function scopedForResource(options: {\n name?: string;\n resource: LayoutResourceKey<Resources>;\n }) {\n return createLayoutForResource(\n options.name ?? defaultNames.get(options.resource),\n options.resource,\n );\n }\n\n const scopedExtras: {\n forResource: typeof scopedForResource;\n makeComposable?: (options: Record<string, unknown>) => unknown;\n } = { forResource: scopedForResource };\n\n if (createMakeComposableLayout) {\n const makeComposableLayout = createMakeComposableLayout();\n\n scopedExtras.makeComposable = (options) => {\n const resource = options.resource as LayoutResourceKey<Resources>;\n\n return makeComposableLayout({\n ...options,\n name: options.name ?? defaultNames.get(resource),\n });\n };\n }\n\n return Object.assign(scopedCreateResourceLayout, scopedExtras);\n }) as CreateResourceLayoutForResourcesFn<\n Resources,\n InProps,\n Composables,\n IncludeProps,\n CustomProps\n >;\n}\n"],"mappings":";;;AA0hBA,SAAgB,mBAMd,EACA,yBACA,4BACA,wBACuC;CACvC,SAAS,GAAG,uBAAuC;EACjD,MAAM,gBAAgB,mBAAmB;EACzC,IAAI;EASJ,IAAI,OAAO,kBAAkB,UAC3B,kBAAkB,mBAAmB,KAAK,cAAc,EAC5C,SACZ,EAAE;OACG,IACL,kBAAkB,QAClB,OAAO,kBAAkB,YACzB,eAAe,iBACf,MAAM,QAAQ,cAAc,SAAS,GACrC;GACA,MAAM,EAAE,MAAM,cAAc;GAI5B,kBAAkB,UAAU,KAAK,cAAc;IAC7C,MAAM,OAAO,SAAS,aAAa,OAAO,OAAO;IACjD;GACF,EAAE;EACJ,OACE,kBAAkB,OAAO,QAAQ,iBAAiB,CAAC,CAAC,EAAE,KACnD,CAAC,UAAU,cAAc;GACxB,GAAI;GASM;EACZ,EACF;EAGF,MAAM,eAAe,IAAI,IACvB,gBAAgB,KAAK,EAAE,MAAM,eAAe,CAC1C,UACA,OAAO,SAAS,aACZ,KACEA,8BAAW,QAAQ,CAGrB,IACA,IACN,CAAC,CACH;EAEA,SAAS,2BAA2B,SAAkC;GACpE,MAAM,WAAW,QAAQ;GAEzB,OAAO,qBAAqB;IAC1B,GAAG;IACH,MAAM,QAAQ,QAAQ,aAAa,IAAI,QAAQ;GACjD,CAAC;EACH;EAEA,SAAS,kBAAkB,SAGxB;GACD,OAAO,wBACL,QAAQ,QAAQ,aAAa,IAAI,QAAQ,QAAQ,GACjD,QAAQ,QACV;EACF;EAEA,MAAM,eAGF,EAAE,aAAa,kBAAkB;EAErC,IAAI,4BAA4B;GAC9B,MAAM,uBAAuB,2BAA2B;GAExD,aAAa,kBAAkB,YAAY;IACzC,MAAM,WAAW,QAAQ;IAEzB,OAAO,qBAAqB;KAC1B,GAAG;KACH,MAAM,QAAQ,QAAQ,aAAa,IAAI,QAAQ;IACjD,CAAC;GACH;EACF;EAEA,OAAO,OAAO,OAAO,4BAA4B,YAAY;CAC/D;AAOF"}
|