@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.
- package/README.md +138 -0
- package/dist/__tests__/analyzer-edge-cases.test.d.ts +13 -0
- package/dist/__tests__/analyzer-edge-cases.test.d.ts.map +1 -0
- package/dist/__tests__/analyzer-edge-cases.test.js +376 -0
- package/dist/__tests__/analyzer-edge-cases.test.js.map +1 -0
- package/dist/__tests__/analyzer.test.d.ts +5 -0
- package/dist/__tests__/analyzer.test.d.ts.map +1 -0
- package/dist/__tests__/analyzer.test.js +190 -0
- package/dist/__tests__/analyzer.test.js.map +1 -0
- package/dist/__tests__/cli.test.js.map +1 -1
- package/dist/__tests__/codegen.test.d.ts +5 -0
- package/dist/__tests__/codegen.test.d.ts.map +1 -0
- package/dist/__tests__/codegen.test.js +506 -0
- package/dist/__tests__/codegen.test.js.map +1 -0
- package/dist/__tests__/decorator-pipeline.test.d.ts +11 -0
- package/dist/__tests__/decorator-pipeline.test.d.ts.map +1 -0
- package/dist/__tests__/decorator-pipeline.test.js +460 -0
- package/dist/__tests__/decorator-pipeline.test.js.map +1 -0
- package/dist/__tests__/edge-cases.test.js +10 -4
- package/dist/__tests__/edge-cases.test.js.map +1 -1
- package/dist/__tests__/fixtures/edge-cases.d.ts +110 -0
- package/dist/__tests__/fixtures/edge-cases.d.ts.map +1 -0
- package/dist/__tests__/fixtures/edge-cases.js +137 -0
- package/dist/__tests__/fixtures/edge-cases.js.map +1 -0
- package/dist/__tests__/fixtures/example-a-builtins.d.ts +12 -0
- package/dist/__tests__/fixtures/example-a-builtins.d.ts.map +1 -0
- package/dist/__tests__/fixtures/example-a-builtins.js +100 -0
- package/dist/__tests__/fixtures/example-a-builtins.js.map +1 -0
- package/dist/__tests__/fixtures/example-b-decorators.d.ts +5 -0
- package/dist/__tests__/fixtures/example-b-decorators.d.ts.map +1 -0
- package/dist/__tests__/fixtures/example-b-decorators.js +5 -0
- package/dist/__tests__/fixtures/example-b-decorators.js.map +1 -0
- package/dist/__tests__/fixtures/example-b-extended.d.ts +5 -0
- package/dist/__tests__/fixtures/example-b-extended.d.ts.map +1 -0
- package/dist/__tests__/fixtures/example-b-extended.js +60 -0
- package/dist/__tests__/fixtures/example-b-extended.js.map +1 -0
- package/dist/__tests__/fixtures/example-c-custom.d.ts +5 -0
- package/dist/__tests__/fixtures/example-c-custom.d.ts.map +1 -0
- package/dist/__tests__/fixtures/example-c-custom.js +61 -0
- package/dist/__tests__/fixtures/example-c-custom.js.map +1 -0
- package/dist/__tests__/fixtures/example-c-decorators.d.ts +5 -0
- package/dist/__tests__/fixtures/example-c-decorators.d.ts.map +1 -0
- package/dist/__tests__/fixtures/example-c-decorators.js +4 -0
- package/dist/__tests__/fixtures/example-c-decorators.js.map +1 -0
- package/dist/__tests__/fixtures/example-d-mixed-decorators.d.ts +6 -0
- package/dist/__tests__/fixtures/example-d-mixed-decorators.d.ts.map +1 -0
- package/dist/__tests__/fixtures/example-d-mixed-decorators.js +75 -0
- package/dist/__tests__/fixtures/example-d-mixed-decorators.js.map +1 -0
- package/dist/__tests__/fixtures/example-e-decorators.d.ts +11 -0
- package/dist/__tests__/fixtures/example-e-decorators.d.ts.map +1 -0
- package/dist/__tests__/fixtures/example-e-decorators.js +10 -0
- package/dist/__tests__/fixtures/example-e-decorators.js.map +1 -0
- package/dist/__tests__/fixtures/example-e-no-namespace.d.ts +5 -0
- package/dist/__tests__/fixtures/example-e-no-namespace.d.ts.map +1 -0
- package/dist/__tests__/fixtures/example-e-no-namespace.js +61 -0
- package/dist/__tests__/fixtures/example-e-no-namespace.js.map +1 -0
- package/dist/__tests__/fixtures/example-interface-types.d.ts +102 -0
- package/dist/__tests__/fixtures/example-interface-types.d.ts.map +1 -0
- package/dist/__tests__/fixtures/example-interface-types.js +8 -0
- package/dist/__tests__/fixtures/example-interface-types.js.map +1 -0
- package/dist/__tests__/fixtures/example-jsdoc-constraints.d.ts +16 -0
- package/dist/__tests__/fixtures/example-jsdoc-constraints.d.ts.map +1 -0
- package/dist/__tests__/fixtures/example-jsdoc-constraints.js +98 -0
- package/dist/__tests__/fixtures/example-jsdoc-constraints.js.map +1 -0
- package/dist/__tests__/fixtures/example-nested-class.d.ts +45 -0
- package/dist/__tests__/fixtures/example-nested-class.d.ts.map +1 -0
- package/dist/__tests__/fixtures/example-nested-class.js +248 -0
- package/dist/__tests__/fixtures/example-nested-class.js.map +1 -0
- package/dist/__tests__/fixtures/sample-forms.d.ts +55 -0
- package/dist/__tests__/fixtures/sample-forms.d.ts.map +1 -0
- package/dist/__tests__/fixtures/sample-forms.js +78 -0
- package/dist/__tests__/fixtures/sample-forms.js.map +1 -0
- package/dist/__tests__/generator.test.js +29 -3
- package/dist/__tests__/generator.test.js.map +1 -1
- package/dist/__tests__/integration.test.js +1 -3
- package/dist/__tests__/integration.test.js.map +1 -1
- package/dist/__tests__/interface-types.test.d.ts +11 -0
- package/dist/__tests__/interface-types.test.d.ts.map +1 -0
- package/dist/__tests__/interface-types.test.js +404 -0
- package/dist/__tests__/interface-types.test.js.map +1 -0
- package/dist/__tests__/jsdoc-constraints.test.d.ts +10 -0
- package/dist/__tests__/jsdoc-constraints.test.d.ts.map +1 -0
- package/dist/__tests__/jsdoc-constraints.test.js +465 -0
- package/dist/__tests__/jsdoc-constraints.test.js.map +1 -0
- package/dist/__tests__/write-schemas.test.js +10 -8
- package/dist/__tests__/write-schemas.test.js.map +1 -1
- package/dist/analyzer/class-analyzer.d.ts +139 -0
- package/dist/analyzer/class-analyzer.d.ts.map +1 -0
- package/dist/analyzer/class-analyzer.js +377 -0
- package/dist/analyzer/class-analyzer.js.map +1 -0
- package/dist/analyzer/decorator-extractor.d.ts +78 -0
- package/dist/analyzer/decorator-extractor.d.ts.map +1 -0
- package/dist/analyzer/decorator-extractor.js +336 -0
- package/dist/analyzer/decorator-extractor.js.map +1 -0
- package/dist/analyzer/jsdoc-constraints.d.ts +47 -0
- package/dist/analyzer/jsdoc-constraints.d.ts.map +1 -0
- package/dist/analyzer/jsdoc-constraints.js +153 -0
- package/dist/analyzer/jsdoc-constraints.js.map +1 -0
- package/dist/analyzer/program.d.ts +53 -0
- package/dist/analyzer/program.d.ts.map +1 -0
- package/dist/analyzer/program.js +114 -0
- package/dist/analyzer/program.js.map +1 -0
- package/dist/analyzer/type-converter.d.ts +75 -0
- package/dist/analyzer/type-converter.d.ts.map +1 -0
- package/dist/analyzer/type-converter.js +474 -0
- package/dist/analyzer/type-converter.js.map +1 -0
- package/dist/browser.d.ts +54 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +48 -0
- package/dist/browser.js.map +1 -0
- package/dist/build.d.ts +580 -0
- package/dist/cli.js +1 -3
- package/dist/cli.js.map +1 -1
- package/dist/codegen/index.d.ts +75 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/index.js +597 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/generators/class-schema.d.ts +118 -0
- package/dist/generators/class-schema.d.ts.map +1 -0
- package/dist/generators/class-schema.js +140 -0
- package/dist/generators/class-schema.js.map +1 -0
- package/dist/generators/method-schema.d.ts +67 -0
- package/dist/generators/method-schema.d.ts.map +1 -0
- package/dist/generators/method-schema.js +108 -0
- package/dist/generators/method-schema.js.map +1 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/internals.d.ts +20 -0
- package/dist/internals.d.ts.map +1 -0
- package/dist/internals.js +22 -0
- package/dist/internals.js.map +1 -0
- package/dist/json-schema/generator.d.ts.map +1 -1
- package/dist/json-schema/generator.js +26 -6
- package/dist/json-schema/generator.js.map +1 -1
- package/dist/json-schema/types.d.ts +28 -0
- package/dist/json-schema/types.d.ts.map +1 -1
- package/dist/json-schema/types.js +27 -1
- package/dist/json-schema/types.js.map +1 -1
- package/dist/ui-schema/generator.d.ts.map +1 -1
- package/dist/ui-schema/generator.js +1 -3
- package/dist/ui-schema/generator.js.map +1 -1
- package/dist/ui-schema/types.d.ts.map +1 -1
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/analyzer.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|