@abyrd9/zod-form-data
Version:
A Zod-based form data validation library
1 lines • 48.6 kB
Source Map (JSON)
{"version":3,"sources":["../src/unflatten-zod-form-data.ts","../src/extract-zod-defaults.ts","../src/flatten-zod-form-data.ts","../src/flatten-zod-form-errors.ts","../src/index.ts","../src/coerce-form-data.ts","../src/flatten-zod-form-schema.ts","../src/parse-zod-form-data.ts"],"names":["unflattenZodFormData","data","root","result","nest","keys","level","value","key","nextKey","valueAtIndex","extractZodDefaults","schema","defaults","extract","subSchema","prefix","currentSubSchema","z","shape","newPrefix","element","defaultValue","flattenZodFormData","flattenedDataMap","flatten","subValue","item","index","options","option","lazyValue","inner","newSubSchema","newSubValue","flattenZodFormErrors","errors","flattenedErrorsMap","subErrors","useZodForm","defaultValues","passedInErrors","flattenedData","setFlattenedData","useState","zodDefaults","internalErrors","setInternalErrors","setFieldErrors","useCallback","newErrors","useEffect","fields","useMemo","getFieldProps","field","path","objectFields","subField","arrayPath","_","fieldPath","payload","prev","getFieldArrayHelpers","newData","newIndex","max","match","val","currentIndex","newKey","BoolAsString","IntAsString","NumAsString","DateAsString","coerceFormData","type","coerced","flattenZodFormSchema","flattenedSchemaMap","matchWildcardString","pattern","patternParts","testParts","part","parseZodFormData","form","flattenedZodSchema","formDataValue","keyWithHash","matchingSchema","k","num","coercedValue","error","ZodError","zodError","unflattenedData","validatedData","validationErrors","parseZodData"],"mappings":"2FAIO,SAASA,CACdC,CAAAA,CAAAA,CACAC,CACyB,CAAA,CACzB,IAAMC,CAAAA,CAAkC,EAAC,CAEnCC,CAAO,CAAA,CACXH,EACAI,CACAC,CAAAA,CAAAA,CACAC,CACG,GAAA,CACH,IAAMC,CAAAA,CAAMH,CAAKC,CAAAA,CAAK,CAChBG,CAAAA,CAAAA,CAAUJ,CAAKC,CAAAA,CAAAA,CAAQ,CAAC,CAAA,CAO9B,GADkBG,CAAAA,GAAY,MAE5B,CAAA,OAAI,KAAM,CAAA,OAAA,CAAQR,CAAI,CAAA,EACpBA,CAAK,CAAA,IAAA,CAAKM,CAAK,CAAA,CACRN,CAGTA,GAAAA,CAAAA,CAAKO,CAAG,CAAA,CAAID,EACLN,CAKT,CAAA,CAAA,GADmB,CAAC,MAAA,CAAO,KAAM,CAAA,MAAA,CAAOQ,CAAO,CAAC,CAE9C,CAAA,GAAI,KAAM,CAAA,OAAA,CAAQR,CAAI,CAAA,CAEpB,QAAQ,IAAK,CAAA,oBAAoB,CAKjC,CAAA,KAAA,OAAIA,CAAKO,CAAAA,CAAG,CAKZP,GAAAA,CAAAA,CAAKO,CAAG,CAAA,CAAI,EAAC,CAAA,CACNJ,CAAKH,CAAAA,CAAAA,CAAKO,CAAG,CAAgBH,CAAAA,CAAAA,CAAMC,CAAQ,CAAA,CAAA,CAAGC,CAAK,CAAA,CAAA,KAEvD,CAEL,GAAI,KAAM,CAAA,OAAA,CAAQN,CAAI,CAAA,CAAG,CAOvB,IAAMS,CAAeT,CAAAA,CAAAA,CAAK,MAAOO,CAAAA,CAAG,CAAC,CAAA,CAGrC,OAAIE,CAAAA,GAAiB,MACZN,CAAAA,CAAAA,CACLM,CACAL,CAAAA,CAAAA,CACAC,CAAQ,CAAA,CAAA,CACRC,CACF,CAAA,EAIFN,EAAK,MAAOO,CAAAA,CAAG,CAAC,CAAA,CAAI,EAAC,CACdJ,CACLH,CAAAA,CAAAA,CAAK,MAAOO,CAAAA,CAAG,CAAC,CAAA,CAChBH,CACAC,CAAAA,CAAAA,CAAQ,EACRC,CACF,CAAA,CACF,CAQA,GAAI,CAACN,CAAAA,CAAKO,CAAG,CAAA,CACX,OAAAP,CAAAA,CAAKO,CAAG,CAAA,CAAI,EAAC,CACNJ,EACLH,CAAKO,CAAAA,CAAG,CACRH,CAAAA,CAAAA,CACAC,CAAQ,CAAA,CAAA,CACRC,CACF,CAAA,CAGF,GAAIN,CAAAA,CAAKO,CAAG,CAAA,CACV,OAAOJ,CAAAA,CACLH,CAAKO,CAAAA,CAAG,CACRH,CAAAA,CAAAA,CACAC,CAAQ,CAAA,CAAA,CACRC,CACF,CAEJ,CACF,CAAA,CAEA,IAAW,GAAA,CAACC,CAAKD,CAAAA,CAAK,CAAK,GAAA,MAAA,CAAO,QAAQN,CAAI,CAAA,CAAG,CAC/C,IAAMI,CAAOG,CAAAA,CAAAA,CAAI,KAAM,CAAA,GAAG,CAGtBN,CAAAA,CAAAA,CACEM,CAAI,CAAA,UAAA,CAAW,CAAGN,EAAAA,CAAI,CAAG,CAAA,CAAA,CAAA,EAC3BE,CAAKD,CAAAA,CAAAA,CAAQE,CAAM,CAAA,CAAA,CAAGE,CAAK,CAAA,CAI7BH,CAAKD,CAAAA,CAAAA,CAAQE,CAAM,CAAA,CAAA,CAAGE,CAAK,EAE/B,CAEA,OAAOL,EACFC,CAAOD,CAAAA,CAAI,CACXC,CAAAA,CACP,CCvHO,SAASQ,CACdC,CAAAA,CAAAA,CACyB,CACzB,IAAMC,CAAoC,CAAA,EAE1C,CAAA,SAASC,CAAQC,CAAAA,CAAAA,CAAqBC,CAAS,CAAA,EAAA,CAAU,CACvD,IAAMC,CAAmBF,CAAAA,CAAAA,CAEzB,GAAIE,CAAAA,YAA4BC,CAAE,CAAA,SAAA,CAAW,CAC3C,IAAMC,CAAQF,CAAAA,CAAAA,CAAiB,MAC/B,IAAW,GAAA,CAACT,CAAKD,CAAAA,CAAK,CAAK,GAAA,MAAA,CAAO,OAAQY,CAAAA,CAAK,CAAG,CAAA,CAC9C,IAAMC,CAAAA,CAAYJ,CAAS,CAAA,CAAA,EAAGA,CAAM,CAAIR,CAAAA,EAAAA,CAAG,CAAKA,CAAAA,CAAAA,CAAAA,CAChDM,CAAQP,CAAAA,CAAAA,CAAoBa,CAAS,EACvC,CAEA,MACJ,CAEA,GAAIH,CAA4BC,YAAAA,CAAAA,CAAE,SAAU,CAC1C,IAAMG,CAAUJ,CAAAA,CAAAA,CAAiB,OACjCH,CAAAA,CAAAA,CAAQO,CAAS,CAAA,CAAA,EAAGL,CAAM,CAAA,EAAA,CAAI,CAC9B,CAAA,MACF,CAEA,GAAIC,CAA4BC,YAAAA,CAAAA,CAAE,UAAY,CAAA,CAC5C,IAAMI,CAAAA,CAAeL,CAAiB,CAAA,GAAA,CAAI,YACtCK,CAAAA,CAAAA,GAAiB,MACnBT,GAAAA,CAAAA,CAASG,CAAM,CAAA,CAAIM,CAErB,CAAA,CAAA,MACF,CAEA,GAAIL,CAAAA,YAA4BC,CAAE,CAAA,WAAA,CAAa,CAC7CJ,CAAAA,CAAQG,CAAiB,CAAA,GAAA,CAAI,SAAWD,CAAAA,CAAM,CAC9C,CAAA,MACF,CAEA,OAAA,CAAQ,KAAK,oBAAsBC,CAAAA,CAAgB,EACrD,CAEA,OAAAH,CAAAA,CAAQF,CAAM,CAAA,CACPZ,CAAwBa,CAAAA,CAAQ,CACzC,CC7CO,SAASU,CACdX,CAAAA,CAAAA,CACAX,CACA,CAAA,CACA,IAAMuB,CAAAA,CAAmB,IAAI,GAAA,CAE7B,SAASC,CAAAA,CAAQV,CAAqBW,CAAAA,CAAAA,CAAmBV,CAAS,CAAA,EAAA,CAAU,CAC1E,IAAIC,CAAmBF,CAAAA,CAAAA,CAEvB,GAAIE,CAAAA,YAA4BC,CAAE,CAAA,SAAA,CAAW,CAC3C,GAAI,OAAOQ,CAAAA,EAAa,QAAYA,EAAAA,CAAAA,GAAa,KAC/C,IAAW,GAAA,CAAClB,CAAKD,CAAAA,CAAK,CAAK,GAAA,MAAA,CAAO,OAAQU,CAAAA,CAAAA,CAAiB,KAAK,CAAA,CAAG,CACjE,IAAMG,CAAYJ,CAAAA,CAAAA,CAAS,GAAGA,CAAM,CAAA,CAAA,EAAIR,CAAG,CAAA,CAAA,CAAKA,CAChDiB,CAAAA,CAAAA,CACElB,CACCmB,CAAAA,CAAAA,CAAqClB,CAAG,CAAA,CACzCY,CACF,EACF,CAEA,KAAA,OAAA,CAAQ,MAAM,sBAAwBM,CAAAA,CAAQ,CAEhD,CAAA,MACF,CAEA,GAAIT,CAA4BC,YAAAA,CAAAA,CAAE,QAAU,CAAA,CACtC,KAAM,CAAA,OAAA,CAAQQ,CAAQ,CAAA,CACxBA,CAAS,CAAA,OAAA,CAAQ,CAACC,CAAAA,CAAMC,CAAU,GAAA,CAChCH,CACGR,CAAAA,CAAAA,CAA2C,OAC5CU,CAAAA,CAAAA,CACA,CAAGX,EAAAA,CAAM,CAAIY,CAAAA,EAAAA,CAAK,CACpB,CAAA,EACF,CAAC,CAED,CAAA,OAAA,CAAQ,KAAM,CAAA,qBAAA,CAAuBF,CAAQ,CAAA,CAE/C,MACF,CAEA,GACET,CAAAA,YAA4BC,CAAE,CAAA,QAAA,EAC9BD,CAA4BC,YAAAA,CAAAA,CAAE,qBAC9B,CAAA,CACA,IAAMW,CAAAA,CAAUZ,CAAiB,CAAA,OAAA,CACjC,IAAWa,IAAAA,CAAAA,IAAUD,CACnBJ,CAAAA,CAAAA,CAAQK,CAAqBJ,CAAAA,CAAAA,CAAUV,CAAM,CAAA,CAE/C,MACF,CAEA,GAAIC,CAA4BC,YAAAA,CAAAA,CAAE,OAAS,CAAA,CACzC,IAAMa,CAAAA,CAAYd,CAAiB,CAAA,GAAA,CAAI,MAAO,EAAA,CAC9CQ,CAAQM,CAAAA,CAAAA,CAAWL,CAAUV,CAAAA,CAAM,CACnC,CAAA,MACF,CAEA,GAAIC,CAA4BC,YAAAA,CAAAA,CAAE,WAAa,CAAA,CAC7C,IAAMc,CAAAA,CAAQf,CAAiB,CAAA,GAAA,CAAI,SACnCQ,CAAAA,CAAAA,CAAQO,CAAON,CAAAA,CAAAA,CAAUV,CAAM,CAC/B,CAAA,MACF,CAEA,GAAIC,CAA4BC,YAAAA,CAAAA,CAAE,UAAY,CAAA,CAC5C,IAAMc,CAAAA,CAAQf,CAAiB,CAAA,GAAA,CAAI,SAC7BK,CAAAA,CAAAA,CAAeL,EAAiB,GAAI,CAAA,YAAA,CAE1CQ,CAAQO,CAAAA,CAAAA,CADiBN,CAAa,GAAA,MAAA,CAAYJ,CAAeI,CAAAA,CAAAA,CAChCV,CAAM,CAAA,CACvC,MACF,CAEA,GAAIC,CAAAA,YAA4BC,EAAE,SAAW,CAAA,CAC3C,GAAI,OAAOQ,CAAa,EAAA,QAAA,EAAYA,CAAa,GAAA,IAAA,CAC/C,IAAW,GAAA,CAAClB,CAAKD,CAAAA,CAAK,CAAK,GAAA,MAAA,CAAO,OAChCmB,CAAAA,CACF,CACE,CAAA,GAAIX,CAAqBG,YAAAA,CAAAA,CAAE,SAAW,CAAA,CACpC,IAAMe,CAAAA,CAAelB,CAAU,CAAA,GAAA,CAAI,SAC7BmB,CAAAA,CAAAA,CAAeR,CAAqClB,CAAAA,CAAG,EACvDY,CAAY,CAAA,CAAA,EAAGJ,CAAM,CAAA,CAAA,EAAIR,CAAG,CAAA,CAAA,CAElCiB,CAAQQ,CAAAA,CAAAA,CAAcC,CAAad,CAAAA,CAAS,EAC9C,CAAA,KACE,OAAQ,CAAA,KAAA,CAAM,uBAAwBM,CAAQ,CAAA,CAKpD,MACF,CAEAF,CAAiB,CAAA,GAAA,CAAIR,CAAQU,CAAAA,CAAQ,EACvC,CAEA,OAAAD,CAAAA,CAAQb,CAAQX,CAAAA,CAAI,EACb,MAAO,CAAA,WAAA,CAAYuB,CAAgB,CAC5C,CCjGO,SAASW,CACdC,CAAAA,CAAAA,CACA,CACA,GAAI,CAACA,CAAAA,CAAQ,OAAO,IAAI,GAExB,CAAA,IAAMC,CAAqB,CAAA,IAAI,GAG/B,CAAA,SAASZ,CAAQa,CAAAA,CAAAA,CAAoCtB,CAAS,CAAA,EAAA,CAAI,CAChE,IAAA,GAAW,CAACR,CAAAA,CAAKD,CAAK,CAAA,GAAK,OAAO,OAAQ+B,CAAAA,CAAS,CAAG,CAAA,CACpD,IAAMlB,CAAAA,CAAYJ,CAAS,CAAA,CAAA,EAAGA,CAAM,CAAA,CAAA,EAAIR,CAAG,CAAA,CAAA,CAAKA,CAC5C,CAAA,OAAOD,GAAU,QACnB8B,CAAAA,CAAAA,CAAmB,GAAIjB,CAAAA,CAAAA,CAAWb,CAAK,CAAA,CAC9B,KAAM,CAAA,OAAA,CAAQA,CAAK,CAAA,CAC5BA,CAAM,CAAA,OAAA,CAAQ,CAACoB,CAAAA,CAAMC,IAAU,CACzB,OAAOD,CAAS,EAAA,QAAA,CAClBU,CAAmB,CAAA,GAAA,CAAI,CAAGjB,EAAAA,CAAS,CAAIQ,CAAAA,EAAAA,CAAK,CAAID,CAAAA,CAAAA,CAAI,CAEpDF,CAAAA,CAAAA,CAAQE,CAAiC,CAAA,CAAA,EAAGP,CAAS,CAAA,CAAA,EAAIQ,CAAK,CAAA,CAAE,EAEpE,CAAC,CACQ,CAAA,OAAOrB,CAAU,EAAA,QAAA,EAAYA,CAAU,GAAA,IAAA,EAChDkB,CAAQlB,CAAAA,CAAAA,CAAkCa,CAAS,EAEvD,CACF,CAEA,OAAAK,CAAQW,CAAAA,CAA4C,CAE7CC,CAAAA,CACT,CCyEmBnB,CAAAA,CAAE,MAAO,CAAA,CACtB,KAAOA,CAAAA,CAAAA,CAAE,KAAMA,CAAAA,CAAAA,CAAE,MAAO,CAAA,CACtB,IAAMA,CAAAA,CAAAA,CAAE,MAAO,EAAA,CACf,KAAOA,CAAAA,CAAAA,CAAE,KAAMA,CAAAA,CAAAA,CAAE,MAAO,CAAA,CAAE,MAAOA,CAAE,CAAA,MAAA,EAAS,CAAC,CAAC,CAChD,CAAC,CAAC,CACJ,CAAC,CAOQqB,KAAAA,CAAAA,CAAa,CAA+B,CACvD,MAAA3B,CAAAA,CAAAA,CACA,aAAA4B,CAAAA,CAAAA,CACA,MAAQC,CAAAA,CACV,CAIM,GAAA,CACJ,GAAM,CAACC,CAAeC,CAAAA,CAAgB,CAAIC,CAAAA,QAAAA,CAAS,IAAM,CACvD,IAAMC,CAAclC,CAAAA,CAAAA,CAAmBC,CAAM,CAAA,CAE7C,OAAOW,CAAAA,CAAmBX,CADV4B,CAAAA,CAAAA,EAAiBK,CAAe,EAAA,EACP,CAC3C,CAAC,CAAA,CAEK,CAACC,CAAgBC,CAAAA,CAAiB,CAAIH,CAAAA,QAAAA,CAC1C,IAAMT,CAAAA,CAAqBM,CAAc,CAC3C,CAEMO,CAAAA,CAAAA,CAAiBC,WACpBC,CAAAA,CAAAA,EAAsD,CACrDH,CAAAA,CAAkBZ,EAAqBe,CAAS,CAAC,EACnD,CAAA,CACA,EACF,CAIAC,CAAAA,SAAAA,CAAU,IAAM,CACVV,CAAgBO,EAAAA,CAAAA,CAAeP,CAAc,EACnD,CAAG,CAAA,CAACA,CAAgBO,CAAAA,CAAc,CAAC,CAAA,CAEnC,IAAMI,CAAAA,CAASC,OAAQ,CAAA,IAA4B,CACjD,IAAMC,CAAgB,CAAA,CACpBC,CACAC,CAAAA,CAAAA,CAAiB,EACG,GAAA,CACpB,GAAID,CAAAA,YAAiBrC,CAAE,CAAA,OAAA,EACjBqC,CAAiBrC,YAAAA,CAAAA,CAAE,SAAW,CAAA,CAChC,IAAMuC,CAAAA,CAAwC,EAAC,CAC/C,IAAW,GAAA,CAACjD,CAAKkD,CAAAA,CAAQ,CAAK,GAAA,MAAA,CAAO,OAAQH,CAAAA,CAAAA,CAAM,KAAK,CAAA,CACtDE,CAAajD,CAAAA,CAAG,CAAI8C,CAAAA,CAAAA,CAAcI,CAA0B,CAAA,CAC1D,GAAGF,CACHhD,CAAAA,CACF,CAAC,CAAA,CAGH,OAAOiD,CACT,CAIF,GAAIF,CAAiBrC,YAAAA,CAAAA,CAAE,QAAU,CAAA,CAC/B,IAAMyC,CAAAA,CAAYH,CAAK,CAAA,IAAA,CAAK,GAAG,CAAA,CAO/B,OALexD,CAAAA,CACb0C,CACAiB,CAAAA,CACF,CAGW,EAAA,GAAA,CAAI,CAACC,CAAAA,CAAYhC,CACxB0B,GAAAA,CAAAA,CACGC,CAA8C,CAAA,OAAA,CAC/C,CAAC,GAAGC,CAAAA,CAAM5B,CAAM,CAAA,QAAA,EAAU,CAC5B,CACF,CAAA,EAAyB,EAE7B,CAEA,IAAMiC,CAAYL,CAAAA,CAAAA,CAAK,KAAK,GAAG,CAAA,CACzBjD,CAAQmC,CAAAA,CAAAA,CAAcmB,CAAS,CAAA,CAErC,OAAO,CACL,IAAMA,CAAAA,CAAAA,CACN,KAAAtD,CAAAA,CAAAA,CACA,QAAWuD,CAAAA,CAAAA,EAAwB,CACjCnB,CAAkBoB,CAAAA,CAAAA,GAAU,CAAE,GAAGA,CAAM,CAAA,CAACF,CAAS,EAAGC,CAAQ,CAAA,CAAE,EAChE,CAAA,CACA,KAAOhB,CAAAA,CAAAA,CAAe,GAAIe,CAAAA,CAAS,CAAK,EAAA,IAC1C,CACF,CAAA,CAEA,OAAOP,CAAAA,CAAc1C,CAAM,CAC7B,CAAG,CAAA,CAACA,CAAQ8B,CAAAA,CAAAA,CAAeI,CAAc,CAAC,EAEpCkB,CAAuBf,CAAAA,WAAAA,CACIO,CACtB,GAAA,CACL,GAAMjD,CAAAA,CAAAA,EAAuC,CAC3CoC,CAAAA,CAAkBoB,CAAS,EAAA,CACzB,IAAME,CAAAA,CAAU,CAAE,GAAGF,CAAK,CAAA,CAUpBG,CATe,CAAA,MAAA,CAAO,IAAKD,CAAAA,CAAO,CACrC,CAAA,MAAA,CAAQzD,CAAQA,EAAAA,CAAAA,CAAI,UAAW,CAAA,CAAA,EAAGgD,CAAI,CAAA,CAAA,CAAG,CAAC,CAAA,CAC1C,OAAO,CAACW,CAAAA,CAAK3D,CAAQ,GAAA,CACpB,IAAM4D,CAAAA,CAAQ5D,CAAI,CAAA,KAAA,CAAM,IAAI,MAAA,CAAO,CAAIgD,CAAAA,EAAAA,CAAI,CAAW,SAAA,CAAA,CAAC,CACvD,CAAA,OAAOY,CACH,CAAA,IAAA,CAAK,GAAID,CAAAA,CAAAA,CAAK,MAAO,CAAA,QAAA,CAASC,CAAM,CAAA,CAAC,CAAG,CAAA,EAAE,CAAC,CAAA,CAC3CD,CACN,CAAA,CAAG,EAAE,CAEyB,CAAA,CAAA,CAEhC,GAAI,OAAO5D,CAAU,EAAA,QAAA,EAAYA,CAAU,GAAA,IAAA,CACzC,IAAW,GAAA,CAACC,CAAK6D,CAAAA,CAAG,CAAK,GAAA,MAAA,CAAO,QAAQ9D,CAAK,CAAA,CAC3C0D,CAAQ,CAAA,CAAA,EAAGT,CAAI,CAAA,CAAA,EAAIU,CAAQ,CAAA,CAAA,EAAI1D,CAAG,CAAA,CAAE,CAAI6D,CAAAA,CAAAA,CAAAA,KAG1CJ,CAAQ,CAAA,CAAA,EAAGT,CAAI,CAAIU,CAAAA,EAAAA,CAAQ,CAAE,CAAA,CAAA,CAAI3D,CAGnC,CAAA,OAAO0D,CACT,CAAC,EACH,CAAA,CACA,MAASrC,CAAAA,CAAAA,EAAkB,CACzBe,CAAAA,CAAkBoB,CAAS,EAAA,CACzB,IAAME,CAAAA,CAAU,CAAE,GAAGF,CAAK,CAAA,CACpB/C,CAAS,CAAA,CAAA,EAAGwC,CAAI,CAAA,CAAA,EAAI5B,CAAK,CAAA,CAAA,CAG/B,IAAWpB,IAAAA,CAAAA,IAAO,OAAO,IAAKyD,CAAAA,CAAO,CAC/BzD,CAAAA,CAAAA,CAAI,UAAWQ,CAAAA,CAAM,CACvB,EAAA,OAAOiD,CAAQzD,CAAAA,CAAG,CAKtB,CAAA,IAAA,IAAWA,CAAO,IAAA,MAAA,CAAO,KAAKyD,CAAO,CAAA,CAAG,CACtC,IAAMG,CAAQ5D,CAAAA,CAAAA,CAAI,KAAM,CAAA,IAAI,MAAO,CAAA,CAAA,CAAA,EAAIgD,CAAI,CAAA,SAAA,CAAW,CAAC,CAAA,CACvD,GAAIY,CAAO,CAAA,CACT,IAAME,CAAAA,CAAe,MAAO,CAAA,QAAA,CAASF,CAAM,CAAA,CAAC,CAAG,CAAA,EAAE,CACjD,CAAA,GAAIE,CAAe1C,CAAAA,CAAAA,CAAO,CACxB,IAAM2C,CAAS/D,CAAAA,CAAAA,CAAI,OACjB,CAAA,IAAI,MAAO,CAAA,CAAA,CAAA,EAAIgD,CAAI,CAAA,GAAA,EAAMc,CAAY,CAAA,CAAE,CACvC,CAAA,CAAA,EAAGd,CAAI,CAAA,CAAA,EAAIc,EAAe,CAAC,CAAA,CAC7B,CACAL,CAAAA,CAAAA,CAAQM,CAAM,CAAA,CAAIN,CAAQzD,CAAAA,CAAG,CAC7B,CAAA,OAAOyD,CAAQzD,CAAAA,CAAG,EACpB,CACF,CACF,CAEA,OAAOyD,CACT,CAAC,EACH,CACF,CAEF,CAAA,CAAA,EACF,CAAA,CAEA,OAAO,CACL,MAAAb,CAAAA,CAAAA,CACA,qBAAAY,CACA,CAAA,cAAA,CAAAhB,CACF,CAUF,ECtRA,IAAMwB,CAAetD,CAAAA,CAAAA,CAClB,MAAO,EAAA,CACP,KACC,CAAA,mBAAA,CACA,qDACF,CAAA,CACC,SAAWX,CAAAA,CAAAA,EAAUA,CAAU,GAAA,MAAA,EAAUA,CAAU,GAAA,IAAI,EAEpDkE,CAAcvD,CAAAA,CAAAA,CACjB,MAAO,EAAA,CACP,KAAM,CAAA,SAAA,CAAW,2BAA2B,CAAA,CAC5C,SAAWmD,CAAAA,CAAAA,EAAQ,MAAO,CAAA,QAAA,CAASA,CAAK,CAAA,EAAE,CAAC,CAAA,CAExCK,CAAcxD,CAAAA,CAAAA,CACjB,MAAO,EAAA,CACP,KAAM,CAAA,eAAA,CAAiB,yBAAyB,CAAA,CAChD,SAAU,CAAA,MAAM,CAEbyD,CAAAA,CAAAA,CAAezD,CAClB,CAAA,MAAA,GACA,KAAM,CAAA,qBAAA,CAAuB,oCAAoC,CAAA,CACjE,SAAWmD,CAAAA,CAAAA,EAAQ,IAAI,IAAA,CAAKA,CAAG,CAAC,CAE5B,CAAA,SAASO,CACdC,CAAAA,CAAAA,CAC6B,CAC7B,IAAIjE,CAAoBiE,CAAAA,CAAAA,CACxB,OAAQjE,CAAAA,CAAO,GAAI,CAAA,IAAA,EACjB,KAAK,QACL,CAAA,KAAK,SACL,CAAA,KAAK,MACHA,CAAAA,CAAAA,CAASM,EAAE,GAAI,EAAA,CACZ,SAAWX,CAAAA,CAAAA,EAAUW,CAAE,CAAA,MAAA,CAAO,MAAO,EAAA,CAAE,KAAMX,CAAAA,CAAK,CAAC,CAAA,CACnD,IAAKsE,CAAAA,CAAI,EACZ,MACF,KAAK,QACHjE,CAAAA,CAAAA,CAASM,CAAE,CAAA,GAAA,EACR,CAAA,SAAA,CAAWX,CAAUkE,EAAAA,CAAAA,CAAY,KAAMlE,CAAAA,CAAK,CAAC,CAAA,CAC7C,KAAKsE,CAAI,CAAA,CACZ,MACF,KAAK,QACHjE,CAAAA,CAAAA,CAASM,CAAE,CAAA,GAAA,EACR,CAAA,SAAA,CAAWX,CAAU,EAAA,CAEpB,IAAMuE,CAAAA,CAAU5D,CAAE,CAAA,MAAA,CAAO,MAAO,EAAA,CAAE,SAAUX,CAAAA,CAAK,CACjD,CAAA,OAAIuE,CAAQ,CAAA,OAAA,CAAgBA,CAAQ,CAAA,IAAA,CAG7BJ,CAAY,CAAA,KAAA,CAAMnE,CAAK,CAChC,CAAC,CACA,CAAA,IAAA,CAAKsE,CAAI,CAAA,CACZ,MACF,KAAK,SACHjE,CAAAA,CAAAA,CAASM,CAAE,CAAA,GAAA,EACR,CAAA,SAAA,CAAWX,CAAUiE,EAAAA,CAAAA,CAAa,KAAMjE,CAAAA,CAAK,CAAC,CAAA,CAC9C,IAAKsE,CAAAA,CAAI,CACZ,CAAA,MACF,KAAK,MAAA,CACHjE,CAASM,CAAAA,CAAAA,CAAE,GAAI,EAAA,CACZ,SAAWX,CAAAA,CAAAA,EAAUoE,EAAa,KAAMpE,CAAAA,CAAK,CAAC,CAAA,CAC9C,IAAKsE,CAAAA,CAAI,CACZ,CAAA,MACF,KAAK,OAAA,CACHjE,CAASM,CAAAA,CAAAA,CAAE,UACRmD,CAAAA,CAAAA,EAAS,KAAM,CAAA,OAAA,CAAQA,CAAG,CAAA,CAAIA,CAAMA,CAAAA,CAAAA,GAAQ,MAAY,CAAA,EAAK,CAAA,CAACA,CAAG,CAAA,CAClEQ,CACF,CAAA,CACA,MACF,KAAK,WACL,KAAK,UAAA,CACHjE,CAASM,CAAAA,CAAAA,CAAE,UAAYmD,CAAAA,CAAAA,EAASA,CAAQ,GAAA,EAAA,CAAK,IAAOA,CAAAA,CAAAA,CAAMQ,CAAI,CAAA,CAC9D,MACF,KAAK,OACHjE,CAASM,CAAAA,CAAAA,CAAE,GAAI,EAAA,CACZ,SAAWX,CAAAA,CAAAA,EAAUA,CAAiB,YAAA,IAAA,CAAOA,CAAQ,CAAA,IAAI,IAAK,CAAA,CAACA,CAAK,CAAA,CAAGA,EAAM,IAAI,CAAC,CAClF,CAAA,IAAA,CAAKsE,CAAI,CAAA,CACZ,MACF,QACE,OAAQ,CAAA,KAAA,CAAM,CAA2CjE,wCAAAA,EAAAA,CAAAA,CAAO,GAAI,CAAA,IAAI,CAAE,CAAA,CAAA,CAC1E,KACJ,CAEA,OAAOA,CACT,CCnFO,SAASmE,CAAAA,CACdnE,CAC4B,CAAA,CAC5B,IAAMoE,CAAAA,CAAqB,IAAI,GAE/B,CAAA,SAASvD,CAAQV,CAAAA,CAAAA,CAAqBC,CAAS,CAAA,EAAA,CAAI,CACjD,IAAIC,CAAmBF,CAAAA,CAAAA,CAGvB,GAAIE,CAAAA,YAA4B,CAAE,CAAA,SAAA,CAAW,CAC3C,IAAA,GAAW,CAACT,CAAAA,CAAKD,CAAK,CAAA,GAAK,MAAO,CAAA,OAAA,CAAQU,CAAiB,CAAA,KAAK,CAAG,CAAA,CACjE,IAAMG,CAAAA,CAAYJ,CAAS,CAAA,CAAA,EAAGA,CAAM,CAAIR,CAAAA,EAAAA,CAAG,CAAKA,CAAAA,CAAAA,CAAAA,CAChDiB,CAAQlB,CAAAA,CAAAA,CAAoBa,CAAS,EACvC,CACA,MACF,CAEA,GAAIH,CAA4B,YAAA,CAAA,CAAE,QAAU,CAAA,CAC1CQ,CAAQR,CAAAA,CAAAA,CAAiB,OAAS,CAAA,CAAA,EAAGD,CAAM,CAAA,EAAA,CAAI,CAC/C,CAAA,MACF,CAEA,GAAIC,CAA4B,YAAA,CAAA,CAAE,QAAYA,EAAAA,CAAAA,YAA4B,EAAE,qBAAuB,CAAA,CACjG,IAAWa,IAAAA,CAAAA,IAAUb,CAAiB,CAAA,OAAA,CACpCQ,CAAQK,CAAAA,CAAAA,CAAqBd,CAAM,CAAA,CAErC,MACF,CAEA,GAAIC,CAAAA,YAA4B,EAAE,OAAS,CAAA,CACzC,IAAMc,CAAAA,CAAYd,CAAiB,CAAA,GAAA,CAAI,MAAO,EAAA,CAC9CQ,CAAQM,CAAAA,CAAAA,CAAWf,CAAM,CAAA,CACzB,MACF,CAEA,GAAIC,CAA4B,YAAA,CAAA,CAAE,WAAa,CAAA,CAC7CQ,CAAQR,CAAAA,CAAAA,CAAiB,GAAI,CAAA,SAAA,CAAWD,CAAM,CAAA,CAC9C,MACF,CAEA,GAAIC,CAAAA,YAA4B,CAAE,CAAA,UAAA,CAAY,CAC5CQ,CAAAA,CAAQR,CAAiB,CAAA,GAAA,CAAI,SAAWD,CAAAA,CAAM,CAC9C,CAAA,MACF,CAEA,GAAIC,CAA4B,YAAA,CAAA,CAAE,SAAW,CAAA,CAC3CQ,EAAQR,CAAiB,CAAA,GAAA,CAAI,SAAW,CAAA,CAAA,EAAGD,CAAM,CAAA,EAAA,CAAI,CACrD,CAAA,MACF,CAEAgE,CAAAA,CAAmB,GAAIhE,CAAAA,CAAAA,CAAQD,CAAsB,EACvD,CAEA,OAAAU,CAAAA,CAAQb,CAAM,CAAA,CAEP,CAAE,CAAA,MAAA,CAAO,MAAO,CAAA,WAAA,CAAYoE,CAAkB,CAAC,CACxD,CC/CA,SAASC,CAAAA,CAAoBC,EAAiB1E,CAAsB,CAAA,CAClE,IAAM2E,CAAAA,CAAeD,CAAQ,CAAA,KAAA,CAAM,GAAG,CAAA,CAChCE,CAAY5E,CAAAA,CAAAA,CAAI,KAAM,CAAA,GAAG,CAE/B,CAAA,OAAI2E,CAAa,CAAA,MAAA,GAAWC,CAAU,CAAA,MAAA,CAC7B,KAGFD,CAAAA,CAAAA,CAAa,KAAM,CAAA,CAACE,CAAMzD,CAAAA,CAAAA,GACxByD,CAAS,GAAA,GAAA,EAAOA,CAASD,GAAAA,CAAAA,CAAUxD,CAAK,CAChD,CACH,CAEO,IAAM0D,CAAmB,CAAA,CAC9BC,CACA,CAAA,CACE,MAAA3E,CAAAA,CACF,CAGmB,GAAA,CACnB,IAAMT,CAAAA,CAAkC,EAAC,CACnCiC,EAAiC,EAAC,CAGlCoD,CAAqBT,CAAAA,CAAAA,CAAqBnE,CAAM,CAAA,CAGtD,IAAW,GAAA,CAACJ,CAAKiF,CAAAA,CAAa,CAAKF,GAAAA,CAAAA,CAAK,OAAQ,EAAA,CAAG,CACjD,IAAMG,CAAAA,CAAclF,CAAI,CAAA,OAAA,CAAQ,QAAU,CAAA,GAAG,CAGvCmF,CAAAA,CAAAA,CACJH,CAAmB,CAAA,KAAA,CAAME,CAAW,CAAA,EACpC,MAAO,CAAA,OAAA,CAAQF,CAAmB,CAAA,KAAK,CAAE,CAAA,IAAA,CACvC,CAAC,CAACI,CAAC,CAAA,GAAMA,CAAE,CAAA,QAAA,CAAS,GAAG,CAAA,EAAKX,CAAoBW,CAAAA,CAAAA,CAAGF,CAAW,CAChE,IAAI,CAAC,CAAA,CAEP,GAAIC,CAAAA,CACF,GAAI,CAEF,GAAIA,CAAAA,YAA0BzE,CAAE,CAAA,SAAA,CAAW,CACzC,IAAM2E,CAAM,CAAA,MAAA,CAAOJ,CAAa,CAAA,CAChC,OAAQ,CAAA,GAAA,CAAI,KAAOI,CAAAA,CAAG,CACjB,CAAA,KAAA,CAAMA,CAAG,CAAA,EAGZzD,CAAO5B,CAAAA,CAAG,CAAI,CAAA,kCAAA,CACdL,CAAOK,CAAAA,CAAG,EAAIiF,CAHdtF,EAAAA,CAAAA,CAAOK,CAAG,CAAA,CAAIqF,EAKlB,CAAA,KAAO,CAEL,IAAMC,CAAelB,CAAAA,CAAAA,CACnBe,CACF,CAAA,CAAE,KAAMF,CAAAA,CAAa,CACrBtF,CAAAA,CAAAA,CAAOK,CAAG,CAAA,CAAIsF,EAChB,CACF,CAASC,MAAAA,CAAAA,CAAO,CACd,GAAIA,CAAiBC,YAAAA,QAAAA,CACnB,IAAWC,IAAAA,CAAAA,IAAYF,CAAM,CAAA,MAAA,CAAQ,CACnC,IAAMvC,CAAAA,CAAOyC,CAAS,CAAA,IAAA,CAAK,IAAK,CAAA,GAAG,CAC/BzC,CAAAA,CAAAA,GAEFpB,CAAOoB,CAAAA,CAAI,CAAIyC,CAAAA,CAAAA,CAAS,OAE5B,EAAA,CAAA,KAEA7D,EAAO5B,CAAG,CAAA,CAAI,8CAEhBL,CAAAA,CAAAA,CAAOK,CAAG,CAAA,CAAIiF,EAChB,CAAA,KAEAtF,CAAOK,CAAAA,CAAG,CAAIiF,CAAAA,EAElB,CAGA,GAAI,CACF,IAAMS,CAAAA,CAAkBlG,CAAqBG,CAAAA,CAAM,CAC7CgG,CAAAA,CAAAA,CAAgBvF,CAAO,CAAA,SAAA,CAAUsF,CAAe,CAAA,CAEtD,GAAKC,CAAAA,CAAc,OAajB,CAAA,OAAO,CAAE,OAAA,CAAS,CAAM,CAAA,CAAA,IAAA,CAAMA,CAAc,CAAA,IAAK,CAbvB,CAAA,CAC1B,IAAMC,CAAAA,CAA2C,EAAC,CAClD,IAAWL,IAAAA,CAAAA,IAASI,CAAc,CAAA,KAAA,CAAM,OAAQ,CAC9C,IAAM3C,CAAOuC,CAAAA,CAAAA,CAAM,IAAK,CAAA,IAAA,CAAK,GAAG,CAAA,CAC5BvC,CAEF4C,GAAAA,CAAAA,CAAiB5C,CAAI,CAAA,CAAIuC,CAAM,CAAA,OAAA,EAEnC,CAGA,OAAO,CAAE,OAAA,CAAS,CAAO,CAAA,CAAA,MAAA,CADL,CAAE,GAAG3D,CAAQ,CAAA,GAAGgE,CAAiB,CACR,CAC/C,CAGF,CAASL,MAAAA,CAAAA,CAAO,CACd,GAAIA,CAAAA,YAAiBC,QACnB,CAAA,IAAA,IAAWC,CAAYF,IAAAA,CAAAA,CAAM,MAAQ,CAAA,CACnC,IAAMvC,CAAAA,CAAOyC,CAAS,CAAA,IAAA,CAAK,IAAK,CAAA,GAAG,CAC9B7D,CAAAA,CAAAA,CAAOoB,CAAI,CAAA,GACdpB,CAAOoB,CAAAA,CAAI,CAAIyC,CAAAA,CAAAA,CAAS,OAE5B,EAAA,CAEJ,CAGA,OAAI,MAAO,CAAA,IAAA,CAAK7D,CAAM,CAAA,CAAE,OAAS,CACxB,CAAA,CAAE,OAAS,CAAA,KAAA,CAAO,MAAAA,CAAAA,CAAO,CAG3B,CAAA,CAAE,OAAS,CAAA,KAAA,CAAO,MAAQ,CAAA,EAAG,CACtC,EAEaiE,CAAe,CAAA,CAC1BpG,CACA,CAAA,CACE,MAAAW,CAAAA,CACF,CAGmB,GAAA,CACnB,GAAI,CAEF,IAAMuF,CAAAA,CAAgBvF,CAAO,CAAA,SAAA,CAAUX,CAAI,CAE3C,CAAA,GAAI,CAACkG,CAAAA,CAAc,OAAS,CAAA,CAC1B,IAAM/D,CAAAA,CAAiC,EAAC,CACxC,IAAW2D,IAAAA,CAAAA,IAASI,CAAc,CAAA,KAAA,CAAM,MAAQ,CAAA,CAC9C,IAAM3C,CAAAA,CAAOuC,CAAM,CAAA,IAAA,CAAK,IAAK,CAAA,GAAG,CAChC3D,CAAAA,CAAAA,CAAOoB,CAAI,CAAA,CAAIuC,CAAM,CAAA,QACvB,CACA,OAAO,CAAE,OAAS,CAAA,CAAA,CAAA,CAAO,MAAA3D,CAAAA,CAAO,CAClC,CAEA,OAAO,CAAE,OAAS,CAAA,CAAA,CAAA,CAAM,IAAM+D,CAAAA,CAAAA,CAAc,IAAK,CACnD,CAASJ,MAAAA,CAAAA,CAAO,CACd,GAAIA,CAAiBC,YAAAA,QAAAA,CAAU,CAC7B,IAAM5D,CAAiC,CAAA,EACvC,CAAA,IAAA,IAAW6D,CAAYF,IAAAA,CAAAA,CAAM,MAAQ,CAAA,CACnC,IAAMvC,CAAOyC,CAAAA,CAAAA,CAAS,IAAK,CAAA,IAAA,CAAK,GAAG,CAAA,CACnC7D,CAAOoB,CAAAA,CAAI,CAAIyC,CAAAA,CAAAA,CAAS,QAC1B,CACA,OAAO,CAAE,OAAS,CAAA,KAAA,CAAO,MAAA7D,CAAAA,CAAO,CAClC,CACA,OAAO,CAAE,OAAS,CAAA,KAAA,CAAO,MAAQ,CAAA,EAAG,CACtC,CACF","file":"index.mjs","sourcesContent":["import type { z } from \"zod/v4\";\nimport type { ZodFormSchema } from \".\";\nimport type { DeepPartial } from \"./deep-partial\";\n\nexport function unflattenZodFormData<T extends ZodFormSchema>(\n data: Record<string, unknown>,\n root?: string\n): DeepPartial<z.infer<T>> {\n const result: Record<string, unknown> = {};\n\n const nest = (\n data: Record<string, unknown> | unknown[],\n keys: string[],\n level: number,\n value: unknown\n ) => {\n const key = keys[level];\n const nextKey = keys[level + 1];\n\n /*\n\t\t\tIf we're on the last key, we're dealing with a primitive value.\n\t\t\tSo either push it to an array if that's what's passed in, or set is as the value of the key.\n\t\t*/\n const isLastKey = nextKey === undefined;\n if (isLastKey) {\n if (Array.isArray(data)) {\n data.push(value);\n return data;\n }\n\n data[key] = value;\n return data;\n }\n\n // If the next key is a number, the current levels value is an array\n const keyIsArray = !Number.isNaN(Number(nextKey));\n if (keyIsArray) {\n if (Array.isArray(data)) {\n // In this instance we're dealing with an array within an array\n console.warn(\"ARRAY WITHIN ARRAY\");\n } else {\n // We're dealing with a passed in object\n // We need to check if the current level key already exists\n // If it does, we want to pass the values down the chain\n if (data[key]) {\n return nest(data[key] as unknown[], keys, level + 1, value);\n }\n\n // We need to create the empty array value if it doesn't exist\n data[key] = [];\n return nest(data[key] as unknown[], keys, level + 1, value);\n }\n } else {\n // If the next key is not a number, the current level value is an object\n if (Array.isArray(data)) {\n /*\n\t\t\t\t\tIf the passed in data is an array, check if the current level key (index) already exists in the array.\n\t\t\t\t*/\n\n // We know that the previous level key was a number\n // So we can assume that the current level key is a number\n const valueAtIndex = data[Number(key)];\n\n // If the key at the index exists, we just need to pass down values\n if (valueAtIndex !== undefined) {\n return nest(\n valueAtIndex as Record<string, unknown>,\n keys,\n level + 1,\n value\n );\n }\n\n // If it doesn't exist, we know it's an empty object\n data[Number(key)] = {};\n return nest(\n data[Number(key)] as Record<string, unknown>,\n keys,\n level + 1,\n value\n );\n }\n\n /*\n\t\t\t\tAnd finally, we're dealing with objects.\n\t\t\t\tIf the current level key doesn't exist on the passed in data,\n\t\t\t\twe need to create an empty object and pass down the values.\n\t\t\t\tOtherwise, we just need to pass down the values.\n\t\t\t*/\n if (!data[key]) {\n data[key] = {};\n return nest(\n data[key] as Record<string, unknown>,\n keys,\n level + 1,\n value\n );\n }\n\n if (data[key]) {\n return nest(\n data[key] as Record<string, unknown>,\n keys,\n level + 1,\n value\n );\n }\n }\n };\n\n for (const [key, value] of Object.entries(data)) {\n const keys = key.split(\".\");\n\n // Check if a root is provided and if the current key starts with it\n if (root) {\n if (key.startsWith(`${root}.`)) {\n nest(result, keys, 0, value);\n }\n } else {\n // If no root is provided, process all keys as before\n nest(result, keys, 0, value);\n }\n }\n\n return root\n ? (result[root] as DeepPartial<z.infer<T>>)\n : (result as DeepPartial<z.infer<T>>);\n}\n","import {\n z,\n} from \"zod/v4\";\nimport type { ZodFormSchema } from \".\";\nimport type { DeepPartial } from \"./deep-partial\";\nimport { unflattenZodFormData } from \"./unflatten-zod-form-data\";\nimport { $ZodType } from \"zod/v4/core\";\n\nexport function extractZodDefaults<T extends ZodFormSchema>(\n schema: T\n): DeepPartial<z.infer<T>> {\n const defaults: Record<string, unknown> = {};\n\n function extract(subSchema: $ZodType, prefix = \"\"): void {\n const currentSubSchema = subSchema;\n\n if (currentSubSchema instanceof z.ZodObject) {\n const shape = currentSubSchema.shape;\n for (const [key, value] of Object.entries(shape)) {\n const newPrefix = prefix ? `${prefix}.${key}` : key;\n extract(value as z.ZodType, newPrefix);\n }\n\n return;\n }\n\n if (currentSubSchema instanceof z.ZodArray) {\n const element = currentSubSchema.element;\n extract(element, `${prefix}.0`);\n return;\n }\n\n if (currentSubSchema instanceof z.ZodDefault) {\n const defaultValue = currentSubSchema.def.defaultValue\n if (defaultValue !== undefined) {\n defaults[prefix] = defaultValue;\n }\n return;\n }\n\n if (currentSubSchema instanceof z.ZodOptional) {\n extract(currentSubSchema.def.innerType, prefix);\n return;\n }\n\n console.warn(\"unhandled zod type\", currentSubSchema)\n }\n\n extract(schema);\n return unflattenZodFormData<T>(defaults) as DeepPartial<z.infer<T>>;\n}\n","import { z } from \"zod/v4\";\nimport type { ZodFormSchema } from \".\";\nimport type { DeepPartial } from \"./deep-partial\";\nimport { $ZodType } from \"zod/v4/core\";\n\nexport function flattenZodFormData<T extends ZodFormSchema>(\n schema: T,\n data: DeepPartial<z.infer<T>>\n) {\n const flattenedDataMap = new Map<string, unknown>();\n\n function flatten(subSchema: $ZodType, subValue: unknown, prefix = \"\"): void {\n let currentSubSchema = subSchema;\n\n if (currentSubSchema instanceof z.ZodObject) {\n if (typeof subValue === \"object\" && subValue !== null) {\n for (const [key, value] of Object.entries(currentSubSchema.shape)) {\n const newPrefix = prefix ? `${prefix}.${key}` : key;\n flatten(\n value as z.ZodType,\n (subValue as Record<string, unknown>)[key] as unknown,\n newPrefix\n );\n }\n } else {\n console.error(\"Expected object, got\", subValue);\n }\n return;\n }\n\n if (currentSubSchema instanceof z.ZodArray) {\n if (Array.isArray(subValue)) {\n subValue.forEach((item, index) => {\n flatten(\n (currentSubSchema as z.ZodArray<z.ZodType>).element,\n item,\n `${prefix}.${index}`\n );\n });\n } else {\n console.error(\"Expected array, got\", subValue);\n }\n return;\n }\n\n if (\n currentSubSchema instanceof z.ZodUnion ||\n currentSubSchema instanceof z.ZodDiscriminatedUnion\n ) {\n const options = currentSubSchema.options;\n for (const option of options) {\n flatten(option as z.ZodType, subValue, prefix);\n }\n return;\n }\n\n if (currentSubSchema instanceof z.ZodLazy) {\n const lazyValue = currentSubSchema.def.getter();\n flatten(lazyValue, subValue, prefix);\n return;\n }\n\n if (currentSubSchema instanceof z.ZodOptional) {\n const inner = currentSubSchema.def.innerType;\n flatten(inner, subValue, prefix);\n return;\n }\n\n if (currentSubSchema instanceof z.ZodDefault) {\n const inner = currentSubSchema.def.innerType;\n const defaultValue = currentSubSchema.def.defaultValue;\n const valueWithDefault = subValue === undefined ? defaultValue : subValue;\n flatten(inner, valueWithDefault, prefix);\n return;\n }\n\n if (currentSubSchema instanceof z.ZodRecord) {\n if (typeof subValue === \"object\" && subValue !== null) {\n for (const [key, value] of Object.entries(\n subValue as Record<string, unknown>\n )) {\n if (subSchema instanceof z.ZodRecord) {\n const newSubSchema = subSchema.def.valueType as $ZodType;\n const newSubValue = (subValue as Record<string, unknown>)[key];\n const newPrefix = `${prefix}.${key}`;\n\n flatten(newSubSchema, newSubValue, newPrefix);\n } else {\n console.error(\"Expected record, got\", subValue);\n }\n }\n }\n\n return;\n }\n\n flattenedDataMap.set(prefix, subValue);\n }\n\n flatten(schema, data);\n return Object.fromEntries(flattenedDataMap);\n}\n","import type { z } from \"zod/v4\";\nimport type { ZodFormSchema } from \".\";\nimport type { DeepPartial } from \"./deep-partial\";\n\nexport function flattenZodFormErrors<T extends ZodFormSchema>(\n errors?: DeepPartial<z.infer<T>> | null\n) {\n if (!errors) return new Map<string, string>();\n\n const flattenedErrorsMap = new Map<string, string>();\n\n // Flatten object errors\n function flatten(subErrors: Record<string, unknown>, prefix = \"\") {\n for (const [key, value] of Object.entries(subErrors)) {\n const newPrefix = prefix ? `${prefix}.${key}` : key;\n if (typeof value === \"string\") {\n flattenedErrorsMap.set(newPrefix, value);\n } else if (Array.isArray(value)) {\n value.forEach((item, index) => {\n if (typeof item === \"string\") {\n flattenedErrorsMap.set(`${newPrefix}.${index}`, item);\n } else {\n flatten(item as Record<string, unknown>, `${newPrefix}.${index}`);\n }\n });\n } else if (typeof value === \"object\" && value !== null) {\n flatten(value as Record<string, unknown>, newPrefix);\n }\n }\n }\n\n flatten(errors as unknown as Record<string, unknown>);\n\n return flattenedErrorsMap;\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { z } from \"zod/v4\";\nimport type { DeepPartial } from \"./deep-partial\";\nimport { extractZodDefaults } from \"./extract-zod-defaults\";\nimport { flattenZodFormData } from \"./flatten-zod-form-data\";\nimport { flattenZodFormErrors } from \"./flatten-zod-form-errors\";\nimport { unflattenZodFormData } from \"./unflatten-zod-form-data\";\n\nexport type ZodFormSchema = z.ZodTypeAny;\n\nexport type FieldProps<T> = {\n name: string;\n value: T;\n onChange: (payload: T) => void;\n error: string | null;\n};\n\nexport type NestedFields<T extends z.ZodTypeAny> =\n T extends z.ZodObject<infer Shape>\n ? { [K in keyof Shape]: NestedFields<Shape[K] & z.ZodTypeAny> }\n : T extends z.ZodRecord<any, infer Value>\n ? Record<string, NestedFields<Value & z.ZodTypeAny>>\n : T extends z.ZodMap<infer Key, infer Value>\n ? Map<z.infer<Key>, NestedFields<Value & z.ZodTypeAny>>\n : T extends z.ZodArray<infer Item>\n ? NestedFields<Item & z.ZodTypeAny>[]\n : T extends z.ZodSet<infer Item>\n ? Set<NestedFields<Item & z.ZodTypeAny>>\n : T extends z.ZodTuple<infer Items>\n ? { [K in keyof Items]: NestedFields<Items[K] & z.ZodTypeAny> }\n : FieldProps<z.infer<T>>;\n\nexport type NestedFieldErrors<T extends z.ZodTypeAny> =\n T extends z.ZodObject<infer Shape>\n ? { [K in keyof Shape]: NestedFieldErrors<Shape[K] & z.ZodTypeAny> }\n : T extends z.ZodRecord<any, infer Value>\n ? Record<string, NestedFieldErrors<Value & z.ZodTypeAny>>\n : T extends z.ZodMap<infer Key, infer Value>\n ? Map<z.infer<Key>, NestedFieldErrors<Value & z.ZodTypeAny>>\n : T extends z.ZodArray<infer Item>\n ? NestedFieldErrors<Item & z.ZodTypeAny>[]\n : T extends z.ZodSet<infer Item>\n ? Set<NestedFieldErrors<Item & z.ZodTypeAny>>\n : T extends z.ZodTuple<infer Items>\n ? { [K in keyof Items]: NestedFieldErrors<Items[K] & z.ZodTypeAny> }\n : string;\n\ntype TupleKeys<T extends any[]> = Exclude<keyof T, keyof any[]>;\nexport type ZodPaths<T extends z.ZodTypeAny> =\n T extends z.ZodObject<infer Shape>\n ? {\n [K in keyof Shape]:\n Shape[K] extends z.ZodArray<infer Item>\n ? Item extends z.ZodObject<infer NestedShape>\n ? `${K & string}.#` | { [N in keyof NestedShape]: `${K & string}.#.${N & string}` | `${K & string}.#.${ZodPaths<NestedShape[N] & z.ZodTypeAny>}` }[keyof NestedShape]\n : `${K & string}.#`\n : Shape[K] extends z.ZodTuple<infer Items>\n ? { [I in TupleKeys<Items & z.ZodTypeAny[]>]:\n Items[I] extends z.ZodObject<any>\n ? `${K & string}.${I & string}` | `${K & string}.${I & string}.${ZodPaths<Items[I] & z.ZodTypeAny>}`\n : `${K & string}.${I & string}`\n }[TupleKeys<Items & z.ZodTypeAny[]>]\n : Shape[K] extends z.ZodObject<any>\n ? `${K & string}` | `${K & string}.${ZodPaths<Shape[K] & z.ZodTypeAny>}`\n : K & string\n }[keyof Shape]\n : never;\n\nexport type ArrayElementType<\n Schema extends z.ZodTypeAny,\n Path extends string\n> =\n Path extends `${infer Key}.#.${infer Rest}`\n ? Schema extends z.ZodObject<infer Shape>\n ? Key extends keyof Shape\n ? Shape[Key] extends z.ZodArray<infer Item>\n ? ArrayElementType<Item & z.ZodTypeAny, Rest>\n : never\n : never\n : never\n : Path extends `${infer Key}.${infer Rest}`\n ? Schema extends z.ZodObject<infer Shape>\n ? Key extends keyof Shape\n ? ArrayElementType<Shape[Key] & z.ZodTypeAny, Rest>\n : never\n : never\n : Schema extends z.ZodObject<infer Shape>\n ? Path extends keyof Shape\n ? Shape[Path] extends z.ZodArray<infer Item>\n ? z.infer<Item>\n : never\n : never\n : never;\n\nexport type ArrayPaths<T extends z.ZodTypeAny, Prefix extends string = \"\"> =\n T extends z.ZodObject<infer Shape>\n ? {\n [K in keyof Shape]:\n Shape[K] extends z.ZodArray<infer Item>\n ? | `${Prefix}${K & string}`\n | ArrayPaths<Item & z.ZodTypeAny, `${Prefix}${K & string}.#.`>\n : Shape[K] extends z.ZodObject<any>\n ? ArrayPaths<Shape[K], `${Prefix}${K & string}.`>\n : never\n }[keyof Shape]\n : never;\n\n const schema = z.object({\n users: z.array(z.object({\n name: z.string(),\n posts: z.array(z.object({ title: z.string() }))\n }))\n });\n\n// A form is a flattened collection of fields\n// - sub fields should be . delimited\n// - array fields should be [#] delimited\n// When we pass in the schema, we should be able to determine what the form field names should be.\n\nexport const useZodForm = <Schema extends ZodFormSchema>({\n schema,\n defaultValues,\n errors: passedInErrors,\n}: {\n schema: Schema;\n defaultValues?: DeepPartial<z.infer<Schema>>;\n errors?: DeepPartial<NestedFieldErrors<Schema>> | null;\n}) => {\n const [flattenedData, setFlattenedData] = useState(() => {\n const zodDefaults = extractZodDefaults(schema);\n const initial = defaultValues ?? zodDefaults ?? {} as DeepPartial<z.infer<Schema>>;\n return flattenZodFormData(schema, initial);\n });\n\n const [internalErrors, setInternalErrors] = useState<Map<string, string>>(\n () => flattenZodFormErrors(passedInErrors)\n );\n\n const setFieldErrors = useCallback(\n (newErrors: DeepPartial<NestedFieldErrors<Schema>>) => {\n setInternalErrors(flattenZodFormErrors(newErrors));\n },\n []\n );\n\n // Don't love this useEffect, internal errors needs to be a state so we can set it\n // and we also want to update it when the passed in errors change as well.\n useEffect(() => {\n if (passedInErrors) setFieldErrors(passedInErrors);\n }, [passedInErrors, setFieldErrors]);\n\n const fields = useMemo((): NestedFields<Schema> => {\n const getFieldProps = <T extends z.ZodTypeAny>(\n field: T,\n path: string[] = []\n ): NestedFields<T> => {\n if (field instanceof z.ZodType) {\n if (field instanceof z.ZodObject) {\n const objectFields: Record<string, unknown> = {};\n for (const [key, subField] of Object.entries(field.shape)) {\n objectFields[key] = getFieldProps(subField as z.ZodTypeAny, [\n ...path,\n key,\n ]);\n }\n \n return objectFields as NestedFields<T>;\n }\n }\n\n\n if (field instanceof z.ZodArray) {\n const arrayPath = path.join(\".\") as ZodPaths<Schema>;\n\n const nested = unflattenZodFormData<typeof field>(\n flattenedData,\n arrayPath\n );\n\n return (\n (nested?.map((_: unknown, index: number) =>\n getFieldProps(\n (field as unknown as z.ZodArray<z.ZodTypeAny>).element,\n [...path, index.toString()]\n )\n ) as NestedFields<T>) ?? []\n );\n }\n\n const fieldPath = path.join(\".\") as ZodPaths<Schema>;\n const value = flattenedData[fieldPath] as z.infer<T>;\n\n return {\n name: fieldPath,\n value,\n onChange: (payload: z.infer<T>) => {\n setFlattenedData((prev) => ({ ...prev, [fieldPath]: payload }));\n },\n error: internalErrors.get(fieldPath) ?? null,\n } as unknown as NestedFields<T>;\n };\n\n return getFieldProps(schema) as NestedFields<Schema>;\n }, [schema, flattenedData, internalErrors]);\n\n const getFieldArrayHelpers = useCallback(\n <P extends ArrayPaths<Schema>>(path: P) => {\n return {\n add: (value: ArrayElementType<Schema, P>) => {\n setFlattenedData((prev) => {\n const newData = { ...prev };\n const currentArray = Object.keys(newData)\n .filter((key) => key.startsWith(`${path}.`))\n .reduce((max, key) => {\n const match = key.match(new RegExp(`^${path}\\\\.(\\\\d+)`));\n return match\n ? Math.max(max, Number.parseInt(match[1], 10))\n : max;\n }, -1);\n\n const newIndex = currentArray + 1;\n\n if (typeof value === \"object\" && value !== null) {\n for (const [key, val] of Object.entries(value)) {\n newData[`${path}.${newIndex}.${key}`] = val;\n }\n } else {\n newData[`${path}.${newIndex}`] = value;\n }\n\n return newData;\n });\n },\n remove: (index: number) => {\n setFlattenedData((prev) => {\n const newData = { ...prev };\n const prefix = `${path}.${index}`;\n\n // Remove all keys that start with the prefix\n for (const key of Object.keys(newData)) {\n if (key.startsWith(prefix)) {\n delete newData[key];\n }\n }\n\n // Shift the indices of the remaining elements\n for (const key of Object.keys(newData)) {\n const match = key.match(new RegExp(`^${path}\\\\.(\\\\d+)`));\n if (match) {\n const currentIndex = Number.parseInt(match[1], 10);\n if (currentIndex > index) {\n const newKey = key.replace(\n new RegExp(`^${path}\\\\.${currentIndex}`),\n `${path}.${currentIndex - 1}`\n );\n newData[newKey] = newData[key];\n delete newData[key];\n }\n }\n }\n\n return newData;\n });\n },\n };\n },\n []\n );\n\n return {\n fields,\n getFieldArrayHelpers,\n setFieldErrors,\n } satisfies {\n fields: NestedFields<Schema>;\n getFieldArrayHelpers: <P extends ArrayPaths<Schema>>(\n path: P\n ) => {\n add: (value: ArrayElementType<Schema, P>) => void;\n remove: (index: number) => void;\n };\n setFieldErrors: (errors: DeepPartial<NestedFieldErrors<Schema>>) => void;\n };\n};\n","import {\n\n z,\n} from \"zod/v4\";\n\nconst BoolAsString = z\n .string()\n .regex(\n /^(true|false|on)$/,\n 'Must be a boolean string (\"true\", \"false\", or \"on\")'\n )\n .transform((value) => value === \"true\" || value === \"on\");\n\nconst IntAsString = z\n .string()\n .regex(/^-?\\d+$/, \"Must be an integer string\")\n .transform((val) => Number.parseInt(val, 10));\n\nconst NumAsString = z\n .string()\n .regex(/^-?\\d*\\.?\\d+$/, \"Must be a number string\")\n .transform(Number);\n\nconst DateAsString = z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, \"Must be a date string (YYYY-MM-DD)\")\n .transform((val) => new Date(val));\n\nexport function coerceFormData<Schema extends z.ZodType>(\n type: Schema\n): z.ZodType<z.output<Schema>> {\n let schema: z.ZodType = type;\n switch (schema.def.type) {\n case \"string\":\n case \"literal\":\n case \"enum\":\n schema = z.any()\n .overwrite((value) => z.coerce.string().parse(value))\n .pipe(type);\n break;\n case \"bigint\":\n schema = z.any()\n .overwrite((value) => IntAsString.parse(value))\n .pipe(type);\n break;\n case \"number\":\n schema = z.any()\n .overwrite((value) => {\n // First try to coerce to number\n const coerced = z.coerce.number().safeParse(value);\n if (coerced.success) return coerced.data;\n \n // If that fails, try parsing as string\n return NumAsString.parse(value);\n })\n .pipe(type);\n break;\n case \"boolean\":\n schema = z.any()\n .overwrite((value) => BoolAsString.parse(value))\n .pipe(type);\n break;\n case \"date\":\n schema = z.any()\n .overwrite((value) => DateAsString.parse(value))\n .pipe(type);\n break;\n case \"array\":\n schema = z.preprocess(\n (val) => (Array.isArray(val) ? val : val === undefined ? [] : [val]),\n type\n );\n break;\n case \"nullable\":\n case \"optional\":\n schema = z.preprocess((val) => (val === \"\" ? null : val), type);\n break;\n case \"file\":\n schema = z.any()\n .overwrite((value) => value instanceof File ? value : new File([value], value.name))\n .pipe(type);\n break;\n default:\n console.error(`Zod type not handled in coerceFormData: ${schema.def.type}`);\n break;\n }\n\n return schema;\n}\n","import { z } from \"zod/v4\";\nimport type { ZodFormSchema } from \".\";\nimport { ZodFirstPartyTypeKind } from \"zod\";\nimport { $ZodType } from \"zod/v4/core\";\n\nexport function flattenZodFormSchema<T extends ZodFormSchema>(\n schema: T\n): z.ZodObject<z.ZodRawShape> {\n const flattenedSchemaMap = new Map<string, z.ZodType>();\n\n function flatten(subSchema: $ZodType, prefix = \"\") {\n let currentSubSchema = subSchema;\n\n\n if (currentSubSchema instanceof z.ZodObject) {\n for (const [key, value] of Object.entries(currentSubSchema.shape)) {\n const newPrefix = prefix ? `${prefix}.${key}` : key;\n flatten(value as z.ZodType, newPrefix);\n }\n return;\n }\n\n if (currentSubSchema instanceof z.ZodArray) {\n flatten(currentSubSchema.element, `${prefix}.#`);\n return;\n }\n\n if (currentSubSchema instanceof z.ZodUnion || currentSubSchema instanceof z.ZodDiscriminatedUnion) {\n for (const option of currentSubSchema.options) {\n flatten(option as z.ZodType, prefix);\n }\n return;\n }\n\n if (currentSubSchema instanceof z.ZodLazy) {\n const lazyValue = currentSubSchema.def.getter();\n flatten(lazyValue, prefix);\n return;\n }\n\n if (currentSubSchema instanceof z.ZodOptional) {\n flatten(currentSubSchema.def.innerType, prefix);\n return;\n }\n\n if (currentSubSchema instanceof z.ZodDefault) {\n flatten(currentSubSchema.def.innerType, prefix);\n return;\n }\n\n if (currentSubSchema instanceof z.ZodRecord) {\n flatten(currentSubSchema.def.valueType, `${prefix}.*`);\n return;\n }\n\n flattenedSchemaMap.set(prefix, subSchema as z.ZodType);\n }\n\n flatten(schema);\n\n return z.object(Object.fromEntries(flattenedSchemaMap));\n}\n","import { ZodError, z } from \"zod/v4\";\nimport type { NestedFieldErrors, ZodFormSchema } from \".\";\nimport { coerceFormData } from \"./coerce-form-data\";\nimport type { DeepPartial } from \"./deep-partial\";\nimport { flattenZodFormSchema } from \"./flatten-zod-form-schema\";\nimport { unflattenZodFormData } from \"./unflatten-zod-form-data\";\n\ntype ParseResult<T extends ZodFormSchema> =\n | { success: true; data: z.infer<T> }\n | {\n success: false;\n errors: DeepPartial<NestedFieldErrors<T>> | Record<string, string>;\n };\n\nfunction matchWildcardString(pattern: string, key: string): boolean {\n const patternParts = pattern.split(\".\");\n const testParts = key.split(\".\");\n\n if (patternParts.length !== testParts.length) {\n return false;\n }\n\n return patternParts.every((part, index) => {\n return part === \"*\" || part === testParts[index];\n });\n}\n\nexport const parseZodFormData = <T extends ZodFormSchema>(\n form: FormData,\n {\n schema,\n }: {\n schema: T;\n }\n): ParseResult<T> => {\n const result: Record<string, unknown> = {};\n const errors: Record<string, string> = {};\n\n // Get the flattened schema for type coercion\n const flattenedZodSchema = flattenZodFormSchema(schema);\n\n // First pass: Coerce values to their correct types\n for (const [key, formDataValue] of form.entries()) {\n const keyWithHash = key.replace(/(\\d+)/g, \"#\");\n\n // Try to find the matching schema for coercion\n const matchingSchema =\n flattenedZodSchema.shape[keyWithHash] ||\n Object.entries(flattenedZodSchema.shape).find(\n ([k]) => k.includes(\"*\") && matchWildcardString(k, keyWithHash)\n )?.[1];\n\n if (matchingSchema) {\n try {\n // For numbers, first try to coerce to number\n if (matchingSchema instanceof z.ZodNumber) {\n const num = Number(formDataValue);\n console.log(\"NUM\", num)\n if (!isNaN(num)) {\n result[key] = num;\n } else {\n errors[key] = \"Expected number, received string\";\n result[key] = formDataValue;\n }\n } else {\n // Use coerceFormData for other types\n const coercedValue = coerceFormData(\n matchingSchema as z.ZodType\n ).parse(formDataValue);\n result[key] = coercedValue;\n }\n } catch (error) {\n if (error instanceof ZodError) {\n for (const zodError of error.issues) {\n const path = zodError.path.join(\".\");\n if (path) {\n // Only add errors with non-empty paths\n errors[path] = zodError.message;\n }\n }\n } else {\n errors[key] = \"An unexpected error occurred during coercion\";\n }\n result[key] = formDataValue;\n }\n } else {\n result[key] = formDataValue;\n }\n }\n\n // Second pass: Validate the coerced data\n try {\n const unflattenedData = unflattenZodFormData(result);\n const validatedData = schema.safeParse(unflattenedData);\n\n if (!validatedData.success) {\n const validationErrors: Record<string, string> = {};\n for (const error of validatedData.error.issues) {\n const path = error.path.join(\".\");\n if (path) {\n // Only add errors with non-empty paths\n validationErrors[path] = error.message;\n }\n }\n // Merge validation errors with coercion errors, preferring validation errors\n const finalErrors = { ...errors, ...validationErrors };\n return { success: false, errors: finalErrors };\n } else {\n return { success: true, data: validatedData.data };\n }\n } catch (error) {\n if (error instanceof ZodError) {\n for (const zodError of error.issues) {\n const path = zodError.path.join(\".\");\n if (!errors[path]) {\n errors[path] = zodError.message;\n }\n }\n }\n }\n\n // If we have any errors, return them\n if (Object.keys(errors).length > 0) {\n return { success: false, errors };\n }\n\n return { success: false, errors: {} };\n};\n\nexport const parseZodData = <T extends ZodFormSchema>(\n data: z.infer<T>,\n {\n schema,\n }: {\n schema: T;\n }\n): ParseResult<T> => {\n try {\n // Use safeParse instead of parse to handle errors more gracefully\n const validatedData = schema.safeParse(data);\n\n if (!validatedData.success) {\n const errors: Record<string, string> = {};\n for (const error of validatedData.error.issues) {\n const path = error.path.join(\".\");\n errors[path] = error.message;\n }\n return { success: false, errors };\n }\n\n return { success: true, data: validatedData.data };\n } catch (error) {\n if (error instanceof ZodError) {\n const errors: Record<string, string> = {};\n for (const zodError of error.issues) {\n const path = zodError.path.join(\".\");\n errors[path] = zodError.message;\n }\n return { success: false, errors };\n }\n return { success: false, errors: {} };\n }\n};\n"]}