@typespec-dev/emitter-typebox 0.1.0 → 0.3.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 (113) hide show
  1. package/README.md +70 -0
  2. package/dist/src/components/TypeBoxSchema.d.ts.map +1 -1
  3. package/dist/src/components/TypeBoxSchema.js +4 -3
  4. package/dist/src/components/TypeBoxSchema.js.map +1 -1
  5. package/dist/src/components/TypeBoxSchema.jsx +4 -3
  6. package/dist/src/components/TypeBoxSchema.jsx.map +1 -1
  7. package/dist/src/components/TypeBoxSchemaDeclaration.d.ts.map +1 -1
  8. package/dist/src/components/TypeBoxSchemaDeclaration.js +20 -4
  9. package/dist/src/components/TypeBoxSchemaDeclaration.js.map +1 -1
  10. package/dist/src/components/TypeBoxSchemaDeclaration.jsx +22 -6
  11. package/dist/src/components/TypeBoxSchemaDeclaration.jsx.map +1 -1
  12. package/dist/src/emitter.d.ts.map +1 -1
  13. package/dist/src/emitter.js +1 -2
  14. package/dist/src/emitter.js.map +1 -1
  15. package/dist/src/emitter.jsx +1 -2
  16. package/dist/src/emitter.jsx.map +1 -1
  17. package/dist/src/external-packages/typebox.d.ts +1 -0
  18. package/dist/src/external-packages/typebox.d.ts.map +1 -1
  19. package/dist/src/external-packages/typebox.js +1 -1
  20. package/dist/src/external-packages/typebox.js.map +1 -1
  21. package/dist/src/typeboxBaseSchema.d.ts +2 -2
  22. package/dist/src/typeboxBaseSchema.d.ts.map +1 -1
  23. package/dist/src/typeboxBaseSchema.js +219 -34
  24. package/dist/src/typeboxBaseSchema.js.map +1 -1
  25. package/dist/src/typeboxBaseSchema.jsx +121 -28
  26. package/dist/src/typeboxBaseSchema.jsx.map +1 -1
  27. package/dist/src/typeboxConstraints.d.ts +10 -0
  28. package/dist/src/typeboxConstraints.d.ts.map +1 -0
  29. package/dist/src/typeboxConstraints.js +308 -0
  30. package/dist/src/typeboxConstraints.js.map +1 -0
  31. package/dist/src/typeboxConstraints.jsx +246 -0
  32. package/dist/src/typeboxConstraints.jsx.map +1 -0
  33. package/dist/test/arrays.test.d.ts +2 -0
  34. package/dist/test/arrays.test.d.ts.map +1 -0
  35. package/dist/test/arrays.test.js +65 -0
  36. package/dist/test/arrays.test.js.map +1 -0
  37. package/dist/test/arrays.test.jsx +42 -0
  38. package/dist/test/arrays.test.jsx.map +1 -0
  39. package/dist/test/constraints.test.d.ts +2 -0
  40. package/dist/test/constraints.test.d.ts.map +1 -0
  41. package/dist/test/constraints.test.js +414 -0
  42. package/dist/test/constraints.test.js.map +1 -0
  43. package/dist/test/constraints.test.jsx +279 -0
  44. package/dist/test/constraints.test.jsx.map +1 -0
  45. package/dist/test/dictionaries.test.d.ts +2 -0
  46. package/dist/test/dictionaries.test.d.ts.map +1 -0
  47. package/dist/test/dictionaries.test.js +50 -0
  48. package/dist/test/dictionaries.test.js.map +1 -0
  49. package/dist/test/dictionaries.test.jsx +33 -0
  50. package/dist/test/dictionaries.test.jsx.map +1 -0
  51. package/dist/test/emitter/enums.test.d.ts +2 -0
  52. package/dist/test/emitter/enums.test.d.ts.map +1 -0
  53. package/dist/test/emitter/enums.test.js +48 -0
  54. package/dist/test/emitter/enums.test.js.map +1 -0
  55. package/dist/test/emitter/enums.test.jsx +42 -0
  56. package/dist/test/emitter/enums.test.jsx.map +1 -0
  57. package/dist/test/emitter/models.test.d.ts +2 -0
  58. package/dist/test/emitter/models.test.d.ts.map +1 -0
  59. package/dist/test/emitter/models.test.js +36 -0
  60. package/dist/test/emitter/models.test.js.map +1 -0
  61. package/dist/test/emitter/models.test.jsx +32 -0
  62. package/dist/test/emitter/models.test.jsx.map +1 -0
  63. package/dist/test/emitter/records.test.d.ts +2 -0
  64. package/dist/test/emitter/records.test.d.ts.map +1 -0
  65. package/dist/test/emitter/records.test.js +18 -0
  66. package/dist/test/emitter/records.test.js.map +1 -0
  67. package/dist/test/emitter/records.test.jsx +16 -0
  68. package/dist/test/emitter/records.test.jsx.map +1 -0
  69. package/dist/test/emitter/unions.test.d.ts +2 -0
  70. package/dist/test/emitter/unions.test.d.ts.map +1 -0
  71. package/dist/test/emitter/unions.test.js +37 -0
  72. package/dist/test/emitter/unions.test.js.map +1 -0
  73. package/dist/test/emitter/unions.test.jsx +33 -0
  74. package/dist/test/emitter/unions.test.jsx.map +1 -0
  75. package/dist/test/enums.test.d.ts +2 -0
  76. package/dist/test/enums.test.d.ts.map +1 -0
  77. package/dist/test/enums.test.js +53 -0
  78. package/dist/test/enums.test.js.map +1 -0
  79. package/dist/test/enums.test.jsx +40 -0
  80. package/dist/test/enums.test.jsx.map +1 -0
  81. package/dist/test/models.test.d.ts +2 -0
  82. package/dist/test/models.test.d.ts.map +1 -0
  83. package/dist/test/models.test.js +109 -0
  84. package/dist/test/models.test.js.map +1 -0
  85. package/dist/test/models.test.jsx +71 -0
  86. package/dist/test/models.test.jsx.map +1 -0
  87. package/dist/test/nullable.test.d.ts +2 -0
  88. package/dist/test/nullable.test.d.ts.map +1 -0
  89. package/dist/test/nullable.test.js +46 -0
  90. package/dist/test/nullable.test.js.map +1 -0
  91. package/dist/test/nullable.test.jsx +33 -0
  92. package/dist/test/nullable.test.jsx.map +1 -0
  93. package/dist/test/optionality.test.d.ts +2 -0
  94. package/dist/test/optionality.test.d.ts.map +1 -0
  95. package/dist/test/optionality.test.js +61 -0
  96. package/dist/test/optionality.test.js.map +1 -0
  97. package/dist/test/optionality.test.jsx +44 -0
  98. package/dist/test/optionality.test.jsx.map +1 -0
  99. package/dist/test/scalars.test.js +13 -13
  100. package/dist/test/scalars.test.js.map +1 -1
  101. package/dist/test/scalars.test.jsx +13 -13
  102. package/dist/test/scalars.test.jsx.map +1 -1
  103. package/dist/test/unions.test.d.ts +2 -0
  104. package/dist/test/unions.test.d.ts.map +1 -0
  105. package/dist/test/unions.test.js +51 -0
  106. package/dist/test/unions.test.js.map +1 -0
  107. package/dist/test/unions.test.jsx +38 -0
  108. package/dist/test/unions.test.jsx.map +1 -0
  109. package/dist/test/utils.js +4 -1
  110. package/dist/test/utils.js.map +1 -1
  111. package/dist/test/utils.jsx +2 -2
  112. package/dist/test/utils.jsx.map +1 -1
  113. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=unions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unions.test.d.ts","sourceRoot":"","sources":["../../../test/emitter/unions.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createEmitterTestRunner } from "../utils.js";
