@typespec-dev/emitter-typebox 0.3.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/dist/src/components/TypeBoxSchema.d.ts.map +1 -1
- package/dist/src/components/TypeBoxSchema.js +6 -2
- package/dist/src/components/TypeBoxSchema.js.map +1 -1
- package/dist/src/components/TypeBoxSchema.jsx +6 -2
- package/dist/src/components/TypeBoxSchema.jsx.map +1 -1
- package/dist/src/typeboxBaseSchema.d.ts +2 -1
- package/dist/src/typeboxBaseSchema.d.ts.map +1 -1
- package/dist/src/typeboxBaseSchema.js +139 -41
- package/dist/src/typeboxBaseSchema.js.map +1 -1
- package/dist/src/typeboxBaseSchema.jsx +112 -24
- package/dist/src/typeboxBaseSchema.jsx.map +1 -1
- package/dist/test/dictionaries.test.js +14 -0
- package/dist/test/dictionaries.test.js.map +1 -1
- package/dist/test/dictionaries.test.jsx +10 -0
- 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 +35 -0
- package/dist/test/models.test.js.map +1 -1
- package/dist/test/models.test.jsx +27 -0
- package/dist/test/models.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/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/package.json +7 -7
|
@@ -20,6 +20,16 @@ describe('dictionaries', () => {
|
|
|
20
20
|
`));
|
|
21
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
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])');
|
|
32
|
+
});
|
|
23
33
|
it('works with record property in model', async () => {
|
|
24
34
|
const runner = await createTestRunner();
|
|
25
35
|
const { DictModel } = (await runner.compile(`
|
|
@@ -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,+GAA+G,CAChH,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"}
|
|
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":"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","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":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { createEmitterTestRunner } from "../utils.js";
|
|
3
|
+
describe('custom scalar emitter output', () => {
|
|
4
|
+
it('emits custom scalars extending string used in model', async () => {
|
|
5
|
+
const runner = await createEmitterTestRunner();
|
|
6
|
+
await runner.compile(`
|
|
7
|
+
@maxLength(255)
|
|
8
|
+
scalar Email extends string;
|
|
9
|
+
|
|
10
|
+
scalar UserId extends string;
|
|
11
|
+
|
|
12
|
+
model User {
|
|
13
|
+
id: UserId;
|
|
14
|
+
email: Email;
|
|
15
|
+
name: string;
|
|
16
|
+
}
|
|
17
|
+
`);
|
|
18
|
+
const {
|
|
19
|
+
text
|
|
20
|
+
} = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
|
|
21
|
+
expect(text.trim()).toMatchSnapshot();
|
|
22
|
+
});
|
|
23
|
+
it('emits custom scalars extending numeric types', async () => {
|
|
24
|
+
const runner = await createEmitterTestRunner();
|
|
25
|
+
await runner.compile(`
|
|
26
|
+
@minValue(1)
|
|
27
|
+
scalar PositiveInt extends int32;
|
|
28
|
+
|
|
29
|
+
scalar Percentage extends float64;
|
|
30
|
+
|
|
31
|
+
model Stats {
|
|
32
|
+
count: PositiveInt;
|
|
33
|
+
ratio: Percentage;
|
|
34
|
+
}
|
|
35
|
+
`);
|
|
36
|
+
const {
|
|
37
|
+
text
|
|
38
|
+
} = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
|
|
39
|
+
expect(text.trim()).toMatchSnapshot();
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=custom-scalars.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["describe","expect","it","createEmitterTestRunner","runner","compile","text","program","host","readFile","trim","toMatchSnapshot"],"sources":["../../../test/emitter/custom-scalars.test.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAC7C,SAASC,uBAAuB;AAEhCH,QAAQ,CAAC,8BAA8B,EAAE,MAAM;EAC7CE,EAAE,CAAC,qDAAqD,EAAE,YAAY;IACpE,MAAME,MAAM,GAAG,MAAMD,uBAAuB,CAAC,CAAC;IAC9C,MAAMC,MAAM,CAACC,OAAO,CAAC;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAAC;IAEF,MAAM;MAAEC;IAAK,CAAC,GAAG,MAAMF,MAAM,CAACG,OAAO,CAACC,IAAI,CAACC,QAAQ,CAAC,yCAAyC,CAAC;IAC9FR,MAAM,CAACK,IAAI,CAACI,IAAI,CAAC,CAAC,CAAC,CAACC,eAAe,CAAC,CAAC;EACvC,CAAC,CAAC;EAEFT,EAAE,CAAC,8CAA8C,EAAE,YAAY;IAC7D,MAAME,MAAM,GAAG,MAAMD,uBAAuB,CAAC,CAAC;IAC9C,MAAMC,MAAM,CAACC,OAAO,CAAC;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAAC;IAEF,MAAM;MAAEC;IAAK,CAAC,GAAG,MAAMF,MAAM,CAACG,OAAO,CAACC,IAAI,CAACC,QAAQ,CAAC,yCAAyC,CAAC;IAC9FR,MAAM,CAACK,IAAI,CAACI,IAAI,CAAC,CAAC,CAAC,CAACC,eAAe,CAAC,CAAC;EACvC,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { createEmitterTestRunner } from '../utils.jsx';
|
|
3
|
+
describe('custom scalar emitter output', () => {
|
|
4
|
+
it('emits custom scalars extending string used in model', async () => {
|
|
5
|
+
const runner = await createEmitterTestRunner();
|
|
6
|
+
await runner.compile(`
|
|
7
|
+
@maxLength(255)
|
|
8
|
+
scalar Email extends string;
|
|
9
|
+
|
|
10
|
+
scalar UserId extends string;
|
|
11
|
+
|
|
12
|
+
model User {
|
|
13
|
+
id: UserId;
|
|
14
|
+
email: Email;
|
|
15
|
+
name: string;
|
|
16
|
+
}
|
|
17
|
+
`);
|
|
18
|
+
const { text } = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
|
|
19
|
+
expect(text.trim()).toMatchSnapshot();
|
|
20
|
+
});
|
|
21
|
+
it('emits custom scalars extending numeric types', async () => {
|
|
22
|
+
const runner = await createEmitterTestRunner();
|
|
23
|
+
await runner.compile(`
|
|
24
|
+
@minValue(1)
|
|
25
|
+
scalar PositiveInt extends int32;
|
|
26
|
+
|
|
27
|
+
scalar Percentage extends float64;
|
|
28
|
+
|
|
29
|
+
model Stats {
|
|
30
|
+
count: PositiveInt;
|
|
31
|
+
ratio: Percentage;
|
|
32
|
+
}
|
|
33
|
+
`);
|
|
34
|
+
const { text } = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
|
|
35
|
+
expect(text.trim()).toMatchSnapshot();
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=custom-scalars.test.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-scalars.test.jsx","sourceRoot":"","sources":["../../../test/emitter/custom-scalars.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,MAAM,GAAG,MAAM,uBAAuB,EAAE,CAAC;QAC/C,MAAM,MAAM,CAAC,OAAO,CAAC;;;;;;;;;;;KAWpB,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC;QAC/F,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,MAAM,GAAG,MAAM,uBAAuB,EAAE,CAAC;QAC/C,MAAM,MAAM,CAAC,OAAO,CAAC;;;;;;;;;;KAUpB,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC;QAC/F,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discriminated-unions.test.d.ts","sourceRoot":"","sources":["../../../test/emitter/discriminated-unions.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { createEmitterTestRunner } from "../utils.js";
|
|
3
|
+
describe('discriminated union emitter output', () => {
|
|
4
|
+
it('emits discriminated union from inheritance', async () => {
|
|
5
|
+
const runner = await createEmitterTestRunner();
|
|
6
|
+
await runner.compile(`
|
|
7
|
+
@discriminator("kind")
|
|
8
|
+
model Shape {
|
|
9
|
+
kind: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
model Circle extends Shape {
|
|
13
|
+
kind: "circle";
|
|
14
|
+
radius: float64;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
model Square extends Shape {
|
|
18
|
+
kind: "square";
|
|
19
|
+
side: float64;
|
|
20
|
+
}
|
|
21
|
+
`);
|
|
22
|
+
const {
|
|
23
|
+
text
|
|
24
|
+
} = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
|
|
25
|
+
expect(text.trim()).toMatchSnapshot();
|
|
26
|
+
});
|
|
27
|
+
it('emits discriminated union with additional inherited properties', async () => {
|
|
28
|
+
const runner = await createEmitterTestRunner();
|
|
29
|
+
await runner.compile(`
|
|
30
|
+
@discriminator("type")
|
|
31
|
+
model Pet {
|
|
32
|
+
type: string;
|
|
33
|
+
name: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
model Cat extends Pet {
|
|
37
|
+
type: "cat";
|
|
38
|
+
indoor: boolean;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
model Dog extends Pet {
|
|
42
|
+
type: "dog";
|
|
43
|
+
trained: boolean;
|
|
44
|
+
}
|
|
45
|
+
`);
|
|
46
|
+
const {
|
|
47
|
+
text
|
|
48
|
+
} = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
|
|
49
|
+
expect(text.trim()).toMatchSnapshot();
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=discriminated-unions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["describe","expect","it","createEmitterTestRunner","runner","compile","text","program","host","readFile","trim","toMatchSnapshot"],"sources":["../../../test/emitter/discriminated-unions.test.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAC7C,SAASC,uBAAuB;AAEhCH,QAAQ,CAAC,oCAAoC,EAAE,MAAM;EACnDE,EAAE,CAAC,4CAA4C,EAAE,YAAY;IAC3D,MAAME,MAAM,GAAG,MAAMD,uBAAuB,CAAC,CAAC;IAC9C,MAAMC,MAAM,CAACC,OAAO,CAAC;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAAC;IAEF,MAAM;MAAEC;IAAK,CAAC,GAAG,MAAMF,MAAM,CAACG,OAAO,CAACC,IAAI,CAACC,QAAQ,CAAC,yCAAyC,CAAC;IAC9FR,MAAM,CAACK,IAAI,CAACI,IAAI,CAAC,CAAC,CAAC,CAACC,eAAe,CAAC,CAAC;EACvC,CAAC,CAAC;EAEFT,EAAE,CAAC,gEAAgE,EAAE,YAAY;IAC/E,MAAME,MAAM,GAAG,MAAMD,uBAAuB,CAAC,CAAC;IAC9C,MAAMC,MAAM,CAACC,OAAO,CAAC;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAAC;IAEF,MAAM;MAAEC;IAAK,CAAC,GAAG,MAAMF,MAAM,CAACG,OAAO,CAACC,IAAI,CAACC,QAAQ,CAAC,yCAAyC,CAAC;IAC9FR,MAAM,CAACK,IAAI,CAACI,IAAI,CAAC,CAAC,CAAC,CAACC,eAAe,CAAC,CAAC;EACvC,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { createEmitterTestRunner } from '../utils.jsx';
|
|
3
|
+
describe('discriminated union emitter output', () => {
|
|
4
|
+
it('emits discriminated union from inheritance', async () => {
|
|
5
|
+
const runner = await createEmitterTestRunner();
|
|
6
|
+
await runner.compile(`
|
|
7
|
+
@discriminator("kind")
|
|
8
|
+
model Shape {
|
|
9
|
+
kind: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
model Circle extends Shape {
|
|
13
|
+
kind: "circle";
|
|
14
|
+
radius: float64;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
model Square extends Shape {
|
|
18
|
+
kind: "square";
|
|
19
|
+
side: float64;
|
|
20
|
+
}
|
|
21
|
+
`);
|
|
22
|
+
const { text } = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
|
|
23
|
+
expect(text.trim()).toMatchSnapshot();
|
|
24
|
+
});
|
|
25
|
+
it('emits discriminated union with additional inherited properties', async () => {
|
|
26
|
+
const runner = await createEmitterTestRunner();
|
|
27
|
+
await runner.compile(`
|
|
28
|
+
@discriminator("type")
|
|
29
|
+
model Pet {
|
|
30
|
+
type: string;
|
|
31
|
+
name: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
model Cat extends Pet {
|
|
35
|
+
type: "cat";
|
|
36
|
+
indoor: boolean;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
model Dog extends Pet {
|
|
40
|
+
type: "dog";
|
|
41
|
+
trained: boolean;
|
|
42
|
+
}
|
|
43
|
+
`);
|
|
44
|
+
const { text } = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
|
|
45
|
+
expect(text.trim()).toMatchSnapshot();
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=discriminated-unions.test.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discriminated-unions.test.jsx","sourceRoot":"","sources":["../../../test/emitter/discriminated-unions.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,MAAM,GAAG,MAAM,uBAAuB,EAAE,CAAC;QAC/C,MAAM,MAAM,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;KAepB,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC;QAC/F,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,MAAM,GAAG,MAAM,uBAAuB,EAAE,CAAC;QAC/C,MAAM,MAAM,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;KAgBpB,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC;QAC/F,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inheritance.test.d.ts","sourceRoot":"","sources":["../../../test/emitter/inheritance.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { createEmitterTestRunner } from "../utils.js";
|
|
3
|
+
describe('inheritance emitter output', () => {
|
|
4
|
+
it('emits single inheritance with Intersect', async () => {
|
|
5
|
+
const runner = await createEmitterTestRunner();
|
|
6
|
+
await runner.compile(`
|
|
7
|
+
model Animal {
|
|
8
|
+
name: string;
|
|
9
|
+
age: int32;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
model Dog extends Animal {
|
|
13
|
+
breed: string;
|
|
14
|
+
}
|
|
15
|
+
`);
|
|
16
|
+
const {
|
|
17
|
+
text
|
|
18
|
+
} = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
|
|
19
|
+
expect(text.trim()).toMatchSnapshot();
|
|
20
|
+
});
|
|
21
|
+
it('emits multi-level inheritance', async () => {
|
|
22
|
+
const runner = await createEmitterTestRunner();
|
|
23
|
+
await runner.compile(`
|
|
24
|
+
model Base {
|
|
25
|
+
id: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
model Middle extends Base {
|
|
29
|
+
name: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
model Leaf extends Middle {
|
|
33
|
+
extra: int32;
|
|
34
|
+
}
|
|
35
|
+
`);
|
|
36
|
+
const {
|
|
37
|
+
text
|
|
38
|
+
} = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
|
|
39
|
+
expect(text.trim()).toMatchSnapshot();
|
|
40
|
+
});
|
|
41
|
+
it('emits empty extension', async () => {
|
|
42
|
+
const runner = await createEmitterTestRunner();
|
|
43
|
+
await runner.compile(`
|
|
44
|
+
model Animal {
|
|
45
|
+
name: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
model EmptyDog extends Animal {}
|
|
49
|
+
`);
|
|
50
|
+
const {
|
|
51
|
+
text
|
|
52
|
+
} = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
|
|
53
|
+
expect(text.trim()).toMatchSnapshot();
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=inheritance.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["describe","expect","it","createEmitterTestRunner","runner","compile","text","program","host","readFile","trim","toMatchSnapshot"],"sources":["../../../test/emitter/inheritance.test.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAC7C,SAASC,uBAAuB;AAEhCH,QAAQ,CAAC,4BAA4B,EAAE,MAAM;EAC3CE,EAAE,CAAC,yCAAyC,EAAE,YAAY;IACxD,MAAME,MAAM,GAAG,MAAMD,uBAAuB,CAAC,CAAC;IAC9C,MAAMC,MAAM,CAACC,OAAO,CAAC;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAAC;IAEF,MAAM;MAAEC;IAAK,CAAC,GAAG,MAAMF,MAAM,CAACG,OAAO,CAACC,IAAI,CAACC,QAAQ,CAAC,yCAAyC,CAAC;IAC9FR,MAAM,CAACK,IAAI,CAACI,IAAI,CAAC,CAAC,CAAC,CAACC,eAAe,CAAC,CAAC;EACvC,CAAC,CAAC;EAEFT,EAAE,CAAC,+BAA+B,EAAE,YAAY;IAC9C,MAAME,MAAM,GAAG,MAAMD,uBAAuB,CAAC,CAAC;IAC9C,MAAMC,MAAM,CAACC,OAAO,CAAC;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAAC;IAEF,MAAM;MAAEC;IAAK,CAAC,GAAG,MAAMF,MAAM,CAACG,OAAO,CAACC,IAAI,CAACC,QAAQ,CAAC,yCAAyC,CAAC;IAC9FR,MAAM,CAACK,IAAI,CAACI,IAAI,CAAC,CAAC,CAAC,CAACC,eAAe,CAAC,CAAC;EACvC,CAAC,CAAC;EAEFT,EAAE,CAAC,uBAAuB,EAAE,YAAY;IACtC,MAAME,MAAM,GAAG,MAAMD,uBAAuB,CAAC,CAAC;IAC9C,MAAMC,MAAM,CAACC,OAAO,CAAC;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK,CAAC;IAEF,MAAM;MAAEC;IAAK,CAAC,GAAG,MAAMF,MAAM,CAACG,OAAO,CAACC,IAAI,CAACC,QAAQ,CAAC,yCAAyC,CAAC;IAC9FR,MAAM,CAACK,IAAI,CAACI,IAAI,CAAC,CAAC,CAAC,CAACC,eAAe,CAAC,CAAC;EACvC,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { createEmitterTestRunner } from '../utils.jsx';
|
|
3
|
+
describe('inheritance emitter output', () => {
|
|
4
|
+
it('emits single inheritance with Intersect', async () => {
|
|
5
|
+
const runner = await createEmitterTestRunner();
|
|
6
|
+
await runner.compile(`
|
|
7
|
+
model Animal {
|
|
8
|
+
name: string;
|
|
9
|
+
age: int32;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
model Dog extends Animal {
|
|
13
|
+
breed: string;
|
|
14
|
+
}
|
|
15
|
+
`);
|
|
16
|
+
const { text } = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
|
|
17
|
+
expect(text.trim()).toMatchSnapshot();
|
|
18
|
+
});
|
|
19
|
+
it('emits multi-level inheritance', async () => {
|
|
20
|
+
const runner = await createEmitterTestRunner();
|
|
21
|
+
await runner.compile(`
|
|
22
|
+
model Base {
|
|
23
|
+
id: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
model Middle extends Base {
|
|
27
|
+
name: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
model Leaf extends Middle {
|
|
31
|
+
extra: int32;
|
|
32
|
+
}
|
|
33
|
+
`);
|
|
34
|
+
const { text } = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
|
|
35
|
+
expect(text.trim()).toMatchSnapshot();
|
|
36
|
+
});
|
|
37
|
+
it('emits empty extension', async () => {
|
|
38
|
+
const runner = await createEmitterTestRunner();
|
|
39
|
+
await runner.compile(`
|
|
40
|
+
model Animal {
|
|
41
|
+
name: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
model EmptyDog extends Animal {}
|
|
45
|
+
`);
|
|
46
|
+
const { text } = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
|
|
47
|
+
expect(text.trim()).toMatchSnapshot();
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=inheritance.test.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inheritance.test.jsx","sourceRoot":"","sources":["../../../test/emitter/inheritance.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,MAAM,GAAG,MAAM,uBAAuB,EAAE,CAAC;QAC/C,MAAM,MAAM,CAAC,OAAO,CAAC;;;;;;;;;KASpB,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC;QAC/F,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,uBAAuB,EAAE,CAAC;QAC/C,MAAM,MAAM,CAAC,OAAO,CAAC;;;;;;;;;;;;KAYpB,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC;QAC/F,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,MAAM,GAAG,MAAM,uBAAuB,EAAE,CAAC;QAC/C,MAAM,MAAM,CAAC,OAAO,CAAC;;;;;;KAMpB,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC;QAC/F,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|