UNPKG

zod-schema-faker

Version:

Generates mock data from zod schema. Powered by @faker-js/faker and randexp.js

931 lines (929 loc) 25.5 kB
import { SimpleFaker as F } from "@faker-js/faker"; import S from "randexp"; import * as d from "zod/v4/core"; const v = 10; let g; function Se(e) { g = e; } function o() { if (g) return g; throw ReferenceError("Faker instance not set. Use `setFaker` to set it."); } const w = new F(), s = (e, t) => { const n = new S(e, t); return n.randInt = (a, r) => w.number.int({ min: a, max: r }), n.gen(); }, je = (e) => { g.seed(e), w.seed(e); }; function j(e, t, n) { let a, r, i; for (const c of e._zod.def.checks ?? []) switch (c._zod.def.check) { case "length_equals": { if (i !== void 0 && i !== c._zod.def.length) throw new RangeError(); i = c._zod.def.length; break; } case "max_length": { r = Math.min(r ?? 1 / 0, c._zod.def.maximum); break; } case "min_length": { a = Math.max(a ?? 0, c._zod.def.minimum); break; } default: { c._zod.def.check; break; } } return a = a ?? i ?? 0, r = r ?? i ?? a + 3, t.depth > v && (r = a), o().helpers.multiple(() => n(e._zod.def.element, t), { count: { min: a, max: r } }); } function b(e) { return e.replace(/\\([.*+?^${}()|[\]\\])/g, "$1"); } function T(e, t) { return e * t / M(e, t); } function M(e, t) { return t === 0n || t === 0 ? e : M(t, e % t); } function N(e, t, n) { let a, r, i = 1n; for (const c of e._zod.def.checks ?? []) switch (c._zod.def.check) { case "greater_than": { const u = BigInt(c._zod.def.value) + (c._zod.def.inclusive ? 0n : 1n); a = a !== void 0 && a > u ? a : u; break; } case "less_than": { const u = BigInt(c._zod.def.value) - (c._zod.def.inclusive ? 0n : 1n); r = r !== void 0 && r < u ? r : u; break; } case "multiple_of": { const f = BigInt(c._zod.def.value), u = f < 0n ? -f : f; i = T(i, u); break; } default: { c._zod.def.check; break; } } return a === void 0 && (r === void 0 ? a = 0n : a = r - 10n), o().number.bigInt({ min: a, max: r, multipleOf: i }); } function A(e, t, n) { return o().datatype.boolean(); } function I(e, t, n) { return n(e._zod.def.innerType, t); } const E = /* @__PURE__ */ new Map(); function Ne(e, t) { E.set(e, t); } function C(e, t, n) { return E.get(e)(e, t, n); } function O(e, t, n) { const a = e._zod.bag.minimum ?? /* @__PURE__ */ new Date(-864e13), r = e._zod.bag.maximum ?? /* @__PURE__ */ new Date(864e13); return o().date.between({ from: a, to: r }); } function D(e, t, n) { return o().datatype.boolean() ? n(e._zod.def.innerType, t) : e._zod.def.defaultValue; } function L(e, t, n) { return o().helpers.objectValue(e._zod.def.entries); } const h = 100 * 1024 * 1024, B = { minSize: 0, maxSize: 1024, // Default 1KB exactSize: void 0, allowedMimeTypes: [] }, $ = { // Text types "text/plain": { extension: "txt", category: "text" }, "text/html": { extension: "html", category: "text" }, "text/css": { extension: "css", category: "text" }, "text/javascript": { extension: "js", category: "text" }, "text/csv": { extension: "csv", category: "text" }, "text/markdown": { extension: "md", category: "text" }, "text/xml": { extension: "xml", category: "text" }, "text/yaml": { extension: "yaml", category: "text" }, // Application types "application/json": { extension: "json", category: "application" }, "application/xml": { extension: "xml", category: "application" }, "application/javascript": { extension: "js", category: "application" }, "application/pdf": { extension: "pdf", category: "application" }, "application/zip": { extension: "zip", category: "application" }, "application/octet-stream": { extension: "bin", category: "application" }, "application/graphql": { extension: "graphql", category: "application" }, "application/x-www-form-urlencoded": { extension: "form", category: "application" }, "application/vnd.ms-excel": { extension: "xls", category: "application" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": { extension: "xlsx", category: "application" }, "application/msword": { extension: "doc", category: "application" }, "application/vnd.openxmlformats-officedocument.wordprocessingml.document": { extension: "docx", category: "application" }, "application/vnd.ms-powerpoint": { extension: "ppt", category: "application" }, "application/vnd.openxmlformats-officedocument.presentationml.presentation": { extension: "pptx", category: "application" }, // Image types "image/jpeg": { extension: "jpg", category: "image" }, "image/png": { extension: "png", category: "image" }, "image/gif": { extension: "gif", category: "image" }, "image/svg+xml": { extension: "svg", category: "image" }, "image/webp": { extension: "webp", category: "image" }, // Audio types "audio/mpeg": { extension: "mp3", category: "audio" }, "audio/wav": { extension: "wav", category: "audio" }, "audio/ogg": { extension: "ogg", category: "audio" }, // Video types "video/mp4": { extension: "mp4", category: "video" }, "video/webm": { extension: "webm", category: "video" }, "video/ogg": { extension: "ogv", category: "video" }, // Font types "font/woff": { extension: "woff", category: "font" }, "font/woff2": { extension: "woff2", category: "font" }, "font/ttf": { extension: "ttf", category: "font" }, "font/otf": { extension: "otf", category: "font" }, // Multipart types "multipart/form-data": { extension: "form", category: "multipart" } }; function P(e, t, n) { const a = o(), r = R(e), i = r.exactSize !== void 0 ? r.exactSize : a.number.int({ min: r.minSize, max: r.maxSize }), c = q(r.allowedMimeTypes, a), f = W(c), u = X(c, i); return new File([u], f, { type: c, lastModified: a.date.recent().getTime() }); } function R(e) { const t = { ...B }; for (const n of e._zod.def.checks ?? []) switch (n._zod.def.check) { case "min_size": { const a = n._zod.def.minimum; _(a, "minimum"), t.minSize = Math.max(t.minSize, k(a)); break; } case "max_size": { const a = n._zod.def.maximum; _(a, "maximum"), t.maxSize = Math.min(t.maxSize, k(a)); break; } case "size_equals": { const a = n._zod.def.size; _(a, "exact"), t.exactSize = k(a); break; } case "mime_type": { U(n, t); break; } } return Z(t), t; } function _(e, t) { if (e < 0) throw new Error(`Invalid file size constraint: ${t} size cannot be negative (${e})`); } function k(e) { const t = Math.min(e, h); return t !== e && console.warn(`Large size constraint (${e}) capped at ${h} bytes`), t; } function U(e, t) { const n = e; if (n._zod?.def?.mime && Array.isArray(n._zod.def.mime)) { if (t.allowedMimeTypes.length > 0) { const a = t.allowedMimeTypes.join(", "), r = n._zod.def.mime.join(", "); throw new Error( `Conflicting MIME type constraints: cannot have both [${a}] and [${r}] constraints on the same file` ); } t.allowedMimeTypes = [...n._zod.def.mime]; } } function Z(e) { if (e.exactSize === void 0 && e.minSize > e.maxSize) throw new Error( `Conflicting file size constraints: minimum size (${e.minSize}) cannot be greater than maximum size (${e.maxSize})` ); } function q(e, t) { if (e.length > 0) { const n = [...new Set(e)]; return t.helpers.arrayElement(n); } return "text/plain"; } function V(e) { const t = $[e]; if (t) return t.extension; const n = e.split("/"); if (n.length === 2) { const r = n[1].replace(/[^a-z0-9]/gi, "").toLowerCase(); if (r.length > 0 && r.length <= 10) return r; } return "dat"; } function G(e) { const t = $[e]; if (t) return t.category; switch (e.split("/")[0]) { case "text": return "text"; case "image": return "image"; case "audio": return "audio"; case "video": return "video"; case "font": return "font"; case "multipart": return "multipart"; default: return "application"; } } function W(e) { const t = o(), n = V(e); return `${t.system.fileName({ extensionCount: 0 })}.${n}`; } function X(e, t) { if (t === 0) return new ArrayBuffer(0); if (t > 10 * 1024 * 1024) return H(t); const n = o(); let a; switch (G(e)) { case "text": a = J(e, n); break; case "application": a = Y(e, n); break; default: a = K(e, n); break; } a = Q(a, t); const c = new TextEncoder().encode(a); if (c.length !== t) { const f = new ArrayBuffer(t), u = new Uint8Array(f); return c.length < t ? u.set(c) : u.set(c.slice(0, t)), f; } return c.buffer; } function H(e) { const t = new ArrayBuffer(e), n = new Uint8Array(t), a = new TextEncoder().encode(`LARGE_FILE_CONTENT_PLACEHOLDER `); for (let r = 0; r < e; r += a.length) { const i = Math.min(a.length, e - r); n.set(a.slice(0, i), r); } return t; } function J(e, t) { switch (e) { case "text/html": return `<html><head><title>${t.lorem.words(2)}</title></head><body><h1>${t.lorem.words(3)}</h1><p>${t.lorem.sentence()}</p></body></html>`; case "text/css": return "body { font-family: Arial; color: #333; } h1 { margin: 10px; }"; case "text/javascript": return `function ${t.hacker.noun().replace(/\s+/g, "")}() { return "${t.lorem.word()}"; }`; case "text/csv": return `name,email ${t.person.fullName()},${t.internet.email()}`; case "text/markdown": return `# ${t.lorem.words(2)} ${t.lorem.sentence()}`; case "text/xml": return `<?xml version="1.0"?><root><item>${t.lorem.word()}</item></root>`; case "text/yaml": return `name: ${t.lorem.word()} version: 1.0.0`; default: return t.lorem.paragraphs(2); } } function Y(e, t) { switch (e) { case "application/json": return JSON.stringify({ id: t.string.uuid(), name: t.person.fullName(), email: t.internet.email() }); case "application/xml": return `<?xml version="1.0"?><data><user id="${t.string.uuid()}">${t.person.fullName()}</user></data>`; case "application/javascript": return `const data = { message: "${t.lorem.sentence()}" }; export default data;`; default: return `Binary file content for ${e} Generated: ${(/* @__PURE__ */ new Date()).toISOString()} Data: ${t.string.alphanumeric(50)}`; } } function K(e, t) { return `${e.toUpperCase()} file placeholder Generated: ${(/* @__PURE__ */ new Date()).toISOString()} ID: ${t.string.uuid()} Data: ${t.string.alphanumeric(100)}`; } function Q(e, t) { if (e.length === t) return e; if (e.length < t) { const n = e; for (; e.length < t; ) { const a = t - e.length; a >= n.length ? e += n : e += n.slice(0, a); } } else e = e.slice(0, t); return e; } function ee(e, t, n) { return (...a) => (d.parse(e._zod.def.input, a), n(e._zod.def.output, t)); } function te(e, t, n) { return n(e._zod.def.getter(), t); } function ne(e, t, n) { return o().helpers.arrayElement(e._zod.def.values); } function ae(e, t, n) { return new Map( o().helpers.multiple( () => [n(e._zod.def.keyType, t), n(e._zod.def.valueType, t)], { count: { min: 0, max: 10 } } ) ); } function re(e, t, n) { return NaN; } function oe(e, t, n) { throw Error(); } function ie(e, t, n) { return n(e._zod.def.innerType, t); } function se(e, t, n) { return null; } function ce(e, t, n) { return o().datatype.boolean() ? n(e._zod.def.innerType, t) : null; } function de(e, t, n) { let a = Number.MIN_SAFE_INTEGER, r = Number.MAX_SAFE_INTEGER, i, c = !1; switch (e._zod.def.format) { case "float32": { c = !1; break; } case "float64": { c = !1; break; } case "int32": { c = !0, a = Math.max(a, -2147483647), r = Math.min(r, 2147483646); break; } case "safeint": { c = !0; break; } case "uint32": { c = !0, a = Math.max(a, 0), r = Math.min(r, 4294967295); break; } } for (const u of e._zod.def.checks ?? []) switch (u._zod.def.check) { case "greater_than": { const m = Number(u._zod.def.value) + (u._zod.def.inclusive ? 0 : 1e-15); a = a !== void 0 ? Math.max(a, m) : m; break; } case "less_than": { const m = Number(u._zod.def.value) - (u._zod.def.inclusive ? 0 : 1e-15); r = r !== void 0 ? Math.min(r, m) : m; break; } case "multiple_of": { const m = Number(u._zod.def.value); i = i !== void 0 ? T(i, m) : m; break; } case "number_format": { switch (u._zod.def.format) { case "float32": { c = !1; break; } case "float64": { c = !1; break; } case "int32": { c = !0, a = Math.max(a, -2147483647), r = Math.min(r, 2147483646); break; } case "safeint": { c = !0; break; } case "uint32": { c = !0, a = Math.max(a, 0), r = Math.min(r, 4294967295); break; } } break; } default: { u._zod.def.check; break; } } return i !== void 0 && i === parseInt(i.toString(), 10) && (c = !0), c ? o().number.int({ min: a, max: r, multipleOf: i }) : o().number.float({ min: a, max: r, multipleOf: i }); } function ue(e, t, n) { return Object.fromEntries( Object.entries(e._zod.def.shape).concat( e._zod.def.catchall && e._zod.def.catchall._zod.def.type !== "never" ? o().helpers.multiple(() => o().string.uuid()).filter((a) => !e._zod.def.shape[a]).map((a) => [a, e._zod.def.catchall]) : [] ).map(([a, r]) => [a, n(r, { ...t, depth: t.depth + 1 })]) ); } function le(e, t, n) { return o().datatype.boolean() ? n(e._zod.def.innerType, t) : void 0; } const fe = ["true", "1", "yes", "on", "y", "enabled"], me = ["false", "0", "no", "off", "n", "disabled"], pe = [...fe, ...me]; function xe(e, t, n) { if (e._zod.def.out._zod.def.type === "boolean") return o().helpers.arrayElement(pe); const a = n(e._zod.def.in, t), r = { value: a, issues: a.issues }, i = {}, c = e._zod.def.out._zod.run(r, i); return r.value = c, a; } function ge(e, t, n) { return o().datatype.boolean() ? n(e._zod.def.innerType, t) : e._zod.def.defaultValue; } function be(e, t, n) { return Promise.resolve(n(e._zod.def.innerType, t)); } function _e(e, t, n) { return Object.freeze(n(e._zod.def.innerType, t)); } function ke(e, t, n) { return e._zod.def.keyType instanceof d.$ZodEnum ? Object.fromEntries( Object.values(e._zod.def.keyType._zod.def.entries).map((a) => [ a, n(e._zod.def.valueType, t) ]) ) : e._zod.def.keyType instanceof d.$ZodLiteral ? Object.fromEntries( e._zod.def.keyType._zod.def.values.map((a) => [a, n(e._zod.def.valueType, t)]) ) : Object.fromEntries( o().helpers.multiple(() => [ n(e._zod.def.keyType, t), n(e._zod.def.valueType, t) ]) ); } function ze(e, t, n) { let a = 0, r = 1 / 0; for (const i of e._zod.def.checks ?? []) switch (i._zod.def.check) { case "max_size": { r = Math.min(r, i._zod.def.maximum); break; } case "min_size": { a = Math.max(a, i._zod.def.minimum); break; } case "size_equals": { a = i._zod.def.size, r = i._zod.def.size; break; } default: { i._zod.def.check; break; } } return r = r === 1 / 0 ? a + o().number.int({ min: 0, max: 10 }) : r, t.depth > v && (r = a), new Set( o().helpers.multiple(() => n(e._zod.def.valueType, t), { count: { min: a, max: r } }) ); } const he = /^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/; function y(e, t) { let n; switch (e._zod.def.format) { case "base64": { n = s(d.regexes.base64); break; } case "base64url": { n = "Zm9vK2Jhci9iYXo"; break; } case "cidrv4": { n = s(d.regexes.cidrv4); break; } case "cidrv6": { n = o().internet.ipv6() + "/" + o().number.int({ min: 0, max: 128 }); break; } case "cuid": { n = s(d.regexes.cuid); break; } case "cuid2": { n = s(d.regexes.cuid2); break; } case "date": { n = s(d.regexes.date); break; } case "datetime": { const r = e._zod.def; n = s( d.regexes.datetime({ local: r.local, offset: r.offset, precision: r.precision }) ); break; } case "duration": { n = [ "P", o().datatype.boolean() ? o().number.int({ min: 0, max: 10 * 2e3 }) + "Y" : "", o().datatype.boolean() ? o().number.int({ min: 0, max: 120 }) + "M" : "", o().datatype.boolean() ? o().number.int({ min: 0, max: 310 }) + "D" : "", "T", o().datatype.boolean() ? o().number.int({ min: 0, max: 240 }) + "H" : "", o().datatype.boolean() ? o().number.int({ min: 0, max: 600 }) + "M" : "", o().datatype.boolean() ? o().number.int({ min: 0, max: 600 }) + "S" : "" ].join("").replace(/T$/, "").replace(/^P$/, "P" + o().number.int({ min: 0, max: 100 }) + "W"); break; } case "e164": { n = s(d.regexes.e164); break; } case "email": { const r = e._zod.def.pattern ? e._zod.def.pattern : d.regexes.email; n = s(r), he.source === r.source && (n = n.replace(/\.\./g, ".").replace(/^\./, "a")); break; } case "emoji": { n = "☘"; break; } case "hex": { n = s(d.regexes.hex); break; } case "hostname": { n = o().internet.domainName(); break; } case "httpUrl": { n = o().internet.url(); break; } case "guid": { n = s(d.regexes.guid); break; } case "ipv4": { n = s(d.regexes.ipv4); break; } case "ipv6": { n = o().internet.ipv6(); break; } case "jwt": { const r = e._zod.def; n = o().internet.jwt({ header: { alg: r.alg || o().internet.jwtAlgorithm(), typ: "JWT" } }); break; } case "ksuid": { n = s(d.regexes.ksuid); break; } case "md5_base64": { n = s(d.regexes.md5_base64); break; } case "md5_base64url": { n = s(d.regexes.md5_base64url); break; } case "md5_hex": { n = s(d.regexes.md5_hex); break; } case "nanoid": { n = s(d.regexes.nanoid); break; } case "regex": { n = s(e._zod.def.pattern); break; } case "sha1_base64": { n = s(d.regexes.sha1_base64); break; } case "sha1_base64url": { n = s(d.regexes.sha1_base64url); break; } case "sha1_hex": { n = s(d.regexes.sha1_hex); break; } case "sha256_base64": { n = s(d.regexes.sha256_base64); break; } case "sha256_base64url": { n = s(d.regexes.sha256_base64url); break; } case "sha256_hex": { n = s(d.regexes.sha256_hex); break; } case "sha384_base64": { n = s(d.regexes.sha384_base64); break; } case "sha384_base64url": { n = s(d.regexes.sha384_base64url); break; } case "sha384_hex": { n = s(d.regexes.sha384_hex); break; } case "sha512_base64": { n = s(d.regexes.sha512_base64); break; } case "sha512_base64url": { n = s(d.regexes.sha512_base64url); break; } case "sha512_hex": { n = s(d.regexes.sha512_hex); break; } case "time": { const r = e._zod.def; n = s( d.regexes.time({ precision: r.precision }) ); break; } case "ulid": { n = s(d.regexes.ulid); break; } case "url": { const r = e._zod.def.protocol, i = e._zod.def.hostname; r && i ? n = s(r) + "://" + s(i) : r ? n = s(r) + "://" + o().internet.domainName() : i ? n = "https://" + s(i) : n = o().internet.url(); break; } case "uuid": { switch (e._zod.def.version) { case "v1": n = s(d.regexes.uuid(1)); break; case "v2": n = s(d.regexes.uuid(2)); break; case "v3": n = s(d.regexes.uuid(3)); break; case "v4": n = s(d.regexes.uuid(4)); break; case "v5": n = s(d.regexes.uuid(5)); break; case "v6": n = s(d.regexes.uuid(6)); break; case "v7": n = s(d.regexes.uuid(7)); break; case "v8": n = s(d.regexes.uuid(8)); break; default: n = s(d.regexes.uuid()); } break; } case "xid": { n = s(d.regexes.xid); break; } } return n; } function ye(e, t, n) { let a = o().lorem.sentence(), r, i, c = "", f = "", u = "", m = !1, z = !1; a = y(e) ?? a; for (const p of e._zod.def.checks ?? []) switch (p._zod.def.check) { case "length_equals": { r = p._zod.def.length, i = p._zod.def.length; break; } case "max_length": { i = Math.min(i ?? p._zod.def.maximum, p._zod.def.maximum); break; } case "min_length": { r = Math.max(r ?? p._zod.def.minimum, p._zod.def.minimum); break; } case "string_format": { a = y(p) ?? a; const x = p; switch (x._zod.def.format) { case "ends_with": { u = b(x._zod.def.pattern?.source ?? "").replace(/^\.\*/, "").replace(/\$$/, ""); break; } case "includes": { f = b(x._zod.def.pattern?.source ?? ""); break; } case "lowercase": { z = !0; break; } case "starts_with": { c = b(x._zod.def.pattern?.source ?? "").replace(/^\^/, "").replace(/\.\*$/, ""); break; } case "uppercase": { m = !0; break; } } break; } default: { p._zod.def.check; break; } } return i = i === 1 / 0 ? r : i, r !== void 0 && a.length < r && (a = a.padEnd(r, " ")), i !== void 0 && a.length > i && (a = a.slice(0, o().number.int({ min: r, max: i }))), m && (a = a.toUpperCase()), z && (a = a.toLowerCase()), c && !a.startsWith(c) && (a = c + a), f && !a.includes(f) && (a = a + f), u && !a.endsWith(u) && (a = a + u), a; } function ve(e, t, n) { return /* @__PURE__ */ Symbol(); } function we(e, t, n) { return e._zod.def.parts.map((a) => a instanceof d.$ZodType ? n(a, t) : a).map((a) => a + "").join(""); } function Te(e, t, n) { return e._zod.def.items.map((a) => n(a, t)).concat( e._zod.def.rest ? o().helpers.multiple(() => n(e._zod.def.rest, t), { count: { min: 0, max: 5 } }) : [] ); } function Me(e, t, n) { const a = e._zod.def.options.filter((r) => r._zod.def.type !== "never"); return a.length === 0 && a.push(e._zod.def.options[0]), n(o().helpers.arrayElement(a), t); } const l = ((e, t) => { switch (e._zod.def.type) { case "any": return void 0; case "array": return j(e, t, l); case "bigint": return N(e); case "boolean": return A(); case "catch": return I(e, t, l); case "custom": return C(e, t, l); case "date": return O(e); case "default": return D(e, t, l); case "enum": return L(e); case "function": return ee(e, t, l); case "file": return P(e); case "int": break; case "intersection": break; case "lazy": return te(e, t, l); case "literal": return ne(e); case "map": return ae(e, t, l); case "nan": return re(); case "never": return oe(); case "nonoptional": return ie(e, t, l); case "null": return se(); case "nullable": return ce(e, t, l); case "number": return de(e); case "object": return ue(e, t, l); case "optional": return le(e, t, l); case "pipe": return xe(e, t, l); case "prefault": return ge(e, t, l); case "promise": return be(e, t, l); case "readonly": return _e(e, t, l); case "record": return ke(e, t, l); case "set": return ze(e, t, l); case "string": return ye(e); case "success": break; case "symbol": return ve(); case "template_literal": return we(e, t, l); case "transform": break; case "tuple": return Te(e, t, l); case "undefined": return void 0; case "union": return Me(e, t, l); case "unknown": return void 0; case "void": return void 0; default: { e._zod.def.type; break; } } throw TypeError(); }); function Ae(e) { return l(e, { depth: 0 }); } export { Ne as custom, Ae as fake, o as getFaker, s as randexp, je as seed, Se as setFaker };