UNPKG

@langchain/core

Version:
1 lines 6.64 kB
{"version":3,"file":"union.cjs","names":["def: ZodUnionDef | ZodDiscriminatedUnionDef<any, any>","refs: Refs","options: readonly ZodTypeAny[]","types: JsonSchema7Primitive[]","types","acc: JsonSchema7Primitive[]","x: { _def: ZodLiteralDef }","acc: string[]","x: string","x","parseDef"],"sources":["../../../../src/utils/zod-to-json-schema/parsers/union.ts"],"sourcesContent":["import {\n ZodDiscriminatedUnionDef,\n ZodLiteralDef,\n ZodTypeAny,\n ZodUnionDef,\n} from \"zod/v3\";\nimport { parseDef } from \"../parseDef.js\";\nimport { JsonSchema7Type } from \"../parseTypes.js\";\nimport { Refs } from \"../Refs.js\";\n\nexport const primitiveMappings = {\n ZodString: \"string\",\n ZodNumber: \"number\",\n ZodBigInt: \"integer\",\n ZodBoolean: \"boolean\",\n ZodNull: \"null\",\n} as const;\ntype ZodPrimitive = keyof typeof primitiveMappings;\ntype JsonSchema7Primitive =\n (typeof primitiveMappings)[keyof typeof primitiveMappings];\n\nexport type JsonSchema7UnionType =\n | JsonSchema7PrimitiveUnionType\n | JsonSchema7AnyOfType;\n\ntype JsonSchema7PrimitiveUnionType =\n | {\n type: JsonSchema7Primitive | JsonSchema7Primitive[];\n }\n | {\n type: JsonSchema7Primitive | JsonSchema7Primitive[];\n enum: (string | number | bigint | boolean | null)[];\n };\n\ntype JsonSchema7AnyOfType = {\n anyOf: JsonSchema7Type[];\n};\n\nexport function parseUnionDef(\n def: ZodUnionDef | ZodDiscriminatedUnionDef<any, any>,\n refs: Refs\n): JsonSchema7PrimitiveUnionType | JsonSchema7AnyOfType | undefined {\n if (refs.target === \"openApi3\") return asAnyOf(def, refs);\n\n const options: readonly ZodTypeAny[] =\n def.options instanceof Map ? Array.from(def.options.values()) : def.options;\n\n // This blocks tries to look ahead a bit to produce nicer looking schemas with type array instead of anyOf.\n if (\n options.every(\n (x) =>\n x._def.typeName in primitiveMappings &&\n (!x._def.checks || !x._def.checks.length)\n )\n ) {\n // all types in union are primitive and lack checks, so might as well squash into {type: [...]}\n\n const types = options.reduce((types: JsonSchema7Primitive[], x) => {\n const type = primitiveMappings[x._def.typeName as ZodPrimitive]; //Can be safely casted due to row 43\n return type && !types.includes(type) ? [...types, type] : types;\n }, []);\n\n return {\n type: types.length > 1 ? types : types[0],\n };\n } else if (\n options.every((x) => x._def.typeName === \"ZodLiteral\" && !x.description)\n ) {\n // all options literals\n\n const types = options.reduce(\n (acc: JsonSchema7Primitive[], x: { _def: ZodLiteralDef }) => {\n const type = typeof x._def.value;\n switch (type) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return [...acc, type];\n case \"bigint\":\n return [...acc, \"integer\" as const];\n case \"object\":\n if (x._def.value === null) return [...acc, \"null\" as const];\n return acc;\n case \"symbol\":\n case \"undefined\":\n case \"function\":\n default:\n return acc;\n }\n },\n []\n );\n\n if (types.length === options.length) {\n // all the literals are primitive, as far as null can be considered primitive\n\n const uniqueTypes = types.filter((x, i, a) => a.indexOf(x) === i);\n return {\n type: uniqueTypes.length > 1 ? uniqueTypes : uniqueTypes[0],\n enum: options.reduce((acc, x) => {\n return acc.includes(x._def.value) ? acc : [...acc, x._def.value];\n }, [] as (string | number | bigint | boolean | null)[]),\n };\n }\n } else if (options.every((x) => x._def.typeName === \"ZodEnum\")) {\n return {\n type: \"string\",\n enum: options.reduce(\n (acc: string[], x) => [\n ...acc,\n ...x._def.values.filter((x: string) => !acc.includes(x)),\n ],\n []\n ),\n };\n }\n\n return asAnyOf(def, refs);\n}\n\nconst asAnyOf = (\n def: ZodUnionDef | ZodDiscriminatedUnionDef<any, any>,\n refs: Refs\n): JsonSchema7PrimitiveUnionType | JsonSchema7AnyOfType | undefined => {\n const anyOf = (\n (def.options instanceof Map\n ? Array.from(def.options.values())\n : def.options) as any[]\n )\n .map((x, i) =>\n parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", `${i}`],\n })\n )\n .filter(\n (x): x is JsonSchema7Type =>\n !!x &&\n (!refs.strictUnions ||\n (typeof x === \"object\" && Object.keys(x).length > 0))\n );\n\n return anyOf.length ? { anyOf } : undefined;\n};\n"],"mappings":";;;AAUA,MAAa,oBAAoB;CAC/B,WAAW;CACX,WAAW;CACX,WAAW;CACX,YAAY;CACZ,SAAS;AACV;AAsBD,SAAgB,cACdA,KACAC,MACkE;AAClE,KAAI,KAAK,WAAW,WAAY,QAAO,QAAQ,KAAK,KAAK;CAEzD,MAAMC,UACJ,IAAI,mBAAmB,MAAM,MAAM,KAAK,IAAI,QAAQ,QAAQ,CAAC,GAAG,IAAI;AAGtE,KACE,QAAQ,MACN,CAAC,MACC,EAAE,KAAK,YAAY,sBAClB,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,KAAK,OAAO,QACrC,EACD;EAGA,MAAM,QAAQ,QAAQ,OAAO,CAACC,SAA+B,MAAM;GACjE,MAAM,OAAO,kBAAkB,EAAE,KAAK;AACtC,UAAO,QAAQ,CAACC,QAAM,SAAS,KAAK,GAAG,CAAC,GAAGA,SAAO,IAAK,IAAGA;EAC3D,GAAE,CAAE,EAAC;AAEN,SAAO,EACL,MAAM,MAAM,SAAS,IAAI,QAAQ,MAAM,GACxC;CACF,WACC,QAAQ,MAAM,CAAC,MAAM,EAAE,KAAK,aAAa,gBAAgB,CAAC,EAAE,YAAY,EACxE;EAGA,MAAM,QAAQ,QAAQ,OACpB,CAACC,KAA6BC,MAA+B;GAC3D,MAAM,OAAO,OAAO,EAAE,KAAK;AAC3B,WAAQ,MAAR;IACE,KAAK;IACL,KAAK;IACL,KAAK,UACH,QAAO,CAAC,GAAG,KAAK,IAAK;IACvB,KAAK,SACH,QAAO,CAAC,GAAG,KAAK,SAAmB;IACrC,KAAK;AACH,SAAI,EAAE,KAAK,UAAU,KAAM,QAAO,CAAC,GAAG,KAAK,MAAgB;AAC3D,YAAO;IACT,KAAK;IACL,KAAK;IACL,KAAK;IACL,QACE,QAAO;GACV;EACF,GACD,CAAE,EACH;AAED,MAAI,MAAM,WAAW,QAAQ,QAAQ;GAGnC,MAAM,cAAc,MAAM,OAAO,CAAC,GAAG,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;AACjE,UAAO;IACL,MAAM,YAAY,SAAS,IAAI,cAAc,YAAY;IACzD,MAAM,QAAQ,OAAO,CAAC,KAAK,MAAM;AAC/B,YAAO,IAAI,SAAS,EAAE,KAAK,MAAM,GAAG,MAAM,CAAC,GAAG,KAAK,EAAE,KAAK,KAAM;IACjE,GAAE,CAAE,EAAkD;GACxD;EACF;CACF,WAAU,QAAQ,MAAM,CAAC,MAAM,EAAE,KAAK,aAAa,UAAU,CAC5D,QAAO;EACL,MAAM;EACN,MAAM,QAAQ,OACZ,CAACC,KAAe,MAAM,CACpB,GAAG,KACH,GAAG,EAAE,KAAK,OAAO,OAAO,CAACC,QAAc,CAAC,IAAI,SAASC,IAAE,CAAC,AACzD,GACD,CAAE,EACH;CACF;AAGH,QAAO,QAAQ,KAAK,KAAK;AAC1B;AAED,MAAM,UAAU,CACdT,KACAC,SACqE;CACrE,MAAM,SACH,IAAI,mBAAmB,MACpB,MAAM,KAAK,IAAI,QAAQ,QAAQ,CAAC,GAChC,IAAI,SAEP,IAAI,CAAC,GAAG,MACPS,0BAAS,EAAE,MAAM;EACf,GAAG;EACH,aAAa;GAAC,GAAG,KAAK;GAAa;GAAS,GAAG,GAAG;EAAC;CACpD,EAAC,CACH,CACA,OACC,CAAC,MACC,CAAC,CAAC,MACD,CAAC,KAAK,gBACJ,OAAO,MAAM,YAAY,OAAO,KAAK,EAAE,CAAC,SAAS,GACvD;AAEH,QAAO,MAAM,SAAS,EAAE,MAAO,IAAG;AACnC"}