@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.
- package/README.md +70 -0
- package/dist/src/components/TypeBoxSchema.d.ts.map +1 -1
- package/dist/src/components/TypeBoxSchema.js +4 -3
- package/dist/src/components/TypeBoxSchema.js.map +1 -1
- package/dist/src/components/TypeBoxSchema.jsx +4 -3
- package/dist/src/components/TypeBoxSchema.jsx.map +1 -1
- package/dist/src/components/TypeBoxSchemaDeclaration.d.ts.map +1 -1
- package/dist/src/components/TypeBoxSchemaDeclaration.js +20 -4
- package/dist/src/components/TypeBoxSchemaDeclaration.js.map +1 -1
- package/dist/src/components/TypeBoxSchemaDeclaration.jsx +22 -6
- package/dist/src/components/TypeBoxSchemaDeclaration.jsx.map +1 -1
- package/dist/src/emitter.d.ts.map +1 -1
- package/dist/src/emitter.js +1 -2
- package/dist/src/emitter.js.map +1 -1
- package/dist/src/emitter.jsx +1 -2
- package/dist/src/emitter.jsx.map +1 -1
- package/dist/src/external-packages/typebox.d.ts +1 -0
- package/dist/src/external-packages/typebox.d.ts.map +1 -1
- package/dist/src/external-packages/typebox.js +1 -1
- package/dist/src/external-packages/typebox.js.map +1 -1
- package/dist/src/typeboxBaseSchema.d.ts +2 -2
- package/dist/src/typeboxBaseSchema.d.ts.map +1 -1
- package/dist/src/typeboxBaseSchema.js +219 -34
- package/dist/src/typeboxBaseSchema.js.map +1 -1
- package/dist/src/typeboxBaseSchema.jsx +121 -28
- package/dist/src/typeboxBaseSchema.jsx.map +1 -1
- package/dist/src/typeboxConstraints.d.ts +10 -0
- package/dist/src/typeboxConstraints.d.ts.map +1 -0
- package/dist/src/typeboxConstraints.js +308 -0
- package/dist/src/typeboxConstraints.js.map +1 -0
- package/dist/src/typeboxConstraints.jsx +246 -0
- package/dist/src/typeboxConstraints.jsx.map +1 -0
- package/dist/test/arrays.test.d.ts +2 -0
- package/dist/test/arrays.test.d.ts.map +1 -0
- package/dist/test/arrays.test.js +65 -0
- package/dist/test/arrays.test.js.map +1 -0
- package/dist/test/arrays.test.jsx +42 -0
- package/dist/test/arrays.test.jsx.map +1 -0
- package/dist/test/constraints.test.d.ts +2 -0
- package/dist/test/constraints.test.d.ts.map +1 -0
- package/dist/test/constraints.test.js +414 -0
- package/dist/test/constraints.test.js.map +1 -0
- package/dist/test/constraints.test.jsx +279 -0
- package/dist/test/constraints.test.jsx.map +1 -0
- package/dist/test/dictionaries.test.d.ts +2 -0
- package/dist/test/dictionaries.test.d.ts.map +1 -0
- package/dist/test/dictionaries.test.js +50 -0
- package/dist/test/dictionaries.test.js.map +1 -0
- package/dist/test/dictionaries.test.jsx +33 -0
- package/dist/test/dictionaries.test.jsx.map +1 -0
- package/dist/test/emitter/enums.test.d.ts +2 -0
- package/dist/test/emitter/enums.test.d.ts.map +1 -0
- package/dist/test/emitter/enums.test.js +48 -0
- package/dist/test/emitter/enums.test.js.map +1 -0
- package/dist/test/emitter/enums.test.jsx +42 -0
- package/dist/test/emitter/enums.test.jsx.map +1 -0
- package/dist/test/emitter/models.test.d.ts +2 -0
- package/dist/test/emitter/models.test.d.ts.map +1 -0
- package/dist/test/emitter/models.test.js +36 -0
- package/dist/test/emitter/models.test.js.map +1 -0
- package/dist/test/emitter/models.test.jsx +32 -0
- package/dist/test/emitter/models.test.jsx.map +1 -0
- package/dist/test/emitter/records.test.d.ts +2 -0
- package/dist/test/emitter/records.test.d.ts.map +1 -0
- package/dist/test/emitter/records.test.js +18 -0
- package/dist/test/emitter/records.test.js.map +1 -0
- package/dist/test/emitter/records.test.jsx +16 -0
- package/dist/test/emitter/records.test.jsx.map +1 -0
- package/dist/test/emitter/unions.test.d.ts +2 -0
- package/dist/test/emitter/unions.test.d.ts.map +1 -0
- package/dist/test/emitter/unions.test.js +37 -0
- package/dist/test/emitter/unions.test.js.map +1 -0
- package/dist/test/emitter/unions.test.jsx +33 -0
- package/dist/test/emitter/unions.test.jsx.map +1 -0
- package/dist/test/enums.test.d.ts +2 -0
- package/dist/test/enums.test.d.ts.map +1 -0
- package/dist/test/enums.test.js +53 -0
- package/dist/test/enums.test.js.map +1 -0
- package/dist/test/enums.test.jsx +40 -0
- package/dist/test/enums.test.jsx.map +1 -0
- package/dist/test/models.test.d.ts +2 -0
- package/dist/test/models.test.d.ts.map +1 -0
- package/dist/test/models.test.js +109 -0
- package/dist/test/models.test.js.map +1 -0
- package/dist/test/models.test.jsx +71 -0
- package/dist/test/models.test.jsx.map +1 -0
- package/dist/test/nullable.test.d.ts +2 -0
- package/dist/test/nullable.test.d.ts.map +1 -0
- package/dist/test/nullable.test.js +46 -0
- package/dist/test/nullable.test.js.map +1 -0
- package/dist/test/nullable.test.jsx +33 -0
- package/dist/test/nullable.test.jsx.map +1 -0
- package/dist/test/optionality.test.d.ts +2 -0
- package/dist/test/optionality.test.d.ts.map +1 -0
- package/dist/test/optionality.test.js +61 -0
- package/dist/test/optionality.test.js.map +1 -0
- package/dist/test/optionality.test.jsx +44 -0
- package/dist/test/optionality.test.jsx.map +1 -0
- package/dist/test/scalars.test.js +13 -13
- package/dist/test/scalars.test.js.map +1 -1
- package/dist/test/scalars.test.jsx +13 -13
- package/dist/test/scalars.test.jsx.map +1 -1
- package/dist/test/unions.test.d.ts +2 -0
- package/dist/test/unions.test.d.ts.map +1 -0
- package/dist/test/unions.test.js +51 -0
- package/dist/test/unions.test.js.map +1 -0
- package/dist/test/unions.test.jsx +38 -0
- package/dist/test/unions.test.jsx.map +1 -0
- package/dist/test/utils.js +4 -1
- package/dist/test/utils.js.map +1 -1
- package/dist/test/utils.jsx +2 -2
- package/dist/test/utils.jsx.map +1 -1
- package/package.json +1 -1
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|