@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
package/README.md ADDED
@@ -0,0 +1,138 @@
1
+ # @formspec/build
2
+
3
+ Build tools to compile FormSpec forms into JSON Schema and JSON Forms UI Schema.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @formspec/build
9
+ # or
10
+ pnpm add @formspec/build
11
+ ```
12
+
13
+ > **Note:** Most users should install the `formspec` umbrella package instead, which re-exports everything from this package.
14
+
15
+ ## Requirements
16
+
17
+ This package is ESM-only and requires:
18
+
19
+ ```json
20
+ // package.json
21
+ {
22
+ "type": "module"
23
+ }
24
+ ```
25
+
26
+ ```json
27
+ // tsconfig.json
28
+ {
29
+ "compilerOptions": {
30
+ "module": "NodeNext",
31
+ "moduleResolution": "NodeNext"
32
+ }
33
+ }
34
+ ```
35
+
36
+ ## Usage
37
+
38
+ ### Generate Schemas in Memory
39
+
40
+ ```typescript
41
+ import { buildFormSchemas } from "@formspec/build";
42
+ import { formspec, field, group } from "@formspec/dsl";
43
+
44
+ const ContactForm = formspec(
45
+ field.text("name", { label: "Name", required: true }),
46
+ field.text("email", { label: "Email", required: true }),
47
+ field.enum("subject", ["General", "Support", "Sales"])
48
+ );
49
+
50
+ const { jsonSchema, uiSchema } = buildFormSchemas(ContactForm);
51
+
52
+ // Use with JSON Forms renderer
53
+ // <JsonForms schema={jsonSchema} uischema={uiSchema} data={formData} />
54
+ ```
55
+
56
+ ### Write Schemas to Disk
57
+
58
+ ```typescript
59
+ import { writeSchemas } from "@formspec/build";
60
+
61
+ const result = writeSchemas(ContactForm, {
62
+ outDir: "./generated",
63
+ name: "contact-form",
64
+ indent: 2,
65
+ });
66
+
67
+ console.log(`JSON Schema: ${result.jsonSchemaPath}`);
68
+ console.log(`UI Schema: ${result.uiSchemaPath}`);
69
+ // JSON Schema: ./generated/contact-form-schema.json
70
+ // UI Schema: ./generated/contact-form-uischema.json
71
+ ```
72
+
73
+ ### Use Individual Generators
74
+
75
+ ```typescript
76
+ import { generateJsonSchema, generateUiSchema } from "@formspec/build";
77
+
78
+ const jsonSchema = generateJsonSchema(ContactForm);
79
+ const uiSchema = generateUiSchema(ContactForm);
80
+ ```
81
+
82
+ ## Generated Output
83
+
84
+ ### JSON Schema (Draft-07)
85
+
86
+ ```json
87
+ {
88
+ "$schema": "https://json-schema.org/draft-07/schema#",
89
+ "type": "object",
90
+ "properties": {
91
+ "name": { "type": "string", "title": "Name" },
92
+ "email": { "type": "string", "title": "Email" },
93
+ "subject": {
94
+ "type": "string",
95
+ "enum": ["General", "Support", "Sales"]
96
+ }
97
+ },
98
+ "required": ["name", "email"]
99
+ }
100
+ ```
101
+
102
+ ### JSON Forms UI Schema
103
+
104
+ ```json
105
+ {
106
+ "type": "VerticalLayout",
107
+ "elements": [
108
+ { "type": "Control", "scope": "#/properties/name", "label": "Name" },
109
+ { "type": "Control", "scope": "#/properties/email", "label": "Email" },
110
+ { "type": "Control", "scope": "#/properties/subject" }
111
+ ]
112
+ }
113
+ ```
114
+
115
+ ## API Reference
116
+
117
+ ### Functions
118
+
119
+ | Function | Description |
120
+ | ----------------------------- | --------------------------------------- |
121
+ | `buildFormSchemas(form)` | Generate both JSON Schema and UI Schema |
122
+ | `generateJsonSchema(form)` | Generate only JSON Schema |
123
+ | `generateUiSchema(form)` | Generate only UI Schema |
124
+ | `writeSchemas(form, options)` | Build and write schemas to disk |
125
+
126
+ ### Types
127
+
128
+ | Type | Description |
129
+ | --------------------- | --------------------------------- |
130
+ | `BuildResult` | Return type of `buildFormSchemas` |
131
+ | `WriteSchemasOptions` | Options for `writeSchemas` |
132
+ | `WriteSchemasResult` | Return type of `writeSchemas` |
133
+ | `JSONSchema7` | JSON Schema Draft-07 type |
134
+ | `UISchema` | JSON Forms UI Schema type |
135
+
136
+ ## License
137
+
138
+ UNLICENSED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Edge case and negative tests for analysis and generation components.
3
+ *
4
+ * Tests cover:
5
+ * - Complex union types
6
+ * - Nullable and optional patterns
7
+ * - Array edge cases
8
+ * - Object edge cases
9
+ * - Decorator extractor edge cases
10
+ * - Program context error handling
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=analyzer-edge-cases.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer-edge-cases.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/analyzer-edge-cases.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,376 @@
1
+ /**
2
+ * Edge case and negative tests for analysis and generation components.
3
+ *
4
+ * Tests cover:
5
+ * - Complex union types
6
+ * - Nullable and optional patterns
7
+ * - Array edge cases
8
+ * - Object edge cases
9
+ * - Decorator extractor edge cases
10
+ * - Program context error handling
11
+ */
12
+ import { describe, it, expect } from "vitest";
13
+ import * as path from "node:path";
14
+ import { createProgramContext, findClassByName } from "../analyzer/program.js";
15
+ import { analyzeClass } from "../analyzer/class-analyzer.js";
16
+ import { convertType } from "../analyzer/type-converter.js";
17
+ const fixturesDir = path.join(__dirname, "fixtures");
18
+ const edgeCasesPath = path.join(fixturesDir, "edge-cases.ts");
19
+ // ============================================================================
20
+ // Type Converter Edge Cases
21
+ // ============================================================================
22
+ describe("convertType - complex unions", () => {
23
+ it("handles string | number union as oneOf", () => {
24
+ const ctx = createProgramContext(edgeCasesPath);
25
+ const classDecl = findClassByName(ctx.sourceFile, "MixedUnionTypes");
26
+ if (!classDecl)
27
+ throw new Error("MixedUnionTypes class not found");
28
+ const analysis = analyzeClass(classDecl, ctx.checker);
29
+ const field = analysis.fields.find((f) => f.name === "mixedPrimitive");
30
+ if (!field)
31
+ throw new Error("mixedPrimitive field not found");
32
+ const result = convertType(field.type, ctx.checker);
33
+ expect(result.formSpecFieldType).toBe("union");
34
+ expect(result.jsonSchema.oneOf).toBeDefined();
35
+ expect(result.jsonSchema.oneOf).toHaveLength(2);
36
+ });
37
+ it("handles complex union with object and primitive", () => {
38
+ const ctx = createProgramContext(edgeCasesPath);
39
+ const classDecl = findClassByName(ctx.sourceFile, "MixedUnionTypes");
40
+ if (!classDecl)
41
+ throw new Error("MixedUnionTypes class not found");
42
+ const analysis = analyzeClass(classDecl, ctx.checker);
43
+ const field = analysis.fields.find((f) => f.name === "complexUnion");
44
+ if (!field)
45
+ throw new Error("complexUnion field not found");
46
+ const result = convertType(field.type, ctx.checker);
47
+ expect(result.formSpecFieldType).toBe("union");
48
+ expect(result.jsonSchema.oneOf).toBeDefined();
49
+ });
50
+ it("handles discriminated union (object union)", () => {
51
+ const ctx = createProgramContext(edgeCasesPath);
52
+ const classDecl = findClassByName(ctx.sourceFile, "MixedUnionTypes");
53
+ if (!classDecl)
54
+ throw new Error("MixedUnionTypes class not found");
55
+ const analysis = analyzeClass(classDecl, ctx.checker);
56
+ const field = analysis.fields.find((f) => f.name === "objectUnion");
57
+ if (!field)
58
+ throw new Error("objectUnion field not found");
59
+ const result = convertType(field.type, ctx.checker);
60
+ expect(result.formSpecFieldType).toBe("union");
61
+ expect(result.jsonSchema.oneOf).toHaveLength(2);
62
+ });
63
+ });
64
+ describe("convertType - nullable patterns", () => {
65
+ it("handles T | null as oneOf with null", () => {
66
+ const ctx = createProgramContext(edgeCasesPath);
67
+ const classDecl = findClassByName(ctx.sourceFile, "NullablePatterns");
68
+ if (!classDecl)
69
+ throw new Error("NullablePatterns class not found");
70
+ const analysis = analyzeClass(classDecl, ctx.checker);
71
+ const field = analysis.fields.find((f) => f.name === "nullableString");
72
+ if (!field)
73
+ throw new Error("nullableString field not found");
74
+ const result = convertType(field.type, ctx.checker);
75
+ expect(result.jsonSchema.oneOf).toBeDefined();
76
+ if (!result.jsonSchema.oneOf)
77
+ throw new Error("oneOf not defined");
78
+ const types = result.jsonSchema.oneOf.map((s) => s.type);
79
+ expect(types).toContain("string");
80
+ expect(types).toContain("null");
81
+ });
82
+ it("handles T | undefined (filters out undefined)", () => {
83
+ const ctx = createProgramContext(edgeCasesPath);
84
+ const classDecl = findClassByName(ctx.sourceFile, "NullablePatterns");
85
+ if (!classDecl)
86
+ throw new Error("NullablePatterns class not found");
87
+ const analysis = analyzeClass(classDecl, ctx.checker);
88
+ const field = analysis.fields.find((f) => f.name === "undefinedString");
89
+ if (!field)
90
+ throw new Error("undefinedString field not found");
91
+ const result = convertType(field.type, ctx.checker);
92
+ expect(result.jsonSchema.type).toBe("string");
93
+ expect(result.formSpecFieldType).toBe("text");
94
+ });
95
+ it("handles nullable enum", () => {
96
+ const ctx = createProgramContext(edgeCasesPath);
97
+ const classDecl = findClassByName(ctx.sourceFile, "NullablePatterns");
98
+ if (!classDecl)
99
+ throw new Error("NullablePatterns class not found");
100
+ const analysis = analyzeClass(classDecl, ctx.checker);
101
+ const field = analysis.fields.find((f) => f.name === "nullableStatus");
102
+ if (!field)
103
+ throw new Error("nullableStatus field not found");
104
+ const result = convertType(field.type, ctx.checker);
105
+ expect(result.jsonSchema.oneOf).toBeDefined();
106
+ if (!result.jsonSchema.oneOf)
107
+ throw new Error("oneOf not defined");
108
+ const hasEnum = result.jsonSchema.oneOf.some((s) => s.enum !== undefined);
109
+ const hasNull = result.jsonSchema.oneOf.some((s) => s.type === "null");
110
+ expect(hasEnum).toBe(true);
111
+ expect(hasNull).toBe(true);
112
+ });
113
+ it("handles T | null | undefined", () => {
114
+ const ctx = createProgramContext(edgeCasesPath);
115
+ const classDecl = findClassByName(ctx.sourceFile, "NullablePatterns");
116
+ if (!classDecl)
117
+ throw new Error("NullablePatterns class not found");
118
+ const analysis = analyzeClass(classDecl, ctx.checker);
119
+ const field = analysis.fields.find((f) => f.name === "tripleUnion");
120
+ if (!field)
121
+ throw new Error("tripleUnion field not found");
122
+ const result = convertType(field.type, ctx.checker);
123
+ expect(result.jsonSchema.oneOf).toBeDefined();
124
+ if (!result.jsonSchema.oneOf)
125
+ throw new Error("oneOf not defined");
126
+ const types = result.jsonSchema.oneOf.map((s) => s.type);
127
+ expect(types).toContain("string");
128
+ expect(types).toContain("null");
129
+ expect(types).not.toContain("undefined");
130
+ });
131
+ });
132
+ describe("convertType - array edge cases", () => {
133
+ it("handles array of unions", () => {
134
+ const ctx = createProgramContext(edgeCasesPath);
135
+ const classDecl = findClassByName(ctx.sourceFile, "ArrayEdgeCases");
136
+ if (!classDecl)
137
+ throw new Error("ArrayEdgeCases class not found");
138
+ const analysis = analyzeClass(classDecl, ctx.checker);
139
+ const field = analysis.fields.find((f) => f.name === "mixedArray");
140
+ if (!field)
141
+ throw new Error("mixedArray field not found");
142
+ const result = convertType(field.type, ctx.checker);
143
+ expect(result.jsonSchema.type).toBe("array");
144
+ // convertType always produces a single items schema, not a tuple
145
+ const items = result.jsonSchema.items;
146
+ expect(items?.oneOf).toBeDefined();
147
+ });
148
+ it("handles nullable array", () => {
149
+ const ctx = createProgramContext(edgeCasesPath);
150
+ const classDecl = findClassByName(ctx.sourceFile, "ArrayEdgeCases");
151
+ if (!classDecl)
152
+ throw new Error("ArrayEdgeCases class not found");
153
+ const analysis = analyzeClass(classDecl, ctx.checker);
154
+ const field = analysis.fields.find((f) => f.name === "nullableArray");
155
+ if (!field)
156
+ throw new Error("nullableArray field not found");
157
+ const result = convertType(field.type, ctx.checker);
158
+ expect(result.jsonSchema.oneOf).toBeDefined();
159
+ });
160
+ it("handles array of objects", () => {
161
+ const ctx = createProgramContext(edgeCasesPath);
162
+ const classDecl = findClassByName(ctx.sourceFile, "ArrayEdgeCases");
163
+ if (!classDecl)
164
+ throw new Error("ArrayEdgeCases class not found");
165
+ const analysis = analyzeClass(classDecl, ctx.checker);
166
+ const field = analysis.fields.find((f) => f.name === "objectArray");
167
+ if (!field)
168
+ throw new Error("objectArray field not found");
169
+ const result = convertType(field.type, ctx.checker);
170
+ expect(result.jsonSchema.type).toBe("array");
171
+ // convertType always produces a single items schema, not a tuple
172
+ const items = result.jsonSchema.items;
173
+ expect(items?.type).toBe("object");
174
+ expect(items?.properties).toBeDefined();
175
+ });
176
+ it("handles nested arrays", () => {
177
+ const ctx = createProgramContext(edgeCasesPath);
178
+ const classDecl = findClassByName(ctx.sourceFile, "ArrayEdgeCases");
179
+ if (!classDecl)
180
+ throw new Error("ArrayEdgeCases class not found");
181
+ const analysis = analyzeClass(classDecl, ctx.checker);
182
+ const field = analysis.fields.find((f) => f.name === "nestedArray");
183
+ if (!field)
184
+ throw new Error("nestedArray field not found");
185
+ const result = convertType(field.type, ctx.checker);
186
+ expect(result.jsonSchema.type).toBe("array");
187
+ // convertType always produces a single items schema, not a tuple
188
+ const items = result.jsonSchema.items;
189
+ expect(items?.type).toBe("array");
190
+ const nestedItems = items?.items;
191
+ expect(nestedItems?.type).toBe("string");
192
+ });
193
+ });
194
+ describe("convertType - object edge cases", () => {
195
+ it("handles empty object", () => {
196
+ const ctx = createProgramContext(edgeCasesPath);
197
+ const classDecl = findClassByName(ctx.sourceFile, "ObjectEdgeCases");
198
+ if (!classDecl)
199
+ throw new Error("ObjectEdgeCases class not found");
200
+ const analysis = analyzeClass(classDecl, ctx.checker);
201
+ const field = analysis.fields.find((f) => f.name === "emptyObject");
202
+ if (!field)
203
+ throw new Error("emptyObject field not found");
204
+ const result = convertType(field.type, ctx.checker);
205
+ expect(result.jsonSchema.type).toBe("object");
206
+ expect(result.jsonSchema.properties).toEqual({});
207
+ });
208
+ it("handles deeply nested object", () => {
209
+ const ctx = createProgramContext(edgeCasesPath);
210
+ const classDecl = findClassByName(ctx.sourceFile, "ObjectEdgeCases");
211
+ if (!classDecl)
212
+ throw new Error("ObjectEdgeCases class not found");
213
+ const analysis = analyzeClass(classDecl, ctx.checker);
214
+ const field = analysis.fields.find((f) => f.name === "deepNested");
215
+ if (!field)
216
+ throw new Error("deepNested field not found");
217
+ const result = convertType(field.type, ctx.checker);
218
+ expect(result.jsonSchema.type).toBe("object");
219
+ expect(result.jsonSchema.properties?.["level1"]?.properties?.["level2"]).toBeDefined();
220
+ });
221
+ it("handles object with optional properties", () => {
222
+ const ctx = createProgramContext(edgeCasesPath);
223
+ const classDecl = findClassByName(ctx.sourceFile, "ObjectEdgeCases");
224
+ if (!classDecl)
225
+ throw new Error("ObjectEdgeCases class not found");
226
+ const analysis = analyzeClass(classDecl, ctx.checker);
227
+ const field = analysis.fields.find((f) => f.name === "optionalProps");
228
+ if (!field)
229
+ throw new Error("optionalProps field not found");
230
+ const result = convertType(field.type, ctx.checker);
231
+ expect(result.jsonSchema.type).toBe("object");
232
+ expect(result.jsonSchema.required).toContain("required");
233
+ expect(result.jsonSchema.required).not.toContain("optional");
234
+ });
235
+ });
236
+ describe("convertType - special types", () => {
237
+ it("handles any type gracefully", () => {
238
+ const ctx = createProgramContext(edgeCasesPath);
239
+ const classDecl = findClassByName(ctx.sourceFile, "SpecialTypes");
240
+ if (!classDecl)
241
+ throw new Error("SpecialTypes class not found");
242
+ const analysis = analyzeClass(classDecl, ctx.checker);
243
+ const field = analysis.fields.find((f) => f.name === "anyField");
244
+ if (!field)
245
+ throw new Error("anyField field not found");
246
+ const result = convertType(field.type, ctx.checker);
247
+ expect(result.formSpecFieldType).toBeDefined();
248
+ });
249
+ it("handles unknown type gracefully", () => {
250
+ const ctx = createProgramContext(edgeCasesPath);
251
+ const classDecl = findClassByName(ctx.sourceFile, "SpecialTypes");
252
+ if (!classDecl)
253
+ throw new Error("SpecialTypes class not found");
254
+ const analysis = analyzeClass(classDecl, ctx.checker);
255
+ const field = analysis.fields.find((f) => f.name === "unknownField");
256
+ if (!field)
257
+ throw new Error("unknownField field not found");
258
+ const result = convertType(field.type, ctx.checker);
259
+ expect(result.formSpecFieldType).toBeDefined();
260
+ });
261
+ });
262
+ describe("convertType - enum variations", () => {
263
+ it("handles single literal as enum with one value", () => {
264
+ const ctx = createProgramContext(edgeCasesPath);
265
+ const classDecl = findClassByName(ctx.sourceFile, "EnumVariations");
266
+ if (!classDecl)
267
+ throw new Error("EnumVariations class not found");
268
+ const analysis = analyzeClass(classDecl, ctx.checker);
269
+ const field = analysis.fields.find((f) => f.name === "singleLiteral");
270
+ if (!field)
271
+ throw new Error("singleLiteral field not found");
272
+ const result = convertType(field.type, ctx.checker);
273
+ expect(result.jsonSchema.const).toBe("only");
274
+ });
275
+ it("handles number literal enum", () => {
276
+ const ctx = createProgramContext(edgeCasesPath);
277
+ const classDecl = findClassByName(ctx.sourceFile, "EnumVariations");
278
+ if (!classDecl)
279
+ throw new Error("EnumVariations class not found");
280
+ const analysis = analyzeClass(classDecl, ctx.checker);
281
+ const field = analysis.fields.find((f) => f.name === "numberEnum");
282
+ if (!field)
283
+ throw new Error("numberEnum field not found");
284
+ const result = convertType(field.type, ctx.checker);
285
+ expect(result.jsonSchema.enum).toEqual([1, 2, 3]);
286
+ expect(result.formSpecFieldType).toBe("enum");
287
+ });
288
+ it("handles mixed literal types as union", () => {
289
+ const ctx = createProgramContext(edgeCasesPath);
290
+ const classDecl = findClassByName(ctx.sourceFile, "EnumVariations");
291
+ if (!classDecl)
292
+ throw new Error("EnumVariations class not found");
293
+ const analysis = analyzeClass(classDecl, ctx.checker);
294
+ const field = analysis.fields.find((f) => f.name === "mixedLiterals");
295
+ if (!field)
296
+ throw new Error("mixedLiterals field not found");
297
+ const result = convertType(field.type, ctx.checker);
298
+ expect(result.formSpecFieldType).toBe("union");
299
+ expect(result.jsonSchema.oneOf).toBeDefined();
300
+ });
301
+ it("handles large enum", () => {
302
+ const ctx = createProgramContext(edgeCasesPath);
303
+ const classDecl = findClassByName(ctx.sourceFile, "EnumVariations");
304
+ if (!classDecl)
305
+ throw new Error("EnumVariations class not found");
306
+ const analysis = analyzeClass(classDecl, ctx.checker);
307
+ const field = analysis.fields.find((f) => f.name === "largeEnum");
308
+ if (!field)
309
+ throw new Error("largeEnum field not found");
310
+ const result = convertType(field.type, ctx.checker);
311
+ expect(result.jsonSchema.enum).toHaveLength(10);
312
+ expect(result.formSpecFieldType).toBe("enum");
313
+ });
314
+ });
315
+ // ============================================================================
316
+ // Decorator Extractor Edge Cases
317
+ // ============================================================================
318
+ describe("extractDecorators - edge cases", () => {
319
+ it("handles class with no decorated properties", () => {
320
+ const ctx = createProgramContext(edgeCasesPath);
321
+ const classDecl = findClassByName(ctx.sourceFile, "MixedUnionTypes");
322
+ if (!classDecl)
323
+ throw new Error("MixedUnionTypes class not found");
324
+ const analysis = analyzeClass(classDecl, ctx.checker);
325
+ for (const field of analysis.fields) {
326
+ expect(field.decorators).toEqual([]);
327
+ }
328
+ });
329
+ it("handles class explicitly without decorators", () => {
330
+ const ctx = createProgramContext(edgeCasesPath);
331
+ const classDecl = findClassByName(ctx.sourceFile, "NoDecoratorsClass");
332
+ if (!classDecl)
333
+ throw new Error("NoDecoratorsClass class not found");
334
+ const analysis = analyzeClass(classDecl, ctx.checker);
335
+ expect(analysis.fields).toHaveLength(3);
336
+ for (const field of analysis.fields) {
337
+ expect(field.decorators).toEqual([]);
338
+ }
339
+ });
340
+ it("correctly detects optional vs required fields without decorators", () => {
341
+ const ctx = createProgramContext(edgeCasesPath);
342
+ const classDecl = findClassByName(ctx.sourceFile, "NoDecoratorsClass");
343
+ if (!classDecl)
344
+ throw new Error("NoDecoratorsClass class not found");
345
+ const analysis = analyzeClass(classDecl, ctx.checker);
346
+ const nameField = analysis.fields.find((f) => f.name === "name");
347
+ if (!nameField)
348
+ throw new Error("name field not found");
349
+ const countField = analysis.fields.find((f) => f.name === "count");
350
+ if (!countField)
351
+ throw new Error("count field not found");
352
+ const activeField = analysis.fields.find((f) => f.name === "active");
353
+ if (!activeField)
354
+ throw new Error("active field not found");
355
+ expect(nameField.optional).toBe(false);
356
+ expect(countField.optional).toBe(true);
357
+ expect(activeField.optional).toBe(false);
358
+ });
359
+ });
360
+ // ============================================================================
361
+ // Program Context Error Handling
362
+ // ============================================================================
363
+ describe("createProgramContext - error handling", () => {
364
+ it("throws for non-existent file", () => {
365
+ expect(() => createProgramContext("/non/existent/path.ts")).toThrow();
366
+ });
367
+ it("throws for directory path", () => {
368
+ expect(() => createProgramContext(fixturesDir)).toThrow();
369
+ });
370
+ it("handles file with TypeScript errors gracefully", () => {
371
+ const ctx = createProgramContext(edgeCasesPath);
372
+ expect(ctx.program).toBeDefined();
373
+ expect(ctx.checker).toBeDefined();
374
+ });
375
+ });
376
+ //# sourceMappingURL=analyzer-edge-cases.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer-edge-cases.test.js","sourceRoot":"","sources":["../../src/__tests__/analyzer-edge-cases.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Unit tests for the analyzer module.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=analyzer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/analyzer.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}