UNPKG

json-schema-to-zod

Version:

Converts JSON schema objects or files into Zod schemas

71 lines (70 loc) 2.02 kB
import { withMessage } from "../utils/withMessage.js"; export const parseNumber = (schema) => { let r = "z.number()"; if (schema.type === "integer") { r += withMessage(schema, "type", () => [".int(", ")"]); } else { r += withMessage(schema, "format", ({ value }) => { if (value === "int64") { return [".int(", ")"]; } }); } r += withMessage(schema, "multipleOf", ({ value, json }) => { if (value === 1) { if (r.startsWith("z.number().int(")) { return; } return [".int(", ")"]; } return [`.multipleOf(${json}`, ", ", ")"]; }); if (typeof schema.minimum === "number") { if (schema.exclusiveMinimum === true) { r += withMessage(schema, "minimum", ({ json }) => [ `.gt(${json}`, ", ", ")", ]); } else { r += withMessage(schema, "minimum", ({ json }) => [ `.gte(${json}`, ", ", ")", ]); } } else if (typeof schema.exclusiveMinimum === "number") { r += withMessage(schema, "exclusiveMinimum", ({ json }) => [ `.gt(${json}`, ", ", ")", ]); } if (typeof schema.maximum === "number") { if (schema.exclusiveMaximum === true) { r += withMessage(schema, "maximum", ({ json }) => [ `.lt(${json}`, ", ", ")", ]); } else { r += withMessage(schema, "maximum", ({ json }) => [ `.lte(${json}`, ", ", ")", ]); } } else if (typeof schema.exclusiveMaximum === "number") { r += withMessage(schema, "exclusiveMaximum", ({ json }) => [ `.lt(${json}`, ", ", ")", ]); } return r; };