@jfdevelops/react-layout 1.5.1 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/create-config/create-defined-resource-layout.cjs +28 -0
  2. package/dist/create-config/create-defined-resource-layout.cjs.map +1 -1
  3. package/dist/create-config/create-defined-resource-layout.d.cts +6 -10
  4. package/dist/create-config/create-defined-resource-layout.d.cts.map +1 -1
  5. package/dist/create-config/create-defined-resource-layout.d.mts +6 -10
  6. package/dist/create-config/create-defined-resource-layout.d.mts.map +1 -1
  7. package/dist/create-config/create-defined-resource-layout.mjs +28 -0
  8. package/dist/create-config/create-defined-resource-layout.mjs.map +1 -1
  9. package/dist/create-config/define-layout.cjs +1 -1
  10. package/dist/create-config/define-layout.cjs.map +1 -1
  11. package/dist/create-config/define-layout.d.cts +10 -22
  12. package/dist/create-config/define-layout.d.cts.map +1 -1
  13. package/dist/create-config/define-layout.d.mts +10 -22
  14. package/dist/create-config/define-layout.d.mts.map +1 -1
  15. package/dist/create-config/define-layout.mjs +1 -1
  16. package/dist/create-config/define-layout.mjs.map +1 -1
  17. package/dist/create-config/for-resource.cjs.map +1 -1
  18. package/dist/create-config/for-resource.d.cts +10 -7
  19. package/dist/create-config/for-resource.d.cts.map +1 -1
  20. package/dist/create-config/for-resource.d.mts +10 -7
  21. package/dist/create-config/for-resource.d.mts.map +1 -1
  22. package/dist/create-config/for-resource.mjs.map +1 -1
  23. package/dist/create-config/for-resources/resource-selection.d.cts +4 -2
  24. package/dist/create-config/for-resources/resource-selection.d.cts.map +1 -1
  25. package/dist/create-config/for-resources/resource-selection.d.mts +4 -2
  26. package/dist/create-config/for-resources/resource-selection.d.mts.map +1 -1
  27. package/dist/create-config/for-resources/scoped-layout.d.cts +16 -24
  28. package/dist/create-config/for-resources/scoped-layout.d.cts.map +1 -1
  29. package/dist/create-config/for-resources/scoped-layout.d.mts +16 -24
  30. package/dist/create-config/for-resources/scoped-layout.d.mts.map +1 -1
  31. package/dist/create-config/layout-name.cjs +178 -8
  32. package/dist/create-config/layout-name.cjs.map +1 -1
  33. package/dist/create-config/layout-name.d.cts +225 -23
  34. package/dist/create-config/layout-name.d.cts.map +1 -1
  35. package/dist/create-config/layout-name.d.mts +225 -23
  36. package/dist/create-config/layout-name.d.mts.map +1 -1
  37. package/dist/create-config/layout-name.mjs +179 -8
  38. package/dist/create-config/layout-name.mjs.map +1 -1
  39. package/dist/errors/invalid-part-type.cjs +21 -0
  40. package/dist/errors/invalid-part-type.cjs.map +1 -0
  41. package/dist/errors/invalid-part-type.d.cts +110 -0
  42. package/dist/errors/invalid-part-type.d.cts.map +1 -0
  43. package/dist/errors/invalid-part-type.d.mts +110 -0
  44. package/dist/errors/invalid-part-type.d.mts.map +1 -0
  45. package/dist/errors/invalid-part-type.mjs +21 -0
  46. package/dist/errors/invalid-part-type.mjs.map +1 -0
  47. package/dist/errors/invalid-part.cjs +23 -0
  48. package/dist/errors/invalid-part.cjs.map +1 -0
  49. package/dist/errors/invalid-part.d.cts +107 -0
  50. package/dist/errors/invalid-part.d.cts.map +1 -0
  51. package/dist/errors/invalid-part.d.mts +107 -0
  52. package/dist/errors/invalid-part.d.mts.map +1 -0
  53. package/dist/errors/invalid-part.mjs +23 -0
  54. package/dist/errors/invalid-part.mjs.map +1 -0
  55. package/dist/index.cjs +4 -0
  56. package/dist/index.d.cts +4 -2
  57. package/dist/index.d.mts +4 -2
  58. package/dist/index.mjs +3 -1
  59. package/package.json +3 -3
@@ -1,18 +1,16 @@
1
1
  import { capitalize } from "../utils/capitalize.cjs";
2
2
 
3
3
  //#region src/create-config/layout-name.d.ts
