json-schema-to-zod
Version:
Converts JSON schema objects or files into Zod schemas
51 lines (48 loc) • 1.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.jsonSchemaToZod = void 0;
const parseSchema_js_1 = require("./parsers/parseSchema.js");
const jsdocs_js_1 = require("./utils/jsdocs.js");
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 = (0, parseSchema_js_1.parseSchema)(schema, {
module,
name,
path: [],
seen: new Map(),
...rest,
});
const jsdocs = rest.withJsdocs && typeof schema !== "boolean" && schema.description
? (0, jsdocs_js_1.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;
};
exports.jsonSchemaToZod = jsonSchemaToZod;