@formspec/cli 0.1.0-alpha.8 → 0.1.0-alpha.9

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 (55) hide show
  1. package/README.md +50 -37
  2. package/dist/__tests__/analyzer.test.d.ts +4 -1
  3. package/dist/__tests__/analyzer.test.d.ts.map +1 -1
  4. package/dist/__tests__/analyzer.test.js +5 -104
  5. package/dist/__tests__/analyzer.test.js.map +1 -1
  6. package/dist/__tests__/codegen.test.d.ts +4 -1
  7. package/dist/__tests__/codegen.test.d.ts.map +1 -1
  8. package/dist/__tests__/codegen.test.js +30 -484
  9. package/dist/__tests__/codegen.test.js.map +1 -1
  10. package/dist/__tests__/edge-cases.test.d.ts +5 -7
  11. package/dist/__tests__/edge-cases.test.d.ts.map +1 -1
  12. package/dist/__tests__/edge-cases.test.js +6 -373
  13. package/dist/__tests__/edge-cases.test.js.map +1 -1
  14. package/dist/__tests__/fixtures/edge-cases.d.ts.map +1 -1
  15. package/dist/__tests__/fixtures/edge-cases.js.map +1 -1
  16. package/dist/__tests__/integration.test.js +29 -18
  17. package/dist/__tests__/integration.test.js.map +1 -1
  18. package/dist/index.js +38 -18
  19. package/dist/index.js.map +1 -1
  20. package/dist/output/writer.d.ts +5 -5
  21. package/dist/output/writer.d.ts.map +1 -1
  22. package/dist/output/writer.js +13 -13
  23. package/dist/output/writer.js.map +1 -1
  24. package/dist/runtime/formspec-loader.d.ts.map +1 -1
  25. package/dist/runtime/formspec-loader.js +1 -3
  26. package/dist/runtime/formspec-loader.js.map +1 -1
  27. package/package.json +4 -4
  28. package/dist/analyzer/class-analyzer.d.ts +0 -75
  29. package/dist/analyzer/class-analyzer.d.ts.map +0 -1
  30. package/dist/analyzer/class-analyzer.js +0 -151
  31. package/dist/analyzer/class-analyzer.js.map +0 -1
  32. package/dist/analyzer/decorator-extractor.d.ts +0 -87
  33. package/dist/analyzer/decorator-extractor.d.ts.map +0 -1
  34. package/dist/analyzer/decorator-extractor.js +0 -193
  35. package/dist/analyzer/decorator-extractor.js.map +0 -1
  36. package/dist/analyzer/program.d.ts +0 -37
  37. package/dist/analyzer/program.d.ts.map +0 -1
  38. package/dist/analyzer/program.js +0 -89
  39. package/dist/analyzer/program.js.map +0 -1
  40. package/dist/analyzer/type-converter.d.ts +0 -97
  41. package/dist/analyzer/type-converter.d.ts.map +0 -1
  42. package/dist/analyzer/type-converter.js +0 -360
  43. package/dist/analyzer/type-converter.js.map +0 -1
  44. package/dist/codegen/index.d.ts +0 -76
  45. package/dist/codegen/index.d.ts.map +0 -1
  46. package/dist/codegen/index.js +0 -558
  47. package/dist/codegen/index.js.map +0 -1
  48. package/dist/generators/class-schema.d.ts +0 -43
  49. package/dist/generators/class-schema.d.ts.map +0 -1
  50. package/dist/generators/class-schema.js +0 -61
  51. package/dist/generators/class-schema.js.map +0 -1
  52. package/dist/generators/method-schema.d.ts +0 -57
  53. package/dist/generators/method-schema.d.ts.map +0 -1
  54. package/dist/generators/method-schema.js +0 -108
  55. package/dist/generators/method-schema.js.map +0 -1
