@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recursive.test.d.ts","sourceRoot":"","sources":["../../../test/emitter/recursive.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createEmitterTestRunner } from "../utils.js";
3
+ describe('recursive type emitter output', () => {
4
+ it('emits self-referencing tree node', async () => {
5
+ const runner = await createEmitterTestRunner();
6
+ await runner.compile(`
7
+ model TreeNode {
8
+ value: string;
9
+ children: TreeNode[];
10
+ }
11
+ `);
12
+ const {
13
+ text
14
+ } = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
15
+ expect(text.trim()).toMatchSnapshot();
16
+ });
17
+ it('emits recursive model with non-recursive sibling', async () => {
18
+ const runner = await createEmitterTestRunner();
19
+ await runner.compile(`
20
+ model Category {
21
+ name: string;
22
+ subcategories: Category[];
23
+ }
24
+
25
+ model Product {
26
+ title: string;
27
+ category: Category;
28
+ }
29
+ `);
30
+ const {
31
+ text
32
+ } = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
33
+ expect(text.trim()).toMatchSnapshot();
34
+ });
35
+ });
36
+ //# sourceMappingURL=recursive.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/recursive.test.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAC7C,SAASC,uBAAuB;AAEhCH,QAAQ,CAAC,+BAA+B,EAAE,MAAM;EAC9CE,EAAE,CAAC,kCAAkC,EAAE,YAAY;IACjD,MAAME,MAAM,GAAG,MAAMD,uBAAuB,CAAC,CAAC;IAC9C,MAAMC,MAAM,CAACC,OAAO,CAAC;AACzB;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,kDAAkD,EAAE,YAAY;IACjE,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,32 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createEmitterTestRunner } from '../utils.jsx';
3
+ describe('recursive type emitter output', () => {
4
+ it('emits self-referencing tree node', async () => {
5
+ const runner = await createEmitterTestRunner();
6
+ await runner.compile(`
7
+ model TreeNode {
8
+ value: string;
9
+ children: TreeNode[];
10
+ }
11
+ `);
12
+ const { text } = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
13
+ expect(text.trim()).toMatchSnapshot();
14
+ });
15
+ it('emits recursive model with non-recursive sibling', async () => {
16
+ const runner = await createEmitterTestRunner();
17
+ await runner.compile(`
18
+ model Category {
19
+ name: string;
20
+ subcategories: Category[];
21
+ }
22
+
23
+ model Product {
24
+ title: string;
25
+ category: Category;
26
+ }
27
+ `);
28
+ const { text } = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
29
+ expect(text.trim()).toMatchSnapshot();
30
+ });
31
+ });
32
+ //# sourceMappingURL=recursive.test.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recursive.test.jsx","sourceRoot":"","sources":["../../../test/emitter/recursive.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,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,MAAM,GAAG,MAAM,uBAAuB,EAAE,CAAC;QAC/C,MAAM,MAAM,CAAC,OAAO,CAAC;;;;;KAKpB,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,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,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=tuples.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuples.test.d.ts","sourceRoot":"","sources":["../../../test/emitter/tuples.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createEmitterTestRunner } from "../utils.js";
3
+ describe('tuple emitter output', () => {
4
+ it('emits model with tuple properties', async () => {
5
+ const runner = await createEmitterTestRunner();
6
+ await runner.compile(`
7
+ model Coordinate {
8
+ point: [float64, float64];
9
+ label: string;
10
+ }
11
+
12
+ model Response {
13
+ data: [string, int32, boolean];
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
+ });
22
+ //# sourceMappingURL=tuples.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/tuples.test.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAC7C,SAASC,uBAAuB;AAEhCH,QAAQ,CAAC,sBAAsB,EAAE,MAAM;EACrCE,EAAE,CAAC,mCAAmC,EAAE,YAAY;IAClD,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;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,20 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createEmitterTestRunner } from '../utils.jsx';
3
+ describe('tuple emitter output', () => {
4
+ it('emits model with tuple properties', async () => {
5
+ const runner = await createEmitterTestRunner();
6
+ await runner.compile(`
7
+ model Coordinate {
8
+ point: [float64, float64];
9
+ label: string;
10
+ }
11
+
12
+ model Response {
13
+ data: [string, int32, boolean];
14
+ }
15
+ `);
16
+ const { text } = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
17
+ expect(text.trim()).toMatchSnapshot();
18
+ });
19
+ });
20
+ //# sourceMappingURL=tuples.test.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuples.test.jsx","sourceRoot":"","sources":["../../../test/emitter/tuples.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,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,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;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/inheritance.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,162 @@
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('inheritance', () => {
11
+ it('works with simple single inheritance', async () => {
12
+ const runner = await createTestRunner();
13
+ const {
14
+ Animal,
15
+ Dog
16
+ } = await runner.compile(`
17
+ @test model Animal {
18
+ name: string;
19
+ }
20
+
21
+ @test model Dog extends Animal {
22
+ breed: string;
23
+ }
24
+ `);
25
+ const template = _$createComponent(Output, {
26
+ get program() {
27
+ return runner.program;
28
+ },
29
+ get namePolicy() {
30
+ return createTSNamePolicy();
31
+ },
32
+ externals: [typebox],
33
+ get children() {
34
+ return _$createComponent(SourceFile, {
35
+ path: "test.ts",
36
+ get children() {
37
+ return [_$createComponent(TypeBoxSchemaDeclaration, {
38
+ type: Animal,
39
+ "export": true
40
+ }), '\n', _$createComponent(TypeBoxSchemaDeclaration, {
41
+ type: Dog,
42
+ "export": true
43
+ })];
44
+ }
45
+ });
46
+ }
47
+ });
48
+ const output = render(template, {
49
+ insertFinalNewLine: false
50
+ });
51
+ const contents = output.contents[0].contents;
52
+ expect(contents).toContain('Type.Intersect([\n animal,');
53
+ expect(contents).toContain('breed: Type.String()');
54
+ });
55
+ it('model with no base still emits Type.Object', async () => {
56
+ const runner = await createTestRunner();
57
+ const {
58
+ Standalone
59
+ } = await runner.compile(`
60
+ @test model Standalone {
61
+ value: string;
62
+ }
63
+ `);
64
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
65
+ type: Standalone
66
+ }), 'Type.Object({\n value: Type.String(),\n})');
67
+ });
68
+ it('works with multiple levels of inheritance', async () => {
69
+ const runner = await createTestRunner();
70
+ const {
71
+ Base,
72
+ Middle,
73
+ Leaf
74
+ } = await runner.compile(`
75
+ @test model Base {
76
+ id: string;
77
+ }
78
+
79
+ @test model Middle extends Base {
80
+ name: string;
81
+ }
82
+
83
+ @test model Leaf extends Middle {
84
+ extra: string;
85
+ }
86
+ `);
87
+ const template = _$createComponent(Output, {
88
+ get program() {
89
+ return runner.program;
90
+ },
91
+ get namePolicy() {
92
+ return createTSNamePolicy();
93
+ },
94
+ externals: [typebox],
95
+ get children() {
96
+ return _$createComponent(SourceFile, {
97
+ path: "test.ts",
98
+ get children() {
99
+ return [_$createComponent(TypeBoxSchemaDeclaration, {
100
+ type: Base,
101
+ "export": true
102
+ }), '\n', _$createComponent(TypeBoxSchemaDeclaration, {
103
+ type: Middle,
104
+ "export": true
105
+ }), '\n', _$createComponent(TypeBoxSchemaDeclaration, {
106
+ type: Leaf,
107
+ "export": true
108
+ })];
109
+ }
110
+ });
111
+ }
112
+ });
113
+ const output = render(template, {
114
+ insertFinalNewLine: false
115
+ });
116
+ const contents = output.contents[0].contents;
117
+ expect(contents).toContain('Type.Intersect([\n base,');
118
+ expect(contents).toContain('Type.Intersect([\n middle,');
119
+ });
120
+ it('works with empty extension', async () => {
121
+ const runner = await createTestRunner();
122
+ const {
123
+ Animal,
124
+ EmptyDog
125
+ } = await runner.compile(`
126
+ @test model Animal {
127
+ name: string;
128
+ }
129
+
130
+ @test model EmptyDog extends Animal {}
131
+ `);
132
+ const template = _$createComponent(Output, {
133
+ get program() {
134
+ return runner.program;
135
+ },
136
+ get namePolicy() {
137
+ return createTSNamePolicy();
138
+ },
139
+ externals: [typebox],
140
+ get children() {
141
+ return _$createComponent(SourceFile, {
142
+ path: "test.ts",
143
+ get children() {
144
+ return [_$createComponent(TypeBoxSchemaDeclaration, {
145
+ type: Animal,
146
+ "export": true
147
+ }), '\n', _$createComponent(TypeBoxSchemaDeclaration, {
148
+ type: EmptyDog,
149
+ "export": true
150
+ })];
151
+ }
152
+ });
153
+ }
154
+ });
155
+ const output = render(template, {
156
+ insertFinalNewLine: false
157
+ });
158
+ const contents = output.contents[0].contents;
159
+ expect(contents).toContain('Type.Intersect([animal, Type.Object({})]');
160
+ });
161
+ });
162
+ //# sourceMappingURL=inheritance.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["render","createTSNamePolicy","SourceFile","Output","describe","expect","it","TypeBoxSchema","TypeBoxSchemaDeclaration","typebox","createTestRunner","expectRender","runner","Animal","Dog","compile","template","_$createComponent","program","namePolicy","externals","children","path","type","output","insertFinalNewLine","contents","toContain","Standalone","Base","Middle","Leaf","EmptyDog"],"sources":["../../test/inheritance.test.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,92 @@
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('inheritance', () => {
10
+ it('works with simple single inheritance', async () => {
11
+ const runner = await createTestRunner();
12
+ const { Animal, Dog } = (await runner.compile(`
13
+ @test model Animal {
14
+ name: string;
15
+ }
16
+
17
+ @test model Dog extends Animal {
18
+ breed: string;
19
+ }
20
+ `));
21
+ const template = (<Output program={runner.program} namePolicy={createTSNamePolicy()} externals={[typebox]}>
22
+ <SourceFile path="test.ts">
23
+ <TypeBoxSchemaDeclaration type={Animal} export/>
24
+ {'\n'}
25
+ <TypeBoxSchemaDeclaration type={Dog} export/>
26
+ </SourceFile>
27
+ </Output>);
28
+ const output = render(template, { insertFinalNewLine: false });
29
+ const contents = output.contents[0].contents;
30
+ expect(contents).toContain('Type.Intersect([\n animal,');
31
+ expect(contents).toContain('breed: Type.String()');
32
+ });
33
+ it('model with no base still emits Type.Object', async () => {
34
+ const runner = await createTestRunner();
35
+ const { Standalone } = (await runner.compile(`
36
+ @test model Standalone {
37
+ value: string;
38
+ }
39
+ `));
40
+ expectRender(runner.program, <TypeBoxSchema type={Standalone}/>, 'Type.Object({\n value: Type.String(),\n})');
41
+ });
42
+ it('works with multiple levels of inheritance', async () => {
43
+ const runner = await createTestRunner();
44
+ const { Base, Middle, Leaf } = (await runner.compile(`
45
+ @test model Base {
46
+ id: string;
47
+ }
48
+
49
+ @test model Middle extends Base {
50
+ name: string;
51
+ }
52
+
53
+ @test model Leaf extends Middle {
54
+ extra: string;
55
+ }
56
+ `));
57
+ const template = (<Output program={runner.program} namePolicy={createTSNamePolicy()} externals={[typebox]}>
58
+ <SourceFile path="test.ts">
59
+ <TypeBoxSchemaDeclaration type={Base} export/>
60
+ {'\n'}
61
+ <TypeBoxSchemaDeclaration type={Middle} export/>
62
+ {'\n'}
63
+ <TypeBoxSchemaDeclaration type={Leaf} export/>
64
+ </SourceFile>
65
+ </Output>);
66
+ const output = render(template, { insertFinalNewLine: false });
67
+ const contents = output.contents[0].contents;
68
+ expect(contents).toContain('Type.Intersect([\n base,');
69
+ expect(contents).toContain('Type.Intersect([\n middle,');
70
+ });
71
+ it('works with empty extension', async () => {
72
+ const runner = await createTestRunner();
73
+ const { Animal, EmptyDog } = (await runner.compile(`
74
+ @test model Animal {
75
+ name: string;
76
+ }
77
+
78
+ @test model EmptyDog extends Animal {}
79
+ `));
80
+ const template = (<Output program={runner.program} namePolicy={createTSNamePolicy()} externals={[typebox]}>
81
+ <SourceFile path="test.ts">
82
+ <TypeBoxSchemaDeclaration type={Animal} export/>
83
+ {'\n'}
84
+ <TypeBoxSchemaDeclaration type={EmptyDog} export/>
85
+ </SourceFile>
86
+ </Output>);
87
+ const output = render(template, { insertFinalNewLine: false });
88
+ const contents = output.contents[0].contents;
89
+ expect(contents).toContain('Type.Intersect([animal, Type.Object({})]');
90
+ });
91
+ });
92
+ //# sourceMappingURL=inheritance.test.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inheritance.test.jsx","sourceRoot":"","sources":["../../test/inheritance.test.tsx"],"names":[],"mappings":"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"}
@@ -90,6 +90,41 @@ describe('models', () => {
90
90
  const contents = output.contents[0].contents;
91
91
  expect(contents).toContain('child: child');
92
92
  });
93
+ it('works with inline anonymous model property', async () => {
94
+ const runner = await createTestRunner();
95
+ const {
96
+ Parent
97
+ } = await runner.compile(`
98
+ @test model Parent {
99
+ details: {
100
+ firstName: string;
101
+ lastName: string;
102
+ };
103
+ }
104
+ `);
105
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
106
+ type: Parent
107
+ }), 'Type.Object({\n details: Type.Object({\n firstName: Type.String(),\n lastName: Type.String(),\n }),\n})');
108
+ });
109
+ it('works with spread properties', async () => {
110
+ const runner = await createTestRunner();
111
+ const {
112
+ Extended
113
+ } = await runner.compile(`
114
+ model Base {
115
+ name: string;
116
+ age: int32;
117
+ }
118
+
119
+ @test model Extended {
120
+ ...Base;
121
+ email: string;
122
+ }
123
+ `);
124
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
125
+ type: Extended
126
+ }), 'Type.Object({\n name: Type.String(),\n age: Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n }),\n email: Type.String(),\n})');
127
+ });
93
128
  it('works with literal property types', async () => {
94
129
  const runner = await createTestRunner();
95
130
  const {
@@ -1 +1 @@
1
- {"version":3,"names":["render","createTSNamePolicy","SourceFile","Output","describe","expect","it","TypeBoxSchema","TypeBoxSchemaDeclaration","typebox","createTestRunner","expectRender","runner","EmptyModel","compile","program","_$createComponent","type","SimpleModel","OptModel","Child","Parent","template","namePolicy","externals","children","path","output","insertFinalNewLine","contents","toContain","LitModel"],"sources":["../../test/models.test.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["render","createTSNamePolicy","SourceFile","Output","describe","expect","it","TypeBoxSchema","TypeBoxSchemaDeclaration","typebox","createTestRunner","expectRender","runner","EmptyModel","compile","program","_$createComponent","type","SimpleModel","OptModel","Child","Parent","template","namePolicy","externals","children","path","output","insertFinalNewLine","contents","toContain","Extended","LitModel"],"sources":["../../test/models.test.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -56,6 +56,33 @@ describe('models', () => {
56
56
  const contents = output.contents[0].contents;
57
57
  expect(contents).toContain('child: child');
58
58
  });
59
+ it('works with inline anonymous model property', async () => {
60
+ const runner = await createTestRunner();
61
+ const { Parent } = (await runner.compile(`
62
+ @test model Parent {
63
+ details: {
64
+ firstName: string;
65
+ lastName: string;
66
+ };
67
+ }
68
+ `));
69
+ expectRender(runner.program, <TypeBoxSchema type={Parent}/>, 'Type.Object({\n details: Type.Object({\n firstName: Type.String(),\n lastName: Type.String(),\n }),\n})');
70
+ });
71
+ it('works with spread properties', async () => {
72
+ const runner = await createTestRunner();
73
+ const { Extended } = (await runner.compile(`
74
+ model Base {
75
+ name: string;
76
+ age: int32;
77
+ }
78
+
79
+ @test model Extended {
80
+ ...Base;
81
+ email: string;
82
+ }
83
+ `));
84
+ expectRender(runner.program, <TypeBoxSchema type={Extended}/>, 'Type.Object({\n name: Type.String(),\n age: Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n }),\n email: Type.String(),\n})');
85
+ });
59
86
  it('works with literal property types', async () => {
60
87
  const runner = await createTestRunner();
61
88
  const { LitModel } = (await runner.compile(`
@@ -1 +1 @@
1
- {"version":3,"file":"models.test.jsx","sourceRoot":"","sources":["../../test/models.test.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"models.test.jsx","sourceRoot":"","sources":["../../test/models.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=recursive.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recursive.test.d.ts","sourceRoot":"","sources":["../../test/recursive.test.tsx"],"names":[],"mappings":""}