@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,137 @@
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('recursive types', () => {
11
+ it('wraps self-referencing model in Type.Recursive', async () => {
12
+ const runner = await createTestRunner();
13
+ const {
14
+ TreeNode
15
+ } = await runner.compile(`
16
+ @test model TreeNode {
17
+ value: string;
18
+ children: TreeNode[];
19
+ }
20
+ `);
21
+ const template = _$createComponent(Output, {
22
+ get program() {
23
+ return runner.program;
24
+ },
25
+ get namePolicy() {
26
+ return createTSNamePolicy();
27
+ },
28
+ externals: [typebox],
29
+ get children() {
30
+ return _$createComponent(SourceFile, {
31
+ path: "test.ts",
32
+ get children() {
33
+ return _$createComponent(TypeBoxSchemaDeclaration, {
34
+ type: TreeNode,
35
+ "export": true
36
+ });
37
+ }
38
+ });
39
+ }
40
+ });
41
+ const output = render(template, {
42
+ insertFinalNewLine: false
43
+ });
44
+ const contents = output.contents[0].contents;
45
+ expect(contents).toContain('Type.Recursive(This =>');
46
+ expect(contents).toContain('Type.Array(This)');
47
+ expect(contents).toContain('value: Type.String()');
48
+ });
49
+ it('handles optional self-reference', async () => {
50
+ const runner = await createTestRunner();
51
+ const {
52
+ LinkedNode
53
+ } = await runner.compile(`
54
+ @test model LinkedNode {
55
+ value: string;
56
+ next?: LinkedNode;
57
+ }
58
+ `);
59
+ const template = _$createComponent(Output, {
60
+ get program() {
61
+ return runner.program;
62
+ },
63
+ get namePolicy() {
64
+ return createTSNamePolicy();
65
+ },
66
+ externals: [typebox],
67
+ get children() {
68
+ return _$createComponent(SourceFile, {
69
+ path: "test.ts",
70
+ get children() {
71
+ return _$createComponent(TypeBoxSchemaDeclaration, {
72
+ type: LinkedNode,
73
+ "export": true
74
+ });
75
+ }
76
+ });
77
+ }
78
+ });
79
+ const output = render(template, {
80
+ insertFinalNewLine: false
81
+ });
82
+ const contents = output.contents[0].contents;
83
+ expect(contents).toContain('Type.Recursive(This =>');
84
+ expect(contents).toContain('Type.Optional(This)');
85
+ });
86
+ it('does not wrap non-recursive model', async () => {
87
+ const runner = await createTestRunner();
88
+ const {
89
+ Simple
90
+ } = await runner.compile(`
91
+ @test model Simple {
92
+ name: string;
93
+ age: int32;
94
+ }
95
+ `);
96
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
97
+ type: Simple
98
+ }), 'Type.Object({\n name: Type.String(),\n age: Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n }),\n})');
99
+ });
100
+ it('handles self-referencing through Record', async () => {
101
+ const runner = await createTestRunner();
102
+ const {
103
+ JsonValue
104
+ } = await runner.compile(`
105
+ @test model JsonValue {
106
+ nested: Record<JsonValue>;
107
+ }
108
+ `);
109
+ const template = _$createComponent(Output, {
110
+ get program() {
111
+ return runner.program;
112
+ },
113
+ get namePolicy() {
114
+ return createTSNamePolicy();
115
+ },
116
+ externals: [typebox],
117
+ get children() {
118
+ return _$createComponent(SourceFile, {
119
+ path: "test.ts",
120
+ get children() {
121
+ return _$createComponent(TypeBoxSchemaDeclaration, {
122
+ type: JsonValue,
123
+ "export": true
124
+ });
125
+ }
126
+ });
127
+ }
128
+ });
129
+ const output = render(template, {
130
+ insertFinalNewLine: false
131
+ });
132
+ const contents = output.contents[0].contents;
133
+ expect(contents).toContain('Type.Recursive(This =>');
134
+ expect(contents).toContain('Type.Record(');
135
+ });
136
+ });
137
+ //# sourceMappingURL=recursive.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["render","createTSNamePolicy","SourceFile","Output","describe","expect","it","TypeBoxSchema","TypeBoxSchemaDeclaration","typebox","createTestRunner","expectRender","runner","TreeNode","compile","template","_$createComponent","program","namePolicy","externals","children","path","type","output","insertFinalNewLine","contents","toContain","LinkedNode","Simple","JsonValue"],"sources":["../../test/recursive.test.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,75 @@
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('recursive types', () => {
10
+ it('wraps self-referencing model in Type.Recursive', async () => {
11
+ const runner = await createTestRunner();
12
+ const { TreeNode } = (await runner.compile(`
13
+ @test model TreeNode {
14
+ value: string;
15
+ children: TreeNode[];
16
+ }
17
+ `));
18
+ const template = (<Output program={runner.program} namePolicy={createTSNamePolicy()} externals={[typebox]}>
19
+ <SourceFile path="test.ts">
20
+ <TypeBoxSchemaDeclaration type={TreeNode} export/>
21
+ </SourceFile>
22
+ </Output>);
23
+ const output = render(template, { insertFinalNewLine: false });
24
+ const contents = output.contents[0].contents;
25
+ expect(contents).toContain('Type.Recursive(This =>');
26
+ expect(contents).toContain('Type.Array(This)');
27
+ expect(contents).toContain('value: Type.String()');
28
+ });
29
+ it('handles optional self-reference', async () => {
30
+ const runner = await createTestRunner();
31
+ const { LinkedNode } = (await runner.compile(`
32
+ @test model LinkedNode {
33
+ value: string;
34
+ next?: LinkedNode;
35
+ }
36
+ `));
37
+ const template = (<Output program={runner.program} namePolicy={createTSNamePolicy()} externals={[typebox]}>
38
+ <SourceFile path="test.ts">
39
+ <TypeBoxSchemaDeclaration type={LinkedNode} export/>
40
+ </SourceFile>
41
+ </Output>);
42
+ const output = render(template, { insertFinalNewLine: false });
43
+ const contents = output.contents[0].contents;
44
+ expect(contents).toContain('Type.Recursive(This =>');
45
+ expect(contents).toContain('Type.Optional(This)');
46
+ });
47
+ it('does not wrap non-recursive model', async () => {
48
+ const runner = await createTestRunner();
49
+ const { Simple } = (await runner.compile(`
50
+ @test model Simple {
51
+ name: string;
52
+ age: int32;
53
+ }
54
+ `));
55
+ expectRender(runner.program, <TypeBoxSchema type={Simple}/>, 'Type.Object({\n name: Type.String(),\n age: Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n }),\n})');
56
+ });
57
+ it('handles self-referencing through Record', async () => {
58
+ const runner = await createTestRunner();
59
+ const { JsonValue } = (await runner.compile(`
60
+ @test model JsonValue {
61
+ nested: Record<JsonValue>;
62
+ }
63
+ `));
64
+ const template = (<Output program={runner.program} namePolicy={createTSNamePolicy()} externals={[typebox]}>
65
+ <SourceFile path="test.ts">
66
+ <TypeBoxSchemaDeclaration type={JsonValue} export/>
67
+ </SourceFile>
68
+ </Output>);
69
+ const output = render(template, { insertFinalNewLine: false });
70
+ const contents = output.contents[0].contents;
71
+ expect(contents).toContain('Type.Recursive(This =>');
72
+ expect(contents).toContain('Type.Record(');
73
+ });
74
+ });
75
+ //# sourceMappingURL=recursive.test.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recursive.test.jsx","sourceRoot":"","sources":["../../test/recursive.test.tsx"],"names":[],"mappings":"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"}
@@ -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/tuples.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
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('tuples', () => {
6
+ it('works with pair of strings', async () => {
7
+ const runner = await createTestRunner();
8
+ const {
9
+ pair
10
+ } = await runner.compile(`
11
+ model Test {
12
+ @test pair: [string, string];
13
+ }
14
+ `);
15
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
16
+ get type() {
17
+ return pair.type;
18
+ }
19
+ }), 'Type.Tuple([Type.String(), Type.String()])');
20
+ });
21
+ it('works with mixed types', async () => {
22
+ const runner = await createTestRunner();
23
+ const {
24
+ mixed
25
+ } = await runner.compile(`
26
+ model Test {
27
+ @test mixed: [string, int32, boolean];
28
+ }
29
+ `);
30
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
31
+ get type() {
32
+ return mixed.type;
33
+ }
34
+ }), 'Type.Tuple([\n Type.String(),\n Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n }),\n Type.Boolean()\n])');
35
+ });
36
+ it('works with single element', async () => {
37
+ const runner = await createTestRunner();
38
+ const {
39
+ single
40
+ } = await runner.compile(`
41
+ model Test {
42
+ @test single: [string];
43
+ }
44
+ `);
45
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
46
+ get type() {
47
+ return single.type;
48
+ }
49
+ }), 'Type.Tuple([Type.String()])');
50
+ });
51
+ it('works with nested array element', async () => {
52
+ const runner = await createTestRunner();
53
+ const {
54
+ nested
55
+ } = await runner.compile(`
56
+ model Test {
57
+ @test nested: [string, string[]];
58
+ }
59
+ `);
60
+ expectRender(runner.program, _$createComponent(TypeBoxSchema, {
61
+ get type() {
62
+ return nested.type;
63
+ }
64
+ }), 'Type.Tuple([Type.String(), Type.Array(Type.String())])');
65
+ });
66
+ });
67
+ //# sourceMappingURL=tuples.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["describe","it","TypeBoxSchema","createTestRunner","expectRender","runner","pair","compile","program","_$createComponent","type","mixed","single","nested"],"sources":["../../test/tuples.test.tsx"],"sourcesContent":[null],"mappings":";AACA,SAASA,QAAQ,EAAEC,EAAE,QAAQ,QAAQ;AACrC,SAASC,aAAa;AACtB,SAASC,gBAAgB,EAAEC,YAAY;AAEvCJ,QAAQ,CAAC,QAAQ,EAAE,MAAM;EACvBC,EAAE,CAAC,4BAA4B,EAAE,YAAY;IAC3C,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEG;IAAK,CAAC,GAAI,MAAMD,MAAM,CAACE,OAAO,CAAC;AAC3C;AACA;AACA;AACA,KAAK,CAAmC;IAEpCH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAAA,IAACQ,IAAIA,CAAA;QAAA,OAAEJ,IAAI,CAACI,IAAI;MAAA;IAAA,IAC9B,4CACF,CAAC;EACH,CAAC,CAAC;EAEFT,EAAE,CAAC,wBAAwB,EAAE,YAAY;IACvC,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEQ;IAAM,CAAC,GAAI,MAAMN,MAAM,CAACE,OAAO,CAAC;AAC5C;AACA;AACA;AACA,KAAK,CAAmC;IAEpCH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAAA,IAACQ,IAAIA,CAAA;QAAA,OAAEC,KAAK,CAACD,IAAI;MAAA;IAAA,IAC/B,mIACF,CAAC;EACH,CAAC,CAAC;EAEFT,EAAE,CAAC,2BAA2B,EAAE,YAAY;IAC1C,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAES;IAAO,CAAC,GAAI,MAAMP,MAAM,CAACE,OAAO,CAAC;AAC7C;AACA;AACA;AACA,KAAK,CAAmC;IAEpCH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAAA,IAACQ,IAAIA,CAAA;QAAA,OAAEE,MAAM,CAACF,IAAI;MAAA;IAAA,IAChC,6BACF,CAAC;EACH,CAAC,CAAC;EAEFT,EAAE,CAAC,iCAAiC,EAAE,YAAY;IAChD,MAAMI,MAAM,GAAG,MAAMF,gBAAgB,CAAC,CAAC;IACvC,MAAM;MAAEU;IAAO,CAAC,GAAI,MAAMR,MAAM,CAACE,OAAO,CAAC;AAC7C;AACA;AACA;AACA,KAAK,CAAmC;IAEpCH,YAAY,CACVC,MAAM,CAACG,OAAO,EAAAC,iBAAA,CACbP,aAAa;MAAA,IAACQ,IAAIA,CAAA;QAAA,OAAEG,MAAM,CAACH,IAAI;MAAA;IAAA,IAChC,wDACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,42 @@
1
+ import { describe, it } from 'vitest';
2
+ import { TypeBoxSchema } from '../src/components/TypeBoxSchema.jsx';
3
+ import { createTestRunner, expectRender } from './utils.jsx';
4
+ describe('tuples', () => {
5
+ it('works with pair of strings', async () => {
6
+ const runner = await createTestRunner();
7
+ const { pair } = (await runner.compile(`
8
+ model Test {
9
+ @test pair: [string, string];
10
+ }
11
+ `));
12
+ expectRender(runner.program, <TypeBoxSchema type={pair.type}/>, 'Type.Tuple([Type.String(), Type.String()])');
13
+ });
14
+ it('works with mixed types', async () => {
15
+ const runner = await createTestRunner();
16
+ const { mixed } = (await runner.compile(`
17
+ model Test {
18
+ @test mixed: [string, int32, boolean];
19
+ }
20
+ `));
21
+ expectRender(runner.program, <TypeBoxSchema type={mixed.type}/>, 'Type.Tuple([\n Type.String(),\n Type.Integer({\n minimum: -2147483648,\n maximum: 2147483647\n }),\n Type.Boolean()\n])');
22
+ });
23
+ it('works with single element', async () => {
24
+ const runner = await createTestRunner();
25
+ const { single } = (await runner.compile(`
26
+ model Test {
27
+ @test single: [string];
28
+ }
29
+ `));
30
+ expectRender(runner.program, <TypeBoxSchema type={single.type}/>, 'Type.Tuple([Type.String()])');
31
+ });
32
+ it('works with nested array element', async () => {
33
+ const runner = await createTestRunner();
34
+ const { nested } = (await runner.compile(`
35
+ model Test {
36
+ @test nested: [string, string[]];
37
+ }
38
+ `));
39
+ expectRender(runner.program, <TypeBoxSchema type={nested.type}/>, 'Type.Tuple([Type.String(), Type.Array(Type.String())])');
40
+ });
41
+ });
42
+ //# sourceMappingURL=tuples.test.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuples.test.jsx","sourceRoot":"","sources":["../../test/tuples.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,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;KAItC,CAAC,CAAkC,CAAC;QAErC,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAG,EAClC,4CAA4C,CAC7C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;KAIvC,CAAC,CAAkC,CAAC;QAErC,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAG,EACnC,mIAAmI,CACpI,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;KAIxC,CAAC,CAAkC,CAAC;QAErC,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAG,EACpC,6BAA6B,CAC9B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;;;;KAIxC,CAAC,CAAkC,CAAC;QAErC,YAAY,CACV,MAAM,CAAC,OAAO,EACd,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAG,EACpC,wDAAwD,CACzD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typespec-dev/emitter-typebox",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "description": "A TypeSpec emitter and library for creating TypeBox schemas from TypeSpec types.",
6
6
  "license": "MIT",
@@ -21,8 +21,8 @@
21
21
  }
22
22
  },
23
23
  "peerDependencies": {
24
- "@typespec/compiler": "1.8.0",
25
- "@typespec/emitter-framework": "0.15.0"
24
+ "@typespec/compiler": "1.9.0",
25
+ "@typespec/emitter-framework": "0.16.0"
26
26
  },
27
27
  "files": [
28
28
  "dist",
@@ -45,10 +45,10 @@
45
45
  "devDependencies": {
46
46
  "@alloy-js/cli": "0.22.0",
47
47
  "@alloy-js/rollup-plugin": "0.1.0",
48
- "@types/node": "24.10.10",
49
- "@typespec/compiler": "1.8.0",
50
- "@typespec/emitter-framework": "0.15.0",
51
- "rimraf": "6.1.2",
48
+ "@types/node": "24.12.0",
49
+ "@typespec/compiler": "1.9.0",
50
+ "@typespec/emitter-framework": "0.16.0",
51
+ "rimraf": "6.1.3",
52
52
  "typescript": "5.9.3",
53
53
  "vitest": "4.0.18"
54
54
  },