@formspec/cli 0.1.0-alpha.7 → 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 (57) 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 +9 -80
  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 -478
  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 +12 -275
  13. package/dist/__tests__/edge-cases.test.js.map +1 -1
  14. package/dist/__tests__/fixtures/edge-cases.d.ts +2 -2
  15. package/dist/__tests__/fixtures/edge-cases.d.ts.map +1 -1
  16. package/dist/__tests__/fixtures/edge-cases.js +4 -2
  17. package/dist/__tests__/fixtures/edge-cases.js.map +1 -1
  18. package/dist/__tests__/integration.test.js +45 -18
  19. package/dist/__tests__/integration.test.js.map +1 -1
  20. package/dist/index.js +46 -26
  21. package/dist/index.js.map +1 -1
  22. package/dist/output/writer.d.ts +5 -5
  23. package/dist/output/writer.d.ts.map +1 -1
  24. package/dist/output/writer.js +13 -13
  25. package/dist/output/writer.js.map +1 -1
  26. package/dist/runtime/formspec-loader.d.ts.map +1 -1
  27. package/dist/runtime/formspec-loader.js +1 -3
  28. package/dist/runtime/formspec-loader.js.map +1 -1
  29. package/package.json +4 -4
  30. package/dist/analyzer/class-analyzer.d.ts +0 -75
  31. package/dist/analyzer/class-analyzer.d.ts.map +0 -1
  32. package/dist/analyzer/class-analyzer.js +0 -151
  33. package/dist/analyzer/class-analyzer.js.map +0 -1
  34. package/dist/analyzer/decorator-extractor.d.ts +0 -87
  35. package/dist/analyzer/decorator-extractor.d.ts.map +0 -1
  36. package/dist/analyzer/decorator-extractor.js +0 -193
  37. package/dist/analyzer/decorator-extractor.js.map +0 -1
  38. package/dist/analyzer/program.d.ts +0 -37
  39. package/dist/analyzer/program.d.ts.map +0 -1
  40. package/dist/analyzer/program.js +0 -89
  41. package/dist/analyzer/program.js.map +0 -1
  42. package/dist/analyzer/type-converter.d.ts +0 -97
  43. package/dist/analyzer/type-converter.d.ts.map +0 -1
  44. package/dist/analyzer/type-converter.js +0 -353
  45. package/dist/analyzer/type-converter.js.map +0 -1
  46. package/dist/codegen/index.d.ts +0 -76
  47. package/dist/codegen/index.d.ts.map +0 -1
  48. package/dist/codegen/index.js +0 -550
  49. package/dist/codegen/index.js.map +0 -1
  50. package/dist/generators/class-schema.d.ts +0 -43
  51. package/dist/generators/class-schema.d.ts.map +0 -1
  52. package/dist/generators/class-schema.js +0 -61
  53. package/dist/generators/class-schema.js.map +0 -1
  54. package/dist/generators/method-schema.d.ts +0 -57
  55. package/dist/generators/method-schema.d.ts.map +0 -1
  56. package/dist/generators/method-schema.js +0 -108
  57. package/dist/generators/method-schema.js.map +0 -1
