UNPKG

@mastra/schema-compat

Version:

Tool schema compatibility layer for Mastra.ai

1 lines • 16.2 kB
{"version":3,"file":"json-to-zod.cjs","names":["its"],"sources":["../src/json-to-zod.ts"],"sourcesContent":["import type { JsonSchema, JsonSchemaObject, Options, Refs } from 'json-schema-to-zod';\nimport jsonSchemaToZodOriginal, {\n addJsdocs,\n its,\n parseAllOf,\n parseAnyOf,\n parseOneOf,\n parseSchema,\n} from 'json-schema-to-zod';\n\nfunction parseObject(objectSchema: JsonSchemaObject & { type: 'object' }, refs: Refs): string {\n let properties: string | undefined = undefined;\n\n if (objectSchema.properties) {\n if (!Object.keys(objectSchema.properties).length) {\n properties = 'z.object({})';\n } else {\n properties = 'z.object({ ';\n\n properties += Object.keys(objectSchema.properties)\n .map(key => {\n const propSchema = objectSchema.properties![key];\n\n let result = `${JSON.stringify(key)}: ${parseSchema(propSchema!, {\n ...refs,\n path: [...refs.path, 'properties', key],\n })}`;\n\n if (refs.withJsdocs && typeof propSchema === 'object') {\n result = addJsdocs(propSchema, result);\n }\n\n const hasDefault = typeof propSchema === 'object' && propSchema.default !== undefined;\n\n const required = Array.isArray(objectSchema.required)\n ? objectSchema.required.includes(key)\n : typeof propSchema === 'object' && propSchema.required === true;\n\n const optional = !hasDefault && !required;\n\n return optional ? `${result}.optional()` : result;\n })\n .join(', ');\n\n properties += ' })';\n }\n }\n\n const additionalProperties =\n objectSchema.additionalProperties !== undefined && objectSchema.additionalProperties !== false\n ? parseSchema(objectSchema.additionalProperties, {\n ...refs,\n path: [...refs.path, 'additionalProperties'],\n })\n : undefined;\n\n let patternProperties: string | undefined = undefined;\n\n if (objectSchema.patternProperties) {\n const parsedPatternProperties = Object.fromEntries(\n Object.entries(objectSchema.patternProperties).map(([key, value]) => {\n return [\n key,\n parseSchema(value, {\n ...refs,\n path: [...refs.path, 'patternProperties', key],\n }),\n ];\n }, {}),\n );\n\n patternProperties = '';\n\n if (properties) {\n if (additionalProperties) {\n patternProperties += `.catchall(z.union([${[\n ...Object.values(parsedPatternProperties),\n additionalProperties,\n ].join(', ')}]))`;\n } else if (Object.keys(parsedPatternProperties).length > 1) {\n patternProperties += `.catchall(z.union([${Object.values(parsedPatternProperties).join(', ')}]))`;\n } else {\n patternProperties += `.catchall(${Object.values(parsedPatternProperties)})`;\n }\n } else {\n if (additionalProperties) {\n patternProperties += `z.record(z.union([${[\n ...Object.values(parsedPatternProperties),\n additionalProperties,\n ].join(', ')}]))`;\n } else if (Object.keys(parsedPatternProperties).length > 1) {\n patternProperties += `z.record(z.union([${Object.values(parsedPatternProperties).join(', ')}]))`;\n } else {\n patternProperties += `z.record(${Object.values(parsedPatternProperties)})`;\n }\n }\n\n patternProperties += '.superRefine((value, ctx) => {\\n';\n\n patternProperties += 'for (const key in value) {\\n';\n\n if (additionalProperties) {\n if (objectSchema.properties) {\n patternProperties += `let evaluated = [${Object.keys(objectSchema.properties)\n .map(key => JSON.stringify(key))\n .join(', ')}].includes(key)\\n`;\n } else {\n patternProperties += `let evaluated = false\\n`;\n }\n }\n\n for (const key in objectSchema.patternProperties) {\n patternProperties += 'if (key.match(new RegExp(' + JSON.stringify(key) + '))) {\\n';\n if (additionalProperties) {\n patternProperties += 'evaluated = true\\n';\n }\n patternProperties += 'const result = ' + parsedPatternProperties[key] + '.safeParse(value[key])\\n';\n patternProperties += 'if (!result.success) {\\n';\n\n patternProperties += `ctx.addIssue({\n path: [...ctx.path, key],\n code: 'custom',\n message: \\`Invalid input: Key matching regex /\\${key}/ must match schema\\`,\n params: {\n issues: result.error.issues\n }\n })\\n`;\n\n patternProperties += '}\\n';\n patternProperties += '}\\n';\n }\n\n if (additionalProperties) {\n patternProperties += 'if (!evaluated) {\\n';\n patternProperties += 'const result = ' + additionalProperties + '.safeParse(value[key])\\n';\n patternProperties += 'if (!result.success) {\\n';\n\n patternProperties += `ctx.addIssue({\n path: [...ctx.path, key],\n code: 'custom',\n message: \\`Invalid input: must match catchall schema\\`,\n params: {\n issues: result.error.issues\n }\n })\\n`;\n\n patternProperties += '}\\n';\n patternProperties += '}\\n';\n }\n patternProperties += '}\\n';\n patternProperties += '})';\n }\n\n let output = properties\n ? patternProperties\n ? properties + patternProperties\n : additionalProperties\n ? additionalProperties === 'z.never()'\n ? properties + '.strict()'\n : properties + `.catchall(${additionalProperties})`\n : properties\n : patternProperties\n ? patternProperties\n : additionalProperties\n ? `z.record(${additionalProperties})`\n : 'z.record(z.any())';\n\n if (its.an.anyOf(objectSchema)) {\n output += `.and(${parseAnyOf(\n {\n ...objectSchema,\n anyOf: objectSchema.anyOf.map(x =>\n typeof x === 'object' && !x.type && (x.properties || x.additionalProperties || x.patternProperties)\n ? { ...x, type: 'object' }\n : x,\n ) as any,\n },\n refs,\n )})`;\n }\n\n if (its.a.oneOf(objectSchema)) {\n output += `.and(${parseOneOf(\n {\n ...objectSchema,\n oneOf: objectSchema.oneOf.map(x =>\n typeof x === 'object' && !x.type && (x.properties || x.additionalProperties || x.patternProperties)\n ? { ...x, type: 'object' }\n : x,\n ) as any,\n },\n refs,\n )})`;\n }\n\n if (its.an.allOf(objectSchema)) {\n output += `.and(${parseAllOf(\n {\n ...objectSchema,\n allOf: objectSchema.allOf.map(x =>\n typeof x === 'object' && !x.type && (x.properties || x.additionalProperties || x.patternProperties)\n ? { ...x, type: 'object' }\n : x,\n ) as any,\n },\n refs,\n )})`;\n }\n\n return output;\n}\n\nconst parserOverride = (schema: JsonSchemaObject, refs: Refs) => {\n let parsed = '';\n let seen = refs.seen.get(schema);\n if (its.an.anyOf(schema)) {\n const allObjects = schema.anyOf.every(\n item => typeof item === 'object' && its.an.object(item) && item.properties !== undefined,\n );\n if (schema.anyOf.length > 1 && allObjects) {\n const propertiesWithConst: string[][] = schema.anyOf.reduce((acc, item) => {\n if (typeof item === 'object' && its.an.object(item)) {\n const propertyWithConst = Object.entries(item.properties ?? {}).filter(\n ([_, value]) => typeof value === 'object' && (value as any)?.const !== undefined,\n );\n if (propertyWithConst?.length) {\n const ppties = propertyWithConst.map(([key, _]) => key);\n acc.push(ppties);\n }\n }\n return acc;\n }, [] as string[][]);\n\n if (propertiesWithConst.length === schema.anyOf.length) {\n if (seen) {\n if (seen.r !== undefined) {\n return seen.r;\n }\n\n if (refs.depth === undefined || seen.n >= refs.depth) {\n return 'z.any()';\n }\n\n seen.n += 1;\n } else {\n seen = { r: undefined, n: 0 };\n refs.seen.set(schema, seen);\n }\n\n const discriminators =\n propertiesWithConst.length > 0 && propertiesWithConst[0]\n ? propertiesWithConst.reduce((common, properties) => {\n return common.filter(prop => properties.includes(prop));\n }, propertiesWithConst[0])\n : [];\n\n if (discriminators.length > 0) {\n const discriminator = discriminators[0];\n if (discriminator) {\n parsed = `z.discriminatedUnion(\"${discriminator}\", [${schema.anyOf\n .map((schema, i) =>\n parseSchema(schema, {\n ...refs,\n path: [...refs.path, 'anyOf', i],\n }),\n )\n .join(', ')}])`;\n }\n }\n }\n }\n } else if (its.an.object(schema)) {\n if (seen) {\n if (seen.r !== undefined) {\n return seen.r;\n }\n\n if (refs.depth === undefined || seen.n >= refs.depth) {\n return 'z.any()';\n }\n\n seen.n += 1;\n } else {\n seen = { r: undefined, n: 0 };\n refs.seen.set(schema, seen);\n }\n\n parsed = parseObject(schema, refs);\n }\n if (parsed) {\n if (!refs.withoutDescribes) {\n parsed = addDescribes(schema, parsed);\n }\n\n if (!refs.withoutDefaults) {\n parsed = addDefaults(schema, parsed);\n }\n\n parsed = addAnnotations(schema, parsed);\n\n if (seen) {\n seen.r = parsed;\n }\n\n return parsed;\n }\n};\n\nconst addDescribes = (schema: JsonSchemaObject, parsed: string): string => {\n if (schema.description) {\n parsed += `.describe(${JSON.stringify(schema.description)})`;\n }\n\n return parsed;\n};\n\nconst addDefaults = (schema: JsonSchemaObject, parsed: string): string => {\n if (schema.default !== undefined) {\n parsed += `.default(${JSON.stringify(schema.default)})`;\n }\n\n return parsed;\n};\n\nconst addAnnotations = (schema: JsonSchemaObject, parsed: string): string => {\n if (schema.readOnly) {\n parsed += '.readonly()';\n }\n\n return parsed;\n};\n\nexport function jsonSchemaToZod(schema: JsonSchema, options: Options = {}): string {\n const result = jsonSchemaToZodOriginal(schema, { ...options, parserOverride });\n\n // Fix: The upstream json-schema-to-zod generates TypeScript syntax `reduce<z.ZodError[]>`\n // in parseOneOf which fails when evaluated at runtime with Function().\n // This catches any oneOf usage that bypasses our parserOverride (e.g., non-object contexts).\n // See: https://github.com/mastra-ai/mastra/issues/11610\n return result.replace(/\\.reduce<[^>]+>/g, '.reduce');\n}\n\n// Re-export all named exports from json-schema-to-zod (excluding the default export)\nexport * from 'json-schema-to-zod';\n"],"mappings":"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"}