@@ -1,558 +0,0 @@
1
- /**
2
- * Code generation for FormSpec type metadata.
3
- *
4
- * Generates a TypeScript file that patches decorated classes with
5
- * their extracted type metadata, enabling runtime schema generation
6
- * as an alternative to a TypeScript transformer.
7
- *
8
- * Usage:
9
- * formspec codegen ./src/forms.ts -o ./src/__formspec_types__.ts
10
- *
11
- * Then in your code:
12
- * import './__formspec_types__'; // Patches all decorated classes
13
- * import { UserForm } from './forms';
14
- * import { toFormSpec } from '@formspec/decorators';
15
- * const spec = toFormSpec(UserForm);
16
- */
17
- import * as ts from "typescript";
18
- import * as path from "path";
19
- import * as fs from "fs";
20
- /**
21
- * Finds all decorated classes in the given source files.
22
- */
23
- export function findDecoratedClasses(files, baseDir) {
24
- const program = ts.createProgram(files, {
25
- target: ts.ScriptTarget.ESNext,
26
- module: ts.ModuleKind.ESNext,
27
- moduleResolution: ts.ModuleResolutionKind.NodeNext,
28
- experimentalDecorators: true,
29
- strict: true,
30
- });
31
- const checker = program.getTypeChecker();
32
- const results = [];
33
- for (const sourceFile of program.getSourceFiles()) {
34
- if (sourceFile.isDeclarationFile)
35
- continue;
36
- if (!files.some((f) => path.resolve(f) === sourceFile.fileName))
37
- continue;
38
- ts.forEachChild(sourceFile, (node) => {
39
- if (ts.isClassDeclaration(node) && hasDecoratedProperties(node)) {
40
- const className = node.name?.text;
41
- if (!className)
42
- return;
43
- const typeMetadata = extractTypeMetadata(node, checker);
44
- const relativePath = path.relative(baseDir, sourceFile.fileName);
45
- const exported = isClassExported(node, sourceFile);
46
- results.push({
47
- name: className,
48
- sourcePath: relativePath.replace(/\.tsx?$/, ""),
49
- typeMetadata,
50
- isExported: exported,
51
- });
52
- }
53
- });
54
- }
55
- return results;
56
- }
57
- /**
58
- * Checks if a class has any decorated properties.
59
- */
60
- function hasDecoratedProperties(node) {
61
- return node.members.some((member) => {
62
- if (!ts.isPropertyDeclaration(member))
63
- return false;
64
- const decorators = ts.getDecorators(member);
65
- return decorators !== undefined && decorators.length > 0;
66
- });
67
- }
68
- /**
69
- * Checks if a class is exported from its source file.
70
- *
71
- * A class is considered exported if:
72
- * 1. It has the 'export' modifier directly (export class Foo {})
73
- * 2. It has 'export default' modifiers (export default class Foo {})
74
- * 3. It's referenced in a named export declaration (export { Foo })
75
- */
76
- function isClassExported(classNode, sourceFile) {
77
- const className = classNode.name?.text;
78
- if (!className)
79
- return false;
80
- // Check for direct export modifier (export class Foo or export default class Foo)
81
- const modifiers = ts.getModifiers(classNode);
82
- if (modifiers) {
83
- const hasExport = modifiers.some((mod) => mod.kind === ts.SyntaxKind.ExportKeyword);
84
- if (hasExport)
85
- return true;
86
- }
87
- // Check for named exports (export { Foo } or export { Foo as Bar })
88
- for (const statement of sourceFile.statements) {
89
- if (ts.isExportDeclaration(statement) && statement.exportClause) {
90
- if (ts.isNamedExports(statement.exportClause)) {
91
- for (const element of statement.exportClause.elements) {
92
- // Check if this export refers to our class
93
- // element.name is the exported name, element.propertyName is the local name (if renamed)
94
- const localName = element.propertyName?.text ?? element.name.text;
95
- if (localName === className) {
96
- return true;
97
- }
98
- }
99
- }
100
- }
101
- }
102
- return false;
103
- }
104
- /**
105
- * Extracts type metadata for all properties in a class.
106
- */
107
- function extractTypeMetadata(classNode, checker) {
108
- const metadata = {};
109
- for (const member of classNode.members) {
110
- if (!ts.isPropertyDeclaration(member))
111
- continue;
112
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Both checks needed: name can be undefined OR not an identifier
113
- if (!member.name || !ts.isIdentifier(member.name))
114
- continue;
115
- const symbol = checker.getSymbolAtLocation(member.name);
116
- // Skip properties without symbols - they don't have resolvable types
117
- if (!symbol)
118
- continue;
119
- const type = checker.getTypeOfSymbolAtLocation(symbol, member);
120
- const fieldName = member.name.text;
121
- const isOptional = !!(symbol.flags & ts.SymbolFlags.Optional);
122
- const typeInfo = convertTypeToMetadata(type, checker);
123
- if (isOptional) {
124
- typeInfo.optional = true;
125
- }
126
- metadata[fieldName] = typeInfo;
127
- }
128
- return metadata;
129
- }
130
- /**
131
- * Converts a TypeScript type to serializable metadata.
132
- */
133
- function convertTypeToMetadata(type, checker, visited = new Set()) {
134
- // Cycle detection for object types only
135
- const isObjectType = (type.flags & ts.TypeFlags.Object) !== 0;
136
- if (isObjectType) {
137
- if (visited.has(type)) {
138
- return { type: "unknown" };
139
- }
140
- visited.add(type);
141
- }
142
- // Handle union types
143
- if (type.isUnion()) {
144
- const types = type.types;
145
- const nonNullTypes = types.filter((t) => !(t.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined)));
146
- const hasNull = types.some((t) => t.flags & ts.TypeFlags.Null);
147
- // Boolean union (true | false)
148
- const isBooleanUnion = nonNullTypes.length === 2 &&
149
- nonNullTypes.every((t) => t.flags & ts.TypeFlags.BooleanLiteral);
150
- if (isBooleanUnion) {
151
- const result = { type: "boolean" };
152
- if (hasNull)
153
- result.nullable = true;
154
- return result;
155
- }
156
- // String literal union = enum
157
- const allStringLiterals = nonNullTypes.every((t) => t.isStringLiteral());
158
- if (allStringLiterals && nonNullTypes.length > 0) {
159
- const result = {
160
- type: "enum",
161
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion -- TypeScript doesn't narrow array types from `every` predicate
162
- values: nonNullTypes.map((t) => t.value),
163
- };
164
- if (hasNull)
165
- result.nullable = true;
166
- return result;
167
- }
168
- // Number literal union = enum
169
- const allNumberLiterals = nonNullTypes.every((t) => t.isNumberLiteral());
170
- if (allNumberLiterals && nonNullTypes.length > 0) {
171
- const result = {
172
- type: "enum",
173
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion -- TypeScript doesn't narrow array types from `every` predicate
174
- values: nonNullTypes.map((t) => t.value),
175
- };
176
- if (hasNull)
177
- result.nullable = true;
178
- return result;
179
- }
180
- // Nullable single type
181
- // Explicit undefined check needed for array element access
182
- if (nonNullTypes.length === 1) {
183
- const singleType = nonNullTypes[0];
184
- if (!singleType)
185
- return { type: "unknown" };
186
- const result = convertTypeToMetadata(singleType, checker, visited);
187
- if (hasNull)
188
- result.nullable = true;
189
- return result;
190
- }
191
- return { type: "unknown" };
192
- }
193
- // Primitives
194
- if (type.flags & ts.TypeFlags.String)
195
- return { type: "string" };
196
- if (type.flags & ts.TypeFlags.Number)
197
- return { type: "number" };
198
- if (type.flags & ts.TypeFlags.Boolean)
199
- return { type: "boolean" };
200
- // String literal
201
- if (type.isStringLiteral()) {
202
- return { type: "enum", values: [type.value] };
203
- }
204
- // Number literal
205
- if (type.isNumberLiteral()) {
206
- return { type: "enum", values: [type.value] };
207
- }
208
- // Arrays
209
- if (checker.isArrayType(type)) {
210
- const typeArgs = type.typeArguments;
211
- return {
212
- type: "array",
213
- itemType: typeArgs?.[0]
214
- ? convertTypeToMetadata(typeArgs[0], checker, visited)
215
- : { type: "unknown" },
216
- };
217
- }
218
- // Objects
219
- if (type.flags & ts.TypeFlags.Object) {
220
- const properties = {};
221
- for (const prop of type.getProperties()) {
222
- // Skip properties without declarations - undefined check needed because declarations array can be empty
223
- const declaration = prop.valueDeclaration ?? prop.declarations?.[0];
224
- if (!declaration)
225
- continue;
226
- const propType = checker.getTypeOfSymbolAtLocation(prop, declaration);
227
- const propOptional = !!(prop.flags & ts.SymbolFlags.Optional);
228
- const propMeta = convertTypeToMetadata(propType, checker, visited);
229
- if (propOptional)
230
- propMeta.optional = true;
231
- properties[prop.name] = propMeta;
232
- }
233
- if (Object.keys(properties).length > 0) {
234
- return { type: "object", properties };
235
- }
236
- return { type: "object" };
237
- }
238
- return { type: "unknown" };
239
- }
240
- /**
241
- * Generates the codegen output file content.
242
- */
243
- export function generateCodegenOutput(classes, outputPath, baseDir) {
244
- const outputDir = path.dirname(path.resolve(outputPath));
245
- const lines = [
246
- "/**",
247
- " * Auto-generated by FormSpec CLI.",
248
- " * DO NOT EDIT - changes will be overwritten.",
249
- " *",
250
- " * This file provides:",
251
- " * - Type metadata patches for runtime schema generation",
252
- " * - Inferred schema types (e.g., UserFormSchema)",
253
- " * - Type-safe FormSpec accessors (e.g., getUserFormFormSpec())",
254
- " *",
255
- " * Usage:",
256
- " * import { UserFormSchema, getUserFormFormSpec } from './__formspec_types__';",
257
- " *",
258
- " * const data: UserFormSchema = { name: 'Alice', country: 'us' };",
259
- " * const spec = getUserFormFormSpec();",
260
- " */",
261
- "",
262
- "/* eslint-disable @typescript-eslint/no-explicit-any */",
263
- "",
264
- ];
265
- // Generate imports
266
- lines.push(`import { toFormSpec } from "@formspec/decorators";`);
267
- for (const cls of classes) {
268
- // Compute absolute source path, then relative from output dir
269
- const absoluteSourcePath = path.resolve(baseDir, cls.sourcePath);
270
- const importPath = getRelativeImportPath(outputDir, absoluteSourcePath);
271
- lines.push(`import { ${cls.name} } from "${importPath}";`);
272
- }
273
- lines.push("");
274
- lines.push("// =============================================================================");
275
- lines.push("// Type Metadata Patches");
276
- lines.push("// =============================================================================");
277
- lines.push("");
278
- // Generate patches
279
- for (const cls of classes) {
280
- const metadataJson = JSON.stringify(cls.typeMetadata, null, 2)
281
- .split("\n")
282
- .map((line, i) => (i === 0 ? line : " " + line))
283
- .join("\n");
284
- lines.push(`(${cls.name} as any).__formspec_types__ = ${metadataJson};`);
285
- lines.push("");
286
- }
287
- lines.push("// =============================================================================");
288
- lines.push("// Inferred Schema Types");
289
- lines.push("// =============================================================================");
290
- lines.push("");
291
- // Generate schema types
292
- for (const cls of classes) {
293
- lines.push(generateSchemaType(cls));
294
- lines.push("");
295
- }
296
- lines.push("// =============================================================================");
297
- lines.push("// Type-Safe FormSpec Accessors");
298
- lines.push("// =============================================================================");
299
- lines.push("");
300
- // Generate typed accessors
301
- for (const cls of classes) {
302
- lines.push(generateTypedAccessor(cls));
303
- lines.push("");
304
- }
305
- return lines.join("\n");
306
- }
307
- /**
308
- * Converts TypeMetadata to a TypeScript type string.
309
- */
310
- function metadataToTypeString(metadata) {
311
- const baseType = metadataToBaseTypeString(metadata);
312
- // Handle nullable and optional modifiers
313
- if (metadata.nullable && metadata.optional) {
314
- return `${baseType} | null | undefined`;
315
- }
316
- if (metadata.nullable) {
317
- return `${baseType} | null`;
318
- }
319
- if (metadata.optional) {
320
- return `${baseType} | undefined`;
321
- }
322
- return baseType;
323
- }
324
- /**
325
- * Checks if a property key needs to be quoted in TypeScript object types.
326
- *
327
- * Property keys need quoting if they:
328
- * - Contain characters invalid in JavaScript identifiers (spaces, hyphens, etc.)
329
- * - Are reserved JavaScript/TypeScript keywords (class, function, etc.)
330
- *
331
- * @param key - The property name to check
332
- * @returns true if the key requires quotes, false otherwise
333
- */
334
- function needsPropertyQuoting(key) {
335
- // Valid JS identifier: starts with letter/underscore/$, followed by alphanumeric/_/$
336
- const validIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
337
- if (!validIdentifier.test(key)) {
338
- return true;
339
- }
340
- // Reserved words that need quoting (comprehensive list including ES6+)
341
- const reservedWords = new Set([
342
- // Keywords
343
- "break", "case", "catch", "continue", "debugger", "default", "delete",
344
- "do", "else", "finally", "for", "function", "if", "in", "instanceof",
345
- "new", "return", "switch", "this", "throw", "try", "typeof", "var",
346
- "void", "while", "with", "class", "const", "enum", "export", "extends",
347
- "import", "super", "implements", "interface", "let", "package", "private",
348
- "protected", "public", "static", "yield",
349
- // ES6+ keywords
350
- "async", "await",
351
- // Literal values (not technically keywords but best to quote)
352
- "null", "true", "false",
353
- // Accessor keywords
354
- "get", "set",
355
- // Strict mode reserved
356
- "arguments", "eval",
357
- ]);
358
- return reservedWords.has(key);
359
- }
360
- /**
361
- * Escapes a property key for safe use in TypeScript type definitions.
362
- *
363
- * Wraps keys in double quotes if they need quoting, using JSON.stringify
364
- * for robust escaping of special characters.
365
- *
366
- * @param key - The property name to escape
367
- * @returns The escaped key, quoted if necessary
368
- */
369
- function escapePropertyKey(key) {
370
- if (needsPropertyQuoting(key)) {
371
- return JSON.stringify(key);
372
- }
373
- return key;
374
- }
375
- /**
376
- * Converts TypeMetadata to base type string (without null/optional modifiers).
377
- */
378
- function metadataToBaseTypeString(metadata) {
379
- switch (metadata.type) {
380
- case "string":
381
- return "string";
382
- case "number":
383
- return "number";
384
- case "boolean":
385
- return "boolean";
386
- case "enum":
387
- if (metadata.values && metadata.values.length > 0) {
388
- return metadata.values
389
- .map((v) => (typeof v === "string" ? JSON.stringify(v) : String(v)))
390
- .join(" | ");
391
- }
392
- return "string";
393
- case "array":
394
- if (metadata.itemType) {
395
- const itemType = metadataToTypeString(metadata.itemType);
396
- // Wrap union types in parentheses for array
397
- if (itemType.includes("|")) {
398
- return `(${itemType})[]`;
399
- }
400
- return `${itemType}[]`;
401
- }
402
- return "unknown[]";
403
- case "object":
404
- if (metadata.properties && Object.keys(metadata.properties).length > 0) {
405
- const props = Object.entries(metadata.properties)
406
- .map(([key, propMeta]) => {
407
- const optional = propMeta.optional ? "?" : "";
408
- return `${escapePropertyKey(key)}${optional}: ${metadataToTypeString(propMeta)}`;
409
- })
410
- .join("; ");
411
- return `{ ${props} }`;
412
- }
413
- return "Record<string, unknown>";
414
- default:
415
- return "unknown";
416
- }
417
- }
418
- /**
419
- * Generates a TypeScript schema type for a class.
420
- */
421
- function generateSchemaType(cls) {
422
- const props = Object.entries(cls.typeMetadata)
423
- .map(([fieldName, metadata]) => {
424
- const optional = metadata.optional ? "?" : "";
425
- const typeStr = metadataToTypeString(metadata);
426
- return ` ${escapePropertyKey(fieldName)}${optional}: ${typeStr};`;
427
- })
428
- .join("\n");
429
- return `export type ${cls.name}Schema = {\n${props}\n};`;
430
- }
431
- /**
432
- * Maps TypeMetadata type strings to FormSpec field type strings.
433
- *
434
- * TypeMetadata uses generic type names (string, number), while FormSpec
435
- * uses more specific field type names (text, number, enum).
436
- *
437
- * @param type - The TypeMetadata type string
438
- * @returns The corresponding FormSpec field type
439
- */
440
- function metadataTypeToFieldType(type) {
441
- switch (type) {
442
- case "string":
443
- return "text";
444
- case "number":
445
- return "number";
446
- case "boolean":
447
- return "boolean";
448
- case "enum":
449
- return "enum";
450
- case "array":
451
- return "array";
452
- case "object":
453
- return "object";
454
- default:
455
- return "text";
456
- }
457
- }
458
- /**
459
- * Generates typed FormSpec accessor for a class.
460
- *
461
- * Creates three exports:
462
- * 1. Element tuple type (e.g., UserFormElements) - Exact readonly array type
463
- * representing each field with its literal types preserved
464
- * 2. FormSpec result type (e.g., UserFormFormSpec) - Type alias wrapping the elements
465
- * 3. Accessor function (e.g., getUserFormFormSpec()) - Returns FormSpec with full
466
- * type information for autocomplete and type checking
467
- *
468
- * These types enable the same level of type inference as the Chain DSL.
469
- *
470
- * @param cls - The decorated class information
471
- * @returns TypeScript code defining the accessor function and types
472
- */
473
- function generateTypedAccessor(cls) {
474
- const lines = [];
475
- // Generate the element type as a tuple
476
- const elementTypes = Object.entries(cls.typeMetadata).map(([fieldName, metadata]) => {
477
- const fieldType = metadataTypeToFieldType(metadata.type);
478
- const required = !metadata.optional;
479
- let elementType = `{ readonly _field: "${fieldType}"; readonly id: "${fieldName}"; readonly required: ${String(required)}`;
480
- // Add options for enum types
481
- if (metadata.type === "enum" && metadata.values) {
482
- const optionValues = metadata.values
483
- .map((v) => (typeof v === "string" ? JSON.stringify(v) : String(v)))
484
- .join(", ");
485
- elementType += `; readonly options: readonly [${optionValues}]`;
486
- }
487
- elementType += " }";
488
- return elementType;
489
- });
490
- // Export element tuple type
491
- lines.push(`export type ${cls.name}Elements = readonly [\n ${elementTypes.join(",\n ")}\n];`);
492
- lines.push("");
493
- // Export typed FormSpec result type
494
- lines.push(`export type ${cls.name}FormSpec = { readonly elements: ${cls.name}Elements };`);
495
- lines.push("");
496
- // Export typed accessor function
497
- lines.push(`/**`);
498
- lines.push(` * Type-safe FormSpec accessor for ${cls.name}.`);
499
- lines.push(` * Returns the same result as toFormSpec(${cls.name}) but with full type information.`);
500
- lines.push(` */`);
501
- lines.push(`export function get${cls.name}FormSpec(): ${cls.name}FormSpec {`);
502
- lines.push(` return toFormSpec(${cls.name}) as unknown as ${cls.name}FormSpec;`);
503
- lines.push(`}`);
504
- return lines.join("\n");
505
- }
506
- /**
507
- * Gets a relative import path from output to source.
508
- */
509
- function getRelativeImportPath(outputDir, sourcePath) {
510
- // sourcePath is already relative to baseDir
511
- let relativePath = path.relative(outputDir, sourcePath);
512
- // Ensure it starts with ./ or ../
513
- if (!relativePath.startsWith(".")) {
514
- relativePath = "./" + relativePath;
515
- }
516
- // Use forward slashes for imports
517
- relativePath = relativePath.replace(/\\/g, "/");
518
- // Add .js extension for ESM compatibility
519
- return relativePath + ".js";
520
- }
521
- /**
522
- * Runs the code generation.
523
- */
524
- export function runCodegen(options) {
525
- const baseDir = options.baseDir ?? path.dirname(options.output);
526
- const absoluteFiles = options.files.map((f) => path.resolve(f));
527
- console.log(`Scanning ${String(absoluteFiles.length)} file(s) for decorated classes...`);
528
- const classes = findDecoratedClasses(absoluteFiles, baseDir);
529
- if (classes.length === 0) {
530
- console.log("No decorated classes found.");
531
- return;
532
- }
533
- console.log(`Found ${String(classes.length)} decorated class(es):`);
534
- for (const cls of classes) {
535
- const fieldCount = Object.keys(cls.typeMetadata).length;
536
- console.log(` - ${cls.name} (${String(fieldCount)} field(s))`);
537
- }
538
- // Check for unexported classes and warn
539
- const unexported = classes.filter((cls) => !cls.isExported);
540
- if (unexported.length > 0) {
541
- console.warn(`\n⚠️ Warning: The following decorated classes are not exported from their source files:`);
542
- for (const cls of unexported) {
543
- console.warn(` - ${cls.name} (${cls.sourcePath})`);
544
- }
545
- console.warn(`\n The generated code will fail to compile because it cannot import these classes.`);
546
- console.warn(` To fix this, add 'export' to the class declaration, for example:`);
547
- console.warn(` export class YourClassName { ... }\n`);
548
- }
549
- const output = generateCodegenOutput(classes, options.output, baseDir);
550
- // Ensure output directory exists
551
- const outputDir = path.dirname(options.output);
552
- if (!fs.existsSync(outputDir)) {
553
- fs.mkdirSync(outputDir, { recursive: true });
554
- }
555
- fs.writeFileSync(options.output, output);
556
- console.log(`\nGenerated: ${options.output}`);
557
- }
558
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"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"}
@@ -1,43 +0,0 @@
1
- /**
2
- * Class schema generator.
3
- *
4
- * Generates JSON Schema and FormSpec/UI Schema from statically analyzed
5
- * class fields and decorators.
6
- */
7
- import type * as ts from "typescript";
8
- import type { ClassAnalysis, FieldInfo } from "../analyzer/class-analyzer.js";
9
- import { type JsonSchema, type FormSpecField } from "../analyzer/type-converter.js";
10
- /**
11
- * Generated schemas for a class.
12
- */
13
- export interface ClassSchemas {
14
- /** JSON Schema for validation */
15
- jsonSchema: JsonSchema;
16
- /** FormSpec/UI Schema for rendering */
17
- uxSpec: {
18
- elements: FormSpecField[];
19
- };
20
- }
21
- /**
22
- * Generates JSON Schema and FormSpec from a class analysis.
23
- *
24
- * Uses static type information and decorator metadata to build
25
- * complete schema definitions for a class's fields.
26
- *
27
- * @param analysis - The class analysis result
28
- * @param checker - TypeScript type checker
29
- * @returns Generated JSON Schema and FormSpec
30
- */
31
- export declare function generateClassSchemas(analysis: ClassAnalysis, checker: ts.TypeChecker): ClassSchemas;
32
- /**
33
- * Generates JSON Schema for a single field.
34
- *
35
- * Useful for generating schemas for method return types
36
- * or individual field extraction.
37
- *
38
- * @param field - The field information
39
- * @param checker - TypeScript type checker
40
- * @returns JSON Schema for the field's type
41
- */
42
- export declare function generateFieldSchema(field: FieldInfo, checker: ts.TypeChecker): JsonSchema;
43
- //# sourceMappingURL=class-schema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"class-schema.d.ts","sourceRoot":"","sources":["../../src/generators/class-schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,+BAA+B,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,UAAU,EAAE,UAAU,CAAC;IACvB,uCAAuC;IACvC,MAAM,EAAE;QACN,QAAQ,EAAE,aAAa,EAAE,CAAC;KAC3B,CAAC;CACH;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,EAAE,CAAC,WAAW,GACtB,YAAY,CAwCd;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,EAAE,CAAC,WAAW,GACtB,UAAU,CAGZ"}