@jfdevelops/react-layout 1.6.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/dist/create-config/create-defined-resource-layout.cjs +18 -14
  2. package/dist/create-config/create-defined-resource-layout.cjs.map +1 -1
  3. package/dist/create-config/create-defined-resource-layout.d.cts +9 -5
  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 +9 -5
  6. package/dist/create-config/create-defined-resource-layout.d.mts.map +1 -1
  7. package/dist/create-config/create-defined-resource-layout.mjs +19 -15
  8. package/dist/create-config/create-defined-resource-layout.mjs.map +1 -1
  9. package/dist/create-config/define-layout.cjs +66 -39
  10. package/dist/create-config/define-layout.cjs.map +1 -1
  11. package/dist/create-config/define-layout.d.cts +0 -5
  12. package/dist/create-config/define-layout.d.cts.map +1 -1
  13. package/dist/create-config/define-layout.d.mts +0 -5
  14. package/dist/create-config/define-layout.d.mts.map +1 -1
  15. package/dist/create-config/define-layout.mjs +67 -40
  16. package/dist/create-config/define-layout.mjs.map +1 -1
  17. package/dist/create-config/for-resources/create-component.d.cts +39 -21
  18. package/dist/create-config/for-resources/create-component.d.cts.map +1 -1
  19. package/dist/create-config/for-resources/create-component.d.mts +39 -21
  20. package/dist/create-config/for-resources/create-component.d.mts.map +1 -1
  21. package/dist/create-config/for-resources/create-for-resources.cjs +62 -7
  22. package/dist/create-config/for-resources/create-for-resources.cjs.map +1 -1
  23. package/dist/create-config/for-resources/create-for-resources.mjs +62 -7
  24. package/dist/create-config/for-resources/create-for-resources.mjs.map +1 -1
  25. package/dist/create-config/for-resources/scoped-render.cjs +1 -0
  26. package/dist/create-config/for-resources/scoped-render.cjs.map +1 -1
  27. package/dist/create-config/for-resources/scoped-render.d.cts.map +1 -1
  28. package/dist/create-config/for-resources/scoped-render.d.mts.map +1 -1
  29. package/dist/create-config/for-resources/scoped-render.mjs +1 -0
  30. package/dist/create-config/for-resources/scoped-render.mjs.map +1 -1
  31. package/dist/create-config/index.d.cts +2 -1
  32. package/dist/create-config/index.d.mts +2 -1
  33. package/dist/create-config/layout-name.cjs +36 -28
  34. package/dist/create-config/layout-name.cjs.map +1 -1
  35. package/dist/create-config/layout-name.d.cts +34 -28
  36. package/dist/create-config/layout-name.d.cts.map +1 -1
  37. package/dist/create-config/layout-name.d.mts +34 -28
  38. package/dist/create-config/layout-name.d.mts.map +1 -1
  39. package/dist/create-config/layout-name.mjs +36 -28
  40. package/dist/create-config/layout-name.mjs.map +1 -1
  41. package/dist/create-config/lazy-resource-layout.cjs +70 -86
  42. package/dist/create-config/lazy-resource-layout.cjs.map +1 -1
  43. package/dist/create-config/lazy-resource-layout.d.cts +9 -31
  44. package/dist/create-config/lazy-resource-layout.d.cts.map +1 -1
  45. package/dist/create-config/lazy-resource-layout.d.mts +9 -31
  46. package/dist/create-config/lazy-resource-layout.d.mts.map +1 -1
  47. package/dist/create-config/lazy-resource-layout.mjs +70 -86
  48. package/dist/create-config/lazy-resource-layout.mjs.map +1 -1
  49. package/dist/create-config/preview.cjs +1 -1
  50. package/dist/create-config/preview.d.cts +2 -0
  51. package/dist/create-config/preview.d.cts.map +1 -1
  52. package/dist/create-config/preview.d.mts +2 -0
  53. package/dist/create-config/preview.d.mts.map +1 -1
  54. package/dist/create-config/preview.mjs +1 -1
  55. package/dist/create-config/render-state.cjs +57 -18
  56. package/dist/create-config/render-state.cjs.map +1 -1
  57. package/dist/create-config/render-state.d.cts +18 -6
  58. package/dist/create-config/render-state.d.cts.map +1 -1
  59. package/dist/create-config/render-state.d.mts +18 -6
  60. package/dist/create-config/render-state.d.mts.map +1 -1
  61. package/dist/create-config/render-state.mjs +54 -18
  62. package/dist/create-config/render-state.mjs.map +1 -1
  63. package/dist/errors/lazy-resource-error.cjs +37 -0
  64. package/dist/errors/lazy-resource-error.cjs.map +1 -0
  65. package/dist/errors/lazy-resource-error.d.cts +26 -0
  66. package/dist/errors/lazy-resource-error.d.cts.map +1 -0
  67. package/dist/errors/lazy-resource-error.d.mts +26 -0
  68. package/dist/errors/lazy-resource-error.d.mts.map +1 -0
  69. package/dist/errors/lazy-resource-error.mjs +35 -0
  70. package/dist/errors/lazy-resource-error.mjs.map +1 -0
  71. package/dist/errors/react-layout-error.cjs +1 -1
  72. package/dist/errors/react-layout-error.mjs +1 -1
  73. package/dist/errors/resource-state-error.cjs +4 -1
  74. package/dist/errors/resource-state-error.cjs.map +1 -1
  75. package/dist/errors/resource-state-error.d.cts +1 -0
  76. package/dist/errors/resource-state-error.d.cts.map +1 -1
  77. package/dist/errors/resource-state-error.d.mts +1 -0
  78. package/dist/errors/resource-state-error.d.mts.map +1 -1
  79. package/dist/errors/resource-state-error.mjs +4 -1
  80. package/dist/errors/resource-state-error.mjs.map +1 -1
  81. package/dist/index.cjs +6 -2
  82. package/dist/index.d.cts +7 -4
  83. package/dist/index.d.mts +7 -4
  84. package/dist/index.mjs +4 -3
  85. package/dist/lazy/create-error-component.cjs +17 -0
  86. package/dist/lazy/create-error-component.cjs.map +1 -0
  87. package/dist/lazy/create-error-component.mjs +16 -0
  88. package/dist/lazy/create-error-component.mjs.map +1 -0
  89. package/dist/lazy/create-lazy-loader.cjs +78 -0
  90. package/dist/lazy/create-lazy-loader.cjs.map +1 -0
  91. package/dist/lazy/create-lazy-loader.d.cts +19 -0
  92. package/dist/lazy/create-lazy-loader.d.cts.map +1 -0
  93. package/dist/lazy/create-lazy-loader.d.mts +19 -0
  94. package/dist/lazy/create-lazy-loader.d.mts.map +1 -0
  95. package/dist/lazy/create-lazy-loader.mjs +78 -0
  96. package/dist/lazy/create-lazy-loader.mjs.map +1 -0
  97. package/dist/lazy/fallback-props.cjs +9 -0
  98. package/dist/lazy/fallback-props.cjs.map +1 -0
  99. package/dist/lazy/fallback-props.mjs +9 -0
  100. package/dist/lazy/fallback-props.mjs.map +1 -0
  101. package/dist/lazy/inspection.cjs +51 -0
  102. package/dist/lazy/inspection.cjs.map +1 -0
  103. package/dist/lazy/inspection.d.cts +28 -0
  104. package/dist/lazy/inspection.d.cts.map +1 -0
  105. package/dist/lazy/inspection.d.mts +28 -0
  106. package/dist/lazy/inspection.d.mts.map +1 -0
  107. package/dist/lazy/inspection.mjs +50 -0
  108. package/dist/lazy/inspection.mjs.map +1 -0
  109. package/dist/lazy/lazy-boundary.cjs +55 -0
  110. package/dist/lazy/lazy-boundary.cjs.map +1 -0
  111. package/dist/lazy/lazy-boundary.mjs +55 -0
  112. package/dist/lazy/lazy-boundary.mjs.map +1 -0
  113. package/dist/lazy/scoped-content.cjs +87 -0
  114. package/dist/lazy/scoped-content.cjs.map +1 -0
  115. package/dist/lazy/scoped-content.d.cts +19 -0
  116. package/dist/lazy/scoped-content.d.cts.map +1 -0
  117. package/dist/lazy/scoped-content.d.mts +19 -0
  118. package/dist/lazy/scoped-content.d.mts.map +1 -0
  119. package/dist/lazy/scoped-content.mjs +86 -0
  120. package/dist/lazy/scoped-content.mjs.map +1 -0
  121. package/dist/lazy/types.cjs +10 -0
  122. package/dist/lazy/types.cjs.map +1 -0
  123. package/dist/lazy/types.d.cts +39 -0
  124. package/dist/lazy/types.d.cts.map +1 -0
  125. package/dist/lazy/types.d.mts +39 -0
  126. package/dist/lazy/types.d.mts.map +1 -0
  127. package/dist/lazy/types.mjs +8 -0
  128. package/dist/lazy/types.mjs.map +1 -0
  129. package/dist/props.cjs +4 -2
  130. package/dist/props.cjs.map +1 -1
  131. package/dist/props.d.cts +6 -50
  132. package/dist/props.d.cts.map +1 -1
  133. package/dist/props.d.mts +6 -50
  134. package/dist/props.d.mts.map +1 -1
  135. package/dist/props.mjs +5 -2
  136. package/dist/props.mjs.map +1 -1
  137. package/dist/resource.cjs.map +1 -1
  138. package/dist/resource.d.cts +1 -1
  139. package/dist/resource.d.cts.map +1 -1
  140. package/dist/resource.d.mts +1 -1
  141. package/dist/resource.d.mts.map +1 -1
  142. package/dist/resource.mjs.map +1 -1
  143. package/package.json +2 -2
@@ -80,7 +80,6 @@ type NamingPartsInput<Definitions extends LayoutNamePartDefinitions, Parts exten
80
80
  type NamingPartsCallback<Definitions extends LayoutNamePartDefinitions, Parts extends LayoutNamePartValues<Definitions>> = (context: PatternNameContext) => NamingPartsInput<Definitions, Parts>;
81
81
  type ResolvedParts<Definitions extends LayoutNamePartDefinitions, Parts> = { [Key in keyof Definitions]: Key extends keyof Parts ? Parts[Key] : '' };
82
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
- type NamingDefinition<Definitions extends LayoutNamePartDefinitions, Pattern extends string, Strict extends boolean> = NamingPattern<Definitions, Pattern, Strict> | LayoutNameOptions<Definitions, Pattern, Strict>;
84
83
  /**
85
84
  * Supplies optional part values while preserving their literal types in names.
86
85
  */
@@ -108,7 +107,7 @@ interface DefinedLayoutNameParts<Definitions extends LayoutNamePartDefinitions>
108
107
  * Defines the naming pattern and optional strict-checking policy.
109
108
  * Strict defaults to true; false accepts unchecked part keys and values.
110
109
  */
111
- namingFn<const Pattern extends string, const Strict extends boolean = true>(definition: NamingDefinition<Definitions, Pattern, Strict>): LayoutNameFactory<Definitions, Pattern, Strict>;
110
+ namingFn<const Pattern extends string, const Strict extends boolean = true>(definition: LayoutNameOptions<Definitions, Pattern, Strict>): LayoutNameFactory<Definitions, Pattern, Strict>;
112
111
  }
113
112
  declare const defaultPartDefinitions: {
114
113
  prefix: "string";
@@ -126,11 +125,11 @@ declare const defaultPartDefinitions: {
126
125
  *
127
126
  * Choose the form that matches the values your convention needs:
128
127
  *
129
- * - `defineLayoutName(pattern)` provides the string parts `prefix`,
128
+ * - `defineLayoutName({ pattern })` provides the string parts `prefix`,
130
129
  * `beforeSuffix`, and `append` for common naming variations.
131
- * - `defineLayoutName.defineParts(...names).namingFn(pattern)` provides custom
130
+ * - `defineLayoutName.defineParts(...names).namingFn({ pattern })` provides custom
132
131
  * string parts when domain-specific names make the pattern clearer.
133
- * - `defineLayoutName.defineParts(schema).namingFn(pattern)` declares each
132
+ * - `defineLayoutName.defineParts(schema).namingFn({ pattern })` declares each
134
133
  * part as `'string'` or `'number'` when supplied values need different types.
135
134
  *
136
135
  * The pattern controls where parts appear; their names do not impose an order.
@@ -147,29 +146,32 @@ declare const defaultPartDefinitions: {
147
146
  * in namingFn to accept unchecked part keys and values in both TypeScript
148
147
  * and runtime calls. Unchecked conventions return string names.
149
148
  *
150
- * @param definition - A pattern callback, or an object containing the pattern
151
- * and optional strict-checking policy.
149
+ * @param definition - An object containing the naming pattern and optional
150
+ * strict-checking policy.
152
151
  * @returns A function accepting optional part values or a context callback.
153
152
  * Calling it with no arguments leaves every declared part empty.
154
153
  *
155
154
  * @example
156
155
  * Use the default string parts for a shared convention with occasional variants.
157
156
  * ```tsx
158
- * const layoutName = defineLayoutName(({ resource, capitalize }, parts) =>
159
- * `${parts.prefix}${capitalize(resource)}${parts.beforeSuffix}Layout${parts.append}`,
160
- * );
157
+ * const layoutName = defineLayoutName({
158
+ * pattern: ({ resource, capitalize }, parts) =>
159
+ * `${parts.prefix}${capitalize(resource)}${parts.beforeSuffix}Layout${
160
+ * parts.append
161
+ * }`
162
+ * });
161
163
  * const factory = createDefinedResourceLayout({
162
164
  * resources: ['users'],
163
- * name: layoutName(),
165
+ * name: layoutName()
164
166
  * });
165
167
  * const { createResourceLayout } = factory.defineResourceLayout({
166
- * render: () => <div />,
168
+ * render: () => <div />
167
169
  * });
168
170
  * const Users = createResourceLayout({ resource: 'users' });
169
171
  * // Users.displayName is typed as 'UsersLayout'.
170
172
  * const AdminUsers = createResourceLayout({
171
173
  * resource: 'users',
172
- * name: layoutName({ prefix: 'Admin', beforeSuffix: 'Detail' }),
174
+ * name: layoutName({ prefix: 'Admin', beforeSuffix: 'Detail' })
173
175
  * });
174
176
  * // AdminUsers.displayName is typed as 'AdminUsersDetailLayout'.
175
177
  * ```
@@ -180,13 +182,14 @@ declare const defaultPartDefinitions: {
180
182
  * ```ts
181
183
  * const pageName = defineLayoutName
182
184
  * .defineParts('section', 'variant')
183
- * .namingFn(({ resource, capitalize }, parts) =>
184
- * `${parts.section}${capitalize(resource)}${parts.variant}Page`,
185
- * );
185
+ * .namingFn({
186
+ * pattern: ({ resource, capitalize }, parts) =>
187
+ * `${parts.section}${capitalize(resource)}${parts.variant}Page`
188
+ * });
186
189
  * const adminPage = pageName({ section: 'Admin', variant: 'Detail' });
187
190
  * // Used for 'users', this produces 'AdminUsersDetailPage'.
188
191
  * const resourcePage = pageName(({ resource }) => ({
189
- * section: resource === 'users' ? 'Admin' : 'Public',
192
+ * section: resource === 'users' ? 'Admin' : 'Public'
190
193
  * }));
191
194
  * // Used for 'users', this produces 'AdminUsersPage'.
192
195
  * // Other resources receive the 'Public' section instead.
@@ -198,9 +201,10 @@ declare const defaultPartDefinitions: {
198
201
  * ```ts
199
202
  * const versionedName = defineLayoutName
200
203
  * .defineParts({ section: 'string', version: 'number' })
201
- * .namingFn(({ resource, capitalize }, parts) =>
202
- * `${parts.section}${capitalize(resource)}V${parts.version}`,
203
- * );
204
+ * .namingFn({
205
+ * pattern: ({ resource, capitalize }, parts) =>
206
+ * `${parts.section}${capitalize(resource)}V${parts.version}`
207
+ * });
204
208
  * const adminV2 = versionedName({ section: 'Admin', version: 2 });
205
209
  * // Used for 'users', this produces 'AdminUsersV2'.
206
210
  * // versionedName({ version: '2' }) is rejected: version must be a number.
@@ -212,11 +216,12 @@ declare const defaultPartDefinitions: {
212
216
  * ```ts
213
217
  * const formattedName = defineLayoutName
214
218
  * .defineParts({ version: 'number' })
215
- * .namingFn(({ resource, capitalize }, parts) => {
216
- * const version = typeof parts.version === 'number'
217
- * ? parts.version.toFixed(0)
218
- * : '';
219
- * return `${capitalize(resource)}V${version}`;
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
+ * }
220
225
  * });
221
226
  * ```
222
227
  *
@@ -227,13 +232,14 @@ declare const defaultPartDefinitions: {
227
232
  * const externalName = defineLayoutName
228
233
  * .defineParts({ version: 'number' })
229
234
  * .namingFn({
230
- * pattern: ({ resource }, parts) => `${resource}${parts.version}${parts.extra}`,
231
- * strict: false,
235
+ * pattern: ({ resource }, parts) =>
236
+ * `${resource}${parts.version}${parts.extra}`,
237
+ * strict: false
232
238
  * });
233
239
  * const legacy = externalName({ version: 'legacy', extra: true });
234
240
  * ```
235
241
  */
236
- declare function defineLayoutName<const Pattern extends string, const Strict extends boolean = true>(definition: NamingDefinition<typeof defaultPartDefinitions, Pattern, Strict>): LayoutNameFactory<typeof defaultPartDefinitions, Pattern, Strict>;
242
+ declare function defineLayoutName<const Pattern extends string, const Strict extends boolean = true>(definition: LayoutNameOptions<typeof defaultPartDefinitions, Pattern, Strict>): LayoutNameFactory<typeof defaultPartDefinitions, Pattern, Strict>;
237
243
  declare namespace defineLayoutName {
238
244
  var defineParts: {
239
245
  <const Keys extends readonly string[]>(...keys: Keys): DefinedLayoutNameParts<{ [Key in Keys[number]]: "string" }>;
@@ -1 +1 @@
1
- {"version":3,"file":"layout-name.d.cts","names":[],"sources":["../../src/create-config/layout-name.ts"],"mappings":"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"}
1
+ {"version":3,"file":"layout-name.d.cts","names":[],"sources":["../../src/create-config/layout-name.ts"],"mappings":"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"}
@@ -80,7 +80,6 @@ type NamingPartsInput<Definitions extends LayoutNamePartDefinitions, Parts exten
80
80
  type NamingPartsCallback<Definitions extends LayoutNamePartDefinitions, Parts extends LayoutNamePartValues<Definitions>> = (context: PatternNameContext) => NamingPartsInput<Definitions, Parts>;
81
81
  type ResolvedParts<Definitions extends LayoutNamePartDefinitions, Parts> = { [Key in keyof Definitions]: Key extends keyof Parts ? Parts[Key] : '' };
82
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
- type NamingDefinition<Definitions extends LayoutNamePartDefinitions, Pattern extends string, Strict extends boolean> = NamingPattern<Definitions, Pattern, Strict> | LayoutNameOptions<Definitions, Pattern, Strict>;
84
83
  /**
85
84
  * Supplies optional part values while preserving their literal types in names.
86
85
  */
@@ -108,7 +107,7 @@ interface DefinedLayoutNameParts<Definitions extends LayoutNamePartDefinitions>
108
107
  * Defines the naming pattern and optional strict-checking policy.
109
108
  * Strict defaults to true; false accepts unchecked part keys and values.
110
109
  */
111
- namingFn<const Pattern extends string, const Strict extends boolean = true>(definition: NamingDefinition<Definitions, Pattern, Strict>): LayoutNameFactory<Definitions, Pattern, Strict>;
110
+ namingFn<const Pattern extends string, const Strict extends boolean = true>(definition: LayoutNameOptions<Definitions, Pattern, Strict>): LayoutNameFactory<Definitions, Pattern, Strict>;
112
111
  }
113
112
  declare const defaultPartDefinitions: {
114
113
  prefix: "string";
@@ -126,11 +125,11 @@ declare const defaultPartDefinitions: {
126
125
  *
127
126
  * Choose the form that matches the values your convention needs:
128
127
  *
129
- * - `defineLayoutName(pattern)` provides the string parts `prefix`,
128
+ * - `defineLayoutName({ pattern })` provides the string parts `prefix`,
130
129
  * `beforeSuffix`, and `append` for common naming variations.
131
- * - `defineLayoutName.defineParts(...names).namingFn(pattern)` provides custom
130
+ * - `defineLayoutName.defineParts(...names).namingFn({ pattern })` provides custom
132
131
  * string parts when domain-specific names make the pattern clearer.
133
- * - `defineLayoutName.defineParts(schema).namingFn(pattern)` declares each
132
+ * - `defineLayoutName.defineParts(schema).namingFn({ pattern })` declares each
134
133
  * part as `'string'` or `'number'` when supplied values need different types.
135
134
  *
136
135
  * The pattern controls where parts appear; their names do not impose an order.
@@ -147,29 +146,32 @@ declare const defaultPartDefinitions: {
147
146
  * in namingFn to accept unchecked part keys and values in both TypeScript
148
147
  * and runtime calls. Unchecked conventions return string names.
149
148
  *
150
- * @param definition - A pattern callback, or an object containing the pattern
151
- * and optional strict-checking policy.
149
+ * @param definition - An object containing the naming pattern and optional
150
+ * strict-checking policy.
152
151
  * @returns A function accepting optional part values or a context callback.
153
152
  * Calling it with no arguments leaves every declared part empty.
154
153
  *
155
154
  * @example
156
155
  * Use the default string parts for a shared convention with occasional variants.
157
156
  * ```tsx
158
- * const layoutName = defineLayoutName(({ resource, capitalize }, parts) =>
159
- * `${parts.prefix}${capitalize(resource)}${parts.beforeSuffix}Layout${parts.append}`,
160
- * );
157
+ * const layoutName = defineLayoutName({
158
+ * pattern: ({ resource, capitalize }, parts) =>
159
+ * `${parts.prefix}${capitalize(resource)}${parts.beforeSuffix}Layout${
160
+ * parts.append
161
+ * }`
162
+ * });
161
163
  * const factory = createDefinedResourceLayout({
162
164
  * resources: ['users'],
163
- * name: layoutName(),
165
+ * name: layoutName()
164
166
  * });
165
167
  * const { createResourceLayout } = factory.defineResourceLayout({
166
- * render: () => <div />,
168
+ * render: () => <div />
167
169
  * });
168
170
  * const Users = createResourceLayout({ resource: 'users' });
169
171
  * // Users.displayName is typed as 'UsersLayout'.
170
172
  * const AdminUsers = createResourceLayout({
171
173
  * resource: 'users',
172
- * name: layoutName({ prefix: 'Admin', beforeSuffix: 'Detail' }),
174
+ * name: layoutName({ prefix: 'Admin', beforeSuffix: 'Detail' })
173
175
  * });
174
176
  * // AdminUsers.displayName is typed as 'AdminUsersDetailLayout'.
175
177
  * ```
@@ -180,13 +182,14 @@ declare const defaultPartDefinitions: {
180
182
  * ```ts
181
183
  * const pageName = defineLayoutName
182
184
  * .defineParts('section', 'variant')
183
- * .namingFn(({ resource, capitalize }, parts) =>
184
- * `${parts.section}${capitalize(resource)}${parts.variant}Page`,
185
- * );
185
+ * .namingFn({
186
+ * pattern: ({ resource, capitalize }, parts) =>
187
+ * `${parts.section}${capitalize(resource)}${parts.variant}Page`
188
+ * });
186
189
  * const adminPage = pageName({ section: 'Admin', variant: 'Detail' });
187
190
  * // Used for 'users', this produces 'AdminUsersDetailPage'.
188
191
  * const resourcePage = pageName(({ resource }) => ({
189
- * section: resource === 'users' ? 'Admin' : 'Public',
192
+ * section: resource === 'users' ? 'Admin' : 'Public'
190
193
  * }));
191
194
  * // Used for 'users', this produces 'AdminUsersPage'.
192
195
  * // Other resources receive the 'Public' section instead.
@@ -198,9 +201,10 @@ declare const defaultPartDefinitions: {
198
201
  * ```ts
199
202
  * const versionedName = defineLayoutName
200
203
  * .defineParts({ section: 'string', version: 'number' })
201
- * .namingFn(({ resource, capitalize }, parts) =>
202
- * `${parts.section}${capitalize(resource)}V${parts.version}`,
203
- * );
204
+ * .namingFn({
205
+ * pattern: ({ resource, capitalize }, parts) =>
206
+ * `${parts.section}${capitalize(resource)}V${parts.version}`
207
+ * });
204
208
  * const adminV2 = versionedName({ section: 'Admin', version: 2 });
205
209
  * // Used for 'users', this produces 'AdminUsersV2'.
206
210
  * // versionedName({ version: '2' }) is rejected: version must be a number.
@@ -212,11 +216,12 @@ declare const defaultPartDefinitions: {
212
216
  * ```ts
213
217
  * const formattedName = defineLayoutName
214
218
  * .defineParts({ version: 'number' })
215
- * .namingFn(({ resource, capitalize }, parts) => {
216
- * const version = typeof parts.version === 'number'
217
- * ? parts.version.toFixed(0)
218
- * : '';
219
- * return `${capitalize(resource)}V${version}`;
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
+ * }
220
225
  * });
221
226
  * ```
222
227
  *
@@ -227,13 +232,14 @@ declare const defaultPartDefinitions: {
227
232
  * const externalName = defineLayoutName
228
233
  * .defineParts({ version: 'number' })
229
234
  * .namingFn({
230
- * pattern: ({ resource }, parts) => `${resource}${parts.version}${parts.extra}`,
231
- * strict: false,
235
+ * pattern: ({ resource }, parts) =>
236
+ * `${resource}${parts.version}${parts.extra}`,
237
+ * strict: false
232
238
  * });
233
239
  * const legacy = externalName({ version: 'legacy', extra: true });
234
240
  * ```
235
241
  */
236
- declare function defineLayoutName<const Pattern extends string, const Strict extends boolean = true>(definition: NamingDefinition<typeof defaultPartDefinitions, Pattern, Strict>): LayoutNameFactory<typeof defaultPartDefinitions, Pattern, Strict>;
242
+ declare function defineLayoutName<const Pattern extends string, const Strict extends boolean = true>(definition: LayoutNameOptions<typeof defaultPartDefinitions, Pattern, Strict>): LayoutNameFactory<typeof defaultPartDefinitions, Pattern, Strict>;
237
243
  declare namespace defineLayoutName {
238
244
  var defineParts: {
239
245
  <const Keys extends readonly string[]>(...keys: Keys): DefinedLayoutNameParts<{ [Key in Keys[number]]: "string" }>;
@@ -1 +1 @@
1
- {"version":3,"file":"layout-name.d.mts","names":[],"sources":["../../src/create-config/layout-name.ts"],"mappings":"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"}
1
+ {"version":3,"file":"layout-name.d.mts","names":[],"sources":["../../src/create-config/layout-name.ts"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
+ import { LayoutConfigurationError } from "../errors/layout-configuration-error.mjs";
1
2
  import { InvalidPartError } from "../errors/invalid-part.mjs";
2
3
  import { InvalidPartTypeError } from "../errors/invalid-part-type.mjs";
3
- import { LayoutConfigurationError } from "../errors/layout-configuration-error.mjs";
4
4
 
5
5
  //#region src/create-config/layout-name.ts
6
6
  const layoutNamePattern = Symbol("layoutNamePattern");
@@ -31,8 +31,9 @@ function validatePartValues(definitions, values) {
31
31
  return Object.fromEntries(supplied);
32
32
  }
33
33
  function createNamingFactory(definitions, definition) {
34
- const pattern = typeof definition === "function" ? definition : definition.pattern;
35
- const strict = typeof definition === "function" || definition.strict !== false;
34
+ if (definition === null || typeof definition !== "object" || typeof definition.pattern !== "function") throw new LayoutConfigurationError("Naming configuration must be an object containing a pattern function.");
35
+ const { pattern } = definition;
36
+ const strict = definition.strict !== false;
36
37
  const defaults = Object.fromEntries(Object.keys(definitions).map((key) => [key, ""]));
37
38
  function name(parts) {
38
39
  if (strict && typeof parts !== "function") validatePartValues(definitions, parts);
@@ -60,11 +61,11 @@ function createNamingFactory(definitions, definition) {
60
61
  *
61
62
  * Choose the form that matches the values your convention needs:
62
63
  *
63
- * - `defineLayoutName(pattern)` provides the string parts `prefix`,
64
+ * - `defineLayoutName({ pattern })` provides the string parts `prefix`,
64
65
  * `beforeSuffix`, and `append` for common naming variations.
65
- * - `defineLayoutName.defineParts(...names).namingFn(pattern)` provides custom
66
+ * - `defineLayoutName.defineParts(...names).namingFn({ pattern })` provides custom
66
67
  * string parts when domain-specific names make the pattern clearer.
67
- * - `defineLayoutName.defineParts(schema).namingFn(pattern)` declares each
68
+ * - `defineLayoutName.defineParts(schema).namingFn({ pattern })` declares each
68
69
  * part as `'string'` or `'number'` when supplied values need different types.
69
70
  *
70
71
  * The pattern controls where parts appear; their names do not impose an order.
@@ -81,29 +82,32 @@ function createNamingFactory(definitions, definition) {
81
82
  * in namingFn to accept unchecked part keys and values in both TypeScript
82
83
  * and runtime calls. Unchecked conventions return string names.
83
84
  *
84
- * @param definition - A pattern callback, or an object containing the pattern
85
- * and optional strict-checking policy.
85
+ * @param definition - An object containing the naming pattern and optional
86
+ * strict-checking policy.
86
87
  * @returns A function accepting optional part values or a context callback.
87
88
  * Calling it with no arguments leaves every declared part empty.
88
89
  *
89
90
  * @example
90
91
  * Use the default string parts for a shared convention with occasional variants.
91
92
  * ```tsx
92
- * const layoutName = defineLayoutName(({ resource, capitalize }, parts) =>
93
- * `${parts.prefix}${capitalize(resource)}${parts.beforeSuffix}Layout${parts.append}`,
94
- * );
93
+ * const layoutName = defineLayoutName({
94
+ * pattern: ({ resource, capitalize }, parts) =>
95
+ * `${parts.prefix}${capitalize(resource)}${parts.beforeSuffix}Layout${
96
+ * parts.append
97
+ * }`
98
+ * });
95
99
  * const factory = createDefinedResourceLayout({
96
100
  * resources: ['users'],
97
- * name: layoutName(),
101
+ * name: layoutName()
98
102
  * });
99
103
  * const { createResourceLayout } = factory.defineResourceLayout({
100
- * render: () => <div />,
104
+ * render: () => <div />
101
105
  * });
102
106
  * const Users = createResourceLayout({ resource: 'users' });
103
107
  * // Users.displayName is typed as 'UsersLayout'.
104
108
  * const AdminUsers = createResourceLayout({
105
109
  * resource: 'users',
106
- * name: layoutName({ prefix: 'Admin', beforeSuffix: 'Detail' }),
110
+ * name: layoutName({ prefix: 'Admin', beforeSuffix: 'Detail' })
107
111
  * });
108
112
  * // AdminUsers.displayName is typed as 'AdminUsersDetailLayout'.
109
113
  * ```
@@ -114,13 +118,14 @@ function createNamingFactory(definitions, definition) {
114
118
  * ```ts
115
119
  * const pageName = defineLayoutName
116
120
  * .defineParts('section', 'variant')
117
- * .namingFn(({ resource, capitalize }, parts) =>
118
- * `${parts.section}${capitalize(resource)}${parts.variant}Page`,
119
- * );
121
+ * .namingFn({
122
+ * pattern: ({ resource, capitalize }, parts) =>
123
+ * `${parts.section}${capitalize(resource)}${parts.variant}Page`
124
+ * });
120
125
  * const adminPage = pageName({ section: 'Admin', variant: 'Detail' });
121
126
  * // Used for 'users', this produces 'AdminUsersDetailPage'.
122
127
  * const resourcePage = pageName(({ resource }) => ({
123
- * section: resource === 'users' ? 'Admin' : 'Public',
128
+ * section: resource === 'users' ? 'Admin' : 'Public'
124
129
  * }));
125
130
  * // Used for 'users', this produces 'AdminUsersPage'.
126
131
  * // Other resources receive the 'Public' section instead.
@@ -132,9 +137,10 @@ function createNamingFactory(definitions, definition) {
132
137
  * ```ts
133
138
  * const versionedName = defineLayoutName
134
139
  * .defineParts({ section: 'string', version: 'number' })
135
- * .namingFn(({ resource, capitalize }, parts) =>
136
- * `${parts.section}${capitalize(resource)}V${parts.version}`,
137
- * );
140
+ * .namingFn({
141
+ * pattern: ({ resource, capitalize }, parts) =>
142
+ * `${parts.section}${capitalize(resource)}V${parts.version}`
143
+ * });
138
144
  * const adminV2 = versionedName({ section: 'Admin', version: 2 });
139
145
  * // Used for 'users', this produces 'AdminUsersV2'.
140
146
  * // versionedName({ version: '2' }) is rejected: version must be a number.
@@ -146,11 +152,12 @@ function createNamingFactory(definitions, definition) {
146
152
  * ```ts
147
153
  * const formattedName = defineLayoutName
148
154
  * .defineParts({ version: 'number' })
149
- * .namingFn(({ resource, capitalize }, parts) => {
150
- * const version = typeof parts.version === 'number'
151
- * ? parts.version.toFixed(0)
152
- * : '';
153
- * return `${capitalize(resource)}V${version}`;
155
+ * .namingFn({
156
+ * pattern: ({ resource, capitalize }, parts) => {
157
+ * const version =
158
+ * typeof parts.version === 'number' ? parts.version.toFixed(0) : '';
159
+ * return `${capitalize(resource)}V${version}`;
160
+ * }
154
161
  * });
155
162
  * ```
156
163
  *
@@ -161,8 +168,9 @@ function createNamingFactory(definitions, definition) {
161
168
  * const externalName = defineLayoutName
162
169
  * .defineParts({ version: 'number' })
163
170
  * .namingFn({
164
- * pattern: ({ resource }, parts) => `${resource}${parts.version}${parts.extra}`,
165
- * strict: false,
171
+ * pattern: ({ resource }, parts) =>
172
+ * `${resource}${parts.version}${parts.extra}`,
173
+ * strict: false
166
174
  * });
167
175
  * const legacy = externalName({ version: 'legacy', extra: true });
168
176
  * ```
@@ -1 +1 @@
1
- {"version":3,"file":"layout-name.mjs","names":[],"sources":["../../src/create-config/layout-name.ts"],"sourcesContent":["import { capitalize } from '../utils/capitalize';\nimport {\n InvalidPartError,\n InvalidPartTypeError,\n LayoutConfigurationError\n} from '../errors';\n/**\n * Each slot has a distinct type identity, so ordinary text cannot become a slot.\n */\ndeclare const layoutNamePlaceholder: unique symbol;\ntype NamePlaceholder<\n Key extends string,\n Value extends string | number = string\n> = Value & {\n readonly [layoutNamePlaceholder]: Key;\n};\ntype PatternNameContext = Omit<\n LayoutNameContext<NamePlaceholder<'resource'>>,\n 'capitalize'\n> & {\n capitalize: <T extends string>(\n value: T\n ) => T extends NamePlaceholder<'resource'>\n ? NamePlaceholder<'capitalizedResource'>\n : Capitalize<T>;\n};\nexport interface LayoutNameContext<\n Resource extends string = string,\n State extends string = string\n> {\n resource: Resource;\n states: readonly State[];\n capitalize: typeof capitalize;\n}\nexport interface LayoutNameParts {\n prefix?: string;\n beforeSuffix?: string;\n append?: string;\n}\n/**\n * Value kinds accepted by a declared naming part.\n */\nexport type LayoutNamePartType = 'string' | 'number';\n\n/**\n * Declares each naming part and the value kind accepted at call sites.\n */\nexport type LayoutNamePartDefinitions = Readonly<\n Record<string, LayoutNamePartType>\n>;\n\n/**\n * Defines the naming pattern and strict-checking policy. Strict defaults to true.\n */\nexport interface LayoutNameOptions<\n Definitions extends LayoutNamePartDefinitions,\n Pattern extends string,\n Strict extends boolean = true\n> {\n /**\n * Combines the naming context and part placeholders into a name.\n */\n pattern: NamingPattern<Definitions, Pattern, Strict>;\n /**\n * Set to false to skip part type checking and runtime validation.\n */\n strict?: Strict;\n}\n\n/**\n * Part values are intentionally unchecked when strict is false.\n */\ntype UncheckedNamingParts<Definitions extends LayoutNamePartDefinitions> =\n {\n [Key in keyof Definitions]?: any;\n } & Record<string, any>;\n\ntype PartValue<Type extends LayoutNamePartType> = Type extends 'number'\n ? number\n : string;\n\n/**\n * Optional values for declared naming parts. Omitted slots render as empty text.\n */\nexport type LayoutNamePartValues<\n Definitions extends LayoutNamePartDefinitions\n> = {\n [Key in keyof Definitions]?: PartValue<Definitions[Key]>;\n};\n\ntype PatternParts<Definitions extends LayoutNamePartDefinitions> = {\n [Key in keyof Definitions & string]: NamePlaceholder<\n `part:${Key}`,\n PartValue<Definitions[Key]> | ''\n >;\n};\ntype PartText<Value> = Value extends string | number ? `${Value}` : '';\ntype Part<Parts, Key extends keyof Parts> = PartText<Parts[Key]>;\ntype ResourcePlaceholderValues<Resource extends string> = {\n resource: Resource;\n capitalizedResource: Capitalize<Resource>;\n};\ntype PlaceholderValues<\n Resource extends string,\n Parts\n> = ResourcePlaceholderValues<Resource> & {\n [Key in keyof Parts & string as `part:${Key}`]: ResolvePattern<\n Part<Parts, Key>,\n ResourcePlaceholderValues<Resource>\n >;\n};\ntype MatchPlaceholder<Pattern extends string, Values> = {\n [Key in keyof Values & string]: Pattern extends\n | NamePlaceholder<Key>\n | `${NamePlaceholder<Key>}`\n | `${NamePlaceholder<Key, number>}`\n ? [Extract<Values[Key], string>, '']\n : Pattern extends `${NamePlaceholder<Key>}${infer Rest}`\n ? [Extract<Values[Key], string>, Rest]\n : Pattern extends `${NamePlaceholder<Key, number>}${infer Rest}`\n ? [Extract<Values[Key], string>, Rest]\n : never;\n}[keyof Values & string];\ntype ResolvePattern<\n Pattern extends string,\n Values,\n Result extends string = ''\n> = [MatchPlaceholder<Pattern, Values>] extends [never]\n ? Pattern extends `${infer First}${infer Rest}`\n ? ResolvePattern<Rest, Values, `${Result}${First}`>\n : `${Result}${Pattern}`\n : MatchPlaceholder<Pattern, Values> extends [\n infer Value extends string,\n infer Rest extends string\n ]\n ? ResolvePattern<Rest, Values, `${Result}${Value}`>\n : never;\nexport type ResolveNamePattern<\n Pattern extends string,\n Resource extends string,\n Parts = {}\n> = ResolvePattern<Pattern, PlaceholderValues<Resource, Parts>>;\nexport const layoutNamePattern: unique symbol = Symbol(\n 'layoutNamePattern'\n);\nexport interface LayoutNameResolver<\n Pattern extends string = string,\n Parts = {}\n> {\n (context: LayoutNameContext): string;\n readonly [layoutNamePattern]: { pattern: Pattern; parts: Parts };\n}\n/**\n * Computes a layout name from its resource and available render states.\n */\nexport type LayoutNameCallback<\n Resource extends string = string,\n States extends string = string,\n Name extends string = string\n> = (context: LayoutNameContext<Resource, States>) => Name;\n\nexport type LayoutNameInput<\n Resource extends string = string,\n States extends string = string,\n Name extends string = string\n> = Name | LayoutNameCallback<Resource, States, Name>;\nexport type ResolvedLayoutName<Naming, Resource extends string> = [\n Naming\n] extends [undefined]\n ? `${Capitalize<Resource>}Layout`\n : Naming extends LayoutNameResolver<infer Pattern, infer Parts>\n ? ResolveNamePattern<Pattern, Resource, Parts>\n : Naming extends (...args: any[]) => infer Result\n ? Extract<Result, string>\n : Naming extends string\n ? Naming\n : `${Capitalize<Resource>}Layout`;\ntype NamingPartsInput<\n Definitions extends LayoutNamePartDefinitions,\n Parts extends LayoutNamePartValues<Definitions>\n> = {\n [Key in keyof (LayoutNamePartValues<Definitions> &\n Parts)]: Key extends keyof Definitions\n ? (LayoutNamePartValues<Definitions> & Parts)[Key]\n : never;\n};\n\ntype NamingPartsCallback<\n Definitions extends LayoutNamePartDefinitions,\n Parts extends LayoutNamePartValues<Definitions>\n> = (context: PatternNameContext) => NamingPartsInput<Definitions, Parts>;\n\ntype ResolvedParts<\n Definitions extends LayoutNamePartDefinitions,\n Parts\n> = {\n [Key in keyof Definitions]: Key extends keyof Parts ? Parts[Key] : '';\n};\n\ntype NamingPattern<\n Definitions extends LayoutNamePartDefinitions,\n Pattern extends string,\n Strict extends boolean = true\n> = (\n context: PatternNameContext,\n parts: [Strict] extends [false]\n ? UncheckedNamingParts<Definitions>\n : PatternParts<Definitions>\n) => Pattern;\n\ntype NamingDefinition<\n Definitions extends LayoutNamePartDefinitions,\n Pattern extends string,\n Strict extends boolean\n> =\n | NamingPattern<Definitions, Pattern, Strict>\n | LayoutNameOptions<Definitions, Pattern, Strict>;\n\n/**\n * Supplies optional part values while preserving their literal types in names.\n */\ninterface CheckedLayoutNameFactory<\n Definitions extends LayoutNamePartDefinitions,\n Pattern extends string\n> {\n /**\n * Supplies values for declared parts without coercing their types.\n * Fixed values are checked immediately; callback results are checked when\n * the layout name is resolved for a resource.\n *\n * @throws {InvalidPartError} A supplied part has not been declared.\n * @throws {InvalidPartTypeError} A supplied value has the wrong kind.\n */\n <const Parts extends LayoutNamePartValues<Definitions> = {}>(\n parts?:\n | NamingPartsInput<Definitions, Parts>\n | NamingPartsCallback<Definitions, Parts>\n ): LayoutNameResolver<Pattern, ResolvedParts<Definitions, Parts>>;\n}\n\ninterface UncheckedLayoutNameFactory<\n Definitions extends LayoutNamePartDefinitions\n> {\n (\n parts?:\n | UncheckedNamingParts<Definitions>\n | ((\n context: PatternNameContext\n ) => UncheckedNamingParts<Definitions>)\n ): LayoutNameResolver<string>;\n}\n\n/**\n * Supplies optional naming parts. Strict conventions preserve literal names;\n * unchecked conventions accept arbitrary keys and values and return string names.\n */\nexport type LayoutNameFactory<\n Definitions extends LayoutNamePartDefinitions,\n Pattern extends string,\n Strict extends boolean = true\n> = [Strict] extends [false]\n ? UncheckedLayoutNameFactory<Definitions>\n : CheckedLayoutNameFactory<Definitions, Pattern>;\n\ninterface DefinedLayoutNameParts<\n Definitions extends LayoutNamePartDefinitions\n> {\n /**\n * Defines the naming pattern and optional strict-checking policy.\n * Strict defaults to true; false accepts unchecked part keys and values.\n */\n namingFn<\n const Pattern extends string,\n const Strict extends boolean = true\n >(\n definition: NamingDefinition<Definitions, Pattern, Strict>\n ): LayoutNameFactory<Definitions, Pattern, Strict>;\n}\n\nconst defaultPartDefinitions = {\n prefix: 'string',\n beforeSuffix: 'string',\n append: 'string'\n} satisfies { [Key in keyof LayoutNameParts]-?: 'string' };\n\nfunction validatePartValues(\n definitions: LayoutNamePartDefinitions,\n values: unknown\n): Record<string, string | number> {\n if (values === undefined) return {};\n if (\n values === null ||\n typeof values !== 'object' ||\n Array.isArray(values)\n ) {\n throw new LayoutConfigurationError(\n 'Naming part values must be an object.'\n );\n }\n\n const supplied: Array<[string, string | number]> = [];\n for (const part of Reflect.ownKeys(values)) {\n if (typeof part !== 'string' || !Object.hasOwn(definitions, part)) {\n throw new InvalidPartError({\n part: String(part),\n validParts: Object.keys(definitions)\n });\n }\n const value: unknown = Reflect.get(values, part);\n if (value === undefined) continue;\n\n const expectedType = definitions[part];\n if (\n (expectedType === 'string' && typeof value === 'string') ||\n (expectedType === 'number' && typeof value === 'number')\n ) {\n supplied.push([part, value]);\n } else {\n throw new InvalidPartTypeError({\n part,\n expectedType,\n receivedType:\n value === null\n ? 'null'\n : Array.isArray(value)\n ? 'array'\n : typeof value\n });\n }\n }\n return Object.fromEntries(supplied);\n}\n\nfunction createNamingFactory<\n Definitions extends LayoutNamePartDefinitions,\n const Pattern extends string,\n Strict extends boolean = true\n>(\n definitions: Definitions,\n definition: NamingDefinition<Definitions, Pattern, Strict>\n): LayoutNameFactory<Definitions, Pattern, Strict> {\n const pattern =\n typeof definition === 'function' ? definition : definition.pattern;\n const strict =\n typeof definition === 'function' || definition.strict !== false;\n const defaults = Object.fromEntries(\n Object.keys(definitions).map((key) => [key, ''])\n );\n function name<\n const Parts extends LayoutNamePartValues<Definitions> = {}\n >(\n parts?:\n | NamingPartsInput<Definitions, Parts>\n | NamingPartsCallback<Definitions, Parts>\n ): LayoutNameResolver<Pattern, ResolvedParts<Definitions, Parts>> {\n if (strict && typeof parts !== 'function')\n validatePartValues(definitions, parts);\n const resolver = ((context: LayoutNameContext) => {\n const values =\n typeof parts === 'function'\n ? parts(context as unknown as PatternNameContext)\n : parts;\n const supplied = strict\n ? validatePartValues(definitions, values)\n : Object.fromEntries(\n Object.entries(values ?? {}).filter(\n ([, value]) => value !== undefined\n )\n );\n return pattern(\n context as unknown as PatternNameContext,\n {\n ...defaults,\n ...supplied\n } as [Strict] extends [false]\n ? UncheckedNamingParts<Definitions>\n : PatternParts<Definitions>\n );\n }) as unknown as LayoutNameResolver<\n Pattern,\n ResolvedParts<Definitions, Parts>\n >;\n Object.defineProperty(resolver, layoutNamePattern, { value: {} });\n return resolver;\n }\n return name as LayoutNameFactory<Definitions, Pattern, Strict>;\n}\n\n/**\n * Defines a reusable layout naming convention that preserves resource-specific\n * literal names in TypeScript. Define the pattern once, then supply optional\n * part values wherever the convention is used.\n *\n * Omit `name` entirely when the generated name, such as `UsersLayout`, is enough.\n * Use this helper when several layouts share a naming rule or need variations\n * while retaining exact component `displayName` types.\n *\n * Choose the form that matches the values your convention needs:\n *\n * - `defineLayoutName(pattern)` provides the string parts `prefix`,\n * `beforeSuffix`, and `append` for common naming variations.\n * - `defineLayoutName.defineParts(...names).namingFn(pattern)` provides custom\n * string parts when domain-specific names make the pattern clearer.\n * - `defineLayoutName.defineParts(schema).namingFn(pattern)` declares each\n * part as `'string'` or `'number'` when supplied values need different types.\n *\n * The pattern controls where parts appear; their names do not impose an order.\n * Part values are optional and omitted values render as empty text. Supply an\n * object for fixed values, or a callback when values depend on the resource.\n * Numeric placeholders can also be empty text inside the pattern. Narrow them\n * with `typeof value === 'number'` before using number-only methods.\n * Supplied keys and value kinds are also validated at runtime. Unknown parts\n * throw InvalidPartError; incorrect value kinds throw InvalidPartTypeError.\n * Each returned naming resolver can be passed to a factory, definition, or\n * component creation call through its `name` option.\n *\n * Strict checking defaults to true. Use `{ pattern, strict: false }` here or\n * in namingFn to accept unchecked part keys and values in both TypeScript\n * and runtime calls. Unchecked conventions return string names.\n *\n * @param definition - A pattern callback, or an object containing the pattern\n * and optional strict-checking policy.\n * @returns A function accepting optional part values or a context callback.\n * Calling it with no arguments leaves every declared part empty.\n *\n * @example\n * Use the default string parts for a shared convention with occasional variants.\n * ```tsx\n * const layoutName = defineLayoutName(({ resource, capitalize }, parts) =>\n * `${parts.prefix}${capitalize(resource)}${parts.beforeSuffix}Layout${parts.append}`,\n * );\n * const factory = createDefinedResourceLayout({\n * resources: ['users'],\n * name: layoutName(),\n * });\n * const { createResourceLayout } = factory.defineResourceLayout({\n * render: () => <div />,\n * });\n * const Users = createResourceLayout({ resource: 'users' });\n * // Users.displayName is typed as 'UsersLayout'.\n * const AdminUsers = createResourceLayout({\n * resource: 'users',\n * name: layoutName({ prefix: 'Admin', beforeSuffix: 'Detail' }),\n * });\n * // AdminUsers.displayName is typed as 'AdminUsersDetailLayout'.\n * ```\n *\n * @example\n * Declare custom string parts when their names describe your application's\n * conventions more clearly than prefix, beforeSuffix, and append.\n * ```ts\n * const pageName = defineLayoutName\n * .defineParts('section', 'variant')\n * .namingFn(({ resource, capitalize }, parts) =>\n * `${parts.section}${capitalize(resource)}${parts.variant}Page`,\n * );\n * const adminPage = pageName({ section: 'Admin', variant: 'Detail' });\n * // Used for 'users', this produces 'AdminUsersDetailPage'.\n * const resourcePage = pageName(({ resource }) => ({\n * section: resource === 'users' ? 'Admin' : 'Public',\n * }));\n * // Used for 'users', this produces 'AdminUsersPage'.\n * // Other resources receive the 'Public' section instead.\n * ```\n *\n * @example\n * Use a schema when a part should accept a number instead of a string.\n * Supplied keys are suggested by the editor and checked against the schema.\n * ```ts\n * const versionedName = defineLayoutName\n * .defineParts({ section: 'string', version: 'number' })\n * .namingFn(({ resource, capitalize }, parts) =>\n * `${parts.section}${capitalize(resource)}V${parts.version}`,\n * );\n * const adminV2 = versionedName({ section: 'Admin', version: 2 });\n * // Used for 'users', this produces 'AdminUsersV2'.\n * // versionedName({ version: '2' }) is rejected: version must be a number.\n * ```\n *\n * @example\n * Guard optional numeric values before formatting them with number methods.\n * Plain interpolation, as above, already handles empty values.\n * ```ts\n * const formattedName = defineLayoutName\n * .defineParts({ version: 'number' })\n * .namingFn(({ resource, capitalize }, parts) => {\n * const version = typeof parts.version === 'number'\n * ? parts.version.toFixed(0)\n * : '';\n * return `${capitalize(resource)}V${version}`;\n * });\n * ```\n *\n * @example\n * Opt out of part checking when a convention intentionally accepts external\n * keys and mixed value types. The resulting displayName is typed as string.\n * ```ts\n * const externalName = defineLayoutName\n * .defineParts({ version: 'number' })\n * .namingFn({\n * pattern: ({ resource }, parts) => `${resource}${parts.version}${parts.extra}`,\n * strict: false,\n * });\n * const legacy = externalName({ version: 'legacy', extra: true });\n * ```\n */\nexport function defineLayoutName<\n const Pattern extends string,\n const Strict extends boolean = true\n>(\n definition: NamingDefinition<\n typeof defaultPartDefinitions,\n Pattern,\n Strict\n >\n): LayoutNameFactory<typeof defaultPartDefinitions, Pattern, Strict> {\n return createNamingFactory(defaultPartDefinitions, definition);\n}\n\n/**\n * Declares string placeholders from their names.\n * Call namingFn on the result to define how those slots form a layout name.\n */\nfunction defineParts<const Keys extends readonly string[]>(\n ...keys: Keys\n): DefinedLayoutNameParts<{ [Key in Keys[number]]: 'string' }>;\n/**\n * Declares placeholders with string or number values from a part schema.\n * Call namingFn on the result to define how those slots form a layout name.\n */\nfunction defineParts<const Definitions extends LayoutNamePartDefinitions>(\n definitions: Definitions\n): DefinedLayoutNameParts<Definitions>;\nfunction defineParts(\n ...input: string[] | [LayoutNamePartDefinitions]\n): DefinedLayoutNameParts<LayoutNamePartDefinitions> {\n const definitions =\n typeof input[0] === 'object'\n ? input[0]\n : Object.fromEntries(input.map((key) => [key, 'string']));\n return {\n namingFn(definition) {\n return createNamingFactory(definitions, definition);\n }\n };\n}\n\ndefineLayoutName.defineParts = defineParts;\n"],"mappings":";;;;;AA8IA,MAAa,oBAAmC,OAC9C,mBACF;AAuIA,MAAM,yBAAyB;CAC7B,QAAQ;CACR,cAAc;CACd,QAAQ;AACV;AAEA,SAAS,mBACP,aACA,QACiC;CACjC,IAAI,WAAW,QAAW,OAAO,CAAC;CAClC,IACE,WAAW,QACX,OAAO,WAAW,YAClB,MAAM,QAAQ,MAAM,GAEpB,MAAM,IAAI,yBACR,uCACF;CAGF,MAAM,WAA6C,CAAC;CACpD,KAAK,MAAM,QAAQ,QAAQ,QAAQ,MAAM,GAAG;EAC1C,IAAI,OAAO,SAAS,YAAY,CAAC,OAAO,OAAO,aAAa,IAAI,GAC9D,MAAM,IAAI,iBAAiB;GACzB,MAAM,OAAO,IAAI;GACjB,YAAY,OAAO,KAAK,WAAW;EACrC,CAAC;EAEH,MAAM,QAAiB,QAAQ,IAAI,QAAQ,IAAI;EAC/C,IAAI,UAAU,QAAW;EAEzB,MAAM,eAAe,YAAY;EACjC,IACG,iBAAiB,YAAY,OAAO,UAAU,YAC9C,iBAAiB,YAAY,OAAO,UAAU,UAE/C,SAAS,KAAK,CAAC,MAAM,KAAK,CAAC;OAE3B,MAAM,IAAI,qBAAqB;GAC7B;GACA;GACA,cACE,UAAU,OACN,SACA,MAAM,QAAQ,KAAK,IACnB,UACA,OAAO;EACf,CAAC;CAEL;CACA,OAAO,OAAO,YAAY,QAAQ;AACpC;AAEA,SAAS,oBAKP,aACA,YACiD;CACjD,MAAM,UACJ,OAAO,eAAe,aAAa,aAAa,WAAW;CAC7D,MAAM,SACJ,OAAO,eAAe,cAAc,WAAW,WAAW;CAC5D,MAAM,WAAW,OAAO,YACtB,OAAO,KAAK,WAAW,EAAE,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC,CACjD;CACA,SAAS,KAGP,OAGgE;EAChE,IAAI,UAAU,OAAO,UAAU,YAC7B,mBAAmB,aAAa,KAAK;EACvC,MAAM,aAAa,YAA+B;GAChD,MAAM,SACJ,OAAO,UAAU,aACb,MAAM,OAAwC,IAC9C;GACN,MAAM,WAAW,SACb,mBAAmB,aAAa,MAAM,IACtC,OAAO,YACL,OAAO,QAAQ,UAAU,CAAC,CAAC,EAAE,QAC1B,GAAG,WAAW,UAAU,MAC3B,CACF;GACJ,OAAO,QACL,SACA;IACE,GAAG;IACH,GAAG;GACL,CAGF;EACF;EAIA,OAAO,eAAe,UAAU,mBAAmB,EAAE,OAAO,CAAC,EAAE,CAAC;EAChE,OAAO;CACT;CACA,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwHA,SAAgB,iBAId,YAKmE;CACnE,OAAO,oBAAoB,wBAAwB,UAAU;AAC/D;AAgBA,SAAS,YACP,GAAG,OACgD;CACnD,MAAM,cACJ,OAAO,MAAM,OAAO,WAChB,MAAM,KACN,OAAO,YAAY,MAAM,KAAK,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC;CAC5D,OAAO,EACL,SAAS,YAAY;EACnB,OAAO,oBAAoB,aAAa,UAAU;CACpD,EACF;AACF;AAEA,iBAAiB,cAAc"}
1
+ {"version":3,"file":"layout-name.mjs","names":[],"sources":["../../src/create-config/layout-name.ts"],"sourcesContent":["import { capitalize } from '../utils/capitalize';\nimport {\n InvalidPartError,\n InvalidPartTypeError,\n LayoutConfigurationError\n} from '../errors';\n/**\n * Each slot has a distinct type identity, so ordinary text cannot become a slot.\n */\ndeclare const layoutNamePlaceholder: unique symbol;\ntype NamePlaceholder<\n Key extends string,\n Value extends string | number = string\n> = Value & {\n readonly [layoutNamePlaceholder]: Key;\n};\ntype PatternNameContext = Omit<\n LayoutNameContext<NamePlaceholder<'resource'>>,\n 'capitalize'\n> & {\n capitalize: <T extends string>(\n value: T\n ) => T extends NamePlaceholder<'resource'>\n ? NamePlaceholder<'capitalizedResource'>\n : Capitalize<T>;\n};\nexport interface LayoutNameContext<\n Resource extends string = string,\n State extends string = string\n> {\n resource: Resource;\n states: readonly State[];\n capitalize: typeof capitalize;\n}\nexport interface LayoutNameParts {\n prefix?: string;\n beforeSuffix?: string;\n append?: string;\n}\n/**\n * Value kinds accepted by a declared naming part.\n */\nexport type LayoutNamePartType = 'string' | 'number';\n\n/**\n * Declares each naming part and the value kind accepted at call sites.\n */\nexport type LayoutNamePartDefinitions = Readonly<\n Record<string, LayoutNamePartType>\n>;\n\n/**\n * Defines the naming pattern and strict-checking policy. Strict defaults to true.\n */\nexport interface LayoutNameOptions<\n Definitions extends LayoutNamePartDefinitions,\n Pattern extends string,\n Strict extends boolean = true\n> {\n /**\n * Combines the naming context and part placeholders into a name.\n */\n pattern: NamingPattern<Definitions, Pattern, Strict>;\n /**\n * Set to false to skip part type checking and runtime validation.\n */\n strict?: Strict;\n}\n\n/**\n * Part values are intentionally unchecked when strict is false.\n */\ntype UncheckedNamingParts<Definitions extends LayoutNamePartDefinitions> =\n {\n [Key in keyof Definitions]?: any;\n } & Record<string, any>;\n\ntype PartValue<Type extends LayoutNamePartType> = Type extends 'number'\n ? number\n : string;\n\n/**\n * Optional values for declared naming parts. Omitted slots render as empty text.\n */\nexport type LayoutNamePartValues<\n Definitions extends LayoutNamePartDefinitions\n> = {\n [Key in keyof Definitions]?: PartValue<Definitions[Key]>;\n};\n\ntype PatternParts<Definitions extends LayoutNamePartDefinitions> = {\n [Key in keyof Definitions & string]: NamePlaceholder<\n `part:${Key}`,\n PartValue<Definitions[Key]> | ''\n >;\n};\ntype PartText<Value> = Value extends string | number ? `${Value}` : '';\ntype Part<Parts, Key extends keyof Parts> = PartText<Parts[Key]>;\ntype ResourcePlaceholderValues<Resource extends string> = {\n resource: Resource;\n capitalizedResource: Capitalize<Resource>;\n};\ntype PlaceholderValues<\n Resource extends string,\n Parts\n> = ResourcePlaceholderValues<Resource> & {\n [Key in keyof Parts & string as `part:${Key}`]: ResolvePattern<\n Part<Parts, Key>,\n ResourcePlaceholderValues<Resource>\n >;\n};\ntype MatchPlaceholder<Pattern extends string, Values> = {\n [Key in keyof Values & string]: Pattern extends\n | NamePlaceholder<Key>\n | `${NamePlaceholder<Key>}`\n | `${NamePlaceholder<Key, number>}`\n ? [Extract<Values[Key], string>, '']\n : Pattern extends `${NamePlaceholder<Key>}${infer Rest}`\n ? [Extract<Values[Key], string>, Rest]\n : Pattern extends `${NamePlaceholder<Key, number>}${infer Rest}`\n ? [Extract<Values[Key], string>, Rest]\n : never;\n}[keyof Values & string];\ntype ResolvePattern<\n Pattern extends string,\n Values,\n Result extends string = ''\n> = [MatchPlaceholder<Pattern, Values>] extends [never]\n ? Pattern extends `${infer First}${infer Rest}`\n ? ResolvePattern<Rest, Values, `${Result}${First}`>\n : `${Result}${Pattern}`\n : MatchPlaceholder<Pattern, Values> extends [\n infer Value extends string,\n infer Rest extends string\n ]\n ? ResolvePattern<Rest, Values, `${Result}${Value}`>\n : never;\nexport type ResolveNamePattern<\n Pattern extends string,\n Resource extends string,\n Parts = {}\n> = ResolvePattern<Pattern, PlaceholderValues<Resource, Parts>>;\nexport const layoutNamePattern: unique symbol = Symbol(\n 'layoutNamePattern'\n);\nexport interface LayoutNameResolver<\n Pattern extends string = string,\n Parts = {}\n> {\n (context: LayoutNameContext): string;\n readonly [layoutNamePattern]: { pattern: Pattern; parts: Parts };\n}\n/**\n * Computes a layout name from its resource and available render states.\n */\nexport type LayoutNameCallback<\n Resource extends string = string,\n States extends string = string,\n Name extends string = string\n> = (context: LayoutNameContext<Resource, States>) => Name;\n\nexport type LayoutNameInput<\n Resource extends string = string,\n States extends string = string,\n Name extends string = string\n> = Name | LayoutNameCallback<Resource, States, Name>;\nexport type ResolvedLayoutName<Naming, Resource extends string> = [\n Naming\n] extends [undefined]\n ? `${Capitalize<Resource>}Layout`\n : Naming extends LayoutNameResolver<infer Pattern, infer Parts>\n ? ResolveNamePattern<Pattern, Resource, Parts>\n : Naming extends (...args: any[]) => infer Result\n ? Extract<Result, string>\n : Naming extends string\n ? Naming\n : `${Capitalize<Resource>}Layout`;\ntype NamingPartsInput<\n Definitions extends LayoutNamePartDefinitions,\n Parts extends LayoutNamePartValues<Definitions>\n> = {\n [Key in keyof (LayoutNamePartValues<Definitions> &\n Parts)]: Key extends keyof Definitions\n ? (LayoutNamePartValues<Definitions> & Parts)[Key]\n : never;\n};\n\ntype NamingPartsCallback<\n Definitions extends LayoutNamePartDefinitions,\n Parts extends LayoutNamePartValues<Definitions>\n> = (context: PatternNameContext) => NamingPartsInput<Definitions, Parts>;\n\ntype ResolvedParts<\n Definitions extends LayoutNamePartDefinitions,\n Parts\n> = {\n [Key in keyof Definitions]: Key extends keyof Parts ? Parts[Key] : '';\n};\n\ntype NamingPattern<\n Definitions extends LayoutNamePartDefinitions,\n Pattern extends string,\n Strict extends boolean = true\n> = (\n context: PatternNameContext,\n parts: [Strict] extends [false]\n ? UncheckedNamingParts<Definitions>\n : PatternParts<Definitions>\n) => Pattern;\n\n/**\n * Supplies optional part values while preserving their literal types in names.\n */\ninterface CheckedLayoutNameFactory<\n Definitions extends LayoutNamePartDefinitions,\n Pattern extends string\n> {\n /**\n * Supplies values for declared parts without coercing their types.\n * Fixed values are checked immediately; callback results are checked when\n * the layout name is resolved for a resource.\n *\n * @throws {InvalidPartError} A supplied part has not been declared.\n * @throws {InvalidPartTypeError} A supplied value has the wrong kind.\n */\n <const Parts extends LayoutNamePartValues<Definitions> = {}>(\n parts?:\n | NamingPartsInput<Definitions, Parts>\n | NamingPartsCallback<Definitions, Parts>\n ): LayoutNameResolver<Pattern, ResolvedParts<Definitions, Parts>>;\n}\n\ninterface UncheckedLayoutNameFactory<\n Definitions extends LayoutNamePartDefinitions\n> {\n (\n parts?:\n | UncheckedNamingParts<Definitions>\n | ((\n context: PatternNameContext\n ) => UncheckedNamingParts<Definitions>)\n ): LayoutNameResolver<string>;\n}\n\n/**\n * Supplies optional naming parts. Strict conventions preserve literal names;\n * unchecked conventions accept arbitrary keys and values and return string names.\n */\nexport type LayoutNameFactory<\n Definitions extends LayoutNamePartDefinitions,\n Pattern extends string,\n Strict extends boolean = true\n> = [Strict] extends [false]\n ? UncheckedLayoutNameFactory<Definitions>\n : CheckedLayoutNameFactory<Definitions, Pattern>;\n\ninterface DefinedLayoutNameParts<\n Definitions extends LayoutNamePartDefinitions\n> {\n /**\n * Defines the naming pattern and optional strict-checking policy.\n * Strict defaults to true; false accepts unchecked part keys and values.\n */\n namingFn<\n const Pattern extends string,\n const Strict extends boolean = true\n >(\n definition: LayoutNameOptions<Definitions, Pattern, Strict>\n ): LayoutNameFactory<Definitions, Pattern, Strict>;\n}\n\nconst defaultPartDefinitions = {\n prefix: 'string',\n beforeSuffix: 'string',\n append: 'string'\n} satisfies { [Key in keyof LayoutNameParts]-?: 'string' };\n\nfunction validatePartValues(\n definitions: LayoutNamePartDefinitions,\n values: unknown\n): Record<string, string | number> {\n if (values === undefined) return {};\n if (\n values === null ||\n typeof values !== 'object' ||\n Array.isArray(values)\n ) {\n throw new LayoutConfigurationError(\n 'Naming part values must be an object.'\n );\n }\n\n const supplied: Array<[string, string | number]> = [];\n for (const part of Reflect.ownKeys(values)) {\n if (typeof part !== 'string' || !Object.hasOwn(definitions, part)) {\n throw new InvalidPartError({\n part: String(part),\n validParts: Object.keys(definitions)\n });\n }\n const value: unknown = Reflect.get(values, part);\n if (value === undefined) continue;\n\n const expectedType = definitions[part];\n if (\n (expectedType === 'string' && typeof value === 'string') ||\n (expectedType === 'number' && typeof value === 'number')\n ) {\n supplied.push([part, value]);\n } else {\n throw new InvalidPartTypeError({\n part,\n expectedType,\n receivedType:\n value === null\n ? 'null'\n : Array.isArray(value)\n ? 'array'\n : typeof value\n });\n }\n }\n return Object.fromEntries(supplied);\n}\n\nfunction createNamingFactory<\n Definitions extends LayoutNamePartDefinitions,\n const Pattern extends string,\n Strict extends boolean = true\n>(\n definitions: Definitions,\n definition: LayoutNameOptions<Definitions, Pattern, Strict>\n): LayoutNameFactory<Definitions, Pattern, Strict> {\n if (\n definition === null ||\n typeof definition !== 'object' ||\n typeof definition.pattern !== 'function'\n ) {\n throw new LayoutConfigurationError(\n 'Naming configuration must be an object containing a pattern function.'\n );\n }\n const { pattern } = definition;\n const strict = definition.strict !== false;\n const defaults = Object.fromEntries(\n Object.keys(definitions).map((key) => [key, ''])\n );\n function name<\n const Parts extends LayoutNamePartValues<Definitions> = {}\n >(\n parts?:\n | NamingPartsInput<Definitions, Parts>\n | NamingPartsCallback<Definitions, Parts>\n ): LayoutNameResolver<Pattern, ResolvedParts<Definitions, Parts>> {\n if (strict && typeof parts !== 'function')\n validatePartValues(definitions, parts);\n const resolver = ((context: LayoutNameContext) => {\n const values =\n typeof parts === 'function'\n ? parts(context as unknown as PatternNameContext)\n : parts;\n const supplied = strict\n ? validatePartValues(definitions, values)\n : Object.fromEntries(\n Object.entries(values ?? {}).filter(\n ([, value]) => value !== undefined\n )\n );\n return pattern(\n context as unknown as PatternNameContext,\n {\n ...defaults,\n ...supplied\n } as [Strict] extends [false]\n ? UncheckedNamingParts<Definitions>\n : PatternParts<Definitions>\n );\n }) as unknown as LayoutNameResolver<\n Pattern,\n ResolvedParts<Definitions, Parts>\n >;\n Object.defineProperty(resolver, layoutNamePattern, { value: {} });\n return resolver;\n }\n return name as LayoutNameFactory<Definitions, Pattern, Strict>;\n}\n\n/**\n * Defines a reusable layout naming convention that preserves resource-specific\n * literal names in TypeScript. Define the pattern once, then supply optional\n * part values wherever the convention is used.\n *\n * Omit `name` entirely when the generated name, such as `UsersLayout`, is enough.\n * Use this helper when several layouts share a naming rule or need variations\n * while retaining exact component `displayName` types.\n *\n * Choose the form that matches the values your convention needs:\n *\n * - `defineLayoutName({ pattern })` provides the string parts `prefix`,\n * `beforeSuffix`, and `append` for common naming variations.\n * - `defineLayoutName.defineParts(...names).namingFn({ pattern })` provides custom\n * string parts when domain-specific names make the pattern clearer.\n * - `defineLayoutName.defineParts(schema).namingFn({ pattern })` declares each\n * part as `'string'` or `'number'` when supplied values need different types.\n *\n * The pattern controls where parts appear; their names do not impose an order.\n * Part values are optional and omitted values render as empty text. Supply an\n * object for fixed values, or a callback when values depend on the resource.\n * Numeric placeholders can also be empty text inside the pattern. Narrow them\n * with `typeof value === 'number'` before using number-only methods.\n * Supplied keys and value kinds are also validated at runtime. Unknown parts\n * throw InvalidPartError; incorrect value kinds throw InvalidPartTypeError.\n * Each returned naming resolver can be passed to a factory, definition, or\n * component creation call through its `name` option.\n *\n * Strict checking defaults to true. Use `{ pattern, strict: false }` here or\n * in namingFn to accept unchecked part keys and values in both TypeScript\n * and runtime calls. Unchecked conventions return string names.\n *\n * @param definition - An object containing the naming pattern and optional\n * strict-checking policy.\n * @returns A function accepting optional part values or a context callback.\n * Calling it with no arguments leaves every declared part empty.\n *\n * @example\n * Use the default string parts for a shared convention with occasional variants.\n * ```tsx\n * const layoutName = defineLayoutName({\n * pattern: ({ resource, capitalize }, parts) =>\n * `${parts.prefix}${capitalize(resource)}${parts.beforeSuffix}Layout${\n * parts.append\n * }`\n * });\n * const factory = createDefinedResourceLayout({\n * resources: ['users'],\n * name: layoutName()\n * });\n * const { createResourceLayout } = factory.defineResourceLayout({\n * render: () => <div />\n * });\n * const Users = createResourceLayout({ resource: 'users' });\n * // Users.displayName is typed as 'UsersLayout'.\n * const AdminUsers = createResourceLayout({\n * resource: 'users',\n * name: layoutName({ prefix: 'Admin', beforeSuffix: 'Detail' })\n * });\n * // AdminUsers.displayName is typed as 'AdminUsersDetailLayout'.\n * ```\n *\n * @example\n * Declare custom string parts when their names describe your application's\n * conventions more clearly than prefix, beforeSuffix, and append.\n * ```ts\n * const pageName = defineLayoutName\n * .defineParts('section', 'variant')\n * .namingFn({\n * pattern: ({ resource, capitalize }, parts) =>\n * `${parts.section}${capitalize(resource)}${parts.variant}Page`\n * });\n * const adminPage = pageName({ section: 'Admin', variant: 'Detail' });\n * // Used for 'users', this produces 'AdminUsersDetailPage'.\n * const resourcePage = pageName(({ resource }) => ({\n * section: resource === 'users' ? 'Admin' : 'Public'\n * }));\n * // Used for 'users', this produces 'AdminUsersPage'.\n * // Other resources receive the 'Public' section instead.\n * ```\n *\n * @example\n * Use a schema when a part should accept a number instead of a string.\n * Supplied keys are suggested by the editor and checked against the schema.\n * ```ts\n * const versionedName = defineLayoutName\n * .defineParts({ section: 'string', version: 'number' })\n * .namingFn({\n * pattern: ({ resource, capitalize }, parts) =>\n * `${parts.section}${capitalize(resource)}V${parts.version}`\n * });\n * const adminV2 = versionedName({ section: 'Admin', version: 2 });\n * // Used for 'users', this produces 'AdminUsersV2'.\n * // versionedName({ version: '2' }) is rejected: version must be a number.\n * ```\n *\n * @example\n * Guard optional numeric values before formatting them with number methods.\n * Plain interpolation, as above, already handles empty values.\n * ```ts\n * const formattedName = defineLayoutName\n * .defineParts({ version: 'number' })\n * .namingFn({\n * pattern: ({ resource, capitalize }, parts) => {\n * const version =\n * typeof parts.version === 'number' ? parts.version.toFixed(0) : '';\n * return `${capitalize(resource)}V${version}`;\n * }\n * });\n * ```\n *\n * @example\n * Opt out of part checking when a convention intentionally accepts external\n * keys and mixed value types. The resulting displayName is typed as string.\n * ```ts\n * const externalName = defineLayoutName\n * .defineParts({ version: 'number' })\n * .namingFn({\n * pattern: ({ resource }, parts) =>\n * `${resource}${parts.version}${parts.extra}`,\n * strict: false\n * });\n * const legacy = externalName({ version: 'legacy', extra: true });\n * ```\n */\nexport function defineLayoutName<\n const Pattern extends string,\n const Strict extends boolean = true\n>(\n definition: LayoutNameOptions<\n typeof defaultPartDefinitions,\n Pattern,\n Strict\n >\n): LayoutNameFactory<typeof defaultPartDefinitions, Pattern, Strict> {\n return createNamingFactory(defaultPartDefinitions, definition);\n}\n\n/**\n * Declares string placeholders from their names.\n * Call namingFn on the result to define how those slots form a layout name.\n */\nfunction defineParts<const Keys extends readonly string[]>(\n ...keys: Keys\n): DefinedLayoutNameParts<{ [Key in Keys[number]]: 'string' }>;\n/**\n * Declares placeholders with string or number values from a part schema.\n * Call namingFn on the result to define how those slots form a layout name.\n */\nfunction defineParts<const Definitions extends LayoutNamePartDefinitions>(\n definitions: Definitions\n): DefinedLayoutNameParts<Definitions>;\nfunction defineParts(\n ...input: string[] | [LayoutNamePartDefinitions]\n): DefinedLayoutNameParts<LayoutNamePartDefinitions> {\n const definitions =\n typeof input[0] === 'object'\n ? input[0]\n : Object.fromEntries(input.map((key) => [key, 'string']));\n return {\n namingFn(definition) {\n return createNamingFactory(definitions, definition);\n }\n };\n}\n\ndefineLayoutName.defineParts = defineParts;\n"],"mappings":";;;;;AA8IA,MAAa,oBAAmC,OAC9C,mBACF;AA+HA,MAAM,yBAAyB;CAC7B,QAAQ;CACR,cAAc;CACd,QAAQ;AACV;AAEA,SAAS,mBACP,aACA,QACiC;CACjC,IAAI,WAAW,QAAW,OAAO,CAAC;CAClC,IACE,WAAW,QACX,OAAO,WAAW,YAClB,MAAM,QAAQ,MAAM,GAEpB,MAAM,IAAI,yBACR,uCACF;CAGF,MAAM,WAA6C,CAAC;CACpD,KAAK,MAAM,QAAQ,QAAQ,QAAQ,MAAM,GAAG;EAC1C,IAAI,OAAO,SAAS,YAAY,CAAC,OAAO,OAAO,aAAa,IAAI,GAC9D,MAAM,IAAI,iBAAiB;GACzB,MAAM,OAAO,IAAI;GACjB,YAAY,OAAO,KAAK,WAAW;EACrC,CAAC;EAEH,MAAM,QAAiB,QAAQ,IAAI,QAAQ,IAAI;EAC/C,IAAI,UAAU,QAAW;EAEzB,MAAM,eAAe,YAAY;EACjC,IACG,iBAAiB,YAAY,OAAO,UAAU,YAC9C,iBAAiB,YAAY,OAAO,UAAU,UAE/C,SAAS,KAAK,CAAC,MAAM,KAAK,CAAC;OAE3B,MAAM,IAAI,qBAAqB;GAC7B;GACA;GACA,cACE,UAAU,OACN,SACA,MAAM,QAAQ,KAAK,IACnB,UACA,OAAO;EACf,CAAC;CAEL;CACA,OAAO,OAAO,YAAY,QAAQ;AACpC;AAEA,SAAS,oBAKP,aACA,YACiD;CACjD,IACE,eAAe,QACf,OAAO,eAAe,YACtB,OAAO,WAAW,YAAY,YAE9B,MAAM,IAAI,yBACR,uEACF;CAEF,MAAM,EAAE,YAAY;CACpB,MAAM,SAAS,WAAW,WAAW;CACrC,MAAM,WAAW,OAAO,YACtB,OAAO,KAAK,WAAW,EAAE,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC,CACjD;CACA,SAAS,KAGP,OAGgE;EAChE,IAAI,UAAU,OAAO,UAAU,YAC7B,mBAAmB,aAAa,KAAK;EACvC,MAAM,aAAa,YAA+B;GAChD,MAAM,SACJ,OAAO,UAAU,aACb,MAAM,OAAwC,IAC9C;GACN,MAAM,WAAW,SACb,mBAAmB,aAAa,MAAM,IACtC,OAAO,YACL,OAAO,QAAQ,UAAU,CAAC,CAAC,EAAE,QAC1B,GAAG,WAAW,UAAU,MAC3B,CACF;GACJ,OAAO,QACL,SACA;IACE,GAAG;IACH,GAAG;GACL,CAGF;EACF;EAIA,OAAO,eAAe,UAAU,mBAAmB,EAAE,OAAO,CAAC,EAAE,CAAC;EAChE,OAAO;CACT;CACA,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+HA,SAAgB,iBAId,YAKmE;CACnE,OAAO,oBAAoB,wBAAwB,UAAU;AAC/D;AAgBA,SAAS,YACP,GAAG,OACgD;CACnD,MAAM,cACJ,OAAO,MAAM,OAAO,WAChB,MAAM,KACN,OAAO,YAAY,MAAM,KAAK,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC;CAC5D,OAAO,EACL,SAAS,YAAY;EACnB,OAAO,oBAAoB,aAAa,UAAU;CACpD,EACF;AACF;AAEA,iBAAiB,cAAc"}