Spaces:
Running
Running
import {SchemaObject} from "../types" | |
type MetaSchema = (root: boolean) => SchemaObject | |
const shared: MetaSchema = (root) => { | |
const sch: SchemaObject = { | |
nullable: {type: "boolean"}, | |
metadata: { | |
optionalProperties: { | |
union: {elements: {ref: "schema"}}, | |
}, | |
additionalProperties: true, | |
}, | |
} | |
if (root) sch.definitions = {values: {ref: "schema"}} | |
return sch | |
} | |
const emptyForm: MetaSchema = (root) => ({ | |
optionalProperties: shared(root), | |
}) | |
const refForm: MetaSchema = (root) => ({ | |
properties: { | |
ref: {type: "string"}, | |
}, | |
optionalProperties: shared(root), | |
}) | |
const typeForm: MetaSchema = (root) => ({ | |
properties: { | |
type: { | |
enum: [ | |
"boolean", | |
"timestamp", | |
"string", | |
"float32", | |
"float64", | |
"int8", | |
"uint8", | |
"int16", | |
"uint16", | |
"int32", | |
"uint32", | |
], | |
}, | |
}, | |
optionalProperties: shared(root), | |
}) | |
const enumForm: MetaSchema = (root) => ({ | |
properties: { | |
enum: {elements: {type: "string"}}, | |
}, | |
optionalProperties: shared(root), | |
}) | |
const elementsForm: MetaSchema = (root) => ({ | |
properties: { | |
elements: {ref: "schema"}, | |
}, | |
optionalProperties: shared(root), | |
}) | |
const propertiesForm: MetaSchema = (root) => ({ | |
properties: { | |
properties: {values: {ref: "schema"}}, | |
}, | |
optionalProperties: { | |
optionalProperties: {values: {ref: "schema"}}, | |
additionalProperties: {type: "boolean"}, | |
...shared(root), | |
}, | |
}) | |
const optionalPropertiesForm: MetaSchema = (root) => ({ | |
properties: { | |
optionalProperties: {values: {ref: "schema"}}, | |
}, | |
optionalProperties: { | |
additionalProperties: {type: "boolean"}, | |
...shared(root), | |
}, | |
}) | |
const discriminatorForm: MetaSchema = (root) => ({ | |
properties: { | |
discriminator: {type: "string"}, | |
mapping: { | |
values: { | |
metadata: { | |
union: [propertiesForm(false), optionalPropertiesForm(false)], | |
}, | |
}, | |
}, | |
}, | |
optionalProperties: shared(root), | |
}) | |
const valuesForm: MetaSchema = (root) => ({ | |
properties: { | |
values: {ref: "schema"}, | |
}, | |
optionalProperties: shared(root), | |
}) | |
const schema: MetaSchema = (root) => ({ | |
metadata: { | |
union: [ | |
emptyForm, | |
refForm, | |
typeForm, | |
enumForm, | |
elementsForm, | |
propertiesForm, | |
optionalPropertiesForm, | |
discriminatorForm, | |
valuesForm, | |
].map((s) => s(root)), | |
}, | |
}) | |
const jtdMetaSchema: SchemaObject = { | |
definitions: { | |
schema: schema(false), | |
}, | |
...schema(true), | |
} | |
export default jtdMetaSchema | |