@formhaus/core 0.10.1 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/engine/lifecycle-error.ts","../src/validation/default-messages.ts","../src/visibility/evaluate-condition.ts","../src/visibility/is-visible.ts","../src/validation/type-checks.ts","../src/validation/validate-field.ts","../src/validation/validate-step.ts","../src/engine/engine-utils.ts","../src/engine/pending-inputs.ts","../src/engine/validation-state.ts","../src/engine/step-routes.ts","../src/engine/step-skip.ts","../src/engine/submission.ts","../src/engine/navigation.ts"],"names":["FormLifecycleError","phase","cause","afterCommit","callback","error","TYPE_MESSAGES","getDefaultMessage","rule","params","CONDITION_OPERATORS","isBlank","value","toNumber","number","compare","operand","test","evaluateCondition","condition","values","a","b","isVisible","field","matches","BOOLEAN_TYPES","BUILT_IN_TYPES","MAX_STRING_LENGTH","MAX_EMAIL_LENGTH","MAX_ITEMS","EMAIL","DECIMAL","DATE","DATE_ONLY","DATE_TIME","TEXT_TYPES","FORMATS","normalizeValue","parsed","isOption","option","lengthError","max","multiselectError","item","stringError","message","formatError","format","primitiveError","typeError","clientTypeError","isEmpty","boundError","size","rules","unit","min","patternError","validateFieldValue","allValues","validators","matchMessage","typeIssue","sizeError","matchError","validateStep","step","validateFields","fields","errors","conditionFields","source","getAllFields","definition","createValues","initialValues","getChangedKeys","previous","next","keys","key","activePath","engine","watchCheckedInputs","checked","path","applyValidationErrors","navigate","previousErrors","structureChanged","moveToFirstError","firstErrorKey","targetIndex","clearResolvedMatchErrors","cleared","getValidationValues","pruneOffPathErrors","pathFields","pruned","getSubmitValues","withoutSkipped","validateForm","validateOne","previousError","fieldKeys","resetEngine","previousValues","loadingFields","changedValues","changedFields","activeSteps","steps","indexes","index","result","available","stepValues","route","reconcileStepIndex","previousStep","preserved","nextIds","before","predecessor","candidates","createActivePath","active","refresh","groups","resetValues","skipTarget","skipCurrentStep","includeCurrentStep","skipStepAt","submitForm","submit","keepSkipped","lifecycle","dispatched","epoch","operation","inputsChanged","stale","allowed","skippedSteps","hasStepErrors","moveTo","skipStep","changeStep","committed","skippedValues","edited","submitted","skipped","direction","reason","skipping","validating","validate","toIndex","target","context","goToStepWithField","fieldKey"],"mappings":"AAAO,IAAMA,CAAAA,CAAN,cAAiC,KAAM,CAI5C,YAAqBC,CAAAA,CAA0CC,CAAAA,CAAgB,CAC7E,KAAA,CAAM,CAAA,0BAAA,EAA6BD,CAAK,CAAA,SAAA,EAAYC,CAAAA,YAAiB,MAAQA,CAAAA,CAAM,OAAA,CAAU,MAAA,CAAOA,CAAK,CAAC,CAAA,CAAE,CAAA,CADzF,IAAA,CAAA,KAAA,CAAAD,EAHrB,IAAA,CAAS,SAAA,CAAY,IAAA,CAKnB,IAAA,CAAK,KAAO,oBAAA,CACZ,IAAA,CAAK,KAAA,CAAQC,EACf,CACF,EAEA,eAAsBC,CAAAA,CAAYF,CAAAA,CAA0CG,CAAAA,CAAqD,CAC/H,GAAI,CAAE,MAAMA,CAAAA,GAAY,CAAA,MACjBC,CAAAA,CAAO,CAAE,MAAM,IAAIL,CAAAA,CAAmBC,CAAAA,CAAOI,CAAK,CAAG,CAC9D,CCdO,IAAMC,CAAAA,CAAgB,CAC3B,KAAA,CAAO,qBAAA,CACP,OAAQ,gBAAA,CACR,OAAA,CAAS,uBAAA,CACT,MAAA,CAAQ,sCACR,OAAA,CAAS,qCAAA,CACT,MAAA,CAAQ,cAAA,CACR,KAAM,oBAAA,CACN,QAAA,CAAU,6BAAA,CACV,IAAA,CAAM,0BAAA,CACN,KAAA,CAAO,eACT,CAAA,CAIO,SAASC,CAAAA,CAAkBC,CAAAA,CAAsBC,CAAAA,CAA0C,CAChG,OAAQD,CAAAA,EACN,KAAK,UAAA,CACH,OAAO,wBAAA,CACT,KAAK,WAAA,CACH,OAAO,CAAA,iBAAA,EAAoBC,CAAAA,EAAQ,GAAG,CAAA,CAAA,EAAIA,GAAQ,IAAA,EAAQ,YAAY,CAAA,CAAA,CACxE,KAAK,YACH,OAAO,CAAA,gBAAA,EAAmBA,CAAAA,EAAQ,GAAG,IAAIA,CAAAA,EAAQ,IAAA,EAAQ,YAAY,CAAA,CAAA,CACvE,KAAK,KAAA,CACH,OAAO,CAAA,iBAAA,EAAoBA,GAAQ,GAAG,CAAA,CAAA,CACxC,KAAK,KAAA,CACH,OAAO,CAAA,gBAAA,EAAmBA,CAAAA,EAAQ,GAAG,CAAA,CAAA,CACvC,KAAK,SAAA,CACH,OAAO,gBAAA,CACT,KAAK,YAAA,CACH,OAAO,mBAAA,CACT,QACE,OAAO,eACX,CACF,CChCO,IAAMC,GAAsB,CAAC,IAAA,CAAM,KAAA,CAAO,IAAA,CAAM,QAAS,UAAA,CAAY,IAAA,CAAM,KAAA,CAAO,IAAA,CAAM,KAAK,EAE7F,SAASC,CAAAA,CAAQC,EAAyB,CAC/C,OAAOA,CAAAA,EAAS,IAAA,EAAQA,IAAU,EAAA,EAAO,KAAA,CAAM,OAAA,CAAQA,CAAK,GAAK,CAACA,CAAAA,CAAM,MAC1E,CAEA,SAASC,EAAAA,CAASD,CAAAA,CAAoC,CACpD,IAAME,CAAAA,CAAS,OAAOF,CAAAA,EAAU,QAAA,EAAYA,EAAM,IAAA,EAAK,GAAM,EAAA,CAAK,MAAA,CAAOA,CAAK,CAAA,CAAIA,CAAAA,CAClF,OAAO,OAAOE,CAAAA,EAAW,QAAA,EAAY,MAAA,CAAO,QAAA,CAASA,CAAM,CAAA,CAAIA,CAAAA,CAAS,MAC1E,CAEA,SAASC,CAAAA,CAAQH,CAAAA,CAAgBI,CAAAA,CAAiBC,CAAAA,CAA4D,CAC5G,IAAMH,CAAAA,CAASD,EAAAA,CAASD,CAAK,CAAA,CAC7B,OAAOE,CAAAA,GAAW,MAAA,EAAaG,EAAKH,CAAAA,CAAQE,CAAO,CACrD,CAEO,SAASE,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACS,CACT,IAAMR,CAAAA,CAAQQ,CAAAA,CAAOD,CAAAA,CAAU,KAAK,CAAA,CACpC,OAAIA,CAAAA,CAAU,EAAA,GAAO,OAAkBP,CAAAA,GAAUO,CAAAA,CAAU,EAAA,CACvDA,CAAAA,CAAU,MAAQ,MAAA,CAAkBP,CAAAA,GAAUO,CAAAA,CAAU,GAAA,CACxDA,EAAU,EAAA,GAAO,MAAA,CAAkBA,CAAAA,CAAU,EAAA,CAAG,QAAA,CAASP,CAAwB,CAAA,CACjFO,CAAAA,CAAU,QAAU,MAAA,CAAkB,CAACA,CAAAA,CAAU,KAAA,CAAM,SAASP,CAAwB,CAAA,CACxFO,CAAAA,CAAU,QAAA,GAAa,OAAkB,CAACA,CAAAA,CAAU,QAAA,EAAY,CAACR,CAAAA,CAAQC,CAAK,CAAA,CAC9EO,CAAAA,CAAU,KAAO,MAAA,CAAkBJ,CAAAA,CAAQH,CAAAA,CAAOO,CAAAA,CAAU,GAAI,CAACE,CAAAA,CAAGC,CAAAA,GAAMD,CAAAA,CAAIC,CAAC,CAAA,CAC/EH,CAAAA,CAAU,GAAA,GAAQ,MAAA,CAAkBJ,CAAAA,CAAQH,CAAAA,CAAOO,CAAAA,CAAU,GAAA,CAAK,CAACE,CAAAA,CAAGC,CAAAA,GAAMD,CAAAA,EAAKC,CAAC,EAClFH,CAAAA,CAAU,EAAA,GAAO,MAAA,CAAkBJ,CAAAA,CAAQH,EAAOO,CAAAA,CAAU,EAAA,CAAI,CAACE,CAAAA,CAAGC,CAAAA,GAAMD,CAAAA,CAAIC,CAAC,CAAA,CAC/EH,EAAU,GAAA,GAAQ,MAAA,CAAkBJ,CAAAA,CAAQH,CAAAA,CAAOO,CAAAA,CAAU,GAAA,CAAK,CAACE,CAAAA,CAAGC,IAAMD,CAAAA,EAAKC,CAAC,CAAA,CAC/E,KACT,CC9BO,SAASC,CAAAA,CACdC,CAAAA,CACAJ,EACS,CACT,IAAMK,CAAAA,CAAWN,CAAAA,EAA6BD,EAAkBC,CAAAA,CAAWC,CAAM,CAAA,CACjF,OAAA,CAAQI,EAAM,IAAA,EAAQ,EAAC,EAAG,KAAA,CAAMC,CAAO,CAAA,GAAM,CAACD,CAAAA,CAAM,SAAS,MAAA,EAAUA,CAAAA,CAAM,OAAA,CAAQ,IAAA,CAAKC,CAAO,CAAA,CACnG,CCNO,IAAMC,CAAAA,CAAgB,CAAC,UAAA,CAAY,QAAQ,CAAA,CACrCC,EAAAA,CAAiB,CAAC,MAAA,CAAQ,OAAA,CAAS,OAAA,CAAS,SAAU,UAAA,CAAY,QAAA,CAAU,cAAA,CAAgB,aAAA,CAAe,WAAY,OAAA,CAAS,QAAA,CAAU,MAAA,CAAQ,MAAA,CAAQ,WAAY,UAAU,CAAA,CAEhLC,CAAAA,CAAoB,GAAA,CAC3BC,EAAAA,CAAmB,GAAA,CACnBC,EAAAA,CAAY,GAAA,CACZC,GAAQ,mCAAA,CACRC,EAAAA,CAAU,iDAAA,CACVC,CAAAA,CAAO,oDACPC,EAAAA,CAAY,IAAI,MAAA,CAAO,CAAA,CAAA,EAAID,CAAI,CAAA,CAAA,CAAG,CAAA,CAClCE,EAAAA,CAAY,IAAI,MAAA,CAAO,CAAA,CAAA,EAAIF,CAAI,CAAA,iGAAA,CAAmG,EAClIG,EAAAA,CAAa,IAAI,GAAA,CAAI,CAAC,OAAQ,OAAA,CAAS,UAAA,CAAY,UAAA,CAAY,cAAc,CAAC,CAAA,CAC9EC,EAAAA,CAAU,IAAI,GAAA,CAAsC,CACxD,CAAC,OAAA,CAAS,CAACN,GAAOzB,CAAAA,CAAc,KAAA,CAAOuB,EAAgB,CAAC,EACxD,CAAC,MAAA,CAAQ,CAACK,EAAAA,CAAW5B,EAAc,IAAA,CAAMsB,CAAiB,CAAC,CAAA,CAC3D,CAAC,UAAA,CAAY,CAACO,EAAAA,CAAW7B,EAAc,QAAA,CAAUsB,CAAiB,CAAC,CACrE,CAAC,EAEM,SAASU,EAAAA,CAAed,CAAAA,CAAkBZ,EAAyB,CACxE,GAAIY,CAAAA,CAAM,IAAA,GAAS,QAAA,EAAY,OAAOZ,CAAAA,EAAU,QAAA,EAAY,CAACoB,EAAAA,CAAQ,IAAA,CAAKpB,CAAK,CAAA,CAAG,OAAOA,CAAAA,CACzF,IAAM2B,CAAAA,CAAS,MAAA,CAAO3B,CAAK,CAAA,CAC3B,OAAO,MAAA,CAAO,QAAA,CAAS2B,CAAM,CAAA,CAAIA,CAAAA,CAAS3B,CAC5C,CAEA,SAAS4B,CAAAA,CAAShB,CAAAA,CAAkBZ,CAAAA,CAAyB,CAC3D,OAAO,CAACY,CAAAA,CAAM,OAAA,EAAWA,EAAM,OAAA,CAAQ,IAAA,CAAMiB,CAAAA,EAAWA,CAAAA,CAAO,KAAA,GAAU7B,CAAK,CAChF,CAEA,SAAS8B,CAAAA,CAAYlB,CAAAA,CAAkBZ,CAAAA,CAA8B,CACnE,IAAM+B,CAAAA,CAAM,IAAA,CAAK,GAAA,CAAIf,CAAAA,CAAmBJ,EAAM,UAAA,EAAY,SAAA,EAAaI,CAAiB,CAAA,CACxF,OAAIhB,CAAAA,CAAM,MAAA,EAAU+B,CAAAA,CAAY,KACzBnB,CAAAA,CAAM,UAAA,EAAY,gBAAA,EAAoBjB,CAAAA,CAAkB,YAAa,CAAE,GAAA,CAAAoC,CAAI,CAAC,CACrF,CAEA,SAASC,EAAAA,CAAiBpB,CAAAA,CAAkBZ,CAAAA,CAA+B,CACzE,OAAK,KAAA,CAAM,QAAQA,CAAK,CAAA,CACpBA,CAAAA,CAAM,MAAA,EAAUY,EAAM,OAAA,EAAS,MAAA,EAAUM,EAAAA,CAAAA,CAAmBxB,CAAAA,CAAc,OAChEM,CAAAA,CAAM,KAAA,CAAOiC,CAAAA,EAAS,OAAOA,CAAAA,EAAS,QAAA,EAAYA,CAAAA,CAAK,MAAA,EAAUjB,GAAqBY,CAAAA,CAAShB,CAAAA,CAAOqB,CAAI,CAAC,EAC1G,IAAA,CAAOvC,CAAAA,CAAc,MAAA,CAHFA,CAAAA,CAAc,OAIlD,CAEA,SAASwC,CAAAA,CAAYtB,CAAAA,CAAkBZ,CAAAA,CAAgBmC,CAAAA,CAAgC,CACrF,OAAO,OAAOnC,CAAAA,EAAU,QAAA,CAAW8B,CAAAA,CAAYlB,CAAAA,CAAOZ,CAAK,CAAA,CAAImC,CACjE,CAEA,SAASC,GAAYxB,CAAAA,CAAkBZ,CAAAA,CAAgB,CAACqC,CAAAA,CAAQF,CAAAA,CAASJ,CAAG,CAAA,CAA4C,CACtH,OAAI,OAAO/B,CAAAA,EAAU,QAAA,CAAiBmC,CAAAA,CAC/BL,EAAYlB,CAAAA,CAAOZ,CAAK,CAAA,GAAMA,CAAAA,CAAM,QAAU+B,CAAAA,EAAOM,CAAAA,CAAO,IAAA,CAAKrC,CAAK,CAAA,CAAI,IAAA,CAAOmC,CAAAA,CAC1F,CAEA,SAASG,EAAAA,CAAe1B,CAAAA,CAAkBZ,CAAAA,CAA+B,CACvE,OAAI,OAAOA,CAAAA,EAAU,SAAA,EAAc,OAAOA,CAAAA,EAAU,QAAA,EAAY,MAAA,CAAO,QAAA,CAASA,CAAK,CAAA,CAAW,IAAA,CACzFkC,CAAAA,CAAYtB,EAAOZ,CAAAA,CAAON,CAAAA,CAAc,KAAK,CACtD,CAEA,SAASK,EAAAA,CAAQa,CAAAA,CAAkBZ,CAAAA,CAAyB,CAC1D,OAAOA,CAAAA,EAAS,IAAA,EAAQA,CAAAA,GAAU,EAAA,EAAOY,CAAAA,CAAM,IAAA,GAAS,aAAA,EAAiB,MAAM,OAAA,CAAQZ,CAAK,CAAA,EAAK,CAACA,EAAM,MAC1G,CAEO,SAASuC,EAAAA,CAAU3B,EAAkBZ,CAAAA,CAA+B,CACzE,GAAID,EAAAA,CAAQa,CAAAA,CAAOZ,CAAK,CAAA,CAAG,OAAO,KAClC,GAAIc,CAAAA,CAAc,QAAA,CAASF,CAAAA,CAAM,IAAI,CAAA,CAAG,OAAO,OAAOZ,CAAAA,EAAU,UAAY,IAAA,CAAON,CAAAA,CAAc,OAAA,CACjG,GAAIkB,CAAAA,CAAM,IAAA,GAAS,QAAA,CAAU,OAAO,OAAOZ,CAAAA,EAAU,QAAA,EAAY,MAAA,CAAO,QAAA,CAASA,CAAK,CAAA,CAAI,IAAA,CAAON,CAAAA,CAAc,MAAA,CAC/G,GAAIkB,CAAAA,CAAM,IAAA,GAAS,aAAA,CAAe,OAAOoB,EAAAA,CAAiBpB,CAAAA,CAAOZ,CAAK,CAAA,CACtE,GAAIY,CAAAA,CAAM,IAAA,GAAS,MAAA,CAAQ,OAAOsB,EAAYtB,CAAAA,CAAOZ,CAAAA,CAAON,CAAAA,CAAc,IAAI,EAC9E,IAAM2C,CAAAA,CAASZ,EAAAA,CAAQ,GAAA,CAAIb,CAAAA,CAAM,IAAI,CAAA,CACrC,OAAIyB,EAAeD,EAAAA,CAAYxB,CAAAA,CAAOZ,CAAAA,CAAOqC,CAAM,EAC/CzB,CAAAA,CAAM,IAAA,GAAS,QAAA,EAAYA,CAAAA,CAAM,OAAS,OAAA,CAAgBsB,CAAAA,CAAYtB,CAAAA,CAAOZ,CAAAA,CAAON,CAAAA,CAAc,MAAM,CAAA,GAAMkC,CAAAA,CAAShB,EAAOZ,CAAK,CAAA,CAAI,IAAA,CAAON,CAAAA,CAAc,QACzJ8B,EAAAA,CAAW,GAAA,CAAIZ,CAAAA,CAAM,IAAI,EAAIsB,CAAAA,CAAYtB,CAAAA,CAAOZ,CAAAA,CAAON,CAAAA,CAAc,MAAM,CAAA,CAAI4C,EAAAA,CAAe1B,CAAAA,CAAOZ,CAAK,CACnH,CAEO,SAASwC,CAAAA,CAAgB5B,EAAkBZ,CAAAA,CAA+B,CAC/E,OAAIY,CAAAA,CAAM,OAAS,MAAA,EAAU,CAACG,EAAAA,CAAe,QAAA,CAASH,CAAAA,CAAM,IAAI,CAAA,CAAU,IAAA,CACnE2B,GAAU3B,CAAAA,CAAM,WAAA,CAAc,CAAE,GAAGA,EAAO,OAAA,CAAS,MAAU,CAAA,CAAIA,CAAAA,CAAOZ,CAAK,CACtF,CClEA,SAASyC,EAAAA,CAAQzC,CAAAA,CAAgBY,CAAAA,CAA2B,CAC1D,OAAOb,EAAQC,CAAK,CAAA,EAAMA,CAAAA,GAAU,KAAA,EAASc,EAAc,QAAA,CAASF,CAAAA,CAAM,IAAI,CAChF,CAEA,SAAS8B,CAAAA,CACPC,CAAAA,CACA/C,CAAAA,CACAgD,CAAAA,CACAC,CAAAA,CACoB,CACpB,IAAMC,EAAMF,CAAAA,CAAM,CAAA,GAAA,EAAMhD,CAAI,CAAA,CAAE,EACxBmC,CAAAA,CAAMa,CAAAA,CAAM,CAAA,GAAA,EAAMhD,CAAI,EAAE,CAAA,CAC9B,GAAIkD,CAAAA,GAAQ,MAAA,EAAaH,CAAAA,CAAOG,CAAAA,CAAK,OAAOF,CAAAA,CAAM,MAAMhD,CAAI,CAAA,OAAA,CAAS,CAAA,EAAKD,CAAAA,CAAkB,MAAMC,CAAI,CAAA,CAAA,CAAI,CAAE,GAAA,CAAAkD,EAAK,IAAA,CAAAD,CAAK,CAAC,CAAA,CACvH,GAAId,CAAAA,GAAQ,MAAA,EAAaY,CAAAA,CAAOZ,EAAK,OAAOa,CAAAA,CAAM,CAAA,GAAA,EAAMhD,CAAI,SAAS,CAAA,EAAKD,CAAAA,CAAkB,CAAA,GAAA,EAAMC,CAAI,GAAI,CAAE,GAAA,CAAAmC,CAAAA,CAAK,IAAA,CAAAc,CAAK,CAAC,CAEzH,CAEA,SAASE,EAAAA,CAAa/C,CAAAA,CAAgB4C,CAAAA,CAA4C,CAChF,GAAIA,CAAAA,CAAM,OAAA,GAAY,MAAA,CACtB,GAAI,CACF,OAAO,IAAI,MAAA,CAAOA,CAAAA,CAAM,OAAO,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO5C,CAAK,CAAC,CAAA,CAAI,KAAA,CAAA,CAAY4C,CAAAA,CAAM,gBAAkBjD,CAAAA,CAAkB,SAAS,CACxH,CAAA,KAAQ,CACN,MACF,CACF,CAEO,SAASqD,CAAAA,CACdpC,CAAAA,CACAZ,CAAAA,CACAiD,CAAAA,CACAC,EACe,CACf,IAAMN,CAAAA,CAAQhC,CAAAA,CAAM,YAAc,EAAC,CAC7BuC,CAAAA,CAAeP,CAAAA,CAAM,mBAAqBjD,CAAAA,CAAkB,YAAY,CAAA,CAC9E,GAAI8C,EAAAA,CAAQzC,CAAAA,CAAOY,CAAK,CAAA,CACtB,OAAIgC,CAAAA,CAAM,QAAA,CAAiB,OAAOA,CAAAA,CAAM,UAAa,QAAA,CAAWA,CAAAA,CAAM,QAAA,CAAWjD,CAAAA,CAAkB,UAAU,CAAA,CACtGiD,CAAAA,CAAM,UAAA,GAAe,MAAA,EAAa,CAAC7C,CAAAA,CAAQkD,CAAAA,CAAUL,CAAAA,CAAM,UAAU,CAAC,CAAA,CAAIO,CAAAA,CAAe,IAAA,CAElG,IAAMC,CAAAA,CAAYZ,CAAAA,CAAgB5B,CAAAA,CAAOZ,CAAK,EAC9C,GAAIoD,CAAAA,CAAW,OAAOA,CAAAA,CACtB,IAAMC,CAAAA,CAAY,OAAOrD,CAAAA,EAAU,UAAY,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CAC9D0C,EAAW1C,CAAAA,CAAM,MAAA,CAAQ,QAAA,CAAU4C,CAAAA,CAAO,MAAM,OAAA,CAAQ5C,CAAK,CAAA,CAAI,OAAA,CAAU,MAAS,CAAA,CACpF,OAAOA,CAAAA,EAAU,SAAW0C,CAAAA,CAAW1C,CAAAA,CAAO,EAAA,CAAI4C,CAAK,EAAI,MAAA,CACzDU,CAAAA,CAAaV,CAAAA,CAAM,UAAA,GAAe,QAAa5C,CAAAA,GAAUiD,CAAAA,CAAUL,CAAAA,CAAM,UAAU,CAAA,CAAIO,CAAAA,CAAe,MAAA,CAC5G,OAAA,CAAQE,GACHN,EAAAA,CAAa/C,CAAAA,CAAO4C,CAAK,CAAA,EACzBU,IACCV,CAAAA,CAAM,SAAA,CAAYM,CAAAA,GAAaN,CAAAA,CAAM,SAAS,CAAA,GAAI5C,CAAAA,CAAOiD,CAAS,CAAA,CAAI,MAAA,CAAA,GAAe,IAC7F,CCvDO,SAASM,EACdC,CAAAA,CACAhD,CAAAA,CACA0C,CAAAA,CACwB,CACxB,OAAOO,CAAAA,CAAeD,CAAAA,CAAK,MAAA,CAAQhD,CAAAA,CAAQ0C,CAAU,CACvD,CAEO,SAASO,CAAAA,CACdC,CAAAA,CACAlD,CAAAA,CACA0C,CAAAA,CACwB,CACxB,IAAMS,CAAAA,CAAiC,EAAC,CAExC,IAAA,IAAW/C,KAAS8C,CAAAA,CAAQ,CAC1B,GAAI,CAAC/C,EAAUC,CAAAA,CAAOJ,CAAM,CAAA,CAAG,SAE/B,IAAMf,CAAAA,CAAQuD,CAAAA,CAAmBpC,CAAAA,CAAOJ,EAAOI,CAAAA,CAAM,GAAG,CAAA,CAAGJ,CAAAA,CAAQ0C,CAAU,CAAA,CACzEzD,CAAAA,GACFkE,CAAAA,CAAO/C,CAAAA,CAAM,GAAG,CAAA,CAAInB,CAAAA,EAExB,CAEA,OAAOkE,CACT,CC3BO,SAASC,EAAAA,CAAgBC,EAAuD,CACrF,OAAO,CAAC,GAAIA,EAAO,IAAA,EAAQ,EAAC,CAAI,GAAIA,EAAO,OAAA,EAAW,EAAG,CAAA,CAAE,GAAA,CAAKtD,CAAAA,EAAcA,CAAAA,CAAU,KAAK,CAC/F,CAEO,SAASuD,EAAAA,CAAaC,CAAAA,CAAyC,CACpE,OAAOA,CAAAA,CAAW,KAAA,EAAO,MAAA,CAASA,EAAW,KAAA,CAAM,OAAA,CAASP,CAAAA,EAASA,CAAAA,CAAK,MAAM,CAAA,CAAIO,CAAAA,CAAW,MAAA,EAAU,EAC3G,CAEO,SAASC,CAAAA,CACdN,EACAO,CAAAA,CACyB,CACzB,IAAMzD,CAAAA,CAAkC,EAAC,CACzC,IAAA,IAAWI,CAAAA,IAAS8C,CAAAA,CACd9C,CAAAA,CAAM,YAAA,GAAiB,MAAA,GAAWJ,CAAAA,CAAOI,EAAM,GAAG,CAAA,CAAIA,CAAAA,CAAM,YAAA,CAAA,CAElE,OAAO,MAAA,CAAO,MAAA,CAAOJ,CAAAA,CAAQyD,CAAa,CAC5C,CAEO,SAASC,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACa,CACb,IAAMC,CAAAA,CAAO,IAAI,GAAA,CAAI,CAAC,GAAG,MAAA,CAAO,KAAKF,CAAQ,CAAA,CAAG,GAAG,MAAA,CAAO,KAAKC,CAAI,CAAC,CAAC,CAAA,CACrE,OAAO,IAAI,GAAA,CAAI,CAAC,GAAGC,CAAI,CAAA,CAAE,MAAA,CAAQC,CAAAA,EAAQ,CAAC,MAAA,CAAO,EAAA,CAAGH,CAAAA,CAASG,CAAG,EAAGF,CAAAA,CAAKE,CAAG,CAAC,CAAC,CAAC,CAChF,CCzBA,SAASC,EAAWC,CAAAA,CAAiC,CACnD,OAAOA,CAAAA,CAAO,aAAa,GAAA,CAAKhB,CAAAA,EAASA,CAAAA,CAAK,EAAE,EAAE,IAAA,CAAK;AAAA,CAAI,CAC7D,CAEO,SAASiB,CAAAA,CAAmBD,EAAyBE,CAAAA,CAAiD,CAC3G,IAAMC,CAAAA,CAAOJ,CAAAA,CAAWC,CAAM,EAC9B,OAAO,IAAMD,CAAAA,CAAWC,CAAM,CAAA,GAAMG,CAAAA,EAAQ,OAAO,IAAA,CAAKD,CAAO,CAAA,CAAE,IAAA,CAC9DJ,CAAAA,EAAQI,CAAAA,CAAQJ,CAAG,CAAA,GAAM,MAAA,EAAa,CAAC,MAAA,CAAO,EAAA,CAAGE,EAAO,MAAA,CAAOF,CAAG,CAAA,CAAGI,CAAAA,CAAQJ,CAAG,CAAC,CACpF,CACF,CCPO,SAASM,CAAAA,CAAsBJ,CAAAA,CAAyBb,CAAAA,CAAgCkB,EAAW,KAAA,CAAa,CACrH,IAAMC,CAAAA,CAAiBN,CAAAA,CAAO,MAAA,CAC9BA,EAAO,KAAA,CAAM,MAAA,CAAS,EAAC,CACvBA,CAAAA,CAAO,MAAM,cAAA,CAAiB,EAAC,CAC/B,IAAA,GAAW,CAACF,CAAAA,CAAKnC,CAAO,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQwB,CAAM,CAAA,CAC5Ca,CAAAA,CAAO,WAAW,WAAA,CAAYF,CAAAA,CAAKE,CAAAA,CAAO,MAAM,CAAA,CAAGA,CAAAA,CAAO,OAAOF,CAAG,CAAA,CAAInC,EACvEqC,CAAAA,CAAO,cAAA,CAAe,KAAKrC,CAAO,CAAA,CAEzC,IAAM4C,CAAAA,CAAmBF,CAAAA,EAAYG,CAAAA,CAAiBR,EAAQb,CAAM,CAAA,CACpEa,CAAAA,CAAO,MAAA,CAAO,CAAE,SAAA,CAAWN,EAAeY,CAAAA,CAAgBN,CAAAA,CAAO,MAAM,CAAA,CAAG,gBAAA,CAAAO,CAAiB,CAAC,EAC9F,CAEA,SAASC,CAAAA,CAAiBR,CAAAA,CAAyBb,EAAyC,CAC1F,IAAMsB,CAAAA,CAAgB,MAAA,CAAO,IAAA,CAAKtB,CAAM,EAAE,IAAA,CAAMW,CAAAA,EAAQE,CAAAA,CAAO,MAAA,CAAOF,CAAG,CAAA,GAAM,MAAS,CAAA,CAClFY,CAAAA,CAAcD,CAAAA,EAAiBT,CAAAA,CAAO,WAAA,CACxCA,CAAAA,CAAO,WAAW,aAAA,CAAcS,CAAAA,CAAeT,EAAO,MAAA,CAAQA,CAAAA,CAAO,gBAAgB,CAAA,CACrF,IAAA,CACJ,OAAIU,CAAAA,GAAgB,IAAA,EAAQA,CAAAA,GAAgBV,EAAO,gBAAA,CAAyB,KAAA,EAC5EA,CAAAA,CAAO,KAAA,CAAM,gBAAA,CAAmBU,CAAAA,CACzB,KACT,CAEO,SAASC,EAAAA,CAAyBX,CAAAA,CAAyBF,CAAAA,CAAuB,CACvF,IAAMc,CAAAA,CAAoB,GAC1B,IAAA,IAAWxE,CAAAA,IAAS4D,EAAO,UAAA,CAAW,SAAA,CAChC5D,CAAAA,CAAM,UAAA,EAAY,UAAA,GAAe0D,CAAAA,EAAOE,EAAO,MAAA,CAAO5D,CAAAA,CAAM,GAAG,CAAA,GAAM,MAAA,EACrEoC,CAAAA,CAAmBpC,EAAO4D,CAAAA,CAAO,MAAA,CAAO5D,CAAAA,CAAM,GAAG,CAAA,CAAGyE,CAAAA,CAAoBb,CAAM,CAAA,CAAGA,CAAAA,CAAO,UAAU,CAAA,GACtG,OAAOA,CAAAA,CAAO,OAAO5D,CAAAA,CAAM,GAAG,CAAA,CAC9BwE,CAAAA,CAAQ,IAAA,CAAKxE,CAAAA,CAAM,GAAG,CAAA,CAAA,CAExB,OAAOwE,CACT,CAEO,SAASE,CAAAA,CAAmBd,EAAmC,CACpE,IAAMe,CAAAA,CAAa,IAAI,GAAA,CAAIf,CAAAA,CAAO,aAAa,OAAA,CAAShB,CAAAA,EAASA,EAAK,MAAA,CAAO,GAAA,CAAK5C,GAAUA,CAAAA,CAAM,GAAG,CAAC,CAAC,CAAA,CACjG4E,CAAAA,CAAS,OAAO,IAAA,CAAKhB,CAAAA,CAAO,MAAM,CAAA,CAAE,MAAA,CAAQF,CAAAA,EAAQ,CAACiB,CAAAA,CAAW,GAAA,CAAIjB,CAAG,CAAC,CAAA,CAC9E,IAAA,IAAWA,KAAOkB,CAAAA,CAAQ,OAAOhB,EAAO,MAAA,CAAOF,CAAG,EAClD,OAAOkB,CACT,CAEO,SAASH,CAAAA,CAAoBb,CAAAA,CAAkD,CACpF,OAAOiB,CAAAA,CAAgBjB,CAAM,CAC/B,CAEA,SAASkB,GAAelB,CAAAA,CAAyBhE,CAAAA,CAA0D,CACzG,IAAA,IAAW8D,CAAAA,IAAO,CAAC,GAAGE,CAAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAK,CAAG,OAAOhE,CAAAA,CAAO8D,CAAG,CAAA,CACxE,OAAO9D,CACT,CAEO,SAASmF,CAAAA,CAAanB,CAAAA,CAAyBK,CAAAA,CAAW,KAAA,CAA+B,CAC9F,IAAMC,CAAAA,CAAiBN,CAAAA,CAAO,MAAA,CACxBb,CAAAA,CAAiC,GACvC,GAAIa,CAAAA,CAAO,WAAA,CACT,IAAA,IAAWhB,CAAAA,IAAQgB,CAAAA,CAAO,aACpBA,CAAAA,CAAO,OAAA,CAAQ,GAAA,CAAIhB,CAAAA,CAAK,EAAE,CAAA,EAC9B,OAAO,MAAA,CAAOG,CAAAA,CAAQJ,CAAAA,CAAaC,CAAAA,CAAM6B,CAAAA,CAAoBb,CAAM,EAAGA,CAAAA,CAAO,UAAU,CAAC,CAAA,CAAA,KAG1F,MAAA,CAAO,MAAA,CACLb,EACAF,CAAAA,CAAee,CAAAA,CAAO,WAAW,MAAA,EAAU,GAAIa,CAAAA,CAAoBb,CAAM,CAAA,CAAGA,CAAAA,CAAO,UAAU,CAC/F,EAEFA,CAAAA,CAAO,KAAA,CAAM,MAAA,CAASb,CAAAA,CACtB,IAAMoB,CAAAA,CAAmBF,GAAYG,CAAAA,CAAiBR,CAAAA,CAAQb,CAAM,CAAA,CACpE,OAAAa,CAAAA,CAAO,OAAO,CAAE,SAAA,CAAWN,EAAeY,CAAAA,CAAgBnB,CAAM,EAAG,gBAAA,CAAAoB,CAAiB,CAAC,CAAA,CAC9EpB,CACT,CAEO,SAASiC,EAAAA,CAAYpB,CAAAA,CAAyBF,CAAAA,CAA4B,CAC/E,IAAM1D,CAAAA,CAAQ4D,EAAO,UAAA,CAAW,WAAA,CAAYF,CAAAA,CAAKE,CAAAA,CAAO,MAAM,CAAA,CAC9D,GAAI,CAAC5D,CAAAA,CAAO,OAAO,IAAA,CACnB,IAAMiF,EAAgBrB,CAAAA,CAAO,MAAA,CAAOF,CAAG,CAAA,CACjC7E,CAAAA,CAAQuD,CAAAA,CAAmBpC,EAAO4D,CAAAA,CAAO,MAAA,CAAOF,CAAG,CAAA,CAAGe,CAAAA,CAAoBb,CAAM,EAAGA,CAAAA,CAAO,UAAU,CAAA,CACtG/E,CAAAA,CAAO+E,CAAAA,CAAO,MAAA,CAAOF,CAAG,CAAA,CAAI7E,CAAAA,CAC3B,OAAO+E,CAAAA,CAAO,MAAA,CAAOF,CAAG,EAC7B,IAAMwB,CAAAA,CAAY,MAAA,CAAO,EAAA,CAAGD,CAAAA,CAAerB,CAAAA,CAAO,OAAOF,CAAG,CAAC,CAAA,CAAI,EAAC,CAAI,CAACA,CAAG,CAAA,CAC1E,OAAAE,CAAAA,CAAO,MAAA,CAAO,CAAE,SAAA,CAAAsB,CAAU,CAAC,CAAA,CACpBrG,CACT,CAEO,SAASgG,EAAgBjB,CAAAA,CAAkD,CAChF,OAAOkB,EAAAA,CAAelB,CAAAA,CAAQ,CAAE,GAAGA,CAAAA,CAAO,UAAA,CAAW,eAAA,CAAgBA,CAAAA,CAAO,MAAM,CAAE,CAAC,CACvF,CAEO,SAASuB,EAAAA,CAAYvB,CAAAA,CAAyBhE,CAAAA,CAAwC,CAC3F,IAAMwF,CAAAA,CAAiBxB,EAAO,MAAA,CACxBM,CAAAA,CAAiBN,EAAO,MAAA,CACxByB,CAAAA,CAAgB,MAAA,CAAO,IAAA,CAAKzB,CAAAA,CAAO,YAAY,EACrDA,CAAAA,CAAO,eAAA,EAAA,CACPA,CAAAA,CAAO,cAAA,EAAA,CACPA,CAAAA,CAAO,KAAA,CAAM,WAAa,KAAA,CAC1BA,CAAAA,CAAO,KAAA,CAAM,MAAA,CAASR,CAAAA,CAAaQ,CAAAA,CAAO,WAAW,SAAA,CAAWhE,CAAM,EACtEgE,CAAAA,CAAO,KAAA,CAAM,OAAS,EAAC,CACvBA,CAAAA,CAAO,KAAA,CAAM,cAAA,CAAiB,GAC9BA,CAAAA,CAAO,KAAA,CAAM,YAAA,CAAe,EAAC,CAC7BA,CAAAA,CAAO,MAAM,cAAA,CAAiB,KAAA,CAC9BA,CAAAA,CAAO,KAAA,CAAM,gBAAA,CAAmB,CAAA,CAChCA,EAAO,OAAA,CAAQ,KAAA,GACfA,CAAAA,CAAO,UAAA,CAAW,gBAAgBA,CAAAA,CAAO,MAAA,CAAQA,CAAAA,CAAO,MAAM,CAAA,CAC9D,IAAM0B,EAAgBhC,CAAAA,CAAe8B,CAAAA,CAAgBxB,CAAAA,CAAO,MAAM,CAAA,CAC5D2B,CAAAA,CAAgB,IAAI,GAAA,CAAI,CAC5B,GAAGD,CAAAA,CACH,GAAGhC,CAAAA,CAAeY,EAAgBN,CAAAA,CAAO,MAAM,EAC/C,GAAGyB,CACL,CAAC,CAAA,CACDzB,CAAAA,CAAO,MAAA,CAAO,CACZ,SAAA,CAAW2B,CAAAA,CACX,iBAAkB,IAAA,CAClB,aAAA,CAAeD,CAAAA,CAAc,IAAA,CAAO,CACtC,CAAC,EACH,CChHO,SAASE,CAAAA,CAAYrC,CAAAA,CAA4BvD,CAAAA,CAA6C,CACnG,IAAM6F,CAAAA,CAAQtC,CAAAA,CAAW,OAAS,EAAC,CAC7BuC,EAAU,IAAI,GAAA,CAAID,CAAAA,CAAM,GAAA,CAAI,CAAC7C,CAAAA,CAAM+C,IAAU,CAAC/C,CAAAA,CAAK,EAAA,CAAI+C,CAAK,CAAC,CAAC,EAC9DC,CAAAA,CAAqB,EAAC,CACtBC,CAAAA,CAAqC,EAAC,CAC5C,QAASF,CAAAA,CAAQ,CAAA,CAAGA,EAAQF,CAAAA,CAAM,MAAA,EAAS,CACzC,IAAM7C,CAAAA,CAAO6C,CAAAA,CAAME,CAAK,CAAA,CACxB,GAAI,CAAC5F,CAAAA,CAAU6C,CAAAA,CAAMiD,CAAS,CAAA,CAAG,CAAEF,CAAAA,EAAAA,CAAS,QAAU,CACtDC,CAAAA,CAAO,IAAA,CAAKhD,CAAI,CAAA,CAChB,MAAA,CAAO,OAAOiD,CAAAA,CAAWC,CAAAA,CAAWlD,CAAAA,CAAMhD,CAAAA,CAAQiG,CAAS,CAAC,EAC5D,IAAME,CAAAA,CAAQnD,CAAAA,CAAK,MAAA,EAAQ,IAAA,CAAMmD,CAAAA,EAC/BhG,EAAUgG,CAAAA,CAAOF,CAAS,CAAA,GAAME,CAAAA,CAAM,EAAA,GAAO,IAAA,EAAA,CAAUL,EAAQ,GAAA,CAAIK,CAAAA,CAAM,EAAE,CAAA,EAAK,EAAA,EAAMJ,CAAAA,EACjF5F,EAAU0F,CAAAA,CAAMC,CAAAA,CAAQ,IAAIK,CAAAA,CAAM,EAAE,CAAE,CAAA,CAAGF,CAAS,CAAA,CACxD,CAAA,CACD,GAAIE,CAAAA,EAAO,KAAO,IAAA,CAAM,MACxBJ,CAAAA,CAAQI,CAAAA,CAAQL,CAAAA,CAAQ,GAAA,CAAIK,EAAM,EAAE,CAAA,CAAKJ,CAAAA,CAAQ,EACnD,CACA,OAAOC,CACT,CAEO,SAASI,GAAmBzC,CAAAA,CAAsBC,CAAAA,CAAkBmC,EAAuB,CAChG,IAAMM,CAAAA,CAAe1C,CAAAA,CAASoC,CAAK,CAAA,EAAKpC,EAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,CAC9D2C,CAAAA,CAAY1C,CAAAA,CAAK,UAAWZ,CAAAA,EAASA,CAAAA,CAAK,EAAA,GAAOqD,CAAAA,EAAc,EAAE,CAAA,CACvE,GAAIC,CAAAA,GAAc,EAAA,CAAI,OAAOA,CAAAA,CAC7B,IAAMC,EAAU,IAAI,GAAA,CAAI3C,CAAAA,CAAK,GAAA,CAAI,CAACZ,CAAAA,CAAM+C,IAAU,CAAC/C,CAAAA,CAAK,EAAA,CAAI+C,CAAK,CAAC,CAAC,EACnE,IAAA,IAASS,CAAAA,CAAS,IAAA,CAAK,GAAA,CAAIT,CAAAA,CAAQ,CAAA,CAAGpC,EAAS,MAAA,CAAS,CAAC,CAAA,CAAG6C,CAAAA,EAAU,CAAA,CAAGA,CAAAA,EAAAA,CAAU,CACjF,IAAMC,CAAAA,CAAcF,CAAAA,CAAQ,GAAA,CAAI5C,CAAAA,CAAS6C,CAAM,EAAE,EAAE,CAAA,CACnD,GAAIC,CAAAA,GAAgB,MAAA,CAAW,OAAOA,CACxC,CACA,OAAO,CACT,CAEA,SAASP,CAAAA,CAAWlD,EAA+BhD,CAAAA,CAAiC2D,CAAAA,CAAmC,CACrH,IAAM+C,CAAAA,CAAa,CAAE,GAAG/C,CAAS,CAAA,CACjC,IAAA,IAAWvD,CAAAA,IAAS4C,CAAAA,CAAK,OAAQ0D,CAAAA,CAAWtG,CAAAA,CAAM,GAAG,CAAA,CAAIJ,CAAAA,CAAOI,CAAAA,CAAM,GAAG,CAAA,CACzE,IAAM4F,CAAAA,CAAkC,EAAC,CACzC,IAAA,IAAW5F,KAAS4C,CAAAA,CAAK,MAAA,CACnB7C,EAAUC,CAAAA,CAAOsG,CAAU,GAAK1G,CAAAA,CAAOI,CAAAA,CAAM,GAAG,CAAA,GAAM,MAAA,GAAW4F,CAAAA,CAAO5F,EAAM,GAAG,CAAA,CAAIJ,CAAAA,CAAOI,CAAAA,CAAM,GAAG,CAAA,CAAA,CAE3G,OAAO4F,CACT,CAEO,SAASW,EAAAA,CAAiBpD,CAAAA,CAA4B,CAC3D,IAAIF,CAAAA,CAAyC,IAAA,CACzCwC,EAAoB,EAAC,CACrBe,EAAkC,EAAC,CACjCC,CAAAA,CAAW7G,CAAAA,EAAoC,CACnD,GAAIqD,IAAWrD,CAAAA,CAAQ,OACvBqD,CAAAA,CAASrD,CAAAA,CACT6F,CAAAA,CAAQD,CAAAA,CAAYrC,EAAYvD,CAAM,CAAA,CACtC,IAAMgG,CAAAA,CAAkC,EAAC,CACnCc,EAASvD,CAAAA,CAAW,KAAA,EAAO,MAAA,CAASsC,CAAAA,CAAQ,CAAC,CAAE,OAAQtC,CAAAA,CAAW,MAAA,EAAU,EAAG,CAAC,CAAA,CACtF,QAAWP,CAAAA,IAAQ8D,CAAAA,CAAQ,MAAA,CAAO,MAAA,CAAOd,CAAAA,CAAQE,CAAAA,CAAWlD,EAAMhD,CAAAA,CAAQgG,CAAM,CAAC,CAAA,CACjFY,CAAAA,CAASZ,EACX,EACA,OAAO,CACL,YAAmB,CAAE3C,CAAAA,CAAS,KAAM,CAAA,CACpC,KAAA,CAAMrD,CAAAA,CAA6C,CAAE,OAAA6G,CAAAA,CAAQ7G,CAAM,CAAA,CAAU6F,CAAO,CAAA,CACpF,MAAA,CAAO7F,CAAAA,CAA0D,CAAE,OAAA6G,CAAAA,CAAQ7G,CAAM,CAAA,CAAU4G,CAAQ,CACrG,CACF,CCzDA,SAASG,CAAAA,CAAY/C,EAAkD,CACrE,IAAMd,EAASc,CAAAA,CAAO,WAAA,EAAa,MAAA,EAAU,EAAC,CACxChE,CAAAA,CAAS,CAAE,GAAGgE,CAAAA,CAAO,MAAO,CAAA,CAClC,IAAA,GAAW,CAAE,IAAAF,CAAI,CAAA,GAAKZ,CAAAA,CAAQ,OAAOlD,CAAAA,CAAO8D,CAAG,EAC/C,OAAO,MAAA,CAAO,OAAO9D,CAAAA,CAAQwD,CAAAA,CAAaN,CAAM,CAAC,CACnD,CAEO,SAAS8D,CAAAA,CAAWhD,CAAAA,CAA+C,CACxE,OAAO4B,CAAAA,CAAY5B,CAAAA,CAAO,UAAA,CAAY+C,CAAAA,CAAY/C,CAAM,CAAC,CAAA,CAAEA,CAAAA,CAAO,gBAAA,CAAmB,CAAC,CACxF,CAEO,SAASiD,CAAAA,CAAgBjD,CAAAA,CAAmC,CACjE,IAAMhB,CAAAA,CAAOgB,EAAO,WAAA,CACdsB,CAAAA,CAAYtC,CAAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAE,GAAA,CAAAc,CAAI,CAAA,GAAMA,CAAG,CAAA,CAClDE,CAAAA,CAAO,MAAM,MAAA,CAAS+C,CAAAA,CAAY/C,CAAM,CAAA,CACxC,IAAA,IAAWF,CAAAA,IAAOwB,EAAW,OAAOtB,CAAAA,CAAO,OAAOF,CAAG,CAAA,CACrDE,EAAO,OAAA,CAAQ,GAAA,CAAIhB,CAAAA,CAAK,EAAA,CAAIsC,CAAS,CAAA,CACrCtB,EAAO,UAAA,CAAW,eAAA,CAAgBA,CAAAA,CAAO,MAAA,CAAQA,CAAAA,CAAO,MAAM,EAC9DA,CAAAA,CAAO,UAAA,CAAW,WAAA,CAAY,IAAA,CAAM,IAAI,CAAA,CACxC,IAAMgB,CAAAA,CAASF,CAAAA,CAAmBd,CAAM,CAAA,CACxC,OAAAA,EAAO,MAAA,CAAO,CAAE,SAAA,CAAW,CAAC,GAAGsB,CAAAA,CAAW,GAAGN,CAAM,CAAA,CAAG,gBAAA,CAAkB,IAAA,CAAM,aAAA,CAAe,IAAK,CAAC,CAAA,CAC5FM,CACT,CAEO,SAAS4B,CAAAA,CAAmBlD,CAAAA,CAA+B,CAChE,IAAMhB,CAAAA,CAAOgB,EAAO,WAAA,CAChBhB,CAAAA,EAAMgB,EAAO,OAAA,CAAQ,MAAA,CAAOhB,CAAAA,CAAK,EAAE,EACzC,CAEO,SAASmE,EAAAA,CAAWnD,CAAAA,CAAyB+B,CAAAA,CAAyB,CAC3E,OAAA/B,CAAAA,CAAO,MAAM,gBAAA,CAAmB+B,CAAAA,CAChC/B,CAAAA,CAAO,MAAA,CAAO,CAAE,gBAAA,CAAkB,IAAK,CAAC,CAAA,CACjCiD,CAAAA,CAAgBjD,CAAM,CAC/B,CChCA,eAAsBoD,CAAAA,CAAWpD,CAAAA,CAAyBqD,CAAAA,CAAkBC,CAAAA,CAAc,KAAA,CAAyB,CACjH,GAAItD,CAAAA,CAAO,UAAA,EAAcA,CAAAA,CAAO,cAAA,CAAgB,OAAO,MAAA,CAClDsD,GAAaJ,CAAAA,CAAmBlD,CAAM,CAAA,CAC3C,IAAMuD,CAAAA,CAAY,CAAE,GAAGvD,CAAAA,CAAO,SAAU,EACpCwD,CAAAA,CAAa,KAAA,CACXC,EAAQzD,CAAAA,CAAO,eAAA,CACf0D,CAAAA,CAAY,EAAE1D,CAAAA,CAAO,cAAA,CACvBhE,EAASiF,CAAAA,CAAgBjB,CAAM,CAAA,CAC7B2D,CAAAA,CAAgB1D,CAAAA,CAAmBD,CAAAA,CAAQhE,CAAM,CAAA,CACjD4H,CAAAA,CAAQ,IAAMH,CAAAA,GAAUzD,CAAAA,CAAO,eAAA,EAAmB0D,IAAc1D,CAAAA,CAAO,cAAA,EAAkB2D,GAAc,CAC7G3D,CAAAA,CAAO,MAAM,UAAA,CAAa,IAAA,CAC1BA,CAAAA,CAAO,MAAA,EAAO,CACd,GAAI,CAEF,GADI4D,CAAAA,EAAM,EACN,MAAA,CAAO,IAAA,CAAKzC,CAAAA,CAAanB,EAAQ,CAAA,CAAI,CAAC,CAAA,CAAE,MAAA,CAAS,CAAA,EAAK4D,CAAAA,GAAS,OAAO,CAAA,CAAA,CAC1E,GAAIL,CAAAA,CAAU,cAAA,CAAgB,CAC5B,IAAMM,CAAAA,CAAU,MAAMN,CAAAA,CAAU,cAAA,CAAevH,CAAM,EACrD,GAAI4H,CAAAA,EAAM,EAAKC,CAAAA,GAAY,CAAA,CAAA,CAAO,OAAO,EAC3C,CACA,GAAID,CAAAA,EAAM,CAAG,OAAO,CAAA,CAAA,CACpB,GAAIL,CAAAA,CAAU,cAAA,CAAgB,CAC5B,GAAI,MAAA,CAAO,IAAA,CAAKpC,EAAanB,CAAAA,CAAQ,CAAA,CAAI,CAAC,CAAA,CAAE,MAAA,CAAS,CAAA,EAAK4D,GAAM,CAAG,OAAO,CAAA,CAAA,CAC1E5H,CAAAA,CAASiF,CAAAA,CAAgBjB,CAAM,EACjC,CACAwD,CAAAA,CAAa,CAAA,CAAA,CACb,IAAMM,CAAAA,CAAe,CAAC,GAAG9D,CAAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAE9C,OADA,MAAMqD,CAAAA,CAAOrH,CAAAA,CAAQ,CAAC,GAAG8H,CAAY,CAAC,CAAA,CAClCJ,CAAAA,GAAc1D,CAAAA,CAAO,cAAA,EACzB,MAAMjF,CAAAA,CAAY,cAAe,IAAMwI,CAAAA,CAAU,aAAA,GAAgBvH,CAAAA,CAAQ8H,CAAY,CAAC,EAC/E,CAAA,CACT,CAAA,MAAS7I,EAAO,CACd,GAAI,CAACuI,CAAAA,EAAcI,CAAAA,EAAM,CAAG,OAAO,MAAA,CACnC,MAAM3I,CACR,CAAA,OAAE,CACIyI,CAAAA,GAAc1D,CAAAA,CAAO,cAAA,GACvBA,CAAAA,CAAO,MAAM,UAAA,CAAa,KAAA,CAC1BA,CAAAA,CAAO,MAAA,EAAO,EAElB,CACF,CCpCA,SAAS+D,CAAAA,CAAc/D,EAAkC,CACvD,IAAMhB,EAAOgB,CAAAA,CAAO,WAAA,CACpB,GAAI,CAAChB,CAAAA,CAAM,OAAO,MAClB,IAAMG,CAAAA,CAASJ,CAAAA,CAAaC,CAAAA,CAAM6B,CAAAA,CAAoBb,CAAM,EAAGA,CAAAA,CAAO,UAAU,CAAA,CAChF,GAAI,MAAA,CAAO,IAAA,CAAKb,CAAM,CAAA,CAAE,MAAA,GAAW,CAAA,CAAG,OAAO,MAAA,CAC7C,IAAMmB,EAAiB,CAAE,GAAGN,CAAAA,CAAO,MAAO,CAAA,CAC1C,OAAA,MAAA,CAAO,OAAOA,CAAAA,CAAO,MAAA,CAAQb,CAAM,CAAA,CACnCa,CAAAA,CAAO,MAAA,CAAO,CAAE,SAAA,CAAWN,CAAAA,CAAeY,CAAAA,CAAgBN,CAAAA,CAAO,MAAM,CAAE,CAAC,CAAA,CACnE,IACT,CAEA,SAASgE,CAAAA,CAAOhE,EAAyB+B,CAAAA,CAAqB,CAC5D/B,CAAAA,CAAO,eAAA,EAAA,CACPA,CAAAA,CAAO,KAAA,CAAM,iBAAmB+B,CAAAA,CAChC/B,CAAAA,CAAO,MAAA,CAAO,CAAE,gBAAA,CAAkB,IAAK,CAAC,EAC1C,CAEA,eAAsBiE,EAAAA,CAASjE,CAAAA,CAAyBqD,CAAAA,CAAqC,CAC3F,GAAI,CAACrD,EAAO,WAAA,EAAeA,CAAAA,CAAO,gBAAkBA,CAAAA,CAAO,UAAA,EAAc,CAACA,CAAAA,CAAO,WAAA,EAAa,IAAA,CAAM,OAAO,MAAA,CAC3G,GAAIgD,CAAAA,CAAWhD,CAAM,CAAA,CAAG,OAAOkE,GAAWlE,CAAAA,CAAQ,MAAA,CAAQ,MAAM,CAAA,CAChE,IAAMhB,CAAAA,CAAOgB,EAAO,WAAA,CACpB,GAAI,CAACqD,CAAAA,EAAU,CAACrE,EAAM,OAAO,MAAA,CAC7B,IAAMhD,CAAAA,CAASgE,CAAAA,CAAO,MAAA,CAChBb,EAAS,CAAE,GAAGa,CAAAA,CAAO,MAAO,CAAA,CAC9BmE,CAAAA,CAAY,MACV7C,CAAAA,CAAY2B,CAAAA,CAAgBjD,CAAM,CAAA,CAClCoE,CAAAA,CAAgBpE,CAAAA,CAAO,OACvBqE,CAAAA,CAASpE,CAAAA,CAAmBD,CAAAA,CAAQ,CAAE,GAAGoE,CAAc,CAAC,CAAA,CAC9D,GAAI,CACF,OAAO,MAAMhB,CAAAA,CAAWpD,EAAQ,MAAOsE,CAAAA,CAAWC,CAAAA,GAAY,CAC5D,MAAMlB,CAAAA,CAAOiB,EAAWC,CAAO,CAAA,CAC/BJ,CAAAA,CAAY,CAAA,EACd,CAAA,CAAG,CAAA,CAAI,CACT,CAAA,OAAE,CACI,CAACA,CAAAA,EAAanE,CAAAA,CAAO,SAAWoE,CAAAA,EAAiB,CAACC,CAAAA,EAAO,GAC3DrE,CAAAA,CAAO,KAAA,CAAM,OAAShE,CAAAA,CACtBgE,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAS,CAAE,GAAGb,EAAQ,GAAGa,CAAAA,CAAO,MAAO,CAAA,CACpDA,CAAAA,CAAO,OAAA,CAAQ,OAAOhB,CAAAA,CAAK,EAAE,EAC7BgB,CAAAA,CAAO,MAAA,CAAO,CAAE,SAAA,CAAAsB,CAAAA,CAAW,gBAAA,CAAkB,IAAA,CAAM,aAAA,CAAe,IAAK,CAAC,CAAA,EAE5E,CACF,CAEA,eAAsB4C,EAAAA,CAAWlE,CAAAA,CAAyBwE,EAA4BC,CAAAA,CAAsCD,CAAAA,CAA6B,CACvJ,IAAME,CAAAA,CAAWD,CAAAA,GAAW,OAE5B,GADI,CAACzE,EAAO,WAAA,EAAeA,CAAAA,CAAO,gBAAkBA,CAAAA,CAAO,UAAA,EACvD,CAAC0E,CAAAA,GAAaF,CAAAA,GAAc,MAAA,CAASxE,EAAO,UAAA,CAAaA,CAAAA,CAAO,WAAA,CAAA,CAAc,OAAO,MAAA,CACzF,IAAMhB,EAAOgB,CAAAA,CAAO,WAAA,CACd2E,CAAAA,CAAaH,CAAAA,GAAc,MAAA,EAAU,CAACE,EAE5C,GADIC,CAAAA,EAAYzB,CAAAA,CAAmBlD,CAAM,CAAA,CACrC2E,CAAAA,EAAcZ,EAAc/D,CAAM,CAAA,CAAG,OAAO,MAAA,CAChD,IAAMuD,CAAAA,CAAY,CAAE,GAAGvD,CAAAA,CAAO,SAAU,CAAA,CAClC4E,CAAAA,CAAW5E,CAAAA,CAAO,eACpBmE,CAAAA,CAAY,KAAA,CAEVU,CAAAA,CADY7E,CAAAA,CAAO,gBAAA,EACIwE,CAAAA,GAAc,OAAS,CAAA,CAAI,EAAA,CAAA,CAClDM,EAASJ,CAAAA,CAAW1B,CAAAA,CAAWhD,CAAM,CAAA,CAAIA,CAAAA,CAAO,YAAA,CAAa6E,CAAO,CAAA,CAC1E,GAAI,CAACC,CAAAA,CAAQ,OAAO,MAAA,CACpB,IAAMC,CAAAA,CAA6B,CAAE,WAAY/F,CAAAA,CAAK,EAAA,CAAI,QAAA,CAAU8F,CAAAA,CAAO,EAAA,CAAI,MAAA,CAAAL,EAAQ,MAAA,CAAQ,CAAE,GAAG5D,CAAAA,CAAoBb,CAAM,CAAE,CAAE,CAAA,CAC5HyD,EAAAA,CAAQzD,CAAAA,CAAO,eAAA,CACf0D,CAAAA,CAAY,EAAE1D,CAAAA,CAAO,cAAA,CACrB2D,EAAAA,CAAgB1D,CAAAA,CAAmBD,CAAAA,CAAQ+E,CAAAA,CAAQ,MAAM,CAAA,CACzDnB,CAAAA,CAAQ,IAAMH,EAAAA,GAAUzD,CAAAA,CAAO,eAAA,EAAmB0D,IAAc1D,CAAAA,CAAO,cAAA,EACxEA,EAAO,WAAA,EAAa,EAAA,GAAOhB,EAAK,EAAA,EAAM2E,EAAAA,EAAc,CACzD3D,CAAAA,CAAO,KAAA,CAAM,cAAA,CAAiB,KAC9BA,CAAAA,CAAO,MAAA,EAAO,CACd,GAAI,CACF,GAAI4D,GAAM,CAAG,OAAO,CAAA,CAAA,CACpB,GAAIe,CAAAA,EAAcC,CAAAA,CAAU,CAC1B,IAAM5C,CAAAA,CAAS,MAAM4C,CAAAA,CAAU5F,CAAAA,CAAK,EAAA,CAAI+F,EAAQ,MAAM,CAAA,CACtD,GAAInB,CAAAA,EAAM,CAAG,OAAO,GACpB,GAAI5B,CAAAA,EAAU,MAAA,CAAO,IAAA,CAAKA,CAAM,CAAA,CAAE,OAAS,CAAA,CACzC,OAAA5B,CAAAA,CAAsBJ,CAAAA,CAAQgC,CAAM,CAAA,CAC7B,EAEX,CACA,GAAIuB,EAAU,kBAAA,CAAoB,CAChC,IAAMM,CAAAA,CAAU,MAAMN,CAAAA,CAAU,kBAAA,CAAmBwB,CAAO,CAAA,CAC1D,GAAInB,CAAAA,EAAM,EAAKC,CAAAA,GAAY,CAAA,CAAA,CAAO,OAAO,CAAA,CAC3C,CAEA,OADID,CAAAA,EAAM,EACNe,CAAAA,EAAcZ,CAAAA,CAAc/D,CAAM,EAAU,CAAA,CAAA,EAChDmE,CAAAA,CAAY,GACRO,CAAAA,EAAUzB,CAAAA,CAAgBjD,CAAM,CAAA,CACpCgE,CAAAA,CAAOhE,CAAAA,CAAQ6E,CAAO,CAAA,CACtB,MAAM9J,EAAY,iBAAA,CAAmB,IAAMwI,CAAAA,CAAU,iBAAA,GAAoBwB,CAAO,CAAC,EAC1E,CAAA,CAAA,CACT,CAAA,MAAS9J,CAAAA,CAAO,CACd,GAAI,CAACkJ,GAAaP,CAAAA,EAAM,CAAG,OAAO,MAAA,CAClC,MAAM3I,CACR,CAAA,OAAE,CACIyI,CAAAA,GAAc1D,CAAAA,CAAO,cAAA,GACvBA,CAAAA,CAAO,MAAM,cAAA,CAAiB,KAAA,CAC9BA,CAAAA,CAAO,MAAA,EAAO,EAElB,CACF,CAEO,SAASgF,EAAAA,CAAkBhF,CAAAA,CAAyBiF,CAAAA,CAAwB,CACjF,GAAI,CAACjF,CAAAA,CAAO,WAAA,CAAa,OACzB,IAAMU,CAAAA,CAAcV,CAAAA,CAAO,WAAW,aAAA,CACpCiF,CAAAA,CACAjF,CAAAA,CAAO,MAAA,CACPA,CAAAA,CAAO,gBACT,EACIU,CAAAA,GAAgBV,CAAAA,CAAO,gBAAA,CAAkBA,CAAAA,CAAO,MAAA,EAAO,CAClDU,IAAgB,IAAA,EAAMsD,CAAAA,CAAOhE,CAAAA,CAAQU,CAAW,EAC3D","file":"chunk-YXQFFAXK.js","sourcesContent":["export class FormLifecycleError extends Error {\n readonly committed = true;\n readonly cause: unknown;\n\n constructor(readonly phase: 'afterStepChange' | 'afterSubmit', cause: unknown) {\n super(`The action completed, but ${phase} failed: ${cause instanceof Error ? cause.message : String(cause)}`);\n this.name = 'FormLifecycleError';\n this.cause = cause;\n }\n}\n\nexport async function afterCommit(phase: 'afterStepChange' | 'afterSubmit', callback: () => void | Promise<void>): Promise<void> {\n try { await callback(); }\n catch (error) { throw new FormLifecycleError(phase, error); }\n}\n","export const TYPE_MESSAGES = {\n email: 'Enter a valid email',\n number: 'Enter a number',\n boolean: 'Must be true or false',\n option: 'Select one of the available options',\n options: 'Must be a list of available options',\n string: 'Must be text',\n date: 'Enter a valid date',\n datetime: 'Enter a valid date and time',\n file: 'Must be a file reference',\n value: 'Invalid value',\n};\n\nexport type ValidationRule = 'required' | 'minLength' | 'maxLength' | 'min' | 'max' | 'pattern' | 'matchField';\n\nexport function getDefaultMessage(rule: ValidationRule, params?: Record<string, unknown>): string {\n switch (rule) {\n case 'required':\n return 'This field is required';\n case 'minLength':\n return `Must be at least ${params?.min} ${params?.unit ?? 'characters'}`;\n case 'maxLength':\n return `Must be at most ${params?.max} ${params?.unit ?? 'characters'}`;\n case 'min':\n return `Must be at least ${params?.min}`;\n case 'max':\n return `Must be at most ${params?.max}`;\n case 'pattern':\n return 'Invalid format';\n case 'matchField':\n return 'Fields must match';\n default:\n return 'Invalid value';\n }\n}\n","import type { ShowCondition } from '../types';\n\nexport const CONDITION_OPERATORS = ['eq', 'neq', 'in', 'notIn', 'notEmpty', 'gt', 'gte', 'lt', 'lte'] as const;\n\nexport function isBlank(value: unknown): boolean {\n return value == null || value === '' || (Array.isArray(value) && !value.length);\n}\n\nfunction toNumber(value: unknown): number | undefined {\n const number = typeof value === 'string' && value.trim() !== '' ? Number(value) : value;\n return typeof number === 'number' && Number.isFinite(number) ? number : undefined;\n}\n\nfunction compare(value: unknown, operand: number, test: (value: number, operand: number) => boolean): boolean {\n const number = toNumber(value);\n return number !== undefined && test(number, operand);\n}\n\nexport function evaluateCondition(\n condition: ShowCondition,\n values: Record<string, unknown>,\n): boolean {\n const value = values[condition.field];\n if (condition.eq !== undefined) return value === condition.eq;\n if (condition.neq !== undefined) return value !== condition.neq;\n if (condition.in !== undefined) return condition.in.includes(value as string | number);\n if (condition.notIn !== undefined) return !condition.notIn.includes(value as string | number);\n if (condition.notEmpty !== undefined) return !condition.notEmpty || !isBlank(value);\n if (condition.gt !== undefined) return compare(value, condition.gt, (a, b) => a > b);\n if (condition.gte !== undefined) return compare(value, condition.gte, (a, b) => a >= b);\n if (condition.lt !== undefined) return compare(value, condition.lt, (a, b) => a < b);\n if (condition.lte !== undefined) return compare(value, condition.lte, (a, b) => a <= b);\n return false;\n}\n","import type { FormField, ShowCondition } from '../types';\nimport { evaluateCondition } from './evaluate-condition';\n\nexport function isVisible(\n field: Pick<FormField, 'show' | 'showAny'>,\n values: Record<string, unknown>,\n): boolean {\n const matches = (condition: ShowCondition) => evaluateCondition(condition, values);\n return (field.show ?? []).every(matches) && (!field.showAny?.length || field.showAny.some(matches));\n}\n","import type { FormField } from '../types';\nimport { getDefaultMessage, TYPE_MESSAGES } from './default-messages';\n\nexport const BOOLEAN_TYPES = ['checkbox', 'switch'];\nexport const BUILT_IN_TYPES = ['text', 'email', 'phone', 'number', 'password', 'select', 'autocomplete', 'multiselect', 'checkbox', 'radio', 'switch', 'file', 'date', 'datetime', 'textarea'];\n\nexport const MAX_STRING_LENGTH = 10000;\nconst MAX_EMAIL_LENGTH = 254;\nconst MAX_ITEMS = 1000;\nconst EMAIL = /^[^\\s@]+@[^\\s@.]+(?:\\.[^\\s@.]+)+$/;\nconst DECIMAL = /^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/;\nconst DATE = '\\\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\\\d|3[01])';\nconst DATE_ONLY = new RegExp(`^${DATE}$`);\nconst DATE_TIME = new RegExp(`^${DATE}T(?:[01]\\\\d|2[0-3]):[0-5]\\\\d(?::[0-5]\\\\d(?:\\\\.\\\\d{1,3})?)?(?:Z|[+-](?:[01]\\\\d|2[0-3]):[0-5]\\\\d)?$`);\nconst TEXT_TYPES = new Set(['text', 'phone', 'password', 'textarea', 'autocomplete']);\nconst FORMATS = new Map<string, [RegExp, string, number]>([\n ['email', [EMAIL, TYPE_MESSAGES.email, MAX_EMAIL_LENGTH]],\n ['date', [DATE_ONLY, TYPE_MESSAGES.date, MAX_STRING_LENGTH]],\n ['datetime', [DATE_TIME, TYPE_MESSAGES.datetime, MAX_STRING_LENGTH]],\n]);\n\nexport function normalizeValue(field: FormField, value: unknown): unknown {\n if (field.type !== 'number' || typeof value !== 'string' || !DECIMAL.test(value)) return value;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : value;\n}\n\nfunction isOption(field: FormField, value: unknown): boolean {\n return !field.options || field.options.some((option) => option.value === value);\n}\n\nfunction lengthError(field: FormField, value: string): string | null {\n const max = Math.min(MAX_STRING_LENGTH, field.validation?.maxLength ?? MAX_STRING_LENGTH);\n if (value.length <= max) return null;\n return field.validation?.maxLengthMessage ?? getDefaultMessage('maxLength', { max });\n}\n\nfunction multiselectError(field: FormField, value: unknown): string | null {\n if (!Array.isArray(value)) return TYPE_MESSAGES.options;\n if (value.length > (field.options?.length ?? MAX_ITEMS)) return TYPE_MESSAGES.option;\n const valid = value.every((item) => typeof item === 'string' && item.length <= MAX_STRING_LENGTH && isOption(field, item));\n return valid ? null : TYPE_MESSAGES.option;\n}\n\nfunction stringError(field: FormField, value: unknown, message: string): string | null {\n return typeof value === 'string' ? lengthError(field, value) : message;\n}\n\nfunction formatError(field: FormField, value: unknown, [format, message, max]: [RegExp, string, number]): string | null {\n if (typeof value !== 'string') return message;\n return lengthError(field, value) ?? (value.length <= max && format.test(value) ? null : message);\n}\n\nfunction primitiveError(field: FormField, value: unknown): string | null {\n if (typeof value === 'boolean' || (typeof value === 'number' && Number.isFinite(value))) return null;\n return stringError(field, value, TYPE_MESSAGES.value);\n}\n\nfunction isBlank(field: FormField, value: unknown): boolean {\n return value == null || value === '' || (field.type === 'multiselect' && Array.isArray(value) && !value.length);\n}\n\nexport function typeError(field: FormField, value: unknown): string | null {\n if (isBlank(field, value)) return null;\n if (BOOLEAN_TYPES.includes(field.type)) return typeof value === 'boolean' ? null : TYPE_MESSAGES.boolean;\n if (field.type === 'number') return typeof value === 'number' && Number.isFinite(value) ? null : TYPE_MESSAGES.number;\n if (field.type === 'multiselect') return multiselectError(field, value);\n if (field.type === 'file') return stringError(field, value, TYPE_MESSAGES.file);\n const format = FORMATS.get(field.type);\n if (format) return formatError(field, value, format);\n if (field.type === 'select' || field.type === 'radio') return stringError(field, value, TYPE_MESSAGES.option) ?? (isOption(field, value) ? null : TYPE_MESSAGES.option);\n return TEXT_TYPES.has(field.type) ? stringError(field, value, TYPE_MESSAGES.string) : primitiveError(field, value);\n}\n\nexport function clientTypeError(field: FormField, value: unknown): string | null {\n if (field.type === 'file' || !BUILT_IN_TYPES.includes(field.type)) return null;\n return typeError(field.optionsFrom ? { ...field, options: undefined } : field, value);\n}\n","import type { FieldValidation, FormField } from '../types';\nimport { isBlank } from '../visibility';\nimport { getDefaultMessage } from './default-messages';\nimport { BOOLEAN_TYPES, clientTypeError } from './type-checks';\n\nexport type ValidatorFn = (\n value: unknown,\n allValues: Record<string, unknown>,\n) => string | null;\n\n\nfunction isEmpty(value: unknown, field: FormField): boolean {\n return isBlank(value) || (value === false && BOOLEAN_TYPES.includes(field.type));\n}\n\nfunction boundError(\n size: number,\n rule: 'Length' | '',\n rules: FieldValidation,\n unit?: string,\n): string | undefined {\n const min = rules[`min${rule}`];\n const max = rules[`max${rule}`];\n if (min !== undefined && size < min) return rules[`min${rule}Message`] ?? getDefaultMessage(`min${rule}`, { min, unit });\n if (max !== undefined && size > max) return rules[`max${rule}Message`] ?? getDefaultMessage(`max${rule}`, { max, unit });\n return undefined;\n}\n\nfunction patternError(value: unknown, rules: FieldValidation): string | undefined {\n if (rules.pattern === undefined) return undefined;\n try {\n return new RegExp(rules.pattern).test(String(value)) ? undefined : rules.patternMessage ?? getDefaultMessage('pattern');\n } catch {\n return undefined;\n }\n}\n\nexport function validateFieldValue(\n field: FormField,\n value: unknown,\n allValues: Record<string, unknown>,\n validators?: Record<string, ValidatorFn>,\n): string | null {\n const rules = field.validation ?? {};\n const matchMessage = rules.matchFieldMessage ?? getDefaultMessage('matchField');\n if (isEmpty(value, field)) {\n if (rules.required) return typeof rules.required === 'string' ? rules.required : getDefaultMessage('required');\n return rules.matchField !== undefined && !isBlank(allValues[rules.matchField]) ? matchMessage : null;\n }\n const typeIssue = clientTypeError(field, value);\n if (typeIssue) return typeIssue;\n const sizeError = typeof value === 'string' || Array.isArray(value)\n ? boundError(value.length, 'Length', rules, Array.isArray(value) ? 'items' : undefined)\n : typeof value === 'number' ? boundError(value, '', rules) : undefined;\n const matchError = rules.matchField !== undefined && value !== allValues[rules.matchField] ? matchMessage : undefined;\n return (sizeError\n ?? patternError(value, rules)\n ?? matchError\n ?? (rules.validator ? validators?.[rules.validator]?.(value, allValues) : undefined)) || null;\n}\n","import type { FormField, FormStep } from '../types';\nimport { isVisible } from '../visibility';\nimport { type ValidatorFn, validateFieldValue } from './validate-field';\n\nexport function validateStep(\n step: FormStep,\n values: Record<string, unknown>,\n validators?: Record<string, ValidatorFn>,\n): Record<string, string> {\n return validateFields(step.fields, values, validators);\n}\n\nexport function validateFields(\n fields: FormField[],\n values: Record<string, unknown>,\n validators?: Record<string, ValidatorFn>,\n): Record<string, string> {\n const errors: Record<string, string> = {};\n\n for (const field of fields) {\n if (!isVisible(field, values)) continue;\n\n const error = validateFieldValue(field, values[field.key], values, validators);\n if (error) {\n errors[field.key] = error;\n }\n }\n\n return errors;\n}\n","import type { FormDefinition, FormField } from '../types';\n\nexport function conditionFields(source: Pick<FormField, 'show' | 'showAny'>): string[] {\n return [...(source.show ?? []), ...(source.showAny ?? [])].map((condition) => condition.field);\n}\n\nexport function getAllFields(definition: FormDefinition): FormField[] {\n return definition.steps?.length ? definition.steps.flatMap((step) => step.fields) : definition.fields ?? [];\n}\n\nexport function createValues(\n fields: FormField[],\n initialValues?: Record<string, unknown>,\n): Record<string, unknown> {\n const values: Record<string, unknown> = {};\n for (const field of fields) {\n if (field.defaultValue !== undefined) values[field.key] = field.defaultValue;\n }\n return Object.assign(values, initialValues);\n}\n\nexport function getChangedKeys(\n previous: Record<string, unknown>,\n next: Record<string, unknown>,\n): Set<string> {\n const keys = new Set([...Object.keys(previous), ...Object.keys(next)]);\n return new Set([...keys].filter((key) => !Object.is(previous[key], next[key])));\n}\n","import type { EngineInternals } from './runtime-internals';\n\nfunction activePath(engine: EngineInternals): string {\n return engine.visibleSteps.map((step) => step.id).join('\\n');\n}\n\nexport function watchCheckedInputs(engine: EngineInternals, checked: Record<string, unknown>): () => boolean {\n const path = activePath(engine);\n return () => activePath(engine) !== path || Object.keys(checked).some(\n (key) => checked[key] !== undefined && !Object.is(engine.values[key], checked[key]),\n );\n}\n","import { validateFieldValue, validateFields, validateStep } from '../validation';\nimport { createValues, getChangedKeys } from './engine-utils';\nimport type { EngineInternals } from './runtime-internals';\n\nexport function applyValidationErrors(engine: EngineInternals, errors: Record<string, string>, navigate = false): void {\n const previousErrors = engine.errors;\n engine.state.errors = {};\n engine.state.topLevelErrors = [];\n for (const [key, message] of Object.entries(errors)) {\n if (engine.visibility.activeField(key, engine.values)) engine.errors[key] = message;\n else engine.topLevelErrors.push(message);\n }\n const structureChanged = navigate && moveToFirstError(engine, errors);\n engine.notify({ fieldKeys: getChangedKeys(previousErrors, engine.errors), structureChanged });\n}\n\nfunction moveToFirstError(engine: EngineInternals, errors: Record<string, string>): boolean {\n const firstErrorKey = Object.keys(errors).find((key) => engine.errors[key] !== undefined);\n const targetIndex = firstErrorKey && engine.isMultiStep\n ? engine.visibility.findStepIndex(firstErrorKey, engine.values, engine.currentStepIndex)\n : null;\n if (targetIndex === null || targetIndex === engine.currentStepIndex) return false;\n engine.state.currentStepIndex = targetIndex;\n return true;\n}\n\nexport function clearResolvedMatchErrors(engine: EngineInternals, key: string): string[] {\n const cleared: string[] = [];\n for (const field of engine.visibility.allFields) {\n if (field.validation?.matchField !== key || engine.errors[field.key] === undefined) continue;\n if (validateFieldValue(field, engine.values[field.key], getValidationValues(engine), engine.validators)) continue;\n delete engine.errors[field.key];\n cleared.push(field.key);\n }\n return cleared;\n}\n\nexport function pruneOffPathErrors(engine: EngineInternals): string[] {\n const pathFields = new Set(engine.visibleSteps.flatMap((step) => step.fields.map((field) => field.key)));\n const pruned = Object.keys(engine.errors).filter((key) => !pathFields.has(key));\n for (const key of pruned) delete engine.errors[key];\n return pruned;\n}\n\nexport function getValidationValues(engine: EngineInternals): Record<string, unknown> {\n return getSubmitValues(engine);\n}\n\nfunction withoutSkipped(engine: EngineInternals, values: Record<string, unknown>): Record<string, unknown> {\n for (const key of [...engine.skipped.values()].flat()) delete values[key];\n return values;\n}\n\nexport function validateForm(engine: EngineInternals, navigate = false): Record<string, string> {\n const previousErrors = engine.errors;\n const errors: Record<string, string> = {};\n if (engine.isMultiStep) {\n for (const step of engine.visibleSteps) {\n if (engine.skipped.has(step.id)) continue;\n Object.assign(errors, validateStep(step, getValidationValues(engine), engine.validators));\n }\n } else {\n Object.assign(\n errors,\n validateFields(engine.definition.fields ?? [], getValidationValues(engine), engine.validators),\n );\n }\n engine.state.errors = errors;\n const structureChanged = navigate && moveToFirstError(engine, errors);\n engine.notify({ fieldKeys: getChangedKeys(previousErrors, errors), structureChanged });\n return errors;\n}\n\nexport function validateOne(engine: EngineInternals, key: string): string | null {\n const field = engine.visibility.activeField(key, engine.values);\n if (!field) return null;\n const previousError = engine.errors[key];\n const error = validateFieldValue(field, engine.values[key], getValidationValues(engine), engine.validators);\n if (error) engine.errors[key] = error;\n else delete engine.errors[key];\n const fieldKeys = Object.is(previousError, engine.errors[key]) ? [] : [key];\n engine.notify({ fieldKeys });\n return error;\n}\n\nexport function getSubmitValues(engine: EngineInternals): Record<string, unknown> {\n return withoutSkipped(engine, { ...engine.visibility.conditionValues(engine.values) });\n}\n\nexport function resetEngine(engine: EngineInternals, values?: Record<string, unknown>): void {\n const previousValues = engine.values;\n const previousErrors = engine.errors;\n const loadingFields = Object.keys(engine.fieldLoading);\n engine.validationEpoch++;\n engine.operationEpoch++;\n engine.state.submitting = false;\n engine.state.values = createValues(engine.visibility.allFields, values);\n engine.state.errors = {};\n engine.state.topLevelErrors = [];\n engine.state.fieldLoading = {};\n engine.state.stepValidating = false;\n engine.state.currentStepIndex = 0;\n engine.skipped.clear();\n engine.visibility.reconcileHidden(engine.values, engine.errors);\n const changedValues = getChangedKeys(previousValues, engine.values);\n const changedFields = new Set([\n ...changedValues,\n ...getChangedKeys(previousErrors, engine.errors),\n ...loadingFields,\n ]);\n engine.notify({\n fieldKeys: changedFields,\n structureChanged: true,\n valuesChanged: changedValues.size > 0,\n });\n}\n","import type { FormDefinition, FormField, FormStep } from '../types';\nimport { isVisible } from '../visibility';\n\nexport function activeSteps(definition: FormDefinition, values: Record<string, unknown>): FormStep[] {\n const steps = definition.steps ?? [];\n const indexes = new Map(steps.map((step, index) => [step.id, index]));\n const result: FormStep[] = [];\n const available: Record<string, unknown> = {};\n for (let index = 0; index < steps.length;) {\n const step = steps[index];\n if (!isVisible(step, available)) { index++; continue; }\n result.push(step);\n Object.assign(available, stepValues(step, values, available));\n const route = step.routes?.find((route) => (\n isVisible(route, available) && (route.to === null || ((indexes.get(route.to) ?? -1) > index\n && isVisible(steps[indexes.get(route.to)!], available)))\n ));\n if (route?.to === null) break;\n index = route ? indexes.get(route.to)! : index + 1;\n }\n return result;\n}\n\nexport function reconcileStepIndex(previous: FormStep[], next: FormStep[], index: number): number {\n const previousStep = previous[index] ?? previous[previous.length - 1];\n const preserved = next.findIndex((step) => step.id === previousStep?.id);\n if (preserved !== -1) return preserved;\n const nextIds = new Map(next.map((step, index) => [step.id, index]));\n for (let before = Math.min(index - 1, previous.length - 1); before >= 0; before--) {\n const predecessor = nextIds.get(previous[before].id);\n if (predecessor !== undefined) return predecessor;\n }\n return 0;\n}\n\nfunction stepValues(step: { fields: FormField[] }, values: Record<string, unknown>, previous: Record<string, unknown>) {\n const candidates = { ...previous };\n for (const field of step.fields) candidates[field.key] = values[field.key];\n const result: Record<string, unknown> = {};\n for (const field of step.fields) {\n if (isVisible(field, candidates) && values[field.key] !== undefined) result[field.key] = values[field.key];\n }\n return result;\n}\n\nexport function createActivePath(definition: FormDefinition) {\n let source: Record<string, unknown> | null = null;\n let steps: FormStep[] = [];\n let active: Record<string, unknown> = {};\n const refresh = (values: Record<string, unknown>) => {\n if (source === values) return;\n source = values;\n steps = activeSteps(definition, values);\n const result: Record<string, unknown> = {};\n const groups = definition.steps?.length ? steps : [{ fields: definition.fields ?? [] }];\n for (const step of groups) Object.assign(result, stepValues(step, values, result));\n active = result;\n };\n return {\n invalidate(): void { source = null; },\n steps(values: Record<string, unknown>): FormStep[] { refresh(values); return steps; },\n values(values: Record<string, unknown>): Record<string, unknown> { refresh(values); return active; },\n };\n}\n","import type { FormStep } from '../types';\nimport { createValues } from './engine-utils';\nimport type { EngineInternals } from './runtime-internals';\nimport { activeSteps } from './step-routes';\nimport { pruneOffPathErrors } from './validation-state';\n\nfunction resetValues(engine: EngineInternals): Record<string, unknown> {\n const fields = engine.currentStep?.fields ?? [];\n const values = { ...engine.values };\n for (const { key } of fields) delete values[key];\n return Object.assign(values, createValues(fields));\n}\n\nexport function skipTarget(engine: EngineInternals): FormStep | undefined {\n return activeSteps(engine.definition, resetValues(engine))[engine.currentStepIndex + 1];\n}\n\nexport function skipCurrentStep(engine: EngineInternals): string[] {\n const step = engine.currentStep!;\n const fieldKeys = step.fields.map(({ key }) => key);\n engine.state.values = resetValues(engine);\n for (const key of fieldKeys) delete engine.errors[key];\n engine.skipped.set(step.id, fieldKeys);\n engine.visibility.reconcileHidden(engine.values, engine.errors);\n engine.visibility.markChanged(true, true);\n const pruned = pruneOffPathErrors(engine);\n engine.notify({ fieldKeys: [...fieldKeys, ...pruned], structureChanged: true, valuesChanged: true });\n return fieldKeys;\n}\n\nexport function includeCurrentStep(engine: EngineInternals): void {\n const step = engine.currentStep;\n if (step) engine.skipped.delete(step.id);\n}\n\nexport function skipStepAt(engine: EngineInternals, index: number): string[] {\n engine.state.currentStepIndex = index;\n engine.notify({ structureChanged: true });\n return skipCurrentStep(engine);\n}\n","import { afterCommit } from './lifecycle-error';\nimport { watchCheckedInputs } from './pending-inputs';\nimport type { SubmitFn } from './engine-options';\nimport type { EngineInternals } from './runtime-internals';\nimport { getSubmitValues, validateForm } from './validation-state';\nimport { includeCurrentStep } from './step-skip';\n\nexport async function submitForm(engine: EngineInternals, submit: SubmitFn, keepSkipped = false): Promise<boolean> {\n if (engine.submitting || engine.stepValidating) return false;\n if (!keepSkipped) includeCurrentStep(engine);\n const lifecycle = { ...engine.lifecycle };\n let dispatched = false;\n const epoch = engine.validationEpoch;\n const operation = ++engine.operationEpoch;\n let values = getSubmitValues(engine);\n const inputsChanged = watchCheckedInputs(engine, values);\n const stale = () => epoch !== engine.validationEpoch || operation !== engine.operationEpoch || inputsChanged();\n engine.state.submitting = true;\n engine.notify();\n try {\n if (stale()) return false;\n if (Object.keys(validateForm(engine, true)).length > 0 || stale()) return false;\n if (lifecycle.onBeforeSubmit) {\n const allowed = await lifecycle.onBeforeSubmit(values);\n if (stale() || allowed === false) return false;\n }\n if (stale()) return false;\n if (lifecycle.onBeforeSubmit) {\n if (Object.keys(validateForm(engine, true)).length > 0 || stale()) return false;\n values = getSubmitValues(engine);\n }\n dispatched = true;\n const skippedSteps = [...engine.skipped.keys()];\n await submit(values, [...skippedSteps]);\n if (operation !== engine.operationEpoch) return true;\n await afterCommit('afterSubmit', () => lifecycle.onAfterSubmit?.(values, skippedSteps));\n return true;\n } catch (error) {\n if (!dispatched && stale()) return false;\n throw error;\n } finally {\n if (operation === engine.operationEpoch) {\n engine.state.submitting = false;\n engine.notify();\n }\n }\n}\n","import { getChangedKeys } from './engine-utils';\nimport { afterCommit } from './lifecycle-error';\nimport { watchCheckedInputs } from './pending-inputs';\nimport { validateStep } from '../validation';\nimport { applyValidationErrors, getValidationValues } from './validation-state';\nimport { includeCurrentStep, skipCurrentStep, skipTarget } from './step-skip';\nimport { submitForm } from './submission';\nimport type { StepChangeContext, SubmitFn } from './engine-options';\nimport type { EngineInternals } from './runtime-internals';\n\nfunction hasStepErrors(engine: EngineInternals): boolean {\n const step = engine.currentStep;\n if (!step) return true;\n const errors = validateStep(step, getValidationValues(engine), engine.validators);\n if (Object.keys(errors).length === 0) return false;\n const previousErrors = { ...engine.errors };\n Object.assign(engine.errors, errors);\n engine.notify({ fieldKeys: getChangedKeys(previousErrors, engine.errors) });\n return true;\n}\n\nfunction moveTo(engine: EngineInternals, index: number): void {\n engine.validationEpoch++;\n engine.state.currentStepIndex = index;\n engine.notify({ structureChanged: true });\n}\n\nexport async function skipStep(engine: EngineInternals, submit?: SubmitFn): Promise<boolean> {\n if (!engine.isMultiStep || engine.stepValidating || engine.submitting || !engine.currentStep?.skip) return false;\n if (skipTarget(engine)) return changeStep(engine, 'next', 'skip');\n const step = engine.currentStep;\n if (!submit || !step) return false;\n const values = engine.values;\n const errors = { ...engine.errors };\n let committed = false;\n const fieldKeys = skipCurrentStep(engine);\n const skippedValues = engine.values;\n const edited = watchCheckedInputs(engine, { ...skippedValues });\n try {\n return await submitForm(engine, async (submitted, skipped) => {\n await submit(submitted, skipped);\n committed = true;\n }, true);\n } finally {\n if (!committed && engine.values === skippedValues && !edited()) {\n engine.state.values = values;\n engine.state.errors = { ...errors, ...engine.errors };\n engine.skipped.delete(step.id);\n engine.notify({ fieldKeys, structureChanged: true, valuesChanged: true });\n }\n }\n}\n\nexport async function changeStep(engine: EngineInternals, direction: 'next' | 'back', reason: StepChangeContext['reason'] = direction): Promise<boolean> {\n const skipping = reason === 'skip';\n if (!engine.isMultiStep || engine.stepValidating || engine.submitting) return false;\n if (!skipping && (direction === 'next' ? engine.isLastStep : engine.isFirstStep)) return false;\n const step = engine.currentStep!;\n const validating = direction === 'next' && !skipping;\n if (validating) includeCurrentStep(engine);\n if (validating && hasStepErrors(engine)) return false;\n const lifecycle = { ...engine.lifecycle };\n const validate = engine.onStepValidate;\n let committed = false;\n const fromIndex = engine.currentStepIndex;\n const toIndex = fromIndex + (direction === 'next' ? 1 : -1);\n const target = skipping ? skipTarget(engine) : engine.visibleSteps[toIndex];\n if (!target) return false;\n const context: StepChangeContext = { fromStepId: step.id, toStepId: target.id, reason, values: { ...getValidationValues(engine) } };\n const epoch = engine.validationEpoch;\n const operation = ++engine.operationEpoch;\n const inputsChanged = watchCheckedInputs(engine, context.values);\n const stale = () => epoch !== engine.validationEpoch || operation !== engine.operationEpoch\n || engine.currentStep?.id !== step.id || inputsChanged();\n engine.state.stepValidating = true;\n engine.notify();\n try {\n if (stale()) return false;\n if (validating && validate) {\n const result = await validate!(step.id, context.values);\n if (stale()) return false;\n if (result && Object.keys(result).length > 0) {\n applyValidationErrors(engine, result);\n return false;\n }\n }\n if (lifecycle.onBeforeStepChange) {\n const allowed = await lifecycle.onBeforeStepChange(context);\n if (stale() || allowed === false) return false;\n }\n if (stale()) return false;\n if (validating && hasStepErrors(engine)) return false;\n committed = true;\n if (skipping) skipCurrentStep(engine);\n moveTo(engine, toIndex);\n await afterCommit('afterStepChange', () => lifecycle.onAfterStepChange?.(context));\n return true;\n } catch (error) {\n if (!committed && stale()) return false;\n throw error;\n } finally {\n if (operation === engine.operationEpoch) {\n engine.state.stepValidating = false;\n engine.notify();\n }\n }\n}\n\nexport function goToStepWithField(engine: EngineInternals, fieldKey: string): void {\n if (!engine.isMultiStep) return;\n const targetIndex = engine.visibility.findStepIndex(\n fieldKey,\n engine.values,\n engine.currentStepIndex,\n );\n if (targetIndex === engine.currentStepIndex) engine.notify();\n else if (targetIndex !== null) moveTo(engine, targetIndex);\n}\n"]}
package/dist/cloud.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { b as FormDefinition } from './definition-BAHgjY7x.js';
2
-
3
- type CloudAction = 'retry' | 'reload' | null;
1
+ import { C as CloudAction } from './controller-CUZ5bMpv.js';
2
+ export { a as CloudClientOptions, b as CloudNotice, c as CloudSettings, d as CloudSubmission, e as CloudSubmitterOptions, D as DraftStorage, f as DraftStore, P as PublishedForm, g as createSubmitter, h as fetchDefinition, i as fetchForm, s as sessionDraftStore } from './controller-CUZ5bMpv.js';
3
+ import './definition-Bufih_Bx.js';
4
4
 
