UNPKG

typia

Version:

Superfast runtime validators with only one line

92 lines (84 loc) 3.2 kB
import { OpenApi } from "@samchon/openapi"; import { OpenApiV3Downgrader } from "@samchon/openapi/lib/converters/OpenApiV3Downgrader"; import { IJsonSchemaCollection } from "../../schemas/json/IJsonSchemaCollection"; import { Metadata } from "../../schemas/metadata/Metadata"; import { TransformerError } from "../../transformers/TransformerError"; import { AtomicPredicator } from "../helpers/AtomicPredicator"; import { json_schema_station } from "../internal/json_schema_station"; export namespace JsonSchemasProgrammer { export const validate = (metadata: Metadata): string[] => { const output: string[] = []; if ( metadata.atomics.some((a) => a.type === "bigint") || metadata.constants.some((c) => c.type === "bigint") ) output.push("JSON schema does not support bigint type."); if ( metadata.tuples.some((t) => t.type.elements.some((e) => e.isRequired() === false), ) || metadata.arrays.some((a) => a.type.value.isRequired() === false) ) output.push("JSON schema does not support undefined type in array."); if (metadata.maps.length) output.push("JSON schema does not support Map type."); if (metadata.sets.length) output.push("JSON schema does not support Set type."); for (const native of metadata.natives) if ( AtomicPredicator.native(native.name) === false && native.name !== "Date" && native.name !== "Blob" && native.name !== "File" ) output.push(`JSON schema does not support ${native.name} type.`); return output; }; export const write = <Version extends "3.0" | "3.1">(props: { version: Version; metadatas: Array<Metadata>; }): IJsonSchemaCollection<Version> => props.version === "3.0" ? (writeV3_0(props.metadatas) as IJsonSchemaCollection<Version>) : (writeV3_1(props.metadatas) as IJsonSchemaCollection<Version>); const writeV3_0 = ( metadataList: Array<Metadata>, ): IJsonSchemaCollection<"3.0"> => { const collection: IJsonSchemaCollection<"3.1"> = writeV3_1(metadataList); const asset: OpenApiV3Downgrader.IComponentsCollection = OpenApiV3Downgrader.downgradeComponents(collection.components); const caster = OpenApiV3Downgrader.downgradeSchema(asset); return { version: "3.0", components: asset.downgraded, schemas: collection.schemas.map(caster), }; }; const writeV3_1 = ( metadataList: Array<Metadata>, ): IJsonSchemaCollection<"3.1"> => { const components: OpenApi.IComponents = { schemas: {}, }; const generator = (metadata: Metadata): OpenApi.IJsonSchema | null => json_schema_station({ blockNever: true, components, attribute: {}, metadata, }); return { version: "3.1", components, schemas: metadataList.map((meta, i) => { const schema: OpenApi.IJsonSchema | null = generator(meta); if (schema === null) throw new TransformerError({ code: "typia.json.schemas", message: `invalid type on argument - (${meta.getName()}, ${i})`, }); return schema; }), }; }; }