@zod-to-form/cli 0.2.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/init.js ADDED
@@ -0,0 +1,458 @@
1
+ import { access, mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { DEFAULT_FIELD_TYPES } from '@zod-to-form/core';
4
+ import { resolveSchemaExportNames } from './loader.js';
5
+ function toPosixPath(value) {
6
+ return value.replace(/\\/g, '/');
7
+ }
8
+ async function exists(filePath) {
9
+ try {
10
+ await access(filePath);
11
+ return true;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ function logStep(step) {
18
+ console.log(step);
19
+ }
20
+ function logVerbose(verbose, message) {
21
+ if (verbose) {
22
+ console.log(` ${message}`);
23
+ }
24
+ }
25
+ function inferComponentModulePath(snapshot) {
26
+ if (snapshot.aliases['ui']) {
27
+ return `${snapshot.aliases['ui']}/zod-form-components`;
28
+ }
29
+ if (snapshot.aliases['components']) {
30
+ return `${snapshot.aliases['components']}/zod-form-components`;
31
+ }
32
+ return '@/components/zod-form-components';
33
+ }
34
+ function resolveComponentModulePath(options, snapshot) {
35
+ const explicit = options.components?.trim();
36
+ if (explicit) {
37
+ return explicit;
38
+ }
39
+ return inferComponentModulePath(snapshot);
40
+ }
41
+ function resolveAliasToLocalPath(cwd, aliasPath) {
42
+ if (aliasPath.startsWith('@/')) {
43
+ return path.join(cwd, 'src', aliasPath.slice(2));
44
+ }
45
+ if (aliasPath.startsWith('./') || aliasPath.startsWith('../')) {
46
+ return path.resolve(cwd, aliasPath);
47
+ }
48
+ return undefined;
49
+ }
50
+ function resolveModuleBasePath(cwd, modulePath, snapshot) {
51
+ if (modulePath.startsWith('./') || modulePath.startsWith('../')) {
52
+ return path.resolve(cwd, modulePath);
53
+ }
54
+ if (modulePath.startsWith('@/')) {
55
+ return path.join(cwd, 'src', modulePath.slice(2));
56
+ }
57
+ for (const aliasValue of Object.values(snapshot.aliases)) {
58
+ if (modulePath === aliasValue || modulePath.startsWith(`${aliasValue}/`)) {
59
+ const aliasLocal = resolveAliasToLocalPath(cwd, aliasValue);
60
+ if (!aliasLocal) {
61
+ continue;
62
+ }
63
+ const suffix = modulePath.slice(aliasValue.length).replace(/^\//, '');
64
+ return suffix.length > 0 ? path.join(aliasLocal, suffix) : aliasLocal;
65
+ }
66
+ }
67
+ return undefined;
68
+ }
69
+ function getCandidateFiles(basePath) {
70
+ return [
71
+ basePath,
72
+ `${basePath}.ts`,
73
+ `${basePath}.tsx`,
74
+ `${basePath}.js`,
75
+ `${basePath}.jsx`,
76
+ path.join(basePath, 'index.ts'),
77
+ path.join(basePath, 'index.tsx'),
78
+ path.join(basePath, 'index.js'),
79
+ path.join(basePath, 'index.jsx')
80
+ ];
81
+ }
82
+ function extractExportedNames(code) {
83
+ const names = new Set();
84
+ const declarationRegex = /export\s+(?:const|function|class|let|var)\s+([A-Za-z_$][A-Za-z0-9_$]*)/g;
85
+ const namedExportRegex = /export\s*\{([^}]+)\}/g;
86
+ let declarationMatch;
87
+ while ((declarationMatch = declarationRegex.exec(code)) !== null) {
88
+ names.add(declarationMatch[1]);
89
+ }
90
+ let namedExportMatch;
91
+ while ((namedExportMatch = namedExportRegex.exec(code)) !== null) {
92
+ const entries = namedExportMatch[1].split(',');
93
+ for (const entry of entries) {
94
+ const normalized = entry.trim();
95
+ if (!normalized) {
96
+ continue;
97
+ }
98
+ const aliasMatch = normalized.match(/^(\w+)\s+as\s+(\w+)$/);
99
+ if (aliasMatch) {
100
+ names.add(aliasMatch[2]);
101
+ continue;
102
+ }
103
+ names.add(normalized);
104
+ }
105
+ }
106
+ return names;
107
+ }
108
+ async function discoverFormPrimitives(cwd, modulePath, snapshot, verbose) {
109
+ const defaults = {
110
+ field: 'Field',
111
+ label: 'FieldLabel',
112
+ control: 'FieldControl'
113
+ };
114
+ const candidateModules = [modulePath];
115
+ if (snapshot.aliases['ui']) {
116
+ candidateModules.push(`${snapshot.aliases['ui']}/field`);
117
+ }
118
+ const exportedNames = new Set();
119
+ const sourceByExport = new Map();
120
+ for (const candidateModule of candidateModules) {
121
+ const basePath = resolveModuleBasePath(cwd, candidateModule, snapshot);
122
+ if (!basePath) {
123
+ continue;
124
+ }
125
+ for (const filePath of getCandidateFiles(basePath)) {
126
+ if (!(await exists(filePath))) {
127
+ continue;
128
+ }
129
+ try {
130
+ const code = await readFile(filePath, 'utf8');
131
+ const fileExports = extractExportedNames(code);
132
+ for (const name of fileExports) {
133
+ exportedNames.add(name);
134
+ if (!sourceByExport.has(name)) {
135
+ sourceByExport.set(name, toPosixPath(path.relative(cwd, filePath)));
136
+ }
137
+ }
138
+ logVerbose(verbose, `scanned exports from ${toPosixPath(path.relative(cwd, filePath))}`);
139
+ }
140
+ catch {
141
+ // ignore unreadable candidates and continue with defaults/other candidates
142
+ }
143
+ }
144
+ }
145
+ const field = exportedNames.has('Field')
146
+ ? 'Field'
147
+ : exportedNames.has('FormField')
148
+ ? 'FormField'
149
+ : defaults.field;
150
+ const label = exportedNames.has('FieldLabel')
151
+ ? 'FieldLabel'
152
+ : exportedNames.has('FormLabel')
153
+ ? 'FormLabel'
154
+ : exportedNames.has('Label')
155
+ ? 'Label'
156
+ : defaults.label;
157
+ const control = exportedNames.has('FieldControl')
158
+ ? 'FieldControl'
159
+ : exportedNames.has('FormControl')
160
+ ? 'FormControl'
161
+ : defaults.control;
162
+ const sources = Array.from(new Set([
163
+ sourceByExport.get(field),
164
+ sourceByExport.get(label),
165
+ sourceByExport.get(control)
166
+ ]).values()).filter((value) => typeof value === 'string');
167
+ return {
168
+ primitives: { field, label, control },
169
+ sources
170
+ };
171
+ }
172
+ const EXCLUDED_EXPORT_PREFIXES = ['use', 'create', 'with', 'get', 'set', 'is', 'has'];
173
+ function isPascalCase(name) {
174
+ return /^[A-Z][a-zA-Z0-9]*$/.test(name);
175
+ }
176
+ async function discoverComponents(cwd, modulePath, snapshot, formPrimitives, verbose) {
177
+ const basePath = resolveModuleBasePath(cwd, modulePath, snapshot);
178
+ if (!basePath) {
179
+ logVerbose(verbose, `could not resolve components path: ${modulePath}`);
180
+ return { names: [] };
181
+ }
182
+ const primitiveNames = new Set([
183
+ formPrimitives.field,
184
+ formPrimitives.label,
185
+ formPrimitives.control
186
+ ]);
187
+ const allNames = new Set();
188
+ let source;
189
+ for (const filePath of getCandidateFiles(basePath)) {
190
+ if (!(await exists(filePath))) {
191
+ continue;
192
+ }
193
+ try {
194
+ const code = await readFile(filePath, 'utf8');
195
+ const fileExports = extractExportedNames(code);
196
+ for (const name of fileExports) {
197
+ if (isPascalCase(name) &&
198
+ !primitiveNames.has(name) &&
199
+ !EXCLUDED_EXPORT_PREFIXES.some((prefix) => name.startsWith(prefix))) {
200
+ allNames.add(name);
201
+ }
202
+ }
203
+ if (!source && fileExports.size > 0) {
204
+ source = toPosixPath(path.relative(cwd, filePath));
205
+ }
206
+ logVerbose(verbose, `scanned component exports from ${toPosixPath(path.relative(cwd, filePath))}`);
207
+ }
208
+ catch {
209
+ // ignore unreadable files
210
+ }
211
+ }
212
+ return {
213
+ names: Array.from(allNames).sort(),
214
+ source
215
+ };
216
+ }
217
+ const SCHEMA_CANDIDATE_PATHS = [
218
+ 'src/schemas/index',
219
+ 'src/schemas',
220
+ 'src/lib/schemas',
221
+ 'schemas/index',
222
+ 'schemas'
223
+ ];
224
+ async function discoverSchemas(cwd, explicitPath, verbose) {
225
+ if (explicitPath) {
226
+ const resolved = path.resolve(cwd, explicitPath);
227
+ try {
228
+ const exports = await resolveSchemaExportNames(resolved);
229
+ logVerbose(verbose, `found ${String(exports.length)} schemas in ${explicitPath}`);
230
+ return { exports, schemaPath: toPosixPath(path.relative(cwd, resolved)) };
231
+ }
232
+ catch {
233
+ logVerbose(verbose, `could not load schemas from ${explicitPath}`);
234
+ return { exports: [] };
235
+ }
236
+ }
237
+ for (const candidateBase of SCHEMA_CANDIDATE_PATHS) {
238
+ for (const filePath of getCandidateFiles(path.resolve(cwd, candidateBase))) {
239
+ if (!(await exists(filePath))) {
240
+ continue;
241
+ }
242
+ try {
243
+ const exports = await resolveSchemaExportNames(filePath);
244
+ if (exports.length > 0) {
245
+ const relativePath = toPosixPath(path.relative(cwd, filePath));
246
+ logVerbose(verbose, `found ${String(exports.length)} schemas in ${relativePath}`);
247
+ return { exports, schemaPath: relativePath };
248
+ }
249
+ }
250
+ catch {
251
+ // ignore unloadable candidates
252
+ }
253
+ }
254
+ }
255
+ logVerbose(verbose, 'no schema files discovered');
256
+ return { exports: [] };
257
+ }
258
+ const PRESET_IMPORT_NAME = {
259
+ shadcn: 'SHADCN_FIELD_TYPES',
260
+ unstyled: 'DEFAULT_FIELD_TYPES'
261
+ };
262
+ function resolveFieldTypeNames(discoveredComponents, preset) {
263
+ if (preset) {
264
+ // When a preset is active, only return discovered (non-preset) components.
265
+ // The preset entries come via the spread in the template.
266
+ return discoveredComponents.names;
267
+ }
268
+ // No preset: merge default entries with any discovered components as fallback
269
+ const presetNames = Object.keys(DEFAULT_FIELD_TYPES);
270
+ if (discoveredComponents.names.length > 0) {
271
+ const merged = new Set([...presetNames, ...discoveredComponents.names]);
272
+ return Array.from(merged).sort();
273
+ }
274
+ return presetNames;
275
+ }
276
+ function buildConfigTemplate(modulePath, formPrimitives, fieldTypeNames, discoveredSchemas, preset) {
277
+ const presetImportName = preset ? PRESET_IMPORT_NAME[preset] : undefined;
278
+ // Build import line
279
+ const importNames = ['defineConfig'];
280
+ if (presetImportName) {
281
+ importNames.push(presetImportName);
282
+ }
283
+ // Build fieldTypes entries
284
+ const fieldTypeLines = [];
285
+ if (presetImportName) {
286
+ const comma = fieldTypeNames.length > 0 ? ',' : '';
287
+ fieldTypeLines.push(` ...${presetImportName}${comma}`);
288
+ }
289
+ fieldTypeNames.forEach((name, i) => {
290
+ const comma = i < fieldTypeNames.length - 1 ? ',' : '';
291
+ fieldTypeLines.push(` ${name}: { component: '${name}' }${comma}`);
292
+ });
293
+ const lines = [
294
+ `import { ${importNames.join(', ')} } from '@zod-to-form/core';`,
295
+ ``,
296
+ `export default defineConfig({`,
297
+ ` components: '${modulePath}',`
298
+ ];
299
+ if (preset) {
300
+ lines.push(` preset: '${preset}',`);
301
+ }
302
+ lines.push(` formPrimitives: {`, ` field: '${formPrimitives.field}',`, ` label: '${formPrimitives.label}',`, ` control: '${formPrimitives.control}'`, ` },`, ` defaults: {`, ` mode: 'submit',`, ` ui: 'shadcn',`, ` overwrite: false,`, ` serverAction: false`, ` },`, ` include: [],`, ` exclude: [],`, ` fieldTypes: {`, ...fieldTypeLines, ` }`);
303
+ if (discoveredSchemas.exports.length > 0) {
304
+ lines[lines.length - 1] += ',';
305
+ lines.push(` schemas: {`);
306
+ for (let i = 0; i < discoveredSchemas.exports.length; i++) {
307
+ const name = discoveredSchemas.exports[i];
308
+ const comma = i < discoveredSchemas.exports.length - 1 ? ',' : '';
309
+ lines.push(` ${name}: {}${comma}`);
310
+ }
311
+ lines.push(` }`);
312
+ }
313
+ lines.push(`});`);
314
+ lines.push(``);
315
+ return lines.join('\n');
316
+ }
317
+ async function detectShadcnConfig(cwd) {
318
+ const componentsPath = path.join(cwd, 'components.json');
319
+ if (!(await exists(componentsPath))) {
320
+ return {
321
+ exists: false,
322
+ aliases: {}
323
+ };
324
+ }
325
+ try {
326
+ const content = await readFile(componentsPath, 'utf8');
327
+ const parsed = JSON.parse(content);
328
+ const aliases = parsed['aliases'] &&
329
+ typeof parsed['aliases'] === 'object' &&
330
+ !Array.isArray(parsed['aliases'])
331
+ ? parsed['aliases']
332
+ : {};
333
+ const stringAliases = Object.fromEntries(Object.entries(aliases)
334
+ .filter(([, value]) => typeof value === 'string')
335
+ .map(([key, value]) => [key, value]));
336
+ return {
337
+ exists: true,
338
+ aliases: stringAliases,
339
+ style: typeof parsed['style'] === 'string' ? parsed['style'] : undefined,
340
+ sourcePath: componentsPath
341
+ };
342
+ }
343
+ catch {
344
+ return {
345
+ exists: false,
346
+ aliases: {}
347
+ };
348
+ }
349
+ }
350
+ function resolveOutputPath(cwd, out) {
351
+ if (!out) {
352
+ return path.join(cwd, 'z2f.config.ts');
353
+ }
354
+ const absolute = path.resolve(cwd, out);
355
+ if (absolute.endsWith('.ts')) {
356
+ return absolute;
357
+ }
358
+ return path.join(absolute, 'z2f.config.ts');
359
+ }
360
+ export async function runInit(options) {
361
+ const cwd = process.cwd();
362
+ const verbose = options.verbose ?? false;
363
+ const outputPath = resolveOutputPath(cwd, options.out);
364
+ logStep('[1/5] Detecting project configuration');
365
+ const shadcn = await detectShadcnConfig(cwd);
366
+ logVerbose(verbose, `shadcn components.json found: ${String(shadcn.exists)}`);
367
+ if (shadcn.sourcePath) {
368
+ logVerbose(verbose, `source: ${toPosixPath(path.relative(cwd, shadcn.sourcePath))}`);
369
+ }
370
+ if (Object.keys(shadcn.aliases).length > 0) {
371
+ logVerbose(verbose, `aliases: ${JSON.stringify(shadcn.aliases)}`);
372
+ }
373
+ logStep('[2/5] Discovering components');
374
+ const modulePath = resolveComponentModulePath(options, shadcn);
375
+ const discoveredPrimitives = await discoverFormPrimitives(cwd, modulePath, shadcn, verbose);
376
+ const discoveredComponents = await discoverComponents(cwd, modulePath, shadcn, discoveredPrimitives.primitives, verbose);
377
+ logVerbose(verbose, `components import path: ${modulePath}`);
378
+ logVerbose(verbose, `formPrimitives: ${JSON.stringify(discoveredPrimitives.primitives)}`);
379
+ if (discoveredPrimitives.sources.length > 0) {
380
+ logVerbose(verbose, `formPrimitives source: ${discoveredPrimitives.sources.join(', ')}`);
381
+ }
382
+ else {
383
+ logVerbose(verbose, `formPrimitives source: defaults`);
384
+ }
385
+ // Styled autodiscovery output
386
+ const p = discoveredPrimitives.primitives;
387
+ console.log('\nDetected components:');
388
+ console.log(` \u2713 Field \u2192 ${p.field}`);
389
+ console.log(` \u2713 Label \u2192 ${p.label}`);
390
+ console.log(` \u2713 Control \u2192 ${p.control}`);
391
+ if (discoveredComponents.names.length > 0) {
392
+ console.log('\nDiscovered field types:');
393
+ for (const name of discoveredComponents.names) {
394
+ console.log(` \u2713 ${name}`);
395
+ }
396
+ }
397
+ else {
398
+ console.log('\nUsing default field types (no components discovered)');
399
+ }
400
+ console.log(`\nUsing components from: ${modulePath}`);
401
+ logStep('[3/5] Discovering schemas');
402
+ const discoveredSchemas = await discoverSchemas(cwd, options.schemas, verbose);
403
+ if (discoveredSchemas.exports.length > 0) {
404
+ console.log('\nDiscovered schemas:');
405
+ for (const name of discoveredSchemas.exports) {
406
+ console.log(` \u2713 ${name}`);
407
+ }
408
+ if (discoveredSchemas.schemaPath) {
409
+ console.log(`Using schemas from: ${discoveredSchemas.schemaPath}`);
410
+ }
411
+ }
412
+ else {
413
+ console.log('\nNo schemas discovered (use --schemas <path> to specify)');
414
+ }
415
+ logStep('[4/5] Building config template');
416
+ const preset = shadcn.exists ? 'shadcn' : undefined;
417
+ const fieldTypeNames = resolveFieldTypeNames(discoveredComponents, preset);
418
+ const code = buildConfigTemplate(modulePath, discoveredPrimitives.primitives, fieldTypeNames, discoveredSchemas, preset);
419
+ logStep('[5/5] Validating output target');
420
+ const outputExists = await exists(outputPath);
421
+ if (outputExists && !options.force) {
422
+ const summary = `Skipped: ${toPosixPath(path.relative(cwd, outputPath))} already exists (use --force to overwrite).`;
423
+ console.log(`[summary] ${summary}`);
424
+ return {
425
+ outputPath,
426
+ code,
427
+ wroteFile: false,
428
+ usedShadcnDefaults: shadcn.exists,
429
+ summary
430
+ };
431
+ }
432
+ if (options.dryRun) {
433
+ logStep('Dry run (no files written)');
434
+ process.stdout.write(code);
435
+ const summary = `Dry run complete for ${toPosixPath(path.relative(cwd, outputPath))}.`;
436
+ console.log(`\n[summary] ${summary}`);
437
+ return {
438
+ outputPath,
439
+ code,
440
+ wroteFile: false,
441
+ usedShadcnDefaults: shadcn.exists,
442
+ summary
443
+ };
444
+ }
445
+ logStep('Writing component config');
446
+ await mkdir(path.dirname(outputPath), { recursive: true });
447
+ await writeFile(outputPath, code, 'utf8');
448
+ const summary = `Wrote ${toPosixPath(path.relative(cwd, outputPath))}${shadcn.exists ? ' using shadcn defaults.' : ' using baseline defaults.'}`;
449
+ console.log(`[summary] ${summary}`);
450
+ return {
451
+ outputPath,
452
+ code,
453
+ wroteFile: true,
454
+ usedShadcnDefaults: shadcn.exists,
455
+ summary
456
+ };
457
+ }
458
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
package/dist/loader.d.ts CHANGED
@@ -1,4 +1,13 @@
1
- import type { ZodToFormComponentConfig } from './index.js';
1
+ import { type ZodFormsConfig } from '@zod-to-form/core';
2
2
  export declare function loadSchema(schemaPath: string, exportName: string): Promise<unknown>;
3
- export declare function loadComponentConfig(configPath: string): Promise<ZodToFormComponentConfig<Record<string, unknown>>>;
3
+ export declare function resolveSchemaExportNames(schemaPath: string): Promise<string[]>;
4
+ export declare function loadConfig(configPath: string): Promise<ZodFormsConfig<Record<string, unknown>>>;
5
+ /** @deprecated Use loadConfig instead */
6
+ export declare const loadComponentConfig: typeof loadConfig;
7
+ export declare function resolveDefaultConfigPath(cwd: string): Promise<string | undefined>;
8
+ /** @deprecated Use resolveDefaultConfigPath instead */
9
+ export declare const resolveDefaultComponentConfigPath: typeof resolveDefaultConfigPath;
10
+ export declare function loadDefaultConfig(cwd: string): Promise<ZodFormsConfig<Record<string, unknown>> | undefined>;
11
+ /** @deprecated Use loadDefaultConfig instead */
12
+ export declare const loadDefaultComponentConfig: typeof loadDefaultConfig;
4
13
  //# sourceMappingURL=loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAwF3D,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BzF;AAED,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,wBAAwB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAiB5D"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAwB3B,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BzF;AAED,wBAAsB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuBpF;AAED,wBAAsB,UAAU,CAC9B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAkBlD;AAED,yCAAyC;AACzC,eAAO,MAAM,mBAAmB,mBAAa,CAAC;AAW9C,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAiBvF;AAED,uDAAuD;AACvD,eAAO,MAAM,iCAAiC,iCAA2B,CAAC;AAE1E,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAO9D;AAED,gDAAgD;AAChD,eAAO,MAAM,0BAA0B,0BAAoB,CAAC"}
package/dist/loader.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import path from 'node:path';
2
+ import { access } from 'node:fs/promises';
2
3
  import { createRequire } from 'node:module';
3
4
  import { createJiti } from 'jiti';
5
+ import { validateConfig, normalizeConfig } from '@zod-to-form/core';
4
6
  const requireFromHere = createRequire(import.meta.url);
5
7
  function resolveZodModulePath() {
6
8
  return requireFromHere.resolve('zod');
@@ -11,55 +13,6 @@ function isZodSchema(value) {
11
13
  }
12
14
  return '_zod' in value;
13
15
  }
14
- function isObjectRecord(value) {
15
- return !!value && typeof value === 'object' && !Array.isArray(value);
16
- }
17
- function validateComponentConfig(value, source = 'component-config') {
18
- if (!isObjectRecord(value)) {
19
- throw new Error(`${source} must be an object.`);
20
- }
21
- const components = value['components'];
22
- if (typeof components !== 'string' || components.trim().length === 0) {
23
- throw new Error(`${source}.components must be a non-empty string.`);
24
- }
25
- const fieldTypes = value['fieldTypes'];
26
- if (!isObjectRecord(fieldTypes)) {
27
- throw new Error(`${source}.fieldTypes must be an object.`);
28
- }
29
- for (const [fieldType, entryValue] of Object.entries(fieldTypes)) {
30
- if (!isObjectRecord(entryValue)) {
31
- throw new Error(`${source}.fieldTypes.${fieldType} must be an object.`);
32
- }
33
- const component = entryValue['component'];
34
- if (typeof component !== 'string' || component.trim().length === 0) {
35
- throw new Error(`${source}.fieldTypes.${fieldType}.component must be a non-empty string.`);
36
- }
37
- const render = entryValue['render'];
38
- if (render !== undefined && typeof render !== 'function') {
39
- throw new Error(`${source}.fieldTypes.${fieldType}.render must be a function when provided.`);
40
- }
41
- }
42
- const fields = value['fields'];
43
- if (fields !== undefined) {
44
- if (!isObjectRecord(fields)) {
45
- throw new Error(`${source}.fields must be an object when provided.`);
46
- }
47
- for (const [fieldPath, overrideValue] of Object.entries(fields)) {
48
- if (!isObjectRecord(overrideValue)) {
49
- throw new Error(`${source}.fields.${fieldPath} must be an object.`);
50
- }
51
- const fieldType = overrideValue['fieldType'];
52
- if (typeof fieldType !== 'string' || fieldType.trim().length === 0) {
53
- throw new Error(`${source}.fields.${fieldPath}.fieldType must be a non-empty string.`);
54
- }
55
- const props = overrideValue['props'];
56
- if (props !== undefined && !isObjectRecord(props)) {
57
- throw new Error(`${source}.fields.${fieldPath}.props must be an object when provided.`);
58
- }
59
- }
60
- }
61
- return value;
62
- }
63
16
  function getDefaultExport(moduleExports) {
64
17
  if ('default' in moduleExports) {
65
18
  return moduleExports['default'];
@@ -93,7 +46,30 @@ export async function loadSchema(schemaPath, exportName) {
93
46
  }
94
47
  return candidate;
95
48
  }
96
- export async function loadComponentConfig(configPath) {
49
+ export async function resolveSchemaExportNames(schemaPath) {
50
+ const absolutePath = path.resolve(schemaPath);
51
+ const jiti = createJiti(import.meta.url, {
52
+ moduleCache: false,
53
+ interopDefault: true,
54
+ alias: {
55
+ zod: resolveZodModulePath()
56
+ },
57
+ nativeModules: ['zod']
58
+ });
59
+ let moduleExports;
60
+ try {
61
+ moduleExports = await jiti.import(absolutePath);
62
+ }
63
+ catch (error) {
64
+ const message = error instanceof Error ? error.message : String(error);
65
+ throw new Error(`Unable to load schema file "${absolutePath}": ${message}`);
66
+ }
67
+ return Object.entries(moduleExports)
68
+ .filter(([, candidate]) => isZodSchema(candidate))
69
+ .map(([name]) => name)
70
+ .sort();
71
+ }
72
+ export async function loadConfig(configPath) {
97
73
  const absolutePath = path.resolve(configPath);
98
74
  const jiti = createJiti(import.meta.url, {
99
75
  moduleCache: false,
@@ -108,6 +84,45 @@ export async function loadComponentConfig(configPath) {
108
84
  throw new Error(`Unable to load component config file "${absolutePath}": ${message}`);
109
85
  }
110
86
  const configValue = getDefaultExport(moduleExports);
111
- return validateComponentConfig(configValue, `component-config (${absolutePath})`);
87
+ const validated = validateConfig(configValue, `component-config (${absolutePath})`);
88
+ return normalizeConfig(validated);
89
+ }
90
+ /** @deprecated Use loadConfig instead */
91
+ export const loadComponentConfig = loadConfig;
92
+ async function fileExists(filePath) {
93
+ try {
94
+ await access(filePath);
95
+ return true;
96
+ }
97
+ catch {
98
+ return false;
99
+ }
100
+ }
101
+ export async function resolveDefaultConfigPath(cwd) {
102
+ const candidates = [
103
+ 'z2f.config.ts',
104
+ 'component-config.ts',
105
+ 'z2f.config.js',
106
+ 'component-config.js',
107
+ 'z2f.config.json',
108
+ 'component-config.json'
109
+ ].map((candidate) => path.resolve(cwd, candidate));
110
+ for (const candidate of candidates) {
111
+ if (await fileExists(candidate)) {
112
+ return candidate;
113
+ }
114
+ }
115
+ return undefined;
116
+ }
117
+ /** @deprecated Use resolveDefaultConfigPath instead */
118
+ export const resolveDefaultComponentConfigPath = resolveDefaultConfigPath;
119
+ export async function loadDefaultConfig(cwd) {
120
+ const defaultPath = await resolveDefaultConfigPath(cwd);
121
+ if (!defaultPath) {
122
+ return undefined;
123
+ }
124
+ return loadConfig(defaultPath);
112
125
  }
126
+ /** @deprecated Use loadDefaultConfig instead */
127
+ export const loadDefaultComponentConfig = loadDefaultConfig;
113
128
  //# sourceMappingURL=loader.js.map