| 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 |