json-schema-to-zod
Version:
Converts JSON schema objects or files into Zod schemas
144 lines (143 loc) • 5.16 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.its = exports.parseSchema = void 0;
const parseAnyOf_js_1 = require("./parseAnyOf.js");
const parseBoolean_js_1 = require("./parseBoolean.js");
const parseDefault_js_1 = require("./parseDefault.js");
const parseMultipleType_js_1 = require("./parseMultipleType.js");
const parseNot_js_1 = require("./parseNot.js");
const parseNull_js_1 = require("./parseNull.js");
const parseAllOf_js_1 = require("./parseAllOf.js");
const parseArray_js_1 = require("./parseArray.js");
const parseConst_js_1 = require("./parseConst.js");
const parseEnum_js_1 = require("./parseEnum.js");
const parseIfThenElse_js_1 = require("./parseIfThenElse.js");
const parseNumber_js_1 = require("./parseNumber.js");
const parseObject_js_1 = require("./parseObject.js");
const parseString_js_1 = require("./parseString.js");
const parseOneOf_js_1 = require("./parseOneOf.js");
const parseNullable_js_1 = require("./parseNullable.js");
const parseSchema = (schema, refs = { seen: new Map(), path: [] }, blockMeta) => {
if (typeof schema !== "object")
return schema ? "z.any()" : "z.never()";
if (refs.parserOverride) {
const custom = refs.parserOverride(schema, refs);
if (typeof custom === "string") {
return custom;
}
}
let seen = refs.seen.get(schema);
if (seen) {
if (seen.r !== undefined) {
return seen.r;
}
if (refs.depth === undefined || seen.n >= refs.depth) {
return "z.any()";
}
seen.n += 1;
}
else {
seen = { r: undefined, n: 0 };
refs.seen.set(schema, seen);
}
let parsed = selectParser(schema, refs);
if (!blockMeta) {
if (!refs.withoutDescribes) {
parsed = addDescribes(schema, parsed);
}
if (!refs.withoutDefaults) {
parsed = addDefaults(schema, parsed);
}
parsed = addAnnotations(schema, parsed);
}
seen.r = parsed;
return parsed;
};
exports.parseSchema = parseSchema;
const addDescribes = (schema, parsed) => {
if (schema.description) {
parsed += `.describe(${JSON.stringify(schema.description)})`;
}
return parsed;
};
const addDefaults = (schema, parsed) => {
if (schema.default !== undefined) {
parsed += `.default(${JSON.stringify(schema.default)})`;
}
return parsed;
};
const addAnnotations = (schema, parsed) => {
if (schema.readOnly) {
parsed += ".readonly()";
}
return parsed;
};
const selectParser = (schema, refs) => {
if (exports.its.a.nullable(schema)) {
return (0, parseNullable_js_1.parseNullable)(schema, refs);
}
else if (exports.its.an.object(schema)) {
return (0, parseObject_js_1.parseObject)(schema, refs);
}
else if (exports.its.an.array(schema)) {
return (0, parseArray_js_1.parseArray)(schema, refs);
}
else if (exports.its.an.anyOf(schema)) {
return (0, parseAnyOf_js_1.parseAnyOf)(schema, refs);
}
else if (exports.its.an.allOf(schema)) {
return (0, parseAllOf_js_1.parseAllOf)(schema, refs);
}
else if (exports.its.a.oneOf(schema)) {
return (0, parseOneOf_js_1.parseOneOf)(schema, refs);
}
else if (exports.its.a.not(schema)) {
return (0, parseNot_js_1.parseNot)(schema, refs);
}
else if (exports.its.an.enum(schema)) {
return (0, parseEnum_js_1.parseEnum)(schema); //<-- needs to come before primitives
}
else if (exports.its.a.const(schema)) {
return (0, parseConst_js_1.parseConst)(schema);
}
else if (exports.its.a.multipleType(schema)) {
return (0, parseMultipleType_js_1.parseMultipleType)(schema, refs);
}
else if (exports.its.a.primitive(schema, "string")) {
return (0, parseString_js_1.parseString)(schema);
}
else if (exports.its.a.primitive(schema, "number") ||
exports.its.a.primitive(schema, "integer")) {
return (0, parseNumber_js_1.parseNumber)(schema);
}
else if (exports.its.a.primitive(schema, "boolean")) {
return (0, parseBoolean_js_1.parseBoolean)(schema);
}
else if (exports.its.a.primitive(schema, "null")) {
return (0, parseNull_js_1.parseNull)(schema);
}
else if (exports.its.a.conditional(schema)) {
return (0, parseIfThenElse_js_1.parseIfThenElse)(schema, refs);
}
else {
return (0, parseDefault_js_1.parseDefault)(schema);
}
};
exports.its = {
an: {
object: (x) => x.type === "object",
array: (x) => x.type === "array",
anyOf: (x) => x.anyOf !== undefined,
allOf: (x) => x.allOf !== undefined,
enum: (x) => x.enum !== undefined,
},
a: {
nullable: (x) => x.nullable === true,
multipleType: (x) => Array.isArray(x.type),
not: (x) => x.not !== undefined,
const: (x) => x.const !== undefined,
primitive: (x, p) => x.type === p,
conditional: (x) => Boolean("if" in x && x.if && "then" in x && "else" in x && x.then && x.else),
oneOf: (x) => x.oneOf !== undefined,
},
};
;