@formspec/build 0.1.0-alpha.10 → 0.1.0-alpha.12

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