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

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 (145) hide show
  1. package/README.md +138 -0
  2. package/dist/__tests__/analyzer-edge-cases.test.d.ts +13 -0
  3. package/dist/__tests__/analyzer-edge-cases.test.d.ts.map +1 -0
  4. package/dist/__tests__/analyzer-edge-cases.test.js +376 -0
  5. package/dist/__tests__/analyzer-edge-cases.test.js.map +1 -0
  6. package/dist/__tests__/analyzer.test.d.ts +5 -0
  7. package/dist/__tests__/analyzer.test.d.ts.map +1 -0
  8. package/dist/__tests__/analyzer.test.js +190 -0
  9. package/dist/__tests__/analyzer.test.js.map +1 -0
  10. package/dist/__tests__/cli.test.js.map +1 -1
  11. package/dist/__tests__/codegen.test.d.ts +5 -0
  12. package/dist/__tests__/codegen.test.d.ts.map +1 -0
  13. package/dist/__tests__/codegen.test.js +506 -0
  14. package/dist/__tests__/codegen.test.js.map +1 -0
  15. package/dist/__tests__/decorator-pipeline.test.d.ts +11 -0
  16. package/dist/__tests__/decorator-pipeline.test.d.ts.map +1 -0
  17. package/dist/__tests__/decorator-pipeline.test.js +460 -0
  18. package/dist/__tests__/decorator-pipeline.test.js.map +1 -0
  19. package/dist/__tests__/edge-cases.test.js +10 -4
  20. package/dist/__tests__/edge-cases.test.js.map +1 -1
  21. package/dist/__tests__/fixtures/edge-cases.d.ts +110 -0
  22. package/dist/__tests__/fixtures/edge-cases.d.ts.map +1 -0
  23. package/dist/__tests__/fixtures/edge-cases.js +137 -0
  24. package/dist/__tests__/fixtures/edge-cases.js.map +1 -0
  25. package/dist/__tests__/fixtures/example-a-builtins.d.ts +12 -0
  26. package/dist/__tests__/fixtures/example-a-builtins.d.ts.map +1 -0
  27. package/dist/__tests__/fixtures/example-a-builtins.js +100 -0
  28. package/dist/__tests__/fixtures/example-a-builtins.js.map +1 -0
  29. package/dist/__tests__/fixtures/example-b-decorators.d.ts +5 -0
  30. package/dist/__tests__/fixtures/example-b-decorators.d.ts.map +1 -0
  31. package/dist/__tests__/fixtures/example-b-decorators.js +5 -0
  32. package/dist/__tests__/fixtures/example-b-decorators.js.map +1 -0
  33. package/dist/__tests__/fixtures/example-b-extended.d.ts +5 -0
  34. package/dist/__tests__/fixtures/example-b-extended.d.ts.map +1 -0
  35. package/dist/__tests__/fixtures/example-b-extended.js +60 -0
  36. package/dist/__tests__/fixtures/example-b-extended.js.map +1 -0
  37. package/dist/__tests__/fixtures/example-c-custom.d.ts +5 -0
  38. package/dist/__tests__/fixtures/example-c-custom.d.ts.map +1 -0
  39. package/dist/__tests__/fixtures/example-c-custom.js +61 -0
  40. package/dist/__tests__/fixtures/example-c-custom.js.map +1 -0
  41. package/dist/__tests__/fixtures/example-c-decorators.d.ts +5 -0
  42. package/dist/__tests__/fixtures/example-c-decorators.d.ts.map +1 -0
  43. package/dist/__tests__/fixtures/example-c-decorators.js +4 -0
  44. package/dist/__tests__/fixtures/example-c-decorators.js.map +1 -0
  45. package/dist/__tests__/fixtures/example-d-mixed-decorators.d.ts +6 -0
  46. package/dist/__tests__/fixtures/example-d-mixed-decorators.d.ts.map +1 -0
  47. package/dist/__tests__/fixtures/example-d-mixed-decorators.js +75 -0
  48. package/dist/__tests__/fixtures/example-d-mixed-decorators.js.map +1 -0
  49. package/dist/__tests__/fixtures/example-e-decorators.d.ts +11 -0
  50. package/dist/__tests__/fixtures/example-e-decorators.d.ts.map +1 -0
  51. package/dist/__tests__/fixtures/example-e-decorators.js +10 -0
  52. package/dist/__tests__/fixtures/example-e-decorators.js.map +1 -0
  53. package/dist/__tests__/fixtures/example-e-no-namespace.d.ts +5 -0
  54. package/dist/__tests__/fixtures/example-e-no-namespace.d.ts.map +1 -0
  55. package/dist/__tests__/fixtures/example-e-no-namespace.js +61 -0
  56. package/dist/__tests__/fixtures/example-e-no-namespace.js.map +1 -0
  57. package/dist/__tests__/fixtures/example-interface-types.d.ts +102 -0
  58. package/dist/__tests__/fixtures/example-interface-types.d.ts.map +1 -0
  59. package/dist/__tests__/fixtures/example-interface-types.js +8 -0
  60. package/dist/__tests__/fixtures/example-interface-types.js.map +1 -0
  61. package/dist/__tests__/fixtures/example-jsdoc-constraints.d.ts +16 -0
  62. package/dist/__tests__/fixtures/example-jsdoc-constraints.d.ts.map +1 -0
  63. package/dist/__tests__/fixtures/example-jsdoc-constraints.js +98 -0
  64. package/dist/__tests__/fixtures/example-jsdoc-constraints.js.map +1 -0
  65. package/dist/__tests__/fixtures/example-nested-class.d.ts +45 -0
  66. package/dist/__tests__/fixtures/example-nested-class.d.ts.map +1 -0
  67. package/dist/__tests__/fixtures/example-nested-class.js +248 -0
  68. package/dist/__tests__/fixtures/example-nested-class.js.map +1 -0
  69. package/dist/__tests__/fixtures/sample-forms.d.ts +55 -0
  70. package/dist/__tests__/fixtures/sample-forms.d.ts.map +1 -0
  71. package/dist/__tests__/fixtures/sample-forms.js +78 -0
  72. package/dist/__tests__/fixtures/sample-forms.js.map +1 -0
  73. package/dist/__tests__/generator.test.js +29 -3
  74. package/dist/__tests__/generator.test.js.map +1 -1
  75. package/dist/__tests__/integration.test.js +1 -3
  76. package/dist/__tests__/integration.test.js.map +1 -1
  77. package/dist/__tests__/interface-types.test.d.ts +11 -0
  78. package/dist/__tests__/interface-types.test.d.ts.map +1 -0
  79. package/dist/__tests__/interface-types.test.js +404 -0
  80. package/dist/__tests__/interface-types.test.js.map +1 -0
  81. package/dist/__tests__/jsdoc-constraints.test.d.ts +10 -0
  82. package/dist/__tests__/jsdoc-constraints.test.d.ts.map +1 -0
  83. package/dist/__tests__/jsdoc-constraints.test.js +465 -0
  84. package/dist/__tests__/jsdoc-constraints.test.js.map +1 -0
  85. package/dist/__tests__/write-schemas.test.js +10 -8
  86. package/dist/__tests__/write-schemas.test.js.map +1 -1
  87. package/dist/analyzer/class-analyzer.d.ts +139 -0
  88. package/dist/analyzer/class-analyzer.d.ts.map +1 -0
  89. package/dist/analyzer/class-analyzer.js +377 -0
  90. package/dist/analyzer/class-analyzer.js.map +1 -0
  91. package/dist/analyzer/decorator-extractor.d.ts +78 -0
  92. package/dist/analyzer/decorator-extractor.d.ts.map +1 -0
  93. package/dist/analyzer/decorator-extractor.js +336 -0
  94. package/dist/analyzer/decorator-extractor.js.map +1 -0
  95. package/dist/analyzer/jsdoc-constraints.d.ts +47 -0
  96. package/dist/analyzer/jsdoc-constraints.d.ts.map +1 -0
  97. package/dist/analyzer/jsdoc-constraints.js +153 -0
  98. package/dist/analyzer/jsdoc-constraints.js.map +1 -0
  99. package/dist/analyzer/program.d.ts +53 -0
  100. package/dist/analyzer/program.d.ts.map +1 -0
  101. package/dist/analyzer/program.js +114 -0
  102. package/dist/analyzer/program.js.map +1 -0
  103. package/dist/analyzer/type-converter.d.ts +75 -0
  104. package/dist/analyzer/type-converter.d.ts.map +1 -0
  105. package/dist/analyzer/type-converter.js +474 -0
  106. package/dist/analyzer/type-converter.js.map +1 -0
  107. package/dist/browser.d.ts +54 -0
  108. package/dist/browser.d.ts.map +1 -0
  109. package/dist/browser.js +48 -0
  110. package/dist/browser.js.map +1 -0
  111. package/dist/build.d.ts +580 -0
  112. package/dist/cli.js +1 -3
  113. package/dist/cli.js.map +1 -1
  114. package/dist/codegen/index.d.ts +75 -0
  115. package/dist/codegen/index.d.ts.map +1 -0
  116. package/dist/codegen/index.js +597 -0
  117. package/dist/codegen/index.js.map +1 -0
  118. package/dist/generators/class-schema.d.ts +118 -0
  119. package/dist/generators/class-schema.d.ts.map +1 -0
  120. package/dist/generators/class-schema.js +140 -0
  121. package/dist/generators/class-schema.js.map +1 -0
  122. package/dist/generators/method-schema.d.ts +67 -0
  123. package/dist/generators/method-schema.d.ts.map +1 -0
  124. package/dist/generators/method-schema.js +108 -0
  125. package/dist/generators/method-schema.js.map +1 -0
  126. package/dist/index.d.ts +8 -2
  127. package/dist/index.d.ts.map +1 -1
  128. package/dist/index.js +11 -1
  129. package/dist/index.js.map +1 -1
  130. package/dist/internals.d.ts +20 -0
  131. package/dist/internals.d.ts.map +1 -0
  132. package/dist/internals.js +22 -0
  133. package/dist/internals.js.map +1 -0
  134. package/dist/json-schema/generator.d.ts.map +1 -1
  135. package/dist/json-schema/generator.js +26 -6
  136. package/dist/json-schema/generator.js.map +1 -1
  137. package/dist/json-schema/types.d.ts +28 -0
  138. package/dist/json-schema/types.d.ts.map +1 -1
  139. package/dist/json-schema/types.js +27 -1
  140. package/dist/json-schema/types.js.map +1 -1
  141. package/dist/ui-schema/generator.d.ts.map +1 -1
  142. package/dist/ui-schema/generator.js +1 -3
  143. package/dist/ui-schema/generator.js.map +1 -1
  144. package/dist/ui-schema/types.d.ts.map +1 -1
  145. package/package.json +18 -5