5
5
  declare class CloudError extends Error {
6
6
  readonly status: number;
@@ -13,61 +13,4 @@ declare class CloudError extends Error {
13
13
  get retryable(): boolean;
14
14
  }
15
15
 
16
- interface Searchable {
17
- querySelector(selector: string): unknown;
18
- }
19
- interface Focusable extends Searchable {
20
- focus(options?: {
21
- preventScroll?: boolean;
22
- }): void;
23
- scrollIntoView?(options?: {
24
- block?: 'center' | 'nearest';
25
- }): void;
26
- matches(selector: string): boolean;
27
- }
28
- declare function focusProblem(root: Searchable | null, notice?: Focusable | null): void;
29
-
30
- interface CloudSubmission {
31
- id: string;
32
- values: Record<string, unknown>;
33
- }
34
- interface CloudClientOptions {
35
- id: string;
36
- apiBase?: string;
37
- }
38
- declare function fetchDefinition(options: CloudClientOptions, signal?: AbortSignal): Promise<FormDefinition>;
39
- interface CloudSubmitterOptions extends CloudClientOptions {
40
- version?: number;
41
- }
42
- declare function createSubmitter(options: CloudSubmitterOptions): (values: Record<string, unknown>, skippedSteps?: string[]) => Promise<CloudSubmission>;
43
-
44
- interface CloudNotice {
45
- tone: 'error' | 'info';
46
- message: string;
47
- action: CloudAction;
48
- details: string[];
49
- }
50
- interface CloudState {
51
- definition: FormDefinition | null;
52
- version: number | null;
53
- loadError: Error | null;
54
- errors: Record<string, string>;
55
- notice: CloudNotice | null;
56
- initialValues: Record<string, unknown> | null;
57
- revision: number;
58
- attempt: number;
59
- done: boolean;
60
- }
61
- interface CloudCallbacks {
62
- onChange(state: CloudState): void;
63
- onSuccess?(submission: CloudSubmission): void;
64
- onError?(error: unknown): void;
65
- }
66
- declare const initialCloudState: CloudState;
67
- declare function createCloudController(options: CloudClientOptions, callbacks: CloudCallbacks): {
68
- start(): void;
69
- dispose(): void;
70
- submit(values: Record<string, unknown>, skippedSteps?: string[]): Promise<void>;
71
- };
72
-
73
- export { type CloudAction, type CloudCallbacks, type CloudClientOptions, CloudError, type CloudNotice, type CloudState, type CloudSubmission, type CloudSubmitterOptions, createCloudController, createSubmitter, fetchDefinition, focusProblem, initialCloudState };
16
+ export { CloudAction, CloudError };
package/dist/cloud.js CHANGED
@@ -1,3 +1,2 @@
1
- var F="This form was updated. Please review your answers and submit again.",x="Please answer again.",g={message:"Something went wrong. Try again.",action:"retry"},B={message:"Could not send. Try again.",action:"retry"},h={message:"Could not send. Reload the page and try again.",action:"reload"},E={network:{message:"Could not reach the form server. Check your connection and try again.",action:"retry"},timeout:{message:"The form server did not respond. Try again.",action:"retry"},invalid:{message:"Some answers were not accepted.",action:null},rate_limited:{message:"Too many attempts. Wait a minute and try again.",action:"retry"},limit_reached:{message:"This form is not accepting responses right now.",action:null},not_found:{message:"This form no longer exists.",action:null},paused:{message:"This form is paused.",action:null},expired:{message:"This form has expired.",action:null},body_too_large:{message:"Your answers are too long. Shorten them and try again.",action:null},idempotency_key_reused:{message:"Your answers changed while sending. Try again.",action:"retry"},form_updated:{message:"This form was updated. Reload the page.",action:"reload"},malformed_body:h,unsupported_media_type:h,invalid_idempotency_key:h,invalid_response:g,unavailable:g,internal:g},G={0:"network",400:"malformed_body",402:"limit_reached",404:"not_found",409:"paused",410:"expired",413:"body_too_large",422:"invalid",429:"rate_limited"};function y(n,e=""){let r=E[e]??E[G[n]??""];return r||(n>=500?g:B)}var d=class extends Error{constructor(e,r,i,t,o){let s=y(e,r);super(s.message),this.name="CloudError",this.status=e,this.code=r,this.errors=i,this.version=t,this.action=s.action,this.cause=o;}get retryable(){return this.action==="retry"}};function R(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)}var L=new Map([["Form paused","paused"],["Form not found","not_found"],["Form expired","expired"],["internal error","internal"]]);function b(n,e="network"){return new d(0,e,void 0,void 0,n)}async function k(n){try{return await n.json()}catch(e){throw new d(n.status,"invalid_response",void 0,void 0,e)}}async function S(n){let e=await n.json().catch(()=>null);if(!R(e))return new d(n.status,"unknown");let r=R(e.errors)?e.errors:void 0,i=typeof e.version=="number"&&Number.isInteger(e.version)?e.version:void 0,t=typeof e.error=="string"?L.get(e.error)??e.error:"unknown";return new d(n.status,t,r,i)}var _='input:not([type="hidden"]):not(:disabled), select:not(:disabled), textarea:not(:disabled), button:not(:disabled)';function A(n,e){e.scrollIntoView?.({block:"center"}),n.focus({preventScroll:true});}function j(n,e){if(e)return A(e,e);let r=n?.querySelector('[aria-invalid="true"]');r&&A(r.matches(_)?r:r.querySelector(_)??r,r);}function O(){if(typeof crypto.randomUUID=="function")return crypto.randomUUID();let n=crypto.getRandomValues(new Uint8Array(16));n[6]=n[6]&15|64,n[8]=n[8]&63|128;let e=Array.from(n,r=>r.toString(16).padStart(2,"0")).join("");return `${e.slice(0,8)}-${e.slice(8,12)}-${e.slice(12,16)}-${e.slice(16,20)}-${e.slice(20)}`}var q="https://api.formhaus.dev",Y="Formhaus-Version";function D({id:n,apiBase:e=q}){return `${e.replace(/\/+$/,"")}/f/${encodeURIComponent(n)}`}var J=15e3,W=3e4;async function T(n,e,r={},i){let t=new AbortController,o=()=>t.abort(),s=setTimeout(o,e);i?.aborted&&o(),i?.addEventListener("abort",o);try{return await fetch(n,{...r,signal:t.signal})}catch(c){throw i?.aborted?c:b(c,t.signal.aborted?"timeout":"network")}finally{clearTimeout(s),i?.removeEventListener("abort",o);}}function H(n){let e=Number(n.headers?.get(Y));return Number.isInteger(e)&&e>0?e:void 0}async function C(n,e,r){let i=r===void 0?"":`?v=${r}`,t=await T(`${D(n)}/definition${i}`,J,{},e);if(!t.ok)throw await S(t);return {definition:await k(t),version:H(t)}}async function K(n,e){return (await C(n,e)).definition}function p(n){let e=null;return async(r,i=[])=>{let t=JSON.stringify({values:r,skippedSteps:i,version:n.version});e?.body!==t&&(e={body:t,key:O()});let o=await T(D(n),W,{method:"POST",headers:{"Content-Type":"application/json","Idempotency-Key":e.key},body:t});if(!o.ok)throw await S(o);let s=await k(o);return e=null,s}}var z={multiselect:"list",checkbox:"flag",switch:"flag",number:"number",file:"file"};function w(n){return [...n.fields??[],...(n.steps??[]).flatMap(e=>e.fields)]}function v(n){return z[n.type]??"text"}function Q(n,e){if(!Array.isArray(n.options))return true;let r=new Set(n.options.map(i=>String(i.value)));return (Array.isArray(e)?e:[e]).every(i=>r.has(String(i)))}function X(n,e,r){if(n&&v(n)!==v(e))return false;switch(v(e)){case "list":return Array.isArray(r);case "flag":return typeof r=="boolean";case "number":return typeof r=="number";case "text":return typeof r=="string";default:return n!==void 0}}function P(n,e,r){let i=new Map(r?w(r).map(o=>[o.key,o]):[]),t={};for(let o of w(e)){let s=n[o.key];s!=null&&X(i.get(o.key),o,s)&&Q(o,s)&&(t[o.key]=s);}return t}function I(n,e){let r=new Set(w(n).map(o=>o.key)),i={},t=new Set;for(let[o,s]of Object.entries(e))r.has(o)?i[o]=s:t.add(s);return {fields:i,other:[...t]}}function N(n,e,r,i){let t={};for(let o of w(n)){let s=e[o.key]!==void 0&&e[o.key]!==null&&e[o.key]!=="";s&&!(o.key in r)?t[o.key]=x:i[o.key]&&(!s||o.key in r)&&(t[o.key]=i[o.key]);}return t}var V={definition:null,version:null,loadError:null,errors:{},notice:null,initialValues:null,revision:0,attempt:0,done:false};function U(n,e=[]){return {tone:"error",message:n.message,action:n.action,details:e}}function Z(n,e){let r=new AbortController,i=p(n),t=()=>!r.signal.aborted,o=V,s=a=>{o={...o,...a},e.onChange(o);},c=a=>s({...a,attempt:o.attempt+1});async function $(a,f){let u=o.definition;try{let l=await C(n,r.signal,a.version);if(!t())return;if(l.version===void 0||l.version<(a.version??0))throw new d(409,"form_updated");let m=u?P(f,l.definition,u):{};i=p({...n,version:l.version}),c({definition:l.definition,version:l.version,initialValues:m,revision:o.revision+1,errors:N(l.definition,f,m,a.errors??{}),notice:{tone:"info",message:F,action:null,details:[]}});}catch{t()&&c({notice:{tone:"error",...y(409,"form_updated"),details:[]}});}}async function M(a,f){let u=a instanceof d?a:b(a);if(u.code==="form_updated"&&u.version!==void 0)return $(u,f);if(u.status!==422)return c({notice:U(u)});let l=u.errors??{},m=o.definition?I(o.definition,l):{fields:l,other:[]};c({errors:m.fields,notice:m.other.length>0?U(u,m.other):null});}return {start(){o.loadError&&s({loadError:null}),C(n,r.signal).then(a=>{t()&&(i=p({...n,version:a.version}),s({definition:a.definition,version:a.version??null}));},a=>{t()&&(s({loadError:a}),e.onError?.(a));});},dispose(){r.abort();},async submit(a,f){o.notice&&s({notice:null});try{let u=await i(a,f);if(!t())return;s({done:!0}),e.onSuccess?.(u);}catch(u){throw t()&&(await M(u,a),e.onError?.(u)),u}}}}
2
- export{d as CloudError,Z as createCloudController,p as createSubmitter,K as fetchDefinition,j as focusProblem,V as initialCloudState};//# sourceMappingURL=cloud.js.map
1
+ export{d as CloudError,i as createSubmitter,h as fetchDefinition,g as fetchForm,k as sessionDraftStore}from'./chunk-IVSO5ANU.js';//# sourceMappingURL=cloud.js.map
3
2
  //# sourceMappingURL=cloud.js.map
package/dist/cloud.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cloud/failures.ts","../src/cloud/error.ts","../src/cloud/focus.ts","../src/cloud/uuid.ts","../src/cloud/client.ts","../src/cloud/carry.ts","../src/cloud/controller.ts"],"names":["FORM_UPDATED_MESSAGE","ANSWER_AGAIN","SERVER","GENERIC","BROKEN","BY_CODE","CODE_BY_STATUS","failureFor","status","code","known","CloudError","errors","version","cause","failure","isRecord","value","LEGACY_CODES","networkError","readJson","response","error","toCloudError","body","CONTROLS","reveal","target","scrollTo","focusProblem","root","notice","invalid","randomId","bytes","hex","byte","DEFAULT_API_BASE","VERSION_HEADER","endpoint","id","apiBase","LOAD_TIMEOUT","SUBMIT_TIMEOUT","send","url","timeout","init","signal","controller","abort","timer","versionOf","fetchPublished","options","after","query","fetchDefinition","createSubmitter","pending","values","skippedSteps","submission","SHAPES","fieldsOf","definition","step","shapeOf","field","allowed","option","item","fits","previous","next","carryValues","before","kept","splitErrors","fields","other","key","message","updatedErrors","sent","rejected","answered","initialCloudState","errorNotice","details","createCloudController","callbacks","submitter","alive","state","update","patch","report","refresh","fail","cloud","split","published"],"mappings":"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","file":"cloud.js","sourcesContent":["export type CloudAction = 'retry' | 'reload' | null;\n\nexport interface CloudFailure {\n message: string;\n action: CloudAction;\n}\n\nexport const FORM_UPDATED_MESSAGE = 'This form was updated. Please review your answers and submit again.';\nexport const ANSWER_AGAIN = 'Please answer again.';\n\nconst SERVER: CloudFailure = { message: 'Something went wrong. Try again.', action: 'retry' };\nconst GENERIC: CloudFailure = { message: 'Could not send. Try again.', action: 'retry' };\nconst BROKEN: CloudFailure = { message: 'Could not send. Reload the page and try again.', action: 'reload' };\n\nconst BY_CODE: Record<string, CloudFailure> = {\n network: { message: 'Could not reach the form server. Check your connection and try again.', action: 'retry' },\n timeout: { message: 'The form server did not respond. Try again.', action: 'retry' },\n invalid: { message: 'Some answers were not accepted.', action: null },\n rate_limited: { message: 'Too many attempts. Wait a minute and try again.', action: 'retry' },\n limit_reached: { message: 'This form is not accepting responses right now.', action: null },\n not_found: { message: 'This form no longer exists.', action: null },\n paused: { message: 'This form is paused.', action: null },\n expired: { message: 'This form has expired.', action: null },\n body_too_large: { message: 'Your answers are too long. Shorten them and try again.', action: null },\n idempotency_key_reused: { message: 'Your answers changed while sending. Try again.', action: 'retry' },\n form_updated: { message: 'This form was updated. Reload the page.', action: 'reload' },\n malformed_body: BROKEN,\n unsupported_media_type: BROKEN,\n invalid_idempotency_key: BROKEN,\n invalid_response: SERVER,\n unavailable: SERVER,\n internal: SERVER,\n};\n\nconst CODE_BY_STATUS: Record<number, string> = {\n 0: 'network',\n 400: 'malformed_body',\n 402: 'limit_reached',\n 404: 'not_found',\n 409: 'paused',\n 410: 'expired',\n 413: 'body_too_large',\n 422: 'invalid',\n 429: 'rate_limited',\n};\n\nexport function failureFor(status: number, code = ''): CloudFailure {\n const known = BY_CODE[code] ?? BY_CODE[CODE_BY_STATUS[status] ?? ''];\n if (known) return known;\n return status >= 500 ? SERVER : GENERIC;\n}\n","import { failureFor, type CloudAction } from './failures';\n\nexport class CloudError extends Error {\n readonly status: number;\n readonly code: string;\n readonly errors?: Record<string, string>;\n readonly version?: number;\n readonly action: CloudAction;\n readonly cause?: unknown;\n\n constructor(status: number, code: string, errors?: Record<string, string>, version?: number, cause?: unknown) {\n const failure = failureFor(status, code);\n super(failure.message);\n this.name = 'CloudError';\n this.status = status;\n this.code = code;\n this.errors = errors;\n this.version = version;\n this.action = failure.action;\n this.cause = cause;\n }\n\n get retryable(): boolean {\n return this.action === 'retry';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nconst LEGACY_CODES = new Map([\n ['Form paused', 'paused'],\n ['Form not found', 'not_found'],\n ['Form expired', 'expired'],\n ['internal error', 'internal'],\n]);\n\nexport function networkError(cause: unknown, code = 'network'): CloudError {\n return new CloudError(0, code, undefined, undefined, cause);\n}\n\nexport async function readJson(response: CloudResponse): Promise<unknown> {\n try {\n return await response.json();\n } catch (error) {\n throw new CloudError(response.status, 'invalid_response', undefined, undefined, error);\n }\n}\n\nexport async function toCloudError(response: CloudResponse): Promise<CloudError> {\n const body: unknown = await response.json().catch(() => null);\n if (!isRecord(body)) return new CloudError(response.status, 'unknown');\n const errors = isRecord(body.errors) ? body.errors as Record<string, string> : undefined;\n const version = typeof body.version === 'number' && Number.isInteger(body.version) ? body.version : undefined;\n const code = typeof body.error === 'string' ? LEGACY_CODES.get(body.error) ?? body.error : 'unknown';\n return new CloudError(response.status, code, errors, version);\n}\n","interface Searchable {\n querySelector(selector: string): unknown;\n}\n\ninterface Focusable extends Searchable {\n focus(options?: { preventScroll?: boolean }): void;\n scrollIntoView?(options?: { block?: 'center' | 'nearest' }): void;\n matches(selector: string): boolean;\n}\n\nconst CONTROLS = 'input:not([type=\"hidden\"]):not(:disabled), select:not(:disabled), textarea:not(:disabled), button:not(:disabled)';\n\nfunction reveal(target: Focusable, scrollTo: Focusable): void {\n scrollTo.scrollIntoView?.({ block: 'center' });\n target.focus({ preventScroll: true });\n}\n\nexport function focusProblem(root: Searchable | null, notice?: Focusable | null): void {\n if (notice) return reveal(notice, notice);\n const invalid = root?.querySelector('[aria-invalid=\"true\"]') as Focusable | null | undefined;\n if (invalid) reveal(invalid.matches(CONTROLS) ? invalid : (invalid.querySelector(CONTROLS) as Focusable | null) ?? invalid, invalid);\n}\n","export function randomId(): string {\n if (typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n bytes[6] = (bytes[6] & 15) | 64;\n bytes[8] = (bytes[8] & 63) | 128;\n const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n","import type { FormDefinition } from '../types';\nimport { networkError, readJson, toCloudError } from './error';\nimport { randomId } from './uuid';\n\nconst DEFAULT_API_BASE = 'https://api.formhaus.dev';\nconst VERSION_HEADER = 'Formhaus-Version';\n\nexport interface CloudSubmission {\n id: string;\n values: Record<string, unknown>;\n}\n\nexport interface CloudClientOptions {\n id: string;\n apiBase?: string;\n}\n\nexport interface PublishedDefinition {\n definition: FormDefinition;\n version?: number;\n}\n\nfunction endpoint({ id, apiBase = DEFAULT_API_BASE }: CloudClientOptions): string {\n return `${apiBase.replace(/\\/+$/, '')}/f/${encodeURIComponent(id)}`;\n}\n\nconst LOAD_TIMEOUT = 15_000;\nconst SUBMIT_TIMEOUT = 30_000;\n\nasync function send(url: string, timeout: number, init: CloudRequestInit = {}, signal?: AbortSignal): Promise<CloudResponse> {\n const controller = new AbortController();\n const abort = () => controller.abort();\n const timer = setTimeout(abort, timeout);\n if (signal?.aborted) abort();\n signal?.addEventListener('abort', abort);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } catch (error) {\n if (signal?.aborted) throw error;\n throw networkError(error, controller.signal.aborted ? 'timeout' : 'network');\n } finally {\n clearTimeout(timer);\n signal?.removeEventListener('abort', abort);\n }\n}\n\nfunction versionOf(response: CloudResponse): number | undefined {\n const version = Number(response.headers?.get(VERSION_HEADER));\n return Number.isInteger(version) && version > 0 ? version : undefined;\n}\n\nexport async function fetchPublished(options: CloudClientOptions, signal?: AbortSignal, after?: number): Promise<PublishedDefinition> {\n const query = after === undefined ? '' : `?v=${after}`;\n const response = await send(`${endpoint(options)}/definition${query}`, LOAD_TIMEOUT, {}, signal);\n if (!response.ok) throw await toCloudError(response);\n return { definition: await readJson(response) as FormDefinition, version: versionOf(response) };\n}\n\nexport async function fetchDefinition(options: CloudClientOptions, signal?: AbortSignal): Promise<FormDefinition> {\n return (await fetchPublished(options, signal)).definition;\n}\n\nexport interface CloudSubmitterOptions extends CloudClientOptions {\n version?: number;\n}\n\nexport function createSubmitter(options: CloudSubmitterOptions) {\n let pending: { body: string; key: string } | null = null;\n\n return async (values: Record<string, unknown>, skippedSteps: string[] = []): Promise<CloudSubmission> => {\n const body = JSON.stringify({ values, skippedSteps, version: options.version });\n if (pending?.body !== body) pending = { body, key: randomId() };\n const response = await send(endpoint(options), SUBMIT_TIMEOUT, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'Idempotency-Key': pending.key },\n body,\n });\n if (!response.ok) throw await toCloudError(response);\n const submission = await readJson(response) as CloudSubmission;\n pending = null;\n return submission;\n };\n}\n","import type { FormDefinition, FormField } from '../types';\nimport { ANSWER_AGAIN } from './failures';\n\nconst SHAPES: Record<string, string> = {\n multiselect: 'list',\n checkbox: 'flag',\n switch: 'flag',\n number: 'number',\n file: 'file',\n};\n\nfunction fieldsOf(definition: FormDefinition): FormField[] {\n return [...(definition.fields ?? []), ...(definition.steps ?? []).flatMap((step) => step.fields)];\n}\n\nfunction shapeOf(field: FormField): string {\n return SHAPES[field.type] ?? 'text';\n}\n\nfunction allowed(field: FormField, value: unknown): boolean {\n if (!Array.isArray(field.options)) return true;\n const options = new Set(field.options.map((option) => String(option.value)));\n return (Array.isArray(value) ? value : [value]).every((item) => options.has(String(item)));\n}\n\nfunction fits(previous: FormField | undefined, next: FormField, value: unknown): boolean {\n if (previous && shapeOf(previous) !== shapeOf(next)) return false;\n switch (shapeOf(next)) {\n case 'list': return Array.isArray(value);\n case 'flag': return typeof value === 'boolean';\n case 'number': return typeof value === 'number';\n case 'text': return typeof value === 'string';\n default: return previous !== undefined;\n }\n}\n\nexport function carryValues(\n values: Record<string, unknown>,\n next: FormDefinition,\n previous?: FormDefinition,\n): Record<string, unknown> {\n const before = new Map(previous ? fieldsOf(previous).map((field) => [field.key, field]) : []);\n const kept: Record<string, unknown> = {};\n for (const field of fieldsOf(next)) {\n const value = values[field.key];\n if (value === undefined || value === null) continue;\n if (fits(before.get(field.key), field, value) && allowed(field, value)) kept[field.key] = value;\n }\n return kept;\n}\n\nexport function splitErrors(definition: FormDefinition, errors: Record<string, string>) {\n const known = new Set(fieldsOf(definition).map((field) => field.key));\n const fields: Record<string, string> = {};\n const other = new Set<string>();\n for (const [key, message] of Object.entries(errors)) {\n if (known.has(key)) fields[key] = message;\n else other.add(message);\n }\n return { fields, other: [...other] };\n}\n\nexport function updatedErrors(\n next: FormDefinition,\n sent: Record<string, unknown>,\n kept: Record<string, unknown>,\n rejected: Record<string, string>,\n): Record<string, string> {\n const errors: Record<string, string> = {};\n for (const field of fieldsOf(next)) {\n const answered = sent[field.key] !== undefined && sent[field.key] !== null && sent[field.key] !== '';\n if (answered && !(field.key in kept)) errors[field.key] = ANSWER_AGAIN;\n else if (rejected[field.key] && (!answered || field.key in kept)) errors[field.key] = rejected[field.key];\n }\n return errors;\n}\n","import type { FormDefinition } from '../types';\nimport { carryValues, splitErrors, updatedErrors } from './carry';\nimport { createSubmitter, fetchPublished, type CloudClientOptions, type CloudSubmission } from './client';\nimport { CloudError, networkError } from './error';\nimport { FORM_UPDATED_MESSAGE, failureFor, type CloudAction } from './failures';\n\nexport interface CloudNotice {\n tone: 'error' | 'info';\n message: string;\n action: CloudAction;\n details: string[];\n}\n\nexport interface CloudState {\n definition: FormDefinition | null;\n version: number | null;\n loadError: Error | null;\n errors: Record<string, string>;\n notice: CloudNotice | null;\n initialValues: Record<string, unknown> | null;\n revision: number;\n attempt: number;\n done: boolean;\n}\n\nexport interface CloudCallbacks {\n onChange(state: CloudState): void;\n onSuccess?(submission: CloudSubmission): void;\n onError?(error: unknown): void;\n}\n\nexport const initialCloudState: CloudState = {\n definition: null, version: null, loadError: null, errors: {}, notice: null,\n initialValues: null, revision: 0, attempt: 0, done: false,\n};\n\nfunction errorNotice(error: CloudError, details: string[] = []): CloudNotice {\n return { tone: 'error', message: error.message, action: error.action, details };\n}\n\nexport function createCloudController(options: CloudClientOptions, callbacks: CloudCallbacks) {\n const controller = new AbortController();\n let submitter = createSubmitter(options);\n const alive = () => !controller.signal.aborted;\n let state = initialCloudState;\n const update = (patch: Partial<CloudState>) => {\n state = { ...state, ...patch };\n callbacks.onChange(state);\n };\n const report = (patch: Partial<CloudState>) => update({ ...patch, attempt: state.attempt + 1 });\n\n async function refresh(error: CloudError, sent: Record<string, unknown>) {\n const before = state.definition;\n try {\n const next = await fetchPublished(options, controller.signal, error.version);\n if (!alive()) return;\n if (next.version === undefined || next.version < (error.version ?? 0)) throw new CloudError(409, 'form_updated');\n const kept = before ? carryValues(sent, next.definition, before) : {};\n submitter = createSubmitter({ ...options, version: next.version });\n report({\n definition: next.definition,\n version: next.version,\n initialValues: kept,\n revision: state.revision + 1,\n errors: updatedErrors(next.definition, sent, kept, error.errors ?? {}),\n notice: { tone: 'info', message: FORM_UPDATED_MESSAGE, action: null, details: [] },\n });\n } catch {\n if (alive()) report({ notice: { tone: 'error', ...failureFor(409, 'form_updated'), details: [] } });\n }\n }\n\n async function fail(error: unknown, values: Record<string, unknown>) {\n const cloud = error instanceof CloudError ? error : networkError(error);\n if (cloud.code === 'form_updated' && cloud.version !== undefined) return refresh(cloud, values);\n if (cloud.status !== 422) return report({ notice: errorNotice(cloud) });\n const errors = cloud.errors ?? {};\n const split = state.definition ? splitErrors(state.definition, errors) : { fields: errors, other: [] };\n report({ errors: split.fields, notice: split.other.length > 0 ? errorNotice(cloud, split.other) : null });\n }\n\n return {\n start() {\n if (state.loadError) update({ loadError: null });\n fetchPublished(options, controller.signal).then(\n (published) => {\n if (!alive()) return;\n submitter = createSubmitter({ ...options, version: published.version });\n update({ definition: published.definition, version: published.version ?? null });\n },\n (error: Error) => {\n if (!alive()) return;\n update({ loadError: error });\n callbacks.onError?.(error);\n },\n );\n },\n dispose() {\n controller.abort();\n },\n async submit(values: Record<string, unknown>, skippedSteps?: string[]) {\n if (state.notice) update({ notice: null });\n try {\n const submission = await submitter(values, skippedSteps);\n if (!alive()) return;\n update({ done: true });\n callbacks.onSuccess?.(submission);\n } catch (error) {\n if (!alive()) throw error;\n await fail(error, values);\n callbacks.onError?.(error);\n throw error;\n }\n },\n };\n}\n"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"cloud.js"}
@@ -0,0 +1,85 @@
1
+ import { f as FormDefinition } from './definition-Bufih_Bx.js';
2
+
3
+ type CloudAction = 'retry' | 'reload' | null;
4
+
5
+ interface CloudSettings {
6
+ successMessage?: string;
7
+ redirectUrl?: string;
8
+ allowAnother?: boolean;
9
+ }
10
+ interface PublishedForm {
11
+ definition: FormDefinition;
12
+ version?: number;
13
+ settings?: CloudSettings;
14
+ renderToken?: string;
15
+ }
16
+
17
+ interface CloudSubmission {
18
+ id: string;
19
+ values: Record<string, unknown>;
20
+ }
21
+ interface CloudClientOptions {
22
+ id: string;
23
+ apiBase?: string;
24
+ }
25
+ declare function fetchForm(options: CloudClientOptions, signal?: AbortSignal, after?: number): Promise<PublishedForm>;
26
+ declare function fetchDefinition(options: CloudClientOptions, signal?: AbortSignal): Promise<FormDefinition>;
27
+ interface CloudSubmitterOptions extends CloudClientOptions {
28
+ version?: number;
29
+ renderToken?: string;
30
+ firstRenderToken?: string;
31
+ extraBody?: () => Record<string, unknown>;
32
+ }
33
+ declare function createSubmitter(options: CloudSubmitterOptions): (values: Record<string, unknown>, skippedSteps?: string[]) => Promise<CloudSubmission>;
34
+
35
+ interface DraftStorage {
36
+ getItem(key: string): string | null;
37
+ setItem(key: string, value: string): void;
38
+ removeItem(key: string): void;
39
+ }
40
+ interface DraftStore {
41
+ load(id: string, version: number | undefined): Record<string, unknown> | null;
42
+ save(id: string, version: number | undefined, values: Record<string, unknown>): void;
43
+ clear(id: string): void;
44
+ }
45
+ declare function sessionDraftStore(maxAge?: number, storageOf?: () => DraftStorage | undefined): DraftStore;
46
+
47
+ interface CloudNotice {
48
+ tone: 'error' | 'info';
49
+ message: string;
50
+ action: CloudAction;
51
+ details: string[];
52
+ }
53
+ interface CloudState {
54
+ definition: FormDefinition | null;
55
+ version: number | null;
56
+ settings: CloudSettings;
57
+ loadError: Error | null;
58
+ errors: Record<string, string>;
59
+ notice: CloudNotice | null;
60
+ initialValues: Record<string, unknown> | null;
61
+ revision: number;
62
+ attempt: number;
63
+ done: boolean;
64
+ }
65
+ interface CloudCallbacks {
66
+ onChange(state: CloudState): void;
67
+ onSuccess?(submission: CloudSubmission): void;
68
+ onError?(error: unknown): void;
69
+ }
70
+ interface CloudControllerOptions extends CloudClientOptions {
71
+ initialForm?: PublishedForm;
72
+ extraBody?: () => Record<string, unknown>;
73
+ draftStore?: DraftStore;
74
+ }
75
+ declare const initialCloudState: CloudState;
76
+ declare function cloudStateFor(form?: PublishedForm): CloudState;
77
+ declare function createCloudController(options: CloudControllerOptions, callbacks: CloudCallbacks): {
78
+ start(): void;
79
+ dispose(): void;
80
+ saveDraft(values: Record<string, unknown>): void;
81
+ again(): void;
82
+ submit(values: Record<string, unknown>, skippedSteps?: string[]): Promise<void>;
83
+ };
84
+
85
+ export { type CloudAction as C, type DraftStorage as D, type PublishedForm as P, type CloudClientOptions as a, type CloudNotice as b, type CloudSettings as c, type CloudSubmission as d, type CloudSubmitterOptions as e, type DraftStore as f, createSubmitter as g, fetchDefinition as h, fetchForm as i, type CloudCallbacks as j, type CloudControllerOptions as k, type CloudState as l, cloudStateFor as m, createCloudController as n, initialCloudState as o, sessionDraftStore as s };
@@ -31,6 +31,10 @@ interface ShowCondition {
31
31
  in?: (string | number)[];
32
32
  notIn?: (string | number)[];
33
33
  notEmpty?: boolean;
34
+ gt?: number;
35
+ gte?: number;
36
+ lt?: number;
37
+ lte?: number;
34
38
  }
35
39
  interface FieldValidation {
36
40
  required?: boolean | string;
@@ -52,7 +56,6 @@ interface FieldValidation {
52
56
  interface FormAction {
53
57
  label: string;
54
58
  variant?: 'primary' | 'secondary' | 'text';
55
- action?: string;
56
59
  disabled?: ShowCondition[];
57
60
  }
58
61
 
@@ -84,4 +87,4 @@ interface FormStep {
84
87
  skip?: FormAction;
85
88
  }
86
89
 
87
- export type { DefaultFieldType as D, FormField as F, ShowCondition as S, FormStep as a, FormDefinition as b, FieldOption as c, FieldType as d, FieldValidation as e, FormAction as f, StepRoute as g };
90
+ export type { DefaultFieldType as D, FormField as F, ShowCondition as S, FormStep as a, FieldOption as b, FieldType as c, FieldValidation as d, FormAction as e, FormDefinition as f, StepRoute as g };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,9 @@
1
- import { F as FormField, a as FormStep, b as FormDefinition, S as ShowCondition } from './definition-BAHgjY7x.js';
2
- export { D as DefaultFieldType, c as FieldOption, d as FieldType, e as FieldValidation, f as FormAction, g as StepRoute } from './definition-BAHgjY7x.js';
1
+ import { F as FormField, a as FormStep, S as ShowCondition } from './definition-Bufih_Bx.js';
2
+ export { D as DefaultFieldType, b as FieldOption, c as FieldType, d as FieldValidation, e as FormAction, f as FormDefinition, g as StepRoute } from './definition-Bufih_Bx.js';
3
+ export { A as AfterStepChangeFn, B as BeforeStepChangeFn, a as BeforeSubmitFn, F as FormEngine, b as FormEngineOptions, S as StepChangeContext, c as StepValidateFn, d as SubmitFn } from './runtime-LNJU0Dra.js';
4
+ import { V as ValidatorFn } from './validate-field-glVVoN3E.js';
5
+ export { D as DefinitionIssue, a as DefinitionIssueCode, F as FormDefinitionError, v as validateFieldValue } from './validate-field-glVVoN3E.js';
6
+ export { C as CheckDefinitionOptions, c as checkDefinition, p as parseDefinition } from './check-definition-BTMV3Ziq.js';
3
7
 
4
8
  type FormAnalyticsEvent = {
5
9
  type: 'step_viewed';
@@ -25,106 +29,20 @@ type FormAnalyticsEvent = {
25
29
  } | {
26
30
  type: 'form_submitted';
27
31
  fieldCount: number;
28
- } | {
29
- type: 'form_abandoned';
30
- lastStepId: string;
31
- filledFields: number;
32
32
  };
33
33
 
34
- declare function getDefaultMessage(rule: string, params?: Record<string, unknown>): string;
34
+ declare function validateDefinition(input: unknown): string[];
35
35
 
36
- type ValidatorFn = (value: unknown, allValues: Record<string, unknown>) => string | null;
37
- declare function validateField(field: FormField, value: unknown, allValues: Record<string, unknown>, validators?: Record<string, ValidatorFn>): string | null;
36
+ type ValidationRule = 'required' | 'minLength' | 'maxLength' | 'min' | 'max' | 'pattern' | 'matchField';
37
+ declare function getDefaultMessage(rule: ValidationRule, params?: Record<string, unknown>): string;
38
38
 
39
39
  declare function validateStep(step: FormStep, values: Record<string, unknown>, validators?: Record<string, ValidatorFn>): Record<string, string>;
40
40
  declare function validateFields(fields: FormField[], values: Record<string, unknown>, validators?: Record<string, ValidatorFn>): Record<string, string>;
41
41
 
42
- type StepValidateFn = (stepId: string, values: Record<string, unknown>) => Promise<Record<string, string> | null | void>;
43
- interface StepChangeContext {
44
- fromStepId: string;
45
- toStepId: string;
46
- direction: 'next' | 'back';
47
- reason: 'next' | 'back' | 'autoAdvance' | 'skip';
48
- values: Record<string, unknown>;
49
- }
50
- type BeforeStepChangeFn = (context: StepChangeContext) => boolean | void | Promise<boolean | void>;
51
- type AfterStepChangeFn = (context: StepChangeContext) => void | Promise<void>;
52
- type BeforeSubmitFn = (values: Record<string, unknown>) => boolean | void | Promise<boolean | void>;
53
- type SubmitFn = (values: Record<string, unknown>, skippedSteps?: string[]) => void | Promise<void>;
54
- interface FormEngineOptions {
55
- onBeforeStepChange?: BeforeStepChangeFn;
56
- onAfterStepChange?: AfterStepChangeFn;
57
- onBeforeSubmit?: BeforeSubmitFn;
58
- onAfterSubmit?: SubmitFn;
59
- validators?: Record<string, ValidatorFn>;
60
- onStepValidate?: StepValidateFn;
61
- }
62
-
63
- declare class FormEngine {
64
- readonly definition: FormDefinition;
65
- values: Record<string, unknown>;
66
- errors: Record<string, string>;
67
- topLevelErrors: string[];
68
- currentStepIndex: number;
69
- fieldLoading: Record<string, boolean>;
70
- stepValidating: boolean;
71
- submitting: boolean;
72
- private readonly skipped;
73
- private validationEpoch;
74
- private operationEpoch;
75
- private readonly lifecycle;
76
- private readonly validators;
77
- private get onStepValidate();
78
- private readonly visibility;
79
- private readonly subscriptions;
80
- constructor(definition: FormDefinition, initialValues?: Record<string, unknown>, options?: FormEngineOptions);
81
- get isMultiStep(): boolean;
82
- get visibleSteps(): FormStep[];
83
- get currentStep(): FormStep | null;
84
- get visibleFields(): FormField[];
85
- get isFirstStep(): boolean;
86
- get isLastStep(): boolean;
87
- get canGoNext(): boolean;
88
- get progress(): {
89
- current: number;
90
- total: number;
91
- };
92
- subscribe(listener: () => void): () => void;
93
- getSnapshot(): number;
94
- subscribeField(key: string, listener: () => void): () => void;
95
- getFieldSnapshot(key: string): number;
96
- subscribeStructure(listener: () => void): () => void;
97
- getStructureSnapshot(): number;
98
- setValue(key: string, value: unknown): void;
99
- setErrors(errors: Record<string, string>): void;
100
- setFieldLoading(key: string, loading: boolean): void;
101
- cancelPendingActions(): void;
102
- nextStep(): boolean;
103
- nextStepAsync(reason?: 'next' | 'autoAdvance'): Promise<boolean>;
104
- prevStepAsync(): Promise<boolean>;
105
- skipStep(): boolean;
106
- skipStepAsync(submit?: SubmitFn): Promise<boolean>;
107
- isStepSkipped(stepId: string): boolean;
108
- submitAsync(submit: SubmitFn): Promise<boolean>;
109
- prevStep(): void;
110
- validate(): Record<string, string>;
111
- validateField(key: string): string | null;
112
- getSubmitValues(): Record<string, unknown>;
113
- goToStepWithField(key: string): void;
114
- reset(values?: Record<string, unknown>): void;
115
- private warnAboutDefinition;
116
- private get internals();
117
- private notify;
118
- }
119
-
120
42
  declare function evaluateCondition(condition: ShowCondition, values: Record<string, unknown>): boolean;
121
43
 
122
- declare const isStepVisible: (step: FormStep, values: Record<string, unknown>) => boolean;
123
-
124
44
  declare function isVisible(field: Pick<FormField, 'show' | 'showAny'>, values: Record<string, unknown>): boolean;
125
45
 
126
- declare function validateDefinition(input: unknown): string[];
127
-
128
46
  declare class FormLifecycleError extends Error {
129
47
  readonly phase: 'afterStepChange' | 'afterSubmit';
130
48
  readonly committed = true;
@@ -132,6 +50,4 @@ declare class FormLifecycleError extends Error {
132
50
  constructor(phase: 'afterStepChange' | 'afterSubmit', cause: unknown);
133
51
  }
134
52
 
135
- declare function shouldApplyExternalErrors(engine: FormEngine, previous: Record<string, string> | undefined, next: Record<string, string>): boolean;
136
-
137
- export { type AfterStepChangeFn, type BeforeStepChangeFn, type BeforeSubmitFn, type FormAnalyticsEvent, FormDefinition, FormEngine, type FormEngineOptions, FormField, FormLifecycleError, FormStep, ShowCondition, type StepChangeContext, type StepValidateFn, type SubmitFn, type ValidatorFn, evaluateCondition, getDefaultMessage, isStepVisible, isVisible, shouldApplyExternalErrors, validateDefinition, validateField, validateFields, validateStep };
53
+ export { type FormAnalyticsEvent, FormField, FormLifecycleError, FormStep, ShowCondition, type ValidationRule, ValidatorFn, evaluateCondition, getDefaultMessage, isVisible, validateDefinition, validateFields, validateStep };
package/dist/index.js CHANGED
@@ -1,4 +1,2 @@
1
- function O(t){return t==null||t===""||Array.isArray(t)&&!t.length}function $(t,e){let r=e[t.field];return t.eq!==void 0?r===t.eq:t.neq!==void 0?r!==t.neq:t.in!==void 0?t.in.includes(r):t.notIn!==void 0?!t.notIn.includes(r):t.notEmpty===true?!O(r):true}function u(t,e){let r=i=>$(i,e);return (t.show??[]).every(r)&&(!t.showAny?.length||t.showAny.some(r))}var m=u;function rt(t){return !!t.fields?.length&&!!t.steps?.length}function y(t){return !!t.steps?.some(e=>e.routes?.length)}function h(t){return [...t.show??[],...t.showAny??[]].map(e=>e.field)}function w(t){return t.steps?.length?t.steps.flatMap(e=>e.fields):t.fields??[]}function x(t,e){let r={};for(let i of t)i.defaultValue!==void 0&&(r[i.key]=i.defaultValue);return Object.assign(r,e)}function v(t,e){let r=new Set([...Object.keys(t),...Object.keys(e)]);return new Set([...r].filter(i=>!Object.is(t[i],e[i])))}function L(t){let e=t.steps??[],r=rt(t)?['FormEngine rejects a definition with both "fields" and "steps".']:[],i=new Map,n=new Map;e.forEach((s,a)=>{i.has(s.id)&&r.push(`Duplicate step id "${s.id}".`),i.set(s.id,a);for(let o of s.fields)n.set(o.key,a);});for(let{key:s}of w(t))(s in Object.prototype||s==="prototype")&&r.push(`Reserved field key "${s}".`);return y(t)&&e.forEach((s,a)=>{for(let o of s.routes??[]){let l=o.to===null?null:i.get(o.to);(l===void 0||l!==null&&l<=a)&&r.push(`Invalid route from "${s.id}" to "${o.to}": targets must be later steps or null.`);for(let d of h(o))(n.get(d)??1/0)<=a||r.push(`Invalid route on "${s.id}": condition field "${d}" must belong to this or an earlier step.`);}}),r}function it(t){let e=t.steps??[],r=[];for(let i of e){let n=new Set((i.routes??[]).map(s=>s.to).filter(s=>s!==null));for(let s of n){let a=e.findIndex(d=>d.id===s),o=e[a+1],l=e[a]?.routes?.some(d=>!d.show?.length&&!d.showAny?.length);o&&n.has(o.id)&&!l&&r.push(`Route branch "${s}" from "${i.id}" continues into sibling branch "${o.id}". Add an unconditional route where it should continue.`);}}return r}function U(t,e){let r=t.steps??[];if(!y(t))return r.filter(a=>m(a,e));let i=new Map(r.map((a,o)=>[a.id,o])),n=[],s={};for(let a=0;a<r.length;){let o=r[a];if(!m(o,s)){a++;continue}n.push(o),Object.assign(s,st(o,e,s));let l=o.routes?.find(d=>u(d,s)&&(d.to===null||(i.get(d.to)??-1)>a&&m(r[i.get(d.to)],s)));if(l?.to===null)break;a=l?i.get(l.to):a+1;}return n}function nt(t,e,r){let i=t[r]??t[t.length-1],n=e.findIndex(a=>a.id===i?.id);if(n!==-1)return n;let s=new Map(e.map((a,o)=>[a.id,o]));for(let a=Math.min(r-1,t.length-1);a>=0;a--){let o=s.get(t[a].id);if(o!==void 0)return o}return 0}function st(t,e,r){let i={...r};for(let s of t.fields)i[s.key]=e[s.key];let n={};for(let s of t.fields)u(s,i)&&e[s.key]!==void 0&&(n[s.key]=e[s.key]);return n}var j=class{constructor(e){this.definition=e;this.source=null;this.activeStepList=[];this.activeValueMap={};this.enabled=y(e);}invalidate(){this.source=null;}steps(e){return this.refresh(e),this.activeStepList}values(e){return this.refresh(e),this.activeValueMap}refresh(e){if(this.source===e)return;this.source=e,this.activeStepList=U(this.definition,e);let r={};for(let i of this.activeStepList)Object.assign(r,st(i,e,r));this.activeValueMap=r;}};function ot(t){let e=[],r=new Map,i=w(t),n=new Set;for(let{key:o}of i)n.has(o)&&e.push(`Duplicate field key "${o}" \u2014 fields will share state and overwrite each other`),n.add(o);let s=(o,l,d,p)=>{let f=h(d);for(let c of f)typeof c!="string"?e.push(`${o} "${l}" has a show condition without a "field" name`):n.has(c)||e.push(`${o} "${l}" has show condition referencing non-existent field "${c}"`);if(f.length)for(let c of p)r.set(c,[...r.get(c)??[],...f]);};for(let o of i){s("Field",o.key,o,[o.key]);let l=o.validation?.pattern;if(l!==void 0)try{new RegExp(l);}catch{e.push(`Field "${o.key}" has invalid regex pattern: "${l}"`);}}let a=new Set;for(let o of t.steps??[]){s("Step",o.id,o,o.fields.map(l=>l.key));for(let l of h(o))y(t)&&n.has(l)&&!a.has(l)&&e.push(`Step "${o.id}" condition field "${l}" must belong to an earlier step.`);for(let{key:l}of o.fields)a.add(l);o.skip&&(o.next===false||!t.steps[1])&&e.push(`Step "${o.id}" has "skip" but no Next button or later step.`);}return {graph:r,warnings:e}}var K=t=>typeof t=="object"&&t!==null&&!Array.isArray(t);function k(t,e,r,i=false){return t==null&&!i?[]:Array.isArray(t)?t.flatMap((n,s)=>r(n,`${e}[${s}]`)):[`${e} must be an array.`]}function B(t,e){return (r,i)=>K(r)?e(r,i):[`${i} must be ${t}.`]}var at=B("a condition object",()=>[]);function X(t,e){return [...k(t.show,`${e}.show`,at),...k(t.showAny,`${e}.showAny`,at)]}var lt=B("a field object",X),Vt=B("a route object",X),It=B("a step object",(t,e)=>[...k(t.fields,`${e}.fields`,lt,true),...X(t,e),...k(t.routes,`${e}.routes`,Vt)]);function N(t){return K(t)?[...k(t.fields,"fields",lt),...k(t.steps,"steps",It)]:["Form definition must be an object."]}function Rt(t){let e=new Map,r=[];for(let i of t.keys()){if(e.has(i))continue;e.set(i,true);let n=[[i,0]];for(;n.length>0;){let s=n[n.length-1],a=t.get(s[0])?.[s[1]++];if(a===void 0)e.set(s[0],false),n.pop();else if(e.get(a)){let o=n.map(([l])=>l);r.push([...o.slice(o.indexOf(a)),a]);}else e.has(a)||(e.set(a,true),n.push([a,0]));}}return r}function P(t){let e=N(t);if(e.length)return e;let r=t,{graph:i,warnings:n}=ot(r);K(r.submit)||n.unshift('Form definition is missing the "submit" action.');for(let s of Rt(i))n.push(`Circular show condition detected: ${s.join(" -> ")}`);return [...L(r),...n,...it(r)]}var T=class extends Error{constructor(r,i){super(`The action completed, but ${r} failed: ${i instanceof Error?i.message:String(i)}`);this.phase=r;this.committed=true;this.name="FormLifecycleError",this.cause=i;}};async function G(t,e){try{await e();}catch(r){throw new T(t,r)}}function dt(t){return t.visibleSteps.map(e=>e.id).join(`
2
- `)}function R(t,e){let r=dt(t);return ()=>dt(t)!==r||Object.keys(e).some(i=>e[i]!==void 0&&!Object.is(t.values[i],e[i]))}function g(t,e){switch(t){case "required":return "This field is required";case "minLength":return `Must be at least ${e?.min} ${e?.unit??"characters"}`;case "maxLength":return `Must be at most ${e?.max} ${e?.unit??"characters"}`;case "min":return `Must be at least ${e?.min}`;case "max":return `Must be at most ${e?.max}`;case "pattern":return "Invalid format";case "matchField":return "Fields must match";default:return "Invalid value"}}var Ct=new Set(["checkbox","switch"]);function Mt(t,e){return O(t)||t===false&&Ct.has(e.type)}function ut(t,e,r,i){let n=r[`min${e}`],s=r[`max${e}`];if(n!==void 0&&t<n)return r[`min${e}Message`]??g(`min${e}`,{min:n,unit:i});if(s!==void 0&&t>s)return r[`max${e}Message`]??g(`max${e}`,{max:s,unit:i})}function At(t,e){if(e.pattern!==void 0)try{return new RegExp(e.pattern).test(String(t))?void 0:e.patternMessage??g("pattern")}catch{return}}function F(t,e,r,i){let n=t.validation;if(!n)return null;if(Mt(e,t))return n.required?typeof n.required=="string"?n.required:g("required"):null;let s=typeof e=="string"||Array.isArray(e)?ut(e.length,"Length",n,Array.isArray(e)?"items":void 0):typeof e=="number"?ut(e,"",n):void 0,a=n.matchField!==void 0&&e!==r[n.matchField]?n.matchFieldMessage??g("matchField"):void 0;return (s??At(e,n)??a??(n.validator?i?.[n.validator]?.(e,r):void 0))||null}function b(t,e,r){return C(t.fields,e,r)}function C(t,e,r){let i={};for(let n of t){if(!u(n,e))continue;let s=F(n,e[n.key],e,r);s&&(i[n.key]=s);}return i}function q(t,e,r=false){let i=t.errors;t.errors={},t.topLevelErrors=[];for(let[s,a]of Object.entries(e))t.visibility.isFieldVisible(s,t.values)?t.errors[s]=a:t.topLevelErrors.push(a);let n=r&&pt(t,e);t.notify({fieldKeys:v(i,t.errors),structureChanged:n});}function pt(t,e){let r=Object.keys(e).find(n=>t.errors[n]!==void 0),i=r&&t.isMultiStep?t.visibility.findStepIndex(r,t.values,t.currentStepIndex):null;return i===null||i===t.currentStepIndex?false:(t.currentStepIndex=i,true)}function ct(t,e){let r=[];for(let i of t.visibility.allFields)i.validation?.matchField!==e||t.errors[i.key]===void 0||F(i,t.values[i.key],E(t),t.validators)||(delete t.errors[i.key],r.push(i.key));return r}function ft(t){let e=new Set(t.visibleSteps.flatMap(i=>i.fields.map(n=>n.key))),r=Object.keys(t.errors).filter(i=>!e.has(i));for(let i of r)delete t.errors[i];return r}function E(t){return y(t.definition)?V(t):ht(t,{...t.values})}function ht(t,e){for(let r of [...t.skipped.values()].flat())delete e[r];return e}function M(t,e=false){let r=t.errors,i={};if(t.isMultiStep)for(let s of t.visibleSteps)t.skipped.has(s.id)||Object.assign(i,b(s,E(t),t.validators));else Object.assign(i,C(t.definition.fields??[],t.values,t.validators));t.errors=i;let n=e&&pt(t,i);return t.notify({fieldKeys:v(r,i),structureChanged:n}),i}function mt(t,e){let r=t.visibility.fieldByKey.get(e);if(!r||!t.visibility.isFieldVisible(e,t.values))return null;let i=t.errors[e],n=F(r,t.values[e],E(t),t.validators);n?t.errors[e]=n:delete t.errors[e];let s=Object.is(i,t.errors[e])?[]:[e];return t.notify({fieldKeys:s}),n}function V(t){let e={},r=t.visibility.getVisibleFieldKeys(t.values,t.currentStepIndex);for(let i of r)t.values[i]!==void 0&&(e[i]=t.values[i]);return ht(t,e)}function yt(t,e){let r=t.values,i=t.errors,n=Object.keys(t.fieldLoading);t.validationEpoch++,t.operationEpoch++,t.submitting=false,t.values=x(t.visibility.allFields,e),t.errors={},t.topLevelErrors=[],t.fieldLoading={},t.stepValidating=false,t.currentStepIndex=0,t.skipped.clear(),t.visibility.reconcileHidden(t.values,t.errors);let s=v(r,t.values),a=new Set([...s,...v(i,t.errors),...n]);t.notify({fieldKeys:a,structureChanged:true,valuesChanged:s.size>0});}function gt(t){let e=t.currentStep?.fields??[],r={...t.values};for(let{key:i}of e)delete r[i];return Object.assign(r,x(e))}function H(t){return U(t.definition,gt(t))[t.currentStepIndex+1]}function z(t){let e=t.currentStep,r=e.fields.map(({key:i})=>i);t.values=gt(t);for(let i of r)delete t.errors[i];return t.skipped.set(e.id,r),t.visibility.reconcileHidden(t.values,t.errors),t.notify({fieldKeys:r,structureChanged:true,valuesChanged:true}),r}function A(t){let e=t.currentStep;e&&t.skipped.delete(e.id);}async function W(t,e,r=false){if(t.submitting||t.stepValidating)return false;r||A(t);let i={...t.lifecycle},n=false,s=t.validationEpoch,a=++t.operationEpoch,o=V(t),l=R(t,o),d=()=>s!==t.validationEpoch||a!==t.operationEpoch||l();t.submitting=true,t.notify();try{if(d()||Object.keys(M(t,!0)).length>0||d())return !1;if(i.onBeforeSubmit){let p=await i.onBeforeSubmit(o);if(d()||p===!1)return !1}if(d())return !1;if(i.onBeforeSubmit){if(Object.keys(M(t,!0)).length>0||d())return !1;o=V(t);}return n=!0,await e(o,[...t.skipped.keys()]),a!==t.operationEpoch||await G("afterSubmit",()=>i.onAfterSubmit?.(o)),!0}catch(p){if(!n&&d())return false;throw p}finally{a===t.operationEpoch&&(t.submitting=false,t.notify());}}function Z(t){let e=t.currentStep;if(!e)return true;let r=b(e,E(t),t.validators);if(Object.keys(r).length===0)return false;let i={...t.errors};return Object.assign(t.errors,r),t.notify({fieldKeys:v(i,t.errors)}),true}function Q(t,e){t.validationEpoch++,t.currentStepIndex=e,t.notify({structureChanged:true});}function bt(t){return t.isLastStep?false:(Q(t,t.currentStepIndex+1),true)}function St(t){return t.isMultiStep?(A(t),!Z(t)&&bt(t)):false}function vt(t){return !t.isMultiStep||!H(t)?false:(z(t),bt(t))}async function Ft(t,e){if(!t.isMultiStep||t.stepValidating||t.submitting)return false;if(H(t))return Y(t,"next","skip");let r=t.currentStep;if(!e||!r)return false;let i=t.values,n={...t.errors},s=false,a=z(t),o=t.values,l=R(t,{...o});try{return await W(t,async(d,p)=>{await e(d,p),s=!0;},!0)}finally{!s&&t.values===o&&!l()&&(t.values=i,t.errors={...n,...t.errors},t.skipped.delete(r.id),t.notify({fieldKeys:a,structureChanged:true,valuesChanged:true}));}}async function Y(t,e,r=e){let i=r==="skip";if(!t.isMultiStep||t.stepValidating||t.submitting||!i&&(e==="next"?t.isLastStep:t.isFirstStep))return false;let n=t.currentStep,s=e==="next"&&!i;if(s&&A(t),s&&Z(t))return false;let a={...t.lifecycle},o=t.onStepValidate,l=false,p=t.currentStepIndex+(e==="next"?1:-1),f=i?H(t):t.visibleSteps[p];if(!f)return false;let c={fromStepId:n.id,toStepId:f.id,direction:e,reason:r,values:{...E(t)}},kt=t.validationEpoch,et=++t.operationEpoch,Et=R(t,c.values),I=()=>kt!==t.validationEpoch||et!==t.operationEpoch||t.currentStep?.id!==n.id||Et();t.stepValidating=true,t.notify();try{if(I())return !1;if(s&&o){let S=await o(n.id,c.values);if(I())return !1;if(S&&Object.keys(S).length>0)return q(t,S),!1}if(a.onBeforeStepChange){let S=await a.onBeforeStepChange(c);if(I()||S===!1)return !1}return I()||s&&Z(t)?!1:(l=!0,i&&z(t),Q(t,p),await G("afterStepChange",()=>a.onAfterStepChange?.(c)),!0)}catch(S){if(!l&&I())return false;throw S}finally{et===t.operationEpoch&&(t.stepValidating=false,t.notify());}}function wt(t){t.isMultiStep&&!t.isFirstStep&&Q(t,t.currentStepIndex-1);}function xt(t,e){if(!t.isMultiStep)return;let r=t.visibility.findStepIndex(e,t.values,t.currentStepIndex);r===t.currentStepIndex?t.notify():r!==null&&Q(t,r);}var _=class{constructor(){this.version=0;this.listeners=new Set;this.fieldVersions=new Map;this.fieldListeners=new Map;this.structureVersion=0;this.structureListeners=new Set;}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}getSnapshot(){return this.version}subscribeField(e,r){let i=this.fieldListeners.get(e)??new Set;return i.add(r),this.fieldListeners.set(e,i),()=>{i.delete(r),i.size===0&&this.fieldListeners.delete(e);}}getFieldSnapshot(e){return this.fieldVersions.get(e)??0}subscribeStructure(e){return this.structureListeners.add(e),()=>this.structureListeners.delete(e)}getStructureSnapshot(){return this.structureVersion}notify({fieldKeys:e=[],structureChanged:r=false}={}){for(let i of new Set(e))this.notifyField(i);r&&this.notifyStructure(),this.version++;for(let i of this.listeners)i();}notifyField(e){this.fieldVersions.set(e,(this.fieldVersions.get(e)??0)+1);for(let r of this.fieldListeners.get(e)??[])r();}notifyStructure(){this.structureVersion++;for(let e of this.structureListeners)e();}};function tt(t,e){for(let r of h(t)){let i=e.get(r)??new Set;i.add(t),e.set(r,i);}}var J=class{constructor(e){this.definition=e;this.routeFields=new Set;this.fieldDependents=new Map;this.stepDependents=new Map;this.stepByFieldKey=new Map;this.visibilityDirty=true;this.canGoNextDirty=true;this.cache={visibleSteps:[],currentStep:null,visibleFields:[],canGoNext:false};this.allFields=w(e),this.fieldByKey=new Map(this.allFields.map(r=>[r.key,r])),this.path=new j(e);for(let r of e.steps??[])for(let i of r.fields)this.stepByFieldKey.set(i.key,r);this.buildIndexes();}markChanged(e,r){(e||r)&&this.path.invalidate(),e?(this.visibilityDirty=true,this.canGoNextDirty=true):r&&(this.canGoNextDirty=true);}state(e,r){return this.recomputeVisibility(e,r),this.cache}getCanGoNext(e,r,i){if(this.recomputeVisibility(e,r),!this.canGoNextDirty)return this.cache.canGoNext;this.canGoNextDirty=false;let n=this.cache.currentStep,s=n?b(n,this.conditionValues(e),i):{};return this.cache.canGoNext=this.isMultiStep&&Object.keys(s).length===0,this.cache.canGoNext}findStepIndex(e,r,i){let s=this.state(r,i).visibleSteps.findIndex(a=>a.fields.some(o=>o.key===e));return s===-1?null:s}affectsStructure(e,r){return this.routeFields.has(e)||this.fieldDependents.has(e)||this.stepDependents.has(e)||r.size>0}cascadeHiddenFields(e,r,i){return this.path.invalidate(),this.hasRoutes?this.reconcileHidden(r,i):this.drainQueue(new Set([e]),r,i)}reconcileHidden(e,r){this.path.invalidate();let i=new Set([...this.fieldDependents.keys(),...this.stepDependents.keys()]);return this.drainQueue(i,e,r)}drainQueue(e,r,i){let n=[...e],s=new Set(n),a=new Set,o=l=>{delete r[l],delete i[l],this.path.invalidate(),a.add(l),!s.has(l)&&(s.add(l),n.push(l));};for(let l=0;l<n.length;l++){let d=n[l];s.delete(d),this.clearHiddenFields(this.fieldDependents.get(d),r,o),this.clearHiddenSteps(this.stepDependents.get(d),r,o);}return a}isFieldVisible(e,r){let i=this.fieldByKey.get(e);if(!i||!u(i,this.conditionValues(r)))return false;let n=this.stepByFieldKey.get(e);return !n||this.path.steps(r).includes(n)}getVisibleFieldKeys(e,r){if(this.hasRoutes)return new Set(Object.keys(this.path.values(e)));let i=new Set,n=this.isMultiStep?this.state(e,r).visibleSteps.flatMap(s=>s.fields):this.definition.fields??[];for(let s of n)u(s,this.conditionValues(e))&&i.add(s.key);return i}conditionValues(e){return this.hasRoutes?this.path.values(e):e}get hasRoutes(){return this.path.enabled}get isMultiStep(){return (this.definition.steps??[]).length>0}buildIndexes(){for(let e of this.allFields)tt(e,this.fieldDependents);for(let e of this.definition.steps??[]){tt(e,this.stepDependents);for(let r of e.routes??[])for(let i of h(r))this.routeFields.add(i);}}recomputeVisibility(e,r){if(!this.visibilityDirty)return;if(this.visibilityDirty=false,!this.isMultiStep){this.cache.visibleSteps=[],this.cache.currentStep=null,this.cache.visibleFields=(this.definition.fields??[]).filter(s=>u(s,this.conditionValues(e)));return}this.cache.visibleSteps=this.path.steps(e);let i=this.cache.visibleSteps;this.cache.currentStep=i[r]??i[i.length-1]??null;let n=this.cache.currentStep;this.cache.visibleFields=n?n.fields.filter(s=>u(s,this.conditionValues(e))):[];}clearHiddenFields(e,r,i){for(let n of e??[]){let s=this.stepByFieldKey.get(n.key);this.hasRoutes&&s&&!this.path.steps(r).includes(s)||u(n,this.conditionValues(r))||r[n.key]===void 0||i(n.key);}}clearHiddenSteps(e,r,i){for(let n of e??[])if(!m(n,this.conditionValues(r)))for(let s of n.fields)r[s.key]!==void 0&&i(s.key);}};var Dt=new WeakSet,D=class{constructor(e,r,i){this.definition=e;this.errors={};this.topLevelErrors=[];this.currentStepIndex=0;this.fieldLoading={};this.stepValidating=false;this.submitting=false;this.skipped=new Map;this.validationEpoch=0;this.operationEpoch=0;this.subscriptions=new _;let n=N(e),s=n.length?n:L(e);if(s.length)throw new Error(s.join(`
3
- `));this.lifecycle=i??{},this.validators=i?.validators??{},this.visibility=new J(e),Dt.has(this.lifecycle)||this.warnAboutDefinition(),this.values=x(this.visibility.allFields,r),this.visibility.reconcileHidden(this.values,this.errors);}get onStepValidate(){return this.lifecycle.onStepValidate}get isMultiStep(){return (this.definition.steps??[]).length>0}get visibleSteps(){return this.visibility.state(this.values,this.currentStepIndex).visibleSteps}get currentStep(){return this.visibility.state(this.values,this.currentStepIndex).currentStep}get visibleFields(){return this.visibility.state(this.values,this.currentStepIndex).visibleFields}get isFirstStep(){return this.currentStepIndex===0}get isLastStep(){return this.currentStepIndex>=this.visibleSteps.length-1}get canGoNext(){return this.visibility.getCanGoNext(this.values,this.currentStepIndex,this.validators)}get progress(){let e=this.visibleSteps.length;return {current:Math.min(this.currentStepIndex+1,e),total:e}}subscribe(e){return this.subscriptions.subscribe(e)}getSnapshot(){return this.subscriptions.getSnapshot()}subscribeField(e,r){return this.subscriptions.subscribeField(e,r)}getFieldSnapshot(e){return this.subscriptions.getFieldSnapshot(e)}subscribeStructure(e){return this.subscriptions.subscribeStructure(e)}getStructureSnapshot(){return this.subscriptions.getStructureSnapshot()}setValue(e,r){let i=this.isMultiStep?this.visibleSteps:null,n=!Object.is(this.values[e],r),s=this.errors[e]!==void 0;this.values[e]=r,delete this.errors[e];for(let[f,c]of this.skipped)n&&c.includes(e)&&this.skipped.delete(f);let a=this.visibility.cascadeHiddenFields(e,this.values,this.errors),o=ct(this.internals,e),l=new Set([...a,...o]);(n||s)&&l.add(e);let d=n||a.size>0,p=d&&this.visibility.affectsStructure(e,a);if(i&&p){this.visibility.markChanged(true,true),this.currentStepIndex=nt(i,this.visibleSteps,this.currentStepIndex);for(let f of ft(this.internals))l.add(f);}this.notify({fieldKeys:l,structureChanged:p,valuesChanged:d});}setErrors(e){q(this.internals,e,true);}setFieldLoading(e,r){let i=this.fieldLoading[e]===true;r?this.fieldLoading[e]=true:delete this.fieldLoading[e],this.notify({fieldKeys:i===r?[]:[e]});}cancelPendingActions(){this.validationEpoch++,this.operationEpoch++,this.stepValidating=false,this.submitting=false,this.notify();}nextStep(){return St(this.internals)}nextStepAsync(e="next"){return Y(this.internals,"next",e)}prevStepAsync(){return Y(this.internals,"back")}skipStep(){return vt(this.internals)}skipStepAsync(e){return Ft(this.internals,e)}isStepSkipped(e){return this.skipped.has(e)}submitAsync(e){return W(this.internals,e)}prevStep(){wt(this.internals);}validate(){return M(this.internals)}validateField(e){return mt(this.internals,e)}getSubmitValues(){return V(this.internals)}goToStepWithField(e){xt(this.internals,e);}reset(e){yt(this.internals,e);}warnAboutDefinition(){let e=P(this.definition);for(let{key:r,validation:i}of this.visibility.allFields){let n=i?.validator;n&&!this.validators[n]&&e.push(`Field "${r}" references unknown validator "${n}".`);}for(let r of e)console.warn(`[FormEngine] ${r}`);}get internals(){return this}notify(e={}){this.visibility.markChanged(!!e.structureChanged,!!e.valuesChanged),this.subscriptions.notify(e);}};function Ot(t,e){let r=Object.keys(e);return r.length===Object.keys(t).length&&r.every(i=>t[i]===e[i])}function $t(t,e){return Object.entries(e).every(([r,i])=>t.errors[r]===i||t.topLevelErrors.includes(i))}function jt(t,e,r){return !e||!Ot(e,r)||!$t(t,r)}export{D as FormEngine,T as FormLifecycleError,$ as evaluateCondition,g as getDefaultMessage,m as isStepVisible,u as isVisible,jt as shouldApplyExternalErrors,P as validateDefinition,F as validateField,C as validateFields,b as validateStep};//# sourceMappingURL=index.js.map
1
+ export{a as FormDefinitionError,e as FormEngine,b as checkDefinition,c as parseDefinition,d as validateDefinition}from'./chunk-47C7QX7J.js';export{d as FormLifecycleError,g as evaluateCondition,e as getDefaultMessage,h as isVisible,m as validateFieldValue,o as validateFields,n as validateStep}from'./chunk-YXQFFAXK.js';//# sourceMappingURL=index.js.map
4
2
  //# sourceMappingURL=index.js.map