3
+ describe('union and nullable emitter output', () => {
4
+ it('emits named union types', async () => {
5
+ const runner = await createEmitterTestRunner();
6
+ await runner.compile(`
7
+ union Status {
8
+ active: "active",
9
+ inactive: "inactive",
10
+ }
11
+
12
+ union Result {
13
+ success: string,
14
+ error: int32,
15
+ }
16
+ `);
17
+ const {
18
+ text
19
+ } = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
20
+ expect(text.trim()).toMatchSnapshot();
21
+ });
22
+ it('emits model with nullable properties', async () => {
23
+ const runner = await createEmitterTestRunner();
24
+ await runner.compile(`
25
+ model Profile {
26
+ name: string;
27
+ bio: string | null;
28
+ age?: int32 | null;
29
+ }
30
+ `);
31
+ const {
32
+ text
33
+ } = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
34
+ expect(text.trim()).toMatchSnapshot();
35
+ });
36
+ });
37
+ //# sourceMappingURL=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/unions.test.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAC7C,SAASC,uBAAuB;AAEhCH,QAAQ,CAAC,mCAAmC,EAAE,MAAM;EAClDE,EAAE,CAAC,yBAAyB,EAAE,YAAY;IACxC,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;EAEFT,EAAE,CAAC,sCAAsC,EAAE,YAAY;IACrD,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,33 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createEmitterTestRunner } from '../utils.jsx';
3
+ describe('union and nullable emitter output', () => {
4
+ it('emits named union types', async () => {
5
+ const runner = await createEmitterTestRunner();
6
+ await runner.compile(`
7
+ union Status {
8
+ active: "active",
9
+ inactive: "inactive",
10
+ }
11
+
12
+ union Result {
13
+ success: string,
14
+ error: int32,
15
+ }
16
+ `);
17
+ const { text } = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
18
+ expect(text.trim()).toMatchSnapshot();
19
+ });
20
+ it('emits model with nullable properties', async () => {
21
+ const runner = await createEmitterTestRunner();
22
+ await runner.compile(`
23
+ model Profile {
24
+ name: string;
25
+ bio: string | null;
26
+ age?: int32 | null;
27
+ }
28
+ `);
29
+ const { text } = await runner.program.host.readFile('@typespec-dev/emitter-typebox/models.ts');
30
+ expect(text.trim()).toMatchSnapshot();
31
+ });
32
+ });
33
+ //# sourceMappingURL=unions.test.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unions.test.jsx","sourceRoot":"","sources":["../../../test/emitter/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,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,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;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,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=enums.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enums.test.d.ts","sourceRoot":"","sources":["../../test/enums.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,53 @@
1
+ import { createComponent as _$createComponent } from "@alloy-js/core/jsx-runtime";
2
+ import { describe, it } from 'vitest';
3
+ import { TypeBoxSchema } from "../src/components/TypeBoxSchema.js";
4
+ import { createTestRunner, expectRender } from "./utils.js";
5
+ describe('enums', () => {
6
+ it('works with string enum', async () => {
7
+ const runner = await createTestRunner();
8
+ const {
9
+ Direction
10
+ } = await runner.compile(`
11
+ @test enum Direction {
12
+ Up,
13
+ Down,
14
+ Left,
15
+ Right,
16
+ }
17
+ `);
18
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
19
+ type: Direction
20
+ }), 'Type.Union([\n Type.Literal("Up"),\n Type.Literal("Down"),\n Type.Literal("Left"),\n Type.Literal("Right")\n])');
21
+ });
22
+ it('works with string enum with values', async () => {
23
+ const runner = await createTestRunner();
24
+ const {
25
+ Color
26
+ } = await runner.compile(`
27
+ @test enum Color {
28
+ Red: "red",
29
+ Green: "green",
30
+ Blue: "blue",
31
+ }
32
+ `);
33
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
34
+ type: Color
35
+ }), 'Type.Union([Type.Literal("red"), Type.Literal("green"), Type.Literal("blue")])');
36
+ });
37
+ it('works with numeric enum', async () => {
38
+ const runner = await createTestRunner();
39
+ const {
40
+ Priority
41
+ } = await runner.compile(`
42
+ @test enum Priority {
43
+ Low: 0,
44
+ Medium: 1,
45
+ High: 2,
46
+ }
47
+ `);
48
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
49
+ type: Priority
50
+ }), 'Type.Union([Type.Literal(0), Type.Literal(1), Type.Literal(2)])');
51
+ });
52
+ });
53
+ //# sourceMappingURL=enums.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["describe","it","TypeBoxSchema","createTestRunner","expectRender","runner","Direction","compile","program","_$createComponent","type","Color","Priority"],"sources":["../../test/enums.test.tsx"],"sourcesContent":[null],"mappings":";AACA,SAASA,QAAQ,EAAEC,EAAE,QAAQ,QAAQ;AACrC,SAASC,aAAa;AACtB,SAASC,gBAAgB,EAAEC,YAAY;AAEvCJ,QAAQ,CAAC,OAAO,EAAE,MAAM;EACtBC,EAAE,CAAC,wBAAwB,EAAE,YAAY;IACvC,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEG;IAAU,CAAC,GAAI,MAAMD,MAAM,CAACE,OAAO,CAAC;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAA0B;IAE3BH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAACQ,IAAI,EAAEJ;IAAS,IAC9B,oHACF,CAAC;EACH,CAAC,CAAC;EAEFL,EAAE,CAAC,oCAAoC,EAAE,YAAY;IACnD,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEQ;IAAM,CAAC,GAAI,MAAMN,MAAM,CAACE,OAAO,CAAC;AAC5C;AACA;AACA;AACA;AACA;AACA,KAAK,CAA0B;IAE3BH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAACQ,IAAI,EAAEC;IAAK,IAC1B,gFACF,CAAC;EACH,CAAC,CAAC;EAEFV,EAAE,CAAC,yBAAyB,EAAE,YAAY;IACxC,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAES;IAAS,CAAC,GAAI,MAAMP,MAAM,CAACE,OAAO,CAAC;AAC/C;AACA;AACA;AACA;AACA;AACA,KAAK,CAA0B;IAE3BH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAACQ,IAAI,EAAEE;IAAQ,IAC7B,iEACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,40 @@
1
+ import { describe, it } from 'vitest';
2
+ import { TypeBoxSchema } from '../src/components/TypeBoxSchema.jsx';
3
+ import { createTestRunner, expectRender } from './utils.jsx';
4
+ describe('enums', () => {
5
+ it('works with string enum', async () => {
6
+ const runner = await createTestRunner();
7
+ const { Direction } = (await runner.compile(`
8
+ @test enum Direction {
9
+ Up,
10
+ Down,
11
+ Left,
12
+ Right,
13
+ }
14
+ `));
15
+ expectRender(runner.program, <TypeBoxSchema type={Direction}/>, 'Type.Union([\n Type.Literal("Up"),\n Type.Literal("Down"),\n Type.Literal("Left"),\n Type.Literal("Right")\n])');
16
+ });
17
+ it('works with string enum with values', async () => {
18
+ const runner = await createTestRunner();
19
+ const { Color } = (await runner.compile(`
20
+ @test enum Color {
21
+ Red: "red",
22
+ Green: "green",
23
+ Blue: "blue",
24
+ }
25
+ `));
26
+ expectRender(runner.program, <TypeBoxSchema type={Color}/>, 'Type.Union([Type.Literal("red"), Type.Literal("green"), Type.Literal("blue")])');
27
+ });
28
+ it('works with numeric enum', async () => {
29
+ const runner = await createTestRunner();
30
+ const { Priority } = (await runner.compile(`
31
+ @test enum Priority {
32
+ Low: 0,
33
+ Medium: 1,
34
+ High: 2,
35
+ }
36
+ `));
37
+ expectRender(runner.program, <TypeBoxSchema type={Priority}/>, 'Type.Union([Type.Literal(0), Type.Literal(1), Type.Literal(2)])');
38
+ });
39
+ });
40
+ //# sourceMappingURL=enums.test.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enums.test.jsx","sourceRoot":"","sources":["../../test/enums.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,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;;;;KAO3C,CAAC,CAAyB,CAAC;QAE5B,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,EAAG,EAClC,oHAAoH,CACrH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;;;KAMvC,CAAC,CAAyB,CAAC;QAE5B,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAG,EAC9B,gFAAgF,CACjF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;;;KAM1C,CAAC,CAAyB,CAAC;QAE5B,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAG,EACjC,iEAAiE,CAClE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=models.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.test.d.ts","sourceRoot":"","sources":["../../test/models.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,109 @@
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('models', () => {
11
+ it('works with empty model', async () => {
12
+ const runner = await createTestRunner();
13
+ const {
14
+ EmptyModel
15
+ } = await runner.compile(`
16
+ @test model EmptyModel {}
17
+ `);
18
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
19
+ type: EmptyModel
20
+ }), 'Type.Object({})');
21
+ });
22
+ it('works with simple model', async () => {
23
+ const runner = await createTestRunner();
24
+ const {
25
+ SimpleModel
26
+ } = await runner.compile(`
27
+ @test model SimpleModel {
28
+ name: string;
29
+ age: int32;
30
+ }
31
+ `);
32
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
33
+ type: SimpleModel
34
+ }), 'Type.Object({\n name: Type.String(),\n age: Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n }),\n})');
35
+ });
36
+ it('works with optional properties', async () => {
37
+ const runner = await createTestRunner();
38
+ const {
39
+ OptModel
40
+ } = await runner.compile(`
41
+ @test model OptModel {
42
+ required: string;
43
+ optional?: int32;
44
+ }
45
+ `);
46
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
47
+ type: OptModel
48
+ }), 'Type.Object({\n required: Type.String(),\n optional: Type.Optional(Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n })),\n})');
49
+ });
50
+ it('works with nested model reference', async () => {
51
+ const runner = await createTestRunner();
52
+ const {
53
+ Child,
54
+ Parent
55
+ } = await runner.compile(`
56
+ @test model Child {
57
+ value: string;
58
+ }
59
+
60
+ @test model Parent {
61
+ child: Child;
62
+ }
63
+ `);
64
+ const template = _$createComponent(Output, {
65
+ get program() {
66
+ return runner.program;
67
+ },
68
+ get namePolicy() {
69
+ return createTSNamePolicy();
70
+ },
71
+ externals: [typebox],
72
+ get children() {
73
+ return _$createComponent(SourceFile, {
74
+ path: "test.ts",
75
+ get children() {
76
+ return [_$createComponent(TypeBoxSchemaDeclaration, {
77
+ type: Child,
78
+ "export": true
79
+ }), '\n', _$createComponent(TypeBoxSchemaDeclaration, {
80
+ type: Parent,
81
+ "export": true
82
+ })];
83
+ }
84
+ });
85
+ }
86
+ });
87
+ const output = render(template, {
88
+ insertFinalNewLine: false
89
+ });
90
+ const contents = output.contents[0].contents;
91
+ expect(contents).toContain('child: child');
92
+ });
93
+ it('works with literal property types', async () => {
94
+ const runner = await createTestRunner();
95
+ const {
96
+ LitModel
97
+ } = await runner.compile(`
98
+ @test model LitModel {
99
+ status: "active";
100
+ count: 42;
101
+ flag: true;
102
+ }
103
+ `);
104
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
105
+ type: LitModel
106
+ }), 'Type.Object({\n status: Type.Literal("active"),\n count: Type.Literal(42),\n flag: Type.Literal(true),\n})');
107
+ });
108
+ });
109
+ //# sourceMappingURL=models.test.js.map
@@ -0,0 +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":[]}
@@ -0,0 +1,71 @@
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('models', () => {
10
+ it('works with empty model', async () => {
11
+ const runner = await createTestRunner();
12
+ const { EmptyModel } = (await runner.compile(`
13
+ @test model EmptyModel {}
14
+ `));
15
+ expectRender(runner.program, <TypeBoxSchema type={EmptyModel}/>, 'Type.Object({})');
16
+ });
17
+ it('works with simple model', async () => {
18
+ const runner = await createTestRunner();
19
+ const { SimpleModel } = (await runner.compile(`
20
+ @test model SimpleModel {
21
+ name: string;
22
+ age: int32;
23
+ }
24
+ `));
25
+ expectRender(runner.program, <TypeBoxSchema type={SimpleModel}/>, 'Type.Object({\n name: Type.String(),\n age: Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n }),\n})');
26
+ });
27
+ it('works with optional properties', async () => {
28
+ const runner = await createTestRunner();
29
+ const { OptModel } = (await runner.compile(`
30
+ @test model OptModel {
31
+ required: string;
32
+ optional?: int32;
33
+ }
34
+ `));
35
+ expectRender(runner.program, <TypeBoxSchema type={OptModel}/>, 'Type.Object({\n required: Type.String(),\n optional: Type.Optional(Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n })),\n})');
36
+ });
37
+ it('works with nested model reference', async () => {
38
+ const runner = await createTestRunner();
39
+ const { Child, Parent } = (await runner.compile(`
40
+ @test model Child {
41
+ value: string;
42
+ }
43
+
44
+ @test model Parent {
45
+ child: Child;
46
+ }
47
+ `));
48
+ const template = (<Output program={runner.program} namePolicy={createTSNamePolicy()} externals={[typebox]}>
49
+ <SourceFile path="test.ts">
50
+ <TypeBoxSchemaDeclaration type={Child} export/>
51
+ {'\n'}
52
+ <TypeBoxSchemaDeclaration type={Parent} export/>
53
+ </SourceFile>
54
+ </Output>);
55
+ const output = render(template, { insertFinalNewLine: false });
56
+ const contents = output.contents[0].contents;
57
+ expect(contents).toContain('child: child');
58
+ });
59
+ it('works with literal property types', async () => {
60
+ const runner = await createTestRunner();
61
+ const { LitModel } = (await runner.compile(`
62
+ @test model LitModel {
63
+ status: "active";
64
+ count: 42;
65
+ flag: true;
66
+ }
67
+ `));
68
+ expectRender(runner.program, <TypeBoxSchema type={LitModel}/>, 'Type.Object({\n status: Type.Literal("active"),\n count: Type.Literal(42),\n flag: Type.Literal(true),\n})');
69
+ });
70
+ });
71
+ //# sourceMappingURL=models.test.jsx.map
@@ -0,0 +1 @@
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=nullable.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nullable.test.d.ts","sourceRoot":"","sources":["../../test/nullable.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import { createComponent as _$createComponent } from "@alloy-js/core/jsx-runtime";
2
+ import { describe, it } from 'vitest';
3
+ import { TypeBoxSchema } from "../src/components/TypeBoxSchema.js";
4
+ import { createTestRunner, expectRender } from "./utils.js";
5
+ describe('nullable', () => {
6
+ it('works with nullable string property', async () => {
7
+ const runner = await createTestRunner();
8
+ const {
9
+ NullModel
10
+ } = await runner.compile(`
11
+ @test model NullModel {
12
+ name: string | null;
13
+ }
14
+ `);
15
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
16
+ type: NullModel
17
+ }), 'Type.Object({\n name: Type.Union([Type.String(), Type.Null()]),\n})');
18
+ });
19
+ it('works with nullable integer property', async () => {
20
+ const runner = await createTestRunner();
21
+ const {
22
+ NullInt
23
+ } = await runner.compile(`
24
+ @test model NullInt {
25
+ count: int32 | null;
26
+ }
27
+ `);
28
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
29
+ type: NullInt
30
+ }), 'Type.Object({\n count: Type.Union([\n Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n }),\n Type.Null()\n ]),\n})');
31
+ });
32
+ it('works with optional nullable property', async () => {
33
+ const runner = await createTestRunner();
34
+ const {
35
+ OptNull
36
+ } = await runner.compile(`
37
+ @test model OptNull {
38
+ value?: string | null;
39
+ }
40
+ `);
41
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
42
+ type: OptNull
43
+ }), 'Type.Object({\n value: Type.Optional(Type.Union([Type.String(), Type.Null()])),\n})');
44
+ });
45
+ });
46
+ //# sourceMappingURL=nullable.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["describe","it","TypeBoxSchema","createTestRunner","expectRender","runner","NullModel","compile","program","_$createComponent","type","NullInt","OptNull"],"sources":["../../test/nullable.test.tsx"],"sourcesContent":[null],"mappings":";AACA,SAASA,QAAQ,EAAEC,EAAE,QAAQ,QAAQ;AACrC,SAASC,aAAa;AACtB,SAASC,gBAAgB,EAAEC,YAAY;AAEvCJ,QAAQ,CAAC,UAAU,EAAE,MAAM;EACzBC,EAAE,CAAC,qCAAqC,EAAE,YAAY;IACpD,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEG;IAAU,CAAC,GAAI,MAAMD,MAAM,CAACE,OAAO,CAAC;AAChD;AACA;AACA;AACA,KAAK,CAA2B;IAE5BH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAACQ,IAAI,EAAEJ;IAAS,IAC9B,sEACF,CAAC;EACH,CAAC,CAAC;EAEFL,EAAE,CAAC,sCAAsC,EAAE,YAAY;IACrD,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEQ;IAAQ,CAAC,GAAI,MAAMN,MAAM,CAACE,OAAO,CAAC;AAC9C;AACA;AACA;AACA,KAAK,CAA2B;IAE5BH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAACQ,IAAI,EAAEC;IAAO,IAC5B,uJACF,CAAC;EACH,CAAC,CAAC;EAEFV,EAAE,CAAC,uCAAuC,EAAE,YAAY;IACtD,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAES;IAAQ,CAAC,GAAI,MAAMP,MAAM,CAACE,OAAO,CAAC;AAC9C;AACA;AACA;AACA,KAAK,CAA2B;IAE5BH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAACQ,IAAI,EAAEE;IAAO,IAC5B,sFACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,33 @@
1
+ import { describe, it } from 'vitest';
2
+ import { TypeBoxSchema } from '../src/components/TypeBoxSchema.jsx';
3
+ import { createTestRunner, expectRender } from './utils.jsx';
4
+ describe('nullable', () => {
5
+ it('works with nullable string property', async () => {
6
+ const runner = await createTestRunner();
7
+ const { NullModel } = (await runner.compile(`
8
+ @test model NullModel {
9
+ name: string | null;
10
+ }
11
+ `));
12
+ expectRender(runner.program, <TypeBoxSchema type={NullModel}/>, 'Type.Object({\n name: Type.Union([Type.String(), Type.Null()]),\n})');
13
+ });
14
+ it('works with nullable integer property', async () => {
15
+ const runner = await createTestRunner();
16
+ const { NullInt } = (await runner.compile(`
17
+ @test model NullInt {
18
+ count: int32 | null;
19
+ }
20
+ `));
21
+ expectRender(runner.program, <TypeBoxSchema type={NullInt}/>, 'Type.Object({\n count: Type.Union([\n Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n }),\n Type.Null()\n ]),\n})');
22
+ });
23
+ it('works with optional nullable property', async () => {
24
+ const runner = await createTestRunner();
25
+ const { OptNull } = (await runner.compile(`
26
+ @test model OptNull {
27
+ value?: string | null;
28
+ }
29
+ `));
30
+ expectRender(runner.program, <TypeBoxSchema type={OptNull}/>, 'Type.Object({\n value: Type.Optional(Type.Union([Type.String(), Type.Null()])),\n})');
31
+ });
32
+ });
33
+ //# sourceMappingURL=nullable.test.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nullable.test.jsx","sourceRoot":"","sources":["../../test/nullable.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,UAAU,EAAE,GAAG,EAAE;IACxB,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,sEAAsE,CACvE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;KAIzC,CAAC,CAA0B,CAAC;QAE7B,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAG,EAChC,uJAAuJ,CACxJ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;KAIzC,CAAC,CAA0B,CAAC;QAE7B,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAG,EAChC,sFAAsF,CACvF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=optionality.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optionality.test.d.ts","sourceRoot":"","sources":["../../test/optionality.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ import { createComponent as _$createComponent } from "@alloy-js/core/jsx-runtime";
2
+ import { describe, it } from 'vitest';
3
+ import { TypeBoxSchema } from "../src/components/TypeBoxSchema.js";
4
+ import { createTestRunner, expectRender } from "./utils.js";
5
+ describe('optionality', () => {
6
+ it('wraps optional string with Type.Optional', async () => {
7
+ const runner = await createTestRunner();
8
+ const {
9
+ OptModel
10
+ } = await runner.compile(`
11
+ @test model OptModel {
12
+ name?: string;
13
+ }
14
+ `);
15
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
16
+ type: OptModel
17
+ }), 'Type.Object({\n name: Type.Optional(Type.String()),\n})');
18
+ });
19
+ it('wraps optional integer with Type.Optional', async () => {
20
+ const runner = await createTestRunner();
21
+ const {
22
+ OptInt
23
+ } = await runner.compile(`
24
+ @test model OptInt {
25
+ count?: int32;
26
+ }
27
+ `);
28
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
29
+ type: OptInt
30
+ }), 'Type.Object({\n count: Type.Optional(Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n })),\n})');
31
+ });
32
+ it('does not wrap required properties', async () => {
33
+ const runner = await createTestRunner();
34
+ const {
35
+ ReqModel
36
+ } = await runner.compile(`
37
+ @test model ReqModel {
38
+ name: string;
39
+ }
40
+ `);
41
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
42
+ type: ReqModel
43
+ }), 'Type.Object({\n name: Type.String(),\n})');
44
+ });
45
+ it('handles mix of required and optional', async () => {
46
+ const runner = await createTestRunner();
47
+ const {
48
+ MixedModel
49
+ } = await runner.compile(`
50
+ @test model MixedModel {
51
+ required: string;
52
+ optional?: int32;
53
+ alsoRequired: boolean;
54
+ }
55
+ `);
56
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
57
+ type: MixedModel
58
+ }), 'Type.Object({\n required: Type.String(),\n optional: Type.Optional(Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n })),\n alsoRequired: Type.Boolean(),\n})');
59
+ });
60
+ });
61
+ //# sourceMappingURL=optionality.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["describe","it","TypeBoxSchema","createTestRunner","expectRender","runner","OptModel","compile","program","_$createComponent","type","OptInt","ReqModel","MixedModel"],"sources":["../../test/optionality.test.tsx"],"sourcesContent":[null],"mappings":";AACA,SAASA,QAAQ,EAAEC,EAAE,QAAQ,QAAQ;AACrC,SAASC,aAAa;AACtB,SAASC,gBAAgB,EAAEC,YAAY;AAEvCJ,QAAQ,CAAC,aAAa,EAAE,MAAM;EAC5BC,EAAE,CAAC,0CAA0C,EAAE,YAAY;IACzD,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEG;IAAS,CAAC,GAAI,MAAMD,MAAM,CAACE,OAAO,CAAC;AAC/C;AACA;AACA;AACA,KAAK,CAA2B;IAE5BH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAACQ,IAAI,EAAEJ;IAAQ,IAC7B,0DACF,CAAC;EACH,CAAC,CAAC;EAEFL,EAAE,CAAC,2CAA2C,EAAE,YAAY;IAC1D,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEQ;IAAO,CAAC,GAAI,MAAMN,MAAM,CAACE,OAAO,CAAC;AAC7C;AACA;AACA;AACA,KAAK,CAA2B;IAE5BH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAACQ,IAAI,EAAEC;IAAM,IAC3B,sHACF,CAAC;EACH,CAAC,CAAC;EAEFV,EAAE,CAAC,mCAAmC,EAAE,YAAY;IAClD,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAES;IAAS,CAAC,GAAI,MAAMP,MAAM,CAACE,OAAO,CAAC;AAC/C;AACA;AACA;AACA,KAAK,CAA2B;IAE5BH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAACQ,IAAI,EAAEE;IAAQ,IAC7B,2CACF,CAAC;EACH,CAAC,CAAC;EAEFX,EAAE,CAAC,sCAAsC,EAAE,YAAY;IACrD,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEU;IAAW,CAAC,GAAI,MAAMR,MAAM,CAACE,OAAO,CAAC;AACjD;AACA;AACA;AACA;AACA;AACA,KAAK,CAA2B;IAE5BH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAACQ,IAAI,EAAEG;IAAU,IAC/B,sLACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,44 @@
1
+ import { describe, it } from 'vitest';
2
+ import { TypeBoxSchema } from '../src/components/TypeBoxSchema.jsx';
3
+ import { createTestRunner, expectRender } from './utils.jsx';
4
+ describe('optionality', () => {
5
+ it('wraps optional string with Type.Optional', async () => {
6
+ const runner = await createTestRunner();
7
+ const { OptModel } = (await runner.compile(`
8
+ @test model OptModel {
9
+ name?: string;
10
+ }
11
+ `));
12
+ expectRender(runner.program, <TypeBoxSchema type={OptModel}/>, 'Type.Object({\n name: Type.Optional(Type.String()),\n})');
13
+ });
14
+ it('wraps optional integer with Type.Optional', async () => {
15
+ const runner = await createTestRunner();
16
+ const { OptInt } = (await runner.compile(`
17
+ @test model OptInt {
18
+ count?: int32;
19
+ }
20
+ `));
21
+ expectRender(runner.program, <TypeBoxSchema type={OptInt}/>, 'Type.Object({\n count: Type.Optional(Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n })),\n})');
22
+ });
23
+ it('does not wrap required properties', async () => {
24
+ const runner = await createTestRunner();
25
+ const { ReqModel } = (await runner.compile(`
26
+ @test model ReqModel {
27
+ name: string;
28
+ }
29
+ `));
30
+ expectRender(runner.program, <TypeBoxSchema type={ReqModel}/>, 'Type.Object({\n name: Type.String(),\n})');
31
+ });
32
+ it('handles mix of required and optional', async () => {
33
+ const runner = await createTestRunner();
34
+ const { MixedModel } = (await runner.compile(`
35
+ @test model MixedModel {
36
+ required: string;
37
+ optional?: int32;
38
+ alsoRequired: boolean;
39
+ }
40
+ `));
41
+ expectRender(runner.program, <TypeBoxSchema type={MixedModel}/>, 'Type.Object({\n required: Type.String(),\n optional: Type.Optional(Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n })),\n alsoRequired: Type.Boolean(),\n})');
42
+ });
43
+ });
44
+ //# sourceMappingURL=optionality.test.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optionality.test.jsx","sourceRoot":"","sources":["../../test/optionality.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,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;KAI1C,CAAC,CAA0B,CAAC;QAE7B,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAG,EACjC,0DAA0D,CAC3D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;KAIxC,CAAC,CAA0B,CAAC;QAE7B,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAG,EAC/B,sHAAsH,CACvH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;KAI1C,CAAC,CAA0B,CAAC;QAE7B,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAG,EACjC,2CAA2C,CAC5C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;;;KAM5C,CAAC,CAA0B,CAAC;QAE7B,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,EAAG,EACnC,sLAAsL,CACvL,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}