4
- /** Literal placeholders allow a naming convention to retain resource-specific names. */
5
- declare const resourceNameToken: unique symbol;
6
- type ResourceToken = string & {
7
- readonly [resourceNameToken]: true;
4
+ /**
5
+ * Each slot has a distinct type identity, so ordinary text cannot become a slot.
6
+ */
7
+ declare const layoutNamePlaceholder: unique symbol;
8
+ type NamePlaceholder<Key extends string, Value extends string | number = string> = Value & {
9
+ readonly [layoutNamePlaceholder]: Key;
8
10
  };
9
- type CapitalizedToken = 'LayoutCapitalizedResourceToken';
10
- type PatternNameContext = Omit<LayoutNameContext<ResourceToken>, 'capitalize'> & {
11
- capitalize: <T extends string>(value: T) => T extends ResourceToken ? CapitalizedToken : Capitalize<T>;
11
+ type PatternNameContext = Omit<LayoutNameContext<NamePlaceholder<'resource'>>, 'capitalize'> & {
12
+ capitalize: <T extends string>(value: T) => T extends NamePlaceholder<'resource'> ? NamePlaceholder<'capitalizedResource'> : Capitalize<T>;
12
13
  };
13
- type PrefixToken = '__layout_prefix__';
14
- type BeforeToken = '__layout_before_suffix__';
15
- type AppendToken = '__layout_append__';
16
14
  interface LayoutNameContext<Resource extends string = string, State extends string = string> {
17
15
  resource: Resource;
18
16
  states: readonly State[];
@@ -23,15 +21,47 @@ interface LayoutNameParts {
23
21
  beforeSuffix?: string;
24
22
  append?: string;
25
23
  }
26
- type PatternParts = {
27
- prefix: PrefixToken;
28
- beforeSuffix: BeforeToken;
29
- append: AppendToken;
24
+ /**
25
+ * Value kinds accepted by a declared naming part.
26
+ */
27
+ type LayoutNamePartType = 'string' | 'number';
28
+ /**
29
+ * Declares each naming part and the value kind accepted at call sites.
30
+ */
31
+ type LayoutNamePartDefinitions = Readonly<Record<string, LayoutNamePartType>>;
32
+ /**
33
+ * Defines the naming pattern and strict-checking policy. Strict defaults to true.
34
+ */
35
+ interface LayoutNameOptions<Definitions extends LayoutNamePartDefinitions, Pattern extends string, Strict extends boolean = true> {
36
+ /**
37
+ * Combines the naming context and part placeholders into a name.
38
+ */
39
+ pattern: NamingPattern<Definitions, Pattern, Strict>;
40
+ /**
41
+ * Set to false to skip part type checking and runtime validation.
42
+ */
43
+ strict?: Strict;
44
+ }
45
+ /**
46
+ * Part values are intentionally unchecked when strict is false.
47
+ */
48
+ type UncheckedNamingParts<Definitions extends LayoutNamePartDefinitions> = { [Key in keyof Definitions]?: any } & Record<string, any>;
49
+ type PartValue<Type extends LayoutNamePartType> = Type extends 'number' ? number : string;
50
+ /**
51
+ * Optional values for declared naming parts. Omitted slots render as empty text.
52
+ */
53
+ type LayoutNamePartValues<Definitions extends LayoutNamePartDefinitions> = { [Key in keyof Definitions]?: PartValue<Definitions[Key]> };
54
+ type PatternParts<Definitions extends LayoutNamePartDefinitions> = { [Key in keyof Definitions & string]: NamePlaceholder<`part:${Key}`, PartValue<Definitions[Key]> | ''> };
55
+ type PartText<Value> = Value extends string | number ? `${Value}` : '';
56
+ type Part<Parts, Key extends keyof Parts> = PartText<Parts[Key]>;
57
+ type ResourcePlaceholderValues<Resource extends string> = {
58
+ resource: Resource;
59
+ capitalizedResource: Capitalize<Resource>;
30
60
  };
31
- type Replace<S extends string, From extends string, To extends string> = S extends `${infer A}${From}${infer B}` ? `${A}${To}${Replace<B, From, To>}` : S;
32
- type ReplaceResource<S extends string, Resource extends string> = S extends `${ResourceToken}${infer Rest}` ? `${Resource}${ReplaceResource<Rest, Resource>}` : S extends `${infer First}${infer Rest}` ? `${First}${ReplaceResource<Rest, Resource>}` : S;
33
- type Part<P, K extends keyof LayoutNameParts> = K extends keyof P ? Extract<P[K], string> : '';
34
- type ResolveNamePattern<Pattern extends string, Resource extends string, Parts = {}> = ReplaceResource<Replace<Replace<Replace<Replace<Pattern, PrefixToken, Part<Parts, 'prefix'>>, BeforeToken, Part<Parts, 'beforeSuffix'>>, AppendToken, Part<Parts, 'append'>>, CapitalizedToken, Capitalize<Resource>>, Resource>;
61
+ type PlaceholderValues<Resource extends string, Parts> = ResourcePlaceholderValues<Resource> & { [Key in keyof Parts & string as `part:${Key}`]: ResolvePattern<Part<Parts, Key>, ResourcePlaceholderValues<Resource>> };
62
+ type MatchPlaceholder<Pattern extends string, Values> = { [Key in keyof Values & string]: Pattern extends NamePlaceholder<Key> | `${NamePlaceholder<Key>}` | `${NamePlaceholder<Key, number>}` ? [Extract<Values[Key], string>, ''] : Pattern extends `${NamePlaceholder<Key>}${infer Rest}` ? [Extract<Values[Key], string>, Rest] : Pattern extends `${NamePlaceholder<Key, number>}${infer Rest}` ? [Extract<Values[Key], string>, Rest] : never }[keyof Values & string];
63
+ type ResolvePattern<Pattern extends string, Values, Result extends string = ''> = [MatchPlaceholder<Pattern, Values>] extends [never] ? Pattern extends `${infer First}${infer Rest}` ? ResolvePattern<Rest, Values, `${Result}${First}`> : `${Result}${Pattern}` : MatchPlaceholder<Pattern, Values> extends [infer Value extends string, infer Rest extends string] ? ResolvePattern<Rest, Values, `${Result}${Value}`> : never;
64
+ type ResolveNamePattern<Pattern extends string, Resource extends string, Parts = {}> = ResolvePattern<Pattern, PlaceholderValues<Resource, Parts>>;
35
65
  declare const layoutNamePattern: unique symbol;
36
66
  interface LayoutNameResolver<Pattern extends string = string, Parts = {}> {
37
67
  (context: LayoutNameContext): string;
@@ -40,10 +70,182 @@ interface LayoutNameResolver<Pattern extends string = string, Parts = {}> {
40
70
  parts: Parts;
41
71
  };
42
72
  }
43
- type LayoutNameInput<Resource extends string = string, States extends string = string, Name extends string = string> = Name | ((context: LayoutNameContext<Resource, States>) => Name);
44
- type ResolvedLayoutName<Naming, Resource extends string> = Naming extends LayoutNameResolver<infer Pattern, infer Parts> ? ResolveNamePattern<Pattern, Resource, Parts> : Naming extends ((...args: any[]) => infer Result) ? Extract<Result, string> : Naming extends string ? Naming : string;
45
- /** Define the stable structure once; supply optional variations at each call site. */
46
- declare function defineLayoutName<const Pattern extends string>(pattern: (context: PatternNameContext, parts: PatternParts) => Pattern): <const Parts extends LayoutNameParts = {}>(parts?: Parts | ((context: PatternNameContext) => Parts)) => LayoutNameResolver<Pattern, Parts>;
73
+ /**
74
+ * Computes a layout name from its resource and available render states.
75
+ */
76
+ type LayoutNameCallback<Resource extends string = string, States extends string = string, Name extends string = string> = (context: LayoutNameContext<Resource, States>) => Name;
77
+ type LayoutNameInput<Resource extends string = string, States extends string = string, Name extends string = string> = Name | LayoutNameCallback<Resource, States, Name>;
78
+ type ResolvedLayoutName<Naming, Resource extends string> = [Naming] extends [undefined] ? `${Capitalize<Resource>}Layout` : Naming extends LayoutNameResolver<infer Pattern, infer Parts> ? ResolveNamePattern<Pattern, Resource, Parts> : Naming extends ((...args: any[]) => infer Result) ? Extract<Result, string> : Naming extends string ? Naming : `${Capitalize<Resource>}Layout`;
79
+ type NamingPartsInput<Definitions extends LayoutNamePartDefinitions, Parts extends LayoutNamePartValues<Definitions>> = { [Key in keyof (LayoutNamePartValues<Definitions> & Parts)]: Key extends keyof Definitions ? (LayoutNamePartValues<Definitions> & Parts)[Key] : never };
80
+ type NamingPartsCallback<Definitions extends LayoutNamePartDefinitions, Parts extends LayoutNamePartValues<Definitions>> = (context: PatternNameContext) => NamingPartsInput<Definitions, Parts>;
81
+ type ResolvedParts<Definitions extends LayoutNamePartDefinitions, Parts> = { [Key in keyof Definitions]: Key extends keyof Parts ? Parts[Key] : '' };
82
+ type NamingPattern<Definitions extends LayoutNamePartDefinitions, Pattern extends string, Strict extends boolean = true> = (context: PatternNameContext, parts: [Strict] extends [false] ? UncheckedNamingParts<Definitions> : PatternParts<Definitions>) => Pattern;
83
+ /**
84
+ * Supplies optional part values while preserving their literal types in names.
85
+ */
86
+ interface CheckedLayoutNameFactory<Definitions extends LayoutNamePartDefinitions, Pattern extends string> {
87
+ /**
88
+ * Supplies values for declared parts without coercing their types.
89
+ * Fixed values are checked immediately; callback results are checked when
90
+ * the layout name is resolved for a resource.
91
+ *
92
+ * @throws {InvalidPartError} A supplied part has not been declared.
93
+ * @throws {InvalidPartTypeError} A supplied value has the wrong kind.
94
+ */
95
+ <const Parts extends LayoutNamePartValues<Definitions> = {}>(parts?: NamingPartsInput<Definitions, Parts> | NamingPartsCallback<Definitions, Parts>): LayoutNameResolver<Pattern, ResolvedParts<Definitions, Parts>>;
96
+ }
97
+ interface UncheckedLayoutNameFactory<Definitions extends LayoutNamePartDefinitions> {
98
+ (parts?: UncheckedNamingParts<Definitions> | ((context: PatternNameContext) => UncheckedNamingParts<Definitions>)): LayoutNameResolver<string>;
99
+ }
100
+ /**
101
+ * Supplies optional naming parts. Strict conventions preserve literal names;
102
+ * unchecked conventions accept arbitrary keys and values and return string names.
103
+ */
104
+ type LayoutNameFactory<Definitions extends LayoutNamePartDefinitions, Pattern extends string, Strict extends boolean = true> = [Strict] extends [false] ? UncheckedLayoutNameFactory<Definitions> : CheckedLayoutNameFactory<Definitions, Pattern>;
105
+ interface DefinedLayoutNameParts<Definitions extends LayoutNamePartDefinitions> {
106
+ /**
107
+ * Defines the naming pattern and optional strict-checking policy.
108
+ * Strict defaults to true; false accepts unchecked part keys and values.
109
+ */
110
+ namingFn<const Pattern extends string, const Strict extends boolean = true>(definition: LayoutNameOptions<Definitions, Pattern, Strict>): LayoutNameFactory<Definitions, Pattern, Strict>;
111
+ }
112
+ declare const defaultPartDefinitions: {
113
+ prefix: "string";
114
+ beforeSuffix: "string";
115
+ append: "string";
116
+ };
117
+ /**
118
+ * Defines a reusable layout naming convention that preserves resource-specific
119
+ * literal names in TypeScript. Define the pattern once, then supply optional
120
+ * part values wherever the convention is used.
121
+ *
122
+ * Omit `name` entirely when the generated name, such as `UsersLayout`, is enough.
123
+ * Use this helper when several layouts share a naming rule or need variations
124
+ * while retaining exact component `displayName` types.
125
+ *
126
+ * Choose the form that matches the values your convention needs:
127
+ *
128
+ * - `defineLayoutName({ pattern })` provides the string parts `prefix`,
129
+ * `beforeSuffix`, and `append` for common naming variations.
130
+ * - `defineLayoutName.defineParts(...names).namingFn({ pattern })` provides custom
131
+ * string parts when domain-specific names make the pattern clearer.
132
+ * - `defineLayoutName.defineParts(schema).namingFn({ pattern })` declares each
133
+ * part as `'string'` or `'number'` when supplied values need different types.
134
+ *
135
+ * The pattern controls where parts appear; their names do not impose an order.
136
+ * Part values are optional and omitted values render as empty text. Supply an
137
+ * object for fixed values, or a callback when values depend on the resource.
138
+ * Numeric placeholders can also be empty text inside the pattern. Narrow them
139
+ * with `typeof value === 'number'` before using number-only methods.
140
+ * Supplied keys and value kinds are also validated at runtime. Unknown parts
141
+ * throw InvalidPartError; incorrect value kinds throw InvalidPartTypeError.
142
+ * Each returned naming resolver can be passed to a factory, definition, or
143
+ * component creation call through its `name` option.
144
+ *
145
+ * Strict checking defaults to true. Use `{ pattern, strict: false }` here or
146
+ * in namingFn to accept unchecked part keys and values in both TypeScript
147
+ * and runtime calls. Unchecked conventions return string names.
148
+ *
149
+ * @param definition - An object containing the naming pattern and optional
150
+ * strict-checking policy.
151
+ * @returns A function accepting optional part values or a context callback.
152
+ * Calling it with no arguments leaves every declared part empty.
153
+ *
154
+ * @example
155
+ * Use the default string parts for a shared convention with occasional variants.
156
+ * ```tsx
157
+ * const layoutName = defineLayoutName({
158
+ * pattern: ({ resource, capitalize }, parts) =>
159
+ * `${parts.prefix}${capitalize(resource)}${parts.beforeSuffix}Layout${
160
+ * parts.append
161
+ * }`
162
+ * });
163
+ * const factory = createDefinedResourceLayout({
164
+ * resources: ['users'],
165
+ * name: layoutName()
166
+ * });
167
+ * const { createResourceLayout } = factory.defineResourceLayout({
168
+ * render: () => <div />
169
+ * });
170
+ * const Users = createResourceLayout({ resource: 'users' });
171
+ * // Users.displayName is typed as 'UsersLayout'.
172
+ * const AdminUsers = createResourceLayout({
173
+ * resource: 'users',
174
+ * name: layoutName({ prefix: 'Admin', beforeSuffix: 'Detail' })
175
+ * });
176
+ * // AdminUsers.displayName is typed as 'AdminUsersDetailLayout'.
177
+ * ```
178
+ *
179
+ * @example
180
+ * Declare custom string parts when their names describe your application's
181
+ * conventions more clearly than prefix, beforeSuffix, and append.
182
+ * ```ts
183
+ * const pageName = defineLayoutName
184
+ * .defineParts('section', 'variant')
185
+ * .namingFn({
186
+ * pattern: ({ resource, capitalize }, parts) =>
187
+ * `${parts.section}${capitalize(resource)}${parts.variant}Page`
188
+ * });
189
+ * const adminPage = pageName({ section: 'Admin', variant: 'Detail' });
190
+ * // Used for 'users', this produces 'AdminUsersDetailPage'.
191
+ * const resourcePage = pageName(({ resource }) => ({
192
+ * section: resource === 'users' ? 'Admin' : 'Public'
193
+ * }));
194
+ * // Used for 'users', this produces 'AdminUsersPage'.
195
+ * // Other resources receive the 'Public' section instead.
196
+ * ```
197
+ *
198
+ * @example
199
+ * Use a schema when a part should accept a number instead of a string.
200
+ * Supplied keys are suggested by the editor and checked against the schema.
201
+ * ```ts
202
+ * const versionedName = defineLayoutName
203
+ * .defineParts({ section: 'string', version: 'number' })
204
+ * .namingFn({
205
+ * pattern: ({ resource, capitalize }, parts) =>
206
+ * `${parts.section}${capitalize(resource)}V${parts.version}`
207
+ * });
208
+ * const adminV2 = versionedName({ section: 'Admin', version: 2 });
209
+ * // Used for 'users', this produces 'AdminUsersV2'.
210
+ * // versionedName({ version: '2' }) is rejected: version must be a number.
211
+ * ```
212
+ *
213
+ * @example
214
+ * Guard optional numeric values before formatting them with number methods.
215
+ * Plain interpolation, as above, already handles empty values.
216
+ * ```ts
217
+ * const formattedName = defineLayoutName
218
+ * .defineParts({ version: 'number' })
219
+ * .namingFn({
220
+ * pattern: ({ resource, capitalize }, parts) => {
221
+ * const version =
222
+ * typeof parts.version === 'number' ? parts.version.toFixed(0) : '';
223
+ * return `${capitalize(resource)}V${version}`;
224
+ * }
225
+ * });
226
+ * ```
227
+ *
228
+ * @example
229
+ * Opt out of part checking when a convention intentionally accepts external
230
+ * keys and mixed value types. The resulting displayName is typed as string.
231
+ * ```ts
232
+ * const externalName = defineLayoutName
233
+ * .defineParts({ version: 'number' })
234
+ * .namingFn({
235
+ * pattern: ({ resource }, parts) =>
236
+ * `${resource}${parts.version}${parts.extra}`,
237
+ * strict: false
238
+ * });
239
+ * const legacy = externalName({ version: 'legacy', extra: true });
240
+ * ```
241
+ */
242
+ declare function defineLayoutName<const Pattern extends string, const Strict extends boolean = true>(definition: LayoutNameOptions<typeof defaultPartDefinitions, Pattern, Strict>): LayoutNameFactory<typeof defaultPartDefinitions, Pattern, Strict>;
243
+ declare namespace defineLayoutName {
244
+ var defineParts: {
245
+ <const Keys extends readonly string[]>(...keys: Keys): DefinedLayoutNameParts<{ [Key in Keys[number]]: "string" }>;
246
+ <const Definitions extends LayoutNamePartDefinitions>(definitions: Definitions): DefinedLayoutNameParts<Definitions>;
247
+ };
248
+ }
47
249
  //#endregion
48
- export { LayoutNameContext, LayoutNameInput, LayoutNameParts, LayoutNameResolver, ResolvedLayoutName, defineLayoutName };
250
+ export { LayoutNameCallback, LayoutNameContext, LayoutNameFactory, LayoutNameInput, LayoutNameOptions, LayoutNamePartDefinitions, LayoutNamePartType, LayoutNamePartValues, LayoutNameParts, LayoutNameResolver, ResolvedLayoutName, defineLayoutName };
49
251
  //# sourceMappingURL=layout-name.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"layout-name.d.cts","names":[],"sources":["../../src/create-config/layout-name.ts"],"mappings":";;;;cAEc,iBAAA;AAAA,KACT,aAAA;EAAA,UAAqC,iBAAiB;AAAA;AAAA,KACtD,gBAAA;AAAA,KACA,kBAAA,GAAqB,IAAA,CACxB,iBAAA,CAAkB,aAAA;EAGlB,UAAA,qBACE,KAAA,EAAO,CAAA,KACJ,CAAA,SAAU,aAAA,GAAgB,gBAAA,GAAmB,UAAA,CAAW,CAAA;AAAA;AAAA,KAE1D,WAAA;AAAA,KACA,WAAA;AAAA,KACA,WAAA;AAAA,UACY,iBAAA;EAIf,QAAA,EAAU,QAAA;EACV,MAAA,WAAiB,KAAA;EACjB,UAAA,SAAmB,UAAA;AAAA;AAAA,UAEJ,eAAA;EACf,MAAA;EACA,YAAA;EACA,MAAA;AAAA;AAAA,KAEG,YAAA;EACH,MAAA,EAAQ,WAAA;EACR,YAAA,EAAc,WAAA;EACd,MAAA,EAAQ,WAAA;AAAA;AAAA,KAEL,OAAA,6DAID,CAAA,sBAAuB,IAAA,kBACpB,CAAA,GAAI,EAAA,GAAK,OAAA,CAAQ,CAAA,EAAG,IAAA,EAAM,EAAA,MAC7B,CAAA;AAAA,KACC,eAAA,8CAGD,CAAA,YAAa,aAAA,qBACV,QAAA,GAAW,eAAA,CAAgB,IAAA,EAAM,QAAA,MACpC,CAAA,4CACG,KAAA,GAAQ,eAAA,CAAgB,IAAA,EAAM,QAAA,MACjC,CAAA;AAAA,KACC,IAAA,oBAAwB,eAAA,IAAmB,CAAA,eAAgB,CAAA,GAC5D,OAAA,CAAQ,CAAA,CAAE,CAAA;AAAA,KAEF,kBAAA,gEAIR,eAAA,CACF,OAAA,CACE,OAAA,CACE,OAAA,CACE,OAAA,CAAQ,OAAA,EAAS,WAAA,EAAa,IAAA,CAAK,KAAA,cACnC,WAAA,EACA,IAAA,CAAK,KAAA,oBAEP,WAAA,EACA,IAAA,CAAK,KAAA,cAEP,gBAAA,EACA,UAAA,CAAW,QAAA,IAEb,QAAA;AAAA,cAEW,iBAAA;AAAA,UACI,kBAAA;EAAA,CAId,OAAA,EAAS,iBAAA;EAAA,UACA,iBAAA;IAAsB,OAAA,EAAS,OAAA;IAAS,KAAA,EAAO,KAAA;EAAA;AAAA;AAAA,KAE/C,eAAA,mGAIR,IAAA,KAAS,OAAA,EAAS,iBAAA,CAAkB,QAAA,EAAU,MAAA,MAAY,IAAA;AAAA,KAClD,kBAAA,oCAGR,MAAA,SAAe,kBAAA,+BACf,kBAAA,CAAmB,OAAA,EAAS,QAAA,EAAU,KAAA,IACtC,MAAA,cAAmB,IAAA,4BACnB,OAAA,CAAQ,MAAA,YACR,MAAA,kBACA,MAAA;;iBAGY,gBAAA,+BACd,OAAA,GAAU,OAAA,EAAS,kBAAA,EAAoB,KAAA,EAAO,YAAA,KAAiB,OAAA,wBAE7B,eAAA,OAAe,KAAA,GACvC,KAAA,KAAU,OAAA,EAAS,kBAAA,KAAuB,KAAA,MACjD,kBAAA,CAAmB,OAAA,EAAS,KAAA"}
1
+ {"version":3,"file":"layout-name.d.cts","names":[],"sources":["../../src/create-config/layout-name.ts"],"mappings":"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"}
@@ -1,18 +1,16 @@
1
1
  import { capitalize } from "../utils/capitalize.mjs";
2
2
 
3
3
  //#region src/create-config/layout-name.d.ts
4
- /** Literal placeholders allow a naming convention to retain resource-specific names. */
5
- declare const resourceNameToken: unique symbol;
6
- type ResourceToken = string & {
7
- readonly [resourceNameToken]: true;
4
+ /**
5
+ * Each slot has a distinct type identity, so ordinary text cannot become a slot.
6
+ */
7
+ declare const layoutNamePlaceholder: unique symbol;
8
+ type NamePlaceholder<Key extends string, Value extends string | number = string> = Value & {
9
+ readonly [layoutNamePlaceholder]: Key;
8
10
  };
9
- type CapitalizedToken = 'LayoutCapitalizedResourceToken';
10
- type PatternNameContext = Omit<LayoutNameContext<ResourceToken>, 'capitalize'> & {
11
- capitalize: <T extends string>(value: T) => T extends ResourceToken ? CapitalizedToken : Capitalize<T>;
11
+ type PatternNameContext = Omit<LayoutNameContext<NamePlaceholder<'resource'>>, 'capitalize'> & {
12
+ capitalize: <T extends string>(value: T) => T extends NamePlaceholder<'resource'> ? NamePlaceholder<'capitalizedResource'> : Capitalize<T>;
12
13
  };
13
- type PrefixToken = '__layout_prefix__';
14
- type BeforeToken = '__layout_before_suffix__';
15
- type AppendToken = '__layout_append__';
16
14
  interface LayoutNameContext<Resource extends string = string, State extends string = string> {
17
15
  resource: Resource;
18
16
  states: readonly State[];
@@ -23,15 +21,47 @@ interface LayoutNameParts {
23
21
  beforeSuffix?: string;
24
22
  append?: string;
25
23
  }
26
- type PatternParts = {
27
- prefix: PrefixToken;
28
- beforeSuffix: BeforeToken;
29
- append: AppendToken;
24
+ /**
25
+ * Value kinds accepted by a declared naming part.
26
+ */
27
+ type LayoutNamePartType = 'string' | 'number';
28
+ /**
29
+ * Declares each naming part and the value kind accepted at call sites.
30
+ */
31
+ type LayoutNamePartDefinitions = Readonly<Record<string, LayoutNamePartType>>;
32
+ /**
33
+ * Defines the naming pattern and strict-checking policy. Strict defaults to true.
34
+ */
35
+ interface LayoutNameOptions<Definitions extends LayoutNamePartDefinitions, Pattern extends string, Strict extends boolean = true> {
36
+ /**
37
+ * Combines the naming context and part placeholders into a name.
38
+ */
39
+ pattern: NamingPattern<Definitions, Pattern, Strict>;
40
+ /**
41
+ * Set to false to skip part type checking and runtime validation.
42
+ */
43
+ strict?: Strict;
44
+ }
45
+ /**
46
+ * Part values are intentionally unchecked when strict is false.
47
+ */
48
+ type UncheckedNamingParts<Definitions extends LayoutNamePartDefinitions> = { [Key in keyof Definitions]?: any } & Record<string, any>;
49
+ type PartValue<Type extends LayoutNamePartType> = Type extends 'number' ? number : string;
50
+ /**
51
+ * Optional values for declared naming parts. Omitted slots render as empty text.
52
+ */
53
+ type LayoutNamePartValues<Definitions extends LayoutNamePartDefinitions> = { [Key in keyof Definitions]?: PartValue<Definitions[Key]> };
54
+ type PatternParts<Definitions extends LayoutNamePartDefinitions> = { [Key in keyof Definitions & string]: NamePlaceholder<`part:${Key}`, PartValue<Definitions[Key]> | ''> };
55
+ type PartText<Value> = Value extends string | number ? `${Value}` : '';
56
+ type Part<Parts, Key extends keyof Parts> = PartText<Parts[Key]>;
57
+ type ResourcePlaceholderValues<Resource extends string> = {
58
+ resource: Resource;
59
+ capitalizedResource: Capitalize<Resource>;
30
60
  };
31
- type Replace<S extends string, From extends string, To extends string> = S extends `${infer A}${From}${infer B}` ? `${A}${To}${Replace<B, From, To>}` : S;
32
- type ReplaceResource<S extends string, Resource extends string> = S extends `${ResourceToken}${infer Rest}` ? `${Resource}${ReplaceResource<Rest, Resource>}` : S extends `${infer First}${infer Rest}` ? `${First}${ReplaceResource<Rest, Resource>}` : S;
33
- type Part<P, K extends keyof LayoutNameParts> = K extends keyof P ? Extract<P[K], string> : '';
34
- type ResolveNamePattern<Pattern extends string, Resource extends string, Parts = {}> = ReplaceResource<Replace<Replace<Replace<Replace<Pattern, PrefixToken, Part<Parts, 'prefix'>>, BeforeToken, Part<Parts, 'beforeSuffix'>>, AppendToken, Part<Parts, 'append'>>, CapitalizedToken, Capitalize<Resource>>, Resource>;
61
+ type PlaceholderValues<Resource extends string, Parts> = ResourcePlaceholderValues<Resource> & { [Key in keyof Parts & string as `part:${Key}`]: ResolvePattern<Part<Parts, Key>, ResourcePlaceholderValues<Resource>> };
62
+ type MatchPlaceholder<Pattern extends string, Values> = { [Key in keyof Values & string]: Pattern extends NamePlaceholder<Key> | `${NamePlaceholder<Key>}` | `${NamePlaceholder<Key, number>}` ? [Extract<Values[Key], string>, ''] : Pattern extends `${NamePlaceholder<Key>}${infer Rest}` ? [Extract<Values[Key], string>, Rest] : Pattern extends `${NamePlaceholder<Key, number>}${infer Rest}` ? [Extract<Values[Key], string>, Rest] : never }[keyof Values & string];
63
+ type ResolvePattern<Pattern extends string, Values, Result extends string = ''> = [MatchPlaceholder<Pattern, Values>] extends [never] ? Pattern extends `${infer First}${infer Rest}` ? ResolvePattern<Rest, Values, `${Result}${First}`> : `${Result}${Pattern}` : MatchPlaceholder<Pattern, Values> extends [infer Value extends string, infer Rest extends string] ? ResolvePattern<Rest, Values, `${Result}${Value}`> : never;
64
+ type ResolveNamePattern<Pattern extends string, Resource extends string, Parts = {}> = ResolvePattern<Pattern, PlaceholderValues<Resource, Parts>>;
35
65
  declare const layoutNamePattern: unique symbol;
36
66
  interface LayoutNameResolver<Pattern extends string = string, Parts = {}> {
37
67
  (context: LayoutNameContext): string;
@@ -40,10 +70,182 @@ interface LayoutNameResolver<Pattern extends string = string, Parts = {}> {
40
70
  parts: Parts;
41
71
  };
42
72
  }
43
- type LayoutNameInput<Resource extends string = string, States extends string = string, Name extends string = string> = Name | ((context: LayoutNameContext<Resource, States>) => Name);
44
- type ResolvedLayoutName<Naming, Resource extends string> = Naming extends LayoutNameResolver<infer Pattern, infer Parts> ? ResolveNamePattern<Pattern, Resource, Parts> : Naming extends ((...args: any[]) => infer Result) ? Extract<Result, string> : Naming extends string ? Naming : string;
45
- /** Define the stable structure once; supply optional variations at each call site. */
46
- declare function defineLayoutName<const Pattern extends string>(pattern: (context: PatternNameContext, parts: PatternParts) => Pattern): <const Parts extends LayoutNameParts = {}>(parts?: Parts | ((context: PatternNameContext) => Parts)) => LayoutNameResolver<Pattern, Parts>;
73
+ /**
74
+ * Computes a layout name from its resource and available render states.
75
+ */
76
+ type LayoutNameCallback<Resource extends string = string, States extends string = string, Name extends string = string> = (context: LayoutNameContext<Resource, States>) => Name;
77
+ type LayoutNameInput<Resource extends string = string, States extends string = string, Name extends string = string> = Name | LayoutNameCallback<Resource, States, Name>;
78
+ type ResolvedLayoutName<Naming, Resource extends string> = [Naming] extends [undefined] ? `${Capitalize<Resource>}Layout` : Naming extends LayoutNameResolver<infer Pattern, infer Parts> ? ResolveNamePattern<Pattern, Resource, Parts> : Naming extends ((...args: any[]) => infer Result) ? Extract<Result, string> : Naming extends string ? Naming : `${Capitalize<Resource>}Layout`;
79
+ type NamingPartsInput<Definitions extends LayoutNamePartDefinitions, Parts extends LayoutNamePartValues<Definitions>> = { [Key in keyof (LayoutNamePartValues<Definitions> & Parts)]: Key extends keyof Definitions ? (LayoutNamePartValues<Definitions> & Parts)[Key] : never };
80
+ type NamingPartsCallback<Definitions extends LayoutNamePartDefinitions, Parts extends LayoutNamePartValues<Definitions>> = (context: PatternNameContext) => NamingPartsInput<Definitions, Parts>;
81
+ type ResolvedParts<Definitions extends LayoutNamePartDefinitions, Parts> = { [Key in keyof Definitions]: Key extends keyof Parts ? Parts[Key] : '' };
82
+ type NamingPattern<Definitions extends LayoutNamePartDefinitions, Pattern extends string, Strict extends boolean = true> = (context: PatternNameContext, parts: [Strict] extends [false] ? UncheckedNamingParts<Definitions> : PatternParts<Definitions>) => Pattern;
83
+ /**
84
+ * Supplies optional part values while preserving their literal types in names.
85
+ */
86
+ interface CheckedLayoutNameFactory<Definitions extends LayoutNamePartDefinitions, Pattern extends string> {
87
+ /**
88
+ * Supplies values for declared parts without coercing their types.
89
+ * Fixed values are checked immediately; callback results are checked when
90
+ * the layout name is resolved for a resource.
91
+ *
92
+ * @throws {InvalidPartError} A supplied part has not been declared.
93
+ * @throws {InvalidPartTypeError} A supplied value has the wrong kind.
94
+ */
95
+ <const Parts extends LayoutNamePartValues<Definitions> = {}>(parts?: NamingPartsInput<Definitions, Parts> | NamingPartsCallback<Definitions, Parts>): LayoutNameResolver<Pattern, ResolvedParts<Definitions, Parts>>;
96
+ }
97
+ interface UncheckedLayoutNameFactory<Definitions extends LayoutNamePartDefinitions> {
98
+ (parts?: UncheckedNamingParts<Definitions> | ((context: PatternNameContext) => UncheckedNamingParts<Definitions>)): LayoutNameResolver<string>;
99
+ }
100
+ /**
101
+ * Supplies optional naming parts. Strict conventions preserve literal names;
102
+ * unchecked conventions accept arbitrary keys and values and return string names.
103
+ */
104
+ type LayoutNameFactory<Definitions extends LayoutNamePartDefinitions, Pattern extends string, Strict extends boolean = true> = [Strict] extends [false] ? UncheckedLayoutNameFactory<Definitions> : CheckedLayoutNameFactory<Definitions, Pattern>;
105
+ interface DefinedLayoutNameParts<Definitions extends LayoutNamePartDefinitions> {
106
+ /**
107
+ * Defines the naming pattern and optional strict-checking policy.
108
+ * Strict defaults to true; false accepts unchecked part keys and values.
109
+ */
110
+ namingFn<const Pattern extends string, const Strict extends boolean = true>(definition: LayoutNameOptions<Definitions, Pattern, Strict>): LayoutNameFactory<Definitions, Pattern, Strict>;
111
+ }
112
+ declare const defaultPartDefinitions: {
113
+ prefix: "string";
114
+ beforeSuffix: "string";
115
+ append: "string";
116
+ };
117
+ /**
118
+ * Defines a reusable layout naming convention that preserves resource-specific
119
+ * literal names in TypeScript. Define the pattern once, then supply optional
120
+ * part values wherever the convention is used.
121
+ *
122
+ * Omit `name` entirely when the generated name, such as `UsersLayout`, is enough.
123
+ * Use this helper when several layouts share a naming rule or need variations
124
+ * while retaining exact component `displayName` types.
125
+ *
126
+ * Choose the form that matches the values your convention needs:
127
+ *
128
+ * - `defineLayoutName({ pattern })` provides the string parts `prefix`,
129
+ * `beforeSuffix`, and `append` for common naming variations.
130
+ * - `defineLayoutName.defineParts(...names).namingFn({ pattern })` provides custom
131
+ * string parts when domain-specific names make the pattern clearer.
132
+ * - `defineLayoutName.defineParts(schema).namingFn({ pattern })` declares each
133
+ * part as `'string'` or `'number'` when supplied values need different types.
134
+ *
135
+ * The pattern controls where parts appear; their names do not impose an order.
136
+ * Part values are optional and omitted values render as empty text. Supply an
137
+ * object for fixed values, or a callback when values depend on the resource.
138
+ * Numeric placeholders can also be empty text inside the pattern. Narrow them
139
+ * with `typeof value === 'number'` before using number-only methods.
140
+ * Supplied keys and value kinds are also validated at runtime. Unknown parts
141
+ * throw InvalidPartError; incorrect value kinds throw InvalidPartTypeError.
142
+ * Each returned naming resolver can be passed to a factory, definition, or
143
+ * component creation call through its `name` option.
144
+ *
145
+ * Strict checking defaults to true. Use `{ pattern, strict: false }` here or
146
+ * in namingFn to accept unchecked part keys and values in both TypeScript
147
+ * and runtime calls. Unchecked conventions return string names.
148
+ *
149
+ * @param definition - An object containing the naming pattern and optional
150
+ * strict-checking policy.
151
+ * @returns A function accepting optional part values or a context callback.
152
+ * Calling it with no arguments leaves every declared part empty.
153
+ *
154
+ * @example
155
+ * Use the default string parts for a shared convention with occasional variants.
156
+ * ```tsx
157
+ * const layoutName = defineLayoutName({
158
+ * pattern: ({ resource, capitalize }, parts) =>
159
+ * `${parts.prefix}${capitalize(resource)}${parts.beforeSuffix}Layout${
160
+ * parts.append
161
+ * }`
162
+ * });
163
+ * const factory = createDefinedResourceLayout({
164
+ * resources: ['users'],
165
+ * name: layoutName()
166
+ * });
167
+ * const { createResourceLayout } = factory.defineResourceLayout({
168
+ * render: () => <div />
169
+ * });
170
+ * const Users = createResourceLayout({ resource: 'users' });
171
+ * // Users.displayName is typed as 'UsersLayout'.
172
+ * const AdminUsers = createResourceLayout({
173
+ * resource: 'users',
174
+ * name: layoutName({ prefix: 'Admin', beforeSuffix: 'Detail' })
175
+ * });
176
+ * // AdminUsers.displayName is typed as 'AdminUsersDetailLayout'.
177
+ * ```
178
+ *
179
+ * @example
180
+ * Declare custom string parts when their names describe your application's
181
+ * conventions more clearly than prefix, beforeSuffix, and append.
182
+ * ```ts
183
+ * const pageName = defineLayoutName
184
+ * .defineParts('section', 'variant')
185
+ * .namingFn({
186
+ * pattern: ({ resource, capitalize }, parts) =>
187
+ * `${parts.section}${capitalize(resource)}${parts.variant}Page`
188
+ * });
189
+ * const adminPage = pageName({ section: 'Admin', variant: 'Detail' });
190
+ * // Used for 'users', this produces 'AdminUsersDetailPage'.
191
+ * const resourcePage = pageName(({ resource }) => ({
192
+ * section: resource === 'users' ? 'Admin' : 'Public'
193
+ * }));
194
+ * // Used for 'users', this produces 'AdminUsersPage'.
195
+ * // Other resources receive the 'Public' section instead.
196
+ * ```
197
+ *
198
+ * @example
199
+ * Use a schema when a part should accept a number instead of a string.
200
+ * Supplied keys are suggested by the editor and checked against the schema.
201
+ * ```ts
202
+ * const versionedName = defineLayoutName
203
+ * .defineParts({ section: 'string', version: 'number' })
204
+ * .namingFn({
205
+ * pattern: ({ resource, capitalize }, parts) =>
206
+ * `${parts.section}${capitalize(resource)}V${parts.version}`
207
+ * });
208
+ * const adminV2 = versionedName({ section: 'Admin', version: 2 });
209
+ * // Used for 'users', this produces 'AdminUsersV2'.
210
+ * // versionedName({ version: '2' }) is rejected: version must be a number.
211
+ * ```
212
+ *
213
+ * @example
214
+ * Guard optional numeric values before formatting them with number methods.
215
+ * Plain interpolation, as above, already handles empty values.
216
+ * ```ts
217
+ * const formattedName = defineLayoutName
218
+ * .defineParts({ version: 'number' })
219
+ * .namingFn({
220
+ * pattern: ({ resource, capitalize }, parts) => {
221
+ * const version =
222
+ * typeof parts.version === 'number' ? parts.version.toFixed(0) : '';
223
+ * return `${capitalize(resource)}V${version}`;
224
+ * }
225
+ * });
226
+ * ```
227
+ *
228
+ * @example
229
+ * Opt out of part checking when a convention intentionally accepts external
230
+ * keys and mixed value types. The resulting displayName is typed as string.
231
+ * ```ts
232
+ * const externalName = defineLayoutName
233
+ * .defineParts({ version: 'number' })
234
+ * .namingFn({
235
+ * pattern: ({ resource }, parts) =>
236
+ * `${resource}${parts.version}${parts.extra}`,
237
+ * strict: false
238
+ * });
239
+ * const legacy = externalName({ version: 'legacy', extra: true });
240
+ * ```
241
+ */
242
+ declare function defineLayoutName<const Pattern extends string, const Strict extends boolean = true>(definition: LayoutNameOptions<typeof defaultPartDefinitions, Pattern, Strict>): LayoutNameFactory<typeof defaultPartDefinitions, Pattern, Strict>;
243
+ declare namespace defineLayoutName {
244
+ var defineParts: {
245
+ <const Keys extends readonly string[]>(...keys: Keys): DefinedLayoutNameParts<{ [Key in Keys[number]]: "string" }>;
246
+ <const Definitions extends LayoutNamePartDefinitions>(definitions: Definitions): DefinedLayoutNameParts<Definitions>;
247
+ };
248
+ }
47
249
  //#endregion
48
- export { LayoutNameContext, LayoutNameInput, LayoutNameParts, LayoutNameResolver, ResolvedLayoutName, defineLayoutName };
250
+ export { LayoutNameCallback, LayoutNameContext, LayoutNameFactory, LayoutNameInput, LayoutNameOptions, LayoutNamePartDefinitions, LayoutNamePartType, LayoutNamePartValues, LayoutNameParts, LayoutNameResolver, ResolvedLayoutName, defineLayoutName };
49
251
  //# sourceMappingURL=layout-name.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"layout-name.d.mts","names":[],"sources":["../../src/create-config/layout-name.ts"],"mappings":";;;;cAEc,iBAAA;AAAA,KACT,aAAA;EAAA,UAAqC,iBAAiB;AAAA;AAAA,KACtD,gBAAA;AAAA,KACA,kBAAA,GAAqB,IAAA,CACxB,iBAAA,CAAkB,aAAA;EAGlB,UAAA,qBACE,KAAA,EAAO,CAAA,KACJ,CAAA,SAAU,aAAA,GAAgB,gBAAA,GAAmB,UAAA,CAAW,CAAA;AAAA;AAAA,KAE1D,WAAA;AAAA,KACA,WAAA;AAAA,KACA,WAAA;AAAA,UACY,iBAAA;EAIf,QAAA,EAAU,QAAA;EACV,MAAA,WAAiB,KAAA;EACjB,UAAA,SAAmB,UAAA;AAAA;AAAA,UAEJ,eAAA;EACf,MAAA;EACA,YAAA;EACA,MAAA;AAAA;AAAA,KAEG,YAAA;EACH,MAAA,EAAQ,WAAA;EACR,YAAA,EAAc,WAAA;EACd,MAAA,EAAQ,WAAA;AAAA;AAAA,KAEL,OAAA,6DAID,CAAA,sBAAuB,IAAA,kBACpB,CAAA,GAAI,EAAA,GAAK,OAAA,CAAQ,CAAA,EAAG,IAAA,EAAM,EAAA,MAC7B,CAAA;AAAA,KACC,eAAA,8CAGD,CAAA,YAAa,aAAA,qBACV,QAAA,GAAW,eAAA,CAAgB,IAAA,EAAM,QAAA,MACpC,CAAA,4CACG,KAAA,GAAQ,eAAA,CAAgB,IAAA,EAAM,QAAA,MACjC,CAAA;AAAA,KACC,IAAA,oBAAwB,eAAA,IAAmB,CAAA,eAAgB,CAAA,GAC5D,OAAA,CAAQ,CAAA,CAAE,CAAA;AAAA,KAEF,kBAAA,gEAIR,eAAA,CACF,OAAA,CACE,OAAA,CACE,OAAA,CACE,OAAA,CAAQ,OAAA,EAAS,WAAA,EAAa,IAAA,CAAK,KAAA,cACnC,WAAA,EACA,IAAA,CAAK,KAAA,oBAEP,WAAA,EACA,IAAA,CAAK,KAAA,cAEP,gBAAA,EACA,UAAA,CAAW,QAAA,IAEb,QAAA;AAAA,cAEW,iBAAA;AAAA,UACI,kBAAA;EAAA,CAId,OAAA,EAAS,iBAAA;EAAA,UACA,iBAAA;IAAsB,OAAA,EAAS,OAAA;IAAS,KAAA,EAAO,KAAA;EAAA;AAAA;AAAA,KAE/C,eAAA,mGAIR,IAAA,KAAS,OAAA,EAAS,iBAAA,CAAkB,QAAA,EAAU,MAAA,MAAY,IAAA;AAAA,KAClD,kBAAA,oCAGR,MAAA,SAAe,kBAAA,+BACf,kBAAA,CAAmB,OAAA,EAAS,QAAA,EAAU,KAAA,IACtC,MAAA,cAAmB,IAAA,4BACnB,OAAA,CAAQ,MAAA,YACR,MAAA,kBACA,MAAA;;iBAGY,gBAAA,+BACd,OAAA,GAAU,OAAA,EAAS,kBAAA,EAAoB,KAAA,EAAO,YAAA,KAAiB,OAAA,wBAE7B,eAAA,OAAe,KAAA,GACvC,KAAA,KAAU,OAAA,EAAS,kBAAA,KAAuB,KAAA,MACjD,kBAAA,CAAmB,OAAA,EAAS,KAAA"}
1
+ {"version":3,"file":"layout-name.d.mts","names":[],"sources":["../../src/create-config/layout-name.ts"],"mappings":";;;;;AAAiD;cASnC,qBAAA;AAAA,KACT,eAAA,+DAGD,KAAA;EAAA,UACQ,qBAAA,GAAwB,GAAA;AAAA;AAAA,KAE/B,kBAAA,GAAqB,IAAA,CACxB,iBAAA,CAAkB,eAAA;EAGlB,UAAA,qBACE,KAAA,EAAO,CAAA,KACJ,CAAA,SAAU,eAAA,eACX,eAAA,0BACA,UAAA,CAAW,CAAA;AAAA;AAAA,UAEA,iBAAA;EAIf,QAAA,EAAU,QAAA;EACV,MAAA,WAAiB,KAAA;EACjB,UAAA,SAAmB,UAAA;AAAA;AAAA,UAEJ,eAAA;EACf,MAAA;EACA,YAAA;EACA,MAAA;AAAA;;AAvBqC;AAAA;KA4B3B,kBAAA;;;;KAKA,yBAAA,GAA4B,QAAA,CACtC,MAAA,SAAe,kBAAA;;;;UAMA,iBAAA,qBACK,yBAAA;EA/BL;;;EAsCf,OAAA,EAAS,aAAA,CAAc,WAAA,EAAa,OAAA,EAAS,MAAA;EA9CrB;;;EAkDxB,MAAA,GAAS,MAAA;AAAA;;;;KAMN,oBAAA,qBAAyC,yBAAA,oBAE5B,WAAA,YACZ,MAAA;AAAA,KAED,SAAA,cAAuB,kBAAA,IAAsB,IAAI;;AArDpC;AAElB;KA0DY,oBAAA,qBACU,yBAAA,oBAEN,WAAA,IAAe,SAAA,CAAU,WAAA,CAAY,GAAA;AAAA,KAGhD,YAAA,qBAAiC,yBAAA,oBACtB,WAAA,YAAuB,eAAA,SAC3B,GAAA,IACR,SAAA,CAAU,WAAA,CAAY,GAAA;AAAA,KAGrB,QAAA,UAAkB,KAAA,8BAAmC,KAAK;AAAA,KAC1D,IAAA,0BAA8B,KAAA,IAAS,QAAA,CAAS,KAAA,CAAM,GAAA;AAAA,KACtD,yBAAA;EACH,QAAA,EAAU,QAAA;EACV,mBAAA,EAAqB,UAAA,CAAW,QAAA;AAAA;AAAA,KAE7B,iBAAA,mCAGD,yBAAA,CAA0B,QAAA,oBACd,KAAA,qBAA0B,GAAA,KAAQ,cAAA,CAC9C,IAAA,CAAK,KAAA,EAAO,GAAA,GACZ,yBAAA,CAA0B,QAAA;AAAA,KAGzB,gBAAA,mDACW,MAAA,YAAkB,OAAA,SAC5B,eAAA,CAAgB,GAAA,OACb,eAAA,CAAgB,GAAA,SAChB,eAAA,CAAgB,GAAA,eAClB,OAAA,CAAQ,MAAA,CAAO,GAAA,kBAChB,OAAA,YAAmB,eAAA,CAAgB,GAAA,oBAClC,OAAA,CAAQ,MAAA,CAAO,GAAA,YAAe,IAAA,IAC/B,OAAA,YAAmB,eAAA,CAAgB,GAAA,4BAClC,OAAA,CAAQ,MAAA,CAAO,GAAA,YAAe,IAAA,kBAE7B,MAAA;AAAA,KACH,cAAA,gEAIA,gBAAA,CAAiB,OAAA,EAAS,MAAA,qBAC3B,OAAA,yCACE,cAAA,CAAe,IAAA,EAAM,MAAA,KAAW,MAAA,GAAS,KAAA,SACtC,MAAA,GAAS,OAAA,KACd,gBAAA,CAAiB,OAAA,EAAS,MAAA,oEAI1B,cAAA,CAAe,IAAA,EAAM,MAAA,KAAW,MAAA,GAAS,KAAA;AAAA,KAEjC,kBAAA,gEAIR,cAAA,CAAe,OAAA,EAAS,iBAAA,CAAkB,QAAA,EAAU,KAAA;AAAA,cAC3C,iBAAA;AAAA,UAGI,kBAAA;EAAA,CAId,OAAA,EAAS,iBAAA;EAAA,UACA,iBAAA;IAAsB,OAAA,EAAS,OAAA;IAAS,KAAA,EAAO,KAAA;EAAA;AAAA;AAvG3D;;;AAAA,KA4GY,kBAAA,oGAIP,OAAA,EAAS,iBAAA,CAAkB,QAAA,EAAU,MAAA,MAAY,IAAA;AAAA,KAE1C,eAAA,mGAIR,IAAA,GAAO,kBAAA,CAAmB,QAAA,EAAU,MAAA,EAAQ,IAAA;AAAA,KACpC,kBAAA,qCACV,MAAA,2BAEK,UAAA,CAAW,QAAA,YACd,MAAA,SAAe,kBAAA,+BACf,kBAAA,CAAmB,OAAA,EAAS,QAAA,EAAU,KAAA,IACtC,MAAA,cAAmB,IAAA,4BACnB,OAAA,CAAQ,MAAA,YACR,MAAA,kBACA,MAAA,MACG,UAAA,CAAW,QAAA;AAAA,KACb,gBAAA,qBACiB,yBAAA,gBACN,oBAAA,CAAqB,WAAA,sBAEpB,oBAAA,CAAqB,WAAA,IAClC,KAAA,IAAS,GAAA,eAAkB,WAAA,IACxB,oBAAA,CAAqB,WAAA,IAAe,KAAA,EAAO,GAAA;AAAA,KAI7C,mBAAA,qBACiB,yBAAA,gBACN,oBAAA,CAAqB,WAAA,MAChC,OAAA,EAAS,kBAAA,KAAuB,gBAAA,CAAiB,WAAA,EAAa,KAAA;AAAA,KAE9D,aAAA,qBACiB,yBAAA,2BAGN,WAAA,GAAc,GAAA,eAAkB,KAAA,GAAQ,KAAA,CAAM,GAAA;AAAA,KAGzD,aAAA,qBACiB,yBAAA,4DAIpB,OAAA,EAAS,kBAAA,EACT,KAAA,GAAQ,MAAA,oBACJ,oBAAA,CAAqB,WAAA,IACrB,YAAA,CAAa,WAAA,MACd,OAAA;;;;UAKK,wBAAA,qBACY,yBAAA;EAxJX;;;;;;;;EAAA,qBAmKY,oBAAA,CAAqB,WAAA,QACxC,KAAA,GACI,gBAAA,CAAiB,WAAA,EAAa,KAAA,IAC9B,mBAAA,CAAoB,WAAA,EAAa,KAAA,IACpC,kBAAA,CAAmB,OAAA,EAAS,aAAA,CAAc,WAAA,EAAa,KAAA;AAAA;AAAA,UAGlD,0BAAA,qBACY,yBAAA;EAAA,CAGlB,KAAA,GACI,oBAAA,CAAqB,WAAA,MAEnB,OAAA,EAAS,kBAAA,KACN,oBAAA,CAAqB,WAAA,KAC7B,kBAAA;AAAA;;;;AA/KY;KAsLL,iBAAA,qBACU,yBAAA,4DAGjB,MAAA,oBACD,0BAAA,CAA2B,WAAA,IAC3B,wBAAA,CAAyB,WAAA,EAAa,OAAA;AAAA,UAEhC,sBAAA,qBACY,yBAAA;EAzLG;;;;EA+LvB,QAAA,oEAIE,UAAA,EAAY,iBAAA,CAAkB,WAAA,EAAa,OAAA,EAAS,MAAA,IACnD,iBAAA,CAAkB,WAAA,EAAa,OAAA,EAAS,MAAA;AAAA;AAAA,cAGvC,sBAAA;;;;;;AApMM;AAAA;;;;;;;;AAE0C;AAOtD;;;;;;;;;;;;;;;;;;AAGwD;AACtD;;;;;;;;;;;;;;;;;;;;;;AAK2B;AAAA;;;;;;;;AAGkC;AAAA;;;;;;;;;;;;;;;;AACD;AAAA;;;;;;;;;;;;;;;AAGpB;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQJ;iBAoZtB,gBAAA,oEAId,UAAA,EAAY,iBAAA,QACH,sBAAA,EACP,OAAA,EACA,MAAA,IAED,iBAAA,QAAyB,sBAAA,EAAwB,OAAA,EAAS,MAAA;AAAA,kBAT7C,gBAAA;EAAA;8CAiByC,IAAA,EAC9C,IAAA,GACR,sBAAA,WAAiC,IAAA;IAAA,2BAKW,yBAAA,EAAyB,WAAA,EACzD,WAAA,GACZ,sBAAA,CAAuB,WAAA;EAAA;AAAA"}