gjendje 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/README.md +143 -0
- package/dist/chunk-347V4L7H.js +1127 -0
- package/dist/chunk-347V4L7H.js.map +1 -0
- package/dist/chunk-GGB5QBDR.cjs +1136 -0
- package/dist/chunk-GGB5QBDR.cjs.map +1 -0
- package/dist/factory-CIj-6WlO.d.cts +316 -0
- package/dist/factory-CIj-6WlO.d.ts +316 -0
- package/dist/index.cjs +40 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +90 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/react/index.cjs +150 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +16 -0
- package/dist/react/index.d.ts +16 -0
- package/dist/react/index.js +117 -0
- package/dist/react/index.js.map +1 -0
- package/package.json +103 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/batch.ts","../src/adapters/server.ts","../src/config.ts","../src/persist.ts","../src/adapters/storage.ts","../src/adapters/bucket.ts","../src/adapters/local.ts","../src/adapters/render.ts","../src/adapters/sync.ts","../src/adapters/tab.ts","../src/adapters/url.ts","../src/registry.ts","../src/ssr.ts","../src/core.ts","../src/collection.ts","../src/computed.ts","../src/effect.ts","../src/enhancers/watch.ts","../src/factory.ts"],"names":["AsyncLocalStorage","isVersionedValue","config","next","options"],"mappings":";;;;;;;AAEA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAM,KAAA,uBAAY,GAAA,EAAkB;AAmB7B,SAAS,MAAM,EAAA,EAAsB;AAC3C,EAAA,KAAA,EAAA;AAEA,EAAA,IAAI;AACH,IAAA,EAAA,EAAG;AAAA,EACJ,CAAA,SAAE;AACD,IAAA,KAAA,EAAA;AAEA,IAAA,IAAI,KAAA,KAAU,GAAG,KAAA,EAAM;AAAA,EACxB;AACD;AAMO,SAAS,OAAO,EAAA,EAAwB;AAC9C,EAAA,IAAI,QAAQ,CAAA,EAAG;AACd,IAAA,KAAA,CAAM,IAAI,EAAE,CAAA;AAEZ,IAAA;AAAA,EACD;AAEA,EAAA,EAAA,EAAG;AACJ;AAEA,SAAS,KAAA,GAAc;AACtB,EAAA,OAAO,KAAA,CAAM,OAAO,CAAA,EAAG;AACtB,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAK,CAAA;AAE7B,IAAA,KAAA,CAAM,KAAA,EAAM;AAEZ,IAAA,KAAA,EAAA;AAEA,IAAA,IAAI;AACH,MAAA,KAAA,MAAW,gBAAgB,OAAA,EAAS;AACnC,QAAA,YAAA,EAAa;AAAA,MACd;AAAA,IACD,CAAA,SAAE;AACD,MAAA,KAAA,EAAA;AAAA,IACD;AAAA,EACD;AACD;;;AC7DA,IAAM,GAAA,GAAM,IAAIA,6BAAA,EAAwC;AAExD,eAAsB,kBAAqB,EAAA,EAAyB;AACnE,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAqB;AAEvC,EAAA,OAAO,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,EAAE,CAAA;AACzB;AAEO,SAAS,mBAAA,CAAuB,KAAa,YAAA,EAA6B;AAChF,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAiB;AAEvC,EAAA,SAAS,QAAA,GAA6C;AACrD,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACrB;AAEA,EAAA,IAAI,iBAAA,GAAuB,YAAA;AAE3B,EAAA,MAAM,kBAAkB,MAAM;AAC7B,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AACjC,MAAA,QAAA,CAAS,iBAAiB,CAAA;AAAA,IAC3B;AAAA,EACD,CAAA;AAEA,EAAA,OAAO;AAAA,IACN,KAAA,EAAO,QAAQ,OAAA,EAAQ;AAAA,IAEvB,GAAA,GAAM;AACL,MAAA,MAAM,QAAQ,QAAA,EAAS;AAEvB,MAAA,IAAI,CAAC,OAAO,OAAO,YAAA;AAEnB,MAAA,OAAO,MAAM,GAAA,CAAI,GAAG,IAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,GAAU,YAAA;AAAA,IACjD,CAAA;AAAA,IAEA,IAAI,KAAA,EAAO;AACV,MAAA,MAAM,QAAQ,QAAA,EAAS;AAEvB,MAAA,IAAI,CAAC,KAAA,EAAO;AACX,QAAA,MAAM,IAAI,KAAA;AAAA,UACT;AAAA,SAED;AAAA,MACD;AAEA,MAAA,KAAA,CAAM,GAAA,CAAI,KAAK,KAAK,CAAA;AAEpB,MAAA,iBAAA,GAAoB,KAAA;AAEpB,MAAA,MAAA,CAAO,eAAe,CAAA;AAAA,IACvB,CAAA;AAAA,IAEA,UAAU,QAAA,EAAoC;AAC7C,MAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AAEtB,MAAA,OAAO,MAAM;AACZ,QAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,MAC1B,CAAA;AAAA,IACD,CAAA;AAAA,IAEA,OAAA,GAAU;AACT,MAAA,SAAA,CAAU,KAAA,EAAM;AAAA,IACjB;AAAA,GACD;AACD;;;AC+BA,IAAI,eAA4B,EAAC;AAE1B,SAAS,UAAU,MAAA,EAA2B;AACpD,EAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,GAAG,MAAA,EAAO;AAC7C;AAEO,SAAS,SAAA,GAAmC;AAClD,EAAA,OAAO,YAAA;AACR;AAKO,SAAS,GAAA,CAAI,OAAmC,OAAA,EAAuB;AAC7E,EAAA,MAAM,WAAA,GAAc,aAAa,QAAA,IAAY,MAAA;AAE7C,EAAA,IAAI,gBAAgB,QAAA,EAAU;AAE9B,EAAA,MAAM,WAAW,EAAE,KAAA,EAAO,GAAG,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA,EAAE;AAE/C,EAAA,IAAI,QAAA,CAAS,KAAK,CAAA,IAAK,QAAA,CAAS,WAAW,CAAA,EAAG;AAC7C,IAAA,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA,QAAA,EAAW,OAAO,CAAA,CAAE,CAAA;AAAA,EACpC;AACD;AAKO,SAAS,WAAA,CAAY,GAAA,EAAa,KAAA,EAAc,KAAA,EAAsB;AAC5E,EAAA,YAAA,CAAa,OAAA,GAAU,EAAE,GAAA,EAAK,KAAA,EAAO,OAAO,CAAA;AAC7C;;;ACrHO,SAAS,cAAA,CACf,GAAA,EACA,OAAA,EACA,GAAA,EACA,KAAA,EACI;AACJ,EAAA,MAAM,cAAA,GAAiB,QAAQ,OAAA,IAAW,CAAA;AAE1C,EAAA,MAAM,eAAe,OAAA,CAAQ,OAAA;AAE7B,EAAA,IAAI;AAQH,IAAA,IAASC,iBAAAA,GAAT,SAA0B,KAAA,EAAkD;AAC3E,MAAA,MAAM,QAAA,GACL,UAAU,IAAA,IAAQ,OAAO,UAAU,QAAA,IAAY,GAAA,IAAO,SAAS,MAAA,IAAU,KAAA;AAE1E,MAAA,OAAO,QAAA,IAAY,OAAQ,KAAA,CAAkC,CAAA,KAAM,QAAA;AAAA,IACpE,CAAA;AALS,IAAA,IAAA,gBAAA,GAAAA,iBAAAA;AAPT,IAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAGtC,IAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,IAAA,IAAI,IAAA;AASJ,IAAA,IAAIA,iBAAAA,CAAiB,MAAM,CAAA,EAAG;AAC7B,MAAA,aAAA,GAAgB,MAAA,CAAO,CAAA;AAEvB,MAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AAAA,IACf,CAAA,MAAO;AAEN,MAAA,aAAA,GAAgB,CAAA;AAEhB,MAAA,IAAA,GAAO,MAAA;AAAA,IACR;AAGA,IAAA,IAAI,aAAA,GAAgB,cAAA,IAAkB,OAAA,CAAQ,OAAA,EAAS;AACtD,MAAA,IAAA,GAAO,aAAA,CAAc,IAAA,EAAM,aAAA,EAAe,cAAA,EAAgB,QAAQ,OAAO,CAAA;AAEzE,MAAA,IAAI,OAAO,KAAA,EAAO;AACjB,QAAA,SAAA,GAAY,SAAA,GAAY;AAAA,UACvB,GAAA;AAAA,UACA,KAAA;AAAA,UACA,WAAA,EAAa,aAAA;AAAA,UACb,SAAA,EAAW,cAAA;AAAA,UACX;AAAA,SACA,CAAA;AAAA,MACF;AAAA,IACD;AAGA,IAAA,IAAI,QAAQ,QAAA,IAAY,CAAC,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AAChD,MAAA,OAAO,YAAA;AAAA,IACR;AAEA,IAAA,OAAO,IAAA;AAAA,EACR,CAAA,CAAA,MAAQ;AACP,IAAA,GAAA,CAAI,SAAS,CAAA,mEAAA,CAAgE,CAAA;AAC7E,IAAA,OAAO,YAAA;AAAA,EACR;AACD;AAMO,SAAS,cAAA,CAAkB,OAAU,OAAA,EAA0B;AACrE,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,KAAY,CAAA,EAAG;AAC9B,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,QAAA,GAA8B,EAAE,CAAA,EAAG,OAAA,EAAS,MAAM,KAAA,EAAM;AAE9D,EAAA,OAAO,IAAA,CAAK,UAAU,QAAQ,CAAA;AAC/B;AAUO,SAAS,QAAA,CAAY,OAAU,IAAA,EAA+B;AACpE,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AAEjE,EAAA,MAAM,UAAmC,EAAC;AAE1C,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACrB,IAAA,IAAI,KAAM,KAAA,EAAmC;AAC5C,MAAA,OAAA,CAAQ,CAAC,CAAA,GAAK,KAAA,CAAkC,CAAC,CAAA;AAAA,IAClD;AAAA,EACD;AAEA,EAAA,OAAO,OAAA;AACR;AAMO,SAAS,SAAA,CAAa,MAAA,EAAW,YAAA,EAAiB,IAAA,EAA+B;AACvF,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,WAAW,QAAA,IAAY,MAAA,KAAW,MAAM,OAAO,MAAA;AAEnE,EAAA,OAAO,EAAE,GAAI,YAAA,EAAyB,GAAI,MAAA,EAAkB;AAC7D;AAUA,SAAS,aAAA,CACR,IAAA,EACA,WAAA,EACA,SAAA,EACA,UAAA,EACU;AACV,EAAA,IAAI,OAAA,GAAU,IAAA;AAEd,EAAA,KAAA,IAAS,CAAA,GAAI,WAAA,EAAa,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,SAAA,GAAY,WAAW,CAAC,CAAA;AAE9B,IAAA,IAAI,SAAA,EAAW;AACd,MAAA,IAAI;AACH,QAAA,OAAA,GAAU,UAAU,OAAO,CAAA;AAAA,MAC5B,CAAA,CAAA,MAAQ;AACP,QAAA,GAAA,CAAI,MAAA,EAAQ,CAAA,gBAAA,EAAmB,CAAC,CAAA,kDAAA,CAA+C,CAAA;AAC/E,QAAA,OAAO,OAAA;AAAA,MACR;AAAA,IACD;AAAA,EACD;AAEA,EAAA,OAAO,OAAA;AACR;;;ACjJO,SAAS,oBAAA,CACf,OAAA,EACA,GAAA,EACA,OAAA,EACa;AACb,EAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAc,OAAA,EAAS,SAAA,EAAW,SAAQ,GAAI,OAAA;AAE/D,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAiB;AAEvC,EAAA,SAAS,IAAA,GAAU;AAClB,IAAA,IAAI;AACH,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AAE/B,MAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,YAAA;AAEzB,MAAA,IAAI,KAAA;AAEJ,MAAA,IAAI,SAAA,EAAW;AACd,QAAA,IAAI;AACH,UAAA,KAAA,GAAQ,SAAA,CAAU,MAAM,GAAG,CAAA;AAAA,QAC5B,CAAA,CAAA,MAAQ;AACP,UAAA,OAAO,YAAA;AAAA,QACR;AAAA,MACD,CAAA,MAAO;AACN,QAAA,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,OAAA,EAAS,GAAA,EAAK,QAAQ,KAAK,CAAA;AAAA,MACxD;AAEA,MAAA,OAAO,SAAA,CAAU,KAAA,EAAO,YAAA,EAAc,OAAO,CAAA;AAAA,IAC9C,CAAA,CAAA,MAAQ;AACP,MAAA,OAAO,YAAA;AAAA,IACR;AAAA,EACD;AAEA,EAAA,SAAS,MAAM,KAAA,EAAgB;AAC9B,IAAA,IAAI;AACH,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,EAAO,OAAO,CAAA;AAEvC,MAAA,MAAM,GAAA,GAAM,YAAY,SAAA,CAAU,SAAA,CAAU,OAAO,CAAA,GAAI,cAAA,CAAe,SAAS,OAAO,CAAA;AAEtF,MAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,IACzB,SAAS,CAAA,EAAG;AACX,MAAA,GAAA;AAAA,QACC,OAAA;AAAA,QACA,CAAA,qBAAA,EAAwB,GAAG,CAAA,cAAA,EAAiB,CAAA,YAAa,QAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,OACvF;AAEA,MAAA,MAAM,eACL,CAAA,YAAa,YAAA,KAAiB,EAAE,IAAA,KAAS,oBAAA,IAAwB,EAAE,IAAA,KAAS,EAAA,CAAA;AAE7E,MAAA,IAAI,YAAA,IAAgB,QAAQ,KAAA,EAAO;AAClC,QAAA,SAAA,EAAU,CAAE,kBAAkB,EAAE,GAAA,EAAK,OAAO,OAAA,CAAQ,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,CAAA;AAAA,MACtE;AAAA,IACD;AAAA,EACD;AAEA,EAAA,IAAI,iBAAA,GAAuB,YAAA;AAE3B,EAAA,MAAM,kBAAkB,MAAM;AAC7B,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AACjC,MAAA,QAAA,CAAS,iBAAiB,CAAA;AAAA,IAC3B;AAAA,EACD,CAAA;AAEA,EAAA,SAAS,eAAe,KAAA,EAA2B;AAClD,IAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,OAAA,IAAW,KAAA,CAAM,QAAQ,GAAA,EAAK;AAExD,IAAA,iBAAA,GAAoB,IAAA,EAAK;AAEzB,IAAA,MAAA,CAAO,eAAe,CAAA;AAAA,EACvB;AAEA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAClC,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,cAAc,CAAA;AAAA,EAClD;AAEA,EAAA,OAAO;AAAA,IACN,KAAA,EAAO,QAAQ,OAAA,EAAQ;AAAA,IAEvB,GAAA,GAAM;AACL,MAAA,OAAO,IAAA,EAAK;AAAA,IACb,CAAA;AAAA,IAEA,IAAI,KAAA,EAAO;AACV,MAAA,KAAA,CAAM,KAAK,CAAA;AAEX,MAAA,iBAAA,GAAoB,KAAA;AAEpB,MAAA,MAAA,CAAO,eAAe,CAAA;AAAA,IACvB,CAAA;AAAA,IAEA,UAAU,QAAA,EAAoC;AAC7C,MAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AAEtB,MAAA,OAAO,MAAM;AACZ,QAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,MAC1B,CAAA;AAAA,IACD,CAAA;AAAA,IAEA,OAAA,GAAU;AACT,MAAA,SAAA,CAAU,KAAA,EAAM;AAEhB,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAClC,QAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,cAAc,CAAA;AAAA,MACrD;AAAA,IACD;AAAA,GACD;AACD;;;AC7EA,SAAS,iBAAA,GAA6B;AACrC,EAAA,OACC,OAAO,SAAA,KAAc,WAAA,IACrB,gBAAA,IAAoB,SAAA,IACpB,UAAU,cAAA,IAAkB,IAAA;AAE9B;AAEA,SAAS,YAAY,OAAA,EAA8C;AAClE,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AAExC,EAAA,MAAM,KAAA,GAAgC;AAAA,IACrC,EAAA,EAAI,CAAA;AAAA,IACJ,CAAA,EAAG,GAAA;AAAA,IACH,CAAA,EAAG,GAAA;AAAA,IACH,CAAA,EAAG,IAAA;AAAA,IACH,CAAA,EAAG,KAAA;AAAA,IACH,CAAA,EAAG;AAAA,GACJ;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,iCAAiC,CAAA;AAE7D,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,CAAC,KAAK,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,OAAO,MAAA;AAE7C,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AAEjC,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AAE3B,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAElB,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,GAAQ,IAAA;AAC7B;AAEA,SAAS,WAAW,KAAA,EAA4C;AAC/D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AAEtC,EAAA,MAAM,KAAA,GAAgC;AAAA,IACrC,CAAA,EAAG,CAAA;AAAA,IACH,EAAA,EAAI,IAAA;AAAA,IACJ,EAAA,EAAI,OAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACL;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,WAAA,EAAY,CAAE,MAAM,+BAA+B,CAAA;AAEvE,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,CAAC,KAAK,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,OAAO,MAAA;AAE7C,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AAEjC,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AAE3B,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAElB,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,IAAI,CAAA;AAC/B;AAMO,SAAS,mBAAA,CACf,GAAA,EACA,aAAA,EACA,OAAA,EACa;AACb,EAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAa,GAAI,OAAA;AAClC,EAAA,MAAM,aAAA,GAAgB,cAAc,QAAA,IAAY,OAAA;AAEhD,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAiB;AAEvC,EAAA,IAAI,iBAAA,GAAuB,YAAA;AAE3B,EAAA,MAAM,kBAAkB,MAAM;AAC7B,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AACjC,MAAA,QAAA,CAAS,iBAAiB,CAAA;AAAA,IAC3B;AAAA,EACD,CAAA;AAGA,EAAA,IAAI,QAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,WAAA,GAAc,KAAA;AAElB,EAAA,SAAS,IAAA,GAAU;AAClB,IAAA,IAAI,CAAC,UAAU,OAAO,YAAA;AAEtB,IAAA,OAAO,SAAS,GAAA,EAAI;AAAA,EACrB;AAEA,EAAA,SAAS,MAAM,KAAA,EAAgB;AAC9B,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,QAAA,CAAS,IAAI,KAAK,CAAA;AAAA,EACnB;AAMA,EAAA,MAAM,SAAS,YAA2B;AACzC,IAAA,IAAI;AACH,MAAA,IAAI,CAAC,mBAAkB,EAAG;AACzB,QAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,MAChD;AAEA,MAAA,MAAM,WAAA,GAA2D;AAAA,QAChE,SAAA,EAAW,cAAc,SAAA,IAAa,KAAA;AAAA,QACtC,UAAA,EAAY;AAAA,OACb;AAEA,MAAA,IAAI,aAAA,CAAc,WAAW,IAAA,EAAM;AAClC,QAAA,MAAM,MAAA,GAAS,WAAA,CAAY,aAAA,CAAc,OAAO,CAAA;AAEhD,QAAA,IAAI,UAAU,IAAA,EAAM;AACnB,UAAA,WAAA,CAAY,OAAA,GAAU,MAAA;AAAA,QACvB,CAAA,MAAO;AACN,UAAA,OAAA,CAAQ,IAAA;AAAA,YACP,CAAA,wCAAA,EAA2C,cAAc,OAAO,CAAA,yDAAA;AAAA,WAEjE;AAAA,QACD;AAAA,MACD;AAEA,MAAA,IAAI,aAAA,CAAc,SAAS,IAAA,EAAM;AAChC,QAAA,MAAM,MAAA,GAAS,UAAA,CAAW,aAAA,CAAc,KAAK,CAAA;AAE7C,QAAA,IAAI,UAAU,IAAA,EAAM;AACnB,UAAA,WAAA,CAAY,KAAA,GAAQ,MAAA;AAAA,QACrB,CAAA,MAAO;AACN,UAAA,OAAA,CAAQ,IAAA;AAAA,YACP,CAAA,sCAAA,EAAyC,cAAc,KAAK,CAAA,4DAAA;AAAA,WAE7D;AAAA,QACD;AAAA,MACD;AAEA,MAAA,MAAM,gBAAgB,SAAA,CAAU,cAAA;AAEhC,MAAA,IAAI,CAAC,aAAA,EAAe,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAEnE,MAAA,MAAM,SAAS,MAAM,aAAA,CAAc,IAAA,CAAK,aAAA,CAAc,MAAM,WAAW,CAAA;AAEvE,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,YAAA,EAAa;AAE1C,MAAA,QAAA,GAAW,oBAAA,CAAqB,OAAA,EAAS,GAAA,EAAK,OAAO,CAAA;AAAA,IACtD,CAAA,CAAA,MAAQ;AAEP,MAAA,MAAM,QAAQ,OAAA,EAAQ;AAGtB,MAAA,MAAM,eAAA,GAAkB,aAAA,KAAkB,KAAA,GAAQ,cAAA,GAAiB,YAAA;AAEnE,MAAA,QAAA,GAAW,oBAAA,CAAqB,eAAA,EAAiB,GAAA,EAAK,OAAO,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAI,WAAA,EAAa;AAChB,MAAA,QAAA,EAAU,OAAA,IAAU;AACpB,MAAA,QAAA,GAAW,IAAA;AAEX,MAAA;AAAA,IACD;AAGA,IAAA,MAAM,WAAA,GAAc,SAAS,GAAA,EAAI;AAEjC,IAAA,IAAI,KAAK,SAAA,CAAU,WAAW,MAAM,IAAA,CAAK,SAAA,CAAU,YAAY,CAAA,EAAG;AACjE,MAAA,iBAAA,GAAoB,WAAA;AAEpB,MAAA,MAAA,CAAO,eAAe,CAAA;AAAA,IACvB;AAGA,IAAA,QAAA,CAAS,SAAA,CAAU,CAAC,KAAA,KAAU;AAC7B,MAAA,iBAAA,GAAoB,KAAA;AAEpB,MAAA,MAAA,CAAO,eAAe,CAAA;AAAA,IACvB,CAAC,CAAA;AAAA,EACF,CAAA,GAAG;AAEH,EAAA,OAAO;AAAA,IACN,KAAA;AAAA,IAEA,GAAA,GAAM;AACL,MAAA,OAAO,IAAA,EAAK;AAAA,IACb,CAAA;AAAA,IAEA,IAAI,KAAA,EAAO;AACV,MAAA,KAAA,CAAM,KAAK,CAAA;AAEX,MAAA,iBAAA,GAAoB,KAAA;AAEpB,MAAA,MAAA,CAAO,eAAe,CAAA;AAAA,IACvB,CAAA;AAAA,IAEA,UAAU,QAAA,EAAoC;AAC7C,MAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AAEtB,MAAA,OAAO,MAAM;AACZ,QAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,MAC1B,CAAA;AAAA,IACD,CAAA;AAAA,IAEA,OAAA,GAAU;AACT,MAAA,WAAA,GAAc,IAAA;AAEd,MAAA,SAAA,CAAU,KAAA,EAAM;AAEhB,MAAA,QAAA,EAAU,OAAA,IAAU;AACpB,MAAA,QAAA,GAAW,IAAA;AAAA,IACZ;AAAA,GACD;AACD;;;AClPO,SAAS,kBAAA,CAAsB,KAAa,OAAA,EAAsC;AACxF,EAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACxC,IAAA,MAAM,IAAI,KAAA;AAAA,MACT;AAAA,KACD;AAAA,EACD;AAEA,EAAA,OAAO,oBAAA,CAAqB,YAAA,EAAc,GAAA,EAAK,OAAO,CAAA;AACvD;;;ACRO,SAAS,oBAAuB,YAAA,EAA6B;AACnE,EAAA,IAAI,OAAA,GAAU,YAAA;AAEd,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAiB;AAEvC,EAAA,MAAM,kBAAkB,MAAM;AAC7B,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AACjC,MAAA,QAAA,CAAS,OAAO,CAAA;AAAA,IACjB;AAAA,EACD,CAAA;AAEA,EAAA,OAAO;AAAA,IACN,KAAA,EAAO,QAAQ,OAAA,EAAQ;AAAA,IAEvB,GAAA,GAAM;AACL,MAAA,OAAO,OAAA;AAAA,IACR,CAAA;AAAA,IAEA,IAAI,KAAA,EAAO;AACV,MAAA,OAAA,GAAU,KAAA;AAEV,MAAA,MAAA,CAAO,eAAe,CAAA;AAAA,IACvB,CAAA;AAAA,IAEA,UAAU,QAAA,EAAoC;AAC7C,MAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AAEtB,MAAA,OAAO,MAAM;AACZ,QAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,MAC1B,CAAA;AAAA,IACD,CAAA;AAAA,IAEA,OAAA,GAAU;AACT,MAAA,SAAA,CAAU,KAAA,EAAM;AAAA,IACjB;AAAA,GACD;AACD;;;AChCO,SAAS,QAAA,CAAY,OAAA,EAAqB,GAAA,EAAa,KAAA,EAA2B;AACxF,EAAA,MAAM,WAAA,GAAc,SAAS,GAAG,CAAA,CAAA;AAEhC,EAAA,MAAM,UAAU,OAAO,gBAAA,KAAqB,cAAc,IAAI,gBAAA,CAAiB,WAAW,CAAA,GAAI,IAAA;AAE9F,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAiB;AAEvC,EAAA,OAAA,CAAQ,SAAA,CAAU,CAAC,KAAA,KAAU;AAC5B,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AACjC,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IACf;AAAA,EACD,CAAC,CAAA;AAED,EAAA,IAAI,OAAA,EAAS;AACZ,IAAA,OAAA,CAAQ,SAAA,GAAY,CAAC,KAAA,KAAwB;AAC5C,MAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,IAAA,IAAQ,OAAO,KAAA,CAAM,SAAS,QAAA,IAAY,EAAE,OAAA,IAAW,KAAA,CAAM,IAAA,CAAA,EAAO;AAEtF,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA;AAKzB,MAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAEjB,MAAA,IAAI,KAAA,EAAO;AACV,QAAA,SAAA,EAAU,CAAE,SAAS,EAAE,GAAA,EAAK,OAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAAA,MAC7D;AAAA,IACD,CAAA;AAAA,EACD;AAEA,EAAA,OAAO;AAAA,IACN,IAAI,KAAA,GAAQ;AACX,MAAA,OAAO,OAAA,CAAQ,KAAA;AAAA,IAChB,CAAA;AAAA,IAEA,GAAA,GAAM;AACL,MAAA,OAAO,QAAQ,GAAA,EAAI;AAAA,IACpB,CAAA;AAAA,IAEA,IAAI,KAAA,EAAO;AACV,MAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAEjB,MAAA,OAAA,EAAS,WAAA,CAAY,EAAE,KAAA,EAAO,CAAA;AAAA,IAC/B,CAAA;AAAA,IAEA,UAAU,QAAA,EAAoC;AAC7C,MAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AAEtB,MAAA,OAAO,MAAM;AACZ,QAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,MAC1B,CAAA;AAAA,IACD,CAAA;AAAA,IAEA,OAAA,GAAU;AACT,MAAA,SAAA,CAAU,KAAA,EAAM;AAEhB,MAAA,OAAA,EAAS,KAAA,EAAM;AAEf,MAAA,OAAA,CAAQ,OAAA,IAAU;AAAA,IACnB;AAAA,GACD;AACD;;;ACjEO,SAAS,gBAAA,CAAoB,KAAa,OAAA,EAAsC;AACtF,EAAA,IAAI,OAAO,mBAAmB,WAAA,EAAa;AAC1C,IAAA,MAAM,IAAI,KAAA;AAAA,MACT;AAAA,KACD;AAAA,EACD;AAEA,EAAA,OAAO,oBAAA,CAAqB,cAAA,EAAgB,GAAA,EAAK,OAAO,CAAA;AACzD;;;ACPO,SAAS,gBAAA,CACf,GAAA,EACA,YAAA,EACA,UAAA,EACA,OAAA,EACa;AACb,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAClC,IAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,EAC1E;AAEA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAiB;AAEvC,EAAA,SAAS,IAAA,GAAU;AAClB,IAAA,IAAI;AACH,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AAEzD,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAE1B,MAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,YAAA;AAEzB,MAAA,OAAO,SAAA,CAAU,WAAW,KAAA,CAAM,kBAAA,CAAmB,GAAG,CAAC,CAAA,EAAG,cAAc,OAAO,CAAA;AAAA,IAClF,CAAA,CAAA,MAAQ;AACP,MAAA,OAAO,YAAA;AAAA,IACR;AAAA,EACD;AAEA,EAAA,SAAS,MAAM,KAAA,EAAgB;AAC9B,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AAEzD,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,EAAO,OAAO,CAAA;AAEvC,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,SAAA,CAAU,OAAO,CAAA;AAEhD,IAAA,MAAM,SAAA,GAAY,WAAA,KAAgB,UAAA,CAAW,SAAA,CAAU,YAAY,CAAA;AAEnE,IAAA,IAAI,SAAA,EAAW;AACd,MAAA,MAAA,CAAO,OAAO,GAAG,CAAA;AAAA,IAClB,CAAA,MAAO;AACN,MAAA,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,kBAAA,CAAmB,WAAW,CAAC,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,MAAA,GAAS,OAAO,QAAA,EAAS;AAE/B,IAAA,MAAM,MAAA,GAAS,SACZ,CAAA,EAAG,MAAA,CAAO,SAAS,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA,EAAG,MAAA,CAAO,SAAS,IAAI,CAAA,CAAA,GAC5D,GAAG,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,EAAG,MAAA,CAAO,SAAS,IAAI,CAAA,CAAA;AAErD,IAAA,MAAA,CAAO,OAAA,CAAQ,SAAA,CAAU,IAAA,EAAM,EAAA,EAAI,MAAM,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,iBAAA,GAAuB,YAAA;AAE3B,EAAA,MAAM,kBAAkB,MAAM;AAC7B,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AACjC,MAAA,QAAA,CAAS,iBAAiB,CAAA;AAAA,IAC3B;AAAA,EACD,CAAA;AAEA,EAAA,SAAS,UAAA,GAAmB;AAC3B,IAAA,iBAAA,GAAoB,IAAA,EAAK;AAEzB,IAAA,MAAA,CAAO,eAAe,CAAA;AAAA,EACvB;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,UAAU,CAAA;AAE9C,EAAA,OAAO;AAAA,IACN,KAAA,EAAO,QAAQ,OAAA,EAAQ;AAAA,IAEvB,GAAA,GAAM;AACL,MAAA,OAAO,IAAA,EAAK;AAAA,IACb,CAAA;AAAA,IAEA,IAAI,KAAA,EAAO;AACV,MAAA,KAAA,CAAM,KAAK,CAAA;AAEX,MAAA,iBAAA,GAAoB,KAAA;AAEpB,MAAA,MAAA,CAAO,eAAe,CAAA;AAAA,IACvB,CAAA;AAAA,IAEA,UAAU,QAAA,EAAoC;AAC7C,MAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AAEtB,MAAA,OAAO,MAAM;AACZ,QAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,MAC1B,CAAA;AAAA,IACD,CAAA;AAAA,IAEA,OAAA,GAAU;AACT,MAAA,SAAA,CAAU,KAAA,EAAM;AAEhB,MAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,UAAU,CAAA;AAAA,IAClD;AAAA,GACD;AACD;;;AChGO,SAAS,SAAA,CAAU,KAAa,KAAA,EAAsB;AAC5D,EAAA,OAAO,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AACvB;AAGA,IAAM,QAAA,uBAAe,GAAA,EAA+B;AAE7C,SAAS,aAAA,CAAiB,KAAa,KAAA,EAA2C;AACxF,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,KAAK,CAAC,CAAA;AAC1C;AAEO,SAAS,QAAA,CAAY,GAAA,EAAa,KAAA,EAAc,QAAA,EAAiC;AACvF,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,EAAK,KAAK,CAAA;AAEjC,EAAA,IAAI,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AAElC,IAAA,IAAI,UAAU,WAAA,EAAa;AAC1B,MAAA,QAAA,CAAS,GAAA,CAAI,MAAM,QAAQ,CAAA;AAAA,IAC5B,CAAA,MAAO;AACN,MAAA,MAAMC,UAAS,SAAA,EAAU;AAEzB,MAAA,IAAIA,QAAO,eAAA,EAAiB;AAC3B,QAAA,GAAA,CAAI,MAAA,EAAQ,CAAA,iBAAA,EAAoB,GAAG,CAAA,eAAA,EAAkB,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAAA,MAC1F;AAAA,IACD;AAEA,IAAA;AAAA,EACD;AAEA,EAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,EAAA,IAAI,OAAO,OAAA,KAAY,MAAA,IAAa,QAAA,CAAS,IAAA,IAAQ,OAAO,OAAA,EAAS;AACpE,IAAA,MAAM,IAAI,KAAA;AAAA,MACT,0BAA0B,MAAA,CAAO,OAAO,CAAA,kCAAA,EACb,GAAG,kBAAkB,KAAK,CAAA,EAAA;AAAA,KACtD;AAAA,EACD;AAEA,EAAA,QAAA,CAAS,GAAA,CAAI,MAAM,QAAQ,CAAA;AAE3B,EAAA,MAAA,CAAO,UAAA,GAAa,EAAE,GAAA,EAAK,KAAA,EAAO,CAAA;AACnC;AAEO,SAAS,UAAA,CAAW,KAAa,KAAA,EAAoB;AAC3D,EAAA,QAAA,CAAS,MAAA,CAAO,SAAA,CAAU,GAAA,EAAK,KAAK,CAAC,CAAA;AACtC;;;AC9CO,SAAS,QAAA,GAAoB;AACnC,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,QAAA,KAAa,WAAA;AAC7D;AAMO,IAAM,cAAA,uBAAqB,GAAA,CAAI,CAAC,OAAO,OAAA,EAAS,KAAA,EAAO,QAAQ,CAAC,CAAA;AAUhE,SAAS,eAAe,EAAA,EAA+B;AAC7D,EAAA,IAAI,QAAA,EAAS,EAAG,OAAO,OAAA,CAAQ,OAAA,EAAQ;AAGvC,EAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACrC,IAAA,OAAA,CAAQ,OAAA,EAAQ,CAAE,IAAA,CAAK,MAAM;AAC5B,MAAA,IAAI,OAAO,0BAA0B,WAAA,EAAa;AACjD,QAAA,qBAAA,CAAsB,MAAM;AAC3B,UAAA,EAAA,EAAG;AACH,UAAA,OAAA,EAAQ;AAAA,QACT,CAAC,CAAA;AAAA,MACF,CAAA,MAAO;AACN,QAAA,UAAA,CAAW,MAAM;AAChB,UAAA,EAAA,EAAG;AACH,UAAA,OAAA,EAAQ;AAAA,QACT,GAAG,CAAC,CAAA;AAAA,MACL;AAAA,IACD,CAAC,CAAA;AAAA,EACF,CAAC,CAAA;AACF;;;ACxBA,IAAM,oCAAoB,IAAI,GAAA,CAAW,CAAC,OAAA,EAAS,KAAA,EAAO,QAAQ,CAAC,CAAA;AACnE,IAAM,kCAAkB,IAAI,GAAA,CAAW,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAA;AAM1D,SAAS,iBAAA,CAAqB,KAAa,OAAA,EAAkC;AAC5E,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,KAAA,EAAO,OAAO,GAAA;AAErC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,SAAA,EAAU,CAAE,MAAA;AAE7C,EAAA,OAAO,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,GAAA;AACtC;AAMA,SAAS,cAAA,CAAkB,GAAA,EAAa,KAAA,EAAc,OAAA,EAAsC;AAC3F,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,GAAA,EAAK,OAAO,CAAA;AAEjD,EAAA,QAAQ,KAAA;AAAO,IACd,KAAK,QAAA;AACJ,MAAA,OAAO,mBAAA,CAAoB,QAAQ,OAAO,CAAA;AAAA,IAE3C,KAAK,KAAA;AACJ,MAAA,OAAO,gBAAA,CAAiB,YAAY,OAAO,CAAA;AAAA,IAE5C,KAAK,OAAA;AACJ,MAAA,OAAO,kBAAA,CAAmB,YAAY,OAAO,CAAA;AAAA,IAE9C,KAAK,KAAA;AACJ,MAAA,OAAO,gBAAA;AAAA,QACN,UAAA;AAAA,QACA,OAAA,CAAQ,OAAA;AAAA,QACR,QAAQ,SAAA,IAAa;AAAA,UACpB,SAAA,EAAW,CAAC,CAAA,KAAM,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,UAClC,KAAA,EAAO,CAAC,CAAA,KAAM,IAAA,CAAK,MAAM,CAAC;AAAA,SAC3B;AAAA,QACA,OAAA,CAAQ;AAAA,OACT;AAAA,IAED,KAAK,QAAA;AACJ,MAAA,OAAO,mBAAA,CAAoB,UAAA,EAAY,OAAA,CAAQ,OAAO,CAAA;AAAA,IAEvD,KAAK,QAAA,EAAU;AACd,MAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACpB,QAAA,MAAM,IAAI,KAAA;AAAA,UACT;AAAA,SAED;AAAA,MACD;AAEA,MAAA,OAAO,mBAAA,CAAoB,UAAA,EAAY,OAAA,CAAQ,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC/D;AAAA,IAEA,SAAS;AACR,MAAA,MAAM,WAAA,GAAqB,KAAA;AAE3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,WAAW,CAAA,CAAE,CAAA;AAAA,IACxD;AAAA;AAEF;AAMO,SAAS,UAAA,CAAc,KAAa,OAAA,EAA2C;AACrF,EAAA,IAAI,CAAC,GAAA,EAAK;AACT,IAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,EAC1D;AAEA,EAAA,MAAM,SAAS,SAAA,EAAU;AAGzB,EAAA,IAAI,OAAO,UAAA,IAAc,CAAC,OAAO,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG;AACtD,IAAA,MAAM,IAAI,KAAA;AAAA,MACT,CAAA,aAAA,EAAgB,GAAG,CAAA,2CAAA,EAA8C,MAAA,CAAO,UAAU,CAAA,CAAA;AAAA,KACnF;AAAA,EACD;AAGA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,MAAA,CAAO,YAAA,IAAgB,QAAA;AAEtD,EAAA,MAAM,QAAA,GAAW,aAAA,CAAiB,GAAA,EAAK,KAAK,CAAA;AAE5C,EAAA,IAAI,QAAA,IAAY,CAAC,QAAA,CAAS,WAAA,EAAa,OAAO,QAAA;AAG9C,EAAA,IAAI,MAAA,CAAO,qBAAqB,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,IAAK,CAAC,QAAQ,QAAA,EAAU;AAClF,IAAA,MAAM,IAAI,KAAA;AAAA,MACT,CAAA,6DAAA,EAAgE,KAAK,CAAA,YAAA,EACvD,GAAG,CAAA,2DAAA;AAAA,KAClB;AAAA,EACD;AAEA,EAAA,MAAM,eAAe,OAAA,CAAQ,OAAA;AAE7B,EAAA,MAAM,aAAa,OAAA,CAAQ,GAAA,IAAO,OAAO,GAAA,KAAQ,cAAA,CAAe,IAAI,KAAK,CAAA;AAEzE,EAAA,MAAM,iBAAA,GAAoB,aAAa,QAAA,EAAS;AAEhD,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,GAAA,EAAK,OAAO,CAAA;AAEjD,EAAA,MAAM,WAAA,GAAc,oBACjB,mBAAA,CAAoB,YAAY,IAChC,cAAA,CAAe,GAAA,EAAK,OAAO,OAAO,CAAA;AAErC,EAAA,MAAM,gBAAgB,OAAA,CAAQ,IAAA,KAAS,OAAO,IAAA,IAAQ,eAAA,CAAgB,IAAI,KAAK,CAAA,CAAA;AAE/E,EAAA,IAAI,aAAA,IAAiB,CAAC,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjD,IAAA,GAAA;AAAA,MACC,MAAA;AAAA,MACA,oCAAoC,KAAK,CAAA,2DAAA;AAAA,KAC1C;AAAA,EACD;AAEA,EAAA,MAAM,aAAa,aAAA,IAAiB,eAAA,CAAgB,GAAA,CAAI,KAAK,KAAK,CAAC,iBAAA;AAEnE,EAAA,MAAM,UAAU,UAAA,GAAa,QAAA,CAAS,WAAA,EAAa,UAAA,EAAY,KAAK,CAAA,GAAI,WAAA;AAExE,EAAA,IAAI,SAAA,GAAY,QAAQ,GAAA,EAAI;AAE5B,EAAA,IAAI,YAAA,GAAe,KAAA;AAGnB,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAA6B;AACvD,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAgC;AAGnD,EAAA,IAAI,QAAA,GAAW,QAAQ,OAAA,EAAQ;AAG/B,EAAA,IAAI,iBAAA;AAEJ,EAAA,MAAM,UAAA,GAAa,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACjD,IAAA,iBAAA,GAAoB,OAAA;AAAA,EACrB,CAAC,CAAA;AAGD,EAAA,IAAI,SAAA;AAGJ,EAAA,IAAI,SAAA,IAAa,CAAC,QAAA,EAAS,EAAG;AAC7B,IAAA,SAAA,GAAY,eAAe,MAAM;AAChC,MAAA,IAAI;AACH,QAAA,MAAM,WAAA,GAAc,cAAA,CAAe,GAAA,EAAK,KAAA,EAAO,OAAO,CAAA;AAEtD,QAAA,MAAM,WAAA,GAAc,YAAY,GAAA,EAAI;AAEpC,QAAA,MAAM,WAAA,GAAc,YAAA;AACpB,QAAA,MAAM,WAAA,GAAc,WAAA;AAEpB,QAAA,IAAI,KAAK,SAAA,CAAU,WAAW,MAAM,IAAA,CAAK,SAAA,CAAU,YAAY,CAAA,EAAG;AACjE,UAAA,QAAA,CAAS,IAAI,WAAW,CAAA;AAAA,QACzB;AAEA,QAAA,MAAA,CAAO,YAAY,EAAE,GAAA,EAAK,KAAA,EAAO,WAAA,EAAa,aAAa,CAAA;AAAA,MAC5D,SAAS,GAAA,EAAK;AACb,QAAA,GAAA,CAAI,OAAA,EAAS,CAAA,yCAAA,EAA4C,GAAG,CAAA,gCAAA,CAA6B,CAAA;AACzF,QAAA,WAAA,CAAY,GAAA,EAAK,OAAO,GAAG,CAAA;AAAA,MAC5B;AAAA,IACD,CAAC,CAAA;AAAA,EACF,CAAA,MAAO;AACN,IAAA,SAAA,GAAY,QAAQ,OAAA,EAAQ;AAAA,EAC7B;AAEA,EAAA,MAAM,QAAA,GAA4B;AAAA,IACjC,GAAA,GAAM;AACL,MAAA,OAAO,YAAA,GAAe,SAAA,GAAY,OAAA,CAAQ,GAAA,EAAI;AAAA,IAC/C,CAAA;AAAA,IAEA,IAAA,GAAO;AACN,MAAA,OAAO,YAAA,GAAe,SAAA,GAAY,OAAA,CAAQ,GAAA,EAAI;AAAA,IAC/C,CAAA;AAAA,IAEA,IAAI,cAAA,EAAgB;AACnB,MAAA,IAAI,YAAA,EAAc;AAElB,MAAA,MAAM,IAAA,GAAO,QAAQ,GAAA,EAAI;AAEzB,MAAA,IAAI,OACH,OAAO,cAAA,KAAmB,UAAA,GACtB,cAAA,CAAkC,IAAI,CAAA,GACvC,cAAA;AAEJ,MAAA,KAAA,MAAW,eAAe,aAAA,EAAe;AACxC,QAAA,IAAA,GAAO,WAAA,CAAY,MAAM,IAAI,CAAA;AAAA,MAC9B;AAEA,MAAA,SAAA,GAAY,IAAA;AAEZ,MAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAGhB,MAAA,QAAA,GAAW,OAAA,CAAQ,KAAA;AAEnB,MAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AAC1B,QAAA,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MAChB;AAAA,IACD,CAAA;AAAA,IAEA,UAAU,QAAA,EAAU;AACnB,MAAA,OAAO,OAAA,CAAQ,UAAU,QAAQ,CAAA;AAAA,IAClC,CAAA;AAAA,IAEA,KAAA,GAAQ;AACP,MAAA,IAAI,YAAA,EAAc;AAElB,MAAA,MAAM,IAAA,GAAO,QAAQ,GAAA,EAAI;AAEzB,MAAA,IAAI,IAAA,GAAO,YAAA;AAEX,MAAA,KAAA,MAAW,eAAe,aAAA,EAAe;AACxC,QAAA,IAAA,GAAO,WAAA,CAAY,MAAM,IAAI,CAAA;AAAA,MAC9B;AAEA,MAAA,SAAA,GAAY,IAAA;AAEZ,MAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAEhB,MAAA,QAAA,GAAW,OAAA,CAAQ,KAAA;AAEnB,MAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AAC1B,QAAA,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MAChB;AAAA,IACD,CAAA;AAAA,IAEA,IAAI,KAAA,GAAQ;AACX,MAAA,OAAO,OAAA,CAAQ,KAAA;AAAA,IAChB,CAAA;AAAA,IAEA,IAAI,OAAA,GAAU;AACb,MAAA,OAAO,QAAA;AAAA,IACR,CAAA;AAAA,IAEA,IAAI,QAAA,GAAW;AACd,MAAA,OAAO,SAAA;AAAA,IACR,CAAA;AAAA,IAEA,IAAI,SAAA,GAAY;AACf,MAAA,OAAO,UAAA;AAAA,IACR,CAAA;AAAA,IAEA,IAAI,KAAA,GAAQ;AACX,MAAA,OAAO,KAAA;AAAA,IACR,CAAA;AAAA,IAEA,IAAI,GAAA,GAAM;AACT,MAAA,OAAO,GAAA;AAAA,IACR,CAAA;AAAA,IAEA,IAAI,WAAA,GAAc;AACjB,MAAA,OAAO,YAAA;AAAA,IACR,CAAA;AAAA,IAEA,UAAU,EAAA,EAAI;AACb,MAAA,aAAA,CAAc,IAAI,EAAE,CAAA;AAEpB,MAAA,OAAO,MAAM;AACZ,QAAA,aAAA,CAAc,OAAO,EAAE,CAAA;AAAA,MACxB,CAAA;AAAA,IACD,CAAA;AAAA,IAEA,IAAI,EAAA,EAAI;AACP,MAAA,MAAA,CAAO,IAAI,EAAE,CAAA;AAEb,MAAA,OAAO,MAAM;AACZ,QAAA,MAAA,CAAO,OAAO,EAAE,CAAA;AAAA,MACjB,CAAA;AAAA,IACD,CAAA;AAAA,IAEA,OAAA,GAAU;AACT,MAAA,IAAI,YAAA,EAAc;AAElB,MAAA,SAAA,GAAY,QAAQ,GAAA,EAAI;AAExB,MAAA,YAAA,GAAe,IAAA;AAEf,MAAA,aAAA,CAAc,KAAA,EAAM;AACpB,MAAA,MAAA,CAAO,KAAA,EAAM;AAEb,MAAA,OAAA,CAAQ,OAAA,IAAU;AAElB,MAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AAErB,MAAA,MAAA,CAAO,SAAA,GAAY,EAAE,GAAA,EAAK,KAAA,EAAO,CAAA;AAEjC,MAAA,iBAAA,EAAkB;AAAA,IACnB;AAAA,GACD;AAEA,EAAA,QAAA,CAAS,GAAA,EAAK,OAAO,QAAQ,CAAA;AAE7B,EAAA,OAAO,QAAA;AACR;;;AC7OO,SAAS,UAAA,CAAc,KAAa,OAAA,EAAmD;AAC7F,EAAA,MAAM,IAAA,GAA0B,UAAA,CAAW,GAAA,EAAK,OAAO,CAAA;AAGvD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAqC;AAE1D,EAAA,IAAI,SAAA,GAAY,KAAK,GAAA,EAAI;AAEzB,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,CAAC,IAAA,KAAS;AAC5C,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACxB,MAAA,SAAA,GAAY,IAAA;AAEZ,MAAA;AAAA,IACD;AAEA,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,SAAS,CAAA,IAAK,QAAA,EAAU;AAE7C,MAAA,MAAM,UAAA,GAAa,CAAC,IAAA,EAAeC,KAAAA,KAA2B;AAC7D,QAAA,IAAI,CAAC,QAAQ,CAACA,KAAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,OAAOA,KAAAA,KAAS,QAAA,EAAU;AAC3E,UAAA,OAAO,KAAA;AAAA,QACR;AAEA,QAAA,MAAM,CAAA,GAAI,IAAA;AACV,QAAA,MAAM,CAAA,GAAIA,KAAAA;AAEV,QAAA,OAAO,CAAC,OAAO,EAAA,CAAG,CAAA,CAAE,QAAQ,CAAA,EAAG,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA,MAC3C,CAAA;AAEA,MAAA,MAAM,UACL,IAAA,CAAK,MAAA,KAAW,UAAU,MAAA,IAC1B,IAAA,CAAK,KAAK,CAAC,IAAA,EAAM,CAAA,KAAM,CAAA,GAAI,UAAU,MAAA,IAAU,UAAA,CAAW,UAAU,CAAC,CAAA,EAAG,IAAI,CAAC,CAAA;AAE9E,MAAA,IAAI,OAAA,EAAS;AACZ,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AACjC,UAAA,QAAA,CAAS,IAAI,CAAA;AAAA,QACd;AAAA,MACD;AAAA,IACD;AAEA,IAAA,SAAA,GAAY,IAAA;AAAA,EACb,CAAC,CAAA;AAED,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAE9C,EAAA,OAAO;AAAA,IACN,GAAA,GAAW;AACV,MAAA,OAAO,KAAK,GAAA,EAAI;AAAA,IACjB,CAAA;AAAA,IAEA,IAAA,GAAY;AACX,MAAA,OAAO,KAAK,IAAA,EAAK;AAAA,IAClB,CAAA;AAAA,IAEA,IAAI,cAAA,EAAgB;AACnB,MAAA,IAAA,CAAK,IAAI,cAAc,CAAA;AAAA,IACxB,CAAA;AAAA,IAEA,UAAU,QAAA,EAAsC;AAC/C,MAAA,OAAO,IAAA,CAAK,UAAU,QAAQ,CAAA;AAAA,IAC/B,CAAA;AAAA,IAEA,KAAA,GAAQ;AACP,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACZ,CAAA;AAAA,IAEA,KAAA,CAAM,UAAU,QAAA,EAAU;AACzB,MAAA,IAAI,SAAA,GAAY,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AAErC,MAAA,IAAI,CAAC,SAAA,EAAW;AACf,QAAA,SAAA,uBAAgB,GAAA,EAAI;AAEpB,QAAA,QAAA,CAAS,GAAA,CAAI,UAAU,SAAS,CAAA;AAAA,MACjC;AAEA,MAAA,SAAA,CAAU,IAAI,QAAyB,CAAA;AAEvC,MAAA,OAAO,MAAM;AACZ,QAAA,SAAA,CAAU,OAAO,QAAyB,CAAA;AAE1C,QAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACzB,UAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AAAA,QACzB;AAAA,MACD,CAAA;AAAA,IACD,CAAA;AAAA,IAEA,OAAO,KAAA,EAAY;AAClB,MAAA,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,GAAG,KAAK,CAAC,CAAA;AAAA,IACvC,CAAA;AAAA,IAEA,MAAA,CAAO,WAAiCC,QAAAA,EAA6B;AACpE,MAAA,IAAIA,UAAS,GAAA,EAAK;AACjB,QAAA,IAAI,OAAA,GAAU,KAAA;AAEd,QAAA,IAAA,CAAK,GAAA;AAAA,UAAI,CAAC,IAAA,KACT,IAAA,CAAK,MAAA,CAAO,CAAC,IAAA,KAAS;AACrB,YAAA,IAAI,CAAC,OAAA,IAAW,SAAA,CAAU,IAAI,CAAA,EAAG;AAChC,cAAA,OAAA,GAAU,IAAA;AAEV,cAAA,OAAO,KAAA;AAAA,YACR;AAEA,YAAA,OAAO,IAAA;AAAA,UACR,CAAC;AAAA,SACF;AAAA,MACD,CAAA,MAAO;AACN,QAAA,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAAA,MAC3D;AAAA,IACD,CAAA;AAAA,IAEA,MAAA,CACC,SAAA,EACA,KAAA,EACAA,QAAAA,EACC;AACD,MAAA,MAAM,UAAA,GACL,OAAO,KAAA,KAAU,UAAA,GAAa,KAAA,GAAQ,CAAC,IAAA,MAAgB,EAAE,GAAG,IAAA,EAAM,GAAG,KAAA,EAAM,CAAA;AAE5E,MAAA,IAAIA,UAAS,GAAA,EAAK;AACjB,QAAA,IAAI,OAAA,GAAU,KAAA;AAEd,QAAA,IAAA,CAAK,GAAA;AAAA,UAAI,CAAC,IAAA,KACT,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS;AAClB,YAAA,IAAI,CAAC,OAAA,IAAW,SAAA,CAAU,IAAI,CAAA,EAAG;AAChC,cAAA,OAAA,GAAU,IAAA;AAEV,cAAA,OAAO,WAAW,IAAI,CAAA;AAAA,YACvB;AAEA,YAAA,OAAO,IAAA;AAAA,UACR,CAAC;AAAA,SACF;AAAA,MACD,CAAA,MAAO;AACN,QAAA,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAC,IAAA,KAAU,SAAA,CAAU,IAAI,CAAA,GAAI,UAAA,CAAW,IAAI,CAAA,GAAI,IAAK,CAAC,CAAA;AAAA,MACnF;AAAA,IACD,CAAA;AAAA,IAEA,KAAK,SAAA,EAAgD;AACpD,MAAA,OAAO,IAAA,CAAK,GAAA,EAAI,CAAE,IAAA,CAAK,SAAS,CAAA;AAAA,IACjC,CAAA;AAAA,IAEA,QAAQ,SAAA,EAAsC;AAC7C,MAAA,OAAO,IAAA,CAAK,GAAA,EAAI,CAAE,MAAA,CAAO,SAAS,CAAA;AAAA,IACnC,CAAA;AAAA,IAEA,IAAI,SAAA,EAA0C;AAC7C,MAAA,OAAO,IAAA,CAAK,GAAA,EAAI,CAAE,IAAA,CAAK,SAAS,CAAA;AAAA,IACjC,CAAA;AAAA,IAEA,IAAI,IAAA,GAAO;AACV,MAAA,OAAO,IAAA,CAAK,KAAI,CAAE,MAAA;AAAA,IACnB,CAAA;AAAA,IAEA,KAAA,GAAQ;AACP,MAAA,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAAA,IACZ,CAAA;AAAA,IAEA,UAAU,EAAA,EAAI;AACb,MAAA,OAAO,IAAA,CAAK,UAAU,EAAE,CAAA;AAAA,IACzB,CAAA;AAAA,IAEA,IAAI,EAAA,EAAI;AACP,MAAA,OAAO,IAAA,CAAK,IAAI,EAAE,CAAA;AAAA,IACnB,CAAA;AAAA,IAEA,IAAI,KAAA,GAAQ;AACX,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACb,CAAA;AAAA,IAEA,IAAI,GAAA,GAAM;AACT,MAAA,OAAO,IAAA,CAAK,GAAA;AAAA,IACb,CAAA;AAAA,IAEA,IAAI,WAAA,GAAc;AACjB,MAAA,OAAO,IAAA,CAAK,WAAA;AAAA,IACb,CAAA;AAAA,IAEA,IAAI,KAAA,GAAQ;AACX,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACb,CAAA;AAAA,IAEA,IAAI,OAAA,GAAU;AACb,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,IACb,CAAA;AAAA,IAEA,IAAI,QAAA,GAAW;AACd,MAAA,OAAO,IAAA,CAAK,QAAA;AAAA,IACb,CAAA;AAAA,IAEA,IAAI,SAAA,GAAY;AACf,MAAA,OAAO,IAAA,CAAK,SAAA;AAAA,IACb,CAAA;AAAA,IAEA,OAAA,GAAU;AACT,MAAA,QAAA,CAAS,KAAA,EAAM;AAEf,MAAA,WAAA,EAAY;AAEZ,MAAA,eAAA,EAAgB;AAAA,IACjB;AAAA,GACD;AACD;;;AC7OO,SAAS,QAAA,CACf,MACA,EAAA,EAC4B;AAC5B,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAuB;AAE7C,EAAA,IAAI,MAAA;AAEJ,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,IAAI,WAAA,GAAc,KAAA;AAElB,EAAA,SAAS,YAAA,GAAiC;AACzC,IAAA,OAAO,KAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,EACnC;AAEA,EAAA,SAAS,SAAA,GAAqB;AAC7B,IAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AAErB,IAAA,MAAA,GAAS,EAAA,CAAG,cAAc,CAAA;AAC1B,IAAA,OAAA,GAAU,KAAA;AAEV,IAAA,OAAO,MAAA;AAAA,EACR;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC7B,IAAA,MAAM,QAAQ,SAAA,EAAU;AAExB,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AACjC,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IACf;AAAA,EACD,CAAA;AAEA,EAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA;AAAA,IAAI,CAAC,GAAA,KAC/B,GAAA,CAAI,SAAA,CAAU,MAAM;AACnB,MAAA,OAAA,GAAU,IAAA;AAEV,MAAA,MAAA,CAAO,eAAe,CAAA;AAAA,IACvB,CAAC;AAAA,GACF;AAGA,EAAA,SAAA,EAAU;AAEV,EAAA,IAAI,gBAAA;AAEJ,EAAA,MAAM,gBAAA,GAAmB,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACvD,IAAA,gBAAA,GAAmB,OAAA;AAAA,EACpB,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACN,GAAA,EAAK,EAAA;AAAA,IACL,KAAA,EAAO,QAAA;AAAA,IAEP,IAAI,KAAA,GAAuB;AAC1B,MAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAC,CAAA,CAAE,IAAA,CAAK,MAAM,MAAS,CAAA;AAAA,IAClE,CAAA;AAAA,IAEA,IAAI,OAAA,GAAyB;AAC5B,MAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAC,CAAA,CAAE,IAAA,CAAK,MAAM,MAAS,CAAA;AAAA,IACpE,CAAA;AAAA,IAEA,IAAI,QAAA,GAA0B;AAC7B,MAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAE,IAAA,CAAK,MAAM,MAAS,CAAA;AAAA,IACrE,CAAA;AAAA,IAEA,IAAI,SAAA,GAA2B;AAC9B,MAAA,OAAO,gBAAA;AAAA,IACR,CAAA;AAAA,IAEA,IAAI,WAAA,GAAc;AACjB,MAAA,OAAO,WAAA;AAAA,IACR,CAAA;AAAA,IAEA,GAAA,GAAM;AACL,MAAA,OAAO,SAAA,EAAU;AAAA,IAClB,CAAA;AAAA,IAEA,IAAA,GAAO;AACN,MAAA,OAAO,SAAA,EAAU;AAAA,IAClB,CAAA;AAAA,IAEA,UAAU,QAAA,EAA0C;AACnD,MAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AAEtB,MAAA,OAAO,MAAM;AACZ,QAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,MAC1B,CAAA;AAAA,IACD,CAAA;AAAA,IAEA,OAAA,GAAU;AACT,MAAA,IAAI,WAAA,EAAa;AAEjB,MAAA,WAAA,GAAc,IAAA;AAEd,MAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AAClC,QAAA,KAAA,EAAM;AAAA,MACP;AAEA,MAAA,SAAA,CAAU,KAAA,EAAM;AAEhB,MAAA,gBAAA,EAAiB;AAAA,IAClB;AAAA,GACD;AACD;;;ACpGO,SAAS,MAAA,CACf,MACA,EAAA,EACe;AACf,EAAA,IAAI,OAAA;AAEJ,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,SAAS,YAAA,GAAiC;AACzC,IAAA,OAAO,KAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,EACnC;AAEA,EAAA,SAAS,GAAA,GAAY;AACpB,IAAA,IAAI,SAAA,EAAW;AAGf,IAAA,IAAI,OAAA,EAAS;AACZ,MAAA,OAAA,EAAQ;AACR,MAAA,OAAA,GAAU,MAAA;AAAA,IACX;AAEA,IAAA,OAAA,GAAU,EAAA,CAAG,cAAc,CAAA;AAAA,EAC5B;AAGA,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAI,SAAA,CAAU,MAAM,GAAA,EAAK,CAAC,CAAA;AAGlE,EAAA,GAAA,EAAI;AAEJ,EAAA,OAAO;AAAA,IACN,IAAA,GAAO;AACN,MAAA,IAAI,SAAA,EAAW;AAEf,MAAA,SAAA,GAAY,IAAA;AAEZ,MAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AAClC,QAAA,KAAA,EAAM;AAAA,MACP;AAEA,MAAA,IAAI,OAAA,EAAS;AACZ,QAAA,OAAA,EAAQ;AACR,QAAA,OAAA,GAAU,MAAA;AAAA,MACX;AAAA,IACD;AAAA,GACD;AACD;;;ACvEO,SAAS,UACf,QAAA,EACmE;AAGnE,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAyC;AAE9D,EAAA,IAAI,IAAA,GAAO,SAAS,GAAA,EAAI;AAExB,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,SAAA,CAAU,CAAC,IAAA,KAAS;AAChD,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACxB,MAAA,IAAA,GAAO,IAAA;AAEP,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AAC9C,MAAA,IAAA,GAAO,IAAA;AAEP,MAAA;AAAA,IACD;AAEA,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,SAAS,CAAA,IAAK,QAAA,EAAU;AAC7C,MAAA,MAAM,OAAA,GACL,SAAS,IAAA,IAAQ,OAAO,SAAS,QAAA,GAC7B,IAAA,CAAsC,QAAQ,CAAA,GAC/C,MAAA;AAEJ,MAAA,MAAM,OAAA,GAAW,KAAsC,QAAQ,CAAA;AAE/D,MAAA,IAAI,CAAC,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,OAAO,CAAA,EAAG;AACjC,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AACjC,UAAA,QAAA,CAAS,OAAO,CAAA;AAAA,QACjB;AAAA,MACD;AAAA,IACD;AAEA,IAAA,IAAA,GAAO,IAAA;AAAA,EACR,CAAC,CAAA;AAED,EAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA;AAEtD,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;AAErC,EAAA,MAAA,CAAO,KAAA,GAAQ,CAAC,QAAA,EAAuB,QAAA,KAAgC;AACtE,IAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC5B,MAAA,QAAA,CAAS,GAAA,CAAI,QAAA,kBAAU,IAAI,GAAA,EAAK,CAAA;AAAA,IACjC;AAEA,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AAEvC,IAAA,IAAI,CAAC,SAAA,EAAW,OAAO,MAAM;AAAA,IAAC,CAAA;AAE9B,IAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AAEtB,IAAA,OAAO,MAAM;AACZ,MAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AAEzB,MAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACzB,QAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AAAA,MACzB;AAAA,IACD,CAAA;AAAA,EACD,CAAA;AAEA,EAAA,MAAA,CAAO,UAAU,MAAM;AACtB,IAAA,QAAA,CAAS,KAAA,EAAM;AACf,IAAA,WAAA,EAAY;AACZ,IAAA,eAAA,EAAgB;AAAA,EACjB,CAAA;AAEA,EAAA,OAAO,MAAA;AACR;;;AC9EA,IAAM,aAAA,uBAAoB,GAAA,EAA4B;AAc/C,SAAS,KAAA,CAAS,KAAa,OAAA,EAA4C;AACjF,EAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,MAAA,CAAO,YAAA,IAAgB,QAAA;AAEtD,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,GAAA,EAAK,KAAK,CAAA;AAE/B,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,EAAE,CAAA;AAEnC,EAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,WAAA,EAAa;AAClC,IAAA,IAAI,OAAO,eAAA,EAAiB;AAC3B,MAAA,GAAA,CAAI,MAAA,EAAQ,CAAA,iBAAA,EAAoB,GAAG,CAAA,eAAA,EAAkB,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAAA,IAC1F;AAEA,IAAA,OAAO,MAAA;AAAA,EACR;AAEA,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,EAAK,OAAO,CAAA;AAEpC,EAAA,MAAM,QAAA,GAAW,UAAU,IAAI,CAAA;AAE/B,EAAA,aAAA,CAAc,GAAA,CAAI,IAAI,QAAQ,CAAA;AAE9B,EAAA,OAAO,QAAA;AACR","file":"chunk-GGB5QBDR.cjs","sourcesContent":["type Notification = () => void\n\nlet depth = 0\n\nconst queue = new Set<Notification>()\n\n/**\n * Runs all state updates inside fn as a single batch.\n * Subscribers are notified once after all updates complete,\n * rather than once per individual update.\n *\n * Nested batch() calls are safe — notifications flush only\n * when the outermost batch completes.\n *\n * ```ts\n * batch(() => {\n * firstName.set('John')\n * lastName.set('Doe')\n * age.set(30)\n * })\n * // subscribers fire once, not three times\n * ```\n */\nexport function batch(fn: () => void): void {\n\tdepth++\n\n\ttry {\n\t\tfn()\n\t} finally {\n\t\tdepth--\n\n\t\tif (depth === 0) flush()\n\t}\n}\n\n/**\n * Enqueue a notification to fire after the current batch completes.\n * If not currently batching, fires immediately.\n */\nexport function notify(fn: Notification): void {\n\tif (depth > 0) {\n\t\tqueue.add(fn)\n\n\t\treturn\n\t}\n\n\tfn()\n}\n\nfunction flush(): void {\n\twhile (queue.size > 0) {\n\t\tconst pending = new Set(queue)\n\n\t\tqueue.clear()\n\n\t\tdepth++\n\n\t\ttry {\n\t\t\tfor (const notification of pending) {\n\t\t\t\tnotification()\n\t\t\t}\n\t\t} finally {\n\t\t\tdepth--\n\t\t}\n\t}\n}\n","import { AsyncLocalStorage } from 'node:async_hooks'\nimport { notify } from '../batch.js'\nimport type { Adapter, Listener, Unsubscribe } from '../types.js'\n\nconst als = new AsyncLocalStorage<Map<string, unknown>>()\n\nexport async function withServerSession<T>(fn: () => T): Promise<T> {\n\tconst store = new Map<string, unknown>()\n\n\treturn als.run(store, fn)\n}\n\nexport function createServerAdapter<T>(key: string, defaultValue: T): Adapter<T> {\n\tconst listeners = new Set<Listener<T>>()\n\n\tfunction getStore(): Map<string, unknown> | undefined {\n\t\treturn als.getStore()\n\t}\n\n\tlet lastNotifiedValue: T = defaultValue\n\n\tconst notifyListeners = () => {\n\t\tfor (const listener of listeners) {\n\t\t\tlistener(lastNotifiedValue)\n\t\t}\n\t}\n\n\treturn {\n\t\tready: Promise.resolve(),\n\n\t\tget() {\n\t\t\tconst store = getStore()\n\n\t\t\tif (!store) return defaultValue\n\n\t\t\treturn store.has(key) ? (store.get(key) as T) : defaultValue\n\t\t},\n\n\t\tset(value) {\n\t\t\tconst store = getStore()\n\n\t\t\tif (!store) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'[state] Cannot set server-scoped state outside of a server session. ' +\n\t\t\t\t\t\t'Wrap your request handler with withServerSession().',\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tstore.set(key, value)\n\n\t\t\tlastNotifiedValue = value\n\n\t\t\tnotify(notifyListeners)\n\t\t},\n\n\t\tsubscribe(listener: Listener<T>): Unsubscribe {\n\t\t\tlisteners.add(listener)\n\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener)\n\t\t\t}\n\t\t},\n\n\t\tdestroy() {\n\t\t\tlisteners.clear()\n\t\t},\n\t}\n}\n","import type { Scope } from './types.js'\n\nexport type LogLevel = 'silent' | 'warn' | 'error' | 'debug'\n\nexport interface ErrorContext {\n\tkey: string\n\tscope: Scope\n\terror: unknown\n}\n\nexport interface DestroyContext {\n\tkey: string\n\tscope: Scope\n}\n\nexport interface MigrateContext {\n\tkey: string\n\tscope: Scope\n\tfromVersion: number\n\ttoVersion: number\n\tdata: unknown\n}\n\nexport interface QuotaExceededContext {\n\tkey: string\n\tscope: Scope\n\terror: unknown\n}\n\nexport interface HydrateContext {\n\tkey: string\n\tscope: Scope\n\tserverValue: unknown\n\tclientValue: unknown\n}\n\nexport interface SyncContext {\n\tkey: string\n\tscope: Scope\n\tvalue: unknown\n\tsource: 'remote'\n}\n\nexport interface RegisterContext {\n\tkey: string\n\tscope: Scope\n}\n\nexport interface SteadConfig {\n\t/** Default scope for all state instances. Defaults to `'render'`. */\n\tdefaultScope?: Scope | undefined\n\n\t/** Enforce a naming pattern for state keys. */\n\tkeyPattern?: RegExp | undefined\n\n\t/** Control log verbosity for internal warnings and errors. Defaults to `'warn'`. */\n\tlogLevel?: LogLevel | undefined\n\n\t/** Cap the total number of registered state instances. */\n\tmaxKeys?: number | undefined\n\n\t/** Prepends to all storage keys (e.g. `myapp:theme`) */\n\tprefix?: string | undefined\n\n\t/** Require a validate option for persisted scopes (local, tab, bucket). */\n\trequireValidation?: boolean | undefined\n\n\t/** Enable SSR mode globally for all instances. */\n\tssr?: boolean | undefined\n\n\t/** Enable cross-tab sync globally for all syncable scopes. */\n\tsync?: boolean | undefined\n\n\t/** Warn when two state() calls use the same key + scope. */\n\twarnOnDuplicate?: boolean | undefined\n\n\t/** Fires when any instance is destroyed. */\n\tonDestroy?: ((context: DestroyContext) => void) | undefined\n\n\t/** Global error handler for storage/migration/validation failures. */\n\tonError?: ((context: ErrorContext) => void) | undefined\n\n\t/** Fires after SSR hydration completes for an instance. */\n\tonHydrate?: ((context: HydrateContext) => void) | undefined\n\n\t/** Fires after a migration chain runs during read. */\n\tonMigrate?: ((context: MigrateContext) => void) | undefined\n\n\t/** Fires when a storage write fails due to quota. */\n\tonQuotaExceeded?: ((context: QuotaExceededContext) => void) | undefined\n\n\t/** Fires when a new state instance is registered. */\n\tonRegister?: ((context: RegisterContext) => void) | undefined\n\n\t/** Fires when a cross-tab sync event updates a value. */\n\tonSync?: ((context: SyncContext) => void) | undefined\n}\n\nlet globalConfig: SteadConfig = {}\n\nexport function configure(config: SteadConfig): void {\n\tglobalConfig = { ...globalConfig, ...config }\n}\n\nexport function getConfig(): Readonly<SteadConfig> {\n\treturn globalConfig\n}\n\n/**\n * Internal logger that respects the configured log level.\n */\nexport function log(level: 'warn' | 'error' | 'debug', message: string): void {\n\tconst configLevel = globalConfig.logLevel ?? 'warn'\n\n\tif (configLevel === 'silent') return\n\n\tconst priority = { debug: 0, warn: 1, error: 2 }\n\n\tif (priority[level] >= priority[configLevel]) {\n\t\tconsole[level](`[stead] ${message}`)\n\t}\n}\n\n/**\n * Internal error reporter that calls the global onError handler if configured.\n */\nexport function reportError(key: string, scope: Scope, error: unknown): void {\n\tglobalConfig.onError?.({ key, scope, error })\n}\n","import { getConfig, log } from './config.js'\nimport type { Scope, StateOptions, VersionedValue } from './types.js'\n\n/**\n * Given a raw string from storage, run the full pipeline:\n * 1. JSON parse\n * 2. Unwrap versioned envelope (if present)\n * 3. Run migration chain up to current version\n * 4. Validate final shape\n * 5. Return typed value or default\n */\nexport function readAndMigrate<T>(\n\traw: string,\n\toptions: StateOptions<T>,\n\tkey?: string,\n\tscope?: Scope,\n): T {\n\tconst currentVersion = options.version ?? 1\n\n\tconst defaultValue = options.default\n\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(raw)\n\n\t\t// Detect versioned envelope — { v: number, data: unknown }\n\t\tlet storedVersion = 1\n\n\t\tlet data: unknown\n\n\t\tfunction isVersionedValue(value: unknown): value is VersionedValue<unknown> {\n\t\t\tconst hasShape =\n\t\t\t\tvalue !== null && typeof value === 'object' && 'v' in value && 'data' in value\n\n\t\t\treturn hasShape && typeof (value as VersionedValue<unknown>).v === 'number'\n\t\t}\n\n\t\tif (isVersionedValue(parsed)) {\n\t\t\tstoredVersion = parsed.v\n\n\t\t\tdata = parsed.data\n\t\t} else {\n\t\t\t// Legacy value with no version envelope — treat as version 1\n\t\t\tstoredVersion = 1\n\n\t\t\tdata = parsed\n\t\t}\n\n\t\t// Run migration chain if behind current version\n\t\tif (storedVersion < currentVersion && options.migrate) {\n\t\t\tdata = runMigrations(data, storedVersion, currentVersion, options.migrate)\n\n\t\t\tif (key && scope) {\n\t\t\t\tgetConfig().onMigrate?.({\n\t\t\t\t\tkey,\n\t\t\t\t\tscope,\n\t\t\t\t\tfromVersion: storedVersion,\n\t\t\t\t\ttoVersion: currentVersion,\n\t\t\t\t\tdata,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// Validate final shape\n\t\tif (options.validate && !options.validate(data)) {\n\t\t\treturn defaultValue\n\t\t}\n\n\t\treturn data as T\n\t} catch {\n\t\tlog('debug', `Failed to read/migrate stored value — falling back to default.`)\n\t\treturn defaultValue\n\t}\n}\n\n/**\n * Wrap a value in a versioned envelope before writing to storage.\n * If no version is specified, writes the raw value for backwards compat.\n */\nexport function wrapForStorage<T>(value: T, version?: number): string {\n\tif (!version || version === 1) {\n\t\treturn JSON.stringify(value)\n\t}\n\n\tconst envelope: VersionedValue<T> = { v: version, data: value }\n\n\treturn JSON.stringify(envelope)\n}\n\n// ---------------------------------------------------------------------------\n// Partial persistence helpers (pick / merge)\n// ---------------------------------------------------------------------------\n\n/**\n * Pick only the specified keys from an object value before writing to storage.\n * Returns the value unchanged when `keys` is undefined or the value is not an object.\n */\nexport function pickKeys<T>(value: T, keys: string[] | undefined): T {\n\tif (!keys || typeof value !== 'object' || value === null) return value\n\n\tconst partial: Record<string, unknown> = {}\n\n\tfor (const k of keys) {\n\t\tif (k in (value as Record<string, unknown>)) {\n\t\t\tpartial[k] = (value as Record<string, unknown>)[k]\n\t\t}\n\t}\n\n\treturn partial as T\n}\n\n/**\n * Merge stored (partial) keys back onto the full default value.\n * Returns the stored value unchanged when `keys` is undefined or the value is not an object.\n */\nexport function mergeKeys<T>(stored: T, defaultValue: T, keys: string[] | undefined): T {\n\tif (!keys || typeof stored !== 'object' || stored === null) return stored\n\n\treturn { ...(defaultValue as object), ...(stored as object) } as T\n}\n\n// ---------------------------------------------------------------------------\n// Migrations\n// ---------------------------------------------------------------------------\n\n/**\n * Run the migration chain from storedVersion up to currentVersion.\n * Each migration function transforms the value one version at a time.\n */\nfunction runMigrations(\n\tdata: unknown,\n\tfromVersion: number,\n\ttoVersion: number,\n\tmigrations: Record<number, (old: unknown) => unknown>,\n): unknown {\n\tlet current = data\n\n\tfor (let v = fromVersion; v < toVersion; v++) {\n\t\tconst migrateFn = migrations[v]\n\n\t\tif (migrateFn) {\n\t\t\ttry {\n\t\t\t\tcurrent = migrateFn(current)\n\t\t\t} catch {\n\t\t\t\tlog('warn', `Migration from v${v} failed — returning partially migrated value.`)\n\t\t\t\treturn current\n\t\t\t}\n\t\t}\n\t}\n\n\treturn current\n}\n","import { notify } from '../batch.js'\nimport { getConfig, log } from '../config.js'\nimport { mergeKeys, pickKeys, readAndMigrate, wrapForStorage } from '../persist.js'\nimport type { Adapter, Listener, StateOptions, Unsubscribe } from '../types.js'\n\nexport function createStorageAdapter<T>(\n\tstorage: Storage,\n\tkey: string,\n\toptions: StateOptions<T>,\n): Adapter<T> {\n\tconst { default: defaultValue, version, serialize, persist } = options\n\n\tconst listeners = new Set<Listener<T>>()\n\n\tfunction read(): T {\n\t\ttry {\n\t\t\tconst raw = storage.getItem(key)\n\n\t\t\tif (raw === null) return defaultValue\n\n\t\t\tlet value: T\n\n\t\t\tif (serialize) {\n\t\t\t\ttry {\n\t\t\t\t\tvalue = serialize.parse(raw)\n\t\t\t\t} catch {\n\t\t\t\t\treturn defaultValue\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvalue = readAndMigrate(raw, options, key, options.scope)\n\t\t\t}\n\n\t\t\treturn mergeKeys(value, defaultValue, persist)\n\t\t} catch {\n\t\t\treturn defaultValue\n\t\t}\n\t}\n\n\tfunction write(value: T): void {\n\t\ttry {\n\t\t\tconst toStore = pickKeys(value, persist)\n\n\t\t\tconst raw = serialize ? serialize.stringify(toStore) : wrapForStorage(toStore, version)\n\n\t\t\tstorage.setItem(key, raw)\n\t\t} catch (e) {\n\t\t\tlog(\n\t\t\t\t'error',\n\t\t\t\t`Failed to write key \"${key}\" to storage: ${e instanceof Error ? e.message : String(e)}`,\n\t\t\t)\n\n\t\t\tconst isQuotaError =\n\t\t\t\te instanceof DOMException && (e.name === 'QuotaExceededError' || e.code === 22)\n\n\t\t\tif (isQuotaError && options.scope) {\n\t\t\t\tgetConfig().onQuotaExceeded?.({ key, scope: options.scope, error: e })\n\t\t\t}\n\t\t}\n\t}\n\n\tlet lastNotifiedValue: T = defaultValue\n\n\tconst notifyListeners = () => {\n\t\tfor (const listener of listeners) {\n\t\t\tlistener(lastNotifiedValue)\n\t\t}\n\t}\n\n\tfunction onStorageEvent(event: StorageEvent): void {\n\t\tif (event.storageArea !== storage || event.key !== key) return\n\n\t\tlastNotifiedValue = read()\n\n\t\tnotify(notifyListeners)\n\t}\n\n\tif (typeof window !== 'undefined') {\n\t\twindow.addEventListener('storage', onStorageEvent)\n\t}\n\n\treturn {\n\t\tready: Promise.resolve() as Promise<void>,\n\n\t\tget() {\n\t\t\treturn read()\n\t\t},\n\n\t\tset(value) {\n\t\t\twrite(value)\n\n\t\t\tlastNotifiedValue = value\n\n\t\t\tnotify(notifyListeners)\n\t\t},\n\n\t\tsubscribe(listener: Listener<T>): Unsubscribe {\n\t\t\tlisteners.add(listener)\n\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener)\n\t\t\t}\n\t\t},\n\n\t\tdestroy() {\n\t\t\tlisteners.clear()\n\n\t\t\tif (typeof window !== 'undefined') {\n\t\t\t\twindow.removeEventListener('storage', onStorageEvent)\n\t\t\t}\n\t\t},\n\t}\n}\n","import { notify } from '../batch.js'\nimport type { Adapter, BucketOptions, Listener, StateOptions, Unsubscribe } from '../types.js'\nimport { createStorageAdapter } from './storage.js'\n\n// ---------------------------------------------------------------------------\n// Storage Buckets API ambient types\n// ---------------------------------------------------------------------------\n\ninterface StorageBucket {\n\tlocalStorage(): Promise<Storage>\n}\n\ninterface StorageBucketManager {\n\topen(\n\t\tname: string,\n\t\toptions?: {\n\t\t\tpersisted?: boolean\n\t\t\tdurability?: 'strict' | 'relaxed'\n\t\t\tquota?: number\n\t\t\texpires?: number\n\t\t},\n\t): Promise<StorageBucket>\n}\n\ndeclare global {\n\tinterface Navigator {\n\t\tstorageBuckets?: StorageBucketManager\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isBucketSupported(): boolean {\n\treturn (\n\t\ttypeof navigator !== 'undefined' &&\n\t\t'storageBuckets' in navigator &&\n\t\tnavigator.storageBuckets != null\n\t)\n}\n\nfunction parseExpiry(expires: string | number): number | undefined {\n\tif (typeof expires === 'number') return expires\n\n\tconst units: Record<string, number> = {\n\t\tms: 1,\n\t\ts: 1_000,\n\t\tm: 60_000,\n\t\th: 3_600_000,\n\t\td: 86_400_000,\n\t\tw: 604_800_000,\n\t}\n\n\tconst match = expires.match(/^(\\d+(?:\\.\\d+)?)(ms|s|m|h|d|w)$/)\n\n\tif (!match || !match[1] || !match[2]) return undefined\n\n\tconst value = parseFloat(match[1])\n\n\tconst unit = units[match[2]]\n\n\tif (!unit) return undefined\n\n\treturn Date.now() + value * unit\n}\n\nfunction parseQuota(quota: string | number): number | undefined {\n\tif (typeof quota === 'number') return quota\n\n\tconst units: Record<string, number> = {\n\t\tb: 1,\n\t\tkb: 1_024,\n\t\tmb: 1_048_576,\n\t\tgb: 1_073_741_824,\n\t}\n\n\tconst match = quota.toLowerCase().match(/^(\\d+(?:\\.\\d+)?)(b|kb|mb|gb)$/)\n\n\tif (!match || !match[1] || !match[2]) return undefined\n\n\tconst value = parseFloat(match[1])\n\n\tconst unit = units[match[2]]\n\n\tif (!unit) return undefined\n\n\treturn Math.floor(value * unit)\n}\n\n// ---------------------------------------------------------------------------\n// Bucket adapter\n// ---------------------------------------------------------------------------\n\nexport function createBucketAdapter<T>(\n\tkey: string,\n\tbucketOptions: BucketOptions,\n\toptions: StateOptions<T>,\n): Adapter<T> {\n\tconst { default: defaultValue } = options\n\tconst fallbackScope = bucketOptions.fallback ?? 'local'\n\n\tconst listeners = new Set<Listener<T>>()\n\n\tlet lastNotifiedValue: T = defaultValue\n\n\tconst notifyListeners = () => {\n\t\tfor (const listener of listeners) {\n\t\t\tlistener(lastNotifiedValue)\n\t\t}\n\t}\n\n\t// Storage delegate — starts as null, set after ready resolves\n\tlet delegate: Adapter<T> | null = null\n\tlet isDestroyed = false\n\n\tfunction read(): T {\n\t\tif (!delegate) return defaultValue\n\n\t\treturn delegate.get()\n\t}\n\n\tfunction write(value: T): void {\n\t\tif (!delegate) return\n\n\t\tdelegate.set(value)\n\t}\n\n\t// ---------------------------------------------------------------------------\n\t// Initialization — open the bucket or fall back gracefully\n\t// ---------------------------------------------------------------------------\n\n\tconst ready = (async (): Promise<void> => {\n\t\ttry {\n\t\t\tif (!isBucketSupported()) {\n\t\t\t\tthrow new Error('Storage Buckets not supported')\n\t\t\t}\n\n\t\t\tconst openOptions: Parameters<StorageBucketManager['open']>[1] = {\n\t\t\t\tpersisted: bucketOptions.persisted ?? false,\n\t\t\t\tdurability: 'strict',\n\t\t\t}\n\n\t\t\tif (bucketOptions.expires != null) {\n\t\t\t\tconst parsed = parseExpiry(bucketOptions.expires)\n\n\t\t\t\tif (parsed != null) {\n\t\t\t\t\topenOptions.expires = parsed\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[state] Invalid bucket expires format: \"${bucketOptions.expires}\". ` +\n\t\t\t\t\t\t\t'Expected a number or a string like \"7d\", \"24h\", \"30m\".',\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (bucketOptions.quota != null) {\n\t\t\t\tconst parsed = parseQuota(bucketOptions.quota)\n\n\t\t\t\tif (parsed != null) {\n\t\t\t\t\topenOptions.quota = parsed\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[state] Invalid bucket quota format: \"${bucketOptions.quota}\". ` +\n\t\t\t\t\t\t\t'Expected a number or a string like \"10mb\", \"50kb\", \"1gb\".',\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst bucketManager = navigator.storageBuckets\n\n\t\t\tif (!bucketManager) throw new Error('Storage Buckets not supported')\n\n\t\t\tconst bucket = await bucketManager.open(bucketOptions.name, openOptions)\n\n\t\t\tconst storage = await bucket.localStorage()\n\n\t\t\tdelegate = createStorageAdapter(storage, key, options)\n\t\t} catch {\n\t\t\t// Yield to ensure get() returns default before ready resolves\n\t\t\tawait Promise.resolve()\n\n\t\t\t// Storage Buckets unavailable or failed — fall back to localStorage/sessionStorage\n\t\t\tconst fallbackStorage = fallbackScope === 'tab' ? sessionStorage : localStorage\n\n\t\t\tdelegate = createStorageAdapter(fallbackStorage, key, options)\n\t\t}\n\n\t\t// If destroyed during initialization, clean up and bail out\n\t\tif (isDestroyed) {\n\t\t\tdelegate?.destroy?.()\n\t\t\tdelegate = null\n\n\t\t\treturn\n\t\t}\n\n\t\t// Notify subscribers if the stored value differs from the default\n\t\tconst storedValue = delegate.get()\n\n\t\tif (JSON.stringify(storedValue) !== JSON.stringify(defaultValue)) {\n\t\t\tlastNotifiedValue = storedValue\n\n\t\t\tnotify(notifyListeners)\n\t\t}\n\n\t\t// Forward future storage events from the delegate to our listeners\n\t\tdelegate.subscribe((value) => {\n\t\t\tlastNotifiedValue = value\n\n\t\t\tnotify(notifyListeners)\n\t\t})\n\t})()\n\n\treturn {\n\t\tready,\n\n\t\tget() {\n\t\t\treturn read()\n\t\t},\n\n\t\tset(value) {\n\t\t\twrite(value)\n\n\t\t\tlastNotifiedValue = value\n\n\t\t\tnotify(notifyListeners)\n\t\t},\n\n\t\tsubscribe(listener: Listener<T>): Unsubscribe {\n\t\t\tlisteners.add(listener)\n\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener)\n\t\t\t}\n\t\t},\n\n\t\tdestroy() {\n\t\t\tisDestroyed = true\n\n\t\t\tlisteners.clear()\n\n\t\t\tdelegate?.destroy?.()\n\t\t\tdelegate = null\n\t\t},\n\t}\n}\n","import type { Adapter, StateOptions } from '../types.js'\nimport { createStorageAdapter } from './storage.js'\n\nexport function createLocalAdapter<T>(key: string, options: StateOptions<T>): Adapter<T> {\n\tif (typeof localStorage === 'undefined') {\n\t\tthrow new Error(\n\t\t\t'[state] localStorage is not available. Use ssr: true or scope: \"server\" for server environments.',\n\t\t)\n\t}\n\n\treturn createStorageAdapter(localStorage, key, options)\n}\n","import { notify } from '../batch.js'\nimport type { Adapter, Listener, Unsubscribe } from '../types.js'\n\nexport function createRenderAdapter<T>(defaultValue: T): Adapter<T> {\n\tlet current = defaultValue\n\n\tconst listeners = new Set<Listener<T>>()\n\n\tconst notifyListeners = () => {\n\t\tfor (const listener of listeners) {\n\t\t\tlistener(current)\n\t\t}\n\t}\n\n\treturn {\n\t\tready: Promise.resolve() as Promise<void>,\n\n\t\tget() {\n\t\t\treturn current\n\t\t},\n\n\t\tset(value) {\n\t\t\tcurrent = value\n\n\t\t\tnotify(notifyListeners)\n\t\t},\n\n\t\tsubscribe(listener: Listener<T>): Unsubscribe {\n\t\t\tlisteners.add(listener)\n\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener)\n\t\t\t}\n\t\t},\n\n\t\tdestroy() {\n\t\t\tlisteners.clear()\n\t\t},\n\t}\n}\n","import { getConfig } from '../config.js'\nimport type { Adapter, Listener, Scope, Unsubscribe } from '../types.js'\n\n/**\n * Wraps an existing adapter with BroadcastChannel support so that\n * set() calls are broadcast to — and received from — other tabs.\n */\nexport function withSync<T>(adapter: Adapter<T>, key: string, scope?: Scope): Adapter<T> {\n\tconst channelName = `state:${key}`\n\n\tconst channel = typeof BroadcastChannel !== 'undefined' ? new BroadcastChannel(channelName) : null\n\n\tconst listeners = new Set<Listener<T>>()\n\n\tadapter.subscribe((value) => {\n\t\tfor (const listener of listeners) {\n\t\t\tlistener(value)\n\t\t}\n\t})\n\n\tif (channel) {\n\t\tchannel.onmessage = (event: MessageEvent) => {\n\t\t\tif (event.data == null || typeof event.data !== 'object' || !('value' in event.data)) return\n\n\t\t\tconst value = event.data.value as T\n\n\t\t\t// Write through the underlying adapter so versioning and custom\n\t\t\t// serializers are applied consistently. The adapter subscription\n\t\t\t// (above) already notifies our listeners.\n\t\t\tadapter.set(value)\n\n\t\t\tif (scope) {\n\t\t\t\tgetConfig().onSync?.({ key, scope, value, source: 'remote' })\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tget ready() {\n\t\t\treturn adapter.ready\n\t\t},\n\n\t\tget() {\n\t\t\treturn adapter.get()\n\t\t},\n\n\t\tset(value) {\n\t\t\tadapter.set(value)\n\n\t\t\tchannel?.postMessage({ value })\n\t\t},\n\n\t\tsubscribe(listener: Listener<T>): Unsubscribe {\n\t\t\tlisteners.add(listener)\n\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener)\n\t\t\t}\n\t\t},\n\n\t\tdestroy() {\n\t\t\tlisteners.clear()\n\n\t\t\tchannel?.close()\n\n\t\t\tadapter.destroy?.()\n\t\t},\n\t}\n}\n","import type { Adapter, StateOptions } from '../types.js'\nimport { createStorageAdapter } from './storage.js'\n\nexport function createTabAdapter<T>(key: string, options: StateOptions<T>): Adapter<T> {\n\tif (typeof sessionStorage === 'undefined') {\n\t\tthrow new Error(\n\t\t\t'[state] sessionStorage is not available. Use ssr: true or scope: \"render\" for server environments.',\n\t\t)\n\t}\n\n\treturn createStorageAdapter(sessionStorage, key, options)\n}\n","import { notify } from '../batch.js'\nimport { mergeKeys, pickKeys } from '../persist.js'\nimport type { Adapter, Listener, Serializer, Unsubscribe } from '../types.js'\n\nexport function createUrlAdapter<T>(\n\tkey: string,\n\tdefaultValue: T,\n\tserializer: Serializer<T>,\n\tpersist?: string[],\n): Adapter<T> {\n\tif (typeof window === 'undefined') {\n\t\tthrow new Error('[state] URL scope is not available in this environment.')\n\t}\n\n\tconst listeners = new Set<Listener<T>>()\n\n\tfunction read(): T {\n\t\ttry {\n\t\t\tconst params = new URLSearchParams(window.location.search)\n\n\t\t\tconst raw = params.get(key)\n\n\t\t\tif (raw === null) return defaultValue\n\n\t\t\treturn mergeKeys(serializer.parse(decodeURIComponent(raw)), defaultValue, persist)\n\t\t} catch {\n\t\t\treturn defaultValue\n\t\t}\n\t}\n\n\tfunction write(value: T): void {\n\t\tconst params = new URLSearchParams(window.location.search)\n\n\t\tconst toStore = pickKeys(value, persist)\n\n\t\tconst stringified = serializer.stringify(toStore)\n\n\t\tconst isDefault = stringified === serializer.stringify(defaultValue)\n\n\t\tif (isDefault) {\n\t\t\tparams.delete(key)\n\t\t} else {\n\t\t\tparams.set(key, encodeURIComponent(stringified))\n\t\t}\n\n\t\tconst search = params.toString()\n\n\t\tconst newUrl = search\n\t\t\t? `${window.location.pathname}?${search}${window.location.hash}`\n\t\t\t: `${window.location.pathname}${window.location.hash}`\n\n\t\twindow.history.pushState(null, '', newUrl)\n\t}\n\n\tlet lastNotifiedValue: T = defaultValue\n\n\tconst notifyListeners = () => {\n\t\tfor (const listener of listeners) {\n\t\t\tlistener(lastNotifiedValue)\n\t\t}\n\t}\n\n\tfunction onPopState(): void {\n\t\tlastNotifiedValue = read()\n\n\t\tnotify(notifyListeners)\n\t}\n\n\twindow.addEventListener('popstate', onPopState)\n\n\treturn {\n\t\tready: Promise.resolve() as Promise<void>,\n\n\t\tget() {\n\t\t\treturn read()\n\t\t},\n\n\t\tset(value) {\n\t\t\twrite(value)\n\n\t\t\tlastNotifiedValue = value\n\n\t\t\tnotify(notifyListeners)\n\t\t},\n\n\t\tsubscribe(listener: Listener<T>): Unsubscribe {\n\t\t\tlisteners.add(listener)\n\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener)\n\t\t\t}\n\t\t},\n\n\t\tdestroy() {\n\t\t\tlisteners.clear()\n\n\t\t\twindow.removeEventListener('popstate', onPopState)\n\t\t},\n\t}\n}\n","import { getConfig, log } from './config.js'\nimport type { BaseInstance, Scope } from './types.js'\n\nexport function scopedKey(key: string, scope: Scope): string {\n\treturn `${scope}:${key}`\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: registry stores heterogeneous instances\nconst registry = new Map<string, BaseInstance<any>>()\n\nexport function getRegistered<T>(key: string, scope: Scope): BaseInstance<T> | undefined {\n\treturn registry.get(scopedKey(key, scope))\n}\n\nexport function register<T>(key: string, scope: Scope, instance: BaseInstance<T>): void {\n\tconst rKey = scopedKey(key, scope)\n\n\tif (registry.has(rKey)) {\n\t\tconst existing = registry.get(rKey)\n\n\t\tif (existing?.isDestroyed) {\n\t\t\tregistry.set(rKey, instance)\n\t\t} else {\n\t\t\tconst config = getConfig()\n\n\t\t\tif (config.warnOnDuplicate) {\n\t\t\t\tlog('warn', `Duplicate state(\"${key}\") with scope \"${scope}\". Returning cached instance.`)\n\t\t\t}\n\t\t}\n\n\t\treturn\n\t}\n\n\tconst config = getConfig()\n\n\tif (config.maxKeys !== undefined && registry.size >= config.maxKeys) {\n\t\tthrow new Error(\n\t\t\t`[stead] maxKeys limit (${config.maxKeys}) reached. ` +\n\t\t\t\t`Cannot register state(\"${key}\") with scope \"${scope}\".`,\n\t\t)\n\t}\n\n\tregistry.set(rKey, instance)\n\n\tconfig.onRegister?.({ key, scope })\n}\n\nexport function unregister(key: string, scope: Scope): void {\n\tregistry.delete(scopedKey(key, scope))\n}\n\nexport function getRegistry(): Map<string, BaseInstance<unknown>> {\n\treturn registry\n}\n","/**\n * True when running on the server (no window/document).\n */\nexport function isServer(): boolean {\n\treturn typeof window === 'undefined' || typeof document === 'undefined'\n}\n\n/**\n * The browser scopes that require window/localStorage/sessionStorage.\n * These will throw on the server without SSR handling.\n */\nexport const BROWSER_SCOPES = new Set(['tab', 'local', 'url', 'bucket'])\n\n/**\n * Runs a callback after the browser has hydrated.\n * On the server this is a no-op and returns an already-resolved promise.\n * On the client it runs after the current microtask queue clears,\n * giving React time to complete its hydration pass.\n *\n * Returns a promise that resolves after the callback has executed.\n */\nexport function afterHydration(fn: () => void): Promise<void> {\n\tif (isServer()) return Promise.resolve()\n\n\t// Use a microtask + rAF to ensure we're past React's hydration\n\treturn new Promise<void>((resolve) => {\n\t\tPromise.resolve().then(() => {\n\t\t\tif (typeof requestAnimationFrame !== 'undefined') {\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tfn()\n\t\t\t\t\tresolve()\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tfn()\n\t\t\t\t\tresolve()\n\t\t\t\t}, 0)\n\t\t\t}\n\t\t})\n\t})\n}\n","import { createBucketAdapter } from './adapters/bucket.js'\nimport { createLocalAdapter } from './adapters/local.js'\nimport { createRenderAdapter } from './adapters/render.js'\nimport { createServerAdapter } from './adapters/server.js'\nimport { withSync } from './adapters/sync.js'\nimport { createTabAdapter } from './adapters/tab.js'\nimport { createUrlAdapter } from './adapters/url.js'\nimport { getConfig, log, reportError } from './config.js'\nimport { getRegistered, register, unregister } from './registry.js'\nimport { afterHydration, BROWSER_SCOPES, isServer } from './ssr.js'\nimport type { Adapter, BaseInstance, Scope, StateOptions } from './types.js'\n\n// ---------------------------------------------------------------------------\n// Scope sets (module-level to avoid per-instance allocation)\n// ---------------------------------------------------------------------------\n\nconst PERSISTENT_SCOPES = new Set<Scope>(['local', 'tab', 'bucket'])\nconst SYNCABLE_SCOPES = new Set<Scope>(['local', 'bucket'])\n\n// ---------------------------------------------------------------------------\n// Key prefixing\n// ---------------------------------------------------------------------------\n\nfunction resolveStorageKey<T>(key: string, options: StateOptions<T>): string {\n\tif (options.prefix === false) return key\n\n\tconst prefix = options.prefix ?? getConfig().prefix\n\n\treturn prefix ? `${prefix}:${key}` : key\n}\n\n// ---------------------------------------------------------------------------\n// Adapter resolution\n// ---------------------------------------------------------------------------\n\nfunction resolveAdapter<T>(key: string, scope: Scope, options: StateOptions<T>): Adapter<T> {\n\tconst storageKey = resolveStorageKey(key, options)\n\n\tswitch (scope) {\n\t\tcase 'render':\n\t\t\treturn createRenderAdapter(options.default)\n\n\t\tcase 'tab':\n\t\t\treturn createTabAdapter(storageKey, options)\n\n\t\tcase 'local':\n\t\t\treturn createLocalAdapter(storageKey, options)\n\n\t\tcase 'url':\n\t\t\treturn createUrlAdapter(\n\t\t\t\tstorageKey,\n\t\t\t\toptions.default,\n\t\t\t\toptions.serialize ?? {\n\t\t\t\t\tstringify: (v) => JSON.stringify(v),\n\t\t\t\t\tparse: (s) => JSON.parse(s),\n\t\t\t\t},\n\t\t\t\toptions.persist,\n\t\t\t)\n\n\t\tcase 'server':\n\t\t\treturn createServerAdapter(storageKey, options.default)\n\n\t\tcase 'bucket': {\n\t\t\tif (!options.bucket) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'[state] scope: \"bucket\" requires a bucket option. ' +\n\t\t\t\t\t\t'Example: { scope: \"bucket\", bucket: { name: \"my-bucket\" } }',\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn createBucketAdapter(storageKey, options.bucket, options)\n\t\t}\n\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = scope\n\n\t\t\tthrow new Error(`[state] Unknown scope: ${_exhaustive}`)\n\t\t}\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Base instance factory\n// ---------------------------------------------------------------------------\n\nexport function createBase<T>(key: string, options: StateOptions<T>): BaseInstance<T> {\n\tif (!key) {\n\t\tthrow new Error('[state] key must be a non-empty string.')\n\t}\n\n\tconst config = getConfig()\n\n\t// --- keyPattern validation ---\n\tif (config.keyPattern && !config.keyPattern.test(key)) {\n\t\tthrow new Error(\n\t\t\t`[stead] Key \"${key}\" does not match the configured keyPattern ${config.keyPattern}.`,\n\t\t)\n\t}\n\n\t// Apply global defaults — per-instance options take precedence\n\tconst scope = options.scope ?? config.defaultScope ?? 'render'\n\n\tconst existing = getRegistered<T>(key, scope)\n\n\tif (existing && !existing.isDestroyed) return existing\n\n\t// --- requireValidation enforcement ---\n\tif (config.requireValidation && PERSISTENT_SCOPES.has(scope) && !options.validate) {\n\t\tthrow new Error(\n\t\t\t`[stead] A validate function is required for persisted scope \"${scope}\" ` +\n\t\t\t\t`on state(\"${key}\"). Set requireValidation: false in configure() to disable.`,\n\t\t)\n\t}\n\n\tconst defaultValue = options.default\n\n\tconst isSsrMode = (options.ssr ?? config.ssr) && BROWSER_SCOPES.has(scope)\n\n\tconst useRenderFallback = isSsrMode && isServer()\n\n\tconst storageKey = resolveStorageKey(key, options)\n\n\tconst baseAdapter = useRenderFallback\n\t\t? createRenderAdapter(defaultValue)\n\t\t: resolveAdapter(key, scope, options)\n\n\tconst effectiveSync = options.sync ?? (config.sync && SYNCABLE_SCOPES.has(scope))\n\n\tif (effectiveSync && !SYNCABLE_SCOPES.has(scope)) {\n\t\tlog(\n\t\t\t'warn',\n\t\t\t`sync: true is ignored for scope \"${scope}\". Only \"local\" and \"bucket\" scopes support cross-tab sync.`,\n\t\t)\n\t}\n\n\tconst shouldSync = effectiveSync && SYNCABLE_SCOPES.has(scope) && !useRenderFallback\n\n\tconst adapter = shouldSync ? withSync(baseAdapter, storageKey, scope) : baseAdapter\n\n\tlet lastValue = adapter.get()\n\n\tlet _isDestroyed = false\n\n\t// --- middleware ---\n\tconst _interceptors = new Set<(next: T, prev: T) => T>()\n\tconst _hooks = new Set<(next: T, prev: T) => void>()\n\n\t// --- settled: resolves when the most recent write has persisted ---\n\tlet _settled = Promise.resolve()\n\n\t// --- destroyed: resolves when destroy() is called ---\n\tlet _resolveDestroyed: () => void\n\n\tconst _destroyed = new Promise<void>((resolve) => {\n\t\t_resolveDestroyed = resolve\n\t})\n\n\t// --- hydrated: resolves when SSR hydration completes ---\n\tlet _hydrated: Promise<void>\n\n\t// For SSR mode on the client — hydrate after render\n\tif (isSsrMode && !isServer()) {\n\t\t_hydrated = afterHydration(() => {\n\t\t\ttry {\n\t\t\t\tconst realAdapter = resolveAdapter(key, scope, options)\n\n\t\t\t\tconst storedValue = realAdapter.get()\n\n\t\t\t\tconst serverValue = defaultValue\n\t\t\t\tconst clientValue = storedValue\n\n\t\t\t\tif (JSON.stringify(storedValue) !== JSON.stringify(defaultValue)) {\n\t\t\t\t\tinstance.set(storedValue)\n\t\t\t\t}\n\n\t\t\t\tconfig.onHydrate?.({ key, scope, serverValue, clientValue })\n\t\t\t} catch (err) {\n\t\t\t\tlog('debug', `Hydration adapter unavailable for state(\"${key}\") — using render fallback.`)\n\t\t\t\treportError(key, scope, err)\n\t\t\t}\n\t\t})\n\t} else {\n\t\t_hydrated = Promise.resolve()\n\t}\n\n\tconst instance: BaseInstance<T> = {\n\t\tget() {\n\t\t\treturn _isDestroyed ? lastValue : adapter.get()\n\t\t},\n\n\t\tpeek() {\n\t\t\treturn _isDestroyed ? lastValue : adapter.get()\n\t\t},\n\n\t\tset(valueOrUpdater) {\n\t\t\tif (_isDestroyed) return\n\n\t\t\tconst prev = adapter.get()\n\n\t\t\tlet next =\n\t\t\t\ttypeof valueOrUpdater === 'function'\n\t\t\t\t\t? (valueOrUpdater as (prev: T) => T)(prev)\n\t\t\t\t\t: valueOrUpdater\n\n\t\t\tfor (const interceptor of _interceptors) {\n\t\t\t\tnext = interceptor(next, prev)\n\t\t\t}\n\n\t\t\tlastValue = next\n\n\t\t\tadapter.set(next)\n\n\t\t\t// settled resolves when the adapter is ready (sync = immediate)\n\t\t\t_settled = adapter.ready\n\n\t\t\tfor (const hook of _hooks) {\n\t\t\t\thook(next, prev)\n\t\t\t}\n\t\t},\n\n\t\tsubscribe(listener) {\n\t\t\treturn adapter.subscribe(listener)\n\t\t},\n\n\t\treset() {\n\t\t\tif (_isDestroyed) return\n\n\t\t\tconst prev = adapter.get()\n\n\t\t\tlet next = defaultValue\n\n\t\t\tfor (const interceptor of _interceptors) {\n\t\t\t\tnext = interceptor(next, prev)\n\t\t\t}\n\n\t\t\tlastValue = next\n\n\t\t\tadapter.set(next)\n\n\t\t\t_settled = adapter.ready\n\n\t\t\tfor (const hook of _hooks) {\n\t\t\t\thook(next, prev)\n\t\t\t}\n\t\t},\n\n\t\tget ready() {\n\t\t\treturn adapter.ready\n\t\t},\n\n\t\tget settled() {\n\t\t\treturn _settled\n\t\t},\n\n\t\tget hydrated() {\n\t\t\treturn _hydrated\n\t\t},\n\n\t\tget destroyed() {\n\t\t\treturn _destroyed\n\t\t},\n\n\t\tget scope() {\n\t\t\treturn scope\n\t\t},\n\n\t\tget key() {\n\t\t\treturn key\n\t\t},\n\n\t\tget isDestroyed() {\n\t\t\treturn _isDestroyed\n\t\t},\n\n\t\tintercept(fn) {\n\t\t\t_interceptors.add(fn)\n\n\t\t\treturn () => {\n\t\t\t\t_interceptors.delete(fn)\n\t\t\t}\n\t\t},\n\n\t\tuse(fn) {\n\t\t\t_hooks.add(fn)\n\n\t\t\treturn () => {\n\t\t\t\t_hooks.delete(fn)\n\t\t\t}\n\t\t},\n\n\t\tdestroy() {\n\t\t\tif (_isDestroyed) return\n\n\t\t\tlastValue = adapter.get()\n\n\t\t\t_isDestroyed = true\n\n\t\t\t_interceptors.clear()\n\t\t\t_hooks.clear()\n\n\t\t\tadapter.destroy?.()\n\n\t\t\tunregister(key, scope)\n\n\t\t\tconfig.onDestroy?.({ key, scope })\n\n\t\t\t_resolveDestroyed()\n\t\t},\n\t}\n\n\tregister(key, scope, instance)\n\n\treturn instance\n}\n","import { createBase } from './core.js'\nimport type { BaseInstance, Listener, StateOptions, Unsubscribe } from './types.js'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CollectionInstance<T> extends BaseInstance<T[]> {\n\t/** Read the current value without any reactive implications */\n\tpeek(): T[]\n\n\t/**\n\t * Watch a specific key across all items.\n\t * Fires whenever any item's value for that key changes.\n\t * Receives the full updated array.\n\t */\n\twatch<K extends T extends object ? keyof T : never>(\n\t\tkey: K,\n\t\tlistener: (items: T[]) => void,\n\t): Unsubscribe\n\n\t/** Add one or more items to the end of the collection */\n\tadd(...items: T[]): void\n\n\t/**\n\t * Remove all items matching the predicate.\n\t * Pass `{ one: true }` to remove only the first match.\n\t */\n\tremove(predicate: (item: T) => boolean, options?: { one?: boolean }): void\n\n\t/**\n\t * Update all items matching the predicate with a partial patch or updater.\n\t * Pass `{ one: true }` to update only the first match.\n\t */\n\tupdate(\n\t\tpredicate: (item: T) => boolean,\n\t\tpatch: Partial<T> | ((item: T) => T),\n\t\toptions?: { one?: boolean },\n\t): void\n\n\t/** Find the first item matching the predicate */\n\tfind(predicate: (item: T) => boolean): T | undefined\n\n\t/** Find all items matching the predicate */\n\tfindAll(predicate: (item: T) => boolean): T[]\n\n\t/** True if any item matches the predicate */\n\thas(predicate: (item: T) => boolean): boolean\n\n\t/** Number of items in the collection */\n\treadonly size: number\n\n\t/** Remove all items */\n\tclear(): void\n}\n\n// ---------------------------------------------------------------------------\n// collection\n// ---------------------------------------------------------------------------\n\n/**\n * Reactive array state with first-class mutation methods.\n * Supports all the same scopes, SSR, validation, and migration as state().\n *\n * ```ts\n * const todos = collection('todos', {\n * default: [] as Todo[],\n * scope: 'local',\n * })\n *\n * todos.add({ id: '1', text: 'Buy milk', done: false })\n * todos.update((t) => t.id === '1', { done: true })\n * todos.remove((t) => t.done)\n * todos.get() // Todo[]\n * ```\n */\nexport function collection<T>(key: string, options: StateOptions<T[]>): CollectionInstance<T> {\n\tconst base: BaseInstance<T[]> = createBase(key, options)\n\n\t// Per-key watchers — fires when that key's value changes on any item\n\tconst watchers = new Map<PropertyKey, Set<Listener<T[]>>>()\n\n\tlet prevItems = base.get()\n\n\tconst unsubscribe = base.subscribe((next) => {\n\t\tif (watchers.size === 0) {\n\t\t\tprevItems = next\n\n\t\t\treturn\n\t\t}\n\n\t\tfor (const [watchKey, listeners] of watchers) {\n\t\t\t// Check if any item's value for this key actually changed\n\t\t\tconst keyChanged = (prev: unknown, next: unknown): boolean => {\n\t\t\t\tif (!prev || !next || typeof prev !== 'object' || typeof next !== 'object') {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tconst p = prev as Record<PropertyKey, unknown>\n\t\t\t\tconst n = next as Record<PropertyKey, unknown>\n\n\t\t\t\treturn !Object.is(p[watchKey], n[watchKey])\n\t\t\t}\n\n\t\t\tconst changed =\n\t\t\t\tnext.length !== prevItems.length ||\n\t\t\t\tnext.some((item, i) => i < prevItems.length && keyChanged(prevItems[i], item))\n\n\t\t\tif (changed) {\n\t\t\t\tfor (const listener of listeners) {\n\t\t\t\t\tlistener(next)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tprevItems = next\n\t})\n\n\tconst originalDestroy = base.destroy.bind(base)\n\n\treturn {\n\t\tget(): T[] {\n\t\t\treturn base.get()\n\t\t},\n\n\t\tpeek(): T[] {\n\t\t\treturn base.peek()\n\t\t},\n\n\t\tset(valueOrUpdater) {\n\t\t\tbase.set(valueOrUpdater)\n\t\t},\n\n\t\tsubscribe(listener: Listener<T[]>): Unsubscribe {\n\t\t\treturn base.subscribe(listener)\n\t\t},\n\n\t\treset() {\n\t\t\tbase.reset()\n\t\t},\n\n\t\twatch(watchKey, listener) {\n\t\t\tlet listeners = watchers.get(watchKey)\n\n\t\t\tif (!listeners) {\n\t\t\t\tlisteners = new Set()\n\n\t\t\t\twatchers.set(watchKey, listeners)\n\t\t\t}\n\n\t\t\tlisteners.add(listener as Listener<T[]>)\n\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener as Listener<T[]>)\n\n\t\t\t\tif (listeners.size === 0) {\n\t\t\t\t\twatchers.delete(watchKey)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tadd(...items: T[]) {\n\t\t\tbase.set((prev) => [...prev, ...items])\n\t\t},\n\n\t\tremove(predicate: (item: T) => boolean, options?: { one?: boolean }) {\n\t\t\tif (options?.one) {\n\t\t\t\tlet removed = false\n\n\t\t\t\tbase.set((prev) =>\n\t\t\t\t\tprev.filter((item) => {\n\t\t\t\t\t\tif (!removed && predicate(item)) {\n\t\t\t\t\t\t\tremoved = true\n\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tbase.set((prev) => prev.filter((item) => !predicate(item)))\n\t\t\t}\n\t\t},\n\n\t\tupdate(\n\t\t\tpredicate: (item: T) => boolean,\n\t\t\tpatch: Partial<T> | ((item: T) => T),\n\t\t\toptions?: { one?: boolean },\n\t\t) {\n\t\t\tconst applyPatch =\n\t\t\t\ttypeof patch === 'function' ? patch : (item: T): T => ({ ...item, ...patch })\n\n\t\t\tif (options?.one) {\n\t\t\t\tlet updated = false\n\n\t\t\t\tbase.set((prev) =>\n\t\t\t\t\tprev.map((item) => {\n\t\t\t\t\t\tif (!updated && predicate(item)) {\n\t\t\t\t\t\t\tupdated = true\n\n\t\t\t\t\t\t\treturn applyPatch(item)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn item\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tbase.set((prev) => prev.map((item) => (predicate(item) ? applyPatch(item) : item)))\n\t\t\t}\n\t\t},\n\n\t\tfind(predicate: (item: T) => boolean): T | undefined {\n\t\t\treturn base.get().find(predicate)\n\t\t},\n\n\t\tfindAll(predicate: (item: T) => boolean): T[] {\n\t\t\treturn base.get().filter(predicate)\n\t\t},\n\n\t\thas(predicate: (item: T) => boolean): boolean {\n\t\t\treturn base.get().some(predicate)\n\t\t},\n\n\t\tget size() {\n\t\t\treturn base.get().length\n\t\t},\n\n\t\tclear() {\n\t\t\tbase.set([])\n\t\t},\n\n\t\tintercept(fn) {\n\t\t\treturn base.intercept(fn)\n\t\t},\n\n\t\tuse(fn) {\n\t\t\treturn base.use(fn)\n\t\t},\n\n\t\tget scope() {\n\t\t\treturn base.scope\n\t\t},\n\n\t\tget key() {\n\t\t\treturn base.key\n\t\t},\n\n\t\tget isDestroyed() {\n\t\t\treturn base.isDestroyed\n\t\t},\n\n\t\tget ready() {\n\t\t\treturn base.ready\n\t\t},\n\n\t\tget settled() {\n\t\t\treturn base.settled\n\t\t},\n\n\t\tget hydrated() {\n\t\t\treturn base.hydrated\n\t\t},\n\n\t\tget destroyed() {\n\t\t\treturn base.destroyed\n\t\t},\n\n\t\tdestroy() {\n\t\t\twatchers.clear()\n\n\t\t\tunsubscribe()\n\n\t\t\toriginalDestroy()\n\t\t},\n\t}\n}\n","import { notify } from './batch.js'\nimport type { BaseInstance, Listener, ReadonlyInstance, Unsubscribe } from './types.js'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype DepValues<T extends ReadonlyArray<BaseInstance<unknown>>> = {\n\t[K in keyof T]: T[K] extends BaseInstance<infer V> ? V : never\n}\n\n/**\n * A read-only reactive value derived from one or more dependencies.\n * Extends ReadonlyInstance — has get, peek, subscribe, ready, and identity,\n * but no set or reset since the value is always determined by its sources.\n */\nexport interface ComputedInstance<T> extends ReadonlyInstance<T> {}\n\n// ---------------------------------------------------------------------------\n// computed\n// ---------------------------------------------------------------------------\n\n/**\n * Derive a reactive value from one or more state dependencies.\n * Recomputes only when a dependency changes. Cached between changes.\n * Participates in batch() — notifications are deferred like any other state.\n *\n * ```ts\n * const firstName = state('firstName', { default: 'Jane' })\n * const lastName = state('lastName', { default: 'Doe' })\n *\n * const fullName = computed([firstName, lastName], ([first, last]) => {\n * return `${first} ${last}`.trim()\n * })\n *\n * fullName.get() // 'Jane Doe'\n * fullName.subscribe(name => console.log(name))\n * ```\n */\nexport function computed<TDeps extends ReadonlyArray<BaseInstance<unknown>>, TResult>(\n\tdeps: TDeps,\n\tfn: (values: DepValues<TDeps>) => TResult,\n): ComputedInstance<TResult> {\n\tconst listeners = new Set<Listener<TResult>>()\n\n\tlet cached: TResult\n\n\tlet isDirty = true\n\tlet isDestroyed = false\n\n\tfunction getDepValues(): DepValues<TDeps> {\n\t\treturn deps.map((dep) => dep.get()) as DepValues<TDeps>\n\t}\n\n\tfunction recompute(): TResult {\n\t\tif (!isDirty) return cached\n\n\t\tcached = fn(getDepValues())\n\t\tisDirty = false\n\n\t\treturn cached\n\t}\n\n\tconst notifyListeners = () => {\n\t\tconst value = recompute()\n\n\t\tfor (const listener of listeners) {\n\t\t\tlistener(value)\n\t\t}\n\t}\n\n\tconst unsubscribers = deps.map((dep) =>\n\t\tdep.subscribe(() => {\n\t\t\tisDirty = true\n\n\t\t\tnotify(notifyListeners)\n\t\t}),\n\t)\n\n\t// Compute initial value eagerly so first get() is synchronous\n\trecompute()\n\n\tlet resolveDestroyed: () => void\n\n\tconst destroyedPromise = new Promise<void>((resolve) => {\n\t\tresolveDestroyed = resolve\n\t})\n\n\treturn {\n\t\tkey: '',\n\t\tscope: 'render' as const,\n\n\t\tget ready(): Promise<void> {\n\t\t\treturn Promise.all(deps.map((d) => d.ready)).then(() => undefined)\n\t\t},\n\n\t\tget settled(): Promise<void> {\n\t\t\treturn Promise.all(deps.map((d) => d.settled)).then(() => undefined)\n\t\t},\n\n\t\tget hydrated(): Promise<void> {\n\t\t\treturn Promise.all(deps.map((d) => d.hydrated)).then(() => undefined)\n\t\t},\n\n\t\tget destroyed(): Promise<void> {\n\t\t\treturn destroyedPromise\n\t\t},\n\n\t\tget isDestroyed() {\n\t\t\treturn isDestroyed\n\t\t},\n\n\t\tget() {\n\t\t\treturn recompute()\n\t\t},\n\n\t\tpeek() {\n\t\t\treturn recompute()\n\t\t},\n\n\t\tsubscribe(listener: Listener<TResult>): Unsubscribe {\n\t\t\tlisteners.add(listener)\n\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener)\n\t\t\t}\n\t\t},\n\n\t\tdestroy() {\n\t\t\tif (isDestroyed) return\n\n\t\t\tisDestroyed = true\n\n\t\t\tfor (const unsub of unsubscribers) {\n\t\t\t\tunsub()\n\t\t\t}\n\n\t\t\tlisteners.clear()\n\n\t\t\tresolveDestroyed()\n\t\t},\n\t}\n}\n","import type { BaseInstance } from './types.js'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype DepValues<T extends ReadonlyArray<BaseInstance<unknown>>> = {\n\t[K in keyof T]: T[K] extends BaseInstance<infer V> ? V : never\n}\n\ntype Cleanup = () => void\n\nexport interface EffectHandle {\n\t/** Stop the effect and run the last cleanup function if any */\n\tstop(): void\n}\n\n// ---------------------------------------------------------------------------\n// effect\n// ---------------------------------------------------------------------------\n\n/**\n * Run a side effect when state dependencies change.\n * Runs immediately with current values, then re-runs on any change.\n *\n * The callback can return a cleanup function that runs before the next\n * execution and when the effect is stopped.\n *\n * ```ts\n * const stop = effect([theme, fontSize], ([t, f]) => {\n * document.body.setAttribute('data-theme', t)\n * document.documentElement.style.fontSize = `${f}px`\n *\n * return () => {\n * document.body.removeAttribute('data-theme')\n * }\n * })\n *\n * // Later — stop listening and clean up\n * stop()\n * ```\n */\nexport function effect<TDeps extends ReadonlyArray<BaseInstance<unknown>>>(\n\tdeps: TDeps,\n\tfn: (values: DepValues<TDeps>) => Cleanup | undefined,\n): EffectHandle {\n\tlet cleanup: Cleanup | undefined\n\n\tlet isStopped = false\n\n\tfunction getDepValues(): DepValues<TDeps> {\n\t\treturn deps.map((dep) => dep.get()) as DepValues<TDeps>\n\t}\n\n\tfunction run(): void {\n\t\tif (isStopped) return\n\n\t\t// Run previous cleanup before re-executing\n\t\tif (cleanup) {\n\t\t\tcleanup()\n\t\t\tcleanup = undefined\n\t\t}\n\n\t\tcleanup = fn(getDepValues())\n\t}\n\n\t// Subscribe to all dependencies\n\tconst unsubscribers = deps.map((dep) => dep.subscribe(() => run()))\n\n\t// Run immediately with current values\n\trun()\n\n\treturn {\n\t\tstop() {\n\t\t\tif (isStopped) return\n\n\t\t\tisStopped = true\n\n\t\t\tfor (const unsub of unsubscribers) {\n\t\t\t\tunsub()\n\t\t\t}\n\n\t\t\tif (cleanup) {\n\t\t\t\tcleanup()\n\t\t\t\tcleanup = undefined\n\t\t\t}\n\t\t},\n\t}\n}\n","import type { BaseInstance, Listener, Unsubscribe } from '../types.js'\n\nexport interface WithWatch<T> {\n\t/**\n\t * Watch a specific key within an object value.\n\t * The listener only fires when that key's value changes,\n\t * using Object.is for comparison.\n\t *\n\t * Returns an unsubscribe function.\n\t */\n\twatch<K extends T extends object ? keyof T : never>(\n\t\tkey: K,\n\t\tlistener: (value: T[K & keyof T]) => void,\n\t): Unsubscribe\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: constraint must use any for invariant BaseInstance\nexport function withWatch<TIn extends BaseInstance<any>>(\n\tinstance: TIn,\n): TIn & WithWatch<TIn extends BaseInstance<infer T> ? T : unknown> {\n\ttype TOut = TIn & WithWatch<TIn extends BaseInstance<infer T> ? T : unknown>\n\n\tconst watchers = new Map<PropertyKey, Set<Listener<unknown>>>()\n\n\tlet prev = instance.get()\n\n\tconst unsubscribe = instance.subscribe((next) => {\n\t\tif (watchers.size === 0) {\n\t\t\tprev = next\n\n\t\t\treturn\n\t\t}\n\n\t\tif (next === null || typeof next !== 'object') {\n\t\t\tprev = next\n\n\t\t\treturn\n\t\t}\n\n\t\tfor (const [watchKey, listeners] of watchers) {\n\t\t\tconst prevVal =\n\t\t\t\tprev !== null && typeof prev === 'object'\n\t\t\t\t\t? (prev as Record<PropertyKey, unknown>)[watchKey]\n\t\t\t\t\t: undefined\n\n\t\t\tconst nextVal = (next as Record<PropertyKey, unknown>)[watchKey]\n\n\t\t\tif (!Object.is(prevVal, nextVal)) {\n\t\t\t\tfor (const listener of listeners) {\n\t\t\t\t\tlistener(nextVal)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tprev = next\n\t})\n\n\tconst originalDestroy = instance.destroy.bind(instance)\n\n\tconst result = Object.create(instance) as TOut\n\n\tresult.watch = (watchKey: PropertyKey, listener: Listener<unknown>) => {\n\t\tif (!watchers.has(watchKey)) {\n\t\t\twatchers.set(watchKey, new Set())\n\t\t}\n\n\t\tconst listeners = watchers.get(watchKey)\n\n\t\tif (!listeners) return () => {}\n\n\t\tlisteners.add(listener)\n\n\t\treturn () => {\n\t\t\tlisteners.delete(listener)\n\n\t\t\tif (listeners.size === 0) {\n\t\t\t\twatchers.delete(watchKey)\n\t\t\t}\n\t\t}\n\t}\n\n\tresult.destroy = () => {\n\t\twatchers.clear()\n\t\tunsubscribe()\n\t\toriginalDestroy()\n\t}\n\n\treturn result\n}\n","import { getConfig, log } from './config.js'\nimport { createBase } from './core.js'\nimport { withWatch } from './enhancers/watch.js'\nimport { scopedKey } from './registry.js'\nimport type { StateInstance, StateOptions } from './types.js'\n\ninterface CachedInstance {\n\treadonly isDestroyed: boolean\n}\n\nconst instanceCache = new Map<string, CachedInstance>()\n\n/**\n * Create a stateful value.\n *\n * Same key + same scope always returns the same instance.\n * Change scope to move state anywhere.\n *\n * ```ts\n * const theme = state('theme', { default: 'light', scope: 'local' })\n * const filters = state('filters', { default: {}, scope: 'url' })\n * const user = state('user', { default: null, scope: 'server' })\n * ```\n */\nexport function state<T>(key: string, options: StateOptions<T>): StateInstance<T> {\n\tconst config = getConfig()\n\n\tconst scope = options.scope ?? config.defaultScope ?? 'render'\n\n\tconst ck = scopedKey(key, scope)\n\n\tconst cached = instanceCache.get(ck) as StateInstance<T> | undefined\n\n\tif (cached && !cached.isDestroyed) {\n\t\tif (config.warnOnDuplicate) {\n\t\t\tlog('warn', `Duplicate state(\"${key}\") with scope \"${scope}\". Returning cached instance.`)\n\t\t}\n\n\t\treturn cached\n\t}\n\n\tconst base = createBase(key, options)\n\n\tconst instance = withWatch(base) as StateInstance<T>\n\n\tinstanceCache.set(ck, instance)\n\n\treturn instance\n}\n"]}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
type Scope = 'render' | 'tab' | 'local' | 'url' | 'server' | 'bucket';
|
|
2
|
+
interface Adapter<T> {
|
|
3
|
+
get(): T;
|
|
4
|
+
set(value: T): void;
|
|
5
|
+
subscribe(listener: Listener<T>): Unsubscribe;
|
|
6
|
+
/** Resolves when the adapter is ready to read/write. Sync adapters resolve immediately. */
|
|
7
|
+
ready: Promise<void>;
|
|
8
|
+
destroy?(): void;
|
|
9
|
+
}
|
|
10
|
+
interface ReadonlyInstance<T> {
|
|
11
|
+
/** Current value */
|
|
12
|
+
get(): T;
|
|
13
|
+
/** Read the current value without any reactive implications */
|
|
14
|
+
peek(): T;
|
|
15
|
+
/** Subscribe to all changes. Returns an unsubscribe function. */
|
|
16
|
+
subscribe(listener: Listener<T>): Unsubscribe;
|
|
17
|
+
/** Which scope this instance uses */
|
|
18
|
+
readonly scope: Scope;
|
|
19
|
+
/** The key this instance was created with */
|
|
20
|
+
readonly key: string;
|
|
21
|
+
/** Whether this instance has been destroyed */
|
|
22
|
+
readonly isDestroyed: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Resolves when the adapter is fully initialized.
|
|
25
|
+
* Resolves immediately for synchronous scopes.
|
|
26
|
+
*/
|
|
27
|
+
readonly ready: Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Resolves when the most recent write has been persisted to storage.
|
|
30
|
+
* For synchronous scopes this resolves immediately.
|
|
31
|
+
* For async scopes (e.g. bucket) this resolves once the adapter is ready
|
|
32
|
+
* and the write has landed.
|
|
33
|
+
*/
|
|
34
|
+
readonly settled: Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Resolves when SSR hydration is complete and the real stored value
|
|
37
|
+
* has been read. Resolves immediately when not in SSR mode.
|
|
38
|
+
*/
|
|
39
|
+
readonly hydrated: Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Resolves when destroy() has been called and teardown is complete.
|
|
42
|
+
*/
|
|
43
|
+
readonly destroyed: Promise<void>;
|
|
44
|
+
/** Tear down listeners and storage resources */
|
|
45
|
+
destroy(): void;
|
|
46
|
+
}
|
|
47
|
+
interface BaseInstance<T> extends ReadonlyInstance<T> {
|
|
48
|
+
/** Update value — accepts a value or an updater function */
|
|
49
|
+
set(value: T | ((prev: T) => T)): void;
|
|
50
|
+
/** Reset to default value */
|
|
51
|
+
reset(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Register an interceptor that runs before each set/reset.
|
|
54
|
+
* The interceptor receives `(next, prev)` and returns the value to actually store.
|
|
55
|
+
* Return `prev` to reject the update. Multiple interceptors run in registration order.
|
|
56
|
+
*/
|
|
57
|
+
intercept(fn: (next: T, prev: T) => T): Unsubscribe;
|
|
58
|
+
/**
|
|
59
|
+
* Register a post-set tap that fires after each set/reset.
|
|
60
|
+
* Receives `(next, prev)`. Return value is ignored.
|
|
61
|
+
* Multiple hooks run in registration order.
|
|
62
|
+
*/
|
|
63
|
+
use(fn: (next: T, prev: T) => void): Unsubscribe;
|
|
64
|
+
}
|
|
65
|
+
type Enhancer<TIn, TOut extends TIn> = (instance: TIn) => TOut;
|
|
66
|
+
interface StateInstance<T> extends BaseInstance<T> {
|
|
67
|
+
/**
|
|
68
|
+
* Watch a specific key within an object value.
|
|
69
|
+
* Listener only fires when that key's value changes.
|
|
70
|
+
*/
|
|
71
|
+
watch<K extends T extends object ? keyof T : never>(key: K, listener: (value: T[K & keyof T]) => void): Unsubscribe;
|
|
72
|
+
}
|
|
73
|
+
interface BucketOptions {
|
|
74
|
+
/**
|
|
75
|
+
* Name of the storage bucket. Each name is isolated — keys in one
|
|
76
|
+
* bucket never conflict with keys in another.
|
|
77
|
+
*/
|
|
78
|
+
name: string;
|
|
79
|
+
/**
|
|
80
|
+
* Whether the bucket should persist under storage pressure.
|
|
81
|
+
* Defaults to false.
|
|
82
|
+
*/
|
|
83
|
+
persisted?: boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Expiry duration or Unix timestamp in ms.
|
|
86
|
+
* Examples: '7d', '24h', '30m', or a timestamp.
|
|
87
|
+
*/
|
|
88
|
+
expires?: string | number;
|
|
89
|
+
/**
|
|
90
|
+
* Maximum storage quota for this bucket.
|
|
91
|
+
* Examples: '10mb', '50mb', or a byte count.
|
|
92
|
+
*/
|
|
93
|
+
quota?: string | number;
|
|
94
|
+
/**
|
|
95
|
+
* Scope to use if the Storage Buckets API is not available.
|
|
96
|
+
* Defaults to 'local'.
|
|
97
|
+
*/
|
|
98
|
+
fallback?: 'local' | 'tab';
|
|
99
|
+
}
|
|
100
|
+
interface StateOptions<T> {
|
|
101
|
+
/** Initial / default value */
|
|
102
|
+
default: T;
|
|
103
|
+
/** Where state should live. Defaults to 'render'. */
|
|
104
|
+
scope?: Scope;
|
|
105
|
+
/**
|
|
106
|
+
* Storage bucket options. Required when scope is 'bucket'.
|
|
107
|
+
* Ignored for all other scopes.
|
|
108
|
+
*/
|
|
109
|
+
bucket?: BucketOptions;
|
|
110
|
+
/**
|
|
111
|
+
* Custom serializer. Defaults to JSON.stringify / JSON.parse.
|
|
112
|
+
* Only used by adapters that persist to string-based storage.
|
|
113
|
+
*/
|
|
114
|
+
serialize?: Serializer<T>;
|
|
115
|
+
/**
|
|
116
|
+
* Enable SSR safety. When true:
|
|
117
|
+
* - On server: silently falls back to 'render' scope
|
|
118
|
+
* - On client before hydration: uses default value to match server output
|
|
119
|
+
* - On client after hydration: reads real storage and emits update if different
|
|
120
|
+
*/
|
|
121
|
+
ssr?: boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Schema version for migrations. Defaults to 1.
|
|
124
|
+
*/
|
|
125
|
+
version?: number;
|
|
126
|
+
/**
|
|
127
|
+
* Validate a value read from storage. Falls back to default on failure.
|
|
128
|
+
* Runs after migration.
|
|
129
|
+
*/
|
|
130
|
+
validate?: (value: unknown) => value is T;
|
|
131
|
+
/**
|
|
132
|
+
* Migration functions keyed by the version they migrate FROM.
|
|
133
|
+
*
|
|
134
|
+
* Example: { 1: (old) => ({ ...old, newField: 'default' }) }
|
|
135
|
+
*/
|
|
136
|
+
migrate?: Record<number, (old: unknown) => unknown>;
|
|
137
|
+
/**
|
|
138
|
+
* Override the global prefix for this instance.
|
|
139
|
+
* - `string`: use this prefix instead of the global one
|
|
140
|
+
* - `false`: disable prefixing entirely for this instance
|
|
141
|
+
*/
|
|
142
|
+
prefix?: string | false;
|
|
143
|
+
/**
|
|
144
|
+
* Broadcast changes to other tabs via BroadcastChannel.
|
|
145
|
+
* When true, any set() call is also sent to other open tabs,
|
|
146
|
+
* and incoming changes from other tabs update this instance.
|
|
147
|
+
*
|
|
148
|
+
* Works with any persistent scope (local, tab, bucket).
|
|
149
|
+
*/
|
|
150
|
+
sync?: boolean;
|
|
151
|
+
/**
|
|
152
|
+
* Selectively persist only the specified keys of an object value.
|
|
153
|
+
* Non-listed keys are kept in memory but excluded from storage writes.
|
|
154
|
+
* On read, persisted keys are merged with the default value.
|
|
155
|
+
*
|
|
156
|
+
* Only meaningful for object-typed state with a persistent scope.
|
|
157
|
+
*/
|
|
158
|
+
persist?: Array<keyof T & string>;
|
|
159
|
+
}
|
|
160
|
+
interface Serializer<T> {
|
|
161
|
+
stringify(value: T): string;
|
|
162
|
+
parse(raw: string): T;
|
|
163
|
+
}
|
|
164
|
+
type Listener<T> = (value: T) => void;
|
|
165
|
+
type Unsubscribe = () => void;
|
|
166
|
+
|
|
167
|
+
declare function withServerSession<T>(fn: () => T): Promise<T>;
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Runs all state updates inside fn as a single batch.
|
|
171
|
+
* Subscribers are notified once after all updates complete,
|
|
172
|
+
* rather than once per individual update.
|
|
173
|
+
*
|
|
174
|
+
* Nested batch() calls are safe — notifications flush only
|
|
175
|
+
* when the outermost batch completes.
|
|
176
|
+
*
|
|
177
|
+
* ```ts
|
|
178
|
+
* batch(() => {
|
|
179
|
+
* firstName.set('John')
|
|
180
|
+
* lastName.set('Doe')
|
|
181
|
+
* age.set(30)
|
|
182
|
+
* })
|
|
183
|
+
* // subscribers fire once, not three times
|
|
184
|
+
* ```
|
|
185
|
+
*/
|
|
186
|
+
declare function batch(fn: () => void): void;
|
|
187
|
+
|
|
188
|
+
interface CollectionInstance<T> extends BaseInstance<T[]> {
|
|
189
|
+
/** Read the current value without any reactive implications */
|
|
190
|
+
peek(): T[];
|
|
191
|
+
/**
|
|
192
|
+
* Watch a specific key across all items.
|
|
193
|
+
* Fires whenever any item's value for that key changes.
|
|
194
|
+
* Receives the full updated array.
|
|
195
|
+
*/
|
|
196
|
+
watch<K extends T extends object ? keyof T : never>(key: K, listener: (items: T[]) => void): Unsubscribe;
|
|
197
|
+
/** Add one or more items to the end of the collection */
|
|
198
|
+
add(...items: T[]): void;
|
|
199
|
+
/**
|
|
200
|
+
* Remove all items matching the predicate.
|
|
201
|
+
* Pass `{ one: true }` to remove only the first match.
|
|
202
|
+
*/
|
|
203
|
+
remove(predicate: (item: T) => boolean, options?: {
|
|
204
|
+
one?: boolean;
|
|
205
|
+
}): void;
|
|
206
|
+
/**
|
|
207
|
+
* Update all items matching the predicate with a partial patch or updater.
|
|
208
|
+
* Pass `{ one: true }` to update only the first match.
|
|
209
|
+
*/
|
|
210
|
+
update(predicate: (item: T) => boolean, patch: Partial<T> | ((item: T) => T), options?: {
|
|
211
|
+
one?: boolean;
|
|
212
|
+
}): void;
|
|
213
|
+
/** Find the first item matching the predicate */
|
|
214
|
+
find(predicate: (item: T) => boolean): T | undefined;
|
|
215
|
+
/** Find all items matching the predicate */
|
|
216
|
+
findAll(predicate: (item: T) => boolean): T[];
|
|
217
|
+
/** True if any item matches the predicate */
|
|
218
|
+
has(predicate: (item: T) => boolean): boolean;
|
|
219
|
+
/** Number of items in the collection */
|
|
220
|
+
readonly size: number;
|
|
221
|
+
/** Remove all items */
|
|
222
|
+
clear(): void;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Reactive array state with first-class mutation methods.
|
|
226
|
+
* Supports all the same scopes, SSR, validation, and migration as state().
|
|
227
|
+
*
|
|
228
|
+
* ```ts
|
|
229
|
+
* const todos = collection('todos', {
|
|
230
|
+
* default: [] as Todo[],
|
|
231
|
+
* scope: 'local',
|
|
232
|
+
* })
|
|
233
|
+
*
|
|
234
|
+
* todos.add({ id: '1', text: 'Buy milk', done: false })
|
|
235
|
+
* todos.update((t) => t.id === '1', { done: true })
|
|
236
|
+
* todos.remove((t) => t.done)
|
|
237
|
+
* todos.get() // Todo[]
|
|
238
|
+
* ```
|
|
239
|
+
*/
|
|
240
|
+
declare function collection<T>(key: string, options: StateOptions<T[]>): CollectionInstance<T>;
|
|
241
|
+
|
|
242
|
+
type DepValues$1<T extends ReadonlyArray<BaseInstance<unknown>>> = {
|
|
243
|
+
[K in keyof T]: T[K] extends BaseInstance<infer V> ? V : never;
|
|
244
|
+
};
|
|
245
|
+
/**
|
|
246
|
+
* A read-only reactive value derived from one or more dependencies.
|
|
247
|
+
* Extends ReadonlyInstance — has get, peek, subscribe, ready, and identity,
|
|
248
|
+
* but no set or reset since the value is always determined by its sources.
|
|
249
|
+
*/
|
|
250
|
+
interface ComputedInstance<T> extends ReadonlyInstance<T> {
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Derive a reactive value from one or more state dependencies.
|
|
254
|
+
* Recomputes only when a dependency changes. Cached between changes.
|
|
255
|
+
* Participates in batch() — notifications are deferred like any other state.
|
|
256
|
+
*
|
|
257
|
+
* ```ts
|
|
258
|
+
* const firstName = state('firstName', { default: 'Jane' })
|
|
259
|
+
* const lastName = state('lastName', { default: 'Doe' })
|
|
260
|
+
*
|
|
261
|
+
* const fullName = computed([firstName, lastName], ([first, last]) => {
|
|
262
|
+
* return `${first} ${last}`.trim()
|
|
263
|
+
* })
|
|
264
|
+
*
|
|
265
|
+
* fullName.get() // 'Jane Doe'
|
|
266
|
+
* fullName.subscribe(name => console.log(name))
|
|
267
|
+
* ```
|
|
268
|
+
*/
|
|
269
|
+
declare function computed<TDeps extends ReadonlyArray<BaseInstance<unknown>>, TResult>(deps: TDeps, fn: (values: DepValues$1<TDeps>) => TResult): ComputedInstance<TResult>;
|
|
270
|
+
|
|
271
|
+
type DepValues<T extends ReadonlyArray<BaseInstance<unknown>>> = {
|
|
272
|
+
[K in keyof T]: T[K] extends BaseInstance<infer V> ? V : never;
|
|
273
|
+
};
|
|
274
|
+
type Cleanup = () => void;
|
|
275
|
+
interface EffectHandle {
|
|
276
|
+
/** Stop the effect and run the last cleanup function if any */
|
|
277
|
+
stop(): void;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Run a side effect when state dependencies change.
|
|
281
|
+
* Runs immediately with current values, then re-runs on any change.
|
|
282
|
+
*
|
|
283
|
+
* The callback can return a cleanup function that runs before the next
|
|
284
|
+
* execution and when the effect is stopped.
|
|
285
|
+
*
|
|
286
|
+
* ```ts
|
|
287
|
+
* const stop = effect([theme, fontSize], ([t, f]) => {
|
|
288
|
+
* document.body.setAttribute('data-theme', t)
|
|
289
|
+
* document.documentElement.style.fontSize = `${f}px`
|
|
290
|
+
*
|
|
291
|
+
* return () => {
|
|
292
|
+
* document.body.removeAttribute('data-theme')
|
|
293
|
+
* }
|
|
294
|
+
* })
|
|
295
|
+
*
|
|
296
|
+
* // Later — stop listening and clean up
|
|
297
|
+
* stop()
|
|
298
|
+
* ```
|
|
299
|
+
*/
|
|
300
|
+
declare function effect<TDeps extends ReadonlyArray<BaseInstance<unknown>>>(deps: TDeps, fn: (values: DepValues<TDeps>) => Cleanup | undefined): EffectHandle;
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Create a stateful value.
|
|
304
|
+
*
|
|
305
|
+
* Same key + same scope always returns the same instance.
|
|
306
|
+
* Change scope to move state anywhere.
|
|
307
|
+
*
|
|
308
|
+
* ```ts
|
|
309
|
+
* const theme = state('theme', { default: 'light', scope: 'local' })
|
|
310
|
+
* const filters = state('filters', { default: {}, scope: 'url' })
|
|
311
|
+
* const user = state('user', { default: null, scope: 'server' })
|
|
312
|
+
* ```
|
|
313
|
+
*/
|
|
314
|
+
declare function state<T>(key: string, options: StateOptions<T>): StateInstance<T>;
|
|
315
|
+
|
|
316
|
+
export { type Adapter as A, type BaseInstance as B, type CollectionInstance as C, type EffectHandle as E, type Listener as L, type ReadonlyInstance as R, type Scope as S, type Unsubscribe as U, type BucketOptions as a, type ComputedInstance as b, type Enhancer as c, type Serializer as d, type StateInstance as e, type StateOptions as f, batch as g, collection as h, computed as i, effect as j, state as s, withServerSession as w };
|