json-schema-to-zod
Version:
Converts JSON schema objects or files into Zod schemas
47 lines (44 loc) • 1.43 kB
JavaScript
import { parseSchema } from "./parsers/parseSchema.js";
import { expandJsdocs } from "./utils/jsdocs.js";
export const jsonSchemaToZod = (schema, { module, name, type, noImport, ...rest } = {}) => {
if (type && (!name || module !== "esm")) {
throw new Error("Option `type` requires `name` to be set and `module` to be `esm`");
}
let result = parseSchema(schema, {
module,
name,
path: [],
seen: new Map(),
...rest,
});
const jsdocs = rest.withJsdocs && typeof schema !== "boolean" && schema.description
? expandJsdocs(schema.description)
: "";
if (module === "cjs") {
result = `${jsdocs}module.exports = ${name ? `{ ${JSON.stringify(name)}: ${result} }` : result}
`;
if (!noImport) {
result = `${jsdocs}const { z } = require("zod")
${result}`;
}
}
else if (module === "esm") {
result = `${jsdocs}export ${name ? `const ${name} =` : `default`} ${result}
`;
if (!noImport) {
result = `import { z } from "zod"
${result}`;
}
}
else if (name) {
result = `${jsdocs}const ${name} = ${result}`;
}
if (type && name) {
let typeName = typeof type === "string"
? type
: `${name[0].toUpperCase()}${name.substring(1)}`;
result += `export type ${typeName} = z.infer<typeof ${name}>
`;
}
return result;
};