@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,360 +0,0 @@
1
- /**
2
- * Type converter for transforming TypeScript types to JSON Schema and FormSpec.
3
- *
4
- * Converts TypeScript types (extracted via type checker) to:
5
- * - JSON Schema definitions
6
- * - FormSpec field definitions
7
- */
8
- import * as ts from "typescript";
9
- /**
10
- * Converts a TypeScript type to JSON Schema and FormSpec field type.
11
- *
12
- * @param type - The TypeScript type to convert
13
- * @param checker - TypeScript type checker
14
- * @returns Conversion result with JSON Schema and FormSpec type
15
- */
16
- export function convertType(type, checker) {
17
- // Handle primitive types
18
- if (type.flags & ts.TypeFlags.String) {
19
- return { jsonSchema: { type: "string" }, formSpecFieldType: "text" };
20
- }
21
- if (type.flags & ts.TypeFlags.Number) {
22
- return { jsonSchema: { type: "number" }, formSpecFieldType: "number" };
23
- }
24
- if (type.flags & ts.TypeFlags.Boolean) {
25
- return { jsonSchema: { type: "boolean" }, formSpecFieldType: "boolean" };
26
- }
27
- if (type.flags & ts.TypeFlags.Null) {
28
- return { jsonSchema: { type: "null" }, formSpecFieldType: "null" };
29
- }
30
- if (type.flags & ts.TypeFlags.Undefined) {
31
- return { jsonSchema: {}, formSpecFieldType: "undefined" };
32
- }
33
- // Handle literal types
34
- if (type.isStringLiteral()) {
35
- return {
36
- jsonSchema: { const: type.value },
37
- formSpecFieldType: "enum",
38
- };
39
- }
40
- if (type.isNumberLiteral()) {
41
- return {
42
- jsonSchema: { const: type.value },
43
- formSpecFieldType: "number",
44
- };
45
- }
46
- // Handle union types (including string literal unions for enums)
47
- if (type.isUnion()) {
48
- return convertUnionType(type, checker);
49
- }
50
- // Handle array types
51
- if (checker.isArrayType(type)) {
52
- return convertArrayType(type, checker);
53
- }
54
- // Handle object types
55
- if (type.flags & ts.TypeFlags.Object) {
56
- return convertObjectType(type, checker);
57
- }
58
- // Fallback
59
- return { jsonSchema: {}, formSpecFieldType: "unknown" };
60
- }
61
- /**
62
- * Converts a union type to JSON Schema.
63
- */
64
- function convertUnionType(type, checker) {
65
- const types = type.types;
66
- // Filter out null and undefined for analysis
67
- // Note: undefined is filtered out since JSON Schema doesn't have an undefined type
68
- // Optional fields are handled via the 'required' array, not the type
69
- const nonNullTypes = types.filter((t) => !(t.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined)));
70
- const hasNull = types.some((t) => t.flags & ts.TypeFlags.Null);
71
- // Check if this is a boolean type (true | false in TypeScript)
72
- // TypeScript represents `boolean` as a union of `true | false` literal types
73
- const isBooleanUnion = nonNullTypes.length === 2 &&
74
- nonNullTypes.every((t) => t.flags & ts.TypeFlags.BooleanLiteral);
75
- if (isBooleanUnion) {
76
- const result = {
77
- jsonSchema: { type: "boolean" },
78
- formSpecFieldType: "boolean",
79
- };
80
- if (hasNull) {
81
- result.jsonSchema = { oneOf: [{ type: "boolean" }, { type: "null" }] };
82
- }
83
- return result;
84
- }
85
- // Check if all types are string literals (enum pattern)
86
- const allStringLiterals = nonNullTypes.every((t) => t.isStringLiteral());
87
- if (allStringLiterals && nonNullTypes.length > 0) {
88
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion -- TypeScript doesn't narrow array types from `every` predicate
89
- const enumValues = nonNullTypes.map((t) => t.value);
90
- const result = {
91
- jsonSchema: { enum: enumValues },
92
- formSpecFieldType: "enum",
93
- };
94
- if (hasNull) {
95
- result.jsonSchema = { oneOf: [{ enum: enumValues }, { type: "null" }] };
96
- }
97
- return result;
98
- }
99
- // Check if all types are number literals
100
- const allNumberLiterals = nonNullTypes.every((t) => t.isNumberLiteral());
101
- if (allNumberLiterals && nonNullTypes.length > 0) {
102
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion -- TypeScript doesn't narrow array types from `every` predicate
103
- const enumValues = nonNullTypes.map((t) => t.value);
104
- const result = {
105
- jsonSchema: { enum: enumValues },
106
- formSpecFieldType: "enum",
107
- };
108
- if (hasNull) {
109
- result.jsonSchema = { oneOf: [{ enum: enumValues }, { type: "null" }] };
110
- }
111
- return result;
112
- }
113
- // Handle nullable types (T | null or T | undefined) with single non-null type
114
- if (nonNullTypes.length === 1 && nonNullTypes[0]) {
115
- const result = convertType(nonNullTypes[0], checker);
116
- // Make it nullable in JSON Schema
117
- if (hasNull) {
118
- result.jsonSchema = { oneOf: [result.jsonSchema, { type: "null" }] };
119
- }
120
- return result;
121
- }
122
- // General union - use oneOf (filter out undefined which isn't valid in JSON Schema)
123
- const schemas = nonNullTypes.map((t) => convertType(t, checker).jsonSchema);
124
- if (hasNull) {
125
- schemas.push({ type: "null" });
126
- }
127
- return {
128
- jsonSchema: { oneOf: schemas },
129
- formSpecFieldType: "union",
130
- };
131
- }
132
- /**
133
- * Converts an array type to JSON Schema.
134
- */
135
- function convertArrayType(type, checker) {
136
- const typeArgs = type.typeArguments;
137
- const elementType = typeArgs?.[0];
138
- const itemSchema = elementType
139
- ? convertType(elementType, checker).jsonSchema
140
- : {};
141
- return {
142
- jsonSchema: {
143
- type: "array",
144
- items: itemSchema,
145
- },
146
- formSpecFieldType: "array",
147
- };
148
- }
149
- /**
150
- * Converts an object type to JSON Schema.
151
- */
152
- function convertObjectType(type, checker) {
153
- const properties = {};
154
- const required = [];
155
- const props = type.getProperties();
156
- for (const prop of props) {
157
- const propType = checker.getTypeOfSymbolAtLocation(prop, prop.valueDeclaration ?? prop.declarations?.[0] ?? {});
158
- const propSchema = convertType(propType, checker).jsonSchema;
159
- properties[prop.name] = propSchema;
160
- // Check if property is optional
161
- const isOptional = prop.flags & ts.SymbolFlags.Optional;
162
- if (!isOptional) {
163
- required.push(prop.name);
164
- }
165
- }
166
- return {
167
- jsonSchema: {
168
- type: "object",
169
- properties,
170
- ...(required.length > 0 ? { required } : {}),
171
- },
172
- formSpecFieldType: "object",
173
- };
174
- }
175
- /**
176
- * Creates a FormSpec field definition from a field's type and decorators.
177
- *
178
- * @param fieldName - The field name
179
- * @param type - The TypeScript type
180
- * @param decorators - Decorators applied to the field
181
- * @param optional - Whether the field is optional
182
- * @param checker - TypeScript type checker
183
- * @returns FormSpec field definition
184
- */
185
- export function createFormSpecField(fieldName, type, decorators, optional, checker) {
186
- const { formSpecFieldType } = convertType(type, checker);
187
- const field = {
188
- _field: formSpecFieldType,
189
- id: fieldName,
190
- };
191
- // Apply optionality
192
- if (!optional) {
193
- field.required = true;
194
- }
195
- // For object types, recursively add nested fields
196
- if (formSpecFieldType === "object" && type.flags & ts.TypeFlags.Object) {
197
- const objectType = type;
198
- const nestedFields = [];
199
- for (const prop of objectType.getProperties()) {
200
- const propType = checker.getTypeOfSymbolAtLocation(prop, prop.valueDeclaration ?? prop.declarations?.[0] ?? {});
201
- const propOptional = !!(prop.flags & ts.SymbolFlags.Optional);
202
- // Note: We don't have access to decorators on nested class properties here
203
- // since we're analyzing the type, not the class declaration
204
- nestedFields.push(createFormSpecField(prop.name, propType, [], propOptional, checker));
205
- }
206
- if (nestedFields.length > 0) {
207
- field.fields = nestedFields;
208
- }
209
- }
210
- // Apply decorator values
211
- for (const dec of decorators) {
212
- applyDecoratorToField(field, dec, type, checker);
213
- }
214
- return field;
215
- }
216
- /**
217
- * Applies a decorator's values to a FormSpec field.
218
- *
219
- * @param field - The FormSpec field to modify
220
- * @param decorator - The decorator information to apply
221
- * @param _type - The TypeScript type (unused but kept for future use)
222
- * @param _checker - The TypeScript type checker (unused but kept for future use)
223
- */
224
- function applyDecoratorToField(field, decorator, _type, _checker) {
225
- const { name, args } = decorator;
226
- switch (name) {
227
- case "Label":
228
- if (typeof args[0] === "string") {
229
- field.label = args[0];
230
- }
231
- break;
232
- case "Placeholder":
233
- if (typeof args[0] === "string") {
234
- field.placeholder = args[0];
235
- }
236
- break;
237
- case "Description":
238
- if (typeof args[0] === "string") {
239
- field.description = args[0];
240
- }
241
- break;
242
- case "Min":
243
- if (typeof args[0] === "number") {
244
- field.min = args[0];
245
- }
246
- break;
247
- case "Max":
248
- if (typeof args[0] === "number") {
249
- field.max = args[0];
250
- }
251
- break;
252
- case "Step":
253
- if (typeof args[0] === "number") {
254
- field.step = args[0];
255
- }
256
- break;
257
- case "MinLength":
258
- if (typeof args[0] === "number") {
259
- field.minLength = args[0];
260
- }
261
- break;
262
- case "MaxLength":
263
- if (typeof args[0] === "number") {
264
- field.maxLength = args[0];
265
- }
266
- break;
267
- case "MinItems":
268
- if (typeof args[0] === "number") {
269
- field.minItems = args[0];
270
- }
271
- break;
272
- case "MaxItems":
273
- if (typeof args[0] === "number") {
274
- field.maxItems = args[0];
275
- }
276
- break;
277
- case "Pattern":
278
- if (typeof args[0] === "string") {
279
- field.pattern = args[0];
280
- }
281
- break;
282
- case "EnumOptions":
283
- if (Array.isArray(args[0])) {
284
- field.options = args[0];
285
- }
286
- break;
287
- case "ShowWhen":
288
- if (typeof args[0] === "object" && args[0] !== null) {
289
- field.showWhen = args[0];
290
- }
291
- break;
292
- case "Group":
293
- if (typeof args[0] === "string") {
294
- field.group = args[0];
295
- }
296
- break;
297
- }
298
- }
299
- /**
300
- * Applies decorator constraints to a JSON Schema.
301
- *
302
- * @param schema - The base JSON Schema
303
- * @param decorators - Decorators to apply
304
- * @returns Modified JSON Schema with constraints
305
- */
306
- export function applyDecoratorsToSchema(schema, decorators) {
307
- const result = { ...schema };
308
- for (const dec of decorators) {
309
- const { name, args } = dec;
310
- switch (name) {
311
- case "Label":
312
- if (typeof args[0] === "string") {
313
- result.title = args[0];
314
- }
315
- break;
316
- case "Description":
317
- if (typeof args[0] === "string") {
318
- result.description = args[0];
319
- }
320
- break;
321
- case "Min":
322
- if (typeof args[0] === "number") {
323
- result.minimum = args[0];
324
- }
325
- break;
326
- case "Max":
327
- if (typeof args[0] === "number") {
328
- result.maximum = args[0];
329
- }
330
- break;
331
- case "MinLength":
332
- if (typeof args[0] === "number") {
333
- result.minLength = args[0];
334
- }
335
- break;
336
- case "MaxLength":
337
- if (typeof args[0] === "number") {
338
- result.maxLength = args[0];
339
- }
340
- break;
341
- case "MinItems":
342
- if (typeof args[0] === "number") {
343
- result.minItems = args[0];
344
- }
345
- break;
346
- case "MaxItems":
347
- if (typeof args[0] === "number") {
348
- result.maxItems = args[0];
349
- }
350
- break;
351
- case "Pattern":
352
- if (typeof args[0] === "string") {
353
- result.pattern = args[0];
354
- }
355
- break;
356
- }
357
- }
358
- return result;
359
- }
360
- //# sourceMappingURL=type-converter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"type-converter.js","sourceRoot":"","sources":["../../src/analyzer/type-converter.ts"],"names":[],"mappings":"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"}
@@ -1,76 +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
- /**
18
- * Type metadata format used by @formspec/decorators.
19
- *
20
- * Represents the runtime type information for a field that TypeScript
21
- * normally erases at compile time.
22
- */
23
- export interface TypeMetadata {
24
- /** Base type: "string", "number", "boolean", "enum", "array", "object", "unknown" */
25
- type: string;
26
- /** For enum types, the possible literal values */
27
- values?: unknown[];
28
- /** For array types, metadata about the array element type */
29
- itemType?: TypeMetadata;
30
- /** For object types, metadata about each property */
31
- properties?: Record<string, TypeMetadata>;
32
- /** Whether the field accepts null */
33
- nullable?: boolean;
34
- /** Whether the field is optional (T | undefined or ?: modifier) */
35
- optional?: boolean;
36
- }
37
- /**
38
- * Information about a decorated class found during codegen analysis.
39
- *
40
- * Used to track which classes need type metadata patches and where
41
- * they are located in the source tree.
42
- */
43
- export interface DecoratedClassInfo {
44
- /** Class name as it appears in the source file */
45
- name: string;
46
- /** Import path to the source file (relative to output, without extension) */
47
- sourcePath: string;
48
- /** Type metadata for all decorated properties in the class */
49
- typeMetadata: Record<string, TypeMetadata>;
50
- /** Whether the class is exported from its source file */
51
- isExported: boolean;
52
- }
53
- /**
54
- * Options for code generation.
55
- */
56
- export interface CodegenOptions {
57
- /** Source files to analyze (glob patterns supported) */
58
- files: string[];
59
- /** Output file path */
60
- output: string;
61
- /** Base directory for relative imports */
62
- baseDir?: string;
63
- }
64
- /**
65
- * Finds all decorated classes in the given source files.
66
- */
67
- export declare function findDecoratedClasses(files: string[], baseDir: string): DecoratedClassInfo[];
68
- /**
69
- * Generates the codegen output file content.
70
- */
71
- export declare function generateCodegenOutput(classes: DecoratedClassInfo[], outputPath: string, baseDir: string): string;
72
- /**
73
- * Runs the code generation.
74
- */
75
- export declare function runCodegen(options: CodegenOptions): void;
76
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,qFAAqF;IACrF,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC1C,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3C,yDAAyD;IACzD,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,MAAM,GACd,kBAAkB,EAAE,CAoCtB;AAmND;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,kBAAkB,EAAE,EAC7B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,MAAM,CAwER;AAqPD;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CA6CxD"}