@@ -1,61 +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 { convertType, applyDecoratorsToSchema, createFormSpecField, } from "../analyzer/type-converter.js";
8
- /**
9
- * Generates JSON Schema and FormSpec from a class analysis.
10
- *
11
- * Uses static type information and decorator metadata to build
12
- * complete schema definitions for a class's fields.
13
- *
14
- * @param analysis - The class analysis result
15
- * @param checker - TypeScript type checker
16
- * @returns Generated JSON Schema and FormSpec
17
- */
18
- export function generateClassSchemas(analysis, checker) {
19
- const properties = {};
20
- const required = [];
21
- const uxElements = [];
22
- for (const field of analysis.fields) {
23
- // Generate JSON Schema for field
24
- const { jsonSchema: baseSchema } = convertType(field.type, checker);
25
- const fieldSchema = applyDecoratorsToSchema(baseSchema, field.decorators);
26
- properties[field.name] = fieldSchema;
27
- // Track required fields
28
- if (!field.optional) {
29
- required.push(field.name);
30
- }
31
- // Generate FormSpec field
32
- const formSpecField = createFormSpecField(field.name, field.type, field.decorators, field.optional, checker);
33
- uxElements.push(formSpecField);
34
- }
35
- // Build complete JSON Schema
36
- const jsonSchema = {
37
- type: "object",
38
- properties,
39
- ...(required.length > 0 ? { required } : {}),
40
- };
41
- // Build FormSpec/UI Schema
42
- const uxSpec = {
43
- elements: uxElements,
44
- };
45
- return { jsonSchema, uxSpec };
46
- }
47
- /**
48
- * Generates JSON Schema for a single field.
49
- *
50
- * Useful for generating schemas for method return types
51
- * or individual field extraction.
52
- *
53
- * @param field - The field information
54
- * @param checker - TypeScript type checker
55
- * @returns JSON Schema for the field's type
56
- */
57
- export function generateFieldSchema(field, checker) {
58
- const { jsonSchema: baseSchema } = convertType(field.type, checker);
59
- return applyDecoratorsToSchema(baseSchema, field.decorators);
60
- }
61
- //# sourceMappingURL=class-schema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"class-schema.js","sourceRoot":"","sources":["../../src/generators/class-schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,mBAAmB,GAGpB,MAAM,+BAA+B,CAAC;AAcvC;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAuB,EACvB,OAAuB;IAEvB,MAAM,UAAU,GAA+B,EAAE,CAAC;IAClD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAoB,EAAE,CAAC;IAEvC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpC,iCAAiC;QACjC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,uBAAuB,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1E,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;QAErC,wBAAwB;QACxB,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,0BAA0B;QAC1B,MAAM,aAAa,GAAG,mBAAmB,CACvC,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,QAAQ,EACd,OAAO,CACR,CAAC;QACF,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IAED,6BAA6B;IAC7B,MAAM,UAAU,GAAe;QAC7B,IAAI,EAAE,QAAQ;QACd,UAAU;QACV,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C,CAAC;IAEF,2BAA2B;IAC3B,MAAM,MAAM,GAAG;QACb,QAAQ,EAAE,UAAU;KACrB,CAAC;IAEF,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AAChC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAgB,EAChB,OAAuB;IAEvB,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpE,OAAO,uBAAuB,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;AAC/D,CAAC"}
@@ -1,57 +0,0 @@
1
- /**
2
- * Method schema generator.
3
- *
4
- * Generates schemas for method parameters and return types:
5
- * - Parameters using FormSpec (InferSchema<typeof X>) → runtime generation
6
- * - Parameters with regular types → static type conversion
7
- * - Return types → static type conversion
8
- */
9
- import type * as ts from "typescript";
10
- import type { MethodInfo } from "../analyzer/class-analyzer.js";
11
- import { type JsonSchema } from "../analyzer/type-converter.js";
12
- import type { FormSpecSchemas } from "../runtime/formspec-loader.js";
13
- /**
14
- * Generated schemas for a method.
15
- */
16
- export interface MethodSchemas {
17
- /** Method name */
18
- name: string;
19
- /** Parameter schemas (from FormSpec or static analysis) */
20
- params: MethodParamsSchemas | null;
21
- /** Return type schema */
22
- returnType: JsonSchema;
23
- }
24
- /**
25
- * Parameter schemas for a method.
26
- */
27
- export interface MethodParamsSchemas {
28
- /** JSON Schema for parameters */
29
- jsonSchema: JsonSchema;
30
- /** UI Schema / FormSpec for parameters (if available) */
31
- uxSpec: object | null;
32
- /** Name of the FormSpec export used (if any) */
33
- formSpecExport: string | null;
34
- }
35
- /**
36
- * Generates schemas for a method's parameters and return type.
37
- *
38
- * If a parameter references a FormSpec via `InferSchema<typeof X>`,
39
- * the schemas are taken from the loaded FormSpec at runtime.
40
- * Otherwise, schemas are generated from static type analysis.
41
- *
42
- * @param method - The method information from static analysis
43
- * @param checker - TypeScript type checker
44
- * @param loadedFormSpecs - Map of FormSpec export names to their schemas
45
- * @returns Generated method schemas
46
- */
47
- export declare function generateMethodSchemas(method: MethodInfo, checker: ts.TypeChecker, loadedFormSpecs: Map<string, FormSpecSchemas>): MethodSchemas;
48
- /**
49
- * Collects all FormSpec export names referenced by methods.
50
- *
51
- * Use this to determine which exports to load at runtime.
52
- *
53
- * @param methods - Array of method infos
54
- * @returns Set of FormSpec export names
55
- */
56
- export declare function collectFormSpecReferences(methods: MethodInfo[]): Set<string>;
57
- //# sourceMappingURL=method-schema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"method-schema.d.ts","sourceRoot":"","sources":["../../src/generators/method-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACnC,yBAAyB;IACzB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,iCAAiC;IACjC,UAAU,EAAE,UAAU,CAAC;IACvB,yDAAyD;IACzD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,gDAAgD;IAChD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,GAC5C,aAAa,CAYf;AAuED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,UAAU,EAAE,GACpB,GAAG,CAAC,MAAM,CAAC,CAYb"}
@@ -1,108 +0,0 @@
1
- /**
2
- * Method schema generator.
3
- *
4
- * Generates schemas for method parameters and return types:
5
- * - Parameters using FormSpec (InferSchema<typeof X>) → runtime generation
6
- * - Parameters with regular types → static type conversion
7
- * - Return types → static type conversion
8
- */
9
- import { convertType } from "../analyzer/type-converter.js";
10
- /**
11
- * Generates schemas for a method's parameters and return type.
12
- *
13
- * If a parameter references a FormSpec via `InferSchema<typeof X>`,
14
- * the schemas are taken from the loaded FormSpec at runtime.
15
- * Otherwise, schemas are generated from static type analysis.
16
- *
17
- * @param method - The method information from static analysis
18
- * @param checker - TypeScript type checker
19
- * @param loadedFormSpecs - Map of FormSpec export names to their schemas
20
- * @returns Generated method schemas
21
- */
22
- export function generateMethodSchemas(method, checker, loadedFormSpecs) {
23
- // Generate return type schema from static analysis
24
- const returnType = convertType(method.returnType, checker).jsonSchema;
25
- // Handle parameters
26
- const params = generateParamsSchemas(method.parameters, checker, loadedFormSpecs);
27
- return {
28
- name: method.name,
29
- params,
30
- returnType,
31
- };
32
- }
33
- /**
34
- * Generates schemas for method parameters.
35
- */
36
- function generateParamsSchemas(parameters, checker, loadedFormSpecs) {
37
- if (parameters.length === 0) {
38
- return null;
39
- }
40
- // Check if any parameter uses InferSchema<typeof X>
41
- for (const param of parameters) {
42
- if (param.formSpecExportName) {
43
- const formSpec = loadedFormSpecs.get(param.formSpecExportName);
44
- if (formSpec) {
45
- // Use runtime-generated schemas from FormSpec
46
- // Cast JSONSchema7 to our JsonSchema type (structurally compatible)
47
- return {
48
- jsonSchema: formSpec.jsonSchema,
49
- uxSpec: formSpec.uiSchema,
50
- formSpecExport: param.formSpecExportName,
51
- };
52
- }
53
- // FormSpec not found - fall back to static analysis
54
- console.warn(`Warning: FormSpec export "${param.formSpecExportName}" not found, using static analysis`);
55
- }
56
- }
57
- // Generate from static type analysis
58
- if (parameters.length === 1 && parameters[0]) {
59
- // Single parameter - use its type directly
60
- const param = parameters[0];
61
- const jsonSchema = convertType(param.type, checker).jsonSchema;
62
- return {
63
- jsonSchema,
64
- uxSpec: null,
65
- formSpecExport: null,
66
- };
67
- }
68
- // Multiple parameters - create object schema
69
- const properties = {};
70
- const required = [];
71
- for (const param of parameters) {
72
- const paramSchema = convertType(param.type, checker).jsonSchema;
73
- properties[param.name] = paramSchema;
74
- // Only non-optional parameters should be marked as required
75
- if (!param.optional) {
76
- required.push(param.name);
77
- }
78
- }
79
- return {
80
- jsonSchema: {
81
- type: "object",
82
- properties,
83
- required,
84
- },
85
- uxSpec: null,
86
- formSpecExport: null,
87
- };
88
- }
89
- /**
90
- * Collects all FormSpec export names referenced by methods.
91
- *
92
- * Use this to determine which exports to load at runtime.
93
- *
94
- * @param methods - Array of method infos
95
- * @returns Set of FormSpec export names
96
- */
97
- export function collectFormSpecReferences(methods) {
98
- const references = new Set();
99
- for (const method of methods) {
100
- for (const param of method.parameters) {
101
- if (param.formSpecExportName) {
102
- references.add(param.formSpecExportName);
103
- }
104
- }
105
- }
106
- return references;
107
- }
108
- //# sourceMappingURL=method-schema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"method-schema.js","sourceRoot":"","sources":["../../src/generators/method-schema.ts"],"names":[],"mappings":"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"}