@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,460 +0,0 @@
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
- import { describe, it, expect } from "vitest";
11
- import * as path from "node:path";
12
- import { generateSchemasFromClass } from "../generators/class-schema.js";
13
- import { getSchemaExtension } from "../json-schema/types.js";
14
- const fixturesDir = path.join(__dirname, "fixtures");
15
- describe("Decorator Pipeline Integration", () => {
16
- describe("Example A: Built-in decorators", () => {
17
- it("should generate correct JSON Schema from built-in decorators", () => {
18
- const result = generateSchemasFromClass({
19
- filePath: path.join(fixturesDir, "example-a-builtins.ts"),
20
- className: "ExampleAForm",
21
- });
22
- const { jsonSchema } = result;
23
- // Top-level structure
24
- expect(jsonSchema.type).toBe("object");
25
- expect(jsonSchema.required).toContain("name");
26
- expect(jsonSchema.required).toContain("age");
27
- expect(jsonSchema.required).toContain("score");
28
- expect(jsonSchema.required).toContain("country");
29
- expect(jsonSchema.required).not.toContain("email");
30
- expect(jsonSchema.required).not.toContain("state");
31
- expect(jsonSchema.required).not.toContain("fax");
32
- // name: string constraints
33
- const nameSchema = jsonSchema.properties?.["name"];
34
- expect(nameSchema).toMatchObject({
35
- type: "string",
36
- title: "Full Name",
37
- description: "Your legal name",
38
- minLength: 2,
39
- maxLength: 100,
40
- });
41
- // age: numeric constraints
42
- const ageSchema = jsonSchema.properties?.["age"];
43
- expect(ageSchema).toMatchObject({
44
- type: "number",
45
- title: "Age",
46
- minimum: 0,
47
- maximum: 150,
48
- });
49
- // score: exclusive minimum
50
- const scoreSchema = jsonSchema.properties?.["score"];
51
- expect(scoreSchema).toMatchObject({
52
- type: "number",
53
- title: "Score",
54
- exclusiveMinimum: 0,
55
- });
56
- // email: optional, pattern
57
- const emailSchema = jsonSchema.properties?.["email"];
58
- expect(emailSchema).toMatchObject({
59
- type: "string",
60
- title: "Email",
61
- pattern: "^[^@]+@[^@]+$",
62
- });
63
- // country: enum
64
- const countrySchema = jsonSchema.properties?.["country"];
65
- expect(countrySchema?.enum).toEqual(["us", "ca"]);
66
- expect(countrySchema?.title).toBe("Country");
67
- // deprecated field
68
- const faxSchema = jsonSchema.properties?.["fax"];
69
- expect(faxSchema?.deprecated).toBe(true);
70
- expect(faxSchema?.title).toBe("Fax Number");
71
- // default value
72
- const roleSchema = jsonSchema.properties?.["role"];
73
- expect(roleSchema?.default).toBe("user");
74
- expect(roleSchema?.title).toBe("Role");
75
- });
76
- it("should generate correct uiSchema from built-in decorators", () => {
77
- const result = generateSchemasFromClass({
78
- filePath: path.join(fixturesDir, "example-a-builtins.ts"),
79
- className: "ExampleAForm",
80
- });
81
- const { uiSchema } = result;
82
- const elements = uiSchema.elements;
83
- // name: label, description, required, string constraints
84
- const nameField = elements.find((e) => e.id === "name");
85
- expect(nameField).toMatchObject({
86
- _field: "text",
87
- id: "name",
88
- label: "Full Name",
89
- description: "Your legal name",
90
- required: true,
91
- minLength: 2,
92
- maxLength: 100,
93
- });
94
- // age: label, required, numeric constraints
95
- const ageField = elements.find((e) => e.id === "age");
96
- expect(ageField).toMatchObject({
97
- _field: "number",
98
- id: "age",
99
- label: "Age",
100
- required: true,
101
- min: 0,
102
- max: 150,
103
- });
104
- // email: optional (no required property)
105
- const emailField = elements.find((e) => e.id === "email");
106
- expect(emailField?.pattern).toBe("^[^@]+@[^@]+$");
107
- expect(emailField?.required).toBeUndefined();
108
- // country: group assignment and enum options
109
- const countryField = elements.find((e) => e.id === "country");
110
- expect(countryField?.group).toBe("Preferences");
111
- expect(countryField?.options).toEqual([
112
- { id: "us", label: "United States" },
113
- { id: "ca", label: "Canada" },
114
- ]);
115
- // state: showWhen condition
116
- const stateField = elements.find((e) => e.id === "state");
117
- expect(stateField?.showWhen).toEqual({ field: "country", value: "us" });
118
- });
119
- });
120
- describe("Example B: Extended decorators", () => {
121
- it("should map extended decorators to their built-in equivalents in JSON Schema", () => {
122
- const result = generateSchemasFromClass({
123
- filePath: path.join(fixturesDir, "example-b-extended.ts"),
124
- className: "ExampleBForm",
125
- });
126
- const { jsonSchema } = result;
127
- // amount: should have Field metadata + Minimum/Maximum from Floor/Ceiling
128
- const amountSchema = jsonSchema.properties?.["amount"];
129
- expect(amountSchema).toMatchObject({
130
- type: "number",
131
- title: "Amount",
132
- description: "Total amount in cents",
133
- minimum: 0,
134
- maximum: 1000000,
135
- });
136
- // label: should have Field metadata
137
- const labelSchema = jsonSchema.properties?.["label"];
138
- expect(labelSchema).toMatchObject({
139
- type: "string",
140
- title: "Label",
141
- });
142
- // No x-formspec-* extensions should be present (extended decorators map to built-ins)
143
- const amountKeys = Object.keys(amountSchema ?? {});
144
- const extensionKeys = amountKeys.filter((k) => k.startsWith("x-formspec-"));
145
- expect(extensionKeys).toHaveLength(0);
146
- });
147
- it("should map extended decorators to their built-in equivalents in uiSchema", () => {
148
- const result = generateSchemasFromClass({
149
- filePath: path.join(fixturesDir, "example-b-extended.ts"),
150
- className: "ExampleBForm",
151
- });
152
- const { uiSchema } = result;
153
- // amount: Floor(0) -> min: 0, Ceiling(1000000) -> max: 1000000
154
- const amountField = uiSchema.elements.find((e) => e.id === "amount");
155
- expect(amountField).toMatchObject({
156
- _field: "number",
157
- id: "amount",
158
- label: "Amount",
159
- description: "Total amount in cents",
160
- required: true,
161
- min: 0,
162
- max: 1000000,
163
- });
164
- // label: CustomField -> label
165
- const labelField = uiSchema.elements.find((e) => e.id === "label");
166
- expect(labelField).toMatchObject({
167
- _field: "text",
168
- id: "label",
169
- label: "Label",
170
- required: true,
171
- });
172
- });
173
- });
174
- describe("Example C: Custom decorators", () => {
175
- it("should emit x-formspec-* extensions for custom decorators", () => {
176
- const result = generateSchemasFromClass({
177
- filePath: path.join(fixturesDir, "example-c-custom.ts"),
178
- className: "ExampleCForm",
179
- });
180
- const { jsonSchema } = result;
181
- // heading: should have Title marker extension
182
- const headingSchema = jsonSchema.properties?.["heading"];
183
- if (!headingSchema)
184
- throw new Error("Expected heading schema to be defined");
185
- expect(headingSchema.title).toBe("Heading");
186
- expect(getSchemaExtension(headingSchema, "x-formspec-title-field")).toBe(true);
187
- // urgency: should have Priority parameterized extension + Minimum
188
- const urgencySchema = jsonSchema.properties?.["urgency"];
189
- if (!urgencySchema)
190
- throw new Error("Expected urgency schema to be defined");
191
- expect(urgencySchema.title).toBe("Urgency Score");
192
- expect(urgencySchema.minimum).toBe(1);
193
- expect(getSchemaExtension(urgencySchema, "x-formspec-priority")).toEqual({ level: "high" });
194
- });
195
- });
196
- describe("Example D: Non-FormSpec decorators are ignored", () => {
197
- it("should silently ignore decorators not from @formspec/decorators", () => {
198
- const result = generateSchemasFromClass({
199
- filePath: path.join(fixturesDir, "example-d-mixed-decorators.ts"),
200
- className: "ExampleDForm",
201
- });
202
- const { jsonSchema, uiSchema } = result;
203
- // username: FormSpec decorators applied, ExternalValidator ignored
204
- expect(jsonSchema.properties?.["username"]).toMatchObject({
205
- type: "string",
206
- title: "Username",
207
- });
208
- // score: Minimum applied, ExternalValidator ignored
209
- expect(jsonSchema.properties?.["score"]).toMatchObject({
210
- type: "number",
211
- minimum: 0,
212
- });
213
- // plain: only ExternalValidator — no FormSpec metadata, but field still appears
214
- const plainSchema = jsonSchema.properties?.["plain"];
215
- expect(plainSchema).toMatchObject({ type: "string" });
216
- expect(plainSchema?.title).toBeUndefined();
217
- // uiSchema: username should have label from @Field, ExternalValidator ignored
218
- const usernameField = uiSchema.elements.find((e) => e.id === "username");
219
- expect(usernameField?.label).toBe("Username");
220
- // No x-formspec-* keys anywhere (ExternalValidator is not a custom decorator)
221
- for (const key of Object.keys(jsonSchema.properties ?? {})) {
222
- const schema = jsonSchema.properties?.[key];
223
- if (!schema)
224
- continue;
225
- const extensionKeys = Object.keys(schema).filter((k) => k.startsWith("x-formspec-"));
226
- expect(extensionKeys).toHaveLength(0);
227
- }
228
- });
229
- });
230
- describe("Example E: Custom decorators without extension namespace", () => {
231
- it("should recognize custom decorators but not emit x-formspec-* without namespace", () => {
232
- const result = generateSchemasFromClass({
233
- filePath: path.join(fixturesDir, "example-e-no-namespace.ts"),
234
- className: "ExampleEForm",
235
- });
236
- const { jsonSchema } = result;
237
- // title: @Field metadata applied, Highlight marker recognized but no extension emitted
238
- expect(jsonSchema.properties?.["title"]).toMatchObject({
239
- type: "string",
240
- title: "Featured Title",
241
- });
242
- // notes: @Field metadata applied, Metadata recognized but no extension emitted
243
- expect(jsonSchema.properties?.["notes"]).toMatchObject({
244
- type: "string",
245
- title: "Notes",
246
- });
247
- // No x-formspec-* keys on any field (namespace-less custom decorators don't emit extensions)
248
- for (const key of Object.keys(jsonSchema.properties ?? {})) {
249
- const schema = jsonSchema.properties?.[key];
250
- if (!schema)
251
- continue;
252
- const extensionKeys = Object.keys(schema).filter((k) => k.startsWith("x-formspec-"));
253
- expect(extensionKeys).toHaveLength(0);
254
- }
255
- });
256
- });
257
- describe("Example F: JSDoc constraint tags", () => {
258
- it("should extract JSDoc constraints into JSON Schema", () => {
259
- const result = generateSchemasFromClass({
260
- filePath: path.join(fixturesDir, "example-jsdoc-constraints.ts"),
261
- className: "JSDocConstraintsForm",
262
- });
263
- const { jsonSchema } = result;
264
- // name: minLength + maxLength from JSDoc
265
- expect(jsonSchema.properties?.["name"]).toMatchObject({
266
- type: "string",
267
- minLength: 1,
268
- maxLength: 200,
269
- });
270
- // age: minimum + maximum from JSDoc
271
- expect(jsonSchema.properties?.["age"]).toMatchObject({
272
- type: "number",
273
- minimum: 0,
274
- maximum: 150,
275
- });
276
- // weight: decimal values
277
- expect(jsonSchema.properties?.["weight"]).toMatchObject({
278
- type: "number",
279
- minimum: 0.01,
280
- maximum: 1000,
281
- });
282
- // temperature: negative minimum
283
- expect(jsonSchema.properties?.["temperature"]).toMatchObject({
284
- type: "number",
285
- minimum: -273.15,
286
- });
287
- // sku: pattern
288
- expect(jsonSchema.properties?.["sku"]).toMatchObject({
289
- type: "string",
290
- pattern: "^[A-Z]{3}-\\d{4}$",
291
- });
292
- // stock: cross-source (decorator @Minimum + JSDoc @ExclusiveMaximum)
293
- expect(jsonSchema.properties?.["stock"]).toMatchObject({
294
- type: "number",
295
- minimum: 0,
296
- exclusiveMaximum: 10000,
297
- });
298
- // notes: no constraints
299
- const notesSchema = jsonSchema.properties?.["notes"];
300
- expect(notesSchema?.type).toBe("string");
301
- expect(notesSchema?.minimum).toBeUndefined();
302
- expect(notesSchema?.minLength).toBeUndefined();
303
- });
304
- });
305
- describe("Nested class: decorator constraints", () => {
306
- it("should propagate decorator constraints into nested JSON Schema properties", () => {
307
- const result = generateSchemasFromClass({
308
- filePath: path.join(fixturesDir, "example-nested-class.ts"),
309
- className: "UserWithAddress",
310
- });
311
- const { jsonSchema } = result;
312
- const addressSchema = jsonSchema.properties?.["address"];
313
- // Address sub-schema carries street constraints
314
- expect(addressSchema?.properties?.["street"]).toMatchObject({
315
- minLength: 1,
316
- maxLength: 200,
317
- });
318
- // Zip carries pattern
319
- expect(addressSchema?.properties?.["zip"]).toMatchObject({
320
- pattern: "^\\d{5}(-\\d{4})?$",
321
- });
322
- // Required array on the nested object: street and city required, zip optional
323
- expect(addressSchema?.required).toContain("street");
324
- expect(addressSchema?.required).toContain("city");
325
- expect(addressSchema?.required).not.toContain("zip");
326
- });
327
- it("should propagate decorator constraints into nested uiSchema fields", () => {
328
- const result = generateSchemasFromClass({
329
- filePath: path.join(fixturesDir, "example-nested-class.ts"),
330
- className: "UserWithAddress",
331
- });
332
- const { uiSchema } = result;
333
- const addressField = uiSchema.elements.find((e) => e.id === "address");
334
- expect(addressField?.fields).toBeDefined();
335
- const streetField = addressField?.fields?.find((f) => f.id === "street");
336
- expect(streetField).toMatchObject({
337
- minLength: 1,
338
- maxLength: 200,
339
- required: true,
340
- });
341
- });
342
- });
343
- describe("Nested class: JSDoc constraints", () => {
344
- it("should propagate JSDoc constraints into nested JSON Schema properties", () => {
345
- const result = generateSchemasFromClass({
346
- filePath: path.join(fixturesDir, "example-nested-class.ts"),
347
- className: "ProductWithDimensions",
348
- });
349
- const { jsonSchema } = result;
350
- const dimSchema = jsonSchema.properties?.["dimensions"];
351
- // width has both minimum and maximum from JSDoc
352
- expect(dimSchema?.properties?.["width"]).toMatchObject({
353
- minimum: 0,
354
- maximum: 10000,
355
- });
356
- // depth has minimum but no maximum
357
- const depthSchema = dimSchema?.properties?.["depth"];
358
- expect(depthSchema?.minimum).toBe(0);
359
- expect(depthSchema?.maximum).toBeUndefined();
360
- });
361
- it("should propagate JSDoc constraints into nested uiSchema fields", () => {
362
- const result = generateSchemasFromClass({
363
- filePath: path.join(fixturesDir, "example-nested-class.ts"),
364
- className: "ProductWithDimensions",
365
- });
366
- const { uiSchema } = result;
367
- const dimField = uiSchema.elements.find((e) => e.id === "dimensions");
368
- expect(dimField?.fields).toBeDefined();
369
- const widthField = dimField?.fields?.find((f) => f.id === "width");
370
- expect(widthField).toMatchObject({
371
- min: 0,
372
- max: 10000,
373
- });
374
- });
375
- });
376
- describe("Nested class: three-level nesting", () => {
377
- it("should propagate constraints through three levels of nesting in JSON Schema", () => {
378
- const result = generateSchemasFromClass({
379
- filePath: path.join(fixturesDir, "example-nested-class.ts"),
380
- className: "Order",
381
- });
382
- const { jsonSchema } = result;
383
- const customerSchema = jsonSchema.properties?.["customer"];
384
- // Level 2: customer.name has minLength
385
- expect(customerSchema?.properties?.["name"]).toMatchObject({
386
- minLength: 1,
387
- });
388
- // Level 3: customer.address.street has minLength and maxLength
389
- const addressSchema = customerSchema?.properties?.["address"];
390
- expect(addressSchema?.properties?.["street"]).toMatchObject({
391
- minLength: 1,
392
- maxLength: 200,
393
- });
394
- });
395
- it("should propagate constraints through three levels of nesting in uiSchema", () => {
396
- const result = generateSchemasFromClass({
397
- filePath: path.join(fixturesDir, "example-nested-class.ts"),
398
- className: "Order",
399
- });
400
- const { uiSchema } = result;
401
- const customerField = uiSchema.elements.find((e) => e.id === "customer");
402
- expect(customerField?.fields).toBeDefined();
403
- // Level 2: customer name field has constraints
404
- const nameField = customerField?.fields?.find((f) => f.id === "name");
405
- expect(nameField?.minLength).toBe(1);
406
- // Level 3: customer > address > street
407
- const addressField = customerField?.fields?.find((f) => f.id === "address");
408
- expect(addressField?.fields).toBeDefined();
409
- const streetField = addressField?.fields?.find((f) => f.id === "street");
410
- expect(streetField).toMatchObject({
411
- minLength: 1,
412
- maxLength: 200,
413
- required: true,
414
- });
415
- });
416
- });
417
- describe("Nested class: circular references", () => {
418
- it("should complete without hanging on circular class references", { timeout: 5000 }, () => {
419
- const result = generateSchemasFromClass({
420
- filePath: path.join(fixturesDir, "example-nested-class.ts"),
421
- className: "NodeA",
422
- });
423
- const { jsonSchema } = result;
424
- // Basic structure is valid
425
- expect(jsonSchema.type).toBe("object");
426
- expect(jsonSchema.properties?.["name"]).toMatchObject({
427
- minLength: 1,
428
- });
429
- // Sibling property exists (may be bare { type: "object" } at the cycle point)
430
- expect(jsonSchema.properties?.["sibling"]).toBeDefined();
431
- });
432
- });
433
- describe("Nested class: non-class object types (regression)", () => {
434
- it("should handle inline object types without errors", () => {
435
- const result = generateSchemasFromClass({
436
- filePath: path.join(fixturesDir, "example-nested-class.ts"),
437
- className: "WithInlineObject",
438
- });
439
- const { jsonSchema } = result;
440
- const metadataSchema = jsonSchema.properties?.["metadata"];
441
- // Structural extraction still works — key has type string
442
- expect(metadataSchema?.properties?.["key"]).toMatchObject({
443
- type: "string",
444
- });
445
- // No decorator constraints on inline object properties
446
- const keySchema = metadataSchema?.properties?.["key"];
447
- expect(keySchema?.minLength).toBeUndefined();
448
- expect(keySchema?.maxLength).toBeUndefined();
449
- });
450
- });
451
- describe("Error handling", () => {
452
- it("should throw when class is not found", () => {
453
- expect(() => generateSchemasFromClass({
454
- filePath: path.join(fixturesDir, "example-a-builtins.ts"),
455
- className: "NonExistentForm",
456
- })).toThrow('Class "NonExistentForm" not found');
457
- });
458
- });
459
- });
460
- //# sourceMappingURL=decorator-pipeline.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"decorator-pipeline.test.js","sourceRoot":"","sources":["../../src/__tests__/decorator-pipeline.test.ts"],"names":[],"mappings":"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"}