From affb376d12192430843c91a96e2aee39637996a0 Mon Sep 17 00:00:00 2001 From: NanezX Date: Mon, 10 Feb 2025 16:41:26 -0400 Subject: [PATCH 1/2] Refactor imports to use parseTypes.js for JsonSchema7Type --- src/Options.ts | 2 +- src/Refs.ts | 2 +- src/errorMessages.ts | 2 +- src/index.ts | 1 + src/parseDef.ts | 97 ++++++++++--------------------------- src/parseTypes.ts | 66 +++++++++++++++++++++++++ src/parsers/array.ts | 3 +- src/parsers/default.ts | 3 +- src/parsers/effects.ts | 3 +- src/parsers/intersection.ts | 3 +- src/parsers/map.ts | 3 +- src/parsers/nullable.ts | 3 +- src/parsers/object.ts | 3 +- src/parsers/optional.ts | 3 +- src/parsers/pipeline.ts | 3 +- src/parsers/promise.ts | 3 +- src/parsers/record.ts | 3 +- src/parsers/set.ts | 3 +- src/parsers/tuple.ts | 3 +- src/parsers/union.ts | 3 +- src/zodToJsonSchema.ts | 3 +- 21 files changed, 125 insertions(+), 90 deletions(-) create mode 100644 src/parseTypes.ts diff --git a/src/Options.ts b/src/Options.ts index c163bf1..97521a2 100644 --- a/src/Options.ts +++ b/src/Options.ts @@ -1,6 +1,6 @@ import { ZodSchema, ZodTypeDef } from "zod"; import { Refs, Seen } from "./Refs"; -import { JsonSchema7Type } from "./parseDef"; +import { JsonSchema7Type } from "./parseTypes"; export type Targets = "jsonSchema7" | "jsonSchema2019-09" | "openApi3" | "openAi"; diff --git a/src/Refs.ts b/src/Refs.ts index ef0c90f..17dec5e 100644 --- a/src/Refs.ts +++ b/src/Refs.ts @@ -1,6 +1,6 @@ import { ZodTypeDef } from "zod"; import { getDefaultOptions, Options, Targets } from "./Options.js"; -import { JsonSchema7Type } from "./parseDef.js"; +import { JsonSchema7Type } from "./parseTypes.js"; export type Refs = { seen: Map; diff --git a/src/errorMessages.ts b/src/errorMessages.ts index 3024bb5..c1c9f69 100644 --- a/src/errorMessages.ts +++ b/src/errorMessages.ts @@ -1,4 +1,4 @@ -import { JsonSchema7TypeUnion } from "./parseDef.js"; +import { JsonSchema7TypeUnion } from "./parseTypes.js"; import { Refs } from "./Refs.js"; export type ErrorMessages< diff --git a/src/index.ts b/src/index.ts index 0b06869..81cac9b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,6 +2,7 @@ export * from "./Options.js"; export * from "./Refs.js"; export * from "./errorMessages.js"; export * from "./parseDef.js"; +export * from "./parseTypes.js"; export * from "./parsers/any.js"; export * from "./parsers/array.js"; export * from "./parsers/bigint.js"; diff --git a/src/parseDef.ts b/src/parseDef.ts index 6148615..fffa2b0 100644 --- a/src/parseDef.ts +++ b/src/parseDef.ts @@ -1,84 +1,37 @@ import { ZodFirstPartyTypeKind, ZodTypeDef } from "zod"; -import { JsonSchema7AnyType, parseAnyDef } from "./parsers/any.js"; -import { JsonSchema7ArrayType, parseArrayDef } from "./parsers/array.js"; -import { JsonSchema7BigintType, parseBigintDef } from "./parsers/bigint.js"; -import { JsonSchema7BooleanType, parseBooleanDef } from "./parsers/boolean.js"; +import { parseAnyDef } from "./parsers/any.js"; +import { parseArrayDef } from "./parsers/array.js"; +import { parseBigintDef } from "./parsers/bigint.js"; +import { parseBooleanDef } from "./parsers/boolean.js"; import { parseBrandedDef } from "./parsers/branded.js"; import { parseCatchDef } from "./parsers/catch.js"; -import { JsonSchema7DateType, parseDateDef } from "./parsers/date.js"; +import { parseDateDef } from "./parsers/date.js"; import { parseDefaultDef } from "./parsers/default.js"; import { parseEffectsDef } from "./parsers/effects.js"; -import { JsonSchema7EnumType, parseEnumDef } from "./parsers/enum.js"; -import { - JsonSchema7AllOfType, - parseIntersectionDef, -} from "./parsers/intersection.js"; -import { JsonSchema7LiteralType, parseLiteralDef } from "./parsers/literal.js"; -import { JsonSchema7MapType, parseMapDef } from "./parsers/map.js"; -import { - JsonSchema7NativeEnumType, - parseNativeEnumDef, -} from "./parsers/nativeEnum.js"; -import { JsonSchema7NeverType, parseNeverDef } from "./parsers/never.js"; -import { JsonSchema7NullType, parseNullDef } from "./parsers/null.js"; -import { - JsonSchema7NullableType, - parseNullableDef, -} from "./parsers/nullable.js"; -import { JsonSchema7NumberType, parseNumberDef } from "./parsers/number.js"; -import { JsonSchema7ObjectType, parseObjectDef } from "./parsers/object.js"; +import { parseEnumDef } from "./parsers/enum.js"; +import {parseIntersectionDef } from "./parsers/intersection.js"; +import { parseLiteralDef } from "./parsers/literal.js"; +import { parseMapDef } from "./parsers/map.js"; +import { parseNativeEnumDef } from "./parsers/nativeEnum.js"; +import { parseNeverDef } from "./parsers/never.js"; +import { parseNullDef } from "./parsers/null.js"; +import { parseNullableDef } from "./parsers/nullable.js"; +import { parseNumberDef } from "./parsers/number.js"; +import { parseObjectDef } from "./parsers/object.js"; import { parseOptionalDef } from "./parsers/optional.js"; import { parsePipelineDef } from "./parsers/pipeline.js"; import { parsePromiseDef } from "./parsers/promise.js"; -import { JsonSchema7RecordType, parseRecordDef } from "./parsers/record.js"; -import { JsonSchema7SetType, parseSetDef } from "./parsers/set.js"; -import { JsonSchema7StringType, parseStringDef } from "./parsers/string.js"; -import { JsonSchema7TupleType, parseTupleDef } from "./parsers/tuple.js"; -import { - JsonSchema7UndefinedType, - parseUndefinedDef, -} from "./parsers/undefined.js"; -import { JsonSchema7UnionType, parseUnionDef } from "./parsers/union.js"; -import { JsonSchema7UnknownType, parseUnknownDef } from "./parsers/unknown.js"; +import { parseRecordDef } from "./parsers/record.js"; +import { parseSetDef } from "./parsers/set.js"; +import { parseStringDef } from "./parsers/string.js"; +import { parseTupleDef } from "./parsers/tuple.js"; +import { parseUndefinedDef} from "./parsers/undefined.js"; +import { parseUnionDef } from "./parsers/union.js"; +import { parseUnknownDef } from "./parsers/unknown.js"; import { Refs, Seen } from "./Refs.js"; import { parseReadonlyDef } from "./parsers/readonly.js"; import { ignoreOverride } from "./Options.js"; - -type JsonSchema7RefType = { $ref: string }; -type JsonSchema7Meta = { - title?: string; - default?: any; - description?: string; - markdownDescription?: string; -}; - -export type JsonSchema7TypeUnion = - | JsonSchema7StringType - | JsonSchema7ArrayType - | JsonSchema7NumberType - | JsonSchema7BigintType - | JsonSchema7BooleanType - | JsonSchema7DateType - | JsonSchema7EnumType - | JsonSchema7LiteralType - | JsonSchema7NativeEnumType - | JsonSchema7NullType - | JsonSchema7NumberType - | JsonSchema7ObjectType - | JsonSchema7RecordType - | JsonSchema7TupleType - | JsonSchema7UnionType - | JsonSchema7UndefinedType - | JsonSchema7RefType - | JsonSchema7NeverType - | JsonSchema7MapType - | JsonSchema7AnyType - | JsonSchema7NullableType - | JsonSchema7AllOfType - | JsonSchema7UnknownType - | JsonSchema7SetType; - -export type JsonSchema7Type = JsonSchema7TypeUnion & JsonSchema7Meta; +import { JsonSchema7Type } from "./parseTypes.js"; export function parseDef( def: ZodTypeDef, @@ -128,8 +81,8 @@ const get$ref = ( refs: Refs, ): | { - $ref: string; - } + $ref: string; + } | {} | undefined => { switch (refs.$refStrategy) { diff --git a/src/parseTypes.ts b/src/parseTypes.ts new file mode 100644 index 0000000..6b9c4cb --- /dev/null +++ b/src/parseTypes.ts @@ -0,0 +1,66 @@ +import { JsonSchema7AnyType } from "./parsers/any.js"; +import { JsonSchema7ArrayType } from "./parsers/array.js"; +import { JsonSchema7BigintType } from "./parsers/bigint.js"; +import { JsonSchema7BooleanType } from "./parsers/boolean.js"; +import { JsonSchema7DateType } from "./parsers/date.js"; +import { JsonSchema7EnumType } from "./parsers/enum.js"; +import { + JsonSchema7AllOfType +} from "./parsers/intersection.js"; +import { JsonSchema7LiteralType } from "./parsers/literal.js"; +import { JsonSchema7MapType } from "./parsers/map.js"; +import { + JsonSchema7NativeEnumType, +} from "./parsers/nativeEnum.js"; +import { JsonSchema7NeverType } from "./parsers/never.js"; +import { JsonSchema7NullType } from "./parsers/null.js"; +import { + JsonSchema7NullableType, +} from "./parsers/nullable.js"; +import { JsonSchema7NumberType } from "./parsers/number.js"; +import { JsonSchema7ObjectType } from "./parsers/object.js"; +import { JsonSchema7RecordType } from "./parsers/record.js"; +import { JsonSchema7SetType } from "./parsers/set.js"; +import { JsonSchema7StringType } from "./parsers/string.js"; +import { JsonSchema7TupleType } from "./parsers/tuple.js"; +import { + JsonSchema7UndefinedType +} from "./parsers/undefined.js"; +import { JsonSchema7UnionType } from "./parsers/union.js"; +import { JsonSchema7UnknownType } from "./parsers/unknown.js"; + +type JsonSchema7RefType = { $ref: string }; +type JsonSchema7Meta = { + title?: string; + default?: any; + description?: string; + markdownDescription?: string; +}; + +export type JsonSchema7TypeUnion = + | JsonSchema7StringType + | JsonSchema7ArrayType + | JsonSchema7NumberType + | JsonSchema7BigintType + | JsonSchema7BooleanType + | JsonSchema7DateType + | JsonSchema7EnumType + | JsonSchema7LiteralType + | JsonSchema7NativeEnumType + | JsonSchema7NullType + | JsonSchema7NumberType + | JsonSchema7ObjectType + | JsonSchema7RecordType + | JsonSchema7TupleType + | JsonSchema7UnionType + | JsonSchema7UndefinedType + | JsonSchema7RefType + | JsonSchema7NeverType + | JsonSchema7MapType + | JsonSchema7AnyType + | JsonSchema7NullableType + | JsonSchema7AllOfType + | JsonSchema7UnknownType + | JsonSchema7SetType; + +export type JsonSchema7Type = JsonSchema7TypeUnion & JsonSchema7Meta; \ No newline at end of file diff --git a/src/parsers/array.ts b/src/parsers/array.ts index 904e4b7..b92f6d9 100644 --- a/src/parsers/array.ts +++ b/src/parsers/array.ts @@ -1,6 +1,7 @@ import { ZodArrayDef, ZodFirstPartyTypeKind } from "zod"; import { ErrorMessages, setResponseValueAndErrors } from "../errorMessages.js"; -import { JsonSchema7Type, parseDef } from "../parseDef.js"; +import { parseDef } from "../parseDef.js"; +import { JsonSchema7Type } from "../parseTypes.js"; import { Refs } from "../Refs.js"; export type JsonSchema7ArrayType = { diff --git a/src/parsers/default.ts b/src/parsers/default.ts index 38e7c3d..b6560d7 100644 --- a/src/parsers/default.ts +++ b/src/parsers/default.ts @@ -1,5 +1,6 @@ import { ZodDefaultDef } from "zod"; -import { JsonSchema7Type, parseDef } from "../parseDef.js"; +import { parseDef } from "../parseDef.js"; +import { JsonSchema7Type } from "../parseTypes.js"; import { Refs } from "../Refs.js"; export function parseDefaultDef( diff --git a/src/parsers/effects.ts b/src/parsers/effects.ts index c17e474..47fcca0 100644 --- a/src/parsers/effects.ts +++ b/src/parsers/effects.ts @@ -1,5 +1,6 @@ import { ZodEffectsDef } from "zod"; -import { JsonSchema7Type, parseDef } from "../parseDef.js"; +import { parseDef } from "../parseDef.js"; +import { JsonSchema7Type } from "../parseTypes.js"; import { Refs } from "../Refs.js"; export function parseEffectsDef( diff --git a/src/parsers/intersection.ts b/src/parsers/intersection.ts index 369af21..f35a00c 100644 --- a/src/parsers/intersection.ts +++ b/src/parsers/intersection.ts @@ -1,5 +1,6 @@ import { ZodIntersectionDef } from "zod"; -import { JsonSchema7Type, parseDef } from "../parseDef.js"; +import { parseDef } from "../parseDef.js"; +import { JsonSchema7Type } from "../parseTypes.js"; import { Refs } from "../Refs.js"; import { JsonSchema7StringType } from "./string.js"; diff --git a/src/parsers/map.ts b/src/parsers/map.ts index f68dcb1..50239a2 100644 --- a/src/parsers/map.ts +++ b/src/parsers/map.ts @@ -1,5 +1,6 @@ import { ZodMapDef } from "zod"; -import { JsonSchema7Type, parseDef } from "../parseDef.js"; +import { parseDef } from "../parseDef.js"; +import { JsonSchema7Type } from "../parseTypes.js"; import { Refs } from "../Refs.js"; import { JsonSchema7RecordType, parseRecordDef } from "./record.js"; diff --git a/src/parsers/nullable.ts b/src/parsers/nullable.ts index bac3981..dbb6149 100644 --- a/src/parsers/nullable.ts +++ b/src/parsers/nullable.ts @@ -1,5 +1,6 @@ import { ZodNullableDef } from "zod"; -import { JsonSchema7Type, parseDef } from "../parseDef.js"; +import { parseDef } from "../parseDef.js"; +import { JsonSchema7Type } from "../parseTypes.js"; import { Refs } from "../Refs.js"; import { JsonSchema7NullType } from "./null.js"; import { primitiveMappings } from "./union.js"; diff --git a/src/parsers/object.ts b/src/parsers/object.ts index 523dfee..0cb5da8 100644 --- a/src/parsers/object.ts +++ b/src/parsers/object.ts @@ -1,5 +1,6 @@ import { ZodObjectDef, ZodOptional } from "zod"; -import { JsonSchema7Type, parseDef } from "../parseDef.js"; +import { parseDef } from "../parseDef.js"; +import { JsonSchema7Type } from "../parseTypes.js"; import { Refs } from "../Refs.js"; function decideAdditionalProperties(def: ZodObjectDef, refs: Refs) { diff --git a/src/parsers/optional.ts b/src/parsers/optional.ts index 5f30d7e..6d0ae28 100644 --- a/src/parsers/optional.ts +++ b/src/parsers/optional.ts @@ -1,5 +1,6 @@ import { ZodOptionalDef } from "zod"; -import { JsonSchema7Type, parseDef } from "../parseDef.js"; +import { parseDef } from "../parseDef.js"; +import { JsonSchema7Type } from "../parseTypes.js"; import { Refs } from "../Refs.js"; export const parseOptionalDef = ( diff --git a/src/parsers/pipeline.ts b/src/parsers/pipeline.ts index 6287b9c..3d9fd8c 100644 --- a/src/parsers/pipeline.ts +++ b/src/parsers/pipeline.ts @@ -1,5 +1,6 @@ import { ZodPipelineDef } from "zod"; -import { JsonSchema7Type, parseDef } from "../parseDef.js"; +import { parseDef } from "../parseDef.js"; +import { JsonSchema7Type } from "../parseTypes.js"; import { Refs } from "../Refs.js"; import { JsonSchema7AllOfType } from "./intersection.js"; diff --git a/src/parsers/promise.ts b/src/parsers/promise.ts index 1929681..f90b1b9 100644 --- a/src/parsers/promise.ts +++ b/src/parsers/promise.ts @@ -1,5 +1,6 @@ import { ZodPromiseDef } from "zod"; -import { JsonSchema7Type, parseDef } from "../parseDef.js"; +import { parseDef } from "../parseDef.js"; +import { JsonSchema7Type } from "../parseTypes.js"; import { Refs } from "../Refs.js"; export function parsePromiseDef( diff --git a/src/parsers/record.ts b/src/parsers/record.ts index 1f26d99..ec4cf59 100644 --- a/src/parsers/record.ts +++ b/src/parsers/record.ts @@ -4,7 +4,8 @@ import { ZodRecordDef, ZodTypeAny, } from "zod"; -import { JsonSchema7Type, parseDef } from "../parseDef.js"; +import { parseDef } from "../parseDef.js"; +import { JsonSchema7Type } from "../parseTypes.js"; import { Refs } from "../Refs.js"; import { JsonSchema7EnumType } from "./enum.js"; import { JsonSchema7ObjectType } from "./object.js"; diff --git a/src/parsers/set.ts b/src/parsers/set.ts index b110ac1..f59d3e8 100644 --- a/src/parsers/set.ts +++ b/src/parsers/set.ts @@ -1,6 +1,7 @@ import { ZodSetDef } from "zod"; import { ErrorMessages, setResponseValueAndErrors } from "../errorMessages.js"; -import { JsonSchema7Type, parseDef } from "../parseDef.js"; +import { parseDef } from "../parseDef.js"; +import { JsonSchema7Type } from "../parseTypes.js"; import { Refs } from "../Refs.js"; export type JsonSchema7SetType = { diff --git a/src/parsers/tuple.ts b/src/parsers/tuple.ts index d9bc3bc..af68f78 100644 --- a/src/parsers/tuple.ts +++ b/src/parsers/tuple.ts @@ -1,5 +1,6 @@ import { ZodTupleDef, ZodTupleItems, ZodTypeAny } from "zod"; -import { JsonSchema7Type, parseDef } from "../parseDef.js"; +import { parseDef } from "../parseDef.js"; +import { JsonSchema7Type } from "../parseTypes.js"; import { Refs } from "../Refs.js"; export type JsonSchema7TupleType = { diff --git a/src/parsers/union.ts b/src/parsers/union.ts index 4e19108..41e88c3 100644 --- a/src/parsers/union.ts +++ b/src/parsers/union.ts @@ -4,7 +4,8 @@ import { ZodTypeAny, ZodUnionDef, } from "zod"; -import { JsonSchema7Type, parseDef } from "../parseDef.js"; +import { parseDef } from "../parseDef.js"; +import { JsonSchema7Type } from "../parseTypes.js"; import { Refs } from "../Refs.js"; export const primitiveMappings = { diff --git a/src/zodToJsonSchema.ts b/src/zodToJsonSchema.ts index 05709f1..10f6e99 100644 --- a/src/zodToJsonSchema.ts +++ b/src/zodToJsonSchema.ts @@ -1,6 +1,7 @@ import { ZodSchema } from "zod"; import { Options, Targets } from "./Options.js"; -import { JsonSchema7Type, parseDef } from "./parseDef.js"; +import { parseDef } from "./parseDef.js"; +import { JsonSchema7Type } from "./parseTypes.js"; import { getRefs } from "./Refs.js"; const zodToJsonSchema = ( From bb49396c60e2e545a3e8824281f7ea0a0771b634 Mon Sep 17 00:00:00 2001 From: NanezX Date: Mon, 10 Feb 2025 16:56:38 -0400 Subject: [PATCH 2/2] Add selectParser function and update parseDef to use it --- src/index.ts | 1 + src/parseDef.ts | 120 +++----------------------------------------- src/selectParser.ts | 114 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+), 112 deletions(-) create mode 100644 src/selectParser.ts diff --git a/src/index.ts b/src/index.ts index 81cac9b..c077001 100644 --- a/src/index.ts +++ b/src/index.ts @@ -33,6 +33,7 @@ export * from "./parsers/tuple.js"; export * from "./parsers/undefined.js"; export * from "./parsers/union.js"; export * from "./parsers/unknown.js"; +export * from "./selectParser.js"; export * from "./zodToJsonSchema.js"; import { zodToJsonSchema } from "./zodToJsonSchema.js"; export default zodToJsonSchema; \ No newline at end of file diff --git a/src/parseDef.ts b/src/parseDef.ts index fffa2b0..69df155 100644 --- a/src/parseDef.ts +++ b/src/parseDef.ts @@ -1,37 +1,8 @@ -import { ZodFirstPartyTypeKind, ZodTypeDef } from "zod"; -import { parseAnyDef } from "./parsers/any.js"; -import { parseArrayDef } from "./parsers/array.js"; -import { parseBigintDef } from "./parsers/bigint.js"; -import { parseBooleanDef } from "./parsers/boolean.js"; -import { parseBrandedDef } from "./parsers/branded.js"; -import { parseCatchDef } from "./parsers/catch.js"; -import { parseDateDef } from "./parsers/date.js"; -import { parseDefaultDef } from "./parsers/default.js"; -import { parseEffectsDef } from "./parsers/effects.js"; -import { parseEnumDef } from "./parsers/enum.js"; -import {parseIntersectionDef } from "./parsers/intersection.js"; -import { parseLiteralDef } from "./parsers/literal.js"; -import { parseMapDef } from "./parsers/map.js"; -import { parseNativeEnumDef } from "./parsers/nativeEnum.js"; -import { parseNeverDef } from "./parsers/never.js"; -import { parseNullDef } from "./parsers/null.js"; -import { parseNullableDef } from "./parsers/nullable.js"; -import { parseNumberDef } from "./parsers/number.js"; -import { parseObjectDef } from "./parsers/object.js"; -import { parseOptionalDef } from "./parsers/optional.js"; -import { parsePipelineDef } from "./parsers/pipeline.js"; -import { parsePromiseDef } from "./parsers/promise.js"; -import { parseRecordDef } from "./parsers/record.js"; -import { parseSetDef } from "./parsers/set.js"; -import { parseStringDef } from "./parsers/string.js"; -import { parseTupleDef } from "./parsers/tuple.js"; -import { parseUndefinedDef} from "./parsers/undefined.js"; -import { parseUnionDef } from "./parsers/union.js"; -import { parseUnknownDef } from "./parsers/unknown.js"; +import { ZodTypeDef } from "zod"; import { Refs, Seen } from "./Refs.js"; -import { parseReadonlyDef } from "./parsers/readonly.js"; import { ignoreOverride } from "./Options.js"; import { JsonSchema7Type } from "./parseTypes.js"; +import { selectParser } from "./selectParser.js"; export function parseDef( def: ZodTypeDef, @@ -65,7 +36,12 @@ export function parseDef( refs.seen.set(def, newItem); - const jsonSchema = selectParser(def, (def as any).typeName, refs); + let jsonSchema = selectParser(def, (def as any).typeName, refs); + + // If the return was strictly null, then it's a call to parseDef (recursive) + if (jsonSchema === null) { + jsonSchema = parseDef((def as any).getter()._def, refs) + } if (jsonSchema) { addMeta(def, refs, jsonSchema); @@ -118,86 +94,6 @@ const getRelativePath = (pathA: string[], pathB: string[]) => { return [(pathA.length - i).toString(), ...pathB.slice(i)].join("/"); }; -const selectParser = ( - def: any, - typeName: ZodFirstPartyTypeKind, - refs: Refs, -): JsonSchema7Type | undefined => { - switch (typeName) { - case ZodFirstPartyTypeKind.ZodString: - return parseStringDef(def, refs); - case ZodFirstPartyTypeKind.ZodNumber: - return parseNumberDef(def, refs); - case ZodFirstPartyTypeKind.ZodObject: - return parseObjectDef(def, refs); - case ZodFirstPartyTypeKind.ZodBigInt: - return parseBigintDef(def, refs); - case ZodFirstPartyTypeKind.ZodBoolean: - return parseBooleanDef(); - case ZodFirstPartyTypeKind.ZodDate: - return parseDateDef(def, refs); - case ZodFirstPartyTypeKind.ZodUndefined: - return parseUndefinedDef(); - case ZodFirstPartyTypeKind.ZodNull: - return parseNullDef(refs); - case ZodFirstPartyTypeKind.ZodArray: - return parseArrayDef(def, refs); - case ZodFirstPartyTypeKind.ZodUnion: - case ZodFirstPartyTypeKind.ZodDiscriminatedUnion: - return parseUnionDef(def, refs); - case ZodFirstPartyTypeKind.ZodIntersection: - return parseIntersectionDef(def, refs); - case ZodFirstPartyTypeKind.ZodTuple: - return parseTupleDef(def, refs); - case ZodFirstPartyTypeKind.ZodRecord: - return parseRecordDef(def, refs); - case ZodFirstPartyTypeKind.ZodLiteral: - return parseLiteralDef(def, refs); - case ZodFirstPartyTypeKind.ZodEnum: - return parseEnumDef(def); - case ZodFirstPartyTypeKind.ZodNativeEnum: - return parseNativeEnumDef(def); - case ZodFirstPartyTypeKind.ZodNullable: - return parseNullableDef(def, refs); - case ZodFirstPartyTypeKind.ZodOptional: - return parseOptionalDef(def, refs); - case ZodFirstPartyTypeKind.ZodMap: - return parseMapDef(def, refs); - case ZodFirstPartyTypeKind.ZodSet: - return parseSetDef(def, refs); - case ZodFirstPartyTypeKind.ZodLazy: - return parseDef(def.getter()._def, refs); - case ZodFirstPartyTypeKind.ZodPromise: - return parsePromiseDef(def, refs); - case ZodFirstPartyTypeKind.ZodNaN: - case ZodFirstPartyTypeKind.ZodNever: - return parseNeverDef(); - case ZodFirstPartyTypeKind.ZodEffects: - return parseEffectsDef(def, refs); - case ZodFirstPartyTypeKind.ZodAny: - return parseAnyDef(); - case ZodFirstPartyTypeKind.ZodUnknown: - return parseUnknownDef(); - case ZodFirstPartyTypeKind.ZodDefault: - return parseDefaultDef(def, refs); - case ZodFirstPartyTypeKind.ZodBranded: - return parseBrandedDef(def, refs); - case ZodFirstPartyTypeKind.ZodReadonly: - return parseReadonlyDef(def, refs); - case ZodFirstPartyTypeKind.ZodCatch: - return parseCatchDef(def, refs); - case ZodFirstPartyTypeKind.ZodPipeline: - return parsePipelineDef(def, refs); - case ZodFirstPartyTypeKind.ZodFunction: - case ZodFirstPartyTypeKind.ZodVoid: - case ZodFirstPartyTypeKind.ZodSymbol: - return undefined; - default: - /* c8 ignore next */ - return ((_: never) => undefined)(typeName); - } -}; - const addMeta = ( def: ZodTypeDef, refs: Refs, diff --git a/src/selectParser.ts b/src/selectParser.ts new file mode 100644 index 0000000..63804fd --- /dev/null +++ b/src/selectParser.ts @@ -0,0 +1,114 @@ +import { ZodFirstPartyTypeKind } from "zod"; +import { parseAnyDef } from "./parsers/any.js"; +import { parseArrayDef } from "./parsers/array.js"; +import { parseBigintDef } from "./parsers/bigint.js"; +import { parseBooleanDef } from "./parsers/boolean.js"; +import { parseBrandedDef } from "./parsers/branded.js"; +import { parseCatchDef } from "./parsers/catch.js"; +import { parseDateDef } from "./parsers/date.js"; +import { parseDefaultDef } from "./parsers/default.js"; +import { parseEffectsDef } from "./parsers/effects.js"; +import { parseEnumDef } from "./parsers/enum.js"; +import {parseIntersectionDef } from "./parsers/intersection.js"; +import { parseLiteralDef } from "./parsers/literal.js"; +import { parseMapDef } from "./parsers/map.js"; +import { parseNativeEnumDef } from "./parsers/nativeEnum.js"; +import { parseNeverDef } from "./parsers/never.js"; +import { parseNullDef } from "./parsers/null.js"; +import { parseNullableDef } from "./parsers/nullable.js"; +import { parseNumberDef } from "./parsers/number.js"; +import { parseObjectDef } from "./parsers/object.js"; +import { parseOptionalDef } from "./parsers/optional.js"; +import { parsePipelineDef } from "./parsers/pipeline.js"; +import { parsePromiseDef } from "./parsers/promise.js"; +import { parseRecordDef } from "./parsers/record.js"; +import { parseSetDef } from "./parsers/set.js"; +import { parseStringDef } from "./parsers/string.js"; +import { parseTupleDef } from "./parsers/tuple.js"; +import { parseUndefinedDef} from "./parsers/undefined.js"; +import { parseUnionDef } from "./parsers/union.js"; +import { parseUnknownDef } from "./parsers/unknown.js"; +import { Refs } from "./Refs.js"; +import { parseReadonlyDef } from "./parsers/readonly.js"; +import { JsonSchema7Type } from "./parseTypes.js"; + + +export const selectParser = ( + def: any, + typeName: ZodFirstPartyTypeKind, + refs: Refs, +): JsonSchema7Type | undefined | null => { + switch (typeName) { + case ZodFirstPartyTypeKind.ZodString: + return parseStringDef(def, refs); + case ZodFirstPartyTypeKind.ZodNumber: + return parseNumberDef(def, refs); + case ZodFirstPartyTypeKind.ZodObject: + return parseObjectDef(def, refs); + case ZodFirstPartyTypeKind.ZodBigInt: + return parseBigintDef(def, refs); + case ZodFirstPartyTypeKind.ZodBoolean: + return parseBooleanDef(); + case ZodFirstPartyTypeKind.ZodDate: + return parseDateDef(def, refs); + case ZodFirstPartyTypeKind.ZodUndefined: + return parseUndefinedDef(); + case ZodFirstPartyTypeKind.ZodNull: + return parseNullDef(refs); + case ZodFirstPartyTypeKind.ZodArray: + return parseArrayDef(def, refs); + case ZodFirstPartyTypeKind.ZodUnion: + case ZodFirstPartyTypeKind.ZodDiscriminatedUnion: + return parseUnionDef(def, refs); + case ZodFirstPartyTypeKind.ZodIntersection: + return parseIntersectionDef(def, refs); + case ZodFirstPartyTypeKind.ZodTuple: + return parseTupleDef(def, refs); + case ZodFirstPartyTypeKind.ZodRecord: + return parseRecordDef(def, refs); + case ZodFirstPartyTypeKind.ZodLiteral: + return parseLiteralDef(def, refs); + case ZodFirstPartyTypeKind.ZodEnum: + return parseEnumDef(def); + case ZodFirstPartyTypeKind.ZodNativeEnum: + return parseNativeEnumDef(def); + case ZodFirstPartyTypeKind.ZodNullable: + return parseNullableDef(def, refs); + case ZodFirstPartyTypeKind.ZodOptional: + return parseOptionalDef(def, refs); + case ZodFirstPartyTypeKind.ZodMap: + return parseMapDef(def, refs); + case ZodFirstPartyTypeKind.ZodSet: + return parseSetDef(def, refs); + case ZodFirstPartyTypeKind.ZodLazy: + return null; + case ZodFirstPartyTypeKind.ZodPromise: + return parsePromiseDef(def, refs); + case ZodFirstPartyTypeKind.ZodNaN: + case ZodFirstPartyTypeKind.ZodNever: + return parseNeverDef(); + case ZodFirstPartyTypeKind.ZodEffects: + return parseEffectsDef(def, refs); + case ZodFirstPartyTypeKind.ZodAny: + return parseAnyDef(); + case ZodFirstPartyTypeKind.ZodUnknown: + return parseUnknownDef(); + case ZodFirstPartyTypeKind.ZodDefault: + return parseDefaultDef(def, refs); + case ZodFirstPartyTypeKind.ZodBranded: + return parseBrandedDef(def, refs); + case ZodFirstPartyTypeKind.ZodReadonly: + return parseReadonlyDef(def, refs); + case ZodFirstPartyTypeKind.ZodCatch: + return parseCatchDef(def, refs); + case ZodFirstPartyTypeKind.ZodPipeline: + return parsePipelineDef(def, refs); + case ZodFirstPartyTypeKind.ZodFunction: + case ZodFirstPartyTypeKind.ZodVoid: + case ZodFirstPartyTypeKind.ZodSymbol: + return undefined; + default: + /* c8 ignore next */ + return ((_: never) => undefined)(typeName); + } +}; \ No newline at end of file