@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.
Files changed (74) hide show
  1. package/dist/src/components/TypeBoxSchema.d.ts.map +1 -1
  2. package/dist/src/components/TypeBoxSchema.js +6 -2
  3. package/dist/src/components/TypeBoxSchema.js.map +1 -1
  4. package/dist/src/components/TypeBoxSchema.jsx +6 -2
  5. package/dist/src/components/TypeBoxSchema.jsx.map +1 -1
  6. package/dist/src/typeboxBaseSchema.d.ts +2 -1
  7. package/dist/src/typeboxBaseSchema.d.ts.map +1 -1
  8. package/dist/src/typeboxBaseSchema.js +139 -41
  9. package/dist/src/typeboxBaseSchema.js.map +1 -1
  10. package/dist/src/typeboxBaseSchema.jsx +112 -24
  11. package/dist/src/typeboxBaseSchema.jsx.map +1 -1
  12. package/dist/test/dictionaries.test.js +14 -0
  13. package/dist/test/dictionaries.test.js.map +1 -1
  14. package/dist/test/dictionaries.test.jsx +10 -0
  15. package/dist/test/dictionaries.test.jsx.map +1 -1
  16. package/dist/test/discriminated-unions.test.d.ts +2 -0
  17. package/dist/test/discriminated-unions.test.d.ts.map +1 -0
  18. package/dist/test/discriminated-unions.test.js +156 -0
  19. package/dist/test/discriminated-unions.test.js.map +1 -0
  20. package/dist/test/discriminated-unions.test.jsx +105 -0
  21. package/dist/test/discriminated-unions.test.jsx.map +1 -0
  22. package/dist/test/emitter/custom-scalars.test.d.ts +2 -0
  23. package/dist/test/emitter/custom-scalars.test.d.ts.map +1 -0
  24. package/dist/test/emitter/custom-scalars.test.js +42 -0
  25. package/dist/test/emitter/custom-scalars.test.js.map +1 -0
  26. package/dist/test/emitter/custom-scalars.test.jsx +38 -0
  27. package/dist/test/emitter/custom-scalars.test.jsx.map +1 -0
  28. package/dist/test/emitter/discriminated-unions.test.d.ts +2 -0
  29. package/dist/test/emitter/discriminated-unions.test.d.ts.map +1 -0
  30. package/dist/test/emitter/discriminated-unions.test.js +52 -0
  31. package/dist/test/emitter/discriminated-unions.test.js.map +1 -0
  32. package/dist/test/emitter/discriminated-unions.test.jsx +48 -0
  33. package/dist/test/emitter/discriminated-unions.test.jsx.map +1 -0
  34. package/dist/test/emitter/inheritance.test.d.ts +2 -0
  35. package/dist/test/emitter/inheritance.test.d.ts.map +1 -0
  36. package/dist/test/emitter/inheritance.test.js +56 -0
  37. package/dist/test/emitter/inheritance.test.js.map +1 -0
  38. package/dist/test/emitter/inheritance.test.jsx +50 -0
  39. package/dist/test/emitter/inheritance.test.jsx.map +1 -0
  40. package/dist/test/emitter/recursive.test.d.ts +2 -0
  41. package/dist/test/emitter/recursive.test.d.ts.map +1 -0
  42. package/dist/test/emitter/recursive.test.js +36 -0
  43. package/dist/test/emitter/recursive.test.js.map +1 -0
  44. package/dist/test/emitter/recursive.test.jsx +32 -0
  45. package/dist/test/emitter/recursive.test.jsx.map +1 -0
  46. package/dist/test/emitter/tuples.test.d.ts +2 -0
  47. package/dist/test/emitter/tuples.test.d.ts.map +1 -0
  48. package/dist/test/emitter/tuples.test.js +22 -0
  49. package/dist/test/emitter/tuples.test.js.map +1 -0
  50. package/dist/test/emitter/tuples.test.jsx +20 -0
  51. package/dist/test/emitter/tuples.test.jsx.map +1 -0
  52. package/dist/test/inheritance.test.d.ts +2 -0
  53. package/dist/test/inheritance.test.d.ts.map +1 -0
  54. package/dist/test/inheritance.test.js +162 -0
  55. package/dist/test/inheritance.test.js.map +1 -0
  56. package/dist/test/inheritance.test.jsx +92 -0
  57. package/dist/test/inheritance.test.jsx.map +1 -0
  58. package/dist/test/models.test.js +35 -0
  59. package/dist/test/models.test.js.map +1 -1
  60. package/dist/test/models.test.jsx +27 -0
  61. package/dist/test/models.test.jsx.map +1 -1
  62. package/dist/test/recursive.test.d.ts +2 -0
  63. package/dist/test/recursive.test.d.ts.map +1 -0
  64. package/dist/test/recursive.test.js +137 -0
  65. package/dist/test/recursive.test.js.map +1 -0
  66. package/dist/test/recursive.test.jsx +75 -0
  67. package/dist/test/recursive.test.jsx.map +1 -0
  68. package/dist/test/tuples.test.d.ts +2 -0
  69. package/dist/test/tuples.test.d.ts.map +1 -0
  70. package/dist/test/tuples.test.js +67 -0
  71. package/dist/test/tuples.test.js.map +1 -0
  72. package/dist/test/tuples.test.jsx +42 -0
  73. package/dist/test/tuples.test.jsx.map +1 -0
  74. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=discriminated-unions.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=custom-scalars.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=discriminated-unions.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=inheritance.test.d.ts.map
@@ -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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=recursive.test.d.ts.map