@formspec/build 0.1.0-alpha.10 → 0.1.0-alpha.11
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.
- package/dist/browser.cjs +549 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.ts +4 -2
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +498 -45
- package/dist/browser.js.map +1 -1
- package/dist/build.d.ts +343 -33
- package/dist/cli.cjs +2267 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.js +2204 -101
- package/dist/cli.js.map +1 -1
- package/dist/generators/class-schema.d.ts +5 -9
- package/dist/generators/class-schema.d.ts.map +1 -1
- package/dist/index.cjs +2093 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2024 -114
- package/dist/index.js.map +1 -1
- package/dist/internals.cjs +1345 -0
- package/dist/internals.cjs.map +1 -0
- package/dist/internals.d.ts +1 -0
- package/dist/internals.d.ts.map +1 -1
- package/dist/internals.js +1297 -21
- package/dist/internals.js.map +1 -1
- package/dist/json-schema/generator.d.ts.map +1 -1
- package/dist/json-schema/schema.d.ts +16 -0
- package/dist/json-schema/schema.d.ts.map +1 -0
- package/dist/ui-schema/generator.d.ts +15 -0
- package/dist/ui-schema/generator.d.ts.map +1 -1
- package/dist/ui-schema/schema.d.ts +357 -0
- package/dist/ui-schema/schema.d.ts.map +1 -0
- package/dist/ui-schema/types.d.ts +8 -73
- package/dist/ui-schema/types.d.ts.map +1 -1
- package/package.json +14 -9
- package/dist/__tests__/analyzer-edge-cases.test.js +0 -376
- package/dist/__tests__/analyzer-edge-cases.test.js.map +0 -1
- package/dist/__tests__/analyzer.test.js +0 -190
- package/dist/__tests__/analyzer.test.js.map +0 -1
- package/dist/__tests__/cli.test.js +0 -178
- package/dist/__tests__/cli.test.js.map +0 -1
- package/dist/__tests__/codegen.test.js +0 -506
- package/dist/__tests__/codegen.test.js.map +0 -1
- package/dist/__tests__/decorator-pipeline.test.js +0 -460
- package/dist/__tests__/decorator-pipeline.test.js.map +0 -1
- package/dist/__tests__/edge-cases.test.js +0 -215
- package/dist/__tests__/edge-cases.test.js.map +0 -1
- package/dist/__tests__/fixtures/edge-cases.js +0 -137
- package/dist/__tests__/fixtures/edge-cases.js.map +0 -1
- package/dist/__tests__/fixtures/example-a-builtins.js +0 -100
- package/dist/__tests__/fixtures/example-a-builtins.js.map +0 -1
- package/dist/__tests__/fixtures/example-b-decorators.js +0 -5
- package/dist/__tests__/fixtures/example-b-decorators.js.map +0 -1
- package/dist/__tests__/fixtures/example-b-extended.js +0 -60
- package/dist/__tests__/fixtures/example-b-extended.js.map +0 -1
- package/dist/__tests__/fixtures/example-c-custom.js +0 -61
- package/dist/__tests__/fixtures/example-c-custom.js.map +0 -1
- package/dist/__tests__/fixtures/example-c-decorators.js +0 -4
- package/dist/__tests__/fixtures/example-c-decorators.js.map +0 -1
- package/dist/__tests__/fixtures/example-d-mixed-decorators.js +0 -75
- package/dist/__tests__/fixtures/example-d-mixed-decorators.js.map +0 -1
- package/dist/__tests__/fixtures/example-e-decorators.js +0 -10
- package/dist/__tests__/fixtures/example-e-decorators.js.map +0 -1
- package/dist/__tests__/fixtures/example-e-no-namespace.js +0 -61
- package/dist/__tests__/fixtures/example-e-no-namespace.js.map +0 -1
- package/dist/__tests__/fixtures/example-interface-types.js +0 -8
- package/dist/__tests__/fixtures/example-interface-types.js.map +0 -1
- package/dist/__tests__/fixtures/example-jsdoc-constraints.js +0 -98
- package/dist/__tests__/fixtures/example-jsdoc-constraints.js.map +0 -1
- package/dist/__tests__/fixtures/example-nested-class.js +0 -248
- package/dist/__tests__/fixtures/example-nested-class.js.map +0 -1
- package/dist/__tests__/fixtures/sample-forms.js +0 -78
- package/dist/__tests__/fixtures/sample-forms.js.map +0 -1
- package/dist/__tests__/generator.test.js +0 -234
- package/dist/__tests__/generator.test.js.map +0 -1
- package/dist/__tests__/integration.test.js +0 -161
- package/dist/__tests__/integration.test.js.map +0 -1
- package/dist/__tests__/interface-types.test.js +0 -404
- package/dist/__tests__/interface-types.test.js.map +0 -1
- package/dist/__tests__/jsdoc-constraints.test.js +0 -465
- package/dist/__tests__/jsdoc-constraints.test.js.map +0 -1
- package/dist/__tests__/write-schemas.test.js +0 -198
- package/dist/__tests__/write-schemas.test.js.map +0 -1
- package/dist/analyzer/class-analyzer.js +0 -377
- package/dist/analyzer/class-analyzer.js.map +0 -1
- package/dist/analyzer/decorator-extractor.js +0 -336
- package/dist/analyzer/decorator-extractor.js.map +0 -1
- package/dist/analyzer/jsdoc-constraints.js +0 -153
- package/dist/analyzer/jsdoc-constraints.js.map +0 -1
- package/dist/analyzer/program.js +0 -114
- package/dist/analyzer/program.js.map +0 -1
- package/dist/analyzer/type-converter.js +0 -474
- package/dist/analyzer/type-converter.js.map +0 -1
- package/dist/codegen/index.js +0 -597
- package/dist/codegen/index.js.map +0 -1
- package/dist/generators/class-schema.js +0 -140
- package/dist/generators/class-schema.js.map +0 -1
- package/dist/generators/method-schema.js +0 -108
- package/dist/generators/method-schema.js.map +0 -1
- package/dist/json-schema/generator.js +0 -166
- package/dist/json-schema/generator.js.map +0 -1
- package/dist/json-schema/types.js +0 -33
- package/dist/json-schema/types.js.map +0 -1
- package/dist/ui-schema/generator.js +0 -148
- package/dist/ui-schema/generator.js.map +0 -1
- package/dist/ui-schema/types.js +0 -8
- 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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"}
|