@@ -0,0 +1,506 @@
1
+ /**
2
+ * Tests for the codegen type generation functions.
3
+ */
4
+ import { describe, it, expect } from "vitest";
5
+ import { generateCodegenOutput, findDecoratedClasses as _findDecoratedClasses, } from "../codegen/index.js";
6
+ // =============================================================================
7
+ // Test Helpers
8
+ // =============================================================================
9
+ function createTypeMetadata(overrides = {}) {
10
+ return {
11
+ type: "string",
12
+ ...overrides,
13
+ };
14
+ }
15
+ function createDecoratedClassInfo(overrides = {}) {
16
+ return {
17
+ name: "TestForm",
18
+ sourcePath: "./test-form",
19
+ typeMetadata: {},
20
+ isExported: true,
21
+ ...overrides,
22
+ };
23
+ }
24
+ // =============================================================================
25
+ // generateCodegenOutput Tests
26
+ // =============================================================================
27
+ describe("generateCodegenOutput", () => {
28
+ describe("schema type generation", () => {
29
+ it("generates correct schema type for primitive fields", () => {
30
+ const cls = createDecoratedClassInfo({
31
+ name: "UserForm",
32
+ typeMetadata: {
33
+ name: createTypeMetadata({ type: "string" }),
34
+ age: createTypeMetadata({ type: "number" }),
35
+ active: createTypeMetadata({ type: "boolean" }),
36
+ },
37
+ });
38
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
39
+ expect(output).toContain("export type UserFormSchema = {");
40
+ expect(output).toContain("name: string;");
41
+ expect(output).toContain("age: number;");
42
+ expect(output).toContain("active: boolean;");
43
+ });
44
+ it("generates correct schema type for optional fields", () => {
45
+ const cls = createDecoratedClassInfo({
46
+ name: "UserForm",
47
+ typeMetadata: {
48
+ name: createTypeMetadata({ type: "string" }),
49
+ age: createTypeMetadata({ type: "number", optional: true }),
50
+ },
51
+ });
52
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
53
+ expect(output).toContain("name: string;");
54
+ expect(output).toContain("age?: number | undefined;");
55
+ });
56
+ it("generates correct schema type for nullable fields", () => {
57
+ const cls = createDecoratedClassInfo({
58
+ name: "UserForm",
59
+ typeMetadata: {
60
+ middleName: createTypeMetadata({ type: "string", nullable: true }),
61
+ },
62
+ });
63
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
64
+ expect(output).toContain("middleName: string | null;");
65
+ });
66
+ it("generates correct schema type for nullable and optional fields", () => {
67
+ const cls = createDecoratedClassInfo({
68
+ name: "UserForm",
69
+ typeMetadata: {
70
+ nickname: createTypeMetadata({
71
+ type: "string",
72
+ nullable: true,
73
+ optional: true,
74
+ }),
75
+ },
76
+ });
77
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
78
+ expect(output).toContain("nickname?: string | null | undefined;");
79
+ });
80
+ it("generates correct schema type for enum fields", () => {
81
+ const cls = createDecoratedClassInfo({
82
+ name: "UserForm",
83
+ typeMetadata: {
84
+ country: createTypeMetadata({
85
+ type: "enum",
86
+ values: ["us", "ca", "uk"],
87
+ }),
88
+ },
89
+ });
90
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
91
+ expect(output).toContain('country: "us" | "ca" | "uk";');
92
+ });
93
+ it("generates correct schema type for array fields", () => {
94
+ const cls = createDecoratedClassInfo({
95
+ name: "UserForm",
96
+ typeMetadata: {
97
+ tags: createTypeMetadata({
98
+ type: "array",
99
+ itemType: { type: "string" },
100
+ }),
101
+ },
102
+ });
103
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
104
+ expect(output).toContain("tags: string[];");
105
+ });
106
+ it("generates correct schema type for array of nullable items", () => {
107
+ const cls = createDecoratedClassInfo({
108
+ name: "UserForm",
109
+ typeMetadata: {
110
+ values: createTypeMetadata({
111
+ type: "array",
112
+ itemType: { type: "string", nullable: true },
113
+ }),
114
+ },
115
+ });
116
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
117
+ expect(output).toContain("values: (string | null)[];");
118
+ });
119
+ it("generates correct schema type for object fields", () => {
120
+ const cls = createDecoratedClassInfo({
121
+ name: "UserForm",
122
+ typeMetadata: {
123
+ address: createTypeMetadata({
124
+ type: "object",
125
+ properties: {
126
+ street: { type: "string" },
127
+ city: { type: "string" },
128
+ zip: { type: "string", optional: true },
129
+ },
130
+ }),
131
+ },
132
+ });
133
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
134
+ expect(output).toContain("address: { street: string; city: string; zip?: string | undefined };");
135
+ });
136
+ });
137
+ describe("property key escaping", () => {
138
+ it("escapes property names with special characters", () => {
139
+ const cls = createDecoratedClassInfo({
140
+ name: "TestForm",
141
+ typeMetadata: {
142
+ "user-name": createTypeMetadata({ type: "string" }),
143
+ "field with spaces": createTypeMetadata({ type: "string" }),
144
+ },
145
+ });
146
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
147
+ expect(output).toContain('"user-name": string;');
148
+ expect(output).toContain('"field with spaces": string;');
149
+ });
150
+ it("escapes reserved words", () => {
151
+ const cls = createDecoratedClassInfo({
152
+ name: "TestForm",
153
+ typeMetadata: {
154
+ class: createTypeMetadata({ type: "string" }),
155
+ function: createTypeMetadata({ type: "string" }),
156
+ import: createTypeMetadata({ type: "string" }),
157
+ },
158
+ });
159
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
160
+ expect(output).toContain('"class": string;');
161
+ expect(output).toContain('"function": string;');
162
+ expect(output).toContain('"import": string;');
163
+ });
164
+ it("does not escape valid identifiers in schema types", () => {
165
+ const cls = createDecoratedClassInfo({
166
+ name: "TestForm",
167
+ typeMetadata: {
168
+ firstName: createTypeMetadata({ type: "string" }),
169
+ _private: createTypeMetadata({ type: "string" }),
170
+ $dollar: createTypeMetadata({ type: "string" }),
171
+ },
172
+ });
173
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
174
+ // Extract just the schema type section
175
+ const schemaRegex = /export type TestFormSchema = \{[\s\S]*?\};/;
176
+ const schemaMatch = schemaRegex.exec(output);
177
+ expect(schemaMatch).not.toBeNull();
178
+ if (!schemaMatch)
179
+ throw new Error("Schema section not found");
180
+ const schemaSection = schemaMatch[0];
181
+ // Should have unquoted identifiers in schema type
182
+ expect(schemaSection).toContain("firstName: string;");
183
+ expect(schemaSection).toContain("_private: string;");
184
+ expect(schemaSection).toContain("$dollar: string;");
185
+ // Should NOT have quotes in the schema type section
186
+ expect(schemaSection).not.toContain('"firstName"');
187
+ expect(schemaSection).not.toContain('"_private"');
188
+ expect(schemaSection).not.toContain('"$dollar"');
189
+ });
190
+ });
191
+ describe("typed accessor generation", () => {
192
+ it("generates element tuple type", () => {
193
+ const cls = createDecoratedClassInfo({
194
+ name: "UserForm",
195
+ typeMetadata: {
196
+ name: createTypeMetadata({ type: "string" }),
197
+ age: createTypeMetadata({ type: "number", optional: true }),
198
+ },
199
+ });
200
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
201
+ expect(output).toContain("export type UserFormElements = readonly [");
202
+ expect(output).toContain('{ readonly _field: "text"; readonly id: "name"; readonly required: true }');
203
+ expect(output).toContain('{ readonly _field: "number"; readonly id: "age"; readonly required: false }');
204
+ });
205
+ it("generates enum options in element type", () => {
206
+ const cls = createDecoratedClassInfo({
207
+ name: "UserForm",
208
+ typeMetadata: {
209
+ status: createTypeMetadata({
210
+ type: "enum",
211
+ values: ["active", "inactive"],
212
+ }),
213
+ },
214
+ });
215
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
216
+ expect(output).toContain('readonly options: readonly ["active", "inactive"]');
217
+ });
218
+ it("generates FormSpec type alias", () => {
219
+ const cls = createDecoratedClassInfo({
220
+ name: "UserForm",
221
+ typeMetadata: {
222
+ name: createTypeMetadata({ type: "string" }),
223
+ },
224
+ });
225
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
226
+ expect(output).toContain("export type UserFormFormSpec = { readonly elements: UserFormElements };");
227
+ });
228
+ it("generates typed accessor function", () => {
229
+ const cls = createDecoratedClassInfo({
230
+ name: "UserForm",
231
+ typeMetadata: {
232
+ name: createTypeMetadata({ type: "string" }),
233
+ },
234
+ });
235
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
236
+ expect(output).toContain("export function getUserFormFormSpec(): UserFormFormSpec {");
237
+ expect(output).toContain("const types = (UserForm as any).__formspec_types__");
238
+ expect(output).toContain("return { elements: types } as unknown as UserFormFormSpec;");
239
+ });
240
+ });
241
+ describe("multiple classes", () => {
242
+ it("generates types for multiple classes", () => {
243
+ const classes = [
244
+ createDecoratedClassInfo({
245
+ name: "UserForm",
246
+ typeMetadata: { name: createTypeMetadata({ type: "string" }) },
247
+ }),
248
+ createDecoratedClassInfo({
249
+ name: "ProductForm",
250
+ sourcePath: "./product",
251
+ typeMetadata: { price: createTypeMetadata({ type: "number" }) },
252
+ }),
253
+ ];
254
+ const output = generateCodegenOutput(classes, "/tmp/out.ts", "/tmp");
255
+ expect(output).toContain("export type UserFormSchema = {");
256
+ expect(output).toContain("export type ProductFormSchema = {");
257
+ expect(output).toContain("export function getUserFormFormSpec()");
258
+ expect(output).toContain("export function getProductFormFormSpec()");
259
+ });
260
+ });
261
+ describe("edge cases", () => {
262
+ it("handles empty enum values array", () => {
263
+ const cls = createDecoratedClassInfo({
264
+ name: "TestForm",
265
+ typeMetadata: {
266
+ status: createTypeMetadata({ type: "enum", values: [] }),
267
+ },
268
+ });
269
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
270
+ // Should fall back to string type
271
+ expect(output).toContain("status: string;");
272
+ });
273
+ it("handles unknown type", () => {
274
+ const cls = createDecoratedClassInfo({
275
+ name: "TestForm",
276
+ typeMetadata: {
277
+ data: createTypeMetadata({ type: "unknown" }),
278
+ },
279
+ });
280
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
281
+ expect(output).toContain("data: unknown;");
282
+ });
283
+ it("handles array without itemType", () => {
284
+ const cls = createDecoratedClassInfo({
285
+ name: "TestForm",
286
+ typeMetadata: {
287
+ items: createTypeMetadata({ type: "array" }),
288
+ },
289
+ });
290
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
291
+ expect(output).toContain("items: unknown[];");
292
+ });
293
+ it("handles object without properties", () => {
294
+ const cls = createDecoratedClassInfo({
295
+ name: "TestForm",
296
+ typeMetadata: {
297
+ data: createTypeMetadata({ type: "object" }),
298
+ },
299
+ });
300
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
301
+ expect(output).toContain("data: Record<string, unknown>;");
302
+ });
303
+ it("handles number enum values", () => {
304
+ const cls = createDecoratedClassInfo({
305
+ name: "TestForm",
306
+ typeMetadata: {
307
+ priority: createTypeMetadata({
308
+ type: "enum",
309
+ values: [1, 2, 3],
310
+ }),
311
+ },
312
+ });
313
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
314
+ expect(output).toContain("priority: 1 | 2 | 3;");
315
+ });
316
+ it("handles enum values with special characters (quotes, backslashes)", () => {
317
+ const cls = createDecoratedClassInfo({
318
+ name: "TestForm",
319
+ typeMetadata: {
320
+ weird: createTypeMetadata({
321
+ type: "enum",
322
+ values: ['foo"bar', "back\\slash", "new\nline"],
323
+ }),
324
+ },
325
+ });
326
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
327
+ // JSON.stringify escapes these properly
328
+ expect(output).toContain('"foo\\"bar"');
329
+ expect(output).toContain('"back\\\\slash"');
330
+ expect(output).toContain('"new\\nline"');
331
+ });
332
+ it("handles property names with special characters (quotes, newlines)", () => {
333
+ const cls = createDecoratedClassInfo({
334
+ name: "TestForm",
335
+ typeMetadata: {
336
+ 'key"with"quotes': createTypeMetadata({ type: "string" }),
337
+ "key\nwith\nnewlines": createTypeMetadata({ type: "string" }),
338
+ },
339
+ });
340
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
341
+ // JSON.stringify escapes these properly
342
+ expect(output).toContain('"key\\"with\\"quotes": string;');
343
+ expect(output).toContain('"key\\nwith\\nnewlines": string;');
344
+ });
345
+ it("escapes additional reserved words (async, await, null, true, false)", () => {
346
+ const cls = createDecoratedClassInfo({
347
+ name: "TestForm",
348
+ typeMetadata: {
349
+ async: createTypeMetadata({ type: "string" }),
350
+ await: createTypeMetadata({ type: "string" }),
351
+ null: createTypeMetadata({ type: "string" }),
352
+ true: createTypeMetadata({ type: "boolean" }),
353
+ get: createTypeMetadata({ type: "string" }),
354
+ },
355
+ });
356
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
357
+ // Extract just the schema type section
358
+ const schemaRegex = /export type TestFormSchema = \{[\s\S]*?\};/;
359
+ const schemaMatch = schemaRegex.exec(output);
360
+ expect(schemaMatch).not.toBeNull();
361
+ if (!schemaMatch)
362
+ throw new Error("Schema section not found");
363
+ const schemaSection = schemaMatch[0];
364
+ expect(schemaSection).toContain('"async": string;');
365
+ expect(schemaSection).toContain('"await": string;');
366
+ expect(schemaSection).toContain('"null": string;');
367
+ expect(schemaSection).toContain('"true": boolean;');
368
+ expect(schemaSection).toContain('"get": string;');
369
+ });
370
+ it("handles deeply nested objects (3+ levels)", () => {
371
+ const cls = createDecoratedClassInfo({
372
+ name: "NestedForm",
373
+ typeMetadata: {
374
+ data: createTypeMetadata({
375
+ type: "object",
376
+ properties: {
377
+ level1: {
378
+ type: "object",
379
+ properties: {
380
+ level2: {
381
+ type: "object",
382
+ properties: {
383
+ value: { type: "string" },
384
+ },
385
+ },
386
+ },
387
+ },
388
+ },
389
+ }),
390
+ },
391
+ });
392
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
393
+ expect(output).toContain("data: { level1: { level2: { value: string } } };");
394
+ });
395
+ it("handles arrays of objects with nested properties", () => {
396
+ const cls = createDecoratedClassInfo({
397
+ name: "ArrayForm",
398
+ typeMetadata: {
399
+ items: createTypeMetadata({
400
+ type: "array",
401
+ itemType: {
402
+ type: "object",
403
+ properties: {
404
+ nested: {
405
+ type: "object",
406
+ properties: {
407
+ value: { type: "number" },
408
+ },
409
+ },
410
+ },
411
+ },
412
+ }),
413
+ },
414
+ });
415
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
416
+ expect(output).toContain("items: { nested: { value: number } }[];");
417
+ });
418
+ });
419
+ describe("negative tests and error handling", () => {
420
+ it("handles empty class list", () => {
421
+ const output = generateCodegenOutput([], "/tmp/out.ts", "/tmp");
422
+ // Should still generate valid structure with no class-specific code
423
+ expect(output).toContain("Auto-generated by FormSpec CLI");
424
+ expect(output).toContain("// Type Metadata Patches");
425
+ expect(output).toContain("// Inferred Schema Types");
426
+ });
427
+ it("handles class with no fields", () => {
428
+ const cls = createDecoratedClassInfo({
429
+ name: "EmptyForm",
430
+ typeMetadata: {},
431
+ });
432
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
433
+ // Should generate empty schema type
434
+ expect(output).toContain("export type EmptyFormSchema = {");
435
+ // Elements should be empty tuple
436
+ expect(output).toContain("export type EmptyFormElements = readonly [");
437
+ });
438
+ it("handles optional nullable array of objects", () => {
439
+ const cls = createDecoratedClassInfo({
440
+ name: "ComplexForm",
441
+ typeMetadata: {
442
+ items: createTypeMetadata({
443
+ type: "array",
444
+ optional: true,
445
+ nullable: true,
446
+ itemType: {
447
+ type: "object",
448
+ properties: {
449
+ id: { type: "string" },
450
+ },
451
+ },
452
+ }),
453
+ },
454
+ });
455
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
456
+ expect(output).toContain("items?: { id: string }[] | null | undefined;");
457
+ });
458
+ });
459
+ describe("unexported class detection", () => {
460
+ it("should track isExported status", () => {
461
+ const exportedClass = createDecoratedClassInfo({
462
+ name: "ExportedForm",
463
+ isExported: true,
464
+ typeMetadata: { name: createTypeMetadata({ type: "string" }) },
465
+ });
466
+ const unexportedClass = createDecoratedClassInfo({
467
+ name: "UnexportedForm",
468
+ isExported: false,
469
+ typeMetadata: { name: createTypeMetadata({ type: "string" }) },
470
+ });
471
+ expect(exportedClass.isExported).toBe(true);
472
+ expect(unexportedClass.isExported).toBe(false);
473
+ });
474
+ });
475
+ describe("imports and structure", () => {
476
+ it("imports decorated classes from source files", () => {
477
+ const cls = createDecoratedClassInfo({
478
+ name: "TestForm",
479
+ sourcePath: "./test-form",
480
+ typeMetadata: { name: createTypeMetadata({ type: "string" }) },
481
+ });
482
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
483
+ expect(output).toContain('import { TestForm } from "./test-form.js";');
484
+ });
485
+ it("includes section separators", () => {
486
+ const cls = createDecoratedClassInfo({
487
+ name: "TestForm",
488
+ typeMetadata: { name: createTypeMetadata({ type: "string" }) },
489
+ });
490
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
491
+ expect(output).toContain("// Type Metadata Patches");
492
+ expect(output).toContain("// Inferred Schema Types");
493
+ expect(output).toContain("// Type-Safe FormSpec Accessors");
494
+ });
495
+ it("includes header comment with usage instructions", () => {
496
+ const cls = createDecoratedClassInfo({
497
+ name: "TestForm",
498
+ typeMetadata: { name: createTypeMetadata({ type: "string" }) },
499
+ });
500
+ const output = generateCodegenOutput([cls], "/tmp/out.ts", "/tmp");
501
+ expect(output).toContain("Auto-generated by FormSpec CLI");
502
+ expect(output).toContain("DO NOT EDIT");
503
+ });
504
+ });
505
+ });
506
+ //# sourceMappingURL=codegen.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.test.js","sourceRoot":"","sources":["../../src/__tests__/codegen.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Integration tests for the decorated class -> static analysis -> JSON Schema pipeline.
3
+ *
4
+ * Tests the full pipeline: decorated TypeScript class -> analyzeClass -> generateClassSchemas
5
+ * -> JSON Schema + UI Schema output, including extended and custom decorator support.
6
+ *
7
+ * @see packages/decorators/src/index.ts for decorator definitions
8
+ * @see packages/build/src/analyzer/decorator-extractor.ts for brand resolution
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=decorator-pipeline.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorator-pipeline.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/decorator-pipeline.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}