@zod-to-form/codegen 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/config-template.d.ts +36 -0
- package/dist/config-template.d.ts.map +1 -0
- package/dist/config-template.js +113 -0
- package/dist/config-template.js.map +1 -0
- package/dist/field-templates.d.ts +10 -0
- package/dist/field-templates.d.ts.map +1 -0
- package/dist/field-templates.js +105 -0
- package/dist/field-templates.js.map +1 -0
- package/dist/generate.d.ts +31 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +564 -0
- package/dist/generate.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/schema-lite-codegen.d.ts +9 -0
- package/dist/schema-lite-codegen.d.ts.map +1 -0
- package/dist/schema-lite-codegen.js +130 -0
- package/dist/schema-lite-codegen.js.map +1 -0
- package/dist/templates.d.ts +13 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +191 -0
- package/dist/templates.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +48 -0
package/dist/generate.js
ADDED
|
@@ -0,0 +1,564 @@
|
|
|
1
|
+
import { getEmptyDefault } from '@zod-to-form/core';
|
|
2
|
+
import { getFileHeader, renderField, registerPathExpr, renderOptimizedRegister } from './templates.js';
|
|
3
|
+
import { PRESET_TEMPLATE_IMPORTS } from './field-templates.js';
|
|
4
|
+
function renderLiteralProp(value) {
|
|
5
|
+
if (typeof value === 'string') {
|
|
6
|
+
const json = JSON.stringify(value);
|
|
7
|
+
const inner = json.slice(1, -1);
|
|
8
|
+
return `"${inner}"`;
|
|
9
|
+
}
|
|
10
|
+
if (typeof value === 'number' || typeof value === 'boolean') {
|
|
11
|
+
return `{${String(value)}}`;
|
|
12
|
+
}
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
/** Known RHF field expressions that should be resolved, not rendered as literal props */
|
|
16
|
+
const RHF_FIELD_EXPRESSIONS = new Set([
|
|
17
|
+
'field.value',
|
|
18
|
+
'field.onChange',
|
|
19
|
+
'field.onBlur',
|
|
20
|
+
'field.ref',
|
|
21
|
+
'field.name'
|
|
22
|
+
]);
|
|
23
|
+
function renderOverrideProps(props) {
|
|
24
|
+
if (!props) {
|
|
25
|
+
return '';
|
|
26
|
+
}
|
|
27
|
+
const attrs = Object.entries(props)
|
|
28
|
+
.map(([key, value]) => {
|
|
29
|
+
// Skip RHF field expressions — they are resolved by resolvePropMap/renderControlledComponent
|
|
30
|
+
if (typeof value === 'string' && RHF_FIELD_EXPRESSIONS.has(value)) {
|
|
31
|
+
return '';
|
|
32
|
+
}
|
|
33
|
+
const rendered = renderLiteralProp(value);
|
|
34
|
+
if (!rendered && value !== undefined && value !== null) {
|
|
35
|
+
console.warn(`[zod-to-form codegen] Prop "${key}" has unsupported type "${typeof value}" and will be omitted from generated code.`);
|
|
36
|
+
}
|
|
37
|
+
return rendered ? ` ${key}=${rendered}` : '';
|
|
38
|
+
})
|
|
39
|
+
.join('');
|
|
40
|
+
return attrs;
|
|
41
|
+
}
|
|
42
|
+
function getMappedFieldComponent(field, componentConfig) {
|
|
43
|
+
const mapping = resolveFieldMapping(field.key, field.component, componentConfig);
|
|
44
|
+
if (!mapping.componentName) {
|
|
45
|
+
return { source: mapping.source };
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
componentName: mapping.componentName,
|
|
49
|
+
override: mapping.override,
|
|
50
|
+
componentOverride: mapping.componentOverride,
|
|
51
|
+
source: mapping.source
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function collectMappedComponentNames(fields, componentConfig, out = new Set()) {
|
|
55
|
+
for (const field of fields) {
|
|
56
|
+
const mapping = getMappedFieldComponent(field, componentConfig);
|
|
57
|
+
if (mapping.componentName && (mapping.componentOverride || mapping.override)) {
|
|
58
|
+
out.add(mapping.componentName);
|
|
59
|
+
}
|
|
60
|
+
if (field.children?.length) {
|
|
61
|
+
collectMappedComponentNames(field.children, componentConfig, out);
|
|
62
|
+
}
|
|
63
|
+
if (field.arrayItem) {
|
|
64
|
+
collectMappedComponentNames([field.arrayItem], componentConfig, out);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
function renderFieldContainer(field, content, indent, preset = 'html') {
|
|
70
|
+
const labelContent = field.deprecated
|
|
71
|
+
? `<s>${field.label}</s> <span title="Deprecated">⚠</span>`
|
|
72
|
+
: field.label;
|
|
73
|
+
if (preset === 'shadcn') {
|
|
74
|
+
const lines = [
|
|
75
|
+
`${indent}<FormItem>`,
|
|
76
|
+
`${indent} <FormLabel htmlFor="${field.key}">${labelContent}</FormLabel>`,
|
|
77
|
+
`${indent} <FormControl>${content}</FormControl>`
|
|
78
|
+
];
|
|
79
|
+
if (field.description) {
|
|
80
|
+
lines.push(`${indent} <FormDescription>${field.description}</FormDescription>`);
|
|
81
|
+
}
|
|
82
|
+
if (field.helpText) {
|
|
83
|
+
lines.push(`${indent} <p className="text-sm text-muted-foreground mt-1">${field.helpText}</p>`);
|
|
84
|
+
}
|
|
85
|
+
lines.push(`${indent} <FormMessage />`);
|
|
86
|
+
lines.push(`${indent}</FormItem>`);
|
|
87
|
+
return lines.join('\n');
|
|
88
|
+
}
|
|
89
|
+
const lines = [
|
|
90
|
+
`${indent}<div>`,
|
|
91
|
+
`${indent} <label htmlFor="${field.key}">${labelContent}</label>`,
|
|
92
|
+
`${indent} ${content}`
|
|
93
|
+
];
|
|
94
|
+
if (field.helpText) {
|
|
95
|
+
lines.push(`${indent} <p>${field.helpText}</p>`);
|
|
96
|
+
}
|
|
97
|
+
lines.push(`${indent}</div>`);
|
|
98
|
+
return lines.join('\n');
|
|
99
|
+
}
|
|
100
|
+
function normalizeFieldKey(key) {
|
|
101
|
+
let result = key.replace(/\.(?:\d+|\$\{index\})\./g, '[].');
|
|
102
|
+
result = result.replace(/\.(?:\d+|\$\{index\})$/, '[]');
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
export function resolveFieldMapping(fieldKey, componentName, componentConfig) {
|
|
106
|
+
if (!componentConfig) {
|
|
107
|
+
return { source: 'none' };
|
|
108
|
+
}
|
|
109
|
+
const normalizedKey = normalizeFieldKey(fieldKey);
|
|
110
|
+
const override = componentConfig.fields?.[fieldKey] ?? componentConfig.fields?.[normalizedKey];
|
|
111
|
+
const resolvedComponent = override?.component ?? componentName;
|
|
112
|
+
if (override) {
|
|
113
|
+
return {
|
|
114
|
+
componentName: resolvedComponent,
|
|
115
|
+
componentOverride: resolvedComponent
|
|
116
|
+
? componentConfig.components.overrides?.[resolvedComponent]
|
|
117
|
+
: undefined,
|
|
118
|
+
override,
|
|
119
|
+
source: 'fields'
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (resolvedComponent) {
|
|
123
|
+
return {
|
|
124
|
+
componentName: resolvedComponent,
|
|
125
|
+
componentOverride: componentConfig.components.overrides?.[resolvedComponent],
|
|
126
|
+
source: 'components'
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
return { source: 'none' };
|
|
130
|
+
}
|
|
131
|
+
function toVarName(key) {
|
|
132
|
+
const parts = key.split(/[^a-zA-Z0-9]+/).filter((p) => p.length > 0);
|
|
133
|
+
return parts
|
|
134
|
+
.map((part, i) => (i === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)))
|
|
135
|
+
.join('');
|
|
136
|
+
}
|
|
137
|
+
function collectArrayFields(fields) {
|
|
138
|
+
const result = [];
|
|
139
|
+
for (const field of fields) {
|
|
140
|
+
if (field.component === 'ArrayField' && !field.key.includes('.0.')) {
|
|
141
|
+
result.push(field);
|
|
142
|
+
}
|
|
143
|
+
if (field.component === 'Fieldset' && field.children) {
|
|
144
|
+
result.push(...collectArrayFields(field.children));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
function replaceArrayIndexToken(key, arrayKey) {
|
|
150
|
+
const prefix = `${arrayKey}.0`;
|
|
151
|
+
if (key === prefix) {
|
|
152
|
+
return `${arrayKey}.${'${index}'}`;
|
|
153
|
+
}
|
|
154
|
+
if (key.startsWith(`${prefix}.`)) {
|
|
155
|
+
return `${arrayKey}.${'${index}'}.${key.slice(prefix.length + 1)}`;
|
|
156
|
+
}
|
|
157
|
+
return key;
|
|
158
|
+
}
|
|
159
|
+
function cloneFieldWithArrayIndex(field, arrayKey) {
|
|
160
|
+
return {
|
|
161
|
+
...field,
|
|
162
|
+
key: replaceArrayIndexToken(field.key, arrayKey),
|
|
163
|
+
children: field.children?.map((child) => cloneFieldWithArrayIndex(child, arrayKey)),
|
|
164
|
+
arrayItem: field.arrayItem ? cloneFieldWithArrayIndex(field.arrayItem, arrayKey) : undefined
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
function getDefaultArrayItemExpression(field) {
|
|
168
|
+
if (!field) {
|
|
169
|
+
return `''`;
|
|
170
|
+
}
|
|
171
|
+
const value = getEmptyDefault(field);
|
|
172
|
+
return serializeDefaultValue(value);
|
|
173
|
+
}
|
|
174
|
+
const charMap = {
|
|
175
|
+
'<': '\\u003C',
|
|
176
|
+
'>': '\\u003E',
|
|
177
|
+
'/': '\\u002F',
|
|
178
|
+
'\\': '\\\\',
|
|
179
|
+
'\b': '\\b',
|
|
180
|
+
'\f': '\\f',
|
|
181
|
+
'\n': '\\n',
|
|
182
|
+
'\r': '\\r',
|
|
183
|
+
'\t': '\\t',
|
|
184
|
+
'\0': '\\0',
|
|
185
|
+
'\u2028': '\\u2028',
|
|
186
|
+
'\u2029': '\\u2029'
|
|
187
|
+
};
|
|
188
|
+
function escapeUnsafeChars(str) {
|
|
189
|
+
return str.replace(/[<>/\\\b\f\n\r\t\0\u2028\u2029]/g, (x) => charMap[x] ?? x);
|
|
190
|
+
}
|
|
191
|
+
function serializeDefaultValue(value) {
|
|
192
|
+
if (value === undefined)
|
|
193
|
+
return 'undefined';
|
|
194
|
+
if (value === '')
|
|
195
|
+
return `''`;
|
|
196
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
197
|
+
return String(value);
|
|
198
|
+
if (typeof value === 'string')
|
|
199
|
+
return escapeUnsafeChars(JSON.stringify(value));
|
|
200
|
+
if (Array.isArray(value))
|
|
201
|
+
return '[]';
|
|
202
|
+
if (value && typeof value === 'object') {
|
|
203
|
+
const entries = Object.entries(value)
|
|
204
|
+
.map(([k, v]) => `${escapeUnsafeChars(JSON.stringify(k))}: ${serializeDefaultValue(v)}`)
|
|
205
|
+
.join(', ');
|
|
206
|
+
return `{ ${entries} }`;
|
|
207
|
+
}
|
|
208
|
+
return escapeUnsafeChars(JSON.stringify(value));
|
|
209
|
+
}
|
|
210
|
+
function renderNestedBlock(field, componentConfig, indent, optimized = false) {
|
|
211
|
+
const children = (field.children ?? [])
|
|
212
|
+
.map((child) => renderFieldBlockWithConfig(child, componentConfig, `${indent} `, 'html', optimized))
|
|
213
|
+
.join('\n');
|
|
214
|
+
return [
|
|
215
|
+
`${indent}<div>`,
|
|
216
|
+
`${indent} <label>${field.label}</label>`,
|
|
217
|
+
`${indent} <fieldset>`,
|
|
218
|
+
`${indent} <legend>${field.label}</legend>`,
|
|
219
|
+
children,
|
|
220
|
+
`${indent} </fieldset>`,
|
|
221
|
+
`${indent}</div>`
|
|
222
|
+
].join('\n');
|
|
223
|
+
}
|
|
224
|
+
function renderArrayBlock(field, componentConfig, indent, optimized = false) {
|
|
225
|
+
if (field.key.includes('${')) {
|
|
226
|
+
return [
|
|
227
|
+
`${indent}<div>`,
|
|
228
|
+
`${indent} <label>${field.label}</label>`,
|
|
229
|
+
`${indent} <p>Nested array editing is not auto-generated for dynamic paths. Use a custom renderer for ${field.key}.</p>`,
|
|
230
|
+
`${indent}</div>`
|
|
231
|
+
].join('\n');
|
|
232
|
+
}
|
|
233
|
+
const varName = toVarName(field.key);
|
|
234
|
+
const itemField = field.arrayItem;
|
|
235
|
+
const indexedItemField = itemField ? cloneFieldWithArrayIndex(itemField, field.key) : undefined;
|
|
236
|
+
const mappedItem = indexedItemField
|
|
237
|
+
? getMappedFieldComponent(indexedItemField, componentConfig)
|
|
238
|
+
: { source: 'none' };
|
|
239
|
+
let itemJsx;
|
|
240
|
+
if (!indexedItemField) {
|
|
241
|
+
itemJsx = `${indent} <input {...${registerPathExpr(`${field.key}.\${index}`)}} />`;
|
|
242
|
+
}
|
|
243
|
+
else if (mappedItem.source === 'fields' &&
|
|
244
|
+
mappedItem.componentName &&
|
|
245
|
+
mappedItem.componentOverride?.controlled) {
|
|
246
|
+
const overrideProps = renderOverrideProps(mappedItem.override?.props);
|
|
247
|
+
const propMap = resolvePropMap(mappedItem.componentOverride, mappedItem.override);
|
|
248
|
+
itemJsx = renderControlledComponent(indexedItemField.key, mappedItem.componentName, propMap, overrideProps);
|
|
249
|
+
}
|
|
250
|
+
else if (mappedItem.source === 'fields' && mappedItem.componentName) {
|
|
251
|
+
itemJsx = `<${mappedItem.componentName} {...${registerPathExpr(indexedItemField.key)}}${renderOverrideProps(mappedItem.override?.props)} />`;
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
itemJsx = renderFieldBlockWithConfig(indexedItemField, componentConfig, `${indent} `, 'html', optimized);
|
|
255
|
+
}
|
|
256
|
+
return [
|
|
257
|
+
`${indent}<div>`,
|
|
258
|
+
`${indent} <label>${field.label}</label>`,
|
|
259
|
+
`${indent} {${varName}Fields.map((item, index) => (`,
|
|
260
|
+
`${indent} <div key={item.id}>`,
|
|
261
|
+
itemJsx,
|
|
262
|
+
`${indent} <button type="button" onClick={() => remove${capitalize(varName)}(index)}>Remove</button>`,
|
|
263
|
+
`${indent} </div>`,
|
|
264
|
+
`${indent} ))}`,
|
|
265
|
+
`${indent} <button type="button" onClick={() => append${capitalize(varName)}(${getDefaultArrayItemExpression(itemField)})}>Add</button>`,
|
|
266
|
+
`${indent}</div>`
|
|
267
|
+
].join('\n');
|
|
268
|
+
}
|
|
269
|
+
function capitalize(s) {
|
|
270
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
271
|
+
}
|
|
272
|
+
function resolvePropMap(componentOverride, override) {
|
|
273
|
+
const entryMap = componentOverride?.props;
|
|
274
|
+
const fieldMap = override?.props;
|
|
275
|
+
function filterRhfProps(map) {
|
|
276
|
+
if (!map)
|
|
277
|
+
return undefined;
|
|
278
|
+
const filtered = {};
|
|
279
|
+
let hasAny = false;
|
|
280
|
+
for (const [k, v] of Object.entries(map)) {
|
|
281
|
+
if (typeof v === 'string' && RHF_FIELD_EXPRESSIONS.has(v)) {
|
|
282
|
+
filtered[k] = v;
|
|
283
|
+
hasAny = true;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return hasAny ? filtered : undefined;
|
|
287
|
+
}
|
|
288
|
+
const filteredEntry = filterRhfProps(entryMap);
|
|
289
|
+
const filteredField = filterRhfProps(fieldMap);
|
|
290
|
+
if (!filteredEntry && !filteredField)
|
|
291
|
+
return undefined;
|
|
292
|
+
return { ...filteredEntry, ...filteredField };
|
|
293
|
+
}
|
|
294
|
+
function renderControlledComponent(fieldKey, componentName, propMap, overrideProps) {
|
|
295
|
+
const defaultFieldProps = {
|
|
296
|
+
value: 'field.value',
|
|
297
|
+
onChange: 'field.onChange',
|
|
298
|
+
onBlur: 'field.onBlur',
|
|
299
|
+
ref: 'field.ref',
|
|
300
|
+
name: 'field.name'
|
|
301
|
+
};
|
|
302
|
+
const finalProps = { ...defaultFieldProps };
|
|
303
|
+
if (propMap) {
|
|
304
|
+
const rhfTargets = new Set(Object.values(propMap));
|
|
305
|
+
for (const [defaultProp, defaultExpr] of Object.entries(defaultFieldProps)) {
|
|
306
|
+
if (rhfTargets.has(defaultExpr) && !(defaultProp in propMap)) {
|
|
307
|
+
delete finalProps[defaultProp];
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
for (const [componentProp, rhfExpr] of Object.entries(propMap)) {
|
|
311
|
+
finalProps[componentProp] = rhfExpr;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
const propsStr = Object.entries(finalProps)
|
|
315
|
+
.map(([prop, expr]) => `${prop}={${expr}}`)
|
|
316
|
+
.join(' ');
|
|
317
|
+
const nameExpr = fieldKey.includes('${') ? `\`${fieldKey}\`` : `"${fieldKey}"`;
|
|
318
|
+
const idExpr = fieldKey.includes('${') ? `{${'`'}${fieldKey}${'`'}}` : `"${fieldKey}"`;
|
|
319
|
+
return [
|
|
320
|
+
`<Controller name={${nameExpr}} control={control} render={({ field }) => (`,
|
|
321
|
+
` <${componentName} id=${idExpr} ${propsStr}${overrideProps} />`,
|
|
322
|
+
`)} />`
|
|
323
|
+
].join('\n');
|
|
324
|
+
}
|
|
325
|
+
function renderMappedComponent(field, componentName, componentOverride, override, overrideProps) {
|
|
326
|
+
if (componentOverride?.controlled) {
|
|
327
|
+
const propMap = resolvePropMap(componentOverride, override);
|
|
328
|
+
return renderControlledComponent(field.key, componentName, propMap, overrideProps);
|
|
329
|
+
}
|
|
330
|
+
return `<${componentName} id="${field.key}" {...${registerPathExpr(field.key)}}${overrideProps} />`;
|
|
331
|
+
}
|
|
332
|
+
function renderFieldBlockWithConfig(field, componentConfig, indent = ' ', preset = 'html', optimized = false) {
|
|
333
|
+
const mapping = getMappedFieldComponent(field, componentConfig);
|
|
334
|
+
if (field.hasCustomRender) {
|
|
335
|
+
return [
|
|
336
|
+
`${indent}<div>`,
|
|
337
|
+
`${indent} <label htmlFor="${field.key}">${field.label}</label>`,
|
|
338
|
+
`${indent} {/* TODO: custom renderer for ${field.key} — replace with your component */}`,
|
|
339
|
+
`${indent}</div>`
|
|
340
|
+
].join('\n');
|
|
341
|
+
}
|
|
342
|
+
if (mapping.source === 'fields' && mapping.componentName) {
|
|
343
|
+
const overrideProps = renderOverrideProps(mapping.override?.props);
|
|
344
|
+
const content = renderMappedComponent(field, mapping.componentName, mapping.componentOverride, mapping.override, overrideProps);
|
|
345
|
+
return renderFieldContainer(field, content, indent, preset);
|
|
346
|
+
}
|
|
347
|
+
if (field.component === 'Fieldset') {
|
|
348
|
+
return renderNestedBlock(field, componentConfig, indent, optimized);
|
|
349
|
+
}
|
|
350
|
+
if (field.component === 'ArrayField') {
|
|
351
|
+
return renderArrayBlock(field, componentConfig, indent, optimized);
|
|
352
|
+
}
|
|
353
|
+
if (mapping.componentName && (mapping.componentOverride || mapping.override)) {
|
|
354
|
+
const overrideProps = renderOverrideProps(mapping.override?.props);
|
|
355
|
+
const content = renderMappedComponent(field, mapping.componentName, mapping.componentOverride, mapping.override, overrideProps);
|
|
356
|
+
return renderFieldContainer(field, content, indent, preset);
|
|
357
|
+
}
|
|
358
|
+
// When optimized and the field has a validation strategy, pass the optimized
|
|
359
|
+
// register expression directly into renderField (avoids brittle string replace)
|
|
360
|
+
if (optimized && field.validation) {
|
|
361
|
+
const optimizedExpr = renderOptimizedRegister(field, field.key);
|
|
362
|
+
return renderFieldContainer(field, renderField(field, optimizedExpr), indent, preset);
|
|
363
|
+
}
|
|
364
|
+
return renderFieldContainer(field, renderField(field), indent, preset);
|
|
365
|
+
}
|
|
366
|
+
function hasControlledFields(fields, componentConfig) {
|
|
367
|
+
if (!componentConfig)
|
|
368
|
+
return false;
|
|
369
|
+
for (const field of fields) {
|
|
370
|
+
const mapping = resolveFieldMapping(field.key, field.component, componentConfig);
|
|
371
|
+
if (mapping.componentOverride?.controlled)
|
|
372
|
+
return true;
|
|
373
|
+
if (field.children?.length && hasControlledFields(field.children, componentConfig))
|
|
374
|
+
return true;
|
|
375
|
+
if (field.arrayItem && hasControlledFields([field.arrayItem], componentConfig))
|
|
376
|
+
return true;
|
|
377
|
+
}
|
|
378
|
+
return false;
|
|
379
|
+
}
|
|
380
|
+
function collectZodSchemaFields(fields) {
|
|
381
|
+
const result = [];
|
|
382
|
+
for (const field of fields) {
|
|
383
|
+
if (field.validation?.mode === 'zodSchema') {
|
|
384
|
+
result.push(field);
|
|
385
|
+
}
|
|
386
|
+
if (field.children?.length) {
|
|
387
|
+
result.push(...collectZodSchemaFields(field.children));
|
|
388
|
+
}
|
|
389
|
+
if (field.arrayItem) {
|
|
390
|
+
result.push(...collectZodSchemaFields([field.arrayItem]));
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return result;
|
|
394
|
+
}
|
|
395
|
+
function hasAnyZodSchemaOrSchemaLite(fields, schemaLite) {
|
|
396
|
+
if (schemaLite)
|
|
397
|
+
return true;
|
|
398
|
+
return collectZodSchemaFields(fields).length > 0;
|
|
399
|
+
}
|
|
400
|
+
function generateHoistedValidators(fields, exportName) {
|
|
401
|
+
// Only hoist validators for top-level fields — nested paths (e.g. "address.street")
|
|
402
|
+
// can't be accessed via simple .shape.key and would produce invalid code.
|
|
403
|
+
const zodFields = collectZodSchemaFields(fields).filter((f) => !f.key.includes('.'));
|
|
404
|
+
return zodFields.map((field) => {
|
|
405
|
+
const safeKey = field.key.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
406
|
+
const keyLiteral = JSON.stringify(field.key);
|
|
407
|
+
return `const _validate_${safeKey} = (value: unknown) => { const r = ${exportName}.shape[${keyLiteral}].safeParse(value); return r.success ? true : r.error.issues[0]?.message ?? 'Invalid'; };`;
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
export function generateFormComponent(fields, config) {
|
|
411
|
+
const schemaImportPath = config.schemaImportPath ?? './schema';
|
|
412
|
+
const arrayFields = collectArrayFields(fields);
|
|
413
|
+
const hasArrays = arrayFields.length > 0;
|
|
414
|
+
const useFormProvider = config.formProvider || config.mode === 'auto-save';
|
|
415
|
+
const hasControlled = hasControlledFields(fields, config.componentConfig);
|
|
416
|
+
const optimized = config.validationLevel != null;
|
|
417
|
+
const preset = config.componentConfig?.components?.preset ?? (config.ui === 'shadcn' ? 'shadcn' : 'html');
|
|
418
|
+
const mappedComponents = collectMappedComponentNames(fields, config.componentConfig);
|
|
419
|
+
const importNames = new Set(mappedComponents);
|
|
420
|
+
// Add form primitive imports required by the preset's field template
|
|
421
|
+
const templateImports = PRESET_TEMPLATE_IMPORTS[preset] ?? [];
|
|
422
|
+
for (const name of templateImports) {
|
|
423
|
+
importNames.add(name);
|
|
424
|
+
}
|
|
425
|
+
const componentImportLine = config.componentConfig && importNames.size > 0
|
|
426
|
+
? `import { ${Array.from(importNames).sort().join(', ')} } from '${config.componentConfig.components.source}';`
|
|
427
|
+
: undefined;
|
|
428
|
+
// Determine optimized import flags
|
|
429
|
+
const optimizedOptions = optimized
|
|
430
|
+
? {
|
|
431
|
+
includeZodResolver: false, // Optimized mode never uses zodResolver
|
|
432
|
+
includeZod: hasAnyZodSchemaOrSchemaLite(fields, config.schemaLite)
|
|
433
|
+
}
|
|
434
|
+
: undefined;
|
|
435
|
+
const header = getFileHeader(schemaImportPath, config.exportName, hasArrays, config.mode, componentImportLine, { hasControlled, formProvider: useFormProvider, preset }, optimizedOptions);
|
|
436
|
+
// When optimized with schemaLite, the form imports from the .lite.ts file
|
|
437
|
+
const hasSchemaLite = optimized && config.schemaLite != null;
|
|
438
|
+
const schemaLiteImport = hasSchemaLite
|
|
439
|
+
? `import { schemaLite } from './${config.componentName}.lite.js';`
|
|
440
|
+
: undefined;
|
|
441
|
+
// Generate hoisted validators for optimized mode
|
|
442
|
+
const hoistedValidators = optimized ? generateHoistedValidators(fields, config.exportName) : [];
|
|
443
|
+
const body = fields
|
|
444
|
+
.map((field) => renderFieldBlockWithConfig(field, config.componentConfig, ' ', preset, optimized))
|
|
445
|
+
.join('\n');
|
|
446
|
+
const arrayHooks = arrayFields
|
|
447
|
+
.map((f) => {
|
|
448
|
+
const varName = toVarName(f.key);
|
|
449
|
+
return ` const { fields: ${varName}Fields, append: append${capitalize(varName)}, remove: remove${capitalize(varName)} } = useFieldArray<FormData, '${f.key}'>({ control, name: '${f.key}' });`;
|
|
450
|
+
})
|
|
451
|
+
.join('\n');
|
|
452
|
+
const destructureParts = ['register'];
|
|
453
|
+
if (config.mode === 'auto-save') {
|
|
454
|
+
destructureParts.push('watch');
|
|
455
|
+
}
|
|
456
|
+
else {
|
|
457
|
+
destructureParts.push('handleSubmit');
|
|
458
|
+
}
|
|
459
|
+
if (hasArrays || hasControlled) {
|
|
460
|
+
destructureParts.push('control');
|
|
461
|
+
}
|
|
462
|
+
const useFormDestructure = `{ ${destructureParts.join(', ')} }`;
|
|
463
|
+
const propsLines = [];
|
|
464
|
+
if (config.mode === 'auto-save') {
|
|
465
|
+
propsLines.push(` onValueChange?: (data: FormData) => void;`);
|
|
466
|
+
propsLines.push(` onSubmit?: (data: FormData) => void;`);
|
|
467
|
+
}
|
|
468
|
+
else {
|
|
469
|
+
propsLines.push(` onSubmit: (data: FormData) => void;`);
|
|
470
|
+
}
|
|
471
|
+
propsLines.push(` defaultValues?: Partial<FormData>;`);
|
|
472
|
+
propsLines.push(` values?: FormData;`);
|
|
473
|
+
const autoSaveEffect = config.mode === 'auto-save'
|
|
474
|
+
? [
|
|
475
|
+
` useEffect(() => {`,
|
|
476
|
+
` const subscription = watch((values) => {`,
|
|
477
|
+
` props.onValueChange?.(values as FormData);`,
|
|
478
|
+
` });`,
|
|
479
|
+
``,
|
|
480
|
+
` return () => subscription.unsubscribe();`,
|
|
481
|
+
` }, [watch, props.onValueChange]);`,
|
|
482
|
+
``
|
|
483
|
+
]
|
|
484
|
+
: [];
|
|
485
|
+
const formOpen = config.mode === 'auto-save'
|
|
486
|
+
? ` <form>`
|
|
487
|
+
: hasSchemaLite
|
|
488
|
+
? ` <form onSubmit={handleSubmit(onSubmitValidated)}>`
|
|
489
|
+
: ` <form onSubmit={handleSubmit(props.onSubmit)}>`;
|
|
490
|
+
const formTail = config.mode === 'auto-save' ? [] : [` <button type="submit">Submit</button>`];
|
|
491
|
+
const formContent = [formOpen, body, ...formTail, ` </form>`];
|
|
492
|
+
const wrappedContent = useFormProvider
|
|
493
|
+
? [
|
|
494
|
+
` <FormProvider {...form}>`,
|
|
495
|
+
...formContent.map((line) => (line ? ` ${line}` : line)),
|
|
496
|
+
` </FormProvider>`
|
|
497
|
+
]
|
|
498
|
+
: formContent;
|
|
499
|
+
// Build useForm options based on optimization mode
|
|
500
|
+
let useFormLines;
|
|
501
|
+
if (optimized) {
|
|
502
|
+
// Optimized mode never uses zodResolver — per-field validation handles fields,
|
|
503
|
+
// and schemaLite (if present) handles top-level effects in the submit wrapper.
|
|
504
|
+
useFormLines = [` const form = useForm<FormData>({`];
|
|
505
|
+
}
|
|
506
|
+
else {
|
|
507
|
+
// Non-optimized (default) — always use zodResolver
|
|
508
|
+
useFormLines =
|
|
509
|
+
preset === 'shadcn'
|
|
510
|
+
? [` const form = useForm<FormData>({`, ` resolver: zodResolver(${config.exportName}),`]
|
|
511
|
+
: [
|
|
512
|
+
` const baseResolver = zodResolver(${config.exportName});`,
|
|
513
|
+
` const form = useForm<FormData>({`,
|
|
514
|
+
` resolver: (values: unknown, ctx: unknown, opts: unknown) => baseResolver(normalizeFormValues(values) as FormData, ctx, opts),`
|
|
515
|
+
];
|
|
516
|
+
}
|
|
517
|
+
// Build submit wrapper using the imported schemaLite from the .lite.ts file.
|
|
518
|
+
// The lite schema only validates top-level effects (superRefine/refine/transform),
|
|
519
|
+
// not field-level constraints (those are handled per-field).
|
|
520
|
+
const schemaLiteWrapper = hasSchemaLite
|
|
521
|
+
? [
|
|
522
|
+
``,
|
|
523
|
+
` const onSubmitValidated = (data: FormData) => {`,
|
|
524
|
+
` const result = schemaLite.safeParse(data);`,
|
|
525
|
+
` if (!result.success && result.error) {`,
|
|
526
|
+
` for (const issue of result.error.issues) {`,
|
|
527
|
+
` const field = issue.path?.[0];`,
|
|
528
|
+
` if (typeof field === 'string') {`,
|
|
529
|
+
` form.setError(field as keyof FormData & string, { type: 'validate', message: issue.message });`,
|
|
530
|
+
` } else {`,
|
|
531
|
+
` form.setError('root', { type: 'validate', message: issue.message });`,
|
|
532
|
+
` }`,
|
|
533
|
+
` }`,
|
|
534
|
+
` return;`,
|
|
535
|
+
` }`,
|
|
536
|
+
` props.onSubmit(data);`,
|
|
537
|
+
` };`
|
|
538
|
+
]
|
|
539
|
+
: [];
|
|
540
|
+
return [
|
|
541
|
+
header,
|
|
542
|
+
...(schemaLiteImport ? [schemaLiteImport] : []),
|
|
543
|
+
...(hoistedValidators.length > 0 ? ['', ...hoistedValidators] : []),
|
|
544
|
+
'',
|
|
545
|
+
`export function ${config.componentName}(props: {`,
|
|
546
|
+
...propsLines,
|
|
547
|
+
`}) {`,
|
|
548
|
+
...useFormLines,
|
|
549
|
+
...(config.mode === 'auto-save' ? [` mode: 'onChange',`] : []),
|
|
550
|
+
` defaultValues: props.defaultValues,`,
|
|
551
|
+
` values: props.values,`,
|
|
552
|
+
` });`,
|
|
553
|
+
` const ${useFormDestructure} = form;`,
|
|
554
|
+
...(hasArrays ? [arrayHooks] : []),
|
|
555
|
+
...autoSaveEffect,
|
|
556
|
+
...schemaLiteWrapper,
|
|
557
|
+
'',
|
|
558
|
+
` return (`,
|
|
559
|
+
...wrappedContent,
|
|
560
|
+
` );`,
|
|
561
|
+
`}`
|
|
562
|
+
].join('\n');
|
|
563
|
+
}
|
|
564
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EACL,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,uBAAuB,EACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAwB/D,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChC,OAAO,IAAI,KAAK,GAAG,CAAC;IACtB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;IAC9B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,yFAAyF;AACzF,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,aAAa;IACb,gBAAgB;IAChB,cAAc;IACd,WAAW;IACX,YAAY;CACb,CAAC,CAAC;AAEH,SAAS,mBAAmB,CAAC,KAA0C;IACrE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACpB,6FAA6F;QAC7F,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAClE,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACvD,OAAO,CAAC,IAAI,CACV,+BAA+B,GAAG,2BAA2B,OAAO,KAAK,4CAA4C,CACtH,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,uBAAuB,CAC9B,KAAgB,EAChB,eAAoE;IAOpE,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAEjF,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;IACpC,CAAC;IAED,OAAO;QACL,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAClC,MAAmB,EACnB,eAAoE,EACpE,GAAG,GAAG,IAAI,GAAG,EAAU;IAEvB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QAChE,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7E,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YAC3B,2BAA2B,CAAC,KAAK,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,2BAA2B,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAAgB,EAChB,OAAe,EACf,MAAc,EACd,MAAM,GAAsB,MAAM;IAElC,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU;QACnC,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,wCAAwC;QAC3D,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;IAEhB,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG;YACZ,GAAG,MAAM,YAAY;YACrB,GAAG,MAAM,yBAAyB,KAAK,CAAC,GAAG,KAAK,YAAY,cAAc;YAC1E,GAAG,MAAM,kBAAkB,OAAO,gBAAgB;SACnD,CAAC;QACF,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,sBAAsB,KAAK,CAAC,WAAW,oBAAoB,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CACR,GAAG,MAAM,uDAAuD,KAAK,CAAC,QAAQ,MAAM,CACrF,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,mBAAmB,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,aAAa,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,GAAG,MAAM,OAAO;QAChB,GAAG,MAAM,qBAAqB,KAAK,CAAC,GAAG,KAAK,YAAY,UAAU;QAClE,GAAG,MAAM,KAAK,OAAO,EAAE;KACxB,CAAC;IACF,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,QAAQ,KAAK,CAAC,QAAQ,MAAM,CAAC,CAAC;IACpD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,QAAQ,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,IAAI,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;IAC5D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;IACxD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,aAAiC,EACjC,eAAwD;IAOxD,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,aAAa,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,eAAe,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,CAAC;IAE/F,MAAM,iBAAiB,GAAG,QAAQ,EAAE,SAAS,IAAI,aAAa,CAAC;IAE/D,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO;YACL,aAAa,EAAE,iBAAiB;YAChC,iBAAiB,EAAE,iBAAiB;gBAClC,CAAC,CAAE,eAAe,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,iBAAiB,CAE3C;gBAChB,CAAC,CAAC,SAAS;YACb,QAAQ;YACR,MAAM,EAAE,QAAQ;SACjB,CAAC;IACJ,CAAC;IAED,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO;YACL,aAAa,EAAE,iBAAiB;YAChC,iBAAiB,EAAE,eAAe,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,iBAAiB,CAE9D;YACb,MAAM,EAAE,YAAY;SACrB,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrE,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACjF,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAmB;IAC7C,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACnE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrD,MAAM,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAW,EAAE,QAAgB;IAC3D,MAAM,MAAM,GAAG,GAAG,QAAQ,IAAI,CAAC;IAC/B,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,OAAO,GAAG,QAAQ,IAAI,UAAU,EAAE,CAAC;IACrC,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,GAAG,QAAQ,IAAI,UAAU,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;IACrE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAgB,EAAE,QAAgB;IAClE,OAAO;QACL,GAAG,KAAK;QACR,GAAG,EAAE,sBAAsB,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC;QAChD,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,wBAAwB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACnF,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;KAC7F,CAAC;AACJ,CAAC;AAED,SAAS,6BAA6B,CAAC,KAA4B;IACjE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,OAAO,GAA2B;IACtC,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,KAAK;IACX,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;CACpB,CAAC;AAEF,SAAS,iBAAiB,CAAC,GAAW;IACpC,OAAO,GAAG,CAAC,OAAO,CAAC,kCAAkC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAC5C,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAClF,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;aACvF,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,KAAK,OAAO,IAAI,CAAC;IAC1B,CAAC;IACD,OAAO,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,iBAAiB,CACxB,KAAgB,EAChB,eAAoE,EACpE,MAAc,EACd,SAAS,GAAG,KAAK;IAEjB,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;SACpC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACb,0BAA0B,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CACrF;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;QACL,GAAG,MAAM,OAAO;QAChB,GAAG,MAAM,YAAY,KAAK,CAAC,KAAK,UAAU;QAC1C,GAAG,MAAM,cAAc;QACvB,GAAG,MAAM,eAAe,KAAK,CAAC,KAAK,WAAW;QAC9C,QAAQ;QACR,GAAG,MAAM,eAAe;QACxB,GAAG,MAAM,QAAQ;KAClB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAgB,EAChB,eAAoE,EACpE,MAAc,EACd,SAAS,GAAG,KAAK;IAEjB,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,GAAG,MAAM,OAAO;YAChB,GAAG,MAAM,YAAY,KAAK,CAAC,KAAK,UAAU;YAC1C,GAAG,MAAM,gGAAgG,KAAK,CAAC,GAAG,OAAO;YACzH,GAAG,MAAM,QAAQ;SAClB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IAClC,MAAM,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChG,MAAM,UAAU,GAAG,gBAAgB;QACjC,CAAC,CAAC,uBAAuB,CAAC,gBAAgB,EAAE,eAAe,CAAC;QAC5D,CAAC,CAAC,EAAE,MAAM,EAAE,MAAe,EAAE,CAAC;IAChC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,GAAG,GAAG,MAAM,oBAAoB,gBAAgB,CAAC,GAAG,KAAK,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC;IAC1F,CAAC;SAAM,IACL,UAAU,CAAC,MAAM,KAAK,QAAQ;QAC9B,UAAU,CAAC,aAAa;QACxB,UAAU,CAAC,iBAAiB,EAAE,UAAU,EACxC,CAAC;QACD,MAAM,aAAa,GAAG,mBAAmB,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,iBAAiB,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClF,OAAO,GAAG,yBAAyB,CACjC,gBAAgB,CAAC,GAAG,EACpB,UAAU,CAAC,aAAa,EACxB,OAAO,EACP,aAAa,CACd,CAAC;IACJ,CAAC;SAAM,IAAI,UAAU,CAAC,MAAM,KAAK,QAAQ,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC;QACtE,OAAO,GAAG,IAAI,UAAU,CAAC,aAAa,QAAQ,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,mBAAmB,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC;IAC/I,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,0BAA0B,CAClC,gBAAgB,EAChB,eAAe,EACf,GAAG,MAAM,QAAQ,EACjB,MAAM,EACN,SAAS,CACV,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG,MAAM,OAAO;QAChB,GAAG,MAAM,YAAY,KAAK,CAAC,KAAK,UAAU;QAC1C,GAAG,MAAM,MAAM,OAAO,+BAA+B;QACrD,GAAG,MAAM,yBAAyB;QAClC,OAAO;QACP,GAAG,MAAM,oDAAoD,UAAU,CAAC,OAAO,CAAC,0BAA0B;QAC1G,GAAG,MAAM,YAAY;QACrB,GAAG,MAAM,OAAO;QAChB,GAAG,MAAM,gDAAgD,UAAU,CAAC,OAAO,CAAC,IAAI,6BAA6B,CAAC,SAAS,CAAC,iBAAiB;QACzI,GAAG,MAAM,QAAQ;KAClB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,cAAc,CACrB,iBAAqC,EACrC,QAAsB;IAEtB,MAAM,QAAQ,GAAG,iBAAiB,EAAE,KAAK,CAAC;IAC1C,MAAM,QAAQ,GAAG,QAAQ,EAAE,KAAK,CAAC;IACjC,SAAS,cAAc,CACrB,GAAwC;QAExC,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAC3B,MAAM,QAAQ,GAA2B,EAAE,CAAC;QAC5C,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1D,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAChB,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACvC,CAAC;IACD,MAAM,aAAa,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IACvD,OAAO,EAAE,GAAG,aAAa,EAAE,GAAG,aAAa,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,yBAAyB,CAChC,QAAgB,EAChB,aAAqB,EACrB,OAA2C,EAC3C,aAAqB;IAErB,MAAM,iBAAiB,GAA2B;QAChD,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,cAAc;QACtB,GAAG,EAAE,WAAW;QAChB,IAAI,EAAE,YAAY;KACnB,CAAC;IAEF,MAAM,UAAU,GAA2B,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACpE,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACnD,KAAK,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC3E,IAAI,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,OAAO,CAAC,EAAE,CAAC;gBAC7D,OAAO,UAAU,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,KAAK,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/D,UAAU,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC;QACtC,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;SACxC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,GAAG,CAAC;SAC1C,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC;IAC/E,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,QAAQ,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC;IAEvF,OAAO;QACL,qBAAqB,QAAQ,8CAA8C;QAC3E,MAAM,aAAa,OAAO,MAAM,IAAI,QAAQ,GAAG,aAAa,KAAK;QACjE,OAAO;KACR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAC5B,KAAgB,EAChB,aAAqB,EACrB,iBAAgD,EAChD,QAAiC,EACjC,aAAqB;IAErB,IAAI,iBAAiB,EAAE,UAAU,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,cAAc,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;QAC5D,OAAO,yBAAyB,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,IAAI,aAAa,QAAQ,KAAK,CAAC,GAAG,SAAS,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,aAAa,KAAK,CAAC;AACtG,CAAC;AAED,SAAS,0BAA0B,CACjC,KAAgB,EAChB,eAAoE,EACpE,MAAM,GAAG,QAAQ,EACjB,MAAM,GAAsB,MAAM,EAClC,SAAS,GAAG,KAAK;IAEjB,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IAChE,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,OAAO;YACL,GAAG,MAAM,OAAO;YAChB,GAAG,MAAM,qBAAqB,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,KAAK,UAAU;YACjE,GAAG,MAAM,mCAAmC,KAAK,CAAC,GAAG,oCAAoC;YACzF,GAAG,MAAM,QAAQ;SAClB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QACzD,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,qBAAqB,CACnC,KAAK,EACL,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,iBAAiB,EACzB,OAAO,CAAC,QAAQ,EAChB,aAAa,CACd,CAAC;QACF,OAAO,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;QACnC,OAAO,iBAAiB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE,CAAC;QACrC,OAAO,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7E,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,qBAAqB,CACnC,KAAK,EACL,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,iBAAiB,EACzB,OAAO,CAAC,QAAQ,EAChB,aAAa,CACd,CAAC;QACF,OAAO,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,6EAA6E;IAC7E,gFAAgF;IAChF,IAAI,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,aAAa,GAAG,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,oBAAoB,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,oBAAoB,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAAmB,EACnB,eAAoE;IAEpE,IAAI,CAAC,eAAe;QAAE,OAAO,KAAK,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QACjF,IAAI,OAAO,CAAC,iBAAiB,EAAE,UAAU;YAAE,OAAO,IAAI,CAAC;QACvD,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,mBAAmB,CAAC,KAAK,CAAC,QAAQ,EAAE,eAAe,CAAC;YAAE,OAAO,IAAI,CAAC;QAChG,IAAI,KAAK,CAAC,SAAS,IAAI,mBAAmB,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,eAAe,CAAC;YAAE,OAAO,IAAI,CAAC;IAC9F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAmB;IACjD,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,UAAU,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,2BAA2B,CAClC,MAAmB,EACnB,UAA6D;IAE7D,IAAI,UAAU;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAmB,EAAE,UAAkB;IACxE,oFAAoF;IACpF,0EAA0E;IAC1E,MAAM,SAAS,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACrF,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7C,OAAO,mBAAmB,OAAO,sCAAsC,UAAU,UAAU,UAAU,2FAA2F,CAAC;IACnM,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAmB,EAAE,MAAqB;IAC9E,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,UAAU,CAAC;IAC/D,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IACzC,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC;IAC3E,MAAM,aAAa,GAAG,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,IAAI,IAAI,CAAC;IAEjD,MAAM,MAAM,GACV,MAAM,CAAC,eAAe,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAE7F,MAAM,gBAAgB,GAAG,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IACrF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS,gBAAgB,CAAC,CAAC;IAEtD,qEAAqE;IACrE,MAAM,eAAe,GAAG,uBAAuB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9D,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,mBAAmB,GACvB,MAAM,CAAC,eAAe,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC;QAC5C,CAAC,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,MAAM,IAAI;QAC/G,CAAC,CAAC,SAAS,CAAC;IAEhB,mCAAmC;IACnC,MAAM,gBAAgB,GAAG,SAAS;QAChC,CAAC,CAAC;YACE,kBAAkB,EAAE,KAAK,EAAE,wCAAwC;YACnE,UAAU,EAAE,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC;SACnE;QACH,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,MAAM,GAAG,aAAa,CAC1B,gBAAgB,EAChB,MAAM,CAAC,UAAU,EACjB,SAAS,EACT,MAAM,CAAC,IAAI,EACX,mBAAmB,EACnB,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,EACxD,gBAAgB,CACjB,CAAC;IAEF,0EAA0E;IAC1E,MAAM,aAAa,GAAG,SAAS,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC;IAC7D,MAAM,gBAAgB,GAAG,aAAa;QACpC,CAAC,CAAC,iCAAiC,MAAM,CAAC,aAAa,YAAY;QACnE,CAAC,CAAC,SAAS,CAAC;IAEd,iDAAiD;IACjD,MAAM,iBAAiB,GAAG,SAAS,CAAC,CAAC,CAAC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhG,MAAM,IAAI,GAAG,MAAM;SAChB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACb,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CACvF;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,UAAU,GAAG,WAAW;SAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,qBAAqB,OAAO,yBAAyB,UAAU,CAAC,OAAO,CAAC,mBAAmB,UAAU,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAC,GAAG,OAAO,CAAC;IAClM,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,gBAAgB,GAAa,CAAC,UAAU,CAAC,CAAC;IAChD,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,SAAS,IAAI,aAAa,EAAE,CAAC;QAC/B,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,kBAAkB,GAAG,KAAK,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IAEhE,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,UAAU,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC/D,UAAU,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,UAAU,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACxD,UAAU,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAExC,MAAM,cAAc,GAClB,MAAM,CAAC,IAAI,KAAK,WAAW;QACzB,CAAC,CAAC;YACE,qBAAqB;YACrB,8CAA8C;YAC9C,kDAAkD;YAClD,SAAS;YACT,EAAE;YACF,8CAA8C;YAC9C,qCAAqC;YACrC,EAAE;SACH;QACH,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,QAAQ,GACZ,MAAM,CAAC,IAAI,KAAK,WAAW;QACzB,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,aAAa;YACb,CAAC,CAAC,uDAAuD;YACzD,CAAC,CAAC,oDAAoD,CAAC;IAE7D,MAAM,QAAQ,GACZ,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,6CAA6C,CAAC,CAAC;IAErF,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,aAAa,CAAC,CAAC;IAEjE,MAAM,cAAc,GAAG,eAAe;QACpC,CAAC,CAAC;YACE,8BAA8B;YAC9B,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACzD,qBAAqB;SACtB;QACH,CAAC,CAAC,WAAW,CAAC;IAEhB,mDAAmD;IACnD,IAAI,YAAsB,CAAC;IAC3B,IAAI,SAAS,EAAE,CAAC;QACd,+EAA+E;QAC/E,+EAA+E;QAC/E,YAAY,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,mDAAmD;QACnD,YAAY;YACV,MAAM,KAAK,QAAQ;gBACjB,CAAC,CAAC,CAAC,oCAAoC,EAAE,6BAA6B,MAAM,CAAC,UAAU,IAAI,CAAC;gBAC5F,CAAC,CAAC;oBACE,sCAAsC,MAAM,CAAC,UAAU,IAAI;oBAC3D,oCAAoC;oBACpC,mIAAmI;iBACpI,CAAC;IACV,CAAC;IAED,6EAA6E;IAC7E,mFAAmF;IACnF,6DAA6D;IAC7D,MAAM,iBAAiB,GAAG,aAAa;QACrC,CAAC,CAAC;YACE,EAAE;YACF,mDAAmD;YACnD,gDAAgD;YAChD,4CAA4C;YAC5C,kDAAkD;YAClD,wCAAwC;YACxC,0CAA0C;YAC1C,0GAA0G;YAC1G,kBAAkB;YAClB,gFAAgF;YAChF,WAAW;YACX,SAAS;YACT,eAAe;YACf,OAAO;YACP,2BAA2B;YAC3B,MAAM;SACP;QACH,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;QACL,MAAM;QACN,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,EAAE;QACF,mBAAmB,MAAM,CAAC,aAAa,WAAW;QAClD,GAAG,UAAU;QACb,MAAM;QACN,GAAG,YAAY;QACf,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,yCAAyC;QACzC,2BAA2B;QAC3B,OAAO;QACP,WAAW,kBAAkB,UAAU;QACvC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,GAAG,cAAc;QACjB,GAAG,iBAAiB;QACpB,EAAE;QACF,YAAY;QACZ,GAAG,cAAc;QACjB,MAAM;QACN,GAAG;KACJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { generateFormComponent, resolveFieldMapping } from './generate.js';
|
|
2
|
+
export type { CodegenConfig } from './generate.js';
|
|
3
|
+
export { getFileHeader, renderField, registerPathExpr } from './templates.js';
|
|
4
|
+
export { generateSchemaLiteFile } from './schema-lite-codegen.js';
|
|
5
|
+
export { buildConfigSource } from './config-template.js';
|
|
6
|
+
export type { ConfigTemplateOptions } from './config-template.js';
|
|
7
|
+
export { getFieldTemplateSource, PRESET_TEMPLATE_IMPORTS } from './field-templates.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC3E,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// @zod-to-form/codegen — Browser-safe code generation for Zod v4 forms
|
|
2
|
+
// No Node.js dependencies. Usable in browser and server environments.
|
|
3
|
+
export { generateFormComponent, resolveFieldMapping } from './generate.js';
|
|
4
|
+
export { getFileHeader, renderField, registerPathExpr } from './templates.js';
|
|
5
|
+
export { generateSchemaLiteFile } from './schema-lite-codegen.js';
|
|
6
|
+
export { buildConfigSource } from './config-template.js';
|
|
7
|
+
export { getFieldTemplateSource, PRESET_TEMPLATE_IMPORTS } from './field-templates.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,sEAAsE;AAEtE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAG3E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzD,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SchemaLiteInfo } from '@zod-to-form/core';
|
|
2
|
+
/**
|
|
3
|
+
* Generate the content of a .lite.ts file that constructs a lite schema
|
|
4
|
+
* from the imported schema's check objects at runtime.
|
|
5
|
+
*
|
|
6
|
+
* Returns null if no schemaLite is needed (no top-level effects).
|
|
7
|
+
*/
|
|
8
|
+
export declare function generateSchemaLiteFile(schemaImportPath: string, exportName: string, info: SchemaLiteInfo): string | null;
|
|
9
|
+
//# sourceMappingURL=schema-lite-codegen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-lite-codegen.d.ts","sourceRoot":"","sources":["../src/schema-lite-codegen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA2ExD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,gBAAgB,EAAE,MAAM,EACxB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,cAAc,GACnB,MAAM,GAAG,IAAI,CAmEf"}
|