@formhaus/core 0.12.0 → 0.13.0
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.
- package/README.md +1 -0
- package/dist/{check-definition-B-YU_XN6.d.ts → check-definition-DuLExofm.d.ts} +2 -2
- package/dist/chunk-4IHQINIH.js +3 -0
- package/dist/chunk-4IHQINIH.js.map +1 -0
- package/dist/chunk-5KV7BDCS.js +2 -0
- package/dist/chunk-5KV7BDCS.js.map +1 -0
- package/dist/chunk-FQ3GLJTI.js +5 -0
- package/dist/chunk-FQ3GLJTI.js.map +1 -0
- package/dist/chunk-PZEBYRGE.js +2 -0
- package/dist/chunk-PZEBYRGE.js.map +1 -0
- package/dist/{chunk-KXLWZLOO.js → chunk-UFYD5LVW.js} +3 -3
- package/dist/{chunk-KXLWZLOO.js.map → chunk-UFYD5LVW.js.map} +1 -1
- package/dist/chunk-Y33LPJXU.js +2 -0
- package/dist/chunk-Y33LPJXU.js.map +1 -0
- package/dist/cloud.d.ts +3 -3
- package/dist/cloud.js +1 -1
- package/dist/{controller-DXb698eH.d.ts → controller-Ds_kbXSU.d.ts} +1 -1
- package/dist/default-messages-yS4QtrYi.d.ts +23 -0
- package/dist/{definition-PdtKhxBh.d.ts → definition-B4OIy_wH.d.ts} +44 -1
- package/dist/i18n.d.ts +60 -0
- package/dist/i18n.js +2 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +11 -12
- package/dist/index.js +1 -1
- package/dist/internal.d.ts +8 -5
- package/dist/internal.js +1 -1
- package/dist/internal.js.map +1 -1
- package/dist/{runtime-Dn2_UIxt.d.ts → runtime-BzYG6cit.d.ts} +5 -2
- package/dist/server.d.ts +6 -4
- package/dist/server.iife.js +4 -4
- package/dist/server.iife.js.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/validate-field-ND_UxoJU.d.ts +7 -0
- package/fixtures/submissions/messages.json +155 -0
- package/package.json +6 -1
- package/schema/form-definition.schema.json +236 -0
- package/schema/form-translation.schema.json +222 -0
- package/dist/chunk-OBVVPPVA.js +0 -3
- package/dist/chunk-OBVVPPVA.js.map +0 -1
- package/dist/chunk-OZ352IOK.js +0 -5
- package/dist/chunk-OZ352IOK.js.map +0 -1
- package/dist/validate-field-dZd5yZAp.d.ts +0 -19
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cloud/failures.ts","../src/cloud/error.ts","../src/cloud/envelope.ts","../src/cloud/uuid.ts","../src/cloud/client.ts","../src/cloud/draft.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","VERSION_HEADERS","toVersion","headerVersion","name","text","parseSettings","redirect","parseForm","randomId","bytes","hex","byte","DEFAULT_API_BASE","CORE","endpoint","id","apiBase","LOAD_TIMEOUT","SUBMIT_TIMEOUT","send","url","timeout","init","signal","controller","abort","timer","fetchForm","options","after","query","fetchDefinition","createSubmitter","pending","values","skippedSteps","submission","SENSITIVE","WEEK","draftValues","definition","fields","step","kept","field","sessionStorageOf","sessionDraftStore","maxAge","storageOf","key","attempt","action","fallback","storage","draft"],"mappings":"AAOO,IAAMA,CAAAA,CAAuB,qEAAA,CACvBC,CAAAA,CAAe,sBAAA,CAEtBC,CAAAA,CAAuB,CAAE,OAAA,CAAS,kCAAA,CAAoC,MAAA,CAAQ,OAAQ,CAAA,CACtFC,CAAAA,CAAwB,CAAE,OAAA,CAAS,4BAAA,CAA8B,MAAA,CAAQ,OAAQ,CAAA,CACjFC,CAAAA,CAAuB,CAAE,OAAA,CAAS,iDAAkD,MAAA,CAAQ,QAAS,CAAA,CAErGC,CAAAA,CAAwC,CAC5C,OAAA,CAAS,CAAE,OAAA,CAAS,wEAAyE,MAAA,CAAQ,OAAQ,CAAA,CAC7G,OAAA,CAAS,CAAE,OAAA,CAAS,6CAAA,CAA+C,MAAA,CAAQ,OAAQ,CAAA,CACnF,OAAA,CAAS,CAAE,OAAA,CAAS,iCAAA,CAAmC,MAAA,CAAQ,IAAK,CAAA,CACpE,aAAc,CAAE,OAAA,CAAS,iDAAA,CAAmD,MAAA,CAAQ,OAAQ,CAAA,CAC5F,aAAA,CAAe,CAAE,QAAS,iDAAA,CAAmD,MAAA,CAAQ,IAAK,CAAA,CAC1F,SAAA,CAAW,CAAE,OAAA,CAAS,6BAAA,CAA+B,OAAQ,IAAK,CAAA,CAClE,MAAA,CAAQ,CAAE,OAAA,CAAS,sBAAA,CAAwB,MAAA,CAAQ,IAAK,CAAA,CACxD,OAAA,CAAS,CAAE,OAAA,CAAS,wBAAA,CAA0B,MAAA,CAAQ,IAAK,CAAA,CAC3D,eAAgB,CAAE,OAAA,CAAS,wDAAA,CAA0D,MAAA,CAAQ,IAAK,CAAA,CAClG,sBAAA,CAAwB,CAAE,QAAS,gDAAA,CAAkD,MAAA,CAAQ,OAAQ,CAAA,CACrG,YAAA,CAAc,CAAE,OAAA,CAAS,yCAAA,CAA2C,OAAQ,QAAS,CAAA,CACrF,eAAA,CAAiB,CAAE,OAAA,CAAS,+CAAA,CAAiD,MAAA,CAAQ,IAAK,EAC1F,cAAA,CAAgBD,CAAAA,CAChB,sBAAA,CAAwBA,CAAAA,CACxB,uBAAA,CAAyBA,CAAAA,CACzB,gBAAA,CAAkBF,CAAAA,CAClB,YAAaA,CAAAA,CACb,QAAA,CAAUA,CACZ,CAAA,CAEMI,CAAAA,CAAyC,CAC7C,CAAA,CAAG,SAAA,CACH,IAAK,gBAAA,CACL,GAAA,CAAK,eAAA,CACL,GAAA,CAAK,WAAA,CACL,GAAA,CAAK,QAAA,CACL,GAAA,CAAK,UACL,GAAA,CAAK,gBAAA,CACL,GAAA,CAAK,SAAA,CACL,GAAA,CAAK,iBAAA,CACL,GAAA,CAAK,cACP,EAEO,SAASC,CAAAA,CAAWC,CAAAA,CAAgBC,CAAAA,CAAO,EAAA,CAAkB,CAClE,IAAMC,EAAQL,CAAAA,CAAQI,CAAI,CAAA,EAAKJ,CAAAA,CAAQC,CAAAA,CAAeE,CAAM,CAAA,EAAK,EAAE,EACnE,OAAIE,CAAAA,GACGF,CAAAA,EAAU,GAAA,CAAMN,CAAAA,CAASC,CAAAA,CAClC,CClDO,IAAMQ,EAAN,cAAyB,KAAM,CAQpC,WAAA,CAAYH,CAAAA,CAAgBC,CAAAA,CAAcG,CAAAA,CAAiCC,CAAAA,CAAkBC,EAAiB,CAC5G,IAAMC,CAAAA,CAAUR,CAAAA,CAAWC,CAAAA,CAAQC,CAAI,CAAA,CACvC,KAAA,CAAMM,EAAQ,OAAO,CAAA,CACrB,IAAA,CAAK,IAAA,CAAO,YAAA,CACZ,IAAA,CAAK,MAAA,CAASP,CAAAA,CACd,KAAK,IAAA,CAAOC,CAAAA,CACZ,IAAA,CAAK,MAAA,CAASG,CAAAA,CACd,IAAA,CAAK,OAAA,CAAUC,CAAAA,CACf,KAAK,MAAA,CAASE,CAAAA,CAAQ,MAAA,CACtB,IAAA,CAAK,KAAA,CAAQD,EACf,CAEA,IAAI,SAAA,EAAqB,CACvB,OAAO,IAAA,CAAK,MAAA,GAAW,OACzB,CACF,EAEA,SAASE,CAAAA,CAASC,CAAAA,CAAkD,CAClE,OAAOA,CAAAA,GAAU,IAAA,EAAQ,OAAOA,CAAAA,EAAU,UAAY,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAK,CAC5E,CAEA,IAAMC,CAAAA,CAAe,IAAI,GAAA,CAAI,CAC3B,CAAC,aAAA,CAAe,QAAQ,CAAA,CACxB,CAAC,gBAAA,CAAkB,WAAW,CAAA,CAC9B,CAAC,cAAA,CAAgB,SAAS,CAAA,CAC1B,CAAC,gBAAA,CAAkB,UAAU,CAC/B,CAAC,CAAA,CAEM,SAASC,CAAAA,CAAaL,CAAAA,CAAgBL,CAAAA,CAAO,SAAA,CAAuB,CACzE,OAAO,IAAIE,CAAAA,CAAW,CAAA,CAAGF,CAAAA,CAAM,MAAA,CAAW,MAAA,CAAWK,CAAK,CAC5D,CAEA,eAAsBM,CAAAA,CAASC,CAAAA,CAA2C,CACxE,GAAI,CACF,OAAO,MAAMA,CAAAA,CAAS,IAAA,EACxB,CAAA,MAASC,CAAAA,CAAO,CACd,MAAM,IAAIX,EAAWU,CAAAA,CAAS,MAAA,CAAQ,kBAAA,CAAoB,MAAA,CAAW,MAAA,CAAWC,CAAK,CACvF,CACF,CAEA,eAAsBC,CAAAA,CAAaF,CAAAA,CAA8C,CAC/E,IAAMG,CAAAA,CAAgB,MAAMH,CAAAA,CAAS,MAAK,CAAE,KAAA,CAAM,IAAM,IAAI,CAAA,CAC5D,GAAI,CAACL,CAAAA,CAASQ,CAAI,CAAA,CAAG,OAAO,IAAIb,CAAAA,CAAWU,CAAAA,CAAS,MAAA,CAAQ,SAAS,CAAA,CACrE,IAAMT,CAAAA,CAASI,CAAAA,CAASQ,CAAAA,CAAK,MAAM,CAAA,CAAIA,CAAAA,CAAK,MAAA,CAAmC,MAAA,CACzEX,EAAU,OAAOW,CAAAA,CAAK,OAAA,EAAY,QAAA,EAAY,MAAA,CAAO,SAAA,CAAUA,CAAAA,CAAK,OAAO,EAAIA,CAAAA,CAAK,OAAA,CAAU,MAAA,CAC9Ff,CAAAA,CAAO,OAAOe,CAAAA,CAAK,KAAA,EAAU,QAAA,CAAWN,CAAAA,CAAa,GAAA,CAAIM,CAAAA,CAAK,KAAK,CAAA,EAAKA,CAAAA,CAAK,KAAA,CAAQ,SAAA,CAC3F,OAAO,IAAIb,CAAAA,CAAWU,CAAAA,CAAS,MAAA,CAAQZ,CAAAA,CAAMG,CAAAA,CAAQC,CAAO,CAC9D,CCzCA,IAAMY,CAAAA,CAAkB,CAAC,uBAAA,CAAyB,kBAAkB,CAAA,CAEpE,SAAST,CAAAA,CAASC,EAAkD,CAClE,OAAOA,CAAAA,GAAU,IAAA,EAAQ,OAAOA,CAAAA,EAAU,QAAA,EAAY,CAAC,MAAM,OAAA,CAAQA,CAAK,CAC5E,CAEA,SAASS,CAAAA,CAAUT,CAAAA,CAAoC,CACrD,IAAMJ,CAAAA,CAAU,MAAA,CAAOI,CAAK,CAAA,CAC5B,OAAOA,CAAAA,GAAU,IAAA,EAAQA,CAAAA,GAAU,IAAM,MAAA,CAAO,SAAA,CAAUJ,CAAO,CAAA,EAAKA,CAAAA,CAAU,CAAA,CAAIA,CAAAA,CAAU,MAChG,CAEA,SAASc,CAAAA,CAAcN,CAAAA,CAA6C,CAClE,IAAA,IAAWO,CAAAA,IAAQH,CAAAA,CAAiB,CAClC,IAAMZ,CAAAA,CAAUa,CAAAA,CAAUL,CAAAA,CAAS,OAAA,EAAS,GAAA,CAAIO,CAAI,CAAC,EACrD,GAAIf,CAAAA,GAAY,MAAA,CAAW,OAAOA,CACpC,CAEF,CAEA,SAASgB,EAAKZ,CAAAA,CAAoC,CAChD,OAAO,OAAOA,CAAAA,EAAU,QAAA,EAAYA,CAAAA,GAAU,EAAA,CAAKA,EAAQ,MAC7D,CAEO,SAASa,CAAAA,CAAcb,CAAAA,CAA+B,CAC3D,GAAI,CAACD,EAASC,CAAK,CAAA,CAAG,OAAO,EAAC,CAC9B,IAAMc,CAAAA,CAAWF,CAAAA,CAAKZ,EAAM,WAAW,CAAA,CACvC,OAAO,CACL,GAAIY,CAAAA,CAAKZ,CAAAA,CAAM,cAAc,GAAK,CAAE,cAAA,CAAgBY,CAAAA,CAAKZ,CAAAA,CAAM,cAAc,CAAE,CAAA,CAC/E,GAAIc,GAAY,eAAA,CAAgB,IAAA,CAAKA,CAAQ,CAAA,EAAK,CAAE,WAAA,CAAaA,CAAS,CAAA,CAC1E,GAAI,OAAOd,CAAAA,CAAM,YAAA,EAAiB,SAAA,EAAa,CAAE,YAAA,CAAcA,CAAAA,CAAM,YAAa,CACpF,CACF,CAEO,SAASe,CAAAA,CAAUR,CAAAA,CAAeH,CAAAA,CAAwC,CAC/E,GAAI,CAACL,CAAAA,CAASQ,CAAI,CAAA,CAAG,MAAM,IAAIb,CAAAA,CAAWU,CAAAA,CAAS,OAAQ,kBAAkB,CAAA,CAC7E,GAAI,EAAE,YAAA,GAAgBG,CAAAA,CAAAA,CAAO,OAAO,CAAE,WAAYA,CAAAA,CAAmC,OAAA,CAASG,CAAAA,CAAcN,CAAQ,CAAA,CAAG,QAAA,CAAU,EAAG,EACpI,GAAI,CAACL,CAAAA,CAASQ,CAAAA,CAAK,UAAU,CAAA,CAAG,MAAM,IAAIb,EAAWU,CAAAA,CAAS,MAAA,CAAQ,kBAAkB,CAAA,CACxF,OAAO,CACL,UAAA,CAAYG,CAAAA,CAAK,WACjB,OAAA,CAASE,CAAAA,CAAUF,CAAAA,CAAK,OAAO,CAAA,EAAKG,CAAAA,CAAcN,CAAQ,CAAA,CAC1D,QAAA,CAAUS,CAAAA,CAAcN,CAAAA,CAAK,QAAQ,CAAA,CACrC,GAAIK,CAAAA,CAAKL,CAAAA,CAAK,WAAW,CAAA,EAAK,CAAE,WAAA,CAAaK,CAAAA,CAAKL,CAAAA,CAAK,WAAW,CAAE,CACtE,CACF,CC3DO,SAASS,CAAAA,EAAmB,CACjC,GAAI,OAAO,MAAA,CAAO,UAAA,EAAe,WAAY,OAAO,MAAA,CAAO,UAAA,EAAW,CACtE,IAAMC,CAAAA,CAAQ,MAAA,CAAO,eAAA,CAAgB,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA,CACvDA,CAAAA,CAAM,CAAC,CAAA,CAAKA,CAAAA,CAAM,CAAC,CAAA,CAAI,EAAA,CAAM,EAAA,CAC7BA,CAAAA,CAAM,CAAC,CAAA,CAAKA,CAAAA,CAAM,CAAC,EAAI,EAAA,CAAM,GAAA,CAC7B,IAAMC,CAAAA,CAAM,KAAA,CAAM,IAAA,CAAKD,CAAAA,CAAQE,CAAAA,EAASA,EAAK,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CACnF,OAAO,CAAA,EAAGD,CAAAA,CAAI,KAAA,CAAM,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,EAAIA,CAAAA,CAAI,KAAA,CAAM,CAAA,CAAG,EAAE,CAAC,CAAA,CAAA,EAAIA,EAAI,KAAA,CAAM,EAAA,CAAI,EAAE,CAAC,CAAA,CAAA,EAAIA,CAAAA,CAAI,KAAA,CAAM,EAAA,CAAI,EAAE,CAAC,CAAA,CAAA,EAAIA,CAAAA,CAAI,KAAA,CAAM,EAAE,CAAC,CAAA,CAC1G,CCFA,IAAME,CAAAA,CAAmB,0BAAA,CACnBC,CAAAA,CAAO,aAAA,CAYb,SAASC,CAAAA,CAAS,CAAE,EAAA,CAAAC,EAAI,OAAA,CAAAC,CAAAA,CAAUJ,CAAiB,CAAA,CAA+B,CAChF,OAAO,CAAA,EAAGI,CAAAA,CAAQ,QAAQ,MAAA,CAAQ,EAAE,CAAC,CAAA,GAAA,EAAM,kBAAA,CAAmBD,CAAE,CAAC,CAAA,CACnE,CAEA,IAAME,CAAAA,CAAe,IAAA,CACfC,CAAAA,CAAiB,GAAA,CAEvB,eAAeC,CAAAA,CAAKC,CAAAA,CAAaC,CAAAA,CAAiBC,CAAAA,CAAyB,EAAC,CAAGC,CAAAA,CAA8C,CAC3H,IAAMC,CAAAA,CAAa,IAAI,eAAA,CACjBC,CAAAA,CAAQ,IAAMD,CAAAA,CAAW,KAAA,EAAM,CAC/BE,CAAAA,CAAQ,UAAA,CAAWD,EAAOJ,CAAO,CAAA,CACnCE,CAAAA,EAAQ,OAAA,EAASE,CAAAA,EAAM,CAC3BF,CAAAA,EAAQ,gBAAA,CAAiB,QAASE,CAAK,CAAA,CACvC,GAAI,CACF,OAAO,MAAM,KAAA,CAAML,CAAAA,CAAK,CAAE,GAAGE,CAAAA,CAAM,MAAA,CAAQE,CAAAA,CAAW,MAAO,CAAC,CAChE,CAAA,MAAS3B,EAAO,CACd,MAAI0B,CAAAA,EAAQ,OAAA,CAAe1B,CAAAA,CACrBH,CAAAA,CAAaG,CAAAA,CAAO2B,CAAAA,CAAW,OAAO,OAAA,CAAU,SAAA,CAAY,SAAS,CAC7E,CAAA,OAAE,CACA,YAAA,CAAaE,CAAK,EAClBH,CAAAA,EAAQ,mBAAA,CAAoB,OAAA,CAASE,CAAK,EAC5C,CACF,CAEA,eAAsBE,CAAAA,CAAUC,CAAAA,CAA6BL,CAAAA,CAAsBM,CAAAA,CAAwC,CACzH,IAAMC,CAAAA,CAAQD,CAAAA,GAAU,OAAYhB,CAAAA,CAAO,CAAA,EAAGA,CAAI,CAAA,GAAA,EAAMgB,CAAK,CAAA,CAAA,CACvDjC,CAAAA,CAAW,MAAMuB,EAAK,CAAA,EAAGL,CAAAA,CAASc,CAAO,CAAC,CAAA,MAAA,EAASE,CAAK,CAAA,CAAA,CAAIb,CAAAA,CAAc,EAAC,CAAGM,CAAM,CAAA,CAC1F,GAAI,CAAC3B,CAAAA,CAAS,EAAA,CAAI,MAAM,MAAME,CAAAA,CAAaF,CAAQ,CAAA,CACnD,OAAOW,CAAAA,CAAU,MAAMZ,CAAAA,CAASC,CAAQ,EAAGA,CAAQ,CACrD,CAEA,eAAsBmC,CAAAA,CAAgBH,CAAAA,CAA6BL,CAAAA,CAA+C,CAChH,QAAQ,MAAMI,CAAAA,CAAUC,CAAAA,CAASL,CAAM,CAAA,EAAG,UAC5C,CASO,SAASS,EAAgBJ,CAAAA,CAAgC,CAC9D,IAAIK,CAAAA,CAAgD,IAAA,CAEpD,OAAO,MAAOC,CAAAA,CAAiCC,CAAAA,CAAyB,EAAC,GAAgC,CACvG,IAAMpC,CAAAA,CAAO,IAAA,CAAK,SAAA,CAAU,CAAE,GAAG6B,CAAAA,CAAQ,SAAA,IAAY,CAAG,MAAA,CAAAM,CAAAA,CAAQ,YAAA,CAAAC,CAAAA,CAAc,QAASP,CAAAA,CAAQ,OAAA,CAAS,MAAA,CAAQA,CAAAA,CAAQ,WAAA,CAAa,GAAIA,CAAAA,CAAQ,gBAAA,EAAoB,CAAE,YAAA,CAAcA,CAAAA,CAAQ,gBAAiB,CAAG,CAAC,CAAA,CAC9MK,CAAAA,EAAS,IAAA,GAASlC,IAAMkC,CAAAA,CAAU,CAAE,IAAA,CAAAlC,CAAAA,CAAM,GAAA,CAAKS,CAAAA,EAAW,CAAA,CAAA,CAC9D,IAAMZ,CAAAA,CAAW,MAAMuB,CAAAA,CAAK,CAAA,EAAGL,CAAAA,CAASc,CAAO,CAAC,CAAA,CAAA,EAAIf,CAAI,CAAA,CAAA,CAAIK,CAAAA,CAAgB,CAC1E,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,mBAAoB,iBAAA,CAAmBe,CAAAA,CAAQ,GAAI,CAAA,CAC9E,IAAA,CAAAlC,CACF,CAAC,CAAA,CACD,GAAI,CAACH,CAAAA,CAAS,EAAA,CAAI,MAAM,MAAME,CAAAA,CAAaF,CAAQ,EACnD,IAAMwC,CAAAA,CAAa,MAAMzC,CAAAA,CAASC,CAAQ,CAAA,CAC1C,OAAAqC,CAAAA,CAAU,KACHG,CACT,CACF,CC9DA,IAAMC,CAAAA,CAAY,IAAI,GAAA,CAAI,CAAC,WAAY,MAAM,CAAC,CAAA,CACxCC,CAAAA,CAAO,KAAA,CAAc,EAAA,CAAK,GAAA,CAEzB,SAASC,EAAYC,CAAAA,CAA4BN,CAAAA,CAA0D,CAChH,IAAMO,CAAAA,CAAS,CAAC,GAAID,CAAAA,CAAW,QAAU,EAAC,CAAI,GAAA,CAAIA,CAAAA,CAAW,KAAA,EAAS,EAAC,EAAG,OAAA,CAASE,GAASA,CAAAA,CAAK,MAAM,CAAC,CAAA,CAClGC,CAAAA,CAAgC,EAAC,CACvC,IAAA,IAAWC,KAASH,CAAAA,CACd,CAACJ,CAAAA,CAAU,GAAA,CAAIO,CAAAA,CAAM,IAAI,CAAA,EAAKV,CAAAA,CAAOU,CAAAA,CAAM,GAAG,CAAA,GAAM,MAAA,GAAWD,CAAAA,CAAKC,CAAAA,CAAM,GAAG,CAAA,CAAIV,EAAOU,CAAAA,CAAM,GAAG,CAAA,CAAA,CAEvG,OAAOD,CACT,CAEA,IAAME,CAAAA,CAAmB,IAAO,UAAA,CAAiD,cAAA,CAE1E,SAASC,CAAAA,CAAkBC,CAAAA,CAAST,CAAAA,CAAMU,CAAAA,CAA4CH,CAAAA,CAA8B,CACzH,IAAMI,CAAAA,CAAOlC,CAAAA,EAAe,CAAA,eAAA,EAAkBA,CAAE,CAAA,CAAA,CAC1CmC,CAAAA,CAAU,CAAIC,EAAsCC,CAAAA,GAAmB,CAC3E,GAAI,CACF,IAAMC,CAAAA,CAAUL,CAAAA,EAAU,CAC1B,OAAOK,CAAAA,CAAUF,CAAAA,CAAOE,CAAO,CAAA,CAAID,CACrC,CAAA,KAAQ,CACN,OAAOA,CACT,CACF,CAAA,CACA,OAAO,CACL,IAAA,CAAM,CAACrC,CAAAA,CAAI3B,CAAAA,GAAY8D,EAASG,CAAAA,EAAY,CAC1C,IAAMC,CAAAA,CAAQ,IAAA,CAAK,KAAA,CAAMD,CAAAA,CAAQ,OAAA,CAAQJ,CAAAA,CAAIlC,CAAE,CAAC,CAAA,EAAK,MAAM,CAAA,CAC3D,OAAOuC,CAAAA,EAASA,EAAM,OAAA,GAAYlE,CAAAA,EAAW,IAAA,CAAK,GAAA,EAAI,CAAIkE,CAAAA,CAAM,OAAA,CAAUP,CAAAA,CAASO,EAAM,MAAA,CAAS,IACpG,CAAA,CAAG,IAAI,CAAA,CACP,IAAA,CAAM,CAACvC,CAAAA,CAAI3B,EAAS8C,CAAAA,GAAWgB,CAAAA,CAASG,CAAAA,EAAYA,CAAAA,CAAQ,OAAA,CAAQJ,CAAAA,CAAIlC,CAAE,CAAA,CAAG,KAAK,SAAA,CAAU,CAAE,OAAA,CAAA3B,CAAAA,CAAS,OAAA,CAAS,IAAA,CAAK,GAAA,EAAI,CAAG,OAAA8C,CAAO,CAAC,CAAC,CAAA,CAAG,MAAS,CAAA,CACjJ,KAAA,CAAQnB,CAAAA,EAAOmC,EAASG,CAAAA,EAAYA,CAAAA,CAAQ,UAAA,CAAWJ,CAAAA,CAAIlC,CAAE,CAAC,CAAA,CAAG,MAAS,CAC5E,CACF","file":"chunk-KXLWZLOO.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 client_outdated: { message: 'This form needs a newer version of this page.', action: null },\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 426: 'client_outdated',\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","import type { FormDefinition } from '../types';\nimport { CloudError } from './error';\n\nexport interface CloudSettings {\n successMessage?: string;\n redirectUrl?: string;\n allowAnother?: boolean;\n}\n\nexport interface PublishedForm {\n definition: FormDefinition;\n version?: number;\n settings?: CloudSettings;\n renderToken?: string;\n}\n\nconst VERSION_HEADERS = ['Formhaus-Form-Version', 'Formhaus-Version'];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction toVersion(value: unknown): number | undefined {\n const version = Number(value);\n return value !== null && value !== '' && Number.isInteger(version) && version > 0 ? version : undefined;\n}\n\nfunction headerVersion(response: CloudResponse): number | undefined {\n for (const name of VERSION_HEADERS) {\n const version = toVersion(response.headers?.get(name));\n if (version !== undefined) return version;\n }\n return undefined;\n}\n\nfunction text(value: unknown): string | undefined {\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nexport function parseSettings(value: unknown): CloudSettings {\n if (!isRecord(value)) return {};\n const redirect = text(value.redirectUrl);\n return {\n ...(text(value.successMessage) && { successMessage: text(value.successMessage) }),\n ...(redirect && /^https?:\\/\\//i.test(redirect) && { redirectUrl: redirect }),\n ...(typeof value.allowAnother === 'boolean' && { allowAnother: value.allowAnother }),\n };\n}\n\nexport function parseForm(body: unknown, response: CloudResponse): PublishedForm {\n if (!isRecord(body)) throw new CloudError(response.status, 'invalid_response');\n if (!('definition' in body)) return { definition: body as unknown as FormDefinition, version: headerVersion(response), settings: {} };\n if (!isRecord(body.definition)) throw new CloudError(response.status, 'invalid_response');\n return {\n definition: body.definition as unknown as FormDefinition,\n version: toVersion(body.version) ?? headerVersion(response),\n settings: parseSettings(body.settings),\n ...(text(body.renderToken) && { renderToken: text(body.renderToken) }),\n };\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 { parseForm, type PublishedForm } from './envelope';\nimport { randomId } from './uuid';\n\nconst DEFAULT_API_BASE = 'https://api.formhaus.dev';\nconst CORE = `core=${__FORMHAUS_CORE_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\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\nexport async function fetchForm(options: CloudClientOptions, signal?: AbortSignal, after?: number): Promise<PublishedForm> {\n const query = after === undefined ? CORE : `${CORE}&v=${after}`;\n const response = await send(`${endpoint(options)}/form?${query}`, LOAD_TIMEOUT, {}, signal);\n if (!response.ok) throw await toCloudError(response);\n return parseForm(await readJson(response), response);\n}\n\nexport async function fetchDefinition(options: CloudClientOptions, signal?: AbortSignal): Promise<FormDefinition> {\n return (await fetchForm(options, signal)).definition;\n}\n\nexport interface CloudSubmitterOptions extends CloudClientOptions {\n version?: number;\n renderToken?: string;\n firstRenderToken?: string;\n extraBody?: () => Record<string, unknown>;\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({ ...options.extraBody?.(), values, skippedSteps, version: options.version, _fh_rt: options.renderToken, ...(options.firstRenderToken && { _fh_rt_first: options.firstRenderToken }) });\n if (pending?.body !== body) pending = { body, key: randomId() };\n const response = await send(`${endpoint(options)}?${CORE}`, 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 } from '../types';\n\nexport interface DraftStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport interface DraftStore {\n load(id: string, version: number | undefined): Record<string, unknown> | null;\n save(id: string, version: number | undefined, values: Record<string, unknown>): void;\n clear(id: string): void;\n}\n\nconst SENSITIVE = new Set(['password', 'file']);\nconst WEEK = 7 * 24 * 60 * 60 * 1000;\n\nexport function draftValues(definition: FormDefinition, values: Record<string, unknown>): Record<string, unknown> {\n const fields = [...(definition.fields ?? []), ...(definition.steps ?? []).flatMap((step) => step.fields)];\n const kept: Record<string, unknown> = {};\n for (const field of fields) {\n if (!SENSITIVE.has(field.type) && values[field.key] !== undefined) kept[field.key] = values[field.key];\n }\n return kept;\n}\n\nconst sessionStorageOf = () => (globalThis as { sessionStorage?: DraftStorage }).sessionStorage;\n\nexport function sessionDraftStore(maxAge = WEEK, storageOf: () => DraftStorage | undefined = sessionStorageOf): DraftStore {\n const key = (id: string) => `formhaus:draft:${id}`;\n const attempt = <T>(action: (storage: DraftStorage) => T, fallback: T): T => {\n try {\n const storage = storageOf();\n return storage ? action(storage) : fallback;\n } catch {\n return fallback;\n }\n };\n return {\n load: (id, version) => attempt((storage) => {\n const draft = JSON.parse(storage.getItem(key(id)) ?? 'null') as { version?: number; savedAt: number; values: Record<string, unknown> } | null;\n return draft && draft.version === version && Date.now() - draft.savedAt < maxAge ? draft.values : null;\n }, null),\n save: (id, version, values) => attempt((storage) => storage.setItem(key(id), JSON.stringify({ version, savedAt: Date.now(), values })), undefined),\n clear: (id) => attempt((storage) => storage.removeItem(key(id)), undefined),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cloud/failures.ts","../src/cloud/error.ts","../src/cloud/envelope.ts","../src/cloud/uuid.ts","../src/cloud/client.ts","../src/cloud/draft.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","VERSION_HEADERS","toVersion","headerVersion","name","text","parseSettings","redirect","parseForm","randomId","bytes","hex","byte","DEFAULT_API_BASE","CORE","endpoint","id","apiBase","LOAD_TIMEOUT","SUBMIT_TIMEOUT","send","url","timeout","init","signal","controller","abort","timer","fetchForm","options","after","query","fetchDefinition","createSubmitter","pending","values","skippedSteps","submission","SENSITIVE","WEEK","draftValues","definition","fields","step","kept","field","sessionStorageOf","sessionDraftStore","maxAge","storageOf","key","attempt","action","fallback","storage","draft"],"mappings":"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","file":"chunk-UFYD5LVW.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 client_outdated: { message: 'This form needs a newer version of this page.', action: null },\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 426: 'client_outdated',\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","import type { FormDefinition } from '../types';\nimport { CloudError } from './error';\n\nexport interface CloudSettings {\n successMessage?: string;\n redirectUrl?: string;\n allowAnother?: boolean;\n}\n\nexport interface PublishedForm {\n definition: FormDefinition;\n version?: number;\n settings?: CloudSettings;\n renderToken?: string;\n}\n\nconst VERSION_HEADERS = ['Formhaus-Form-Version', 'Formhaus-Version'];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction toVersion(value: unknown): number | undefined {\n const version = Number(value);\n return value !== null && value !== '' && Number.isInteger(version) && version > 0 ? version : undefined;\n}\n\nfunction headerVersion(response: CloudResponse): number | undefined {\n for (const name of VERSION_HEADERS) {\n const version = toVersion(response.headers?.get(name));\n if (version !== undefined) return version;\n }\n return undefined;\n}\n\nfunction text(value: unknown): string | undefined {\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nexport function parseSettings(value: unknown): CloudSettings {\n if (!isRecord(value)) return {};\n const redirect = text(value.redirectUrl);\n return {\n ...(text(value.successMessage) && { successMessage: text(value.successMessage) }),\n ...(redirect && /^https?:\\/\\//i.test(redirect) && { redirectUrl: redirect }),\n ...(typeof value.allowAnother === 'boolean' && { allowAnother: value.allowAnother }),\n };\n}\n\nexport function parseForm(body: unknown, response: CloudResponse): PublishedForm {\n if (!isRecord(body)) throw new CloudError(response.status, 'invalid_response');\n if (!('definition' in body)) return { definition: body as unknown as FormDefinition, version: headerVersion(response), settings: {} };\n if (!isRecord(body.definition)) throw new CloudError(response.status, 'invalid_response');\n return {\n definition: body.definition as unknown as FormDefinition,\n version: toVersion(body.version) ?? headerVersion(response),\n settings: parseSettings(body.settings),\n ...(text(body.renderToken) && { renderToken: text(body.renderToken) }),\n };\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 { parseForm, type PublishedForm } from './envelope';\nimport { randomId } from './uuid';\n\nconst DEFAULT_API_BASE = 'https://api.formhaus.dev';\nconst CORE = `core=${__FORMHAUS_CORE_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\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\nexport async function fetchForm(options: CloudClientOptions, signal?: AbortSignal, after?: number): Promise<PublishedForm> {\n const query = after === undefined ? CORE : `${CORE}&v=${after}`;\n const response = await send(`${endpoint(options)}/form?${query}`, LOAD_TIMEOUT, {}, signal);\n if (!response.ok) throw await toCloudError(response);\n return parseForm(await readJson(response), response);\n}\n\nexport async function fetchDefinition(options: CloudClientOptions, signal?: AbortSignal): Promise<FormDefinition> {\n return (await fetchForm(options, signal)).definition;\n}\n\nexport interface CloudSubmitterOptions extends CloudClientOptions {\n version?: number;\n renderToken?: string;\n firstRenderToken?: string;\n extraBody?: () => Record<string, unknown>;\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({ ...options.extraBody?.(), values, skippedSteps, version: options.version, _fh_rt: options.renderToken, ...(options.firstRenderToken && { _fh_rt_first: options.firstRenderToken }) });\n if (pending?.body !== body) pending = { body, key: randomId() };\n const response = await send(`${endpoint(options)}?${CORE}`, 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 } from '../types';\n\nexport interface DraftStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport interface DraftStore {\n load(id: string, version: number | undefined): Record<string, unknown> | null;\n save(id: string, version: number | undefined, values: Record<string, unknown>): void;\n clear(id: string): void;\n}\n\nconst SENSITIVE = new Set(['password', 'file']);\nconst WEEK = 7 * 24 * 60 * 60 * 1000;\n\nexport function draftValues(definition: FormDefinition, values: Record<string, unknown>): Record<string, unknown> {\n const fields = [...(definition.fields ?? []), ...(definition.steps ?? []).flatMap((step) => step.fields)];\n const kept: Record<string, unknown> = {};\n for (const field of fields) {\n if (!SENSITIVE.has(field.type) && values[field.key] !== undefined) kept[field.key] = values[field.key];\n }\n return kept;\n}\n\nconst sessionStorageOf = () => (globalThis as { sessionStorage?: DraftStorage }).sessionStorage;\n\nexport function sessionDraftStore(maxAge = WEEK, storageOf: () => DraftStorage | undefined = sessionStorageOf): DraftStore {\n const key = (id: string) => `formhaus:draft:${id}`;\n const attempt = <T>(action: (storage: DraftStorage) => T, fallback: T): T => {\n try {\n const storage = storageOf();\n return storage ? action(storage) : fallback;\n } catch {\n return fallback;\n }\n };\n return {\n load: (id, version) => attempt((storage) => {\n const draft = JSON.parse(storage.getItem(key(id)) ?? 'null') as { version?: number; savedAt: number; values: Record<string, unknown> } | null;\n return draft && draft.version === version && Date.now() - draft.savedAt < maxAge ? draft.values : null;\n }, null),\n save: (id, version, values) => attempt((storage) => storage.setItem(key(id), JSON.stringify({ version, savedAt: Date.now(), values })), undefined),\n clear: (id) => attempt((storage) => storage.removeItem(key(id)), undefined),\n };\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {q,e,h as h$1,i,j as j$1,p,k,g as g$1,u,t,s,l,m,n,v,o,b}from'./chunk-4IHQINIH.js';import {j,i as i$1,e as e$1,a}from'./chunk-FQ3GLJTI.js';import {g,f,d,h}from'./chunk-5KV7BDCS.js';function re(a){return j(a).map(e=>e.message)}function Y(a,e){return a.add(e),()=>a.delete(e)}function Z(){let a=0,e=0,i=new Set,n=new Set,r=new Map,p=new Map;return {subscribe:s=>Y(i,s),getSnapshot:()=>a,subscribeStructure:s=>Y(n,s),getStructureSnapshot:()=>e,getFieldSnapshot:s=>r.get(s)??0,subscribeField(s,m){let l=p.get(s)??new Set;return l.add(m),p.set(s,l),()=>{l.delete(m),l.size===0&&p.delete(s);}},notify({fieldKeys:s=[],structureChanged:m=false}={}){for(let l of new Set(s)){r.set(l,(r.get(l)??0)+1);for(let b of p.get(l)??[])b();}if(m){e++;for(let l of n)l();}a++;for(let l of i)l();}}}function se(a,e){try{if(process.env.NODE_ENV!=="production")return j(a,{validators:e})}catch(i){if(!(i instanceof ReferenceError))throw i}}function ee(a$1,e,i){let n=se(a$1,i)??i$1(a$1),r=n.filter(e$1);if(r.length)throw new a(r);let p=e.onWarning??(s=>console.warn(`[formhaus] ${s.message}`));for(let s of n)p(s);}function I(a,e){for(let i of f(a)){let n=e.get(i)??new Set;n.add(a),e.set(i,n);}}function te(a){let e$1=g(a),i=new Map,n=new Set,r=q(a),p=new Map,s=new Map,m=new Map,l=true,b$1=true,u={visibleSteps:[],currentStep:null,visibleFields:[],canGoNext:false};for(let t of e$1)i.set(t.key,[...i.get(t.key)??[],t]),I(t,p);for(let t of a.steps??[]){for(let o of t.fields)m.set(o,t);I(t,s);for(let o of t.routes??[])for(let d of f(o))n.add(d);}let F=()=>(a.steps??[]).length>0,h=(t,o)=>b(t,r.values(o)),S=(t,o)=>{let d=m.get(t);return !d||r.steps(o).includes(d)};function y(t,o){if(!l)return u;if(l=false,!F())return u.visibleSteps=[],u.currentStep=null,u.visibleFields=(a.fields??[]).filter(g=>h(g,t)),u;let d=u.visibleSteps=r.steps(t),f=u.currentStep=d[o]??d[d.length-1]??null;return u.visibleFields=f?f.fields.filter(g=>h(g,t)):[],u}return {allFields:e$1,conditionValues:r.values,state:y,markChanged(t,o){(t||o)&&r.invalidate(),t&&(l=true),(t||o)&&(b$1=true);},getCanGoNext(t,o,d){let f=y(t,o).currentStep;if(!b$1)return u.canGoNext;b$1=false;let g=f?e(f,r.values(t),d):{};return u.canGoNext=F()&&Object.keys(g).length===0},findStepIndex(t,o,d){let f=y(o,d).visibleSteps.findIndex(g=>g.fields.some(x=>x.key===t));return f===-1?null:f},affectsStructure(t,o){return n.has(t)||p.has(t)||s.has(t)||o.size>0},activeField(t,o){return i.get(t)?.find(d=>S(d,o)&&h(d,o))},reconcileHidden(t,o){r.invalidate();let d=[...new Set([...p.keys(),...s.keys()])],f=new Set(d),g=new Set,x=c=>t[c]!==void 0||o[c]!==void 0,L=c=>{delete t[c],delete o[c],r.invalidate(),g.add(c),!f.has(c)&&(f.add(c),d.push(c));};for(let c=0;c<d.length;c++){let E=d[c];f.delete(E);for(let v of p.get(E)??[])S(v,t)&&!h(v,t)&&x(v.key)&&L(v.key);for(let v of s.get(E)??[])if(!h(v,t))for(let k of v.fields)x(k.key)&&L(k.key);}return g}}}var ie=class{constructor(e,i,n){this.definition=e;this.skipped=new Map;this.validationEpoch=0;this.operationEpoch=0;this.subscriptions=Z();this.lifecycle=n??{},this.validators=n?.validators??{},ee(e,this.lifecycle,this.validators),this.messages=d(n?.messages,e.messages),this.visibility=te(e);let r=h(this.visibility.allFields,i);this.state={values:r,errors:{},topLevelErrors:[],serverErrors:{},serverFormErrors:[],currentStepIndex:0,fieldLoading:{},stepValidating:false,submitting:false},this.visibility.reconcileHidden(r,this.state.errors);}get onStepValidate(){return this.lifecycle.onStepValidate}get values(){return this.state.values}get errors(){return this.state.errors}get topLevelErrors(){return this.state.topLevelErrors}get currentStepIndex(){return this.state.currentStepIndex}get fieldLoading(){return this.state.fieldLoading}get stepValidating(){return this.state.stepValidating}get submitting(){return this.state.submitting}get isMultiStep(){return (this.definition.steps??[]).length>0}get visibleSteps(){return this.view.visibleSteps}get currentStep(){return this.view.currentStep}get visibleFields(){return this.view.visibleFields}get isFirstStep(){return this.currentStepIndex===0}get isLastStep(){return this.currentStepIndex>=this.visibleSteps.length-1}get canGoNext(){return this.visibility.getCanGoNext(this.state.values,this.currentStepIndex,this.validators)}get stepErrors(){let e={};for(let i of this.visibleSteps){let n=i.fields.map(r=>r.key).filter(r=>this.errors[r]!==void 0);n.length>0&&(e[i.id]=n);}return e}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,i){return this.subscriptions.subscribeField(e,i)}getFieldSnapshot(e){return this.subscriptions.getFieldSnapshot(e)}subscribeStructure(e){return this.subscriptions.subscribeStructure(e)}getStructureSnapshot(){return this.subscriptions.getStructureSnapshot()}setValue(e,i$1){let{values:n,errors:r}=this.state,p$1=this.isMultiStep?this.visibleSteps:null,s=!Object.is(n[e],i$1),m=r[e];n[e]=i$1,h$1(this.internals,e,s);for(let[S,y]of this.skipped)s&&y.includes(e)&&this.skipped.delete(S);let l=this.visibility.reconcileHidden(n,r);i(this.internals,l);let b=j$1(this.internals,e),u=new Set([...l,...b]);(s||m!==r[e])&&u.add(e);let F=s||l.size>0,h=F&&this.visibility.affectsStructure(e,l);if(p$1&&h){this.visibility.markChanged(true,true),this.state.currentStepIndex=p(p$1,this.visibleSteps,this.currentStepIndex);for(let S of k(this.internals))u.add(S);}this.notify({fieldKeys:u,structureChanged:h,valuesChanged:F});}setErrors(e){g$1(this.internals,e,true);}setFieldLoading(e,i){let n=this.state.fieldLoading[e]===true;i?this.state.fieldLoading[e]=true:delete this.state.fieldLoading[e],this.notify({fieldKeys:n===i?[]:[e]});}cancelPendingActions(){this.validationEpoch++,this.operationEpoch++,this.state.stepValidating=false,this.state.submitting=false,this.notify();}next(){return u(this.internals,"next")}back(){return u(this.internals,"back")}skip(e){return t(this.internals,e)}submit(e){return s(this.internals,e)}isStepSkipped(e){return this.skipped.has(e)}validate(){return l(this.internals)}validateField(e){return m(this.internals,e)}getSubmitValues(){return n(this.internals)}goToStepWithField(e){v(this.internals,e);}reset(e){o(this.internals,e);}get view(){return this.visibility.state(this.state.values,this.currentStepIndex)}get internals(){return this}notify(e={}){this.visibility.markChanged(!!e.structureChanged,!!e.valuesChanged),this.subscriptions.notify(e);}};export{re as a,te as b,ie as c};//# sourceMappingURL=chunk-Y33LPJXU.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-Y33LPJXU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/definition-validation/validate-definition.ts","../src/engine/subscriptions.ts","../src/engine/warnings.ts","../src/engine/visibility-index.ts","../src/engine/visibility-state.ts","../src/engine/runtime.ts"],"names":["validateDefinition","input","checkDefinition","issue","listen","listeners","listener","createSubscriptions","version","structureVersion","structureListeners","fieldVersions","fieldListeners","key","set","fieldKeys","structureChanged","developmentIssues","definition","validators","error","assertDefinition","options","issues","definitionErrors","errors","isError","FormDefinitionError","warn","indexConditions","dependent","index","field","conditionFields","dependents","createVisibility","allFields","getAllFields","fieldsByKey","routeFields","path","createActivePath","fieldDependents","stepDependents","stepOfField","visibilityDirty","canGoNextDirty","cache","step","route","isMultiStep","visible","source","values","isVisible","onPath","state","stepIndex","steps","current","valuesChanged","validateStep","fieldKey","target","clearedFields","queue","queued","cleared","held","clear","FormEngine","initialValues","messageResolver","createValues","result","keys","total","value","previousSteps","valueChanged","previousError","clearError","stepId","dropServerErrors","revalidated","clearResolvedMatchErrors","changedFields","reconcileStepIndex","pruned","pruneOffPathErrors","applyValidationErrors","loading","previous","changeStep","submit","skipStep","handler","submitForm","validateForm","validateOne","getSubmitValues","goToStepWithField","resetEngine"],"mappings":"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","file":"chunk-Y33LPJXU.js","sourcesContent":["import { checkDefinition } from './check-definition';\n\nexport function validateDefinition(input: unknown): string[] {\n return checkDefinition(input).map((issue) => issue.message);\n}\n","export interface NotifyOptions {\n fieldKeys?: Iterable<string>;\n structureChanged?: boolean;\n}\n\ntype Listener = () => void;\n\nfunction listen(listeners: Set<Listener>, listener: Listener): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function createSubscriptions() {\n let version = 0;\n let structureVersion = 0;\n const listeners = new Set<Listener>();\n const structureListeners = new Set<Listener>();\n const fieldVersions = new Map<string, number>();\n const fieldListeners = new Map<string, Set<Listener>>();\n\n return {\n subscribe: (listener: Listener) => listen(listeners, listener),\n getSnapshot: () => version,\n subscribeStructure: (listener: Listener) => listen(structureListeners, listener),\n getStructureSnapshot: () => structureVersion,\n getFieldSnapshot: (key: string) => fieldVersions.get(key) ?? 0,\n\n subscribeField(key: string, listener: Listener): () => void {\n const set = fieldListeners.get(key) ?? new Set();\n set.add(listener);\n fieldListeners.set(key, set);\n return () => {\n set.delete(listener);\n if (set.size === 0) fieldListeners.delete(key);\n };\n },\n\n notify({ fieldKeys = [], structureChanged = false }: NotifyOptions = {}): void {\n for (const key of new Set(fieldKeys)) {\n fieldVersions.set(key, (fieldVersions.get(key) ?? 0) + 1);\n for (const listener of fieldListeners.get(key) ?? []) listener();\n }\n if (structureChanged) {\n structureVersion++;\n for (const listener of structureListeners) listener();\n }\n version++;\n for (const listener of listeners) listener();\n },\n };\n}\n","import { checkDefinition, FormDefinitionError, type DefinitionIssue } from '../definition-validation';\nimport { definitionErrors } from '../definition-validation/check-definition';\nimport { isError } from '../definition-validation/issues';\nimport type { FormDefinition } from '../types';\nimport type { FormEngineOptions } from './engine-options';\n\nfunction developmentIssues(definition: FormDefinition, validators: Record<string, unknown>): DefinitionIssue[] | undefined {\n try {\n if (process.env.NODE_ENV !== 'production') return checkDefinition(definition, { validators });\n } catch (error) {\n if (!(error instanceof ReferenceError)) throw error;\n }\n return undefined;\n}\n\nexport function assertDefinition(definition: FormDefinition, options: FormEngineOptions, validators: Record<string, unknown>): void {\n const issues = developmentIssues(definition, validators) ?? definitionErrors(definition);\n const errors = issues.filter(isError);\n if (errors.length) throw new FormDefinitionError(errors);\n const warn = options.onWarning ?? ((issue: DefinitionIssue) => console.warn(`[formhaus] ${issue.message}`));\n for (const issue of issues) warn(issue);\n}\n","import type { FormField, FormStep } from '../types';\nimport { conditionFields } from './engine-utils';\n\nexport function indexConditions<T extends FormField | FormStep>(dependent: T, index: Map<string, Set<T>>): void {\n for (const field of conditionFields(dependent)) {\n const dependents = index.get(field) ?? new Set<T>();\n dependents.add(dependent);\n index.set(field, dependents);\n }\n}\n","import { conditionFields, getAllFields } from './engine-utils';\nimport { indexConditions } from './visibility-index';\nimport { createActivePath } from './step-routes';\nimport type { ValidatorFn } from '../validation';\nimport { validateStep } from '../validation';\nimport type { FormDefinition, FormField, FormStep } from '../types';\nimport { isVisible } from '../visibility';\n\ninterface VisibilityCache {\n visibleSteps: FormStep[];\n currentStep: FormStep | null;\n visibleFields: FormField[];\n canGoNext: boolean;\n}\n\ntype Values = Record<string, unknown>;\n\nexport type VisibilityState = ReturnType<typeof createVisibility>;\n\nexport function createVisibility(definition: FormDefinition) {\n const allFields = getAllFields(definition);\n const fieldsByKey = new Map<string, FormField[]>();\n const routeFields = new Set<string>();\n const path = createActivePath(definition);\n const fieldDependents = new Map<string, Set<FormField>>();\n const stepDependents = new Map<string, Set<FormStep>>();\n const stepOfField = new Map<FormField, FormStep>();\n let visibilityDirty = true;\n let canGoNextDirty = true;\n const cache: VisibilityCache = { visibleSteps: [], currentStep: null, visibleFields: [], canGoNext: false };\n\n for (const field of allFields) {\n fieldsByKey.set(field.key, [...(fieldsByKey.get(field.key) ?? []), field]);\n indexConditions(field, fieldDependents);\n }\n for (const step of definition.steps ?? []) {\n for (const field of step.fields) stepOfField.set(field, step);\n indexConditions(step, stepDependents);\n for (const route of step.routes ?? []) for (const key of conditionFields(route)) routeFields.add(key);\n }\n\n const isMultiStep = () => (definition.steps ?? []).length > 0;\n const visible = (source: FormField | FormStep, values: Values) => isVisible(source, path.values(values));\n const onPath = (field: FormField, values: Values) => {\n const step = stepOfField.get(field);\n return !step || path.steps(values).includes(step);\n };\n\n function state(values: Values, stepIndex: number): VisibilityCache {\n if (!visibilityDirty) return cache;\n visibilityDirty = false;\n if (!isMultiStep()) {\n cache.visibleSteps = [];\n cache.currentStep = null;\n cache.visibleFields = (definition.fields ?? []).filter((field) => visible(field, values));\n return cache;\n }\n const steps = cache.visibleSteps = path.steps(values);\n const current = cache.currentStep = steps[stepIndex] ?? steps[steps.length - 1] ?? null;\n cache.visibleFields = current ? current.fields.filter((field) => visible(field, values)) : [];\n return cache;\n }\n\n return {\n allFields,\n conditionValues: path.values,\n state,\n\n markChanged(structureChanged: boolean, valuesChanged: boolean): void {\n if (structureChanged || valuesChanged) path.invalidate();\n if (structureChanged) visibilityDirty = true;\n if (structureChanged || valuesChanged) canGoNextDirty = true;\n },\n\n getCanGoNext(values: Values, stepIndex: number, validators: Record<string, ValidatorFn>): boolean {\n const step = state(values, stepIndex).currentStep;\n if (!canGoNextDirty) return cache.canGoNext;\n canGoNextDirty = false;\n const errors = step ? validateStep(step, path.values(values), validators) : {};\n return cache.canGoNext = isMultiStep() && Object.keys(errors).length === 0;\n },\n\n findStepIndex(fieldKey: string, values: Values, stepIndex: number): number | null {\n const target = state(values, stepIndex).visibleSteps.findIndex((step) => step.fields.some((field) => field.key === fieldKey));\n return target === -1 ? null : target;\n },\n\n affectsStructure(key: string, clearedFields: Set<string>): boolean {\n return routeFields.has(key) || fieldDependents.has(key) || stepDependents.has(key) || clearedFields.size > 0;\n },\n\n activeField(key: string, values: Values): FormField | undefined {\n return fieldsByKey.get(key)?.find((field) => onPath(field, values) && visible(field, values));\n },\n\n reconcileHidden(values: Values, errors: Record<string, string>): Set<string> {\n path.invalidate();\n const queue = [...new Set([...fieldDependents.keys(), ...stepDependents.keys()])];\n const queued = new Set(queue);\n const cleared = new Set<string>();\n const held = (key: string) => values[key] !== undefined || errors[key] !== undefined;\n const clear = (key: string) => {\n delete values[key];\n delete errors[key];\n path.invalidate();\n cleared.add(key);\n if (queued.has(key)) return;\n queued.add(key);\n queue.push(key);\n };\n for (let index = 0; index < queue.length; index++) {\n const key = queue[index];\n queued.delete(key);\n for (const field of fieldDependents.get(key) ?? []) {\n if (onPath(field, values) && !visible(field, values) && held(field.key)) clear(field.key);\n }\n for (const step of stepDependents.get(key) ?? []) {\n if (!visible(step, values)) for (const field of step.fields) if (held(field.key)) clear(field.key);\n }\n }\n return cleared;\n },\n };\n}\n","import type { ValidatorFn } from '../validation';\nimport { messageResolver, type ResolveMessage } from '../validation/default-messages';\nimport type { FormDefinition, FormField, FormStep } from '../types';\nimport type { FormEngineOptions, StepValidateFn, SubmitHandler } from './engine-options';\nimport { createValues } from './engine-utils';\nimport { changeStep, goToStepWithField, skipStep } from './navigation';\nimport type { EngineInternals, EngineState, RuntimeNotifyOptions } from './runtime-internals';\nimport { createSubscriptions, type NotifyOptions } from './subscriptions';\nimport {\n applyValidationErrors,\n getSubmitValues,\n resetEngine,\n validateForm,\n validateOne,\n clearError,\n clearResolvedMatchErrors,\n dropServerErrors,\n pruneOffPathErrors,\n} from './validation-state';\nimport { submitForm } from './submission';\nimport { reconcileStepIndex } from './step-routes';\nimport { assertDefinition } from './warnings';\nimport { createVisibility, type VisibilityState } from './visibility-state';\n\nexport class FormEngine<TValues extends object = Record<string, unknown>> {\n private readonly state: EngineState;\n private readonly skipped = new Map<string, string[]>();\n private validationEpoch = 0;\n private operationEpoch = 0;\n private readonly lifecycle: FormEngineOptions;\n\n private readonly validators: Record<string, ValidatorFn>;\n private readonly messages: ResolveMessage;\n private get onStepValidate(): StepValidateFn | undefined { return this.lifecycle.onStepValidate; }\n private readonly visibility: VisibilityState;\n private readonly subscriptions = createSubscriptions();\n\n constructor(\n readonly definition: FormDefinition,\n initialValues?: Partial<NoInfer<TValues>>,\n options?: FormEngineOptions,\n ) {\n this.lifecycle = options ?? {};\n this.validators = options?.validators ?? {};\n assertDefinition(definition, this.lifecycle, this.validators);\n this.messages = messageResolver(options?.messages, definition.messages);\n this.visibility = createVisibility(definition);\n const values = createValues(this.visibility.allFields, initialValues as Record<string, unknown> | undefined);\n this.state = { values, errors: {}, topLevelErrors: [], serverErrors: {}, serverFormErrors: [], currentStepIndex: 0, fieldLoading: {}, stepValidating: false, submitting: false };\n this.visibility.reconcileHidden(values, this.state.errors);\n }\n\n get values(): Readonly<Partial<TValues>> { return this.state.values as Partial<TValues>; }\n get errors(): Readonly<Record<string, string>> { return this.state.errors; }\n get topLevelErrors(): readonly string[] { return this.state.topLevelErrors; }\n get currentStepIndex(): number { return this.state.currentStepIndex; }\n get fieldLoading(): Readonly<Record<string, boolean>> { return this.state.fieldLoading; }\n get stepValidating(): boolean { return this.state.stepValidating; }\n get submitting(): boolean { return this.state.submitting; }\n\n get isMultiStep(): boolean {\n return (this.definition.steps ?? []).length > 0;\n }\n\n get visibleSteps(): FormStep[] {\n return this.view.visibleSteps;\n }\n\n get currentStep(): FormStep | null {\n return this.view.currentStep;\n }\n\n get visibleFields(): FormField[] {\n return this.view.visibleFields;\n }\n\n get isFirstStep(): boolean {\n return this.currentStepIndex === 0;\n }\n\n get isLastStep(): boolean {\n return this.currentStepIndex >= this.visibleSteps.length - 1;\n }\n\n get canGoNext(): boolean {\n return this.visibility.getCanGoNext(this.state.values, this.currentStepIndex, this.validators);\n }\n\n get stepErrors(): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n for (const step of this.visibleSteps) {\n const keys = step.fields.map((field) => field.key).filter((key) => this.errors[key] !== undefined);\n if (keys.length > 0) result[step.id] = keys;\n }\n return result;\n }\n\n get progress(): { current: number; total: number } {\n const total = this.visibleSteps.length;\n return { current: Math.min(this.currentStepIndex + 1, total), total };\n }\n\n subscribe(listener: () => void): () => void {\n return this.subscriptions.subscribe(listener);\n }\n\n getSnapshot(): number {\n return this.subscriptions.getSnapshot();\n }\n\n subscribeField(key: string, listener: () => void): () => void {\n return this.subscriptions.subscribeField(key, listener);\n }\n\n getFieldSnapshot(key: string): number {\n return this.subscriptions.getFieldSnapshot(key);\n }\n\n subscribeStructure(listener: () => void): () => void {\n return this.subscriptions.subscribeStructure(listener);\n }\n\n getStructureSnapshot(): number {\n return this.subscriptions.getStructureSnapshot();\n }\n\n setValue(key: string, value: unknown): void {\n const { values, errors } = this.state;\n const previousSteps = this.isMultiStep ? this.visibleSteps : null;\n const valueChanged = !Object.is(values[key], value);\n const previousError = errors[key];\n values[key] = value;\n clearError(this.internals, key, valueChanged);\n for (const [stepId, keys] of this.skipped) if (valueChanged && keys.includes(key)) this.skipped.delete(stepId);\n const clearedFields = this.visibility.reconcileHidden(values, errors);\n dropServerErrors(this.internals, clearedFields);\n const revalidated = clearResolvedMatchErrors(this.internals, key);\n const changedFields = new Set([...clearedFields, ...revalidated]);\n if (valueChanged || previousError !== errors[key]) changedFields.add(key);\n const valuesChanged = valueChanged || clearedFields.size > 0;\n const structureChanged = valuesChanged && this.visibility.affectsStructure(key, clearedFields);\n if (previousSteps && structureChanged) {\n this.visibility.markChanged(true, true);\n this.state.currentStepIndex = reconcileStepIndex(previousSteps, this.visibleSteps, this.currentStepIndex);\n for (const pruned of pruneOffPathErrors(this.internals)) changedFields.add(pruned);\n }\n this.notify({ fieldKeys: changedFields, structureChanged, valuesChanged });\n }\n\n setErrors(errors: Record<string, string>): void {\n applyValidationErrors(this.internals, errors, true);\n }\n\n setFieldLoading(key: string, loading: boolean): void {\n const previous = this.state.fieldLoading[key] === true;\n if (loading) this.state.fieldLoading[key] = true;\n else delete this.state.fieldLoading[key];\n this.notify({ fieldKeys: previous === loading ? [] : [key] });\n }\n\n cancelPendingActions(): void {\n this.validationEpoch++;\n this.operationEpoch++;\n this.state.stepValidating = false;\n this.state.submitting = false;\n this.notify();\n }\n\n next(): Promise<boolean> { return changeStep(this.internals, 'next'); }\n back(): Promise<boolean> { return changeStep(this.internals, 'back'); }\n skip(submit?: SubmitHandler): Promise<boolean> { return skipStep(this.internals, submit); }\n submit(handler: SubmitHandler): Promise<boolean> { return submitForm(this.internals, handler); }\n isStepSkipped(stepId: string): boolean { return this.skipped.has(stepId); }\n validate(): Record<string, string> { return validateForm(this.internals); }\n validateField(key: string): string | null { return validateOne(this.internals, key); }\n getSubmitValues(): Partial<TValues> { return getSubmitValues(this.internals) as Partial<TValues>; }\n goToStepWithField(key: string): void { goToStepWithField(this.internals, key); }\n reset(values?: Record<string, unknown>): void { resetEngine(this.internals, values); }\n\n private get view() {\n return this.visibility.state(this.state.values, this.currentStepIndex);\n }\n\n private get internals(): EngineInternals {\n return this as unknown as EngineInternals;\n }\n\n private notify(options: RuntimeNotifyOptions = {}): void {\n this.visibility.markChanged(!!options.structureChanged, !!options.valuesChanged);\n this.subscriptions.notify(options);\n }\n}\n"]}
|
package/dist/cloud.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { C as CloudAction } from './controller-
|
|
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-
|
|
3
|
-
import './definition-
|
|
1
|
+
import { C as CloudAction } from './controller-Ds_kbXSU.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-Ds_kbXSU.js';
|
|
3
|
+
import './definition-B4OIy_wH.js';
|
|
4
4
|
|
|
5
5
|
declare class CloudError extends Error {
|
|
6
6
|
readonly status: number;
|
package/dist/cloud.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{d as CloudError,i as createSubmitter,h as fetchDefinition,g as fetchForm,k as sessionDraftStore}from'./chunk-
|
|
1
|
+
export{d as CloudError,i as createSubmitter,h as fetchDefinition,g as fetchForm,k as sessionDraftStore}from'./chunk-UFYD5LVW.js';//# sourceMappingURL=cloud.js.map
|
|
2
2
|
//# sourceMappingURL=cloud.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { M as MessageCatalog, m as MessageKey, F as FormField } from './definition-B4OIy_wH.js';
|
|
2
|
+
|
|
3
|
+
type DefinitionIssueCode = 'invalid-type' | 'missing-property' | 'fields-and-steps' | 'duplicate-step-id' | 'duplicate-key' | 'reserved-key' | 'route-target' | 'unknown-field' | 'forward-reference' | 'condition-operator-count' | 'unknown-operator' | 'condition-value-mismatch' | 'condition-cycle' | 'invalid-pattern' | 'invalid-range' | 'rule-not-applicable' | 'missing-options' | 'default-not-in-options' | 'unknown-field-type' | 'unknown-validator' | 'skip-unreachable' | 'route-fallthrough' | 'unsupported-format-version' | 'i18n-unbound-slot' | 'unknown-i18n-slot' | 'unknown-message-key' | 'unknown-label-key' | 'i18n-unsafe-identifier';
|
|
4
|
+
interface DefinitionIssue {
|
|
5
|
+
code: DefinitionIssueCode;
|
|
6
|
+
severity: 'error' | 'warning';
|
|
7
|
+
path: string;
|
|
8
|
+
message: string;
|
|
9
|
+
hint?: string;
|
|
10
|
+
}
|
|
11
|
+
declare class FormDefinitionError extends Error {
|
|
12
|
+
readonly issues: DefinitionIssue[];
|
|
13
|
+
constructor(issues: DefinitionIssue[]);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type MessageParams = Record<string, unknown>;
|
|
17
|
+
type MessageFn = (key: MessageKey, params: MessageParams, field: FormField) => string | undefined;
|
|
18
|
+
type MessageSource = MessageCatalog | MessageFn;
|
|
19
|
+
declare const DEFAULT_MESSAGES: Readonly<Record<MessageKey, string>>;
|
|
20
|
+
type ValidationRule = 'required' | 'minLength' | 'maxLength' | 'min' | 'max' | 'pattern' | 'matchField';
|
|
21
|
+
declare function getDefaultMessage(rule: ValidationRule | MessageKey, params?: Record<string, unknown>): string;
|
|
22
|
+
|
|
23
|
+
export { type DefinitionIssue as D, FormDefinitionError as F, type MessageSource as M, type ValidationRule as V, type DefinitionIssueCode as a, type MessageFn as b, type MessageParams as c, DEFAULT_MESSAGES as d, getDefaultMessage as g };
|
|
@@ -1,8 +1,43 @@
|
|
|
1
|
+
type MessageKey = 'required' | 'minLength' | 'maxLength' | 'minItems' | 'maxItems' | 'min' | 'max' | 'pattern' | 'matchField' | 'email' | 'number' | 'date' | 'datetime' | 'option' | 'options' | 'boolean' | 'string' | 'file' | 'value';
|
|
2
|
+
type LabelKey = 'continue' | 'back' | 'stepOf' | 'errorSummary';
|
|
3
|
+
type MessageCatalog = Partial<Record<MessageKey, string>>;
|
|
4
|
+
type LabelCatalog = Partial<Record<LabelKey, string>>;
|
|
5
|
+
interface FormI18n {
|
|
6
|
+
title?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
messages?: MessageCatalog;
|
|
9
|
+
labels?: LabelCatalog;
|
|
10
|
+
}
|
|
11
|
+
interface StepI18n {
|
|
12
|
+
title?: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
}
|
|
15
|
+
interface FieldI18n {
|
|
16
|
+
label?: string;
|
|
17
|
+
placeholder?: string;
|
|
18
|
+
helperText?: string;
|
|
19
|
+
}
|
|
20
|
+
interface LabelI18n {
|
|
21
|
+
label?: string;
|
|
22
|
+
}
|
|
23
|
+
interface ValidationI18n {
|
|
24
|
+
required?: string;
|
|
25
|
+
minLength?: string;
|
|
26
|
+
maxLength?: string;
|
|
27
|
+
min?: string;
|
|
28
|
+
max?: string;
|
|
29
|
+
pattern?: string;
|
|
30
|
+
matchField?: string;
|
|
31
|
+
}
|
|
32
|
+
type LabelFn = (key: LabelKey, params: Record<string, unknown>) => string | undefined;
|
|
33
|
+
type LabelSource = LabelCatalog | LabelFn;
|
|
34
|
+
|
|
1
35
|
type DefaultFieldType = 'text' | 'email' | 'phone' | 'number' | 'password' | 'select' | 'autocomplete' | 'multiselect' | 'checkbox' | 'radio' | 'switch' | 'file' | 'date' | 'datetime' | 'textarea';
|
|
2
36
|
type FieldType = DefaultFieldType | (string & {});
|
|
3
37
|
interface FieldOption {
|
|
4
38
|
value: string;
|
|
5
39
|
label: string;
|
|
40
|
+
i18n?: LabelI18n;
|
|
6
41
|
}
|
|
7
42
|
interface FormField {
|
|
8
43
|
key: string;
|
|
@@ -23,6 +58,7 @@ interface FormField {
|
|
|
23
58
|
rows?: number;
|
|
24
59
|
mask?: string;
|
|
25
60
|
inputMode?: 'text' | 'numeric' | 'decimal' | 'tel' | 'email' | 'url' | 'search';
|
|
61
|
+
i18n?: FieldI18n;
|
|
26
62
|
}
|
|
27
63
|
interface ShowCondition {
|
|
28
64
|
field: string;
|
|
@@ -51,20 +87,26 @@ interface FieldValidation {
|
|
|
51
87
|
matchField?: string;
|
|
52
88
|
matchFieldMessage?: string;
|
|
53
89
|
validator?: string;
|
|
90
|
+
i18n?: ValidationI18n;
|
|
54
91
|
}
|
|
55
92
|
|
|
56
93
|
interface FormAction {
|
|
57
94
|
label: string;
|
|
58
95
|
variant?: 'primary' | 'secondary' | 'text';
|
|
59
96
|
disabled?: ShowCondition[];
|
|
97
|
+
i18n?: LabelI18n;
|
|
60
98
|
}
|
|
61
99
|
|
|
62
100
|
interface FormDefinition {
|
|
63
101
|
$schema?: string;
|
|
64
102
|
formatVersion?: string;
|
|
65
103
|
id: string;
|
|
104
|
+
lang?: string;
|
|
66
105
|
title: string;
|
|
67
106
|
description?: string;
|
|
107
|
+
messages?: MessageCatalog;
|
|
108
|
+
labels?: LabelCatalog;
|
|
109
|
+
i18n?: FormI18n;
|
|
68
110
|
submit: FormAction;
|
|
69
111
|
cancel?: FormAction;
|
|
70
112
|
fields?: FormField[];
|
|
@@ -86,6 +128,7 @@ interface FormStep {
|
|
|
86
128
|
next?: FormAction | false;
|
|
87
129
|
back?: FormAction | false;
|
|
88
130
|
skip?: FormAction;
|
|
131
|
+
i18n?: StepI18n;
|
|
89
132
|
}
|
|
90
133
|
|
|
91
|
-
export type { DefaultFieldType as D, FormField as F, ShowCondition as S, FormStep as a, FormAction as b,
|
|
134
|
+
export type { DefaultFieldType as D, FormField as F, LabelCatalog as L, MessageCatalog as M, ShowCondition as S, ValidationI18n as V, FormStep as a, FormAction as b, FieldI18n as c, FieldOption as d, FieldType as e, FieldValidation as f, FormDefinition as g, FormI18n as h, LabelFn as i, LabelI18n as j, LabelKey as k, LabelSource as l, MessageKey as m, StepI18n as n, StepRoute as o };
|
package/dist/i18n.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { g as FormDefinition, l as LabelSource, k as LabelKey } from './definition-B4OIy_wH.js';
|
|
2
|
+
import { M as MessageSource, D as DefinitionIssue } from './default-messages-yS4QtrYi.js';
|
|
3
|
+
export { d as defaultMessages } from './default-messages-yS4QtrYi.js';
|
|
4
|
+
|
|
5
|
+
type Overlay = {
|
|
6
|
+
[key: string]: string | Overlay;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
type TranslateFn = (key: string, params: Record<string, unknown>, defaultText: string) => string | undefined;
|
|
10
|
+
interface OverlaySource {
|
|
11
|
+
overlay: Overlay;
|
|
12
|
+
lang?: string;
|
|
13
|
+
}
|
|
14
|
+
interface TranslateSource {
|
|
15
|
+
translate: TranslateFn;
|
|
16
|
+
prefix?: string | false;
|
|
17
|
+
lang?: string;
|
|
18
|
+
}
|
|
19
|
+
type LocalizeSource = OverlaySource | TranslateSource;
|
|
20
|
+
interface Localized {
|
|
21
|
+
definition: FormDefinition;
|
|
22
|
+
messages: MessageSource;
|
|
23
|
+
labels: LabelSource;
|
|
24
|
+
}
|
|
25
|
+
declare function localize(input: FormDefinition, source: LocalizeSource): Localized;
|
|
26
|
+
|
|
27
|
+
interface TextSlot {
|
|
28
|
+
address: string;
|
|
29
|
+
key?: string;
|
|
30
|
+
text: string;
|
|
31
|
+
params: string[];
|
|
32
|
+
hash: string;
|
|
33
|
+
}
|
|
34
|
+
interface TextSlotOptions {
|
|
35
|
+
prefix?: string | false;
|
|
36
|
+
}
|
|
37
|
+
declare function textSlots(definition: FormDefinition, { prefix }?: TextSlotOptions): TextSlot[];
|
|
38
|
+
declare function translationTemplate(definition: FormDefinition): Overlay;
|
|
39
|
+
|
|
40
|
+
interface TranslationMeta {
|
|
41
|
+
prefix?: string | false;
|
|
42
|
+
slots?: Record<string, {
|
|
43
|
+
hash?: string;
|
|
44
|
+
}>;
|
|
45
|
+
}
|
|
46
|
+
interface TranslationIssues {
|
|
47
|
+
missing: string[];
|
|
48
|
+
unknown: string[];
|
|
49
|
+
invalid: string[];
|
|
50
|
+
placeholderMismatch: string[];
|
|
51
|
+
unlabeled: string[];
|
|
52
|
+
stale?: string[];
|
|
53
|
+
}
|
|
54
|
+
declare function translationIssues(definition: FormDefinition, overlay: unknown, meta?: TranslationMeta): TranslationIssues;
|
|
55
|
+
|
|
56
|
+
declare function checkTranslations(definition: FormDefinition): DefinitionIssue[];
|
|
57
|
+
|
|
58
|
+
declare const DEFAULT_LABELS: Readonly<Record<LabelKey, string>>;
|
|
59
|
+
|
|
60
|
+
export { type LocalizeSource, type Localized, type Overlay, type OverlaySource, type TextSlot, type TextSlotOptions, type TranslateFn, type TranslateSource, type TranslationIssues, type TranslationMeta, checkTranslations, DEFAULT_LABELS as defaultLabels, localize, textSlots, translationIssues, translationTemplate };
|
package/dist/i18n.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {g,k,e,a,b,d,c as c$1,f}from'./chunk-FQ3GLJTI.js';import {a as a$1,b as b$1,c}from'./chunk-PZEBYRGE.js';export{c as defaultLabels}from'./chunk-PZEBYRGE.js';import {b as b$2,a as a$2,g as g$1,r}from'./chunk-5KV7BDCS.js';export{a as defaultMessages}from'./chunk-5KV7BDCS.js';function B({definition:e,entries:t}){let n=[],r=[],l=false,f$1=(o,a,u,p,d$1)=>{for(let F of Object.keys(o??{}))u.includes(F)||n.push(c$1(p,`${a}/${d(F)}`,`"${F}" is not ${d$1}`,u.length?f(u):"Remove it"));},i=(o,a,u,p)=>{o&&(p&&r.push([`${a}/${p}`,o[p]]),o.i18n&&(l=true,f$1(o.i18n,`${a}/i18n`,[...u],"unknown-i18n-slot","a translatable text here")));},c$2=Object.keys(a$2),s=Object.keys(c);f$1(e.messages,"/messages",c$2,"unknown-message-key","a message key"),f$1(e.labels,"/labels",s,"unknown-label-key","a label key"),f$1(e.i18n?.messages,"/i18n/messages",c$2,"unknown-message-key","a message key"),f$1(e.i18n?.labels,"/i18n/labels",s,"unknown-label-key","a label key"),i(e,"",[...a$1.form,"messages","labels"],"id"),i(e.submit,"/submit",a$1.action),i(e.cancel,"/cancel",a$1.action),(e.steps??[]).forEach((o,a)=>{i(o,`/steps/${a}`,a$1.step,"id");for(let u of ["next","back","skip"])i(o[u],`/steps/${a}/${u}`,a$1.action);});for(let{field:o,path:a}of t){i(o,a,a$1.field,"key"),o.options?.forEach((p,d)=>i(p,`${a}/options/${d}`,a$1.option,"value"));let u=o.validation;u&&i(u,`${a}/validation`,a$1.validation.filter(p=>b$1(u,p)));}if(l)for(let[o,a]of r)typeof a=="string"&&/[.:]/.test(a)&&n.push(c$1("i18n-unsafe-identifier",o,`${JSON.stringify(a)} contains "." or ":"`,'Use letters, digits, "-" or "_", because translation keys and TMS imports split on these characters'));return n}var y=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),G=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function x(e,t){let n=e;for(let r of t)n=y(n)&&G(n,r)?n[r]:void 0;return typeof n=="string"&&n.trim()?n:void 0}function P(e,t,n){Object.defineProperty(e,t,{value:n,enumerable:true,writable:true,configurable:true});}function J(e,t,n){let r=e;for(let l of t.slice(0,-1))(!G(r,l)||!y(r[l]))&&P(r,l,{}),r=r[l];P(r,t[t.length-1],n);}function $(e,t=[]){return y(e)?Object.keys(e).flatMap(n=>$(e[n],[...t,n])):[{path:t,value:e}]}var N=e=>JSON.stringify(e),O=e=>[...new Set(e.match(/\{\w+\}/g)??[])].map(t=>t.slice(1,-1)).sort();function h(e){let t=[],n=(i,c,s,o,a)=>{c&&t.push({kind:i,node:c,path:s,address:o,field:a});},r=(i,c,s,o)=>{for(let a of o)n("action",i[a],`${c}/${a}`,[...s,a]);},l=(i,c,s)=>i.forEach((o,a)=>{let u=`${c}/fields/${a}`,p=[...s,"fields",o.key];n("field",o,u,p),o.options?.forEach((d,F)=>n("option",d,`${u}/options/${F}`,[...p,"options",d.value])),n("validation",o.validation,`${u}/validation`,[...p,"validation"],o);});n("form",e,"",[]),r(e,"",[],["submit","cancel"]);let f=e.steps??[];return f.forEach((i,c)=>{let s=`/steps/${c}`,o=["steps",i.id];n("step",i,s,o),r(i,s,o,["next","back","skip"]),l(i.fields,s,o);}),f.length||l(e.fields??[],"",[]),t}function W(e,t,n){return e==="option"?t:[...t,n]}var V={form:["title","description"],step:["title","description"],field:["label","placeholder","helperText"],option:["label"],action:["label"],validation:[]};function L(e,t,n,r=[]){return e===void 0?[]:y(e)?Object.entries(e).flatMap(([l,f])=>r.includes(l)?L(f,`${t}/${l}`,n):typeof f=="string"&&f.trim()?[]:[b("invalid-type",`${t}/${d(l)}`,"must be a non-empty string")]):[b("invalid-type",t,`must be an object of ${n}`)]}function Y(e){let t=e;return [...t.lang===void 0||typeof t.lang=="string"?[]:[b("invalid-type","/lang",'"lang" must be a string')],...L(t.messages,"/messages","message templates"),...L(t.labels,"/labels","label templates"),...h(e).flatMap(({kind:n,node:r,path:l})=>{let f=r.i18n,i=y(f)?V[n].filter(c=>f[c]!==void 0&&typeof r[c]!="string"):[];return [...L(f,`${l}/i18n`,"translation keys",n==="form"?["messages","labels"]:[]),...i.map(c=>b("i18n-unbound-slot",`${l}/i18n/${c}`,`"${c}" has a translation key but no source text`,`Add "${c}" as the fallback text`))]})]}function M(e){let t=Y(e);return t.length?t:B(g(e))}var q={minLength:"min",maxLength:"max",min:"min",max:"max"};function X(e,t){return e.type==="multiselect"&&t.endsWith("Length")?t.replace("Length","Items"):t}function Z(e){let t=new Set([...Object.keys(e.messages??{}),...Object.keys(e.i18n?.messages??{})]);for(let n of g$1(e)){let r$1=n.validation??{};for(let l of a$1.validation)b$1(r$1,l)&&r$1[l]!==""&&typeof r$1[l==="required"?l:`${l}Message`]!="string"&&t.add(X(n,l));for(let l of r(n))t.add(l);}return t}function ee(e,{kind:t,node:n,address:r,field:l}){let f=n.i18n??{};return a$1[t].flatMap(i=>{if(t!=="validation"){let p=n[i];return typeof p!="string"?[]:[{kind:"text",address:W(t,r,i),key:f[i],source:p,fallback:p,params:{},template:true,apply:d=>{n[i]=d;}}]}if(!b$1(n,i)||!l)return [];let c=i==="required"?i:`${i}Message`,s=typeof n[c]=="string"?n[c]:void 0,o=q[i]?{[q[i]]:n[i]}:{},a=X(l,i),u=s??b$2(e.messages?.[a]??a$2[a],o);return [{kind:"rule",address:[...r,i],key:f[i],source:s,fallback:u,params:o,template:s!==void 0||!!f[i],apply:p=>{n[c]=p;}}]})}function H(e,t,n){let r=t==="messages"?a$2:c,l=e.i18n?.[t]??{};return Object.keys(r).map(f=>{let i=e[t]?.[f]??r[f];return {kind:t==="messages"?"message":"label",address:[t,f],key:l[f],source:i,fallback:i,params:{},template:n.has(f),apply:c=>{(e[t]??(e[t]={}))[f]=c;}}})}function S(e){let t=!!e.steps?.length,n=new Set(t?["continue","back","stepOf","errorSummary"]:["errorSummary"]);return [...h(e).flatMap(r=>ee(e,r)),...H(e,"messages",Z(e)),...H(e,"labels",n)]}function A(e,t,n){if(t!==void 0)return t;if(e!==false)return (e?[e,...n]:n).join(".")}function te(e,t){for(let n of S(e)){let r=x(t,n.address);r!==void 0&&n.apply(n.kind==="rule"?b$2(r,n.params):r);}return {definition:e,messages:e.messages??{},labels:e.labels??{}}}function ne(e,{translate:t,prefix:n=e.id}){let r=(s,o,a,u)=>{let p=A(n,s,o),d;try{d=p===void 0?void 0:t(p,a,u);}catch{return}return typeof d=="string"&&d.trim()&&d!==p?b$2(d,a):void 0},l={messages:{...e.messages},labels:{...e.labels}},f=e.i18n??{};for(let s of S(e)){if(s.kind!=="text"&&s.kind!=="rule")continue;let o=r(s.key,s.address,s.params,s.fallback);o!==void 0&&(s.source!==void 0||o!==s.fallback)&&s.apply(o);}return {definition:e,messages:(s,o)=>r(f.messages?.[s],["messages",s],o,b$2(l.messages[s]??a$2[s],o)),labels:(s,o)=>r(f.labels?.[s],["labels",s],o,b$2(l.labels[s]??c[s],o))}}function se(e$1,t){let n=M(k(e$1)).filter(e);if(n.length)throw new a(n);let r=JSON.parse(JSON.stringify(e$1));return t.lang&&(r.lang=t.lang),"overlay"in t?te(r,t.overlay):ne(r,t)}function re(e,t){let n=2166136261;for(let r of `${e??""}\0${t}`)n=Math.imul(n^r.codePointAt(0),16777619)>>>0;return n.toString(16).padStart(8,"0")}var Q=e=>S(e).filter(t=>t.template);function j(e,t){let n=A(t,e.key,e.address),r=e.source??e.fallback,l=e.kind==="rule"?Object.keys(e.params):O(r);return {address:e.address.join("."),...n!==void 0&&{key:n},text:r,params:l,hash:re(n,r)}}function oe(e,{prefix:t=e.id}={}){return Q(e).map(n=>j(n,t))}function ie(e){let t={};for(let n of Q(e))J(t,n.address,n.source??n.fallback);return t}var D=e=>e.join(".");function ae(e,t){let n=O(t);return e.kind==="rule"?n.some(r=>!Object.prototype.hasOwnProperty.call(e.params,r)):n.join()!==O(e.source??e.fallback).join()}function le(e,t,n){let r=S(e),l=new Set(r.map(s=>N(s.address))),f=y(t)?$(t):[{path:[],value:null}],i=r.filter(s=>x(t,s.address)!==void 0),c={missing:r.filter(s=>s.template&&x(t,s.address)===void 0).map(s=>D(s.address)),unknown:f.filter(({path:s,value:o})=>typeof o=="string"&&!l.has(N(s))).map(({path:s})=>D(s)),invalid:f.filter(({value:s})=>typeof s!="string").map(({path:s})=>D(s)),placeholderMismatch:i.filter(s=>ae(s,x(t,s.address))).map(s=>D(s.address)),unlabeled:h(e).filter(({kind:s,node:o,address:a})=>s==="field"&&!(typeof o.label=="string"&&o.label.trim())&&x(t,[...a,"label"])===void 0).map(({address:s})=>D([...s,"label"]))};if(n?.slots){let s=n.slots,o=a=>Object.prototype.hasOwnProperty.call(s,a);c.stale=i.filter(a=>a.template).map(a=>j(a,n.prefix??e.id)).filter(({address:a,hash:u})=>o(a)&&s[a]?.hash!==void 0&&s[a].hash!==u).map(({address:a})=>a);}return c}export{M as checkTranslations,se as localize,oe as textSlots,le as translationIssues,ie as translationTemplate};//# sourceMappingURL=i18n.js.map
|
|
2
|
+
//# sourceMappingURL=i18n.js.map
|
package/dist/i18n.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/i18n/check-warnings.ts","../src/i18n/overlay.ts","../src/i18n/walk.ts","../src/i18n/check.ts","../src/i18n/slots.ts","../src/i18n/localize.ts","../src/i18n/template.ts","../src/i18n/issues.ts"],"names":["i18nWarnings","definition","entries","issues","ids","keyed","unknown","block","path","known","code","what","key","warning","pointer","oneOf","node","value","slots","id","messages","DEFAULT_MESSAGES","labels","DEFAULT_LABELS","SLOTS","step","index","name","field","option","rules","rule","hasRule","isEntry","own","lookup","overlay","define","target","assign","leaves","addressKey","placeholders","text","textNodes","list","add","kind","address","actions","owner","names","fields","items","at","position","steps","slotAddress","slot","TEXTS","strings","nested","item","error","translationErrors","root","unbound","checkTranslations","errors","createContext","BOUNDS","ruleKey","usedMessages","keys","getAllFields","typeMessageKeys","nodeSlots","source","literalName","literal","params","message","fallback","formatText","catalogSlots","used","defaults","definitionSlots","translationKey","prefix","explicit","fromOverlay","fromTranslate","translate","ask","localize","input","parseDefinition","isError","FormDefinitionError","textHash","hash","char","templateSlots","describeSlot","textSlots","translationTemplate","dotted","mismatch","translationIssues","meta","found","translated","result","baseline"],"mappings":"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","file":"i18n.js","sourcesContent":["import { DEFAULT_MESSAGES } from '../validation/default-messages';\nimport { DEFAULT_LABELS, hasRule, SLOTS } from './nodes';\nimport type { CheckContext } from '../definition-validation/context';\nimport type { DefinitionIssue, DefinitionIssueCode } from '../definition-validation/issues';\nimport { oneOf, pointer, warning } from '../definition-validation/issues';\n\ntype Node = Record<string, unknown> | undefined | false;\n\nexport function i18nWarnings({ definition, entries }: CheckContext): DefinitionIssue[] {\n const issues: DefinitionIssue[] = [];\n const ids: [string, unknown][] = [];\n let keyed = false;\n const unknown = (block: unknown, path: string, known: string[], code: DefinitionIssueCode, what: string) => {\n for (const key of Object.keys(block ?? {})) {\n if (!known.includes(key)) issues.push(warning(code, `${path}/${pointer(key)}`, `\"${key}\" is not ${what}`, known.length ? oneOf(known) : 'Remove it'));\n }\n };\n const node = (value: Node, path: string, slots: readonly string[], id?: string) => {\n if (!value) return;\n if (id) ids.push([`${path}/${id}`, value[id]]);\n if (!value.i18n) return;\n keyed = true;\n unknown(value.i18n, `${path}/i18n`, [...slots], 'unknown-i18n-slot', 'a translatable text here');\n };\n const messages = Object.keys(DEFAULT_MESSAGES);\n const labels = Object.keys(DEFAULT_LABELS);\n unknown(definition.messages, '/messages', messages, 'unknown-message-key', 'a message key');\n unknown(definition.labels, '/labels', labels, 'unknown-label-key', 'a label key');\n unknown(definition.i18n?.messages, '/i18n/messages', messages, 'unknown-message-key', 'a message key');\n unknown(definition.i18n?.labels, '/i18n/labels', labels, 'unknown-label-key', 'a label key');\n node(definition as unknown as Node, '', [...SLOTS.form, 'messages', 'labels'], 'id');\n node(definition.submit as unknown as Node, '/submit', SLOTS.action);\n node(definition.cancel as unknown as Node, '/cancel', SLOTS.action);\n (definition.steps ?? []).forEach((step, index) => {\n node(step as unknown as Node, `/steps/${index}`, SLOTS.step, 'id');\n for (const name of ['next', 'back', 'skip'] as const) node(step[name] as unknown as Node, `/steps/${index}/${name}`, SLOTS.action);\n });\n for (const { field, path } of entries) {\n node(field as unknown as Node, path, SLOTS.field, 'key');\n field.options?.forEach((option, index) => node(option as unknown as Node, `${path}/options/${index}`, SLOTS.option, 'value'));\n const rules = field.validation as Node;\n if (rules) node(rules, `${path}/validation`, SLOTS.validation.filter((rule) => hasRule(rules, rule)));\n }\n if (keyed) {\n for (const [path, id] of ids) {\n if (typeof id === 'string' && /[.:]/.test(id)) issues.push(warning('i18n-unsafe-identifier', path, `${JSON.stringify(id)} contains \".\" or \":\"`, 'Use letters, digits, \"-\" or \"_\", because translation keys and TMS imports split on these characters'));\n }\n }\n return issues;\n}\n","export type Overlay = { [key: string]: string | Overlay };\n\nexport const isEntry = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst own = (value: object, key: string) => Object.prototype.hasOwnProperty.call(value, key);\n\nexport function lookup(overlay: unknown, path: string[]): string | undefined {\n let node = overlay;\n for (const key of path) node = isEntry(node) && own(node, key) ? node[key] : undefined;\n return typeof node === 'string' && node.trim() ? node : undefined;\n}\n\nfunction define(target: object, key: string, value: unknown): void {\n Object.defineProperty(target, key, { value, enumerable: true, writable: true, configurable: true });\n}\n\nexport function assign(target: Overlay, path: string[], value: string): void {\n let node: Overlay = target;\n for (const key of path.slice(0, -1)) {\n if (!own(node, key) || !isEntry(node[key])) define(node, key, {});\n node = node[key] as Overlay;\n }\n define(node, path[path.length - 1], value);\n}\n\nexport function leaves(overlay: unknown, path: string[] = []): { path: string[]; value: unknown }[] {\n if (!isEntry(overlay)) return [{ path, value: overlay }];\n return Object.keys(overlay).flatMap((key) => leaves(overlay[key], [...path, key]));\n}\n\nexport const addressKey = (path: string[]) => JSON.stringify(path);\n\nexport const placeholders = (text: string) => [...new Set(text.match(/\\{\\w+\\}/g) ?? [])].map((name) => name.slice(1, -1)).sort();\n","import type { FormDefinition, FormField } from '../types';\nimport type { Entry, NodeKind } from './nodes';\n\nexport interface TextNode {\n kind: NodeKind;\n node: Entry;\n path: string;\n address: string[];\n field?: FormField;\n}\n\nexport function textNodes(definition: FormDefinition): TextNode[] {\n const list: TextNode[] = [];\n const add = (kind: NodeKind, node: unknown, path: string, address: string[], field?: FormField) => {\n if (node) list.push({ kind, node: node as Entry, path, address, field });\n };\n const actions = (owner: Entry, path: string, address: string[], names: string[]) => {\n for (const name of names) add('action', owner[name], `${path}/${name}`, [...address, name]);\n };\n const fields = (items: FormField[], path: string, address: string[]) => items.forEach((field, index) => {\n const at = `${path}/fields/${index}`;\n const key = [...address, 'fields', field.key];\n add('field', field, at, key);\n field.options?.forEach((option, position) => add('option', option, `${at}/options/${position}`, [...key, 'options', option.value]));\n add('validation', field.validation, `${at}/validation`, [...key, 'validation'], field);\n });\n add('form', definition, '', []);\n actions(definition as unknown as Entry, '', [], ['submit', 'cancel']);\n const steps = definition.steps ?? [];\n steps.forEach((step, index) => {\n const path = `/steps/${index}`;\n const address = ['steps', step.id];\n add('step', step, path, address);\n actions(step as unknown as Entry, path, address, ['next', 'back', 'skip']);\n fields(step.fields, path, address);\n });\n if (!steps.length) fields(definition.fields ?? [], '', []);\n return list;\n}\n\nexport function slotAddress(kind: NodeKind, address: string[], slot: string): string[] {\n return kind === 'option' ? address : [...address, slot];\n}\n","import { createContext } from '../definition-validation/context';\nimport { error, pointer, type DefinitionIssue } from '../definition-validation/issues';\nimport type { FormDefinition } from '../types';\nimport { i18nWarnings } from './check-warnings';\nimport { isEntry } from './overlay';\nimport { textNodes } from './walk';\n\nconst TEXTS = { form: ['title', 'description'], step: ['title', 'description'], field: ['label', 'placeholder', 'helperText'], option: ['label'], action: ['label'], validation: [] };\n\nfunction strings(value: unknown, path: string, what: string, nested: string[] = []): DefinitionIssue[] {\n if (value === undefined) return [];\n if (!isEntry(value)) return [error('invalid-type', path, `must be an object of ${what}`)];\n return Object.entries(value).flatMap(([key, item]) => (nested.includes(key)\n ? strings(item, `${path}/${key}`, what)\n : typeof item === 'string' && item.trim() ? [] : [error('invalid-type', `${path}/${pointer(key)}`, 'must be a non-empty string')]));\n}\n\nfunction translationErrors(definition: FormDefinition): DefinitionIssue[] {\n const root = definition as unknown as Record<string, unknown>;\n return [\n ...(root.lang === undefined || typeof root.lang === 'string' ? [] : [error('invalid-type', '/lang', '\"lang\" must be a string')]),\n ...strings(root.messages, '/messages', 'message templates'),\n ...strings(root.labels, '/labels', 'label templates'),\n ...textNodes(definition).flatMap(({ kind, node, path }) => {\n const block = node.i18n;\n const unbound = isEntry(block) ? TEXTS[kind].filter((slot) => block[slot] !== undefined && typeof node[slot] !== 'string') : [];\n return [\n ...strings(block, `${path}/i18n`, 'translation keys', kind === 'form' ? ['messages', 'labels'] : []),\n ...unbound.map((slot) => error('i18n-unbound-slot', `${path}/i18n/${slot}`, `\"${slot}\" has a translation key but no source text`, `Add \"${slot}\" as the fallback text`)),\n ];\n }),\n ];\n}\n\nexport function checkTranslations(definition: FormDefinition): DefinitionIssue[] {\n const errors = translationErrors(definition);\n return errors.length ? errors : i18nWarnings(createContext(definition));\n}\n","import { getAllFields } from '../engine/engine-utils';\nimport type { FormDefinition, FormField, LabelKey, MessageKey } from '../types';\nimport { DEFAULT_MESSAGES, formatText } from '../validation/default-messages';\nimport { typeMessageKeys } from '../validation/type-checks';\nimport { DEFAULT_LABELS, hasRule, SLOTS, type Entry } from './nodes';\nimport { slotAddress, textNodes, type TextNode } from './walk';\n\nexport type SlotKind = 'text' | 'rule' | 'message' | 'label';\n\nexport interface Slot {\n kind: SlotKind;\n address: string[];\n key?: string;\n source?: string;\n fallback: string;\n params: Record<string, unknown>;\n template: boolean;\n apply: (text: string) => void;\n}\n\nconst BOUNDS: Record<string, string> = { minLength: 'min', maxLength: 'max', min: 'min', max: 'max' };\n\nfunction ruleKey(field: FormField, rule: string): MessageKey {\n return (field.type === 'multiselect' && rule.endsWith('Length') ? rule.replace('Length', 'Items') : rule) as MessageKey;\n}\n\nfunction usedMessages(definition: FormDefinition): Set<string> {\n const keys = new Set([...Object.keys(definition.messages ?? {}), ...Object.keys(definition.i18n?.messages ?? {})]);\n for (const field of getAllFields(definition)) {\n const rules = (field.validation ?? {}) as Entry;\n for (const rule of SLOTS.validation) {\n if (hasRule(rules, rule) && rules[rule] !== '' && typeof rules[rule === 'required' ? rule : `${rule}Message`] !== 'string') keys.add(ruleKey(field, rule));\n }\n for (const key of typeMessageKeys(field)) keys.add(key);\n }\n return keys;\n}\n\nfunction nodeSlots(definition: FormDefinition, { kind, node, address, field }: TextNode): Slot[] {\n const keys = (node.i18n ?? {}) as Record<string, string>;\n return SLOTS[kind].flatMap((slot): Slot[] => {\n if (kind !== 'validation') {\n const source = node[slot];\n if (typeof source !== 'string') return [];\n return [{ kind: 'text', address: slotAddress(kind, address, slot), key: keys[slot], source, fallback: source, params: {}, template: true, apply: (text) => { node[slot] = text; } }];\n }\n if (!hasRule(node, slot) || !field) return [];\n const literalName = slot === 'required' ? slot : `${slot}Message`;\n const literal = typeof node[literalName] === 'string' ? node[literalName] as string : undefined;\n const params = BOUNDS[slot] ? { [BOUNDS[slot]]: node[slot] } : {};\n const message = ruleKey(field, slot);\n const fallback = literal ?? formatText(definition.messages?.[message] ?? DEFAULT_MESSAGES[message], params);\n return [{ kind: 'rule', address: [...address, slot], key: keys[slot], source: literal, fallback, params, template: literal !== undefined || !!keys[slot], apply: (text) => { node[literalName] = text; } }];\n });\n}\n\nfunction catalogSlots(definition: FormDefinition, name: 'messages' | 'labels', used: Set<string>): Slot[] {\n const defaults: Record<string, string> = name === 'messages' ? DEFAULT_MESSAGES : DEFAULT_LABELS;\n const keys = (definition.i18n?.[name] ?? {}) as Record<string, string>;\n return Object.keys(defaults).map((item) => {\n const source = (definition[name] as Record<string, string> | undefined)?.[item] ?? defaults[item];\n return {\n kind: name === 'messages' ? 'message' : 'label', address: [name, item], key: keys[item], source, fallback: source, params: {}, template: used.has(item),\n apply: (text: string) => { ((definition[name] ??= {}) as Record<string, string>)[item] = text; },\n };\n });\n}\n\nexport function definitionSlots(definition: FormDefinition): Slot[] {\n const steps = !!definition.steps?.length;\n const labels = new Set<LabelKey>(steps ? ['continue', 'back', 'stepOf', 'errorSummary'] : ['errorSummary']);\n return [\n ...textNodes(definition).flatMap((node) => nodeSlots(definition, node)),\n ...catalogSlots(definition, 'messages', usedMessages(definition)),\n ...catalogSlots(definition, 'labels', labels),\n ];\n}\n","import { parseDefinition } from '../definition-validation/check-definition';\nimport { FormDefinitionError, isError } from '../definition-validation/issues';\nimport { checkTranslations } from './check';\nimport type { FormDefinition, LabelFn, LabelSource } from '../types';\nimport { DEFAULT_MESSAGES, formatText, type MessageFn, type MessageSource } from '../validation/default-messages';\nimport { DEFAULT_LABELS } from './nodes';\nimport { lookup, type Overlay } from './overlay';\nimport { definitionSlots } from './slots';\n\nexport type TranslateFn = (key: string, params: Record<string, unknown>, defaultText: string) => string | undefined;\n\nexport interface OverlaySource {\n overlay: Overlay;\n lang?: string;\n}\n\nexport interface TranslateSource {\n translate: TranslateFn;\n prefix?: string | false;\n lang?: string;\n}\n\nexport type LocalizeSource = OverlaySource | TranslateSource;\n\nexport interface Localized {\n definition: FormDefinition;\n messages: MessageSource;\n labels: LabelSource;\n}\n\nexport function translationKey(prefix: string | false, explicit: string | undefined, address: string[]): string | undefined {\n if (explicit !== undefined) return explicit;\n if (prefix === false) return undefined;\n return (prefix ? [prefix, ...address] : address).join('.');\n}\n\nfunction fromOverlay(definition: FormDefinition, overlay: Overlay): Localized {\n for (const slot of definitionSlots(definition)) {\n const text = lookup(overlay, slot.address);\n if (text !== undefined) slot.apply(slot.kind === 'rule' ? formatText(text, slot.params) : text);\n }\n return { definition, messages: definition.messages ?? {}, labels: definition.labels ?? {} };\n}\n\nfunction fromTranslate(definition: FormDefinition, { translate, prefix = definition.id }: TranslateSource): Localized {\n const ask = (explicit: string | undefined, address: string[], params: Record<string, unknown>, fallback: string) => {\n const key = translationKey(prefix, explicit, address);\n let text: unknown;\n try {\n text = key === undefined ? undefined : translate(key, params, fallback);\n } catch {\n return undefined;\n }\n return typeof text === 'string' && text.trim() && text !== key ? formatText(text, params) : undefined;\n };\n const source = { messages: { ...definition.messages }, labels: { ...definition.labels } };\n const keys = definition.i18n ?? {};\n for (const slot of definitionSlots(definition)) {\n if (slot.kind !== 'text' && slot.kind !== 'rule') continue;\n const text = ask(slot.key, slot.address, slot.params, slot.fallback);\n if (text !== undefined && (slot.source !== undefined || text !== slot.fallback)) slot.apply(text);\n }\n const messages: MessageFn = (key, params) => (\n ask(keys.messages?.[key], ['messages', key], params, formatText(source.messages[key] ?? DEFAULT_MESSAGES[key], params))\n );\n const labels: LabelFn = (key, params) => (\n ask(keys.labels?.[key], ['labels', key], params, formatText(source.labels[key] ?? DEFAULT_LABELS[key], params))\n );\n return { definition, messages, labels };\n}\n\nexport function localize(input: FormDefinition, source: LocalizeSource): Localized {\n const errors = checkTranslations(parseDefinition(input)).filter(isError);\n if (errors.length) throw new FormDefinitionError(errors);\n const definition: FormDefinition = JSON.parse(JSON.stringify(input));\n if (source.lang) definition.lang = source.lang;\n return 'overlay' in source ? fromOverlay(definition, source.overlay) : fromTranslate(definition, source);\n}\n","import type { FormDefinition } from '../types';\nimport { translationKey } from './localize';\nimport { assign, placeholders, type Overlay } from './overlay';\nimport { definitionSlots, type Slot } from './slots';\n\nexport interface TextSlot {\n address: string;\n key?: string;\n text: string;\n params: string[];\n hash: string;\n}\n\nexport interface TextSlotOptions {\n prefix?: string | false;\n}\n\nexport function textHash(key: string | undefined, text: string): string {\n let hash = 0x811c9dc5;\n for (const char of `${key ?? ''}\\u0000${text}`) hash = Math.imul(hash ^ char.codePointAt(0)!, 0x01000193) >>> 0;\n return hash.toString(16).padStart(8, '0');\n}\n\nexport const templateSlots = (definition: FormDefinition): Slot[] => definitionSlots(definition).filter((slot) => slot.template);\n\nexport function describeSlot(slot: Slot, prefix: string | false): TextSlot {\n const key = translationKey(prefix, slot.key, slot.address);\n const text = slot.source ?? slot.fallback;\n const params = slot.kind === 'rule' ? Object.keys(slot.params) : placeholders(text);\n return { address: slot.address.join('.'), ...(key !== undefined && { key }), text, params, hash: textHash(key, text) };\n}\n\nexport function textSlots(definition: FormDefinition, { prefix = definition.id }: TextSlotOptions = {}): TextSlot[] {\n return templateSlots(definition).map((slot) => describeSlot(slot, prefix));\n}\n\nexport function translationTemplate(definition: FormDefinition): Overlay {\n const overlay: Overlay = {};\n for (const slot of templateSlots(definition)) assign(overlay, slot.address, slot.source ?? slot.fallback);\n return overlay;\n}\n","import type { FormDefinition } from '../types';\nimport { textNodes } from './walk';\nimport { addressKey, isEntry, leaves, lookup, placeholders } from './overlay';\nimport { definitionSlots, type Slot } from './slots';\nimport { describeSlot } from './template';\n\nexport interface TranslationMeta {\n prefix?: string | false;\n slots?: Record<string, { hash?: string }>;\n}\n\nexport interface TranslationIssues {\n missing: string[];\n unknown: string[];\n invalid: string[];\n placeholderMismatch: string[];\n unlabeled: string[];\n stale?: string[];\n}\n\nconst dotted = (path: string[]) => path.join('.');\n\nfunction mismatch(slot: Slot, text: string): boolean {\n const used = placeholders(text);\n if (slot.kind === 'rule') return used.some((name) => !Object.prototype.hasOwnProperty.call(slot.params, name));\n return used.join() !== placeholders(slot.source ?? slot.fallback).join();\n}\n\nexport function translationIssues(definition: FormDefinition, overlay: unknown, meta?: TranslationMeta): TranslationIssues {\n const slots = definitionSlots(definition);\n const known = new Set(slots.map((slot) => addressKey(slot.address)));\n const found = isEntry(overlay) ? leaves(overlay) : [{ path: [], value: null }];\n const translated = slots.filter((slot) => lookup(overlay, slot.address) !== undefined);\n const result: TranslationIssues = {\n missing: slots.filter((slot) => slot.template && lookup(overlay, slot.address) === undefined).map((slot) => dotted(slot.address)),\n unknown: found.filter(({ path, value }) => typeof value === 'string' && !known.has(addressKey(path))).map(({ path }) => dotted(path)),\n invalid: found.filter(({ value }) => typeof value !== 'string').map(({ path }) => dotted(path)),\n placeholderMismatch: translated.filter((slot) => mismatch(slot, lookup(overlay, slot.address)!)).map((slot) => dotted(slot.address)),\n unlabeled: textNodes(definition)\n .filter(({ kind, node, address }) => kind === 'field' && !(typeof node.label === 'string' && node.label.trim()) && lookup(overlay, [...address, 'label']) === undefined)\n .map(({ address }) => dotted([...address, 'label'])),\n };\n if (meta?.slots) {\n const baseline = meta.slots;\n const own = (address: string) => Object.prototype.hasOwnProperty.call(baseline, address);\n result.stale = translated.filter((slot) => slot.template).map((slot) => describeSlot(slot, meta.prefix ?? definition.id))\n .filter(({ address, hash }) => own(address) && baseline[address]?.hash !== undefined && baseline[address].hash !== hash)\n .map(({ address }) => address);\n }\n return result;\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { F as FormField, a as FormStep, S as ShowCondition, b as FormAction } from './definition-
|
|
2
|
-
export { D as DefaultFieldType, c as
|
|
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, e as SubmitHandler, f as SubmitResult } from './runtime-
|
|
4
|
-
import {
|
|
5
|
-
export { D as DefinitionIssue, a as DefinitionIssueCode, F as FormDefinitionError,
|
|
6
|
-
|
|
1
|
+
import { F as FormField, a as FormStep, S as ShowCondition, b as FormAction } from './definition-B4OIy_wH.js';
|
|
2
|
+
export { D as DefaultFieldType, c as FieldI18n, d as FieldOption, e as FieldType, f as FieldValidation, g as FormDefinition, h as FormI18n, L as LabelCatalog, i as LabelFn, j as LabelI18n, k as LabelKey, l as LabelSource, M as MessageCatalog, m as MessageKey, n as StepI18n, o as StepRoute, V as ValidationI18n } from './definition-B4OIy_wH.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, e as SubmitHandler, f as SubmitResult } from './runtime-BzYG6cit.js';
|
|
4
|
+
import { M as MessageSource } from './default-messages-yS4QtrYi.js';
|
|
5
|
+
export { D as DefinitionIssue, a as DefinitionIssueCode, F as FormDefinitionError, b as MessageFn, c as MessageParams, V as ValidationRule, g as getDefaultMessage } from './default-messages-yS4QtrYi.js';
|
|
6
|
+
import { V as ValidatorFn } from './validate-field-ND_UxoJU.js';
|
|
7
|
+
export { v as validateFieldValue } from './validate-field-ND_UxoJU.js';
|
|
8
|
+
export { C as CheckDefinitionOptions, c as checkDefinition, p as parseDefinition } from './check-definition-DuLExofm.js';
|
|
7
9
|
|
|
8
10
|
type FormAnalyticsEvent = {
|
|
9
11
|
type: 'step_viewed';
|
|
@@ -35,11 +37,8 @@ declare function validateDefinition(input: unknown): string[];
|
|
|
35
37
|
|
|
36
38
|
declare const FORMAT_VERSION = "1.0";
|
|
37
39
|
|
|
38
|
-
|
|
39
|
-
declare function
|
|
40
|
-
|
|
41
|
-
declare function validateStep(step: FormStep, values: Record<string, unknown>, validators?: Record<string, ValidatorFn>): Record<string, string>;
|
|
42
|
-
declare function validateFields(fields: FormField[], values: Record<string, unknown>, validators?: Record<string, ValidatorFn>): Record<string, string>;
|
|
40
|
+
declare function validateStep(step: FormStep, values: Record<string, unknown>, validators?: Record<string, ValidatorFn>, messages?: MessageSource): Record<string, string>;
|
|
41
|
+
declare function validateFields(fields: FormField[], values: Record<string, unknown>, validators?: Record<string, ValidatorFn>, messages?: MessageSource): Record<string, string>;
|
|
43
42
|
|
|
44
43
|
declare function evaluateCondition(condition: ShowCondition, values: Record<string, unknown>): boolean;
|
|
45
44
|
|
|
@@ -54,4 +53,4 @@ declare class FormLifecycleError extends Error {
|
|
|
54
53
|
constructor(phase: 'afterStepChange' | 'afterSubmit', cause: unknown);
|
|
55
54
|
}
|
|
56
55
|
|
|
57
|
-
export { FORMAT_VERSION, FormAction, type FormAnalyticsEvent, FormField, FormLifecycleError, FormStep,
|
|
56
|
+
export { FORMAT_VERSION, FormAction, type FormAnalyticsEvent, FormField, FormLifecycleError, FormStep, MessageSource, ShowCondition, ValidatorFn, evaluateCondition, isActionDisabled, isVisible, validateDefinition, validateFields, validateStep };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{
|
|
1
|
+
export{c as FormEngine,a as validateDefinition}from'./chunk-Y33LPJXU.js';export{a as FormLifecycleError,c as isActionDisabled,b as isVisible,d as validateFieldValue,f as validateFields,e as validateStep}from'./chunk-4IHQINIH.js';export{h as FORMAT_VERSION,a as FormDefinitionError,j as checkDefinition,k as parseDefinition}from'./chunk-FQ3GLJTI.js';export{l as evaluateCondition,e as getDefaultMessage}from'./chunk-5KV7BDCS.js';//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|