1 | import {SchemaObject} from "../types"
|
2 |
|
3 | type MetaSchema = (root: boolean) => SchemaObject
|
4 |
|
5 | const shared: MetaSchema = (root) => {
|
6 | const sch: SchemaObject = {
|
7 | nullable: {type: "boolean"},
|
8 | metadata: {
|
9 | optionalProperties: {
|
10 | union: {elements: {ref: "schema"}},
|
11 | },
|
12 | additionalProperties: true,
|
13 | },
|
14 | }
|
15 | if (root) sch.definitions = {values: {ref: "schema"}}
|
16 | return sch
|
17 | }
|
18 |
|
19 | const emptyForm: MetaSchema = (root) => ({
|
20 | optionalProperties: shared(root),
|
21 | })
|
22 |
|
23 | const refForm: MetaSchema = (root) => ({
|
24 | properties: {
|
25 | ref: {type: "string"},
|
26 | },
|
27 | optionalProperties: shared(root),
|
28 | })
|
29 |
|
30 | const typeForm: MetaSchema = (root) => ({
|
31 | properties: {
|
32 | type: {
|
33 | enum: [
|
34 | "boolean",
|
35 | "timestamp",
|
36 | "string",
|
37 | "float32",
|
38 | "float64",
|
39 | "int8",
|
40 | "uint8",
|
41 | "int16",
|
42 | "uint16",
|
43 | "int32",
|
44 | "uint32",
|
45 | ],
|
46 | },
|
47 | },
|
48 | optionalProperties: shared(root),
|
49 | })
|
50 |
|
51 | const enumForm: MetaSchema = (root) => ({
|
52 | properties: {
|
53 | enum: {elements: {type: "string"}},
|
54 | },
|
55 | optionalProperties: shared(root),
|
56 | })
|
57 |
|
58 | const elementsForm: MetaSchema = (root) => ({
|
59 | properties: {
|
60 | elements: {ref: "schema"},
|
61 | },
|
62 | optionalProperties: shared(root),
|
63 | })
|
64 |
|
65 | const propertiesForm: MetaSchema = (root) => ({
|
66 | properties: {
|
67 | properties: {values: {ref: "schema"}},
|
68 | },
|
69 | optionalProperties: {
|
70 | optionalProperties: {values: {ref: "schema"}},
|
71 | additionalProperties: {type: "boolean"},
|
72 | ...shared(root),
|
73 | },
|
74 | })
|
75 |
|
76 | const optionalPropertiesForm: MetaSchema = (root) => ({
|
77 | properties: {
|
78 | optionalProperties: {values: {ref: "schema"}},
|
79 | },
|
80 | optionalProperties: {
|
81 | additionalProperties: {type: "boolean"},
|
82 | ...shared(root),
|
83 | },
|
84 | })
|
85 |
|
86 | const discriminatorForm: MetaSchema = (root) => ({
|
87 | properties: {
|
88 | discriminator: {type: "string"},
|
89 | mapping: {
|
90 | values: {
|
91 | metadata: {
|
92 | union: [propertiesForm(false), optionalPropertiesForm(false)],
|
93 | },
|
94 | },
|
95 | },
|
96 | },
|
97 | optionalProperties: shared(root),
|
98 | })
|
99 |
|
100 | const valuesForm: MetaSchema = (root) => ({
|
101 | properties: {
|
102 | values: {ref: "schema"},
|
103 | },
|
104 | optionalProperties: shared(root),
|
105 | })
|
106 |
|
107 | const schema: MetaSchema = (root) => ({
|
108 | metadata: {
|
109 | union: [
|
110 | emptyForm,
|
111 | refForm,
|
112 | typeForm,
|
113 | enumForm,
|
114 | elementsForm,
|
115 | propertiesForm,
|
116 | optionalPropertiesForm,
|
117 | discriminatorForm,
|
118 | valuesForm,
|
119 | ].map((s) => s(root)),
|
120 | },
|
121 | })
|
122 |
|
123 | const jtdMetaSchema: SchemaObject = {
|
124 | definitions: {
|
125 | schema: schema(false),
|
126 | },
|
127 | ...schema(true),
|
128 | }
|
129 |
|
130 | export default jtdMetaSchema
|