UNPKG

@abyrd9/zod-form-data

Version:

A Zod-based form data validation library

2 lines 7.33 kB
'use strict';var react=require('react'),v4=require('zod/v4');function A(i,d){let r={},o=(t,e,n,s)=>{let a=e[n],c=e[n+1];if(c===void 0)return Array.isArray(t)?(t.push(s),t):(t[a]=s,t);if(!Number.isNaN(Number(c)))if(Array.isArray(t))console.warn("ARRAY WITHIN ARRAY");else return t[a]||(t[a]=[]),o(t[a],e,n+1,s);else {if(Array.isArray(t)){let Z=t[Number(a)];return Z!==void 0?o(Z,e,n+1,s):(t[Number(a)]={},o(t[Number(a)],e,n+1,s))}if(!t[a])return t[a]={},o(t[a],e,n+1,s);if(t[a])return o(t[a],e,n+1,s)}};for(let[t,e]of Object.entries(i)){let n=t.split(".");d?t.startsWith(`${d}.`)&&o(r,n,0,e):o(r,n,0,e);}return d?r[d]:r}function b(i){let d={};function r(o,t=""){let e=o;if(e instanceof v4.z.ZodObject){let n=e.shape;for(let[s,a]of Object.entries(n)){let c=t?`${t}.${s}`:s;r(a,c);}return}if(e instanceof v4.z.ZodArray){let n=e.element;r(n,`${t}.0`);return}if(e instanceof v4.z.ZodDefault){let n=e.def.defaultValue;n!==void 0&&(d[t]=n);return}if(e instanceof v4.z.ZodOptional){r(e.def.innerType,t);return}console.warn("unhandled zod type",e);}return r(i),A(d)}function k(i,d){let r=new Map;function o(t,e,n=""){let s=t;if(s instanceof v4.z.ZodObject){if(typeof e=="object"&&e!==null)for(let[a,c]of Object.entries(s.shape)){let f=n?`${n}.${a}`:a;o(c,e[a],f);}else console.error("Expected object, got",e);return}if(s instanceof v4.z.ZodArray){Array.isArray(e)?e.forEach((a,c)=>{o(s.element,a,`${n}.${c}`);}):console.error("Expected array, got",e);return}if(s instanceof v4.z.ZodUnion||s instanceof v4.z.ZodDiscriminatedUnion){let a=s.options;for(let c of a)o(c,e,n);return}if(s instanceof v4.z.ZodLazy){let a=s.def.getter();o(a,e,n);return}if(s instanceof v4.z.ZodOptional){let a=s.def.innerType;o(a,e,n);return}if(s instanceof v4.z.ZodDefault){let a=s.def.innerType,c=s.def.defaultValue;o(a,e===void 0?c:e,n);return}if(s instanceof v4.z.ZodRecord){if(typeof e=="object"&&e!==null)for(let[a,c]of Object.entries(e))if(t instanceof v4.z.ZodRecord){let f=t.def.valueType,p=e[a],Z=`${n}.${a}`;o(f,p,Z);}else console.error("Expected record, got",e);return}r.set(n,e);}return o(i,d),Object.fromEntries(r)}function $(i){if(!i)return new Map;let d=new Map;function r(o,t=""){for(let[e,n]of Object.entries(o)){let s=t?`${t}.${e}`:e;typeof n=="string"?d.set(s,n):Array.isArray(n)?n.forEach((a,c)=>{typeof a=="string"?d.set(`${s}.${c}`,a):r(a,`${s}.${c}`);}):typeof n=="object"&&n!==null&&r(n,s);}}return r(i),d}v4.z.object({users:v4.z.array(v4.z.object({name:v4.z.string(),posts:v4.z.array(v4.z.object({title:v4.z.string()}))}))});var R=({schema:i,defaultValues:d,errors:r})=>{let[o,t]=react.useState(()=>{let f=b(i);return k(i,d??f??{})}),[e,n]=react.useState(()=>$(r)),s=react.useCallback(f=>{n($(f));},[]);react.useEffect(()=>{r&&s(r);},[r,s]);let a=react.useMemo(()=>{let f=(p,Z=[])=>{if(p instanceof v4.z.ZodType&&p instanceof v4.z.ZodObject){let y={};for(let[l,h]of Object.entries(p.shape))y[l]=f(h,[...Z,l]);return y}if(p instanceof v4.z.ZodArray){let y=Z.join(".");return A(o,y)?.map((h,S)=>f(p.element,[...Z,S.toString()]))??[]}let m=Z.join("."),F=o[m];return {name:m,value:F,onChange:y=>{t(l=>({...l,[m]:y}));},error:e.get(m)??null}};return f(i)},[i,o,e]),c=react.useCallback(f=>({add:p=>{t(Z=>{let m={...Z},y=Object.keys(m).filter(l=>l.startsWith(`${f}.`)).reduce((l,h)=>{let S=h.match(new RegExp(`^${f}\\.(\\d+)`));return S?Math.max(l,Number.parseInt(S[1],10)):l},-1)+1;if(typeof p=="object"&&p!==null)for(let[l,h]of Object.entries(p))m[`${f}.${y}.${l}`]=h;else m[`${f}.${y}`]=p;return m});},remove:p=>{t(Z=>{let m={...Z},F=`${f}.${p}`;for(let y of Object.keys(m))y.startsWith(F)&&delete m[y];for(let y of Object.keys(m)){let l=y.match(new RegExp(`^${f}\\.(\\d+)`));if(l){let h=Number.parseInt(l[1],10);if(h>p){let S=y.replace(new RegExp(`^${f}\\.${h}`),`${f}.${h-1}`);m[S]=m[y],delete m[y];}}}return m});}}),[]);return {fields:a,getFieldArrayHelpers:c,setFieldErrors:s}};var I=v4.z.string().regex(/^(true|false|on)$/,'Must be a boolean string ("true", "false", or "on")').transform(i=>i==="true"||i==="on"),O=v4.z.string().regex(/^-?\d+$/,"Must be an integer string").transform(i=>Number.parseInt(i,10)),v=v4.z.string().regex(/^-?\d*\.?\d+$/,"Must be a number string").transform(Number),M=v4.z.string().regex(/^\d{4}-\d{2}-\d{2}$/,"Must be a date string (YYYY-MM-DD)").transform(i=>new Date(i));function N(i){let d=i;switch(d.def.type){case "string":case "literal":case "enum":d=v4.z.any().overwrite(r=>v4.z.coerce.string().parse(r)).pipe(i);break;case "bigint":d=v4.z.any().overwrite(r=>O.parse(r)).pipe(i);break;case "number":d=v4.z.any().overwrite(r=>{let o=v4.z.coerce.number().safeParse(r);return o.success?o.data:v.parse(r)}).pipe(i);break;case "boolean":d=v4.z.any().overwrite(r=>I.parse(r)).pipe(i);break;case "date":d=v4.z.any().overwrite(r=>M.parse(r)).pipe(i);break;case "array":d=v4.z.preprocess(r=>Array.isArray(r)?r:r===void 0?[]:[r],i);break;case "nullable":case "optional":d=v4.z.preprocess(r=>r===""?null:r,i);break;case "file":d=v4.z.any().overwrite(r=>r instanceof File?r:new File([r],r.name)).pipe(i);break;default:console.error(`Zod type not handled in coerceFormData: ${d.def.type}`);break}return d}function j(i){let d=new Map;function r(o,t=""){let e=o;if(e instanceof v4.z.ZodObject){for(let[n,s]of Object.entries(e.shape)){let a=t?`${t}.${n}`:n;r(s,a);}return}if(e instanceof v4.z.ZodArray){r(e.element,`${t}.#`);return}if(e instanceof v4.z.ZodUnion||e instanceof v4.z.ZodDiscriminatedUnion){for(let n of e.options)r(n,t);return}if(e instanceof v4.z.ZodLazy){let n=e.def.getter();r(n,t);return}if(e instanceof v4.z.ZodOptional){r(e.def.innerType,t);return}if(e instanceof v4.z.ZodDefault){r(e.def.innerType,t);return}if(e instanceof v4.z.ZodRecord){r(e.def.valueType,`${t}.*`);return}d.set(t,o);}return r(i),v4.z.object(Object.fromEntries(d))}function Y(i,d){let r=i.split("."),o=d.split(".");return r.length!==o.length?false:r.every((t,e)=>t==="*"||t===o[e])}var U=(i,{schema:d})=>{let r={},o={},t=j(d);for(let[e,n]of i.entries()){let s=e.replace(/(\d+)/g,"#"),a=t.shape[s]||Object.entries(t.shape).find(([c])=>c.includes("*")&&Y(c,s))?.[1];if(a)try{if(a instanceof v4.z.ZodNumber){let c=Number(n);console.log("NUM",c),isNaN(c)?(o[e]="Expected number, received string",r[e]=n):r[e]=c;}else {let c=N(a).parse(n);r[e]=c;}}catch(c){if(c instanceof v4.ZodError)for(let f of c.issues){let p=f.path.join(".");p&&(o[p]=f.message);}else o[e]="An unexpected error occurred during coercion";r[e]=n;}else r[e]=n;}try{let e=A(r),n=d.safeParse(e);if(n.success)return {success:!0,data:n.data};{let s={};for(let c of n.error.issues){let f=c.path.join(".");f&&(s[f]=c.message);}return {success:!1,errors:{...o,...s}}}}catch(e){if(e instanceof v4.ZodError)for(let n of e.issues){let s=n.path.join(".");o[s]||(o[s]=n.message);}}return Object.keys(o).length>0?{success:false,errors:o}:{success:false,errors:{}}},H=(i,{schema:d})=>{try{let r=d.safeParse(i);if(!r.success){let o={};for(let t of r.error.issues){let e=t.path.join(".");o[e]=t.message;}return {success:!1,errors:o}}return {success:!0,data:r.data}}catch(r){if(r instanceof v4.ZodError){let o={};for(let t of r.issues){let e=t.path.join(".");o[e]=t.message;}return {success:false,errors:o}}return {success:false,errors:{}}}};exports.parseZodData=H;exports.parseZodFormData=U;exports.useZodForm=R;//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map