@typespec-dev/emitter-typebox 0.2.0 → 0.4.0
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 +70 -0
- package/dist/src/components/TypeBoxSchema.d.ts.map +1 -1
- package/dist/src/components/TypeBoxSchema.js +10 -5
- package/dist/src/components/TypeBoxSchema.js.map +1 -1
- package/dist/src/components/TypeBoxSchema.jsx +10 -5
- package/dist/src/components/TypeBoxSchema.jsx.map +1 -1
- package/dist/src/typeboxBaseSchema.d.ts +3 -2
- package/dist/src/typeboxBaseSchema.d.ts.map +1 -1
- package/dist/src/typeboxBaseSchema.js +207 -74
- package/dist/src/typeboxBaseSchema.js.map +1 -1
- package/dist/src/typeboxBaseSchema.jsx +148 -52
- package/dist/src/typeboxBaseSchema.jsx.map +1 -1
- package/dist/src/typeboxConstraints.d.ts +10 -0
- package/dist/src/typeboxConstraints.d.ts.map +1 -0
- package/dist/src/typeboxConstraints.js +308 -0
- package/dist/src/typeboxConstraints.js.map +1 -0
- package/dist/src/typeboxConstraints.jsx +246 -0
- package/dist/src/typeboxConstraints.jsx.map +1 -0
- package/dist/test/arrays.test.js +1 -1
- package/dist/test/arrays.test.js.map +1 -1
- package/dist/test/arrays.test.jsx +1 -1
- package/dist/test/arrays.test.jsx.map +1 -1
- package/dist/test/constraints.test.d.ts +2 -0
- package/dist/test/constraints.test.d.ts.map +1 -0
- package/dist/test/constraints.test.js +414 -0
- package/dist/test/constraints.test.js.map +1 -0
- package/dist/test/constraints.test.jsx +279 -0
- package/dist/test/constraints.test.jsx.map +1 -0
- package/dist/test/dictionaries.test.js +15 -1
- package/dist/test/dictionaries.test.js.map +1 -1
- package/dist/test/dictionaries.test.jsx +11 -1
- package/dist/test/dictionaries.test.jsx.map +1 -1
- package/dist/test/discriminated-unions.test.d.ts +2 -0
- package/dist/test/discriminated-unions.test.d.ts.map +1 -0
- package/dist/test/discriminated-unions.test.js +156 -0
- package/dist/test/discriminated-unions.test.js.map +1 -0
- package/dist/test/discriminated-unions.test.jsx +105 -0
- package/dist/test/discriminated-unions.test.jsx.map +1 -0
- package/dist/test/emitter/custom-scalars.test.d.ts +2 -0
- package/dist/test/emitter/custom-scalars.test.d.ts.map +1 -0
- package/dist/test/emitter/custom-scalars.test.js +42 -0
- package/dist/test/emitter/custom-scalars.test.js.map +1 -0
- package/dist/test/emitter/custom-scalars.test.jsx +38 -0
- package/dist/test/emitter/custom-scalars.test.jsx.map +1 -0
- package/dist/test/emitter/discriminated-unions.test.d.ts +2 -0
- package/dist/test/emitter/discriminated-unions.test.d.ts.map +1 -0
- package/dist/test/emitter/discriminated-unions.test.js +52 -0
- package/dist/test/emitter/discriminated-unions.test.js.map +1 -0
- package/dist/test/emitter/discriminated-unions.test.jsx +48 -0
- package/dist/test/emitter/discriminated-unions.test.jsx.map +1 -0
- package/dist/test/emitter/inheritance.test.d.ts +2 -0
- package/dist/test/emitter/inheritance.test.d.ts.map +1 -0
- package/dist/test/emitter/inheritance.test.js +56 -0
- package/dist/test/emitter/inheritance.test.js.map +1 -0
- package/dist/test/emitter/inheritance.test.jsx +50 -0
- package/dist/test/emitter/inheritance.test.jsx.map +1 -0
- package/dist/test/emitter/recursive.test.d.ts +2 -0
- package/dist/test/emitter/recursive.test.d.ts.map +1 -0
- package/dist/test/emitter/recursive.test.js +36 -0
- package/dist/test/emitter/recursive.test.js.map +1 -0
- package/dist/test/emitter/recursive.test.jsx +32 -0
- package/dist/test/emitter/recursive.test.jsx.map +1 -0
- package/dist/test/emitter/tuples.test.d.ts +2 -0
- package/dist/test/emitter/tuples.test.d.ts.map +1 -0
- package/dist/test/emitter/tuples.test.js +22 -0
- package/dist/test/emitter/tuples.test.js.map +1 -0
- package/dist/test/emitter/tuples.test.jsx +20 -0
- package/dist/test/emitter/tuples.test.jsx.map +1 -0
- package/dist/test/inheritance.test.d.ts +2 -0
- package/dist/test/inheritance.test.d.ts.map +1 -0
- package/dist/test/inheritance.test.js +162 -0
- package/dist/test/inheritance.test.js.map +1 -0
- package/dist/test/inheritance.test.jsx +92 -0
- package/dist/test/inheritance.test.jsx.map +1 -0
- package/dist/test/models.test.js +37 -2
- package/dist/test/models.test.js.map +1 -1
- package/dist/test/models.test.jsx +29 -2
- package/dist/test/models.test.jsx.map +1 -1
- package/dist/test/nullable.test.js +1 -1
- package/dist/test/nullable.test.js.map +1 -1
- package/dist/test/nullable.test.jsx +1 -1
- package/dist/test/nullable.test.jsx.map +1 -1
- package/dist/test/optionality.test.js +2 -2
- package/dist/test/optionality.test.js.map +1 -1
- package/dist/test/optionality.test.jsx +2 -2
- package/dist/test/optionality.test.jsx.map +1 -1
- package/dist/test/recursive.test.d.ts +2 -0
- package/dist/test/recursive.test.d.ts.map +1 -0
- package/dist/test/recursive.test.js +137 -0
- package/dist/test/recursive.test.js.map +1 -0
- package/dist/test/recursive.test.jsx +75 -0
- package/dist/test/recursive.test.jsx.map +1 -0
- package/dist/test/scalars.test.js +13 -13
- package/dist/test/scalars.test.js.map +1 -1
- package/dist/test/scalars.test.jsx +13 -13
- package/dist/test/scalars.test.jsx.map +1 -1
- package/dist/test/tuples.test.d.ts +2 -0
- package/dist/test/tuples.test.d.ts.map +1 -0
- package/dist/test/tuples.test.js +67 -0
- package/dist/test/tuples.test.js.map +1 -0
- package/dist/test/tuples.test.jsx +42 -0
- package/dist/test/tuples.test.jsx.map +1 -0
- package/dist/test/unions.test.js +1 -1
- package/dist/test/unions.test.js.map +1 -1
- package/dist/test/unions.test.jsx +1 -1
- package/dist/test/unions.test.jsx.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { describe, it } from 'vitest';
|
|
2
|
+
import { TypeBoxSchema } from '../src/components/TypeBoxSchema.jsx';
|
|
3
|
+
import { createTestRunner, expectRender } from './utils.jsx';
|
|
4
|
+
describe('string constraints', () => {
|
|
5
|
+
it('applies minLength and maxLength', async () => {
|
|
6
|
+
const runner = await createTestRunner();
|
|
7
|
+
const { nameProp } = (await runner.compile(`
|
|
8
|
+
model Test {
|
|
9
|
+
@test @minLength(1) @maxLength(100) nameProp: string;
|
|
10
|
+
}
|
|
11
|
+
`));
|
|
12
|
+
expectRender(runner.program, <TypeBoxSchema type={nameProp}/>, 'Type.String({\n minLength: 1,\n maxLength: 100\n})');
|
|
13
|
+
});
|
|
14
|
+
it('applies pattern', async () => {
|
|
15
|
+
const runner = await createTestRunner();
|
|
16
|
+
const { codeProp } = (await runner.compile(`
|
|
17
|
+
model Test {
|
|
18
|
+
@test @pattern("^[a-z]+$") codeProp: string;
|
|
19
|
+
}
|
|
20
|
+
`));
|
|
21
|
+
expectRender(runner.program, <TypeBoxSchema type={codeProp}/>, 'Type.String({\n pattern: "^[a-z]+$"\n})');
|
|
22
|
+
});
|
|
23
|
+
it('applies format', async () => {
|
|
24
|
+
const runner = await createTestRunner();
|
|
25
|
+
const { emailProp } = (await runner.compile(`
|
|
26
|
+
model Test {
|
|
27
|
+
@test @format("email") emailProp: string;
|
|
28
|
+
}
|
|
29
|
+
`));
|
|
30
|
+
expectRender(runner.program, <TypeBoxSchema type={emailProp}/>, 'Type.String({\n format: "email"\n})');
|
|
31
|
+
});
|
|
32
|
+
it('escapes backslashes in pattern', async () => {
|
|
33
|
+
const runner = await createTestRunner();
|
|
34
|
+
const { phoneProp } = (await runner.compile(`
|
|
35
|
+
model Test {
|
|
36
|
+
@test @pattern("^\\\\d{3}-\\\\d{4}$") phoneProp: string;
|
|
37
|
+
}
|
|
38
|
+
`));
|
|
39
|
+
expectRender(runner.program, <TypeBoxSchema type={phoneProp}/>, 'Type.String({\n pattern: "^\\\\d{3}-\\\\d{4}$"\n})');
|
|
40
|
+
});
|
|
41
|
+
it('applies minLength only', async () => {
|
|
42
|
+
const runner = await createTestRunner();
|
|
43
|
+
const { tagProp } = (await runner.compile(`
|
|
44
|
+
model Test {
|
|
45
|
+
@test @minLength(1) tagProp: string;
|
|
46
|
+
}
|
|
47
|
+
`));
|
|
48
|
+
expectRender(runner.program, <TypeBoxSchema type={tagProp}/>, 'Type.String({\n minLength: 1\n})');
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('numeric constraints', () => {
|
|
52
|
+
it('applies minValue and maxValue', async () => {
|
|
53
|
+
const runner = await createTestRunner();
|
|
54
|
+
const { scoreProp } = (await runner.compile(`
|
|
55
|
+
model Test {
|
|
56
|
+
@test @minValue(0) @maxValue(100) scoreProp: int32;
|
|
57
|
+
}
|
|
58
|
+
`));
|
|
59
|
+
expectRender(runner.program, <TypeBoxSchema type={scoreProp}/>, 'Type.Integer({\n minimum: 0,\n maximum: 100\n})');
|
|
60
|
+
});
|
|
61
|
+
it('applies exclusive bounds', async () => {
|
|
62
|
+
const runner = await createTestRunner();
|
|
63
|
+
const { priceProp } = (await runner.compile(`
|
|
64
|
+
model Test {
|
|
65
|
+
@test @minValueExclusive(0) priceProp: float64;
|
|
66
|
+
}
|
|
67
|
+
`));
|
|
68
|
+
expectRender(runner.program, <TypeBoxSchema type={priceProp}/>, 'Type.Number({\n exclusiveMinimum: 0\n})');
|
|
69
|
+
});
|
|
70
|
+
it('applies maxValueExclusive', async () => {
|
|
71
|
+
const runner = await createTestRunner();
|
|
72
|
+
const { rateProp } = (await runner.compile(`
|
|
73
|
+
model Test {
|
|
74
|
+
@test @maxValueExclusive(1) rateProp: float64;
|
|
75
|
+
}
|
|
76
|
+
`));
|
|
77
|
+
expectRender(runner.program, <TypeBoxSchema type={rateProp}/>, 'Type.Number({\n exclusiveMaximum: 1\n})');
|
|
78
|
+
});
|
|
79
|
+
it('narrows intrinsic bounds with user constraints', async () => {
|
|
80
|
+
const runner = await createTestRunner();
|
|
81
|
+
const { ageProp } = (await runner.compile(`
|
|
82
|
+
model Test {
|
|
83
|
+
@test @minValue(0) @maxValue(150) ageProp: int32;
|
|
84
|
+
}
|
|
85
|
+
`));
|
|
86
|
+
expectRender(runner.program, <TypeBoxSchema type={ageProp}/>, 'Type.Integer({\n minimum: 0,\n maximum: 150\n})');
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe('intrinsic numeric bounds', () => {
|
|
90
|
+
it('applies int8 bounds', async () => {
|
|
91
|
+
const runner = await createTestRunner();
|
|
92
|
+
const { val } = (await runner.compile(`
|
|
93
|
+
model Test {
|
|
94
|
+
@test val: int8;
|
|
95
|
+
}
|
|
96
|
+
`));
|
|
97
|
+
expectRender(runner.program, <TypeBoxSchema type={val.type}/>, 'Type.Integer({\n minimum: -128,\n maximum: 127\n})');
|
|
98
|
+
});
|
|
99
|
+
it('applies uint8 bounds', async () => {
|
|
100
|
+
const runner = await createTestRunner();
|
|
101
|
+
const { val } = (await runner.compile(`
|
|
102
|
+
model Test {
|
|
103
|
+
@test val: uint8;
|
|
104
|
+
}
|
|
105
|
+
`));
|
|
106
|
+
expectRender(runner.program, <TypeBoxSchema type={val.type}/>, 'Type.Integer({\n minimum: 0,\n maximum: 255\n})');
|
|
107
|
+
});
|
|
108
|
+
it('applies int16 bounds', async () => {
|
|
109
|
+
const runner = await createTestRunner();
|
|
110
|
+
const { val } = (await runner.compile(`
|
|
111
|
+
model Test {
|
|
112
|
+
@test val: int16;
|
|
113
|
+
}
|
|
114
|
+
`));
|
|
115
|
+
expectRender(runner.program, <TypeBoxSchema type={val.type}/>, 'Type.Integer({\n minimum: -32768,\n maximum: 32767\n})');
|
|
116
|
+
});
|
|
117
|
+
it('applies uint16 bounds', async () => {
|
|
118
|
+
const runner = await createTestRunner();
|
|
119
|
+
const { val } = (await runner.compile(`
|
|
120
|
+
model Test {
|
|
121
|
+
@test val: uint16;
|
|
122
|
+
}
|
|
123
|
+
`));
|
|
124
|
+
expectRender(runner.program, <TypeBoxSchema type={val.type}/>, 'Type.Integer({\n minimum: 0,\n maximum: 65535\n})');
|
|
125
|
+
});
|
|
126
|
+
it('applies int32 bounds', async () => {
|
|
127
|
+
const runner = await createTestRunner();
|
|
128
|
+
const { val } = (await runner.compile(`
|
|
129
|
+
model Test {
|
|
130
|
+
@test val: int32;
|
|
131
|
+
}
|
|
132
|
+
`));
|
|
133
|
+
expectRender(runner.program, <TypeBoxSchema type={val.type}/>, 'Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n})');
|
|
134
|
+
});
|
|
135
|
+
it('applies uint32 bounds', async () => {
|
|
136
|
+
const runner = await createTestRunner();
|
|
137
|
+
const { val } = (await runner.compile(`
|
|
138
|
+
model Test {
|
|
139
|
+
@test val: uint32;
|
|
140
|
+
}
|
|
141
|
+
`));
|
|
142
|
+
expectRender(runner.program, <TypeBoxSchema type={val.type}/>, 'Type.Integer({\n minimum: 0,\n maximum: 4294967295\n})');
|
|
143
|
+
});
|
|
144
|
+
it('applies safeint bounds', async () => {
|
|
145
|
+
const runner = await createTestRunner();
|
|
146
|
+
const { val } = (await runner.compile(`
|
|
147
|
+
model Test {
|
|
148
|
+
@test val: safeint;
|
|
149
|
+
}
|
|
150
|
+
`));
|
|
151
|
+
expectRender(runner.program, <TypeBoxSchema type={val.type}/>, 'Type.Integer({\n minimum: -9007199254740991,\n maximum: 9007199254740991\n})');
|
|
152
|
+
});
|
|
153
|
+
it('applies float32 bounds', async () => {
|
|
154
|
+
const runner = await createTestRunner();
|
|
155
|
+
const { val } = (await runner.compile(`
|
|
156
|
+
model Test {
|
|
157
|
+
@test val: float32;
|
|
158
|
+
}
|
|
159
|
+
`));
|
|
160
|
+
expectRender(runner.program, <TypeBoxSchema type={val.type}/>, 'Type.Number({\n minimum: -3.4028235e+38,\n maximum: 3.4028235e+38\n})');
|
|
161
|
+
});
|
|
162
|
+
it('does not apply bounds to float64', async () => {
|
|
163
|
+
const runner = await createTestRunner();
|
|
164
|
+
const { val } = (await runner.compile(`
|
|
165
|
+
model Test {
|
|
166
|
+
@test val: float64;
|
|
167
|
+
}
|
|
168
|
+
`));
|
|
169
|
+
expectRender(runner.program, <TypeBoxSchema type={val.type}/>, 'Type.Number()');
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
describe('array constraints', () => {
|
|
173
|
+
it('applies minItems and maxItems', async () => {
|
|
174
|
+
const runner = await createTestRunner();
|
|
175
|
+
const { itemsProp } = (await runner.compile(`
|
|
176
|
+
model Test {
|
|
177
|
+
@test @minItems(1) @maxItems(10) itemsProp: string[];
|
|
178
|
+
}
|
|
179
|
+
`));
|
|
180
|
+
expectRender(runner.program, <TypeBoxSchema type={itemsProp}/>, 'Type.Array(\n Type.String(),\n {\n minItems: 1,\n maxItems: 10\n }\n)');
|
|
181
|
+
});
|
|
182
|
+
it('applies minItems only', async () => {
|
|
183
|
+
const runner = await createTestRunner();
|
|
184
|
+
const { tagsProp } = (await runner.compile(`
|
|
185
|
+
model Test {
|
|
186
|
+
@test @minItems(1) tagsProp: string[];
|
|
187
|
+
}
|
|
188
|
+
`));
|
|
189
|
+
expectRender(runner.program, <TypeBoxSchema type={tagsProp}/>, 'Type.Array(\n Type.String(),\n {\n minItems: 1\n }\n)');
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
describe('description', () => {
|
|
193
|
+
it('applies @doc to string property', async () => {
|
|
194
|
+
const runner = await createTestRunner();
|
|
195
|
+
const { nameProp } = (await runner.compile(`
|
|
196
|
+
model Test {
|
|
197
|
+
@test @doc("A person's name") nameProp: string;
|
|
198
|
+
}
|
|
199
|
+
`));
|
|
200
|
+
expectRender(runner.program, <TypeBoxSchema type={nameProp}/>, 'Type.String({\n description: "A person\'s name"\n})');
|
|
201
|
+
});
|
|
202
|
+
it('escapes double quotes in description', async () => {
|
|
203
|
+
const runner = await createTestRunner();
|
|
204
|
+
const { valProp } = (await runner.compile(`
|
|
205
|
+
model Test {
|
|
206
|
+
@test @doc("A \\"quoted\\" value") valProp: string;
|
|
207
|
+
}
|
|
208
|
+
`));
|
|
209
|
+
expectRender(runner.program, <TypeBoxSchema type={valProp}/>, 'Type.String({\n description: "A \\"quoted\\" value"\n})');
|
|
210
|
+
});
|
|
211
|
+
it('applies @doc to numeric property', async () => {
|
|
212
|
+
const runner = await createTestRunner();
|
|
213
|
+
const { ageProp } = (await runner.compile(`
|
|
214
|
+
model Test {
|
|
215
|
+
@test @doc("Age in years") ageProp: float64;
|
|
216
|
+
}
|
|
217
|
+
`));
|
|
218
|
+
expectRender(runner.program, <TypeBoxSchema type={ageProp}/>, 'Type.Number({\n description: "Age in years"\n})');
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
describe('defaults', () => {
|
|
222
|
+
it('applies string default', async () => {
|
|
223
|
+
const runner = await createTestRunner();
|
|
224
|
+
const { greetingProp } = (await runner.compile(`
|
|
225
|
+
model Test {
|
|
226
|
+
@test greetingProp?: string = "hello";
|
|
227
|
+
}
|
|
228
|
+
`));
|
|
229
|
+
expectRender(runner.program, <TypeBoxSchema type={greetingProp}/>, 'Type.String({\n default: "hello"\n})');
|
|
230
|
+
});
|
|
231
|
+
it('applies numeric default', async () => {
|
|
232
|
+
const runner = await createTestRunner();
|
|
233
|
+
const { limitProp } = (await runner.compile(`
|
|
234
|
+
model Test {
|
|
235
|
+
@test limitProp?: float64 = 10;
|
|
236
|
+
}
|
|
237
|
+
`));
|
|
238
|
+
expectRender(runner.program, <TypeBoxSchema type={limitProp}/>, 'Type.Number({\n default: 10\n})');
|
|
239
|
+
});
|
|
240
|
+
it('applies boolean default', async () => {
|
|
241
|
+
const runner = await createTestRunner();
|
|
242
|
+
const { activeProp } = (await runner.compile(`
|
|
243
|
+
model Test {
|
|
244
|
+
@test activeProp?: boolean = true;
|
|
245
|
+
}
|
|
246
|
+
`));
|
|
247
|
+
expectRender(runner.program, <TypeBoxSchema type={activeProp}/>, 'Type.Boolean({\n default: true\n})');
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
describe('combined constraints', () => {
|
|
251
|
+
it('combines string constraints with description', async () => {
|
|
252
|
+
const runner = await createTestRunner();
|
|
253
|
+
const { nameProp } = (await runner.compile(`
|
|
254
|
+
model Test {
|
|
255
|
+
@test @minLength(1) @maxLength(50) @doc("User name") nameProp: string;
|
|
256
|
+
}
|
|
257
|
+
`));
|
|
258
|
+
expectRender(runner.program, <TypeBoxSchema type={nameProp}/>, 'Type.String({\n minLength: 1,\n maxLength: 50,\n description: "User name"\n})');
|
|
259
|
+
});
|
|
260
|
+
it('combines numeric constraints with default', async () => {
|
|
261
|
+
const runner = await createTestRunner();
|
|
262
|
+
const { limitProp } = (await runner.compile(`
|
|
263
|
+
model Test {
|
|
264
|
+
@test @minValue(1) @maxValue(100) limitProp?: float64 = 10;
|
|
265
|
+
}
|
|
266
|
+
`));
|
|
267
|
+
expectRender(runner.program, <TypeBoxSchema type={limitProp}/>, 'Type.Number({\n minimum: 1,\n maximum: 100,\n default: 10\n})');
|
|
268
|
+
});
|
|
269
|
+
it('combines format with description', async () => {
|
|
270
|
+
const runner = await createTestRunner();
|
|
271
|
+
const { emailProp } = (await runner.compile(`
|
|
272
|
+
model Test {
|
|
273
|
+
@test @format("email") @doc("Email address") emailProp: string;
|
|
274
|
+
}
|
|
275
|
+
`));
|
|
276
|
+
expectRender(runner.program, <TypeBoxSchema type={emailProp}/>, 'Type.String({\n format: "email",\n description: "Email address"\n})');
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
//# sourceMappingURL=constraints.test.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constraints.test.jsx","sourceRoot":"","sources":["../../test/constraints.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -31,7 +31,21 @@ describe('dictionaries', () => {
|
|
|
31
31
|
get type() {
|
|
32
32
|
return intDict.type;
|
|
33
33
|
}
|
|
34
|
-
}), 'Type.Record(Type.String()
|
|
34
|
+
}), 'Type.Record(\n Type.String(),\n Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n })\n)');
|
|
35
|
+
});
|
|
36
|
+
it('works with model extending Record with additional properties', async () => {
|
|
37
|
+
const runner = await createTestRunner();
|
|
38
|
+
const {
|
|
39
|
+
Config
|
|
40
|
+
} = await runner.compile(`
|
|
41
|
+
@test model Config extends Record<string> {
|
|
42
|
+
apiKey: string;
|
|
43
|
+
baseUrl: string;
|
|
44
|
+
}
|
|
45
|
+
`);
|
|
46
|
+
expectRender(runner.program, _$createComponent(TypeBoxSchema, {
|
|
47
|
+
type: Config
|
|
48
|
+
}), 'Type.Intersect([\n Type.Object({\n apiKey: Type.String(),\n baseUrl: Type.String(),\n }),\n Type.Record(Type.String(), Type.String())\n])');
|
|
35
49
|
});
|
|
36
50
|
it('works with record property in model', async () => {
|
|
37
51
|
const runner = await createTestRunner();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["describe","it","TypeBoxSchema","createTestRunner","expectRender","runner","dictProp","compile","program","_$createComponent","type","intDict","DictModel"],"sources":["../../test/dictionaries.test.tsx"],"sourcesContent":[null],"mappings":";AACA,SAASA,QAAQ,EAAEC,EAAE,QAAQ,QAAQ;AACrC,SAASC,aAAa;AACtB,SAASC,gBAAgB,EAAEC,YAAY;AAEvCJ,QAAQ,CAAC,cAAc,EAAE,MAAM;EAC7BC,EAAE,CAAC,oCAAoC,EAAE,YAAY;IACnD,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEG;IAAS,CAAC,GAAI,MAAMD,MAAM,CAACE,OAAO,CAAC;AAC/C;AACA;AACA;AACA,KAAK,CAAmC;IAEpCH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAAA,IAACQ,IAAIA,CAAA;QAAA,OAAEJ,QAAQ,CAACI,IAAI;MAAA;IAAA,IAClC,2CACF,CAAC;EACH,CAAC,CAAC;EAEFT,EAAE,CAAC,qCAAqC,EAAE,YAAY;IACpD,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEQ;IAAQ,CAAC,GAAI,MAAMN,MAAM,CAACE,OAAO,CAAC;AAC9C;AACA;AACA;AACA,KAAK,CAAmC;IAEpCH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAAA,IAACQ,IAAIA,CAAA;QAAA,OAAEC,OAAO,CAACD,IAAI;MAAA;IAAA,IACjC,
|
|
1
|
+
{"version":3,"names":["describe","it","TypeBoxSchema","createTestRunner","expectRender","runner","dictProp","compile","program","_$createComponent","type","intDict","Config","DictModel"],"sources":["../../test/dictionaries.test.tsx"],"sourcesContent":[null],"mappings":";AACA,SAASA,QAAQ,EAAEC,EAAE,QAAQ,QAAQ;AACrC,SAASC,aAAa;AACtB,SAASC,gBAAgB,EAAEC,YAAY;AAEvCJ,QAAQ,CAAC,cAAc,EAAE,MAAM;EAC7BC,EAAE,CAAC,oCAAoC,EAAE,YAAY;IACnD,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEG;IAAS,CAAC,GAAI,MAAMD,MAAM,CAACE,OAAO,CAAC;AAC/C;AACA;AACA;AACA,KAAK,CAAmC;IAEpCH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAAA,IAACQ,IAAIA,CAAA;QAAA,OAAEJ,QAAQ,CAACI,IAAI;MAAA;IAAA,IAClC,2CACF,CAAC;EACH,CAAC,CAAC;EAEFT,EAAE,CAAC,qCAAqC,EAAE,YAAY;IACpD,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEQ;IAAQ,CAAC,GAAI,MAAMN,MAAM,CAACE,OAAO,CAAC;AAC9C;AACA;AACA;AACA,KAAK,CAAmC;IAEpCH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAAA,IAACQ,IAAIA,CAAA;QAAA,OAAEC,OAAO,CAACD,IAAI;MAAA;IAAA,IACjC,+GACF,CAAC;EACH,CAAC,CAAC;EAEFT,EAAE,CAAC,8DAA8D,EAAE,YAAY;IAC7E,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAES;IAAO,CAAC,GAAI,MAAMP,MAAM,CAACE,OAAO,CAAC;AAC7C;AACA;AACA;AACA;AACA,KAAK,CAA2B;IAE5BH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAACQ,IAAI,EAAEE;IAAM,IAC3B,oJACF,CAAC;EACH,CAAC,CAAC;EAEFX,EAAE,CAAC,qCAAqC,EAAE,YAAY;IACpD,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEU;IAAU,CAAC,GAAI,MAAMR,MAAM,CAACE,OAAO,CAAC;AAChD;AACA;AACA;AACA,KAAK,CAA2B;IAE5BH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAACQ,IAAI,EAAEG;IAAS,IAC9B,uEACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -18,7 +18,17 @@ describe('dictionaries', () => {
|
|
|
18
18
|
@test intDict: Record<int32>;
|
|
19
19
|
}
|
|
20
20
|
`));
|
|
21
|
-
expectRender(runner.program, <TypeBoxSchema type={intDict.type}/>, 'Type.Record(Type.String()
|
|
21
|
+
expectRender(runner.program, <TypeBoxSchema type={intDict.type}/>, 'Type.Record(\n Type.String(),\n Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n })\n)');
|
|
22
|
+
});
|
|
23
|
+
it('works with model extending Record with additional properties', async () => {
|
|
24
|
+
const runner = await createTestRunner();
|
|
25
|
+
const { Config } = (await runner.compile(`
|
|
26
|
+
@test model Config extends Record<string> {
|
|
27
|
+
apiKey: string;
|
|
28
|
+
baseUrl: string;
|
|
29
|
+
}
|
|
30
|
+
`));
|
|
31
|
+
expectRender(runner.program, <TypeBoxSchema type={Config}/>, 'Type.Intersect([\n Type.Object({\n apiKey: Type.String(),\n baseUrl: Type.String(),\n }),\n Type.Record(Type.String(), Type.String())\n])');
|
|
22
32
|
});
|
|
23
33
|
it('works with record property in model', async () => {
|
|
24
34
|
const runner = await createTestRunner();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dictionaries.test.jsx","sourceRoot":"","sources":["../../test/dictionaries.test.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE7D,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;KAI1C,CAAC,CAAkC,CAAC;QAErC,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAG,EACtC,2CAA2C,CAC5C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;KAIzC,CAAC,CAAkC,CAAC;QAErC,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAG,EACrC,
|
|
1
|
+
{"version":3,"file":"dictionaries.test.jsx","sourceRoot":"","sources":["../../test/dictionaries.test.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE7D,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;KAI1C,CAAC,CAAkC,CAAC;QAErC,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAG,EACtC,2CAA2C,CAC5C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;KAIzC,CAAC,CAAkC,CAAC;QAErC,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAG,EACrC,+GAA+G,CAChH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;;KAKxC,CAAC,CAA0B,CAAC;QAE7B,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAG,EAC/B,oJAAoJ,CACrJ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;KAI3C,CAAC,CAA0B,CAAC;QAE7B,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,EAAG,EAClC,uEAAuE,CACxE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discriminated-unions.test.d.ts","sourceRoot":"","sources":["../../test/discriminated-unions.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { createComponent as _$createComponent } from "@alloy-js/core/jsx-runtime";
|
|
2
|
+
import { render } from '@alloy-js/core';
|
|
3
|
+
import { createTSNamePolicy, SourceFile } from '@alloy-js/typescript';
|
|
4
|
+
import { Output } from '@typespec/emitter-framework';
|
|
5
|
+
import { describe, expect, it } from 'vitest';
|
|
6
|
+
import { TypeBoxSchema } from "../src/components/TypeBoxSchema.js";
|
|
7
|
+
import { TypeBoxSchemaDeclaration } from "../src/components/TypeBoxSchemaDeclaration.js";
|
|
8
|
+
import { typebox } from '../src/index.js';
|
|
9
|
+
import { createTestRunner, expectRender } from "./utils.js";
|
|
10
|
+
describe('discriminated unions', () => {
|
|
11
|
+
it('emits base model as Type.Union of derived variants', async () => {
|
|
12
|
+
const runner = await createTestRunner();
|
|
13
|
+
const {
|
|
14
|
+
Shape,
|
|
15
|
+
Circle,
|
|
16
|
+
Square
|
|
17
|
+
} = await runner.compile(`
|
|
18
|
+
@discriminator("kind")
|
|
19
|
+
@test model Shape {
|
|
20
|
+
kind: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@test model Circle extends Shape {
|
|
24
|
+
kind: "circle";
|
|
25
|
+
radius: float64;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@test model Square extends Shape {
|
|
29
|
+
kind: "square";
|
|
30
|
+
side: float64;
|
|
31
|
+
}
|
|
32
|
+
`);
|
|
33
|
+
const template = _$createComponent(Output, {
|
|
34
|
+
get program() {
|
|
35
|
+
return runner.program;
|
|
36
|
+
},
|
|
37
|
+
get namePolicy() {
|
|
38
|
+
return createTSNamePolicy();
|
|
39
|
+
},
|
|
40
|
+
externals: [typebox],
|
|
41
|
+
get children() {
|
|
42
|
+
return _$createComponent(SourceFile, {
|
|
43
|
+
path: "test.ts",
|
|
44
|
+
get children() {
|
|
45
|
+
return [_$createComponent(TypeBoxSchemaDeclaration, {
|
|
46
|
+
type: Circle,
|
|
47
|
+
"export": true
|
|
48
|
+
}), '\n', _$createComponent(TypeBoxSchemaDeclaration, {
|
|
49
|
+
type: Square,
|
|
50
|
+
"export": true
|
|
51
|
+
}), '\n', _$createComponent(TypeBoxSchemaDeclaration, {
|
|
52
|
+
type: Shape,
|
|
53
|
+
"export": true
|
|
54
|
+
})];
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
const output = render(template, {
|
|
60
|
+
insertFinalNewLine: false
|
|
61
|
+
});
|
|
62
|
+
const contents = output.contents[0].contents;
|
|
63
|
+
expect(contents).toContain('Type.Union([circle, square])');
|
|
64
|
+
});
|
|
65
|
+
it('flattens derived model properties instead of using Intersect', async () => {
|
|
66
|
+
const runner = await createTestRunner();
|
|
67
|
+
const {
|
|
68
|
+
Circle
|
|
69
|
+
} = await runner.compile(`
|
|
70
|
+
@discriminator("kind")
|
|
71
|
+
model Shape {
|
|
72
|
+
kind: string;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@test model Circle extends Shape {
|
|
76
|
+
kind: "circle";
|
|
77
|
+
radius: float64;
|
|
78
|
+
}
|
|
79
|
+
`);
|
|
80
|
+
expectRender(runner.program, _$createComponent(TypeBoxSchema, {
|
|
81
|
+
type: Circle
|
|
82
|
+
}), 'Type.Object({\n kind: Type.Literal("circle"),\n radius: Type.Number(),\n})');
|
|
83
|
+
});
|
|
84
|
+
it('flattens multi-level inheritance for discriminated types', async () => {
|
|
85
|
+
const runner = await createTestRunner();
|
|
86
|
+
const {
|
|
87
|
+
Dog
|
|
88
|
+
} = await runner.compile(`
|
|
89
|
+
@discriminator("type")
|
|
90
|
+
model Animal {
|
|
91
|
+
type: string;
|
|
92
|
+
name: string;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@test model Dog extends Animal {
|
|
96
|
+
type: "dog";
|
|
97
|
+
breed: string;
|
|
98
|
+
}
|
|
99
|
+
`);
|
|
100
|
+
expectRender(runner.program, _$createComponent(TypeBoxSchema, {
|
|
101
|
+
type: Dog
|
|
102
|
+
}), 'Type.Object({\n type: Type.Literal("dog"),\n breed: Type.String(),\n name: Type.String(),\n})');
|
|
103
|
+
});
|
|
104
|
+
it('handles three discriminated variants', async () => {
|
|
105
|
+
const runner = await createTestRunner();
|
|
106
|
+
const {
|
|
107
|
+
Vehicle
|
|
108
|
+
} = await runner.compile(`
|
|
109
|
+
@discriminator("type")
|
|
110
|
+
@test model Vehicle {
|
|
111
|
+
type: string;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
model Car extends Vehicle {
|
|
115
|
+
type: "car";
|
|
116
|
+
doors: int32;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
model Bike extends Vehicle {
|
|
120
|
+
type: "bike";
|
|
121
|
+
gears: int32;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
model Truck extends Vehicle {
|
|
125
|
+
type: "truck";
|
|
126
|
+
payload: float64;
|
|
127
|
+
}
|
|
128
|
+
`);
|
|
129
|
+
const template = _$createComponent(Output, {
|
|
130
|
+
get program() {
|
|
131
|
+
return runner.program;
|
|
132
|
+
},
|
|
133
|
+
get namePolicy() {
|
|
134
|
+
return createTSNamePolicy();
|
|
135
|
+
},
|
|
136
|
+
externals: [typebox],
|
|
137
|
+
get children() {
|
|
138
|
+
return _$createComponent(SourceFile, {
|
|
139
|
+
path: "test.ts",
|
|
140
|
+
get children() {
|
|
141
|
+
return _$createComponent(TypeBoxSchemaDeclaration, {
|
|
142
|
+
type: Vehicle,
|
|
143
|
+
"export": true
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
const output = render(template, {
|
|
150
|
+
insertFinalNewLine: false
|
|
151
|
+
});
|
|
152
|
+
const contents = output.contents[0].contents;
|
|
153
|
+
expect(contents).toContain('Type.Union([');
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
//# sourceMappingURL=discriminated-unions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["render","createTSNamePolicy","SourceFile","Output","describe","expect","it","TypeBoxSchema","TypeBoxSchemaDeclaration","typebox","createTestRunner","expectRender","runner","Shape","Circle","Square","compile","template","_$createComponent","program","namePolicy","externals","children","path","type","output","insertFinalNewLine","contents","toContain","Dog","Vehicle"],"sources":["../../test/discriminated-unions.test.tsx"],"sourcesContent":[null],"mappings":";AAAA,SAA4BA,MAAM,QAAQ,gBAAgB;AAC1D,SAASC,kBAAkB,EAAEC,UAAU,QAAQ,sBAAsB;AAErE,SAASC,MAAM,QAAQ,6BAA6B;AACpD,SAASC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAC7C,SAASC,aAAa;AACtB,SAASC,wBAAwB;AACjC,SAASC,OAAO,QAAQ,iBAAiB;AACzC,SAASC,gBAAgB,EAAEC,YAAY;AAEvCP,QAAQ,CAAC,sBAAsB,EAAE,MAAM;EACrCE,EAAE,CAAC,oDAAoD,EAAE,YAAY;IACnE,MAAMM,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEG,KAAK;MAAEC,MAAM;MAAEC;IAAO,CAAC,GAAI,MAAMH,MAAM,CAACI,OAAO,CAAC;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAA2B;IAE5B,MAAMC,QAAQ,GAAAC,iBAAA,CACXf,MAAM;MAAA,IAACgB,OAAOA,CAAA;QAAA,OAAEP,MAAM,CAACO,OAAO;MAAA;MAAA,IAAEC,UAAUA,CAAA;QAAA,OAAEnB,kBAAkB,CAAC,CAAC;MAAA;MAAEoB,SAAS,EAAE,CAACZ,OAAO,CAAC;MAAA,IAAAa,SAAA;QAAA,OAAAJ,iBAAA,CACpFhB,UAAU;UAACqB,IAAI;UAAA,IAAAD,SAAA;YAAA,QAAAJ,iBAAA,CACbV,wBAAwB;cAACgB,IAAI,EAAEV,MAAM;cAAA;YAAA,IACrC,IAAI,EAAAI,iBAAA,CACJV,wBAAwB;cAACgB,IAAI,EAAET,MAAM;cAAA;YAAA,IACrC,IAAI,EAAAG,iBAAA,CACJV,wBAAwB;cAACgB,IAAI,EAAEX,KAAK;cAAA;YAAA;UAAA;QAAA;MAAA;IAAA,EAG1C;IAED,MAAMY,MAAM,GAAGzB,MAAM,CAACiB,QAAQ,EAAE;MAAES,kBAAkB,EAAE;IAAM,CAAC,CAAC;IAC9D,MAAMC,QAAQ,GAAIF,MAAM,CAACE,QAAQ,CAAC,CAAC,CAAC,CAAuBA,QAAQ;IACnEtB,MAAM,CAACsB,QAAQ,CAAC,CAACC,SAAS,CAAC,8BAA8B,CAAC;EAC5D,CAAC,CAAC;EAEFtB,EAAE,CAAC,8DAA8D,EAAE,YAAY;IAC7E,MAAMM,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEI;IAAO,CAAC,GAAI,MAAMF,MAAM,CAACI,OAAO,CAAC;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAA2B;IAE5BL,YAAY,CACVC,MAAM,CAACO,OAAO,EAAAD,iBAAA,CACbX,aAAa;MAACiB,IAAI,EAAEV;IAAM,IAC3B,8EACF,CAAC;EACH,CAAC,CAAC;EAEFR,EAAE,CAAC,0DAA0D,EAAE,YAAY;IACzE,MAAMM,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEmB;IAAI,CAAC,GAAI,MAAMjB,MAAM,CAACI,OAAO,CAAC;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAA2B;IAE5BL,YAAY,CACVC,MAAM,CAACO,OAAO,EAAAD,iBAAA,CACbX,aAAa;MAACiB,IAAI,EAAEK;IAAG,IACxB,kGACF,CAAC;EACH,CAAC,CAAC;EAEFvB,EAAE,CAAC,sCAAsC,EAAE,YAAY;IACrD,MAAMM,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEoB;IAAQ,CAAC,GAAI,MAAMlB,MAAM,CAACI,OAAO,CAAC;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAA2B;IAE5B,MAAMC,QAAQ,GAAAC,iBAAA,CACXf,MAAM;MAAA,IAACgB,OAAOA,CAAA;QAAA,OAAEP,MAAM,CAACO,OAAO;MAAA;MAAA,IAAEC,UAAUA,CAAA;QAAA,OAAEnB,kBAAkB,CAAC,CAAC;MAAA;MAAEoB,SAAS,EAAE,CAACZ,OAAO,CAAC;MAAA,IAAAa,SAAA;QAAA,OAAAJ,iBAAA,CACpFhB,UAAU;UAACqB,IAAI;UAAA,IAAAD,SAAA;YAAA,OAAAJ,iBAAA,CACbV,wBAAwB;cAACgB,IAAI,EAAEM,OAAO;cAAA;YAAA;UAAA;QAAA;MAAA;IAAA,EAG5C;IAED,MAAML,MAAM,GAAGzB,MAAM,CAACiB,QAAQ,EAAE;MAAES,kBAAkB,EAAE;IAAM,CAAC,CAAC;IAC9D,MAAMC,QAAQ,GAAIF,MAAM,CAACE,QAAQ,CAAC,CAAC,CAAC,CAAuBA,QAAQ;IACnEtB,MAAM,CAACsB,QAAQ,CAAC,CAACC,SAAS,CAAC,cAAc,CAAC;EAC5C,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { render } from '@alloy-js/core';
|
|
2
|
+
import { createTSNamePolicy, SourceFile } from '@alloy-js/typescript';
|
|
3
|
+
import { Output } from '@typespec/emitter-framework';
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { TypeBoxSchema } from '../src/components/TypeBoxSchema.jsx';
|
|
6
|
+
import { TypeBoxSchemaDeclaration } from '../src/components/TypeBoxSchemaDeclaration.jsx';
|
|
7
|
+
import { typebox } from '../src/index.js';
|
|
8
|
+
import { createTestRunner, expectRender } from './utils.jsx';
|
|
9
|
+
describe('discriminated unions', () => {
|
|
10
|
+
it('emits base model as Type.Union of derived variants', async () => {
|
|
11
|
+
const runner = await createTestRunner();
|
|
12
|
+
const { Shape, Circle, Square } = (await runner.compile(`
|
|
13
|
+
@discriminator("kind")
|
|
14
|
+
@test model Shape {
|
|
15
|
+
kind: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@test model Circle extends Shape {
|
|
19
|
+
kind: "circle";
|
|
20
|
+
radius: float64;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@test model Square extends Shape {
|
|
24
|
+
kind: "square";
|
|
25
|
+
side: float64;
|
|
26
|
+
}
|
|
27
|
+
`));
|
|
28
|
+
const template = (<Output program={runner.program} namePolicy={createTSNamePolicy()} externals={[typebox]}>
|
|
29
|
+
<SourceFile path="test.ts">
|
|
30
|
+
<TypeBoxSchemaDeclaration type={Circle} export/>
|
|
31
|
+
{'\n'}
|
|
32
|
+
<TypeBoxSchemaDeclaration type={Square} export/>
|
|
33
|
+
{'\n'}
|
|
34
|
+
<TypeBoxSchemaDeclaration type={Shape} export/>
|
|
35
|
+
</SourceFile>
|
|
36
|
+
</Output>);
|
|
37
|
+
const output = render(template, { insertFinalNewLine: false });
|
|
38
|
+
const contents = output.contents[0].contents;
|
|
39
|
+
expect(contents).toContain('Type.Union([circle, square])');
|
|
40
|
+
});
|
|
41
|
+
it('flattens derived model properties instead of using Intersect', async () => {
|
|
42
|
+
const runner = await createTestRunner();
|
|
43
|
+
const { Circle } = (await runner.compile(`
|
|
44
|
+
@discriminator("kind")
|
|
45
|
+
model Shape {
|
|
46
|
+
kind: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
@test model Circle extends Shape {
|
|
50
|
+
kind: "circle";
|
|
51
|
+
radius: float64;
|
|
52
|
+
}
|
|
53
|
+
`));
|
|
54
|
+
expectRender(runner.program, <TypeBoxSchema type={Circle}/>, 'Type.Object({\n kind: Type.Literal("circle"),\n radius: Type.Number(),\n})');
|
|
55
|
+
});
|
|
56
|
+
it('flattens multi-level inheritance for discriminated types', async () => {
|
|
57
|
+
const runner = await createTestRunner();
|
|
58
|
+
const { Dog } = (await runner.compile(`
|
|
59
|
+
@discriminator("type")
|
|
60
|
+
model Animal {
|
|
61
|
+
type: string;
|
|
62
|
+
name: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
@test model Dog extends Animal {
|
|
66
|
+
type: "dog";
|
|
67
|
+
breed: string;
|
|
68
|
+
}
|
|
69
|
+
`));
|
|
70
|
+
expectRender(runner.program, <TypeBoxSchema type={Dog}/>, 'Type.Object({\n type: Type.Literal("dog"),\n breed: Type.String(),\n name: Type.String(),\n})');
|
|
71
|
+
});
|
|
72
|
+
it('handles three discriminated variants', async () => {
|
|
73
|
+
const runner = await createTestRunner();
|
|
74
|
+
const { Vehicle } = (await runner.compile(`
|
|
75
|
+
@discriminator("type")
|
|
76
|
+
@test model Vehicle {
|
|
77
|
+
type: string;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
model Car extends Vehicle {
|
|
81
|
+
type: "car";
|
|
82
|
+
doors: int32;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
model Bike extends Vehicle {
|
|
86
|
+
type: "bike";
|
|
87
|
+
gears: int32;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
model Truck extends Vehicle {
|
|
91
|
+
type: "truck";
|
|
92
|
+
payload: float64;
|
|
93
|
+
}
|
|
94
|
+
`));
|
|
95
|
+
const template = (<Output program={runner.program} namePolicy={createTSNamePolicy()} externals={[typebox]}>
|
|
96
|
+
<SourceFile path="test.ts">
|
|
97
|
+
<TypeBoxSchemaDeclaration type={Vehicle} export/>
|
|
98
|
+
</SourceFile>
|
|
99
|
+
</Output>);
|
|
100
|
+
const output = render(template, { insertFinalNewLine: false });
|
|
101
|
+
const contents = output.contents[0].contents;
|
|
102
|
+
expect(contents).toContain('Type.Union([');
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
//# sourceMappingURL=discriminated-unions.test.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discriminated-unions.test.jsx","sourceRoot":"","sources":["../../test/discriminated-unions.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-scalars.test.d.ts","sourceRoot":"","sources":["../../../test/emitter/custom-scalars.test.tsx"],"names":[],"mappings":""}
|