@wizzard-packages/core 0.1.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/LICENSE +21 -0
- package/dist/index.cjs +854 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +499 -0
- package/dist/index.d.ts +499 -0
- package/dist/index.js +848 -0
- package/dist/index.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/data.ts","../src/store/WizardStore.ts"],"names":["currentSnapshot"],"mappings":";;;AAGA,IAAM,SAAA,uBAAgB,GAAA,EAAsB;AAKrC,SAAS,OAAO,IAAA,EAAwB;AAC7C,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,EAAA,IAAI,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,SAAA,CAAU,IAAI,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACtB,IAAA,IAAA,GAAO,IAAA,CACJ,QAAQ,YAAA,EAAc,KAAK,EAC3B,KAAA,CAAM,GAAG,CAAA,CACT,MAAA,CAAO,OAAO,CAAA;AAAA,EACnB,CAAA,MAAO;AACL,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,EACvC;AAEA,EAAA,SAAA,CAAU,GAAA,CAAI,MAAM,IAAI,CAAA;AACxB,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,SAAA,CAAU,GAAA,EAAU,IAAA,EAAc,YAAA,EAAiC;AACjF,EAAA,IAAI,CAAC,IAAA,IAAQ,GAAA,KAAQ,UAAa,GAAA,KAAQ,IAAA,SAAa,YAAA,IAAgB,GAAA;AAEvE,EAAA,IAAI,CAAC,KAAK,QAAA,CAAS,GAAG,KAAK,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9C,IAAA,MAAM,GAAA,GAAM,IAAI,IAAI,CAAA;AACpB,IAAA,OAAO,GAAA,KAAQ,SAAY,GAAA,GAAM,YAAA;AAAA,EACnC;AAEA,EAAA,MAAM,IAAA,GAAO,OAAO,IAAI,CAAA;AACxB,EAAA,IAAI,MAAA,GAAS,GAAA;AAEb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,IAAI,MAAA,KAAW,MAAA,IAAa,MAAA,KAAW,IAAA,EAAM,OAAO,YAAA;AACpD,IAAA,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,EACzB;AAEA,EAAA,OAAO,MAAA,KAAW,SAAY,MAAA,GAAS,YAAA;AACzC;AAKO,SAAS,SAAA,CAA4B,GAAA,EAAQ,IAAA,EAAc,KAAA,EAAmB;AACnF,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAElB,EAAA,IAAI,CAAC,KAAK,QAAA,CAAS,GAAG,KAAK,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,MAAA,MAAM,IAAA,GAAO,CAAC,GAAG,GAAG,CAAA;AACpB,MAAA,IAAA,CAAK,IAAI,CAAA,GAAI,KAAA;AACb,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,EAAE,GAAG,GAAA,EAAK,CAAC,IAAI,GAAG,KAAA,EAAM;AAAA,EACjC;AAEA,EAAA,MAAM,IAAA,GAAO,OAAO,IAAI,CAAA;AACxB,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAE9B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAC,GAAG,GAAG,CAAA,GAAI,EAAE,GAAG,GAAA,EAAI;AACtD,EAAA,IAAI,OAAA,GAAe,IAAA;AAEnB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AAE1B,IAAA,MAAM,QAAA,GAAW,QAAQ,GAAG,CAAA;AAC5B,IAAA,IAAI,SAAA;AAEJ,IAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC5C,MAAA,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,CAAC,GAAG,QAAQ,CAAA,GAAI,EAAE,GAAG,QAAA,EAAS;AAAA,IACtE,CAAA,MAAO;AACL,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AACtC,MAAA,SAAA,GAAY,SAAA,GAAY,EAAC,GAAI,EAAC;AAAA,IAChC;AAEA,IAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,SAAA;AACf,IAAA,OAAA,GAAU,SAAA;AAAA,EACZ;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACpC,EAAA,OAAA,CAAQ,OAAO,CAAA,GAAI,KAAA;AAEnB,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,YAAA,CAAa,GAAQ,CAAA,EAAiB;AACpD,EAAA,IAAI,MAAA,CAAO,EAAA,CAAG,CAAA,EAAG,CAAC,GAAG,OAAO,IAAA;AAC5B,EAAA,IAAI,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,QAAQ,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,EAAM;AAC9E,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAE3B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA;AAE1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,GAAG,GAAG,CAAA,IAAK,CAAC,MAAA,CAAO,GAAG,CAAA,CAAE,GAAG,GAAG,CAAA,CAAE,GAAG,CAAC,CAAA,EAAG;AAC/E,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;;;ACrGO,IAAM,cAAN,MAAwF;AAAA,EAqB7F,WAAA,CAAY,WAAA,EAAgB,WAAA,GAA6C,EAAC,EAAG;AAnB7E,IAAA,IAAA,CAAQ,WAAA,uBAAkB,GAAA,EAAY;AAEtC,IAAA,IAAA,CAAQ,SAAA,uBAAgB,GAAA,EAAgB;AACxC,IAAA,IAAA,CAAQ,eAAA,uBAAsB,GAAA,EAA+C;AAC7E,IAAA,IAAA,CAAA,SAAA,uBAAgB,GAAA,EAAiC;AAGjD,IAAA,IAAA,CAAQ,yBAAA,uBAAgC,GAAA,EAA2C;AACnF,IAAA,IAAA,CAAQ,QAAA,uBAAe,GAAA,EAAiB;AAkQxC;AAAA;AAAA;AAAA,IAAA,IAAA,CAAA,WAAA,GAAc,MAAM;AAClB,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACd,CAAA;AA2KA,IAAA,IAAA,CAAA,SAAA,GAAY,CAAC,QAAA,KAAyB;AACpC,MAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3B,MAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC7C,CAAA;AAmJA;AAAA,IAAA,IAAA,CAAQ,cAAA,uBAAqB,GAAA,EAAoD;AAzjB/E,IAAA,IAAA,CAAK,WAAA,GACH,OAAO,eAAA,KAAoB,UAAA,GACvB,eAAA,CAAgB,WAAW,CAAA,GAC3B,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC,CAAA;AAE5C,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,IAAA,EAAM,WAAA;AAAA,MACN,QAAQ,EAAC;AAAA,MACT,OAAA,EAAS,KAAA;AAAA,MACT,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,YAAA,sBAAkB,GAAA,EAAI;AAAA,MACtB,cAAA,sBAAoB,GAAA,EAAI;AAAA,MACxB,UAAA,sBAAgB,GAAA,EAAI;AAAA,MACpB,WAAA,EAAa,IAAA;AAAA,MACb,aAAA,EAAe,EAAA;AAAA,MACf,gBAAA,EAAkB,CAAA;AAAA,MAClB,WAAA,EAAa,IAAA;AAAA,MACb,UAAA,EAAY,KAAA;AAAA,MACZ,SAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,KAAA;AAAA,MACX,MAAA,EAAQ,KAAA;AAAA,MACR,aAAa,EAAC;AAAA,MACd,SAAS,EAAC;AAAA,MACV,SAAA,sBAAe,GAAA,EAAI;AAAA,MACnB,QAAA,EAAU,CAAA;AAAA,MACV,gBAAA,EAAkB,CAAA;AAAA,MAClB,aAAa,EAAC;AAAA,MACd,QAAQ,EAAC;AAAA,MACT,cAAA,EAAgB;AAAA,KAClB;AAGA,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,WAAW,CAAA;AAAA,EAC1D;AAAA;AAAA,EA3CA,mBAAmB,QAAA,EAAqD;AACtE,IAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,QAAQ,CAAA;AACjC,IAAA,OAAO,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,QAAQ,CAAA;AAAA,EACnD;AAAA,EAEQ,cAAc,MAAA,EAAiC;AACrD,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,EAC/C;AAAA,EAsCQ,iBAAiB,WAAA,EAA4C;AACnE,IAAA,MAAM,aAAA,GAA0C;AAAA,MAC9C,QAAA,EAAU,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA;AAAA,MAC3B,WAAA,EAAa,MAAM,IAAA,CAAK,WAAA,EAAY;AAAA,MACpC,QAAA,EAAU,CAAC,MAAA,KAAoC,IAAA,CAAK,SAAS,MAAM;AAAA,KACrE;AAEA,IAAA,MAAM,QAAQ,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,KAAe,UAAA,CAAW,aAAa,CAAC,CAAA;AAIvE,IAAA,OAAO,KAAA,CAAM,WAAA;AAAA,MACX,CAAC,IAAA,EAAM,UAAA,KAAe,UAAA,CAAW,IAAI,CAAA;AAAA,MACrC,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,IAAI;AAAA,KACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,MAAA,EAAiC;AACxC,IAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,MAAA,EAAuC;AAC9D,IAAA,IAAA,CAAK,cAAc,MAAM,CAAA;AACzB,IAAA,QAAQ,OAAO,IAAA;AAAM,MACnB,KAAK,MAAA;AACH,QAAA,IAAA,CAAK,cACH,OAAO,eAAA,KAAoB,UAAA,GACvB,eAAA,CAAgB,OAAO,OAAA,CAAQ,IAAI,CAAA,GACnC,IAAA,CAAK,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AACpD,QAAA,MAAM,kBAAA,GAAqB,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,OAAO,CAAC,CAAA,KAAW,CAAC,CAAA,CAAE,SAAS,CAAA;AAGtF,QAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,QAAA,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAc;AACjD,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AAAA,QACjC,CAAC,CAAA;AAED,QAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,UACX,GAAG,IAAA,CAAK,KAAA;AAAA,UACR,IAAA,EAAM,OAAO,OAAA,CAAQ,IAAA;AAAA,UACrB,MAAA,EAAQ,OAAO,OAAA,CAAQ,MAAA;AAAA,UACvB,WAAA,EAAa,kBAAA;AAAA,UACb,kBAAkB,kBAAA,CAAmB;AAAA,SACvC;AAGA,QAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,WAAA,EAAa,OAAA,EAAS;AAC9C,UAAA,IAAA,CAAK,kBAAA,GAAqB,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,OAAA;AAAA,QAC9D;AAEA,QAAA,IAAA,CAAK,MAAA,EAAO;AACZ,QAAA;AAAA,MACF,KAAK,qBAAA;AAEH,QAAA,IAAI,IAAA,CAAK,MAAM,aAAA,EAAe;AAC5B,UAAA,IAAA,CAAK,2BAAA,CAA4B,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AAAA,QAC3D;AAEA,QAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,UACX,GAAG,IAAA,CAAK,KAAA;AAAA,UACR,aAAA,EAAe,OAAO,OAAA,CAAQ;AAAA,SAChC;AACA,QAAA,IAAA,CAAK,MAAA,EAAO;AACZ,QAAA;AAAA,MACF,KAAK,aAAA;AACH,QAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,UACX,GAAG,IAAA,CAAK,KAAA;AAAA,UACR,OAAA,EAAS,OAAO,OAAA,CAAQ;AAAA,SAC1B;AACA,QAAA,IAAA,CAAK,MAAA,EAAO;AACZ,QAAA;AAAA,MACF,KAAK,kBAAA;AACH,QAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,UACX,GAAG,IAAA,CAAK,KAAA;AAAA,UACR,WAAA,EAAa,OAAO,OAAA,CAAQ,KAAA;AAAA,UAC5B,gBAAA,EAAkB,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM;AAAA,SACzC;AACA,QAAA,IAAA,CAAK,MAAA,EAAO;AACZ,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,OAAA,CAAQ,IAAA,EAAM,OAAO,OAAA,CAAQ,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AACvF,QAAA;AAAA,MACF,KAAK,aAAA;AACH,QAAA,IAAA,CAAK,eAAe,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,MAAA,CAAO,QAAQ,OAAO,CAAA;AAC/D,QAAA;AAAA,MAEF,KAAK,gBAAA;AACH,QAAA,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAM,CAAA;AAC9C,QAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,UACX,GAAG,IAAA,CAAK,KAAA;AAAA,UACR,SAAA,EAAW,IAAI,GAAA,CAAI,IAAA,CAAK,MAAM,SAAS;AAAA,SACzC;AACA,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAA,CAAO,MAAA,CAAO,QAAQ,MAAM,CAAA;AACjD,QAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,UACX,GAAG,IAAA,CAAK,KAAA;AAAA,UACR,SAAA,EAAW,IAAI,GAAA,CAAI,IAAA,CAAK,MAAM,SAAS;AAAA,SACzC;AACA,QAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,MAAA,EAAQ;AAChC,UAAA,IAAA,CAAK,cAAc,MAAA,CAAO,OAAA,CAAQ,QAAQ,MAAA,CAAO,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,QACxE;AACA,QAAA;AAAA,MACF,KAAK,iBAAA;AACH,QAAA,IAAA,CAAK,cAAc,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQ,MAAA,CAAO,QAAQ,MAAM,CAAA;AAC/D,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AACvC,QAAA;AAAA,MACF,KAAK,iBAAA;AACH,QAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,GAAG,IAAA,CAAK,OAAO,UAAA,EAAY,MAAA,CAAO,QAAQ,KAAA,EAAM;AAC/D,QAAA;AAAA,MACF,KAAK,mBAAA;AACH,QAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,GAAG,IAAA,CAAK,OAAO,YAAA,EAAc,MAAA,CAAO,QAAQ,KAAA,EAAM;AACjE,QAAA,IAAA,CAAK,QAAA,EAAS;AACd,QAAA;AAAA,MACF,KAAK,qBAAA;AACH,QAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,GAAG,IAAA,CAAK,OAAO,cAAA,EAAgB,MAAA,CAAO,QAAQ,KAAA,EAAM;AACnE,QAAA,IAAA,CAAK,QAAA,EAAS;AACd,QAAA;AAAA,MACF,KAAK,kBAAA;AACH,QAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,GAAG,MAAA,CAAO,QAAQ,QAAA,EAAS;AAC1C,QAAA,IAAA,CAAK,QAAA,EAAS;AACd,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,UACX,GAAG,IAAA,CAAK,KAAA;AAAA,UACR,cAAA,EAAgB,OAAO,OAAA,CAAQ;AAAA,SACjC;AACA,QAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,KAAW,IAAA,EAAM;AAClC,UAAA,IAAI,MAAA,CAAO,QAAQ,gBAAA,EAAkB;AACnC,YAAA,IAAA,CAAK,QAAA,CAAS;AAAA,cACZ,IAAA,EAAM,mBAAA;AAAA,cACN,OAAA,EAAS;AAAA,gBACP,KAAA,EAAO,OAAO,OAAA,CAAQ;AAAA;AACxB,aACD,CAAA;AAAA,UACH;AACA,UAAA,IAAI,MAAA,CAAO,QAAQ,WAAA,EAAa;AAC9B,YAAA,IAAA,CAAK,QAAA,CAAS;AAAA,cACZ,IAAA,EAAM,aAAA;AAAA,cACN,OAAA,EAAS;AAAA,gBACP,OAAA,EAAS,OAAO,OAAA,CAAQ;AAAA;AAC1B,aACD,CAAA;AAAA,UACH;AACA,UAAA,IAAI,MAAA,CAAO,QAAQ,EAAA,EAAI;AACrB,YAAA,IAAA,CAAK,QAAA,CAAS;AAAA,cACZ,IAAA,EAAM,qBAAA;AAAA,cACN,OAAA,EAAS;AAAA,gBACP,MAAA,EAAQ,OAAO,OAAA,CAAQ;AAAA;AACzB,aACD,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA;AAAA,MACF,KAAK,aAAA;AACH,QAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,UACX,GAAG,IAAA,CAAK,KAAA;AAAA,UACR,GAAG,OAAO,OAAA,CAAQ;AAAA,SACpB;AAEA,QAAA,IACE,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,YAAA,IACpB,OAAO,OAAA,CAAQ,IAAA,CAAK,cAAA,IACpB,MAAA,CAAO,QAAQ,IAAA,CAAK,OAAA,IACpB,MAAA,CAAO,OAAA,CAAQ,KAAK,aAAA,EACpB;AACA,UAAA,IAAA,CAAK,QAAA,EAAS;AAAA,QAChB;AACA,QAAA;AAAA;AAEJ,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA;AAAA,EAGQ,gBAAA,CAAiB,IAAA,EAAc,KAAA,EAAY,QAAA,EAA4C;AAC7F,IAAA,MAAM,UAAU,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,IAAA,EAAa,MAAM,KAAK,CAAA;AAC7D,IAAA,IAAI,OAAA,KAAY,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM;AACjC,IAAA,IAAA,CAAK,MAAA,CAAO,SAAc,IAAI,CAAA;AAAA,EAChC;AAAA,EAEQ,cAAA,CAAe,MAAkB,OAAA,EAAiC;AACxE,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ,CAAA,MAAO;AAEL,MAAA,OAAA,GAAU,KAAK,KAAA,CAAM,IAAA,CAAK,UAAU,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAEpD,MAAA,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACjC,QAAC,OAAA,CAAgB,GAAG,CAAA,GAAK,IAAA,CAAa,GAAG,CAAA;AAAA,MAC3C,CAAC,CAAA;AAAA,IACH;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAA,CAAO,SAAY,WAAA,EAAiC;AAClD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GAAI,WAAA,GAAc,CAAC,WAAW,CAAA;AACrE,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,QAAA,MAAM,YAAA,GAAe,SAAA,CAAU,IAAA,CAAK,WAAA,EAAa,IAAI,CAAA;AACrD,QAAA,MAAM,QAAA,GAAW,SAAA,CAAU,OAAA,EAAS,IAAI,CAAA;AAExC,QAAA,IAAI,KAAK,SAAA,CAAU,YAAY,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG;AAC7D,UAAA,IAAA,CAAK,WAAA,CAAY,IAAI,IAAI,CAAA;AAAA,QAC3B,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,WAAA,CAAY,OAAO,IAAI,CAAA;AAAA,QAC9B;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,GAAG,IAAA,CAAK,KAAA;AAAA,MACR,IAAA,EAAM,OAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,WAAA,CAAY,IAAA,GAAO,CAAA;AAAA,MACjC,WAAA,EAAa,IAAI,GAAA,CAAI,IAAA,CAAK,WAAW;AAAA,KACvC;AAGA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GAAI,WAAA,GAAc,CAAC,WAAW,CAAA;AACrE,MAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,IAC1B,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,IAAA,CAAK,OAAiB,CAAC,CAAA;AAAA,IACnD;AAEA,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAEA,WAAW,OAAA,EAA2C;AACpD,IAAA,IAAA,CAAK,QAAA,CAAS;AAAA,MACZ,IAAA,EAAM,aAAA;AAAA,MACN,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA;AAAQ,KAC1B,CAAA;AAAA,EACH;AAAA,EAEQ,gBAAA,GAAmB;AACzB,IAAA,MAAM,EAAE,WAAA,EAAa,aAAA,EAAe,cAAc,cAAA,EAAgB,UAAA,KAAe,IAAA,CAAK,KAAA;AACtF,IAAA,MAAM,mBAAmB,IAAA,CAAK,GAAA;AAAA,MAC5B,CAAA;AAAA,MACA,YAAY,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,aAAa;AAAA,KACrD;AACA,IAAA,MAAM,WAAA,GAAc,WAAA,CAAY,gBAAgB,CAAA,IAAK,IAAA;AAErD,IAAA,MAAM,WAAA,GAAc,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,KAAS;AAC5C,MAAA,IAAI,MAAA,GAAqE,UAAA;AACzE,MAAA,IAAI,IAAA,CAAK,EAAA,KAAO,aAAA,EAAe,MAAA,GAAS,SAAA;AAAA,WAAA,IAC/B,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,EAAE,GAAG,MAAA,GAAS,OAAA;AAAA,WAAA,IAClC,cAAA,CAAe,GAAA,CAAI,IAAA,CAAK,EAAE,GAAG,MAAA,GAAS,WAAA;AAAA,WAAA,IACtC,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,EAAE,GAAG,MAAA,GAAS,SAAA;AAE7C,MAAA,OAAO;AAAA,QACL,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,GAAG,IAAA,CAAK,KAAA;AAAA,MACR,WAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAa,gBAAA,KAAqB,CAAA;AAAA,MAClC,YAAY,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,gBAAA,KAAqB,YAAY,MAAA,GAAS,CAAA;AAAA,MAChF,QAAA,EACE,WAAA,CAAY,MAAA,GAAS,CAAA,GACjB,IAAA,CAAK,KAAA,CAAA,CAAQ,gBAAA,GAAmB,CAAA,IAAK,WAAA,CAAY,MAAA,GAAU,GAAG,CAAA,GAC9D,CAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,IAAA,EAAS;AACtB,IAAA,IAAA,CAAK,WAAA,GACH,OAAO,eAAA,KAAoB,UAAA,GACvB,eAAA,CAAgB,IAAI,CAAA,GACpB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AACrC,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,GAAG,IAAA,CAAK,KAAA;AAAA,MACR,IAAA;AAAA,MACA,OAAA,EAAS,KAAA;AAAA,MACT,WAAA,sBAAiB,GAAA;AAAI,KACvB;AACA,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAEQ,UAAA,GAAa;AACnB,IAAA,MAAM,eAAuD,EAAC;AAI9D,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,WAAW,KAAK,IAAA,CAAK,SAAA,CAAU,SAAQ,EAAG;AAC5D,MAAA,IAAI,WAAA,CAAY,OAAO,CAAA,EAAG;AACxB,QAAA,YAAA,CAAa,MAAM,CAAA,GAAI,MAAA,CAAO,WAAA,CAAY,WAAW,CAAA;AAAA,MACvD;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAQ,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,QAAQ,YAAA,EAAa;AACnD,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAEA,aAAa,SAAA,EAAmD;AAC9D,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC7D,MAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,MAAA,KAAA,MAAW,CAAC,KAAA,EAAO,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAqC,CAAA,EAAG;AAChF,QAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,MACxB;AACA,MAAA,IAAI,QAAQ,IAAA,GAAO,CAAA,OAAQ,SAAA,CAAU,GAAA,CAAI,QAAkB,OAAO,CAAA;AAAA,IACpE;AACA,IAAA,IAAA,CAAK,QAAQ,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,QAAQ,SAAA,EAAU;AAChD,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAEA,aAAA,CAAc,QAAgB,MAAA,EAAmD;AAC/E,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,KAAK,MAAM,CAAA,CAAE,WAAW,CAAA,EAAG;AAC/C,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA,EAAG;AAC9B,QAAA,IAAA,CAAK,SAAA,CAAU,OAAO,MAAM,CAAA;AAC5B,QAAA,IAAA,CAAK,UAAA,EAAW;AAChB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,MAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,IACxB;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA;AAElC,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAA,CAAY,QAAgB,IAAA,EAAuB;AACjD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AAC5C,IAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AAExB,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG;AACxB,MAAA,UAAA,CAAW,OAAO,IAAI,CAAA;AACtB,MAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,SAAA,CAAU,OAAO,MAAM,CAAA;AAAA,MAC9B;AACA,MAAA,IAAA,CAAK,UAAA,EAAW;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,MAAA,GAAS;AACf,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA,KAAM,GAAG,CAAA;AAAA,EACnC;AAAA,EAOA,kBAAkB,OAAA,EAA8B;AAC9C,IAAA,IAAA,CAAK,kBAAA,GAAqB,OAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAA,GAAU;AACR,IAAA,IAAI,CAAC,KAAK,kBAAA,EAAoB;AAE9B,IAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,IAAA,IAAI,UAAA,GAAuB,IAAA;AAC3B,IAAA,IAAI,WAAA,GAAc,KAAA;AAElB,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,MAAA;AAG1B,IAAA,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC7B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,kBAAA;AAChD,MAAA,IAAI,CAAC,OAAA,EAAS;AAEd,MAAA,IAAI;AAEF,QAAA,IAAI,aAAA;AACJ,QAAA,IAAI,kBAAA,GAAqB,CAAA;AAEzB,QAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,UAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,eAAA,CAAmB,IAAA,CAAK,EAAE,CAAA;AACjD,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,aAAA,GAAgB,MAAA,CAAO,IAAA;AACvB,YAAA,kBAAA,GAAqB,MAAA,CAAO,SAAA;AAAA,UAC9B;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,aAAA,GAAgB,OAAA,CAAQ,OAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AAAA,QAG5C;AAEA,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,IAAI,sBAAsB,eAAA,EAAiB;AACzC,YAAA,eAAA,GAAkB,kBAAA;AAClB,YAAA,UAAA,GAAa,aAAA;AACb,YAAA,WAAA,GAAc,IAAA;AAAA,UAChB;AAAA,QACF;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,kDAAA,EAA2C,IAAA,CAAK,EAAE,KAAK,CAAC,CAAA;AAAA,MACvE;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,eAAe,UAAA,EAAY;AAE7B,MAAA,IAAA,CAAK,cAAA,CAAe,UAAA,EAAY,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,IACnD;AAAA,EACF;AAAA,EAEQ,QAAA,GAAW;AACjB,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,MAAA;AAC1B,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,WAAA,EAAa,IAAA,IAAQ,cAAA;AACpD,IAAA,IAAI,eAAA,KAAoB,QAAA,IAAY,IAAA,CAAK,kBAAA,EAAoB;AAC3D,MAAA,IAAA,CAAK,kBAAA,CAAmB,SAAS,kBAAA,EAAoB;AAAA,QACnD,aAAA,EAAe,KAAK,KAAA,CAAM,aAAA;AAAA,QAC1B,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAM,YAAY,CAAA;AAAA,QAC3C,SAAA,EAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAM,cAAc,CAAA;AAAA,QAC/C,OAAA,EAAS,KAAK,KAAA,CAAM;AAAA,OACrB,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,iBAAiB,MAAA,EAAgB;AAC/B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AAC7F,IAAA,MAAM,OAAA,GAAU,IAAA,EAAM,kBAAA,IAAsB,IAAA,CAAK,kBAAA;AACjD,IAAA,IAAI,OAAA,IAAW,QAAQ,SAAA,EAAW;AAChC,MAAA,OAAA,CAAQ,UAAU,MAAM,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,MAAA,EAAiB;AAEpB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,aAAa,MAAM,CAAA;AACxB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,MAAM,aAAA,EAAe;AAC5B,MAAA,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AAAA,IAC5C;AAAA,EACF;AAAA,EAEQ,aAAa,MAAA,EAAgB;AACnC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AAC7F,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,kBAAA;AAChD,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,OAAA,CAAQ,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAAA,EAC1C;AAAA,EAEQ,4BAA4B,MAAA,EAAgB;AAClD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AAC7F,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,OAAO,IAAA,CAAK,eAAA,IAAmB,KAAK,KAAA,CAAM,MAAA,CAAO,aAAa,IAAA,IAAQ,cAAA;AAC5E,IAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,MAAA,IAAA,CAAK,aAAa,MAAM,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA,EAGQ,cAAc,aAAA,EAAyB;AAC7C,IAAA,MAAM,EAAE,MAAA,EAAQ,aAAA,EAAc,GAAI,IAAA,CAAK,KAAA;AACvC,IAAA,IAAI,CAAC,aAAA,EAAe;AAEpB,IAAA,MAAM,IAAA,GACJ,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,aAAa,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,aAAa,CAAA;AACrF,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,IAAmB,MAAA,CAAO,aAAa,IAAA,IAAQ,cAAA;AACjE,IAAA,IAAI,SAAS,UAAA,EAAY;AAEzB,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,WAAA,EAAa,YAAA,IAAgB,GAAA;AAEzD,IAAA,MAAM,QAAA,GAAW,aAAA;AACjB,IAAA,IAAI,IAAA,CAAK,yBAAA,CAA0B,GAAA,CAAI,QAAQ,CAAA,EAAG;AAChD,MAAA,YAAA,CAAa,IAAA,CAAK,yBAAA,CAA0B,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAA,CAAK,yBAAA,CAA0B,GAAA;AAAA,MAC7B,QAAA;AAAA,MACA,WAAW,MAAM;AACf,QAAA,IAAA,CAAK,aAAa,aAAa,CAAA;AAAA,MACjC,GAAG,YAAY;AAAA,KACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,mBAAmB,IAAA,EAAgE;AACvF,IAAA,MAAM,WAAA,GAAc,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,IAAA;AACvC,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,MAAA;AAE1B,IAAA,IAAA,CAAK,UAAA,CAAW,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,EAAC;AAC/B,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,QAC5B,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,KAAS;AACxB,UAAA,IAAI,CAAC,IAAA,CAAK,SAAA,SAAkB,EAAE,IAAA,EAAM,IAAI,IAAA,EAAK;AAG7C,UAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,YAAA,MAAM,iBAAA,GAAoB,KAAK,kBAAA,CAAmB,GAAA;AAAA,cAAI,CAAC,IAAA,KACrD,SAAA,CAAU,WAAA,EAAa,IAAI;AAAA,aAC7B;AACA,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAK,EAAE,CAAA;AAE9C,YAAA,IACE,UACA,MAAA,CAAO,UAAA,CAAW,MAAA,KAAW,iBAAA,CAAkB,UAC/C,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,CAAC,KAAK,GAAA,KAAQ,GAAA,KAAQ,iBAAA,CAAkB,GAAG,CAAC,CAAA,EACpE;AACA,cAAA,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,MAAA,CAAO,MAAA,EAAO;AAAA,YACnC;AAGA,YAAA,IAAI;AACF,cAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,WAAA,IAAgB,EAAC,EAAS,IAAA,CAAK,aAAa,CAAA;AACvE,cAAA,MAAM,EAAA,GAAK,GAAA,YAAe,OAAA,GAAU,MAAM,GAAA,GAAM,GAAA;AAChD,cAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI;AAAA,gBAC/B,MAAA,EAAQ,EAAA;AAAA,gBACR,UAAA,EAAY;AAAA,eACb,CAAA;AACD,cAAA,OAAO,EAAE,MAAM,EAAA,EAAG;AAAA,YACpB,SAAS,CAAA,EAAG;AACV,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,8BAAA,EAAiC,IAAA,CAAK,EAAE,KAAK,CAAC,CAAA;AAC5D,cAAA,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA,EAAM;AAAA,YAC3B;AAAA,UACF;AAGA,UAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,IAAA,CAAK,MAAM,SAAS,CAAA;AAClD,UAAA,aAAA,CAAc,GAAA,CAAI,KAAK,EAAY,CAAA;AACnC,UAAA,IAAA,CAAK,UAAA,CAAW;AAAA,YACd,SAAA,EAAW,aAAA;AAAA,YACX,MAAA,EAAQ;AAAA,WACT,CAAA;AAED,UAAA,IAAI;AACF,YAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,WAAA,IAAgB,EAAC,EAAS,IAAA,CAAK,aAAa,CAAA;AACvE,YAAA,MAAM,EAAA,GAAK,GAAA,YAAe,OAAA,GAAU,MAAM,GAAA,GAAM,GAAA;AAChD,YAAA,OAAO,EAAE,MAAM,EAAA,EAAG;AAAA,UACpB,SAAS,CAAA,EAAG;AACV,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,8BAAA,EAAiC,IAAA,CAAK,EAAE,KAAK,CAAC,CAAA;AAC5D,YAAA,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA,EAAM;AAAA,UAC3B,CAAA,SAAE;AACA,YAAA,MAAM,eAAA,GAAkB,KAAK,WAAA,EAAY;AACzC,YAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,eAAA,CAAgB,SAAS,CAAA;AACrD,YAAA,WAAA,CAAY,MAAA,CAAO,KAAK,EAAY,CAAA;AACpC,YAAA,IAAA,CAAK,UAAA,CAAW;AAAA,cACd,SAAA,EAAW,WAAA;AAAA,cACX,MAAA,EAAQ,YAAY,IAAA,GAAO;AAAA,aAC5B,CAAA;AAAA,UACH;AAAA,QACF,CAAC;AAAA,OACH;AACA,MAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA;AAAA,IACtD,CAAA,SAAE;AACA,MAAA,MAAM,eAAA,GAAkB,KAAK,WAAA,EAAY;AACzC,MAAA,IAAI,eAAA,CAAgB,SAAA,CAAU,IAAA,KAAS,CAAA,EAAG;AACxC,QAAA,IAAA,CAAK,UAAA,CAAW,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,MAAA,EAAkC;AACnD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,SAAS,EAAC;AAC1C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAW,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA;AAChF,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,mBAAmB,OAAO,IAAA;AAE7C,IAAA,IAAA,CAAK,QAAA,CAAS,EAAE,IAAA,EAAM,gBAAA,EAAkB,SAAS,EAAE,MAAA,IAAU,CAAA;AAE7D,IAAA,IAAI,OAAA,GAAU,IAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,kBAAkB,QAAA,CAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AACpE,MAAA,OAAA,GAAU,MAAA,CAAO,OAAA;AAEjB,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,IAAA,CAAK,aAAA,CAAc,QAAQ,IAAI,CAAA;AAC/B,QAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,IAAA,CAAK,MAAM,UAAU,CAAA;AACpD,QAAA,cAAA,CAAe,OAAO,MAAM,CAAA;AAC5B,QAAA,IAAA,CAAK,QAAA,CAAS;AAAA,UACZ,IAAA,EAAM,iBAAA;AAAA,UACN,OAAA,EAAS,EAAE,KAAA,EAAO,cAAA;AAAe,SAClC,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,IAAI,CAAA;AAEhD,QAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,SAAA,EAAW,OAAA,EAAS;AACxC,UAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,kBAAA,EAAoB;AAAA,YACtD,MAAA;AAAA,YACA,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,SAAA,EAAW,KAAK,GAAA;AAAI,WACd,CAAA;AAAA,QACV;AAEA,QAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,IAAA,CAAK,MAAM,UAAU,CAAA;AACpD,QAAA,cAAA,CAAe,IAAI,MAAM,CAAA;AACzB,QAAA,IAAA,CAAK,QAAA,CAAS;AAAA,UACZ,IAAA,EAAM,iBAAA;AAAA,UACN,OAAA,EAAS,EAAE,KAAA,EAAO,cAAA;AAAe,SAClC,CAAA;AAGD,QAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,IAAA,CAAK,MAAM,cAAc,CAAA;AACvD,QAAA,IAAI,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA,EAAG;AAC7B,UAAA,aAAA,CAAc,OAAO,MAAM,CAAA;AAC3B,UAAA,IAAA,CAAK,QAAA,CAAS;AAAA,YACZ,IAAA,EAAM,qBAAA;AAAA,YACN,OAAA,EAAS,EAAE,KAAA,EAAO,aAAA;AAAc,WACjC,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,QAAA,CAAS;AAAA,QACZ,IAAA,EAAM,cAAA;AAAA,QACN,SAAS,EAAE,MAAA,EAAQ,MAAA,EAAQ,EAAE,SAAQ;AAAE,OACxC,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,GAGH;AACD,IAAA,IAAA,CAAK,UAAA,CAAW,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,EAAY,CAAE,IAAA;AAChC,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA;AACtD,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,QAC5B,WAAA,CAAY,IAAI,CAAC,IAAA,KAAS,KAAK,YAAA,CAAa,IAAA,CAAK,EAAY,CAAC;AAAA,OAChE;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AAAA,QAC9B,MAAA,EAAQ,IAAA,CAAK,WAAA,EAAY,CAAE;AAAA,OAC7B;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAM,eAAA,GAAkB,KAAK,WAAA,EAAY;AACzC,MAAA,IAAI,eAAA,CAAgB,SAAA,CAAU,IAAA,KAAS,CAAA,EAAG;AACxC,QAAA,IAAA,CAAK,UAAA,CAAW,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,CACJ,MAAA,EACA,UAGI,EAAE,QAAA,EAAU,MAAK,EACH;AAClB,IAAA,MAAM,EAAE,aAAA,EAAe,MAAA,EAAQ,IAAA,EAAM,WAAA,KAAgB,IAAA,CAAK,KAAA;AAE1D,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,IAAS,EAAC;AAClC,IAAA,MAAM,aAAa,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,KAAW,CAAA,CAAE,OAAO,aAAa,CAAA;AACxE,IAAA,MAAM,YAAY,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,KAAW,CAAA,CAAE,OAAO,MAAM,CAAA;AAEhE,IAAA,IAAA,CAAK,QAAA,CAAS;AAAA,MACZ,IAAA,EAAM,YAAA;AAAA,MACN,SAAS,EAAE,MAAA,EAAQ,QAAQ,EAAA,EAAI,MAAA,EAAQ,MAAM,aAAA;AAAwB,KACtE,CAAA;AAGD,IAAA,IAAI,IAAA,CAAK,WAAA,EAAY,CAAE,cAAA,KAAmB,MAAA,EAAQ;AAChD,MAAA,OAAA,CAAQ,KAAK,4DAA4D,CAAA;AACzE,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,SAAA,KAAc,YAAY,OAAO,IAAA;AAGrC,IAAA,IAAI,SAAA,GAAY,UAAA,IAAc,aAAA,IAAiB,OAAA,CAAQ,QAAA,EAAU;AAC/D,MAAA,MAAM,IAAA,GACJ,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,aAAa,CAAA,IAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAW,CAAA,CAAE,EAAA,KAAO,aAAa,CAAA;AACtF,MAAA,MAAM,YAAY,IAAA,EAAM,YAAA,IAAgB,OAAO,YAAA,IAAgB,CAAC,CAAC,IAAA,EAAM,iBAAA;AAEvE,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA;AAChD,QAAA,IAAI,CAAC,EAAA,EAAI;AACP,UAAA,IAAA,CAAK,QAAA,CAAS;AAAA,YACZ,IAAA,EAAM,YAAA;AAAA,YACN,SAAS,EAAE,MAAA,EAAQ,OAAO,EAAA,EAAI,MAAA,EAAQ,MAAM,aAAA;AAAwB,WACrE,CAAA;AACD,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA;AAChC,IAAA,IAAI;AAEF,MAAA,MAAM,gBACJ,OAAA,CAAQ,mBAAA,IAAwB,MAAM,IAAA,CAAK,mBAAmB,WAAW,CAAA;AAC3E,MAAA,MAAM,SAAS,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AACxD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,IAAA,CAAK,QAAA,CAAS;AAAA,UACZ,IAAA,EAAM,YAAA;AAAA,UACN,SAAS,EAAE,MAAA,EAAQ,OAAO,EAAA,EAAI,MAAA,EAAQ,MAAM,aAAA;AAAwB,SACrE,CAAA;AACD,QAAA,OAAO,KAAA;AAAA,MACT;AAIA,MAAA,IAAI,OAAO,aAAA,EAAe;AACxB,QAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,QAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,aAAA,CAAc,aAAa,QAAQ,CAAA;AACpE,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,qCAAqC,MAAM,CAAA,mCAAA;AAAA,WAC7C;AACA,UAAA,IAAA,CAAK,QAAA,CAAS;AAAA,YACZ,IAAA,EAAM,YAAA;AAAA,YACN,SAAS,EAAE,MAAA,EAAQ,OAAO,EAAA,EAAI,MAAA,EAAQ,MAAM,aAAA;AAAwB,WACrE,CAAA;AACD,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,MAAM,cAAA,GAAiB,OAAO,cAAA,IAAkB,SAAA;AAChD,QAAA,MAAMA,gBAAAA,GAAkB,KAAK,WAAA,EAAY;AACzC,QAAA,MAAM,eAAe,aAAA,CAAc,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,aAAa,CAAA;AAC1E,QAAA,MAAM,cAAc,aAAA,CAAc,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AAClE,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,WAAA,GAAc,YAAY,CAAA,KAAM,CAAA;AAG5D,QAAA,IAAI,WAAW,aAAA,EAAe;AAC5B,UAAA,QAAQ,cAAA;AAAgB,YACtB,KAAK,YAAA;AAEH,cAAA,IAAI,CAAC,UAAA,EAAY;AACf,gBAAA,OAAA,CAAQ,IAAA;AAAA,kBACN,qCAAqC,MAAM,CAAA,qDAAA;AAAA,iBAC7C;AACA,gBAAA,IAAA,CAAK,QAAA,CAAS;AAAA,kBACZ,IAAA,EAAM,YAAA;AAAA,kBACN,OAAA,EAAS;AAAA,oBACP,MAAA,EAAQ,KAAA;AAAA,oBACR,EAAA,EAAI,MAAA;AAAA,oBACJ,IAAA,EAAM;AAAA;AACR,iBACD,CAAA;AACD,gBAAA,OAAO,KAAA;AAAA,cACT;AACA,cAAA;AAAA,YAEF,KAAK,SAAA;AAEH,cAAA,MAAM,oBAAA,GACJA,iBAAgB,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,IACvCA,gBAAAA,CAAgB,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AAE3C,cAAA,IAAI,CAAC,UAAA,IAAc,CAAC,oBAAA,EAAsB;AACxC,gBAAA,OAAA,CAAQ,IAAA;AAAA,kBACN,qCAAqC,MAAM,CAAA,wCAAA;AAAA,iBAC7C;AACA,gBAAA,IAAA,CAAK,QAAA,CAAS;AAAA,kBACZ,IAAA,EAAM,YAAA;AAAA,kBACN,OAAA,EAAS;AAAA,oBACP,MAAA,EAAQ,KAAA;AAAA,oBACR,EAAA,EAAI,MAAA;AAAA,oBACJ,IAAA,EAAM;AAAA;AACR,iBACD,CAAA;AACD,gBAAA,OAAO,KAAA;AAAA,cACT;AACA,cAAA;AAAA,YAEF,KAAK,MAAA;AAEH,cAAA;AAAA;AACJ,QACF;AAAA,MACF;AAGA,MAAA,MAAM,IAAA,GACJ,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,aAAa,CAAA,IAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAW,CAAA,CAAE,EAAA,KAAO,aAAa,CAAA;AACtF,MAAA,IAAI,MAAM,WAAA,EAAa;AACrB,QAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,QAAA,MAAM,SAAA,GAAY,SAAA,GAAY,UAAA,GAAa,MAAA,GAAS,MAAA;AACpD,QAAA,MAAM,KAAK,MAAM,IAAA,CAAK,WAAA,CAAY,WAAA,EAAa,WAAW,QAAQ,CAAA;AAClE,QAAA,IAAI,OAAO,KAAA,EAAO;AAChB,UAAA,IAAA,CAAK,QAAA,CAAS;AAAA,YACZ,IAAA,EAAM,YAAA;AAAA,YACN,SAAS,EAAE,MAAA,EAAQ,OAAO,EAAA,EAAI,MAAA,EAAQ,MAAM,aAAA;AAAwB,WACrE,CAAA;AACD,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAEA,MAAA,MAAM,eAAA,GAAkB,KAAK,WAAA,EAAY;AACzC,MAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,eAAA,CAAgB,YAAY,CAAA;AAExD,MAAA,IAAI,aAAA,EAAe,WAAA,CAAY,GAAA,CAAI,aAAa,CAAA;AAEhD,MAAA,WAAA,CAAY,IAAI,MAAM,CAAA;AAEtB,MAAA,MAAM,WAAA,GAAc,CAAC,GAAG,eAAA,CAAgB,SAAS,MAAM,CAAA;AAEvD,MAAA,IAAA,CAAK,QAAA,CAAS;AAAA,QACZ,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,MAAA,EAAQ,IAAA;AAAA,UACR,EAAA,EAAI,MAAA;AAAA,UACJ,IAAA,EAAM,aAAA;AAAA,UACN,WAAA;AAAA,UACA,gBAAA,EAAkB;AAAA;AACpB,OACD,CAAA;AAGD,MAAA,IAAA,CAAK,QAAA,EAAS;AAEd,MAAA,IAAI,OAAO,YAAA,EAAc;AACvB,QAAA,MAAA,CAAO,YAAA,CAAa,aAAA,IAAiB,IAAA,EAAM,MAAA,EAAQ,WAAW,CAAA;AAAA,MAChE;AAEA,MAAA,IAAI,MAAA,CAAO,WAAW,OAAA,EAAS;AAC7B,QAAA,MAAA,CAAO,SAAA,CAAU,QAAQ,aAAA,EAAe;AAAA,UACtC,MAAO,aAAA,IAAiB,IAAA;AAAA,UACxB,EAAA,EAAI,MAAA;AAAA,UACJ,SAAA,EAAW,KAAK,GAAA;AAAI,SACd,CAAA;AAAA,MACV;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,UAAA,CAAW,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,IACnC;AAAA,EACF;AACF","file":"index.cjs","sourcesContent":["/**\n * Cache for parsed path strings to avoid repetitive regex/split operations.\n */\nconst pathCache = new Map<string, string[]>();\n\n/**\n * Parses a string path into an array of keys using a cache.\n */\nexport function toPath(path: string): string[] {\n if (!path) return [];\n if (pathCache.has(path)) {\n return pathCache.get(path)!;\n }\n\n let keys: string[];\n if (path.includes('[')) {\n keys = path\n .replace(/\\[(\\d+)\\]/g, '.$1')\n .split('.')\n .filter(Boolean);\n } else {\n keys = path.split('.').filter(Boolean);\n }\n\n pathCache.set(path, keys);\n return keys;\n}\n\n/**\n * Retrieves a value from an object by path.\n */\nexport function getByPath(obj: any, path: string, defaultValue?: unknown): unknown {\n if (!path || obj === undefined || obj === null) return defaultValue ?? obj;\n\n if (!path.includes('.') && !path.includes('[')) {\n const val = obj[path];\n return val !== undefined ? val : defaultValue;\n }\n\n const keys = toPath(path);\n let result = obj;\n\n for (let i = 0; i < keys.length; i++) {\n if (result === undefined || result === null) return defaultValue;\n result = result[keys[i]];\n }\n\n return result !== undefined ? result : defaultValue;\n}\n\n/**\n * Immutably sets a value in an object by path.\n */\nexport function setByPath<T extends object>(obj: T, path: string, value: unknown): T {\n if (!path) return value as unknown as T;\n\n if (!path.includes('.') && !path.includes('[')) {\n if (Array.isArray(obj)) {\n const copy = [...obj] as any;\n copy[path] = value;\n return copy;\n }\n return { ...obj, [path]: value };\n }\n\n const keys = toPath(path);\n if (keys.length === 0) return value as unknown as T;\n\n const root = Array.isArray(obj) ? [...obj] : { ...obj };\n let current: any = root;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n const nextKey = keys[i + 1];\n\n const existing = current[key];\n let nextLevel;\n\n if (existing && typeof existing === 'object') {\n nextLevel = Array.isArray(existing) ? [...existing] : { ...existing };\n } else {\n const isNumeric = /^\\d+$/.test(nextKey);\n nextLevel = isNumeric ? [] : {};\n }\n\n current[key] = nextLevel;\n current = nextLevel;\n }\n\n const lastKey = keys[keys.length - 1];\n current[lastKey] = value;\n\n return root as T;\n}\n\n/**\n * Simple shallow equality check.\n */\nexport function shallowEqual(a: any, b: any): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\n return false;\n }\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n for (let i = 0; i < keysA.length; i++) {\n const key = keysA[i];\n if (!Object.prototype.hasOwnProperty.call(b, key) || !Object.is(a[key], b[key])) {\n return false;\n }\n }\n\n return true;\n}\n","import type {\n IPersistenceAdapter,\n IWizardState,\n IWizardStore,\n MiddlewareAPI,\n WizardAction,\n WizardMiddleware,\n} from '../types';\nimport { getByPath, setByPath } from '../utils/data';\n\n/**\n * Core event-driven store for managing wizard state, data, and navigation.\n *\n * @template T Type of the global wizard data object\n * @template StepId String union of valid step IDs\n */\nexport class WizardStore<T, StepId extends string = string> implements IWizardStore<T, StepId> {\n private initialData: T;\n private dirtyFields = new Set<string>();\n private state: IWizardState<T, StepId>;\n private listeners = new Set<() => void>();\n private actionListeners = new Set<(action: WizardAction<T, StepId>) => void>();\n errorsMap = new Map<StepId, Map<string, string>>();\n private middlewareChain: (action: WizardAction<T, StepId>) => void;\n private persistenceAdapter?: IPersistenceAdapter;\n private persistenceDebounceTimers = new Map<string, ReturnType<typeof setTimeout>>();\n private stepsMap = new Map<string, any>(); // Cache for O(1) step lookup\n\n subscribeToActions(listener: (action: WizardAction<T, StepId>) => void) {\n this.actionListeners.add(listener);\n return () => this.actionListeners.delete(listener);\n }\n\n private notifyActions(action: WizardAction<T, StepId>) {\n this.actionListeners.forEach((l) => l(action));\n }\n\n constructor(initialData: T, middlewares: WizardMiddleware<T, StepId>[] = []) {\n this.initialData =\n typeof structuredClone === 'function'\n ? structuredClone(initialData)\n : JSON.parse(JSON.stringify(initialData));\n\n this.state = {\n data: initialData,\n errors: {} as Record<StepId, Record<string, string>>,\n isDirty: false,\n dirtyFields: this.dirtyFields,\n visitedSteps: new Set(),\n completedSteps: new Set(),\n errorSteps: new Set(),\n currentStep: null,\n currentStepId: '',\n currentStepIndex: 0,\n isFirstStep: true,\n isLastStep: false,\n isLoading: true,\n isPending: false,\n isBusy: false,\n activeSteps: [],\n history: [],\n busySteps: new Set(),\n progress: 0,\n activeStepsCount: 0,\n breadcrumbs: [],\n config: {} as any,\n goToStepResult: null,\n };\n\n // Initialize middleware chain\n this.middlewareChain = this.setupMiddlewares(middlewares);\n }\n\n private setupMiddlewares(middlewares: WizardMiddleware<T, StepId>[]) {\n const middlewareAPI: MiddlewareAPI<T, StepId> = {\n getState: () => this.state.data,\n getSnapshot: () => this.getSnapshot(),\n dispatch: (action: WizardAction<T, StepId>) => this.dispatch(action),\n };\n\n const chain = middlewares.map((middleware) => middleware(middlewareAPI));\n\n // Compose middleware chain\n // Equivalent to redux compose: m1(m2(m3(internalDispatch)))\n return chain.reduceRight(\n (next, middleware) => middleware(next),\n this.internalDispatch.bind(this)\n );\n }\n\n /**\n * Processes an action through the middleware chain and updates the state.\n * This is the primary way to trigger any state change in the wizard.\n *\n * @param action The action to perform\n */\n dispatch(action: WizardAction<T, StepId>) {\n this.middlewareChain(action);\n }\n\n /**\n * Internal dispatch that actually performs the state updates\n */\n private internalDispatch(action: WizardAction<T, StepId>): void {\n this.notifyActions(action);\n switch (action.type) {\n case 'INIT':\n this.initialData =\n typeof structuredClone === 'function'\n ? structuredClone(action.payload.data)\n : JSON.parse(JSON.stringify(action.payload.data));\n const initialActiveSteps = action.payload.config.steps.filter((s: any) => !s.condition);\n\n // Build the fast lookup map\n this.stepsMap.clear();\n action.payload.config.steps.forEach((step: any) => {\n this.stepsMap.set(step.id, step);\n });\n\n this.state = {\n ...this.state,\n data: action.payload.data,\n config: action.payload.config,\n activeSteps: initialActiveSteps,\n activeStepsCount: initialActiveSteps.length,\n };\n\n // Initialize persistence adapter if provided in config\n if (action.payload.config.persistence?.adapter) {\n this.persistenceAdapter = action.payload.config.persistence.adapter;\n }\n\n this.notify();\n break;\n case 'SET_CURRENT_STEP_ID':\n // Trigger persistence for the step we are leaving\n if (this.state.currentStepId) {\n this.handleStepChangePersistence(this.state.currentStepId);\n }\n\n this.state = {\n ...this.state,\n currentStepId: action.payload.stepId,\n };\n this.notify();\n break;\n case 'SET_HISTORY':\n this.state = {\n ...this.state,\n history: action.payload.history,\n };\n this.notify();\n break;\n case 'SET_ACTIVE_STEPS':\n this.state = {\n ...this.state,\n activeSteps: action.payload.steps,\n activeStepsCount: action.payload.steps.length,\n };\n this.notify();\n break;\n case 'SET_DATA':\n this.updateDataByPath(action.payload.path, action.payload.value, action.payload.options);\n break;\n case 'UPDATE_DATA':\n this.updateBulkData(action.payload.data, action.payload.options);\n break;\n\n case 'VALIDATE_START':\n this.state.busySteps.add(action.payload.stepId);\n this.state = {\n ...this.state,\n busySteps: new Set(this.state.busySteps),\n };\n break;\n case 'VALIDATE_END':\n this.state.busySteps.delete(action.payload.stepId);\n this.state = {\n ...this.state,\n busySteps: new Set(this.state.busySteps),\n };\n if (action.payload.result.errors) {\n this.setStepErrors(action.payload.stepId, action.payload.result.errors);\n }\n break;\n case 'SET_STEP_ERRORS':\n this.setStepErrors(action.payload.stepId, action.payload.errors);\n break;\n case 'RESET':\n this.setInitialData(action.payload.data);\n break;\n case 'SET_ERROR_STEPS':\n this.state = { ...this.state, errorSteps: action.payload.steps };\n break;\n case 'SET_VISITED_STEPS':\n this.state = { ...this.state, visitedSteps: action.payload.steps };\n this.saveMeta();\n break;\n case 'SET_COMPLETED_STEPS':\n this.state = { ...this.state, completedSteps: action.payload.steps };\n this.saveMeta();\n break;\n case 'RESTORE_SNAPSHOT':\n this.state = { ...action.payload.snapshot };\n this.saveMeta();\n break;\n case 'GO_TO_STEP':\n this.state = {\n ...this.state,\n goToStepResult: action.payload.result,\n };\n if (action.payload.result === true) {\n if (action.payload.nextVisitedSteps) {\n this.dispatch({\n type: 'SET_VISITED_STEPS',\n payload: {\n steps: action.payload.nextVisitedSteps,\n },\n });\n }\n if (action.payload.nextHistory) {\n this.dispatch({\n type: 'SET_HISTORY',\n payload: {\n history: action.payload.nextHistory,\n },\n });\n }\n if (action.payload.to) {\n this.dispatch({\n type: 'SET_CURRENT_STEP_ID',\n payload: {\n stepId: action.payload.to,\n },\n });\n }\n }\n\n break;\n case 'UPDATE_META':\n this.state = {\n ...this.state,\n ...action.payload.meta,\n };\n // Check if we need to persist meta changes\n if (\n action.payload.meta.visitedSteps ||\n action.payload.meta.completedSteps ||\n action.payload.meta.history ||\n action.payload.meta.currentStepId\n ) {\n this.saveMeta();\n }\n break;\n }\n this.syncDerivedState();\n this.notify();\n }\n\n // Refactor update methods to be called from internalDispatch\n private updateDataByPath(path: string, value: any, _options?: { debounceValidation?: number }) {\n const newData = setByPath(this.state.data as any, path, value);\n if (newData === this.state.data) return;\n this.update(newData as T, path);\n }\n\n private updateBulkData(data: Partial<T>, options?: { replace?: boolean }) {\n let newData: T;\n if (options?.replace) {\n newData = data as T;\n } else {\n // Deep clone current data\n newData = JSON.parse(JSON.stringify(this.state.data));\n // Deep merge the updates (not shallow assign)\n Object.keys(data).forEach((key) => {\n (newData as any)[key] = (data as any)[key];\n });\n }\n this.update(newData, Object.keys(data));\n }\n\n /**\n * Returns the current immutable snapshot of the wizard state.\n */\n getSnapshot = () => {\n return this.state;\n };\n\n /**\n * Performs a granular data update at a specific path.\n * Automatically calculates dirty fields and triggers auto-save if configured.\n *\n * @param newData Full new data object\n * @param changedPath Path(s) that were modified\n */\n update(newData: T, changedPath?: string | string[]) {\n if (changedPath) {\n const paths = Array.isArray(changedPath) ? changedPath : [changedPath];\n paths.forEach((path) => {\n const initialValue = getByPath(this.initialData, path);\n const newValue = getByPath(newData, path);\n\n if (JSON.stringify(initialValue) !== JSON.stringify(newValue)) {\n this.dirtyFields.add(path);\n } else {\n this.dirtyFields.delete(path);\n }\n });\n }\n\n this.state = {\n ...this.state,\n data: newData,\n isDirty: this.dirtyFields.size > 0,\n dirtyFields: new Set(this.dirtyFields),\n };\n\n // Check for auto-save\n if (changedPath) {\n const paths = Array.isArray(changedPath) ? changedPath : [changedPath];\n this.checkAutoSave(paths);\n } else {\n // Bulk update\n this.checkAutoSave(Object.keys(newData as object));\n }\n\n this.notify();\n }\n\n updateMeta(newMeta: Partial<IWizardState<T, StepId>>) {\n this.dispatch({\n type: 'UPDATE_META',\n payload: { meta: newMeta },\n });\n }\n\n private syncDerivedState() {\n const { activeSteps, currentStepId, visitedSteps, completedSteps, errorSteps } = this.state;\n const currentStepIndex = Math.max(\n 0,\n activeSteps.findIndex((s) => s.id === currentStepId)\n );\n const currentStep = activeSteps[currentStepIndex] || null;\n\n const breadcrumbs = activeSteps.map((step) => {\n let status: 'visited' | 'completed' | 'error' | 'current' | 'upcoming' = 'upcoming';\n if (step.id === currentStepId) status = 'current';\n else if (errorSteps.has(step.id)) status = 'error';\n else if (completedSteps.has(step.id)) status = 'completed';\n else if (visitedSteps.has(step.id)) status = 'visited';\n\n return {\n id: step.id,\n label: step.label,\n status,\n };\n });\n\n this.state = {\n ...this.state,\n currentStep,\n currentStepIndex,\n isFirstStep: currentStepIndex === 0,\n isLastStep: activeSteps.length > 0 && currentStepIndex === activeSteps.length - 1,\n progress:\n activeSteps.length > 0\n ? Math.round(((currentStepIndex + 1) / activeSteps.length) * 100)\n : 0,\n breadcrumbs,\n };\n }\n\n /**\n * Sets the initial data for the wizard.\n * Resets dirty tracking based on this new data.\n */\n setInitialData(data: T) {\n this.initialData =\n typeof structuredClone === 'function'\n ? structuredClone(data)\n : JSON.parse(JSON.stringify(data));\n this.dirtyFields.clear();\n this.state = {\n ...this.state,\n data,\n isDirty: false,\n dirtyFields: new Set(),\n };\n this.notify();\n }\n\n private syncErrors() {\n const newErrorsObj: Record<StepId, Record<string, string>> = {} as unknown as Record<\n StepId,\n Record<string, string>\n >;\n for (const [stepId, fieldErrors] of this.errorsMap.entries()) {\n if (fieldErrors.size > 0) {\n newErrorsObj[stepId] = Object.fromEntries(fieldErrors);\n }\n }\n this.state = { ...this.state, errors: newErrorsObj };\n this.notify();\n }\n\n updateErrors(newErrors: Record<StepId, Record<string, string>>) {\n this.errorsMap.clear();\n for (const [stepId, fieldErrors] of Object.entries(newErrors)) {\n const stepMap = new Map<string, string>();\n for (const [field, msg] of Object.entries(fieldErrors as Record<string, string>)) {\n stepMap.set(field, msg);\n }\n if (stepMap.size > 0) this.errorsMap.set(stepId as StepId, stepMap);\n }\n this.state = { ...this.state, errors: newErrors };\n this.notify();\n }\n\n setStepErrors(stepId: StepId, errors: Record<string, string> | undefined | null) {\n if (!errors || Object.keys(errors).length === 0) {\n if (this.errorsMap.has(stepId)) {\n this.errorsMap.delete(stepId);\n this.syncErrors();\n return true;\n }\n return false;\n }\n\n const stepMap = new Map<string, string>();\n for (const [field, msg] of Object.entries(errors)) {\n stepMap.set(field, msg);\n }\n this.errorsMap.set(stepId, stepMap);\n\n this.syncErrors();\n return true;\n }\n\n deleteError(stepId: StepId, path: string): boolean {\n const stepErrors = this.errorsMap.get(stepId);\n if (!stepErrors) return false;\n\n if (stepErrors.has(path)) {\n stepErrors.delete(path);\n if (stepErrors.size === 0) {\n this.errorsMap.delete(stepId);\n }\n this.syncErrors();\n return true;\n }\n return false;\n }\n\n private notify() {\n this.listeners.forEach((l) => l());\n }\n\n subscribe = (listener: () => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n injectPersistence(adapter: IPersistenceAdapter) {\n this.persistenceAdapter = adapter;\n }\n\n /**\n * Restores wizard state from persistence storage.\n * Implements \"latest wins\" conflict resolution based on step timestamps.\n */\n hydrate() {\n if (!this.persistenceAdapter) return;\n\n let latestTimestamp = -1;\n let latestData: T | null = null;\n let hasHydrated = false;\n\n const config = this.state.config;\n\n // Iterate all steps to find the latest snapshot\n config.steps.forEach((step) => {\n const adapter = step.persistenceAdapter || this.persistenceAdapter;\n if (!adapter) return;\n\n try {\n // Use getStepWithMeta if available, otherwise fallback\n let candidateData: T | undefined;\n let candidateTimestamp = 0;\n\n if (adapter.getStepWithMeta) {\n const result = adapter.getStepWithMeta<T>(step.id);\n if (result) {\n candidateData = result.data;\n candidateTimestamp = result.timestamp;\n }\n } else {\n // Fallback for adapters not implementing getStepWithMeta\n candidateData = adapter.getStep<T>(step.id);\n // If we found data but no timestamp, we treat it as \"old\" (0) or maybe ignore?\n // We'll treat it as 0.\n }\n\n if (candidateData) {\n if (candidateTimestamp >= latestTimestamp) {\n latestTimestamp = candidateTimestamp;\n latestData = candidateData;\n hasHydrated = true;\n }\n }\n } catch (e) {\n console.warn(`[WizardStore] ⚠️ Failed to hydrate step ${step.id}:`, e);\n }\n });\n\n if (hasHydrated && latestData) {\n // Replace current data with the latest snapshot\n this.updateBulkData(latestData, { replace: true });\n }\n }\n\n private saveMeta() {\n const config = this.state.config;\n const persistenceMode = config.persistence?.mode || 'onStepChange';\n if (persistenceMode !== 'manual' && this.persistenceAdapter) {\n this.persistenceAdapter.saveStep('__wizzard_meta__', {\n currentStepId: this.state.currentStepId,\n visited: Array.from(this.state.visitedSteps),\n completed: Array.from(this.state.completedSteps),\n history: this.state.history,\n });\n }\n }\n\n clearStepStorage(stepId: string) {\n const step = this.stepsMap.get(stepId) || this.state.config.steps.find((s) => s.id === stepId);\n const adapter = step?.persistenceAdapter || this.persistenceAdapter;\n if (adapter && adapter.clearStep) {\n adapter.clearStep(stepId);\n }\n }\n\n /**\n * Manually triggers data persistence for specific steps or the current step.\n *\n * @param stepId Optional ID of step to save. If omitted, saves current step.\n */\n save(stepId?: StepId) {\n // If specific step requested\n if (stepId) {\n this.saveStepData(stepId);\n return;\n }\n\n // If no stepId, save current step\n if (this.state.currentStepId) {\n this.saveStepData(this.state.currentStepId);\n }\n }\n\n private saveStepData(stepId: string) {\n const step = this.stepsMap.get(stepId) || this.state.config.steps.find((s) => s.id === stepId);\n if (!step) return;\n\n const adapter = step.persistenceAdapter || this.persistenceAdapter;\n if (!adapter) return; // No adapter configured\n\n adapter.saveStep(stepId, this.state.data);\n }\n\n private handleStepChangePersistence(stepId: string) {\n const step = this.stepsMap.get(stepId) || this.state.config.steps.find((s) => s.id === stepId);\n if (!step) return;\n\n const mode = step.persistenceMode || this.state.config.persistence?.mode || 'onStepChange';\n if (mode === 'onStepChange') {\n this.saveStepData(stepId);\n }\n }\n\n // Internal helper to handle auto-save on data change\n private checkAutoSave(_changedPaths: string[]) {\n const { config, currentStepId } = this.state;\n if (!currentStepId) return;\n\n const step =\n this.stepsMap.get(currentStepId) || config.steps.find((s) => s.id === currentStepId);\n if (!step) return;\n\n const mode = step.persistenceMode || config.persistence?.mode || 'onStepChange';\n if (mode !== 'onChange') return;\n\n const debounceTime = config.persistence?.debounceTime ?? 300;\n\n const timerKey = currentStepId;\n if (this.persistenceDebounceTimers.has(timerKey)) {\n clearTimeout(this.persistenceDebounceTimers.get(timerKey));\n }\n\n this.persistenceDebounceTimers.set(\n timerKey,\n setTimeout(() => {\n this.saveStepData(currentStepId);\n }, debounceTime)\n );\n }\n\n // Caching for condition resolution\n private conditionCache = new Map<StepId, { result: boolean; depsValues: any[] }>();\n\n /**\n * Evaluates visibility conditions for all steps and returns only those that should be active.\n * Uses memoization to avoid redundant async calls if dependencies haven't changed.\n *\n * @param data Optional data override for evaluation\n */\n async resolveActiveSteps(data?: T): Promise<import('../types').IStepConfig<T, StepId>[]> {\n const currentData = data || this.state.data;\n const config = this.state.config;\n\n this.updateMeta({ isBusy: true });\n try {\n const steps = config.steps || [];\n const results = await Promise.all(\n steps.map(async (step) => {\n if (!step.condition) return { step, ok: true };\n\n // Optimization: Memoized Condition Resolution\n if (step.conditionDependsOn) {\n const currentDepsValues = step.conditionDependsOn.map((path) =>\n getByPath(currentData, path)\n );\n const cached = this.conditionCache.get(step.id);\n\n if (\n cached &&\n cached.depsValues.length === currentDepsValues.length &&\n cached.depsValues.every((val, idx) => val === currentDepsValues[idx])\n ) {\n return { step, ok: cached.result };\n }\n\n // If not cached or deps changed, resolve and cache\n try {\n const res = step.condition(currentData || ({} as T), this.getSnapshot());\n const ok = res instanceof Promise ? await res : res;\n this.conditionCache.set(step.id, {\n result: ok,\n depsValues: currentDepsValues,\n });\n return { step, ok };\n } catch (e) {\n console.error(`[Wizard] Condition failed for ${step.id}:`, e);\n return { step, ok: false };\n }\n }\n\n // Fallback: Default behavior (always resolve if no deps specified)\n const nextBusyStart = new Set(this.state.busySteps);\n nextBusyStart.add(step.id as StepId);\n this.updateMeta({\n busySteps: nextBusyStart,\n isBusy: true,\n });\n\n try {\n const res = step.condition(currentData || ({} as T), this.getSnapshot());\n const ok = res instanceof Promise ? await res : res;\n return { step, ok };\n } catch (e) {\n console.error(`[Wizard] Condition failed for ${step.id}:`, e);\n return { step, ok: false };\n } finally {\n const currentSnapshot = this.getSnapshot();\n const nextBusyEnd = new Set(currentSnapshot.busySteps);\n nextBusyEnd.delete(step.id as StepId);\n this.updateMeta({\n busySteps: nextBusyEnd,\n isBusy: nextBusyEnd.size > 0,\n });\n }\n })\n );\n return results.filter((r) => r.ok).map((r) => r.step);\n } finally {\n const currentSnapshot = this.getSnapshot();\n if (currentSnapshot.busySteps.size === 0) {\n this.updateMeta({ isBusy: false });\n }\n }\n }\n\n async validateStep(stepId: StepId): Promise<boolean> {\n const steps = this.state.config.steps || [];\n const step = this.stepsMap.get(stepId) || steps.find((s: any) => s.id === stepId);\n if (!step || !step.validationAdapter) return true;\n\n this.dispatch({ type: 'VALIDATE_START', payload: { stepId } });\n\n let isValid = true;\n try {\n const result = await step.validationAdapter.validate(this.state.data);\n isValid = result.isValid;\n\n if (result.isValid) {\n this.setStepErrors(stepId, null);\n const nextErrorSteps = new Set(this.state.errorSteps);\n nextErrorSteps.delete(stepId);\n this.dispatch({\n type: 'SET_ERROR_STEPS',\n payload: { steps: nextErrorSteps },\n });\n return true;\n } else {\n this.setStepErrors(stepId, result.errors || null);\n\n if (this.state.config.analytics?.onEvent) {\n this.state.config.analytics.onEvent('validation_error', {\n stepId,\n errors: result.errors,\n timestamp: Date.now(),\n } as any);\n }\n\n const nextErrorSteps = new Set(this.state.errorSteps);\n nextErrorSteps.add(stepId);\n this.dispatch({\n type: 'SET_ERROR_STEPS',\n payload: { steps: nextErrorSteps },\n });\n\n // Ensure it's removed from completed if it has errors\n const nextCompleted = new Set(this.state.completedSteps);\n if (nextCompleted.has(stepId)) {\n nextCompleted.delete(stepId);\n this.dispatch({\n type: 'SET_COMPLETED_STEPS',\n payload: { steps: nextCompleted },\n });\n }\n\n return false;\n }\n } finally {\n this.dispatch({\n type: 'VALIDATE_END',\n payload: { stepId, result: { isValid } } as any,\n });\n }\n }\n\n async validateAll(): Promise<{\n isValid: boolean;\n errors: Record<string, Record<string, string>>;\n }> {\n this.updateMeta({ isBusy: true });\n try {\n const data = this.getSnapshot().data;\n const activeSteps = await this.resolveActiveSteps(data);\n const results = await Promise.all(\n activeSteps.map((step) => this.validateStep(step.id as StepId))\n );\n\n return {\n isValid: results.every(Boolean),\n errors: this.getSnapshot().errors,\n };\n } finally {\n const currentSnapshot = this.getSnapshot();\n if (currentSnapshot.busySteps.size === 0) {\n this.updateMeta({ isBusy: false });\n }\n }\n }\n\n async goToStep(\n stepId: StepId,\n options: {\n validate?: boolean;\n providedActiveSteps?: import('../types').IStepConfig<T, StepId>[];\n } = { validate: true }\n ): Promise<boolean> {\n const { currentStepId, config, data: currentData } = this.state;\n\n const allSteps = config.steps || [];\n const currentIdx = allSteps.findIndex((s: any) => s.id === currentStepId);\n const targetIdx = allSteps.findIndex((s: any) => s.id === stepId);\n\n this.dispatch({\n type: 'GO_TO_STEP',\n payload: { result: 'init', to: stepId, from: currentStepId as StepId },\n });\n\n // If middleware swallowed the 'init' action, abort navigation\n if (this.getSnapshot().goToStepResult !== 'init') {\n console.warn('[WizardStore] Navigation aborted by middleware interceptor');\n return false;\n }\n\n if (targetIdx === currentIdx) return true;\n\n // 1. Validate Current Step if moving forward\n if (targetIdx > currentIdx && currentStepId && options.validate) {\n const step =\n this.stepsMap.get(currentStepId) || allSteps.find((s: any) => s.id === currentStepId);\n const shouldVal = step?.autoValidate ?? config.autoValidate ?? !!step?.validationAdapter;\n\n if (shouldVal) {\n const ok = await this.validateStep(currentStepId);\n if (!ok) {\n this.dispatch({\n type: 'GO_TO_STEP',\n payload: { result: false, to: stepId, from: currentStepId as StepId },\n });\n return false;\n }\n }\n }\n\n this.updateMeta({ isBusy: true });\n try {\n // 2. Resolve Active Steps\n const resolvedSteps =\n options.providedActiveSteps || (await this.resolveActiveSteps(currentData));\n const target = resolvedSteps.find((s) => s.id === stepId);\n if (!target) {\n this.dispatch({\n type: 'GO_TO_STEP',\n payload: { result: false, to: stepId, from: currentStepId as StepId },\n });\n return false;\n }\n\n // 3. Check Navigation Permissions\n // Priority: Step-level canNavigateTo > Global navigationMode\n if (target.canNavigateTo) {\n const snapshot = this.getSnapshot();\n const canNavigate = await target.canNavigateTo(currentData, snapshot);\n if (!canNavigate) {\n console.warn(\n `[WizardStore] Navigation to step \"${stepId}\" blocked by canNavigateTo function`\n );\n this.dispatch({\n type: 'GO_TO_STEP',\n payload: { result: false, to: stepId, from: currentStepId as StepId },\n });\n return false;\n }\n } else {\n // Fallback to global navigationMode\n const navigationMode = config.navigationMode || 'visited';\n const currentSnapshot = this.getSnapshot();\n const currentIndex = resolvedSteps.findIndex((s) => s.id === currentStepId);\n const targetIndex = resolvedSteps.findIndex((s) => s.id === stepId);\n const isAdjacent = Math.abs(targetIndex - currentIndex) === 1;\n\n // Check navigation permissions based on mode\n if (stepId !== currentStepId) {\n switch (navigationMode) {\n case 'sequential':\n // Sequential: ONLY adjacent steps (strict linear flow)\n if (!isAdjacent) {\n console.warn(\n `[WizardStore] Navigation to step \"${stepId}\" blocked: sequential mode allows only adjacent steps`\n );\n this.dispatch({\n type: 'GO_TO_STEP',\n payload: {\n result: false,\n to: stepId,\n from: currentStepId as StepId,\n },\n });\n return false;\n }\n break;\n\n case 'visited':\n // Visited: adjacent steps OR visited/completed steps\n const isVisitedOrCompleted =\n currentSnapshot.visitedSteps.has(stepId) ||\n currentSnapshot.completedSteps.has(stepId);\n\n if (!isAdjacent && !isVisitedOrCompleted) {\n console.warn(\n `[WizardStore] Navigation to step \"${stepId}\" blocked: step not visited or completed`\n );\n this.dispatch({\n type: 'GO_TO_STEP',\n payload: {\n result: false,\n to: stepId,\n from: currentStepId as StepId,\n },\n });\n return false;\n }\n break;\n\n case 'free':\n // Free mode: allow navigation to any step\n break;\n }\n }\n }\n\n // 4. Guards (beforeLeave)\n const step =\n this.stepsMap.get(currentStepId) || allSteps.find((s: any) => s.id === currentStepId);\n if (step?.beforeLeave) {\n const snapshot = this.getSnapshot();\n const direction = targetIdx > currentIdx ? 'next' : 'prev';\n const ok = await step.beforeLeave(currentData, direction, snapshot);\n if (ok === false) {\n this.dispatch({\n type: 'GO_TO_STEP',\n payload: { result: false, to: stepId, from: currentStepId as StepId },\n });\n return false;\n }\n }\n\n const currentSnapshot = this.getSnapshot();\n const nextVisited = new Set(currentSnapshot.visitedSteps);\n // Mark previous step as visited\n if (currentStepId) nextVisited.add(currentStepId);\n // Mark new step as visited (on entry)\n nextVisited.add(stepId);\n\n const nextHistory = [...currentSnapshot.history, stepId];\n\n this.dispatch({\n type: 'GO_TO_STEP',\n payload: {\n result: true,\n to: stepId,\n from: currentStepId as StepId,\n nextHistory,\n nextVisitedSteps: nextVisited,\n },\n });\n\n // Meta persistence\n this.saveMeta();\n\n if (config.onStepChange) {\n config.onStepChange(currentStepId || null, stepId, currentData);\n }\n\n if (config.analytics?.onEvent) {\n config.analytics.onEvent('step_change', {\n from: (currentStepId || null) as any,\n to: stepId,\n timestamp: Date.now(),\n } as any);\n }\n\n return true;\n } finally {\n this.updateMeta({ isBusy: false });\n }\n }\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module Types (Core)
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Full state of the wizard.
|
|
6
|
+
*/
|
|
7
|
+
interface IWizardState<T = unknown, StepId extends string = string> {
|
|
8
|
+
/** Global wizard data object */
|
|
9
|
+
data: T;
|
|
10
|
+
/** Current errors map by step and field */
|
|
11
|
+
errors: Record<StepId, Record<string, string>>;
|
|
12
|
+
/** Active step configuration (if any) */
|
|
13
|
+
currentStep: IStepConfig<T, StepId> | null;
|
|
14
|
+
/** Numeric index of current step in active steps list */
|
|
15
|
+
currentStepIndex: number;
|
|
16
|
+
/** True if currently on the first active step */
|
|
17
|
+
isFirstStep: boolean;
|
|
18
|
+
/** True if currently on the last active step */
|
|
19
|
+
isLastStep: boolean;
|
|
20
|
+
/** True if the wizard is in an initial loading/hydrating state */
|
|
21
|
+
isLoading: boolean;
|
|
22
|
+
/** True if an async action (like navigation or validation) is in progress */
|
|
23
|
+
isPending: boolean;
|
|
24
|
+
/** List of steps that currently meet their visibility conditions */
|
|
25
|
+
activeSteps: IStepConfig<T, StepId>[];
|
|
26
|
+
/** String ID of the current step */
|
|
27
|
+
currentStepId: StepId | '';
|
|
28
|
+
/** History of visited steps (navigation path) */
|
|
29
|
+
history: StepId[];
|
|
30
|
+
/** Set of step IDs that are currently performing async work */
|
|
31
|
+
busySteps: Set<StepId>;
|
|
32
|
+
/** Set of step IDs that have been visited by the user */
|
|
33
|
+
visitedSteps: Set<StepId>;
|
|
34
|
+
/** Set of step IDs that have passed validation */
|
|
35
|
+
completedSteps: Set<StepId>;
|
|
36
|
+
/** Set of step IDs that currently have active validation errors */
|
|
37
|
+
errorSteps: Set<StepId>;
|
|
38
|
+
/** Current wizard configuration */
|
|
39
|
+
config: IWizardConfig<T, StepId>;
|
|
40
|
+
/** Percentage of completion (0-100) */
|
|
41
|
+
progress: number;
|
|
42
|
+
/** Number of active steps */
|
|
43
|
+
activeStepsCount: number;
|
|
44
|
+
/** Alias for isPending */
|
|
45
|
+
isBusy: boolean;
|
|
46
|
+
/** True if any field has been modified since initialization */
|
|
47
|
+
isDirty: boolean;
|
|
48
|
+
/** Set of paths to fields that have been modified */
|
|
49
|
+
dirtyFields: Set<string>;
|
|
50
|
+
/** Breadcrumb items for navigation UI */
|
|
51
|
+
breadcrumbs: IBreadcrumb<StepId>[];
|
|
52
|
+
/** Result of the last goToStep action */
|
|
53
|
+
goToStepResult?: boolean | null | 'init';
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Store interface for reading state and dispatching actions.
|
|
57
|
+
*/
|
|
58
|
+
interface IWizardStore<T, StepId extends string = string> {
|
|
59
|
+
getSnapshot(): IWizardState<T, StepId>;
|
|
60
|
+
dispatch(action: WizardAction<T, StepId>): void;
|
|
61
|
+
update(newData: T, changedPath?: string | string[]): void;
|
|
62
|
+
updateMeta(newMeta: Partial<IWizardState<T, StepId>>): void;
|
|
63
|
+
setInitialData(data: T): void;
|
|
64
|
+
updateErrors(newErrors: Record<string, Record<string, string>>): void;
|
|
65
|
+
setStepErrors(stepId: string, errors: Record<string, string> | undefined | null): boolean;
|
|
66
|
+
deleteError(stepId: string, path: string): boolean;
|
|
67
|
+
subscribe(listener: () => void): () => void;
|
|
68
|
+
subscribeToActions(listener: (action: WizardAction<T, StepId>) => void): () => void;
|
|
69
|
+
injectPersistence(adapter: IPersistenceAdapter): void;
|
|
70
|
+
save(stepId?: StepId): void;
|
|
71
|
+
hydrate(): void;
|
|
72
|
+
errorsMap: Map<string, Map<string, string>>;
|
|
73
|
+
resolveActiveSteps(data?: T): Promise<IStepConfig<T, StepId>[]>;
|
|
74
|
+
goToStep(stepId: StepId, options?: {
|
|
75
|
+
validate?: boolean;
|
|
76
|
+
providedActiveSteps?: IStepConfig<T, StepId>[];
|
|
77
|
+
}): Promise<boolean>;
|
|
78
|
+
validateStep: (stepId: StepId) => Promise<boolean>;
|
|
79
|
+
validateAll: () => Promise<{
|
|
80
|
+
isValid: boolean;
|
|
81
|
+
errors: Record<string, Record<string, string>>;
|
|
82
|
+
}>;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Public actions available to control the wizard.
|
|
86
|
+
*/
|
|
87
|
+
interface IWizardActions<StepId extends string = string> {
|
|
88
|
+
goToNextStep: () => Promise<void>;
|
|
89
|
+
goToPrevStep: () => Promise<void>;
|
|
90
|
+
goToStep: (stepId: StepId, providedActiveSteps?: any[], options?: {
|
|
91
|
+
validate?: boolean;
|
|
92
|
+
}) => Promise<boolean>;
|
|
93
|
+
setStepData: (stepId: StepId, data: unknown) => void;
|
|
94
|
+
handleStepChange: (field: string, value: unknown) => void;
|
|
95
|
+
validateStep: (sid: StepId) => Promise<boolean>;
|
|
96
|
+
validateAll: () => Promise<{
|
|
97
|
+
isValid: boolean;
|
|
98
|
+
errors: Record<string, Record<string, string>>;
|
|
99
|
+
}>;
|
|
100
|
+
save: (stepIds?: StepId | StepId[] | boolean) => void;
|
|
101
|
+
clearStorage: () => void;
|
|
102
|
+
reset: () => void;
|
|
103
|
+
setData: (path: string, value: unknown, options?: {
|
|
104
|
+
debounceValidation?: number;
|
|
105
|
+
}) => void;
|
|
106
|
+
updateData: (data: Partial<any>, options?: {
|
|
107
|
+
replace?: boolean;
|
|
108
|
+
persist?: boolean;
|
|
109
|
+
}) => void;
|
|
110
|
+
getData: (path: string, defaultValue?: unknown) => unknown;
|
|
111
|
+
updateConfig: (config: Partial<IWizardConfig<any, StepId>>) => void;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Validation Result Interface
|
|
115
|
+
*/
|
|
116
|
+
type ValidationResult = {
|
|
117
|
+
isValid: boolean;
|
|
118
|
+
errors?: Record<string, string>;
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Validator Adapter Interface
|
|
122
|
+
*/
|
|
123
|
+
interface IValidatorAdapter<TData = unknown> {
|
|
124
|
+
validate: (data: TData) => Promise<ValidationResult> | ValidationResult;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Persistence strategy for step data.
|
|
128
|
+
*/
|
|
129
|
+
type PersistenceMode = 'onStepChange' | 'onChange' | 'manual';
|
|
130
|
+
/**
|
|
131
|
+
* Validation strategy for step data.
|
|
132
|
+
*/
|
|
133
|
+
type ValidationMode = 'onChange' | 'onStepChange' | 'manual';
|
|
134
|
+
/**
|
|
135
|
+
* Persistence Adapter Interface
|
|
136
|
+
*/
|
|
137
|
+
interface IPersistenceAdapter {
|
|
138
|
+
saveStep: <T>(stepId: string, data: T) => void;
|
|
139
|
+
getStep: <T>(stepId: string) => T | undefined;
|
|
140
|
+
getStepWithMeta?: <T>(stepId: string) => {
|
|
141
|
+
data: T;
|
|
142
|
+
timestamp: number;
|
|
143
|
+
} | undefined;
|
|
144
|
+
clearStep: (stepId: string) => void;
|
|
145
|
+
clear: () => void;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Step Navigation Direction
|
|
149
|
+
*/
|
|
150
|
+
type StepDirection = 'next' | 'prev';
|
|
151
|
+
/**
|
|
152
|
+
* Step Configuration
|
|
153
|
+
*/
|
|
154
|
+
interface IStepConfig<TStepData = unknown, StepId extends string = string> {
|
|
155
|
+
id: StepId;
|
|
156
|
+
label: string;
|
|
157
|
+
condition?: (data: TStepData, metadata: Partial<IWizardState<TStepData, StepId>> & {
|
|
158
|
+
data?: TStepData | undefined;
|
|
159
|
+
allErrors?: any;
|
|
160
|
+
}) => boolean | Promise<boolean>;
|
|
161
|
+
showWhilePending?: boolean;
|
|
162
|
+
conditionDependsOn?: string[];
|
|
163
|
+
beforeLeave?: (data: TStepData, direction: StepDirection, metadata: Partial<IWizardState<TStepData, StepId>> & {
|
|
164
|
+
data?: TStepData | undefined;
|
|
165
|
+
allErrors?: any;
|
|
166
|
+
}) => boolean | Promise<boolean>;
|
|
167
|
+
validationAdapter?: IValidatorAdapter<TStepData>;
|
|
168
|
+
/** @deprecated Use validationMode instead */
|
|
169
|
+
autoValidate?: boolean;
|
|
170
|
+
validationMode?: ValidationMode;
|
|
171
|
+
component?: any;
|
|
172
|
+
persistenceAdapter?: IPersistenceAdapter;
|
|
173
|
+
persistenceMode?: PersistenceMode;
|
|
174
|
+
dependsOn?: string[];
|
|
175
|
+
clearData?: string | string[] | ((data: TStepData, changedFields: string[]) => Partial<TStepData>);
|
|
176
|
+
canNavigateTo?: (data: TStepData, metadata: Partial<IWizardState<TStepData, StepId>> & {
|
|
177
|
+
data?: TStepData | undefined;
|
|
178
|
+
allErrors?: any;
|
|
179
|
+
}) => boolean | Promise<boolean>;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Global Wizard Configuration.
|
|
183
|
+
*/
|
|
184
|
+
interface IWizardConfig<T = unknown, StepId extends string = string> {
|
|
185
|
+
steps: IStepConfig<T, StepId>[];
|
|
186
|
+
/** @deprecated Use validationMode instead */
|
|
187
|
+
autoValidate?: boolean;
|
|
188
|
+
validationMode?: ValidationMode;
|
|
189
|
+
validationDebounceTime?: number;
|
|
190
|
+
persistence?: {
|
|
191
|
+
mode?: PersistenceMode;
|
|
192
|
+
adapter?: IPersistenceAdapter;
|
|
193
|
+
storageKey?: string;
|
|
194
|
+
debounceTime?: number;
|
|
195
|
+
};
|
|
196
|
+
onConflict?: 'merge' | 'replace' | 'keep-local';
|
|
197
|
+
analytics?: {
|
|
198
|
+
onEvent: WizardEventHandler<StepId>;
|
|
199
|
+
};
|
|
200
|
+
middlewares?: WizardMiddleware<T, StepId>[];
|
|
201
|
+
navigationMode?: 'sequential' | 'visited' | 'free';
|
|
202
|
+
onStepChange?: (fromStep: StepId | null, toStep: StepId, data: T) => void;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Action Types
|
|
206
|
+
*/
|
|
207
|
+
type WizardAction<T = any, StepId extends string = string> = {
|
|
208
|
+
type: 'INIT';
|
|
209
|
+
payload: {
|
|
210
|
+
data: T;
|
|
211
|
+
config: IWizardConfig<T, StepId>;
|
|
212
|
+
};
|
|
213
|
+
} | {
|
|
214
|
+
type: 'SET_DATA';
|
|
215
|
+
payload: {
|
|
216
|
+
path: string;
|
|
217
|
+
value: any;
|
|
218
|
+
options?: any;
|
|
219
|
+
};
|
|
220
|
+
} | {
|
|
221
|
+
type: 'UPDATE_DATA';
|
|
222
|
+
payload: {
|
|
223
|
+
data: Partial<T>;
|
|
224
|
+
options?: any;
|
|
225
|
+
};
|
|
226
|
+
} | {
|
|
227
|
+
type: 'GO_TO_STEP';
|
|
228
|
+
payload: {
|
|
229
|
+
from: StepId;
|
|
230
|
+
to: StepId;
|
|
231
|
+
result: boolean | null | 'init';
|
|
232
|
+
nextVisitedSteps?: Set<StepId>;
|
|
233
|
+
nextHistory?: StepId[];
|
|
234
|
+
};
|
|
235
|
+
} | {
|
|
236
|
+
type: 'VALIDATE_START';
|
|
237
|
+
payload: {
|
|
238
|
+
stepId: StepId;
|
|
239
|
+
};
|
|
240
|
+
} | {
|
|
241
|
+
type: 'VALIDATE_END';
|
|
242
|
+
payload: {
|
|
243
|
+
stepId: StepId;
|
|
244
|
+
result: ValidationResult;
|
|
245
|
+
};
|
|
246
|
+
} | {
|
|
247
|
+
type: 'SET_STEP_ERRORS';
|
|
248
|
+
payload: {
|
|
249
|
+
stepId: StepId;
|
|
250
|
+
errors: Record<string, string> | undefined | null;
|
|
251
|
+
};
|
|
252
|
+
} | {
|
|
253
|
+
type: 'RESET';
|
|
254
|
+
payload: {
|
|
255
|
+
data: T;
|
|
256
|
+
};
|
|
257
|
+
} | {
|
|
258
|
+
type: 'UPDATE_META';
|
|
259
|
+
payload: {
|
|
260
|
+
meta: Partial<IWizardState<T, StepId>>;
|
|
261
|
+
};
|
|
262
|
+
} | {
|
|
263
|
+
type: 'SET_CURRENT_STEP_ID';
|
|
264
|
+
payload: {
|
|
265
|
+
stepId: StepId | '';
|
|
266
|
+
};
|
|
267
|
+
} | {
|
|
268
|
+
type: 'SET_HISTORY';
|
|
269
|
+
payload: {
|
|
270
|
+
history: StepId[];
|
|
271
|
+
};
|
|
272
|
+
} | {
|
|
273
|
+
type: 'SET_ACTIVE_STEPS';
|
|
274
|
+
payload: {
|
|
275
|
+
steps: IStepConfig<T, StepId>[];
|
|
276
|
+
};
|
|
277
|
+
} | {
|
|
278
|
+
type: 'SET_VISITED_STEPS';
|
|
279
|
+
payload: {
|
|
280
|
+
steps: Set<StepId>;
|
|
281
|
+
};
|
|
282
|
+
} | {
|
|
283
|
+
type: 'SET_COMPLETED_STEPS';
|
|
284
|
+
payload: {
|
|
285
|
+
steps: Set<StepId>;
|
|
286
|
+
};
|
|
287
|
+
} | {
|
|
288
|
+
type: 'SET_ERROR_STEPS';
|
|
289
|
+
payload: {
|
|
290
|
+
steps: Set<StepId>;
|
|
291
|
+
};
|
|
292
|
+
} | {
|
|
293
|
+
type: 'RESTORE_SNAPSHOT';
|
|
294
|
+
payload: {
|
|
295
|
+
snapshot: any;
|
|
296
|
+
};
|
|
297
|
+
};
|
|
298
|
+
/**
|
|
299
|
+
* Middleware API
|
|
300
|
+
*/
|
|
301
|
+
interface MiddlewareAPI<T = any, StepId extends string = string> {
|
|
302
|
+
dispatch: (action: WizardAction<T, StepId>) => void;
|
|
303
|
+
getState: () => T;
|
|
304
|
+
getSnapshot: () => IWizardState<T, StepId>;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Middleware Type Definition
|
|
308
|
+
*/
|
|
309
|
+
type WizardMiddleware<T = any, StepId extends string = string> = (api: MiddlewareAPI<T, StepId>) => (next: (action: WizardAction<T, StepId>) => void) => (action: WizardAction<T, StepId>) => void;
|
|
310
|
+
/**
|
|
311
|
+
* Standardized Event Names
|
|
312
|
+
*/
|
|
313
|
+
type WizardEventName = 'step_change' | 'validation_error' | 'wizard_reset';
|
|
314
|
+
/**
|
|
315
|
+
* Event Payloads
|
|
316
|
+
*/
|
|
317
|
+
type WizardEventPayloads<StepId extends string = string> = {
|
|
318
|
+
step_change: {
|
|
319
|
+
from: StepId | null;
|
|
320
|
+
to: StepId;
|
|
321
|
+
timestamp: number;
|
|
322
|
+
};
|
|
323
|
+
validation_error: {
|
|
324
|
+
stepId: StepId;
|
|
325
|
+
errors: Record<string, string> | undefined;
|
|
326
|
+
timestamp: number;
|
|
327
|
+
};
|
|
328
|
+
wizard_reset: {
|
|
329
|
+
data: any;
|
|
330
|
+
timestamp?: number;
|
|
331
|
+
};
|
|
332
|
+
};
|
|
333
|
+
/**
|
|
334
|
+
* Generic Event Handler Type
|
|
335
|
+
*/
|
|
336
|
+
type WizardEventHandler<StepId extends string = string> = <E extends WizardEventName>(name: E, payload: WizardEventPayloads<StepId>[E]) => void;
|
|
337
|
+
/**
|
|
338
|
+
* Breadcrumb Status
|
|
339
|
+
*/
|
|
340
|
+
type BreadcrumbStatus = 'visited' | 'current' | 'upcoming' | 'completed' | 'error' | 'hidden';
|
|
341
|
+
/**
|
|
342
|
+
* Breadcrumb Interface
|
|
343
|
+
*/
|
|
344
|
+
interface IBreadcrumb<StepId extends string = string> {
|
|
345
|
+
id: StepId;
|
|
346
|
+
label: string;
|
|
347
|
+
status: BreadcrumbStatus;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* High-level context for the wizard, combining state and actions.
|
|
351
|
+
*/
|
|
352
|
+
interface IWizardContext<T = unknown, StepId extends string = string> extends Omit<IWizardState<T, StepId>, 'errors'>, IWizardActions<StepId> {
|
|
353
|
+
/**
|
|
354
|
+
* The internal store instance.
|
|
355
|
+
*/
|
|
356
|
+
store: IWizardStore<T, StepId>;
|
|
357
|
+
/**
|
|
358
|
+
* Combined error map (flat)
|
|
359
|
+
*/
|
|
360
|
+
errors: Record<string, string>;
|
|
361
|
+
/**
|
|
362
|
+
* All errors by step and field.
|
|
363
|
+
*/
|
|
364
|
+
allErrors: Record<StepId, Record<string, string>>;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* Core event-driven store for managing wizard state, data, and navigation.
|
|
369
|
+
*
|
|
370
|
+
* @template T Type of the global wizard data object
|
|
371
|
+
* @template StepId String union of valid step IDs
|
|
372
|
+
*/
|
|
373
|
+
declare class WizardStore<T, StepId extends string = string> implements IWizardStore<T, StepId> {
|
|
374
|
+
private initialData;
|
|
375
|
+
private dirtyFields;
|
|
376
|
+
private state;
|
|
377
|
+
private listeners;
|
|
378
|
+
private actionListeners;
|
|
379
|
+
errorsMap: Map<StepId, Map<string, string>>;
|
|
380
|
+
private middlewareChain;
|
|
381
|
+
private persistenceAdapter?;
|
|
382
|
+
private persistenceDebounceTimers;
|
|
383
|
+
private stepsMap;
|
|
384
|
+
subscribeToActions(listener: (action: WizardAction<T, StepId>) => void): () => boolean;
|
|
385
|
+
private notifyActions;
|
|
386
|
+
constructor(initialData: T, middlewares?: WizardMiddleware<T, StepId>[]);
|
|
387
|
+
private setupMiddlewares;
|
|
388
|
+
/**
|
|
389
|
+
* Processes an action through the middleware chain and updates the state.
|
|
390
|
+
* This is the primary way to trigger any state change in the wizard.
|
|
391
|
+
*
|
|
392
|
+
* @param action The action to perform
|
|
393
|
+
*/
|
|
394
|
+
dispatch(action: WizardAction<T, StepId>): void;
|
|
395
|
+
/**
|
|
396
|
+
* Internal dispatch that actually performs the state updates
|
|
397
|
+
*/
|
|
398
|
+
private internalDispatch;
|
|
399
|
+
private updateDataByPath;
|
|
400
|
+
private updateBulkData;
|
|
401
|
+
/**
|
|
402
|
+
* Returns the current immutable snapshot of the wizard state.
|
|
403
|
+
*/
|
|
404
|
+
getSnapshot: () => IWizardState<T, StepId>;
|
|
405
|
+
/**
|
|
406
|
+
* Performs a granular data update at a specific path.
|
|
407
|
+
* Automatically calculates dirty fields and triggers auto-save if configured.
|
|
408
|
+
*
|
|
409
|
+
* @param newData Full new data object
|
|
410
|
+
* @param changedPath Path(s) that were modified
|
|
411
|
+
*/
|
|
412
|
+
update(newData: T, changedPath?: string | string[]): void;
|
|
413
|
+
updateMeta(newMeta: Partial<IWizardState<T, StepId>>): void;
|
|
414
|
+
private syncDerivedState;
|
|
415
|
+
/**
|
|
416
|
+
* Sets the initial data for the wizard.
|
|
417
|
+
* Resets dirty tracking based on this new data.
|
|
418
|
+
*/
|
|
419
|
+
setInitialData(data: T): void;
|
|
420
|
+
private syncErrors;
|
|
421
|
+
updateErrors(newErrors: Record<StepId, Record<string, string>>): void;
|
|
422
|
+
setStepErrors(stepId: StepId, errors: Record<string, string> | undefined | null): boolean;
|
|
423
|
+
deleteError(stepId: StepId, path: string): boolean;
|
|
424
|
+
private notify;
|
|
425
|
+
subscribe: (listener: () => void) => () => boolean;
|
|
426
|
+
injectPersistence(adapter: IPersistenceAdapter): void;
|
|
427
|
+
/**
|
|
428
|
+
* Restores wizard state from persistence storage.
|
|
429
|
+
* Implements "latest wins" conflict resolution based on step timestamps.
|
|
430
|
+
*/
|
|
431
|
+
hydrate(): void;
|
|
432
|
+
private saveMeta;
|
|
433
|
+
clearStepStorage(stepId: string): void;
|
|
434
|
+
/**
|
|
435
|
+
* Manually triggers data persistence for specific steps or the current step.
|
|
436
|
+
*
|
|
437
|
+
* @param stepId Optional ID of step to save. If omitted, saves current step.
|
|
438
|
+
*/
|
|
439
|
+
save(stepId?: StepId): void;
|
|
440
|
+
private saveStepData;
|
|
441
|
+
private handleStepChangePersistence;
|
|
442
|
+
private checkAutoSave;
|
|
443
|
+
private conditionCache;
|
|
444
|
+
/**
|
|
445
|
+
* Evaluates visibility conditions for all steps and returns only those that should be active.
|
|
446
|
+
* Uses memoization to avoid redundant async calls if dependencies haven't changed.
|
|
447
|
+
*
|
|
448
|
+
* @param data Optional data override for evaluation
|
|
449
|
+
*/
|
|
450
|
+
resolveActiveSteps(data?: T): Promise<IStepConfig<T, StepId>[]>;
|
|
451
|
+
validateStep(stepId: StepId): Promise<boolean>;
|
|
452
|
+
validateAll(): Promise<{
|
|
453
|
+
isValid: boolean;
|
|
454
|
+
errors: Record<string, Record<string, string>>;
|
|
455
|
+
}>;
|
|
456
|
+
goToStep(stepId: StepId, options?: {
|
|
457
|
+
validate?: boolean;
|
|
458
|
+
providedActiveSteps?: IStepConfig<T, StepId>[];
|
|
459
|
+
}): Promise<boolean>;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* Parses a string path into an array of keys using a cache.
|
|
464
|
+
*/
|
|
465
|
+
declare function toPath(path: string): string[];
|
|
466
|
+
/**
|
|
467
|
+
* Retrieves a value from an object by path.
|
|
468
|
+
*/
|
|
469
|
+
declare function getByPath(obj: any, path: string, defaultValue?: unknown): unknown;
|
|
470
|
+
/**
|
|
471
|
+
* Immutably sets a value in an object by path.
|
|
472
|
+
*/
|
|
473
|
+
declare function setByPath<T extends object>(obj: T, path: string, value: unknown): T;
|
|
474
|
+
/**
|
|
475
|
+
* Simple shallow equality check.
|
|
476
|
+
*/
|
|
477
|
+
declare function shallowEqual(a: any, b: any): boolean;
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* Utility types for dot-notation paths
|
|
481
|
+
*/
|
|
482
|
+
type Primitive = null | undefined | string | number | boolean | symbol | bigint;
|
|
483
|
+
type IsTuple<T extends ReadonlyArray<any>> = number extends T['length'] ? false : true;
|
|
484
|
+
type TupleKeys<T extends ReadonlyArray<any>> = Exclude<keyof T, keyof any[]>;
|
|
485
|
+
type PathImpl<K extends string | number, V> = V extends Primitive ? `${K}` : `${K}` | `${K}.${Path<V>}`;
|
|
486
|
+
/**
|
|
487
|
+
* Dot-notation path for a nested data type.
|
|
488
|
+
*/
|
|
489
|
+
type Path<T> = T extends ReadonlyArray<infer V> ? IsTuple<T> extends true ? {
|
|
490
|
+
[K in TupleKeys<T>]-?: PathImpl<K & string, T[K]>;
|
|
491
|
+
}[TupleKeys<T>] : PathImpl<number, V> : {
|
|
492
|
+
[K in keyof T]-?: PathImpl<K & string, T[K]>;
|
|
493
|
+
}[keyof T];
|
|
494
|
+
/**
|
|
495
|
+
* Value type resolved from a dot-notation path.
|
|
496
|
+
*/
|
|
497
|
+
type PathValue<T, P extends Path<T>> = T extends any ? P extends `${infer K}.${infer R}` ? K extends keyof T ? R extends Path<T[K]> ? PathValue<T[K], R> : never : K extends `${number}` ? T extends ReadonlyArray<infer V> ? R extends Path<V> ? PathValue<V, R> : never : never : never : P extends keyof T ? T[P] : P extends `${number}` ? T extends ReadonlyArray<infer V> ? V : never : never : never;
|
|
498
|
+
|
|
499
|
+
export { type BreadcrumbStatus, type IBreadcrumb, type IPersistenceAdapter, type IStepConfig, type IValidatorAdapter, type IWizardActions, type IWizardConfig, type IWizardContext, type IWizardState, type IWizardStore, type MiddlewareAPI, type Path, type PathValue, type PersistenceMode, type StepDirection, type ValidationMode, type ValidationResult, type WizardAction, type WizardEventHandler, type WizardEventName, type WizardEventPayloads, type WizardMiddleware, WizardStore, getByPath, setByPath, shallowEqual, toPath };
|