@structyl/api-client 1.0.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 +150 -0
- package/dist/devtools.cjs +181 -0
- package/dist/devtools.cjs.map +1 -0
- package/dist/devtools.d.cts +8 -0
- package/dist/devtools.d.ts +8 -0
- package/dist/devtools.mjs +179 -0
- package/dist/devtools.mjs.map +1 -0
- package/dist/index.cjs +905 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +48 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.mjs +887 -0
- package/dist/index.mjs.map +1 -0
- package/dist/server-BdrIj1E3.d.cts +208 -0
- package/dist/server-BdrIj1E3.d.ts +208 -0
- package/dist/server.cjs +230 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +2 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.mjs +225 -0
- package/dist/server.mjs.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/cache.ts","../src/provider.tsx","../src/utils.ts","../src/hooks/useApiQuery.ts","../src/hooks/useApiMutation.ts","../src/hooks/useInfiniteApiQuery.ts","../src/hooks/useApiQueries.ts","../src/hooks/useSuspenseApiQuery.ts","../src/hooks/usePrefetch.ts","../src/persistence.ts"],"names":["axios","createContext","useContext","useRef","useCallback","data","useSyncExternalStore","useEffect","useState","infiniteData"],"mappings":";;;;;;;;;;;AASO,IAAM,YAAN,MAAgB;AAAA,EAIrB,YAAY,MAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAWA,uBAAM,MAAA,CAAO;AAAA,MAC3B,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,KAC5B,CAAA;AAED,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAA,CAAK,QAAA,CAAS,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,OAAO,aAAA,KAAkB;AAC9D,MAAA,IAAI,IAAA,CAAK,OAAO,YAAA,EAAc;AAC5B,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa;AAC7C,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,aAAA,CAAc,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAA,QACvD;AAAA,MACF;AACA,MAAA,OAAO,aAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,CAAS,aAAa,QAAA,CAAS,GAAA;AAAA,MAClC,CAAC,QAAA,KAAa,QAAA;AAAA,MACd,OAAO,KAAA,KAAsB;AAC3B,QAAA,MAAM,kBAAkB,KAAA,CAAM,MAAA;AAE9B,QAAA,IACE,KAAA,CAAM,QAAA,EAAU,MAAA,KAAW,GAAA,IAC3B,IAAA,CAAK,OAAO,YAAA,IACZ,eAAA,IACA,CAAC,eAAA,CAAgB,QAAA,EACjB;AACA,UAAA,eAAA,CAAgB,QAAA,GAAW,IAAA;AAC3B,UAAA,IAAI;AACF,YAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa;AAChD,YAAA,eAAA,CAAgB,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA;AAC7D,YAAA,OAAO,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,eAAe,CAAA;AAAA,UACpD,SAAS,UAAA,EAAY;AACnB,YAAA,IAAA,CAAK,MAAA,CAAO,iBAAiB,UAAU,CAAA;AAAA,UACzC;AAAA,QACF;AAEA,QAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MAC7C;AAAA,KACF;AAAA,EACF;AACF;AAEA,SAAS,eAAe,KAAA,EAA6B;AACnD,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA;AACpC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,MAAM,QAAA,CAAS,MAAA;AAAA,MACvB,OAAA,EAAA,CACG,OAAO,YAAA,GAAe,SAAS,CAAA,KAAM,WAAW,YAAA,CAAa,SAAS,CAAA,GAAI,IAAA,KAC3E,KAAA,CAAM,OAAA;AAAA,MACR,IAAA,EAAM,MAAM,QAAA,CAAS;AAAA,KACvB;AAAA,EACF;AAIA,EAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,OAAA,EAAS,kCAAA,EAAmC;AAClE;AAEO,SAAS,gBAAgB,MAAA,EAAoC;AAClE,EAAA,OAAO,IAAI,UAAU,MAAM,CAAA;AAC7B;;;ACnEO,SAAS,aAAa,GAAA,EAAwB;AACnD,EAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAC3B;AAEO,IAAM,aAAN,MAAiB;AAAA,EAetB,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,GAAA,EAAQ;AAdjC,IAAA,IAAA,CAAQ,OAAA,uBAAc,GAAA,EAAwB;AAC9C,IAAA,IAAA,CAAQ,WAAA,uBAAkB,GAAA,EAA6B;AACvD,IAAA,IAAA,CAAQ,QAAA,uBAAe,GAAA,EAA8B;AAErD;AAAA,IAAA,IAAA,CAAQ,WAAA,uBAAkB,GAAA,EAAoB;AAE9C;AAAA,IAAA,IAAA,CAAQ,QAAA,uBAAe,GAAA,EAA2C;AAElE;AAAA,IAAA,IAAA,CAAQ,gBAAA,uBAAuB,GAAA,EAA6B;AAE5D;AAAA,IAAA,IAAA,CAAQ,iBAAA,uBAAwB,GAAA,EAAgB;AAK9C,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,IAAW,GAAA,EAA4C;AACrD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAAA,EAC7B;AAAA,EAEA,SAAA,CAAU,KAAa,EAAA,EAA4B;AAEjD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,IAAI,YAAY,MAAA,EAAW;AACzB,MAAA,YAAA,CAAa,OAAO,CAAA;AACpB,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,kBAAK,IAAI,GAAA,EAAK,CAAA;AACnE,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,CAAG,IAAI,EAAE,CAAA;AAEjC,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACpC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,GAAA,CAAI,OAAO,EAAE,CAAA;AACb,MAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,QAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAE3B,QAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,UAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AACvB,UAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAC3B,UAAA,IAAA,CAAK,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,QAC1B,CAAA,EAAG,KAAK,MAAM,CAAA;AACd,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,MAC9B;AAAA,IACF,CAAA;AAAA,EACF;AAAA,EAEA,gBAAgB,EAAA,EAA4B;AAC1C,IAAA,IAAA,CAAK,iBAAA,CAAkB,IAAI,EAAE,CAAA;AAC7B,IAAA,OAAO,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,EAAE,CAAA;AAAA,EAC/C;AAAA,EAEQ,OAAO,GAAA,EAAmB;AAChC,IAAA,IAAA,CAAK,WAAA,CAAY,IAAI,GAAG,CAAA,EAAG,QAAQ,CAAC,EAAA,KAAO,IAAI,CAAA;AAC/C,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,CAAC,EAAA,KAAO,IAAI,CAAA;AAAA,EAC7C;AAAA,EAEA,OAAA,CAAe,GAAA,EAAa,IAAA,EAAa,SAAA,EAAyB;AAChE,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,GAAA,EAAK;AAAA,MACpB,IAAA;AAAA,MACA,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,GAAG,CAAA;AACxB,IAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,EACjB;AAAA,EAEA,QAAA,CAAS,KAAa,KAAA,EAAuB;AAC3C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,GAAA,EAAK;AAAA,MACpB,MAAM,QAAA,EAAU,IAAA;AAAA,MAChB,KAAA;AAAA,MACA,MAAA,EAAQ,OAAA;AAAA,MACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,SAAA,EAAW;AAAA,KACZ,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,GAAG,CAAA;AACxB,IAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,EACjB;AAAA,EAEA,WAAW,GAAA,EAAmB;AAC5B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,IAAI,QAAA,EAAU,WAAW,SAAA,EAAW;AACpC,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,GAAA,EAAK;AAAA,MACpB,MAAM,QAAA,EAAU,IAAA;AAAA,MAChB,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAW,UAAU,SAAA,IAAa,CAAA;AAAA,MAClC,SAAA,EAAW,UAAU,SAAA,IAAa;AAAA,KACnC,CAAA;AACD,IAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,GAAA,EAAsB;AAC5B,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC9B,IAAA,IAAI,CAAC,KAAK,CAAA,CAAE,MAAA,KAAW,UAAU,CAAA,CAAE,MAAA,KAAW,SAAS,OAAO,IAAA;AAC9D,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,SAAA,EAAW,OAAO,KAAA;AAEnC,IAAA,OAAO,CAAA,CAAE,cAAc,CAAA,IAAK,IAAA,CAAK,KAAI,GAAI,CAAA,CAAE,YAAY,CAAA,CAAE,SAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,GAAA,EAAsB;AAC5C,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC9B,IAAA,OAAO,CAAC,CAAC,CAAA,IAAK,EAAE,MAAA,KAAW,SAAA,IAAa,EAAE,SAAA,KAAc,CAAA;AAAA,EAC1D;AAAA,EAEA,YAAY,GAAA,EAA2C;AACrD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAAA,EAC9B;AAAA,EAEA,WAAA,CAAY,KAAa,CAAA,EAA2B;AAClD,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA;AAAA,EAC1B;AAAA,EAEA,cAAc,GAAA,EAAmB;AAC/B,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,eAAe,GAAA,EAAqB;AAClC,IAAA,MAAM,KAAK,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,KAAK,CAAA,IAAK,CAAA;AAC7C,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA;AAC3B,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,cAAc,GAAA,EAAqB;AACjC,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,IAAK,CAAA;AAAA,EACtC;AAAA;AAAA,EAGA,UAAU,GAAA,EAAmB;AAC3B,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC9B,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,GAAA,EAAK,EAAE,GAAG,CAAA,EAAG,SAAA,EAAW,GAAG,CAAA;AAC5C,MAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,IACjB;AAAA,EACF;AAAA;AAAA,EAGA,kBAAA,CAAmB,KAAa,IAAA,EAA6B;AAC3D,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAAA,EACrC;AAAA,EAEA,mBAAmB,GAAA,EAA0C;AAC3D,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,GAAG,CAAA;AAAA,EACtC;AAAA,EAEA,qBAAqB,GAAA,EAAmB;AACtC,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,GAAG,CAAA;AAAA,EAClC;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,KAAA,MAAW,SAAS,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO,eAAgB,KAAK,CAAA;AAC9D,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAEpB,IAAA,KAAA,MAAW,QAAQ,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAO,OAAQ,KAAA,EAAM;AAC9D,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EAEzB;AAAA,EAEA,QAAA,GAAuC;AACrC,IAAA,MAAM,SAAqC,EAAC;AAC5C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,KAAK,OAAA,EAAS;AACvC,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,SAAA,EAAW,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,IAChD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,QAAQ,KAAA,EAAyC;AAC/C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,GAAG,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,IACzD;AAAA,EACF;AACF,CAAA;AAEO,IAAM,cAAN,MAAkB;AAAA,EAIvB,YAAY,MAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,MAAA,GAAS,UAAU,EAAC;AACzB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC5C;AAAA,EAEA,aAAoB,GAAA,EAAmC;AACrD,IAAA,OAAO,KAAK,KAAA,CAAM,GAAA,CAAW,YAAA,CAAa,GAAG,CAAC,CAAA,EAAG,IAAA;AAAA,EACnD;AAAA,EAEA,YAAA,CACE,KACA,OAAA,EACM;AACN,IAAA,MAAM,CAAA,GAAI,aAAa,GAAG,CAAA;AAC1B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAW,CAAC,CAAA;AACxC,IAAA,MAAM,UACJ,OAAO,OAAA,KAAY,aACd,OAAA,CAA8C,QAAA,EAAU,IAAI,CAAA,GAC7D,OAAA;AACN,IAAA,IAAA,CAAK,MAAM,OAAA,CAAQ,CAAA,EAAG,OAAA,EAAS,QAAA,EAAU,aAAa,GAAM,CAAA;AAC5D,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,OAAA,EAAS,CAAC,CAAA;AAAA,EACpC;AAAA,EAEA,kBAAkB,OAAA,EAAwC;AACxD,IAAA,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,YAAA,CAAa,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,EACrD;AAAA,EAEA,MAAM,cAAc,OAAA,EAAiD;AACnE,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,OAAA,CAAQ,QAAQ,CAAA;AACvC,IAAA,IAAA,CAAK,KAAA,CAAM,kBAAA,CAAmB,CAAC,CAAA,EAAG,KAAA,EAAM;AACxC,IAAA,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAC,CAAA;AACjC,IAAA,IAAA,CAAK,KAAA,CAAM,eAAe,CAAC,CAAA;AAC3B,IAAA,IAAA,CAAK,KAAA,CAAM,cAAc,CAAC,CAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,CAAM,UAAU,CAAC,CAAA;AAAA,EACxB;AAAA,EAEA,MAAM,cAAqB,OAAA,EAIT;AAChB,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,OAAA,CAAQ,QAAQ,CAAA;AACvC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,OAAA,EAAQ;AACnC,MAAA,IAAA,CAAK,MAAM,OAAA,CAAQ,CAAA,EAAG,IAAA,EAAM,OAAA,CAAQ,aAAa,GAAM,CAAA;AACvD,MAAA,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,IAAA,EAAM,CAAC,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA,EAGA,aAAA,CAAc,MAAe,GAAA,EAAmB;AAC9C,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,IAAA,EAAM,GAAG,CAAA;AAAA,EACnC;AAAA,EAEA,WAAA,CAAY,OAAiB,GAAA,EAAmB;AAC9C,IAAA,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,KAAA,EAAO,GAAG,CAAA;AAAA,EAClC;AACF;AClQA,IAAM,UAAA,GAAaC,oBAAsC,IAAI,CAAA;AAEtD,SAAS,aAAA,GAAiC;AAC/C,EAAA,MAAM,GAAA,GAAMC,iBAAW,UAAU,CAAA;AACjC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,YAAA,GAA0B;AACxC,EAAA,OAAO,eAAc,CAAE,SAAA;AACzB;AAEA,SAAS,gBAAgB,MAAA,EAAyC;AAChE,EAAA,OAAO,IAAI,YAAY,MAAM,CAAA;AAC/B;AAEA,IAAI,kBAAA;AAEJ,SAAS,eAAe,MAAA,EAAyC;AAC/D,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,gBAAgB,MAAM,CAAA;AAChE,EAAA,IAAI,CAAC,kBAAA,EAAoB,kBAAA,GAAqB,eAAA,CAAgB,MAAM,CAAA;AACpE,EAAA,OAAO,kBAAA;AACT;AAeO,SAAS,WAAA,CAAY;AAAA,EAC1B,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAAwC;AACtC,EAAA,MAAM,KAAA,GAAQC,aAA2B,IAAI,CAAA;AAC7C,EAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,IAAA,MAAM,MAAA,GAA4B;AAAA,MAChC,MAAA;AAAA,MACA,GAAG;AAAA,KACL;AACA,IAAA,KAAA,CAAM,OAAA,GAAU,WAAA,IAAe,cAAA,CAAe,MAAM,CAAA;AACpD,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,aAAA,CAAc,OAAO,CAAA;AAAA,IACnD;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAASA,aAA+B,IAAI,CAAA;AAClD,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,OAAA,CAAQ,cAAc,MAAA,EAAQ;AAC1D,IAAA,MAAA,CAAO,UAAU,EAAE,SAAA,EAAW,MAAA,EAAQ,WAAA,EAAa,MAAM,OAAA,EAAQ;AAAA,EACnE;AAEA,EAAA,sCACG,UAAA,CAAW,QAAA,EAAX,EAAoB,KAAA,EAAO,MAAA,CAAO,SAAU,QAAA,EAAS,CAAA;AAE1D;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;;;AClF1B,eAAsB,SAAA,CAAa,IAAsB,OAAA,EAA6B;AACpF,EAAA,IAAI,OAAA;AACJ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACjC,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,GAAU,GAAA;AACV,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,MAAM,IAAI,OAAA;AAAA,UAAc,CAAC,GAAA,KACvB,UAAA,CAAW,GAAA,EAAK,IAAA,CAAK,IAAI,GAAA,GAAQ,CAAA,IAAK,CAAA,EAAG,GAAM,CAAC;AAAA,SAClD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,OAAA;AACR;AAKO,SAAS,WAAW,GAAA,EAAwB;AACjD,EAAA,IACE,GAAA,IAAO,QACP,OAAQ,GAAA,CAAiB,WAAW,QAAA,IACpC,OAAQ,GAAA,CAAiB,OAAA,KAAY,QAAA,EACrC;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,EAAA;AAAA,IACR,SAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,GAC1D;AACF;;;ACTO,SAAS,WAAA,CACd,QAAA,EACA,gBAAA,EACA,YAAA,EAC2B;AAC3B,EAAA,MAAM,EAAE,SAAA,EAAW,WAAA,EAAY,GAAI,aAAA,EAAc;AAKjD,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,OAAA;AAEJ,EAAA,MAAM,UAAA,GAAaA,aAAiC,IAAK,CAAA;AAEzD,EAAA,IAAI,OAAO,qBAAqB,QAAA,EAAU;AACxC,IAAA,MAAM,GAAA,GAAM,gBAAA;AACZ,IAAA,aAAA,GAAgB,YAAA;AAAA,MACd,OAAO,QAAA,KAAa,QAAA,GAAW,CAAC,QAAQ,CAAA,GAAI;AAAA,KAC9C;AACA,IAAA,UAAA,CAAW,OAAA,GAAU,CAAC,MAAA,KACpB,SAAA,CAAU,SAAS,GAAA,CAAW,GAAA,EAAK,EAAE,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACnE,IAAA,OAAA,GAAU,YAAA;AAAA,EACZ,CAAA,MAAA,IAAW,OAAO,gBAAA,KAAqB,UAAA,EAAY;AACjD,IAAA,MAAM,EAAA,GAAK,gBAAA;AACX,IAAA,aAAA,GAAgB,YAAA;AAAA,MACd,OAAO,QAAA,KAAa,QAAA,GAAW,CAAC,QAAQ,CAAA,GAAI;AAAA,KAC9C;AAEA,IAAA,UAAA,CAAW,OAAA,GAAU,CAAC,OAAA,KAAY,EAAA,CAAG,UAAU,QAAQ,CAAA;AACvD,IAAA,OAAA,GAAU,YAAA;AAAA,EACZ,CAAA,MAAO;AACL,IAAA,MAAM,GAAA,GAAM,QAAA;AACZ,IAAA,aAAA,GAAgB,YAAA,CAAa,CAAC,GAAG,CAAC,CAAA;AAClC,IAAA,UAAA,CAAW,OAAA,GAAU,CAAC,MAAA,KACpB,SAAA,CAAU,SAAS,GAAA,CAAW,GAAA,EAAK,EAAE,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACnE,IAAA,OAAA,GAAU,gBAAA;AAAA,EACZ;AAEA,EAAA,MAAM,UAAU,OAAA,EAAS,KAAA,KAAU,KAAA,GAAQ,CAAA,GAAK,SAAS,KAAA,IAAS,CAAA;AAClE,EAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,GAAA;AAGxC,EAAA,IAAI,OAAA,EAAS,gBAAgB,MAAA,IAAa,CAAC,YAAY,KAAA,CAAM,GAAA,CAAI,aAAa,CAAA,EAAG;AAC/E,IAAA,WAAA,CAAY,KAAA,CAAM,OAAA,CAAQ,aAAA,EAAe,OAAA,CAAQ,aAAa,SAAS,CAAA;AAAA,EACzE;AAGA,EAAA,MAAM,eAAA,GAAkBA,aAA8B,MAAS,CAAA;AAG/D,EAAA,MAAM,gBAAA,GAAmBA,aAAkD,MAAS,CAAA;AAEpF,EAAA,MAAM,OAAA,GAAUC,iBAAA;AAAA,IACd,OAAO,QAAQ,KAAA,KAAU;AACvB,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,YAAY,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,EAAG;AAEzD,MAAA,IAAI,WAAA,CAAY,KAAA,CAAM,WAAA,CAAY,aAAa,CAAA,EAAG;AAGlD,MAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,MAAA,WAAA,CAAY,KAAA,CAAM,kBAAA,CAAmB,aAAA,EAAe,IAAI,CAAA;AAExD,MAAA,WAAA,CAAY,KAAA,CAAM,WAAW,aAAa,CAAA;AAG1C,MAAA,MAAM,GAAA,GAAM,WAAA,CAAY,KAAA,CAAM,cAAA,CAAe,aAAa,CAAA;AAE1D,MAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,MAAA,MAAM,UAAU,SAAA,CAAU,MAAM,WAAW,OAAA,CAAQ,MAAM,GAAG,OAAO,CAAA;AACnE,MAAA,WAAA,CAAY,KAAA,CAAM,WAAA,CAAY,aAAA,EAAe,OAAO,CAAA;AAEpD,MAAA,IAAI;AACF,QAAA,MAAMC,QAAO,MAAM,OAAA;AAEnB,QAAA,IAAI,WAAA,CAAY,KAAA,CAAM,aAAA,CAAc,aAAa,MAAM,GAAA,EAAK;AAC5D,QAAA,WAAA,CAAY,KAAA,CAAM,OAAA,CAAQ,aAAA,EAAeA,KAAAA,EAAM,SAAS,CAAA;AACxD,QAAA,WAAA,CAAY,aAAA,CAAcA,OAAM,aAAa,CAAA;AAC7C,QAAA,WAAA,CAAY,KAAA,CAAM,qBAAqB,aAAa,CAAA;AAAA,MACtD,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,WAAA,CAAY,KAAA,CAAM,aAAA,CAAc,aAAa,MAAM,GAAA,EAAK;AAE5D,QAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,eAAA,EAAiB;AAC1D,QAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAC/B,QAAA,WAAA,CAAY,KAAA,CAAM,QAAA,CAAS,aAAA,EAAe,QAAQ,CAAA;AAClD,QAAA,WAAA,CAAY,WAAA,CAAY,UAAU,aAAa,CAAA;AAC/C,QAAA,WAAA,CAAY,KAAA,CAAM,qBAAqB,aAAa,CAAA;AAAA,MACtD;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAA,EAAe,SAAA,EAAW,OAAA,EAAS,WAAW;AAAA,GACjD;AAGA,EAAA,MAAM,gBAAA,GAAmBD,iBAAA;AAAA,IACvB,CAAC,QAAQ,KAAA,KAAU;AACjB,MAAA,MAAM,aAAa,OAAA,EAAS,QAAA;AAC5B,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,IAAI,gBAAA,CAAiB,YAAY,MAAA,EAAW;AAC1C,UAAA,YAAA,CAAa,iBAAiB,OAAO,CAAA;AAAA,QACvC;AACA,QAAA,gBAAA,CAAiB,OAAA,GAAU,WAAW,MAAM;AAC1C,UAAA,gBAAA,CAAiB,OAAA,GAAU,MAAA;AAC3B,UAAA,KAAK,QAAQ,KAAK,CAAA;AAAA,QACpB,GAAG,UAAU,CAAA;AAAA,MACf,CAAA,MAAO;AACL,QAAA,KAAK,QAAQ,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,OAAA,EAAS,QAAQ;AAAA,GAC7B;AAEA,EAAA,MAAM,KAAA,GAAQE,0BAAA;AAAA,IACZ,CAAC,MAAA,KAAW,WAAA,CAAY,KAAA,CAAM,SAAA,CAAU,eAAe,MAAM,CAAA;AAAA,IAC7D,MAAM,WAAA,CAAY,KAAA,CAAM,GAAA,CAAW,aAAa,CAAA;AAAA,IAChD,MAAM,WAAA,CAAY,KAAA,CAAM,GAAA,CAAW,aAAa;AAAA,GAClD;AAGA,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAA,EAAS,YAAY,KAAA,EAAO;AAChC,IAAA,gBAAA,EAAiB;AAGjB,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,gBAAA,CAAiB,YAAY,MAAA,EAAW;AAC1C,QAAA,YAAA,CAAa,iBAAiB,OAAO,CAAA;AACrC,QAAA,gBAAA,CAAiB,OAAA,GAAU,MAAA;AAAA,MAC7B;AACA,MAAA,WAAA,CAAY,KAAA,CAAM,kBAAA,CAAmB,aAAa,CAAA,EAAG,KAAA,EAAM;AAC3D,MAAA,WAAA,CAAY,KAAA,CAAM,qBAAqB,aAAa,CAAA;AAAA,IACtD,CAAA;AAAA,EAEF,CAAA,EAAG,CAAC,gBAAA,EAAkB,OAAA,EAAS,OAAO,CAAC,CAAA;AAKvC,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAA,EAAS,YAAY,KAAA,EAAO;AAChC,IAAA,IAAI,WAAA,CAAY,KAAA,CAAM,uBAAA,CAAwB,aAAa,GAAG,gBAAA,EAAiB;AAAA,EACjF,CAAA,EAAG,CAAC,KAAA,EAAO,gBAAA,EAAkB,eAAe,OAAA,EAAS,OAAA,EAAS,WAAW,CAAC,CAAA;AAG1E,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAS,YAAA,EAAc;AAC5B,IAAA,MAAM,KAAK,WAAA,CAAY,MAAM,iBAAiB,IAAI,CAAA,EAAG,QAAQ,YAAY,CAAA;AACzE,IAAA,OAAO,MAAM,cAAc,EAAE,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,gBAAA,EAAkB,OAAA,EAAS,YAAY,CAAC,CAAA;AAG5C,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAA,GAAU,SAAS,oBAAA,IAAwB,IAAA;AACjD,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,MAAA,KAAW,WAAA,EAAa;AAC/C,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,IAAI,WAAA,CAAY,KAAA,CAAM,OAAA,CAAQ,aAAa,GAAG,gBAAA,EAAiB;AAAA,IACjE,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAAA,EAC1D,GAAG,CAAC,gBAAA,EAAkB,eAAe,OAAA,EAAS,oBAAA,EAAsB,WAAW,CAAC,CAAA;AAEhF,EAAA,MAAM,UAAU,KAAA,EAAO,IAAA;AACvB,EAAA,IAAI,IAAA,GACF,SAAS,MAAA,KAAW,MAAA,IAAa,YAAY,MAAA,GACzC,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,GACrB,OAAA;AAGP,EAAA,IAAI,iBAAA,GAAoB,KAAA;AACxB,EAAA,IAAI,SAAS,MAAA,IAAa,KAAA,EAAO,WAAW,SAAA,IAAa,OAAA,EAAS,oBAAoB,MAAA,EAAW;AAC/F,IAAA,IAAA,GAAO,OAAA,CAAQ,eAAA;AACf,IAAA,iBAAA,GAAoB,IAAA;AAAA,EACtB;AAGA,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,EAC5B,CAAA,MAAA,IAAW,OAAA,EAAS,gBAAA,IAAoB,eAAA,CAAgB,YAAY,MAAA,EAAW;AAC7E,IAAA,IAAA,GAAO,eAAA,CAAgB,OAAA;AAAA,EACzB;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,SAAA,EAAW,KAAA,EAAO,MAAA,KAAW,SAAA,IAAa,OAAO,IAAA,KAAS,MAAA;AAAA,IAC1D,YAAA,EAAc,KAAA,EAAO,MAAA,KAAW,SAAA,IAAa,OAAO,IAAA,KAAS,MAAA;AAAA,IAC7D,UAAA,EAAY,OAAO,MAAA,KAAW,SAAA;AAAA,IAC9B,iBAAA;AAAA,IACA,SAAA,EAAW,OAAO,MAAA,KAAW,SAAA;AAAA,IAC7B,OAAA,EAAS,OAAO,MAAA,KAAW,OAAA;AAAA,IAC3B,KAAA,EAAO,OAAO,KAAA,IAAS,IAAA;AAAA,IACvB,MAAA,EAAQ,OAAO,MAAA,IAAU,MAAA;AAAA,IACzB,OAAA,EAAS,MAAM,KAAK,OAAA,CAAQ,IAAI;AAAA,GAClC;AACF;ACtMO,SAAS,cAAA,CACd,SACA,OAAA,EACsC;AACtC,EAAA,MAAM,EAAE,SAAA,EAAW,WAAA,EAAY,GAAI,aAAA,EAAc;AAEjD,EAAA,MAAM,UAAA,GAAaJ,aAAO,OAAO,CAAA;AACjC,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAErB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIK,cAAA,CAA+B;AAAA,IACvD,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,MAAM,WAAA,GAAcJ,iBAAAA;AAAA,IAClB,OAAO,SAAA,KAA0C;AAC/C,MAAA,MAAM,EAAE,MAAA,GAAS,MAAA,EAAQ,SAAA,EAAW,OAAA,EAAS,WAAA,EAAa,UAAA,EAAY,gBAAA,EAAiB,GACrF,UAAA,CAAW,OAAA,IAAW,EAAC;AAEzB,MAAA,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAW,OAAO,IAAA,EAAM,MAAA,EAAQ,WAAW,CAAA;AAG5D,MAAA,IAAI,YAAA;AACJ,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,YAAY,aAAA,CAAc,EAAE,QAAA,EAAU,UAAA,CAAW,UAAU,CAAA;AACjE,QAAA,YAAA,GAAe,WAAA,CAAY,YAAA,CAAoB,UAAA,CAAW,QAAQ,CAAA;AAClE,QAAA,WAAA,CAAY,YAAA;AAAA,UAAoB,UAAA,CAAW,QAAA;AAAA,UAAU,CAAC,GAAA,KACpD,UAAA,CAAW,OAAA,CAAQ,KAAK,SAAS;AAAA,SACnC;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GACJ,OAAO,OAAA,KAAY,UAAA,GACf,MAAM,OAAA,CAAQ,SAAA,CAAU,QAAA,EAAU,SAAS,CAAA,GAC3C,MAAM,SAAA,CAAU,SACb,OAAA,CAAe;AAAA,UACd,MAAA;AAAA,UACA,GAAA,EAAK,OAAA;AAAA,UACL,IAAA,EAAM,SAAA;AAAA,UACN,gBAAA,EACE,gBAAA,GACI,CAAC,GAAA,KAAQ;AACP,YAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,GACZ,IAAA,CAAK,KAAA,CAAO,IAAI,MAAA,GAAS,GAAA,CAAI,KAAA,GAAS,GAAG,CAAA,GACzC,CAAA;AACJ,YAAA,gBAAA,CAAiB,GAAG,CAAA;AAAA,UACtB,CAAA,GACA,KAAA;AAAA,SACP,CAAA,CACA,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAE3B,QAAA,QAAA,CAAS,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,WAAW,CAAA;AAEjD,QAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,UAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,YACZ,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,KAAQ,WAAA,CAAY,kBAAkB,EAAE,QAAA,EAAU,GAAA,EAAK,CAAC;AAAA,WAC3E;AAAA,QACF;AAEA,QAAA,MAAM,SAAA,GAAY,MAAM,SAAS,CAAA;AACjC,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,GAAA,EAAK;AAEZ,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,WAAA,CAAY,YAAA,CAAa,UAAA,CAAW,QAAA,EAAU,YAAY,CAAA;AAAA,QAC5D;AACA,QAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAC/B,QAAA,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAW,OAAO,QAAA,EAAU,MAAA,EAAQ,SAAS,CAAA;AAC9D,QAAA,OAAA,GAAU,QAAQ,CAAA;AAClB,QAAA,MAAM,QAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,WAAA,EAAa,OAAO;AAAA,GAClC;AAEA,EAAA,MAAM,MAAA,GAASA,iBAAAA;AAAA,IACb,CAAC,SAAA,KAA0B;AAEzB,MAAA,KAAK,WAAA,CAAY,SAAS,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAC9B,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAW,OAAO,IAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAC3D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,SAAA,EAAW,MAAM,MAAA,KAAW,SAAA;AAAA,IAC5B,SAAA,EAAW,MAAM,MAAA,KAAW,SAAA;AAAA,IAC5B,OAAA,EAAS,MAAM,MAAA,KAAW,OAAA;AAAA,IAC1B,OAAO,KAAA,CAAM,KAAA;AAAA,IACb;AAAA,GACF;AACF;AC5GO,SAAS,mBAAA,CACd,KACA,OAAA,EAC+B;AAC/B,EAAA,MAAM,EAAE,SAAA,EAAW,WAAA,EAAY,GAAI,aAAA,EAAc;AAEjD,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,CAAC,SAAA,EAAW,GAAG,CAAC,CAAA;AAC9C,EAAA,MAAM,UAAU,OAAA,CAAQ,KAAA,KAAU,KAAA,GAAQ,CAAA,GAAK,QAAQ,KAAA,IAAS,CAAA;AAChE,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,GAAA;AAGvC,EAAA,MAAM,UAAA,GAAaD,aAAO,OAAO,CAAA;AACjC,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAErB,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIK,eAAS,KAAK,CAAA;AAClE,EAAA,MAAM,CAAC,sBAAA,EAAwB,yBAAyB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAE1E,EAAA,MAAM,KAAA,GAAQF,0BAAAA;AAAA,IACZ,CAAC,MAAA,KAAW,WAAA,CAAY,KAAA,CAAM,SAAA,CAAU,UAAU,MAAM,CAAA;AAAA,IACxD,MAAM,WAAA,CAAY,KAAA,CAAM,GAAA,CAAyB,QAAQ,CAAA;AAAA,IACzD,MAAM,WAAA,CAAY,KAAA,CAAM,GAAA,CAAyB,QAAQ;AAAA,GAC3D;AAGA,EAAA,MAAM,QAAA,GAAW,CAAC,SAAA,KAA+B;AAC/C,IAAA,IAAI,SAAA,IAAa,MAAM,OAAO,GAAA;AAC9B,IAAA,OAAO,GAAA,IAAO,IAAI,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA,CAAA,GAAO,SAAA,GAAY,MAAA,CAAO,SAAS,CAAA;AAAA,EAC7E,CAAA;AAGA,EAAA,MAAM,YAAA,GAAeF,iBAAAA;AAAA,IACnB,CAAC,SAAA,KAAuC;AACtC,MAAA,MAAM,iBAAiB,UAAA,CAAW,OAAA;AAClC,MAAA,IAAI,eAAe,SAAA,EAAW;AAC5B,QAAA,OAAO,SAAA,CAAU,MAAM,cAAA,CAAe,SAAA,CAAW,WAAW,SAAA,CAAU,QAAQ,GAAG,OAAO,CAAA;AAAA,MAC1F;AACA,MAAA,OAAO,SAAA;AAAA,QACL,MAAM,SAAA,CAAU,QAAA,CAAS,GAAA,CAAW,QAAA,CAAS,SAAS,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA;AAAA,QAC3E;AAAA,OACF;AAAA,IACF,CAAA;AAAA;AAAA,IAEA,CAAC,SAAA,EAAW,OAAA,EAAS,GAAG;AAAA,GAC1B;AAGA,EAAA,MAAM,cAAA,GAAiBA,kBAAY,YAAY;AAC7C,IAAA,IAAI,WAAA,CAAY,KAAA,CAAM,WAAA,CAAY,QAAQ,CAAA,EAAG;AAE7C,IAAA,WAAA,CAAY,KAAA,CAAM,WAAW,QAAQ,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,KAAA,CAAM,cAAA,CAAe,QAAQ,CAAA;AAErD,IAAA,MAAM,OAAA,GAAU,aAAa,MAAS,CAAA;AACtC,IAAA,WAAA,CAAY,KAAA,CAAM,WAAA,CAAY,QAAA,EAAU,OAAO,CAAA;AAE/C,IAAA,IAAI;AACF,MAAA,MAAM,YAAY,MAAM,OAAA;AACxB,MAAA,IAAI,WAAA,CAAY,KAAA,CAAM,aAAA,CAAc,QAAQ,MAAM,GAAA,EAAK;AACvD,MAAA,MAAMK,aAAAA,GAAoC;AAAA,QACxC,KAAA,EAAO,CAAC,SAAS,CAAA;AAAA,QACjB,UAAA,EAAY,CAAC,KAAA,CAAS;AAAA,OACxB;AACA,MAAA,WAAA,CAAY,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAUA,aAAAA,EAAc,SAAS,CAAA;AAAA,IAC7D,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,WAAA,CAAY,KAAA,CAAM,aAAA,CAAc,QAAQ,MAAM,GAAA,EAAK;AACvD,MAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAC/B,MAAA,WAAA,CAAY,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,QAAQ,CAAA;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,YAAA,EAAc,SAAA,EAAW,WAAW,CAAC,CAAA;AAEnD,EAAAF,gBAAU,MAAM;AACd,IAAA,IAAI,OAAA,CAAQ,YAAY,KAAA,EAAO;AAC/B,IAAA,IAAI,CAAC,WAAA,CAAY,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC1C,IAAA,KAAK,cAAA,EAAe;AAAA,EACtB,GAAG,CAAC,cAAA,EAAgB,UAAU,OAAA,CAAQ,OAAA,EAAS,WAAW,CAAC,CAAA;AAE3D,EAAA,MAAM,aAAA,GAAgBH,kBAAY,MAAM;AACtC,IAAA,MAAM,WAAA,GAAc,WAAA,CAAY,KAAA,CAAM,GAAA,CAAyB,QAAQ,CAAA,EAAG,IAAA;AAC1E,IAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,KAAA,CAAM,WAAW,CAAA,EAAG;AAEpD,IAAA,MAAM,WAAW,WAAA,CAAY,KAAA,CAAM,WAAA,CAAY,KAAA,CAAM,SAAS,CAAC,CAAA;AAC/D,IAAA,MAAM,gBAAgB,UAAA,CAAW,OAAA,CAAQ,gBAAA,CAAiB,QAAA,EAAU,YAAY,KAAK,CAAA;AACrF,IAAA,IAAI,kBAAkB,MAAA,EAAW;AAEjC,IAAA,qBAAA,CAAsB,IAAI,CAAA;AAC1B,IAAA,KAAK,YAAA,CAAa,aAAa,CAAA,CAC5B,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,MAAA,MAAM,UAAA,GAAa,WAAA,CAAY,KAAA,CAAM,GAAA,CAAyB,QAAQ,CAAA,EAAG,IAAA;AACzE,MAAA,IAAI,CAAC,UAAA,EAAY;AACjB,MAAA,MAAM,OAAA,GAA+B;AAAA,QACnC,KAAA,EAAO,CAAC,GAAG,UAAA,CAAW,OAAO,OAAO,CAAA;AAAA,QACpC,UAAA,EAAY,CAAC,GAAG,UAAA,CAAW,YAAY,aAAa;AAAA,OACtD;AACA,MAAA,WAAA,CAAY,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,OAAA,EAAS,SAAS,CAAA;AAAA,IACxD,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAiB;AACvB,MAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAC/B,MAAA,WAAA,CAAY,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,QAAQ,CAAA;AAAA,IAC/C,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,MAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,IAC7B,CAAC,CAAA;AAAA,EACL,GAAG,CAAC,QAAA,EAAU,YAAA,EAAc,SAAA,EAAW,WAAW,CAAC,CAAA;AAEnD,EAAA,MAAM,iBAAA,GAAoBA,kBAAY,MAAM;AAC1C,IAAA,MAAM,WAAA,GAAc,WAAA,CAAY,KAAA,CAAM,GAAA,CAAyB,QAAQ,CAAA,EAAG,IAAA;AAC1E,IAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,KAAA,CAAM,WAAW,CAAA,EAAG;AAEpD,IAAA,MAAM,oBAAA,GAAuB,WAAW,OAAA,CAAQ,oBAAA;AAChD,IAAA,IAAI,CAAC,oBAAA,EAAsB;AAE3B,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,CAAM,CAAC,CAAA;AACrC,IAAA,MAAM,aAAA,GAAgB,oBAAA,CAAqB,SAAA,EAAW,WAAA,CAAY,KAAK,CAAA;AACvE,IAAA,IAAI,kBAAkB,MAAA,EAAW;AAEjC,IAAA,yBAAA,CAA0B,IAAI,CAAA;AAC9B,IAAA,KAAK,YAAA,CAAa,aAAa,CAAA,CAC5B,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,MAAA,MAAM,UAAA,GAAa,WAAA,CAAY,KAAA,CAAM,GAAA,CAAyB,QAAQ,CAAA,EAAG,IAAA;AACzE,MAAA,IAAI,CAAC,UAAA,EAAY;AACjB,MAAA,MAAM,OAAA,GAA+B;AAAA,QACnC,KAAA,EAAO,CAAC,OAAA,EAAS,GAAG,WAAW,KAAK,CAAA;AAAA,QACpC,UAAA,EAAY,CAAC,aAAA,EAAe,GAAG,WAAW,UAAU;AAAA,OACtD;AACA,MAAA,WAAA,CAAY,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,OAAA,EAAS,SAAS,CAAA;AAAA,IACxD,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAiB;AACvB,MAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAC/B,MAAA,WAAA,CAAY,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,QAAQ,CAAA;AAAA,IAC/C,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,MAAA,yBAAA,CAA0B,KAAK,CAAA;AAAA,IACjC,CAAC,CAAA;AAAA,EACL,GAAG,CAAC,QAAA,EAAU,YAAA,EAAc,SAAA,EAAW,WAAW,CAAC,CAAA;AAEnD,EAAA,MAAM,OAAA,GAAUA,kBAAY,MAAM;AAEhC,IAAA,WAAA,CAAY,KAAA,CAAM,eAAe,QAAQ,CAAA;AACzC,IAAA,WAAA,CAAY,KAAA,CAAM,cAAc,QAAQ,CAAA;AACxC,IAAA,KAAK,cAAA,EAAe;AAAA,EACtB,CAAA,EAAG,CAAC,QAAA,EAAU,cAAA,EAAgB,WAAW,CAAC,CAAA;AAE1C,EAAA,MAAM,eAAe,KAAA,EAAO,IAAA;AAG5B,EAAA,IAAI,WAAA,GAAc,KAAA;AAClB,EAAA,IAAI,eAAA,GAAkB,KAAA;AACtB,EAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACjD,IAAA,MAAM,WAAW,YAAA,CAAa,KAAA,CAAM,YAAA,CAAa,KAAA,CAAM,SAAS,CAAC,CAAA;AACjE,IAAA,WAAA,GAAc,WAAW,OAAA,CAAQ,gBAAA,CAAiB,QAAA,EAAU,YAAA,CAAa,KAAK,CAAA,KAAM,MAAA;AAEpF,IAAA,IAAI,UAAA,CAAW,QAAQ,oBAAA,EAAsB;AAC3C,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,KAAA,CAAM,CAAC,CAAA;AACtC,MAAA,eAAA,GACE,WAAW,OAAA,CAAQ,oBAAA,CAAqB,SAAA,EAAW,YAAA,CAAa,KAAK,CAAA,KAAM,MAAA;AAAA,IAC/E;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,SAAA,EAAW,KAAA,EAAO,MAAA,KAAW,SAAA,IAAa,OAAO,IAAA,KAAS,MAAA;AAAA,IAC1D,UAAA,EAAY,OAAO,MAAA,KAAW,SAAA;AAAA,IAC9B,kBAAA;AAAA,IACA,sBAAA;AAAA,IACA,SAAA,EAAW,OAAO,MAAA,KAAW,SAAA;AAAA,IAC7B,OAAA,EAAS,OAAO,MAAA,KAAW,OAAA;AAAA,IAC3B,KAAA,EAAO,OAAO,KAAA,IAAS,IAAA;AAAA,IACvB,WAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AACF;AChLO,SAAS,cACd,OAAA,EAC6B;AAC7B,EAAA,MAAM,EAAE,SAAA,EAAW,WAAA,EAAY,GAAI,aAAA,EAAc;AAGjD,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,GAAA,IAAO,CAAC,CAAA,CAAE,GAAG,CAAC,CAAC,CAAA;AAC9D,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAGhC,EAAA,MAAM,eAAA,GAAkBD,YAAAA,CAAmC,EAAE,CAAA;AAI7D,EAAA,MAAM,eAAA,GAAkBA,YAAAA,CAAkC,EAAE,CAAA;AAE5D,EAAA,MAAM,WAAA,GAAcC,kBAAY,MAAkC;AAChE,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAC,MAAM,WAAA,CAAY,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA;AACrD,IAAA,IACE,IAAA,CAAK,MAAA,KAAW,eAAA,CAAgB,OAAA,CAAQ,UACxC,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAG,MAAM,CAAA,KAAM,eAAA,CAAgB,OAAA,CAAQ,CAAC,CAAC,CAAA,EACrD;AACA,MAAA,OAAO,eAAA,CAAgB,OAAA;AAAA,IACzB;AACA,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EAET,CAAA,EAAG,CAAC,UAAA,EAAY,WAAW,CAAC,CAAA;AAG5B,EAAA,MAAM,SAAA,GAAYA,iBAAAA;AAAA,IAChB,CAAC,MAAA,KAAuB;AACtB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,YAAY,KAAA,CAAM,SAAA,CAAU,CAAA,EAAG,MAAM,CAAC,CAAA;AACrE,MAAA,OAAO,MAAM,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,KAAM,GAAG,CAAA;AAAA,IACxC,CAAA;AAAA;AAAA,IAEA,CAAC,YAAY,WAAW;AAAA,GAC1B;AAEA,EAAA,MAAM,OAAA,GAAUE,0BAAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAGxE,EAAA,MAAM,UAAA,GAAaF,iBAAAA;AAAA,IACjB,CAAC,KAAA,EAAyC,GAAA,EAAa,KAAA,GAAQ,KAAA,KAAU;AACvE,MAAA,MAAM,OAAO,KAAA,CAAM,OAAA;AACnB,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,YAAY,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC/C,MAAA,IAAI,WAAA,CAAY,KAAA,CAAM,WAAA,CAAY,GAAG,CAAA,EAAG;AAExC,MAAA,MAAM,UAAU,IAAA,EAAM,KAAA,KAAU,KAAA,GAAQ,CAAA,GAAK,MAAM,KAAA,IAAS,CAAA;AAC5D,MAAA,MAAM,EAAA,GAAK,MAAM,SAAA,IAAa,GAAA;AAE9B,MAAA,WAAA,CAAY,KAAA,CAAM,WAAW,GAAG,CAAA;AAChC,MAAA,MAAM,GAAA,GAAM,WAAA,CAAY,KAAA,CAAM,cAAA,CAAe,GAAG,CAAA;AAEhD,MAAA,MAAM,OAAA,GAAU,SAAA;AAAA,QACd,MAAM,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA;AAAA,QAC1D;AAAA,OACF;AACA,MAAA,WAAA,CAAY,KAAA,CAAM,WAAA,CAAY,GAAA,EAAK,OAAO,CAAA;AAE1C,MAAA,KAAK,OAAA,CACF,IAAA,CAAK,CAAC,IAAA,KAAS;AACd,QAAA,IAAI,WAAA,CAAY,KAAA,CAAM,aAAA,CAAc,GAAG,MAAM,GAAA,EAAK;AAClD,QAAA,WAAA,CAAY,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,IAAA,EAAM,EAAE,CAAA;AAAA,MACzC,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAiB;AACvB,QAAA,IAAI,WAAA,CAAY,KAAA,CAAM,aAAA,CAAc,GAAG,MAAM,GAAA,EAAK;AAClD,QAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAC/B,QAAA,WAAA,CAAY,KAAA,CAAM,QAAA,CAAS,GAAA,EAAK,QAAQ,CAAA;AAAA,MAC1C,CAAC,CAAA;AAAA,IACL,CAAA;AAAA,IACA,CAAC,WAAW,WAAW;AAAA,GACzB;AAGA,EAAAG,gBAAU,MAAM;AACd,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,CAAA,KAAM;AAC5B,MAAA,IAAI,KAAA,CAAM,OAAA,EAAS,OAAA,KAAY,KAAA,EAAO;AACtC,MAAA,UAAA,CAAW,KAAA,EAAO,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,EAEH,GAAG,CAAC,UAAA,EAAY,WAAA,EAAa,SAAA,EAAW,UAAU,CAAC,CAAA;AAEnD,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,KAAM;AAC/B,IAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,IAAA,MAAM,OAAO,KAAA,EAAO,OAAA;AACpB,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAElB,IAAA,MAAM,UAAU,KAAA,EAAO,IAAA;AACvB,IAAA,IAAI,IAAA,GACF,MAAM,MAAA,KAAW,MAAA,IAAa,YAAY,MAAA,GACtC,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,GAClB,OAAA;AAGP,IAAA,IAAI,iBAAA,GAAoB,KAAA;AACxB,IAAA,IAAI,SAAS,MAAA,IAAa,KAAA,EAAO,WAAW,SAAA,IAAa,IAAA,EAAM,oBAAoB,MAAA,EAAW;AAC5F,MAAA,IAAA,GAAO,IAAA,CAAK,eAAA;AACZ,MAAA,iBAAA,GAAoB,IAAA;AAAA,IACtB;AAGA,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,eAAA,CAAgB,OAAA,CAAQ,CAAC,CAAA,GAAI,IAAA;AAAA,IAC/B,WAAW,IAAA,EAAM,gBAAA,IAAoB,gBAAgB,OAAA,CAAQ,CAAC,MAAM,MAAA,EAAW;AAC7E,MAAA,IAAA,GAAO,eAAA,CAAgB,QAAQ,CAAC,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,SAAA,EAAW,KAAA,EAAO,MAAA,KAAW,SAAA,IAAa,OAAO,IAAA,KAAS,MAAA;AAAA,MAC1D,YAAA,EAAc,KAAA,EAAO,MAAA,KAAW,SAAA,IAAa,OAAO,IAAA,KAAS,MAAA;AAAA,MAC7D,UAAA,EAAY,OAAO,MAAA,KAAW,SAAA;AAAA,MAC9B,iBAAA;AAAA,MACA,SAAA,EAAW,OAAO,MAAA,KAAW,SAAA;AAAA,MAC7B,OAAA,EAAS,OAAO,MAAA,KAAW,OAAA;AAAA,MAC3B,KAAA,EAAQ,OAAO,KAAA,IAAS,IAAA;AAAA,MACxB,MAAA,EAAQ,OAAO,MAAA,IAAU,MAAA;AAAA,MACzB,SAAS,MAAM;AACb,QAAA,IAAI,CAAC,GAAA,IAAO,CAAC,KAAA,EAAO;AACpB,QAAA,UAAA,CAAW,KAAA,EAAO,KAAK,IAAI,CAAA;AAAA,MAC7B;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AC7HO,SAAS,mBAAA,CACd,KACA,OAAA,EAC+B;AAC/B,EAAA,MAAM,EAAE,SAAA,EAAW,WAAA,EAAY,GAAI,aAAA,EAAc;AAEjD,EAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,CAAC,GAAG,CAAC,CAAA;AACxC,EAAA,MAAM,UAAU,OAAA,EAAS,KAAA,KAAU,KAAA,GAAQ,CAAA,GAAK,SAAS,KAAA,IAAS,CAAA;AAClE,EAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,GAAA;AAExC,EAAA,MAAM,KAAA,GAAQD,0BAAAA;AAAA,IACZ,CAAC,MAAA,KAAW,WAAA,CAAY,KAAA,CAAM,SAAA,CAAU,eAAe,MAAM,CAAA;AAAA,IAC7D,MAAM,WAAA,CAAY,KAAA,CAAM,GAAA,CAAW,aAAa,CAAA;AAAA,IAChD,MAAM,WAAA,CAAY,KAAA,CAAM,GAAA,CAAW,aAAa;AAAA,GAClD;AAEA,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,SAAA,IAAc,MAAM,MAAA,KAAW,MAAA,IAAU,CAAC,KAAA,CAAM,IAAA,EAAO;AAEpF,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,KAAA,CAAM,WAAA,CAAY,aAAa,CAAA;AAC5D,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,QAAA;AAAA,IACR;AAGA,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,KAAA,CAAM,cAAA,CAAe,aAAa,CAAA;AAC1D,IAAA,WAAA,CAAY,KAAA,CAAM,WAAW,aAAa,CAAA;AAE1C,IAAA,MAAM,CAAA,GAAI,SAAA;AAAA,MACR,MAAM,SAAA,CAAU,QAAA,CAAS,GAAA,CAAW,GAAG,EAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA;AAAA,MAC3D;AAAA,KACF,CACG,IAAA,CAAK,CAAC,IAAA,KAAS;AACd,MAAA,IAAI,WAAA,CAAY,KAAA,CAAM,aAAA,CAAc,aAAa,MAAM,GAAA,EAAK;AAC1D,QAAA,WAAA,CAAY,KAAA,CAAM,OAAA,CAAQ,aAAA,EAAe,IAAA,EAAM,SAAS,CAAA;AAAA,MAC1D;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAiB;AACvB,MAAA,IAAI,WAAA,CAAY,KAAA,CAAM,aAAA,CAAc,aAAa,MAAM,GAAA,EAAK;AAC1D,QAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAC/B,QAAA,WAAA,CAAY,KAAA,CAAM,QAAA,CAAS,aAAA,EAAe,QAAQ,CAAA;AAClD,QAAA,MAAM,QAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAEH,IAAA,WAAA,CAAY,KAAA,CAAM,WAAA,CAAY,aAAA,EAAe,CAAC,CAAA;AAC9C,IAAA,MAAM,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,OAAA,EAAS;AAC5B,IAAA,MAAM,KAAA,CAAM,KAAA;AAAA,EACd;AAIA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,WAAA,CAAY,KAAA,CAAM,cAAc,aAAa,CAAA;AAC7C,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,KAAA,CAAM,cAAA,CAAe,aAAa,CAAA;AAE1D,IAAA,MAAM,CAAA,GAAI,SAAA;AAAA,MACR,MAAM,SAAA,CAAU,QAAA,CAAS,GAAA,CAAW,GAAG,EAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA;AAAA,MAC3D;AAAA,KACF,CACG,IAAA,CAAK,CAAC,IAAA,KAAS;AACd,MAAA,IAAI,WAAA,CAAY,KAAA,CAAM,aAAA,CAAc,aAAa,MAAM,GAAA,EAAK;AAC1D,QAAA,WAAA,CAAY,KAAA,CAAM,OAAA,CAAQ,aAAA,EAAe,IAAA,EAAM,SAAS,CAAA;AAAA,MAC1D;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAiB;AACvB,MAAA,IAAI,WAAA,CAAY,KAAA,CAAM,aAAA,CAAc,aAAa,MAAM,GAAA,EAAK;AAC1D,QAAA,WAAA,CAAY,KAAA,CAAM,QAAA,CAAS,aAAA,EAAe,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,MAC3D;AAAA,IACF,CAAC,CAAA;AAEH,IAAA,WAAA,CAAY,KAAA,CAAM,WAAA,CAAY,aAAA,EAAe,CAAC,CAAA;AAAA,EAChD,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,UAAA,EAAY,KAAA;AAAA,IACZ,YAAA,EAAc,KAAA;AAAA,IACd,SAAA,EAAW,IAAA;AAAA,IACX;AAAA,GACF;AACF;ACtFO,SAAS,WAAA,CACd,KACA,OAAA,EACY;AACZ,EAAA,MAAM,EAAE,SAAA,EAAW,WAAA,EAAY,GAAI,aAAA,EAAc;AAEjD,EAAA,MAAM,QAAA,GAAWF,kBAAY,MAAM;AACjC,IAAA,KAAK,YAAY,aAAA,CAAqB;AAAA,MACpC,QAAA,EAAU,CAAC,GAAG,CAAA;AAAA,MACd,OAAA,EAAS,MAAM,SAAA,CAAU,QAAA,CAAS,GAAA,CAAW,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA;AAAA,MACpE,WAAW,OAAA,EAAS;AAAA,KACrB,CAAA;AAAA,EACH,GAAG,CAAC,GAAA,EAAK,aAAa,SAAA,EAAW,OAAA,EAAS,SAAS,CAAC,CAAA;AAEpD,EAAA,OAAO,QAAA;AACT;;;ACRA,eAAsB,YAAA,CACpB,aACA,MAAA,EACqB;AACrB,EAAA,MAAM,UAAA,GAAa,OAAO,GAAA,IAAO,gBAAA;AACjC,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,EAAA,GAAK,EAAA,GAAK,GAAA;AAG1C,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAQ,UAAU,CAAA;AACnD,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,IAAI,MAAA,CAAO,OAAA,GAAU,MAAA,GAAS,IAAA,CAAK,KAAI,EAAG;AACxC,QAAA,WAAA,CAAY,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA;AAAA,MAC1C,CAAA,MAAO;AAEL,QAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA;AAAA,MAC3C;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,IAAI,aAAA;AAEJ,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,IAAI,aAAA,KAAkB,MAAA,EAAW,YAAA,CAAa,aAAa,CAAA;AAC3D,IAAA,aAAA,GAAgB,WAAW,MAAM;AAC/B,MAAA,aAAA,GAAgB,MAAA;AAChB,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,KAAA,CAAM,QAAA,EAAS;AAC5C,MAAA,MAAM,OAAA,GAA0B;AAAA,QAC9B,OAAA,EAAS,QAAA;AAAA,QACT,OAAA,EAAS,KAAK,GAAA;AAAI,OACpB;AACA,MAAA,KAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,YAAY,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,IACjE,GAAG,GAAI,CAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,KAAA,CAAM,eAAA,CAAgB,KAAK,CAAA;AAG3D,EAAA,OAAO,MAAM;AACX,IAAA,WAAA,EAAY;AACZ,IAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,MAAA,YAAA,CAAa,aAAa,CAAA;AAC1B,MAAA,aAAA,GAAgB,MAAA;AAAA,IAClB;AAAA,EACF,CAAA;AACF","file":"index.cjs","sourcesContent":["import axios from 'axios';\nimport type { AxiosInstance, AxiosError, InternalAxiosRequestConfig } from 'axios';\nimport type { ApiClientConfig, ApiError } from './types';\n\n// Extend InternalAxiosRequestConfig to include our retry sentinel\ninterface RetriableRequestConfig extends InternalAxiosRequestConfig {\n _retried?: boolean;\n}\n\nexport class ApiClient {\n readonly instance: AxiosInstance;\n readonly config: ApiClientConfig;\n\n constructor(config: ApiClientConfig) {\n this.config = config;\n this.instance = axios.create({\n baseURL: config.baseURL,\n headers: config.headers,\n timeout: config.timeout ?? 10_000,\n });\n\n this.setupInterceptors();\n }\n\n private setupInterceptors(): void {\n this.instance.interceptors.request.use(async (requestConfig) => {\n if (this.config.getAuthToken) {\n const token = await this.config.getAuthToken();\n if (token) {\n requestConfig.headers.Authorization = `Bearer ${token}`;\n }\n }\n return requestConfig;\n });\n\n this.instance.interceptors.response.use(\n (response) => response,\n async (error: AxiosError) => {\n const retriableConfig = error.config as RetriableRequestConfig | undefined;\n\n if (\n error.response?.status === 401 &&\n this.config.refreshToken &&\n retriableConfig &&\n !retriableConfig._retried\n ) {\n retriableConfig._retried = true;\n try {\n const newToken = await this.config.refreshToken();\n retriableConfig.headers['Authorization'] = `Bearer ${newToken}`;\n return await this.instance.request(retriableConfig);\n } catch (refreshErr) {\n this.config.onRefreshError?.(refreshErr);\n }\n }\n\n return Promise.reject(normalizeError(error));\n },\n );\n }\n}\n\nfunction normalizeError(error: AxiosError): ApiError {\n if (error.response) {\n const responseData = error.response.data as Record<string, unknown> | undefined;\n return {\n status: error.response.status,\n message:\n (typeof responseData?.['message'] === 'string' ? responseData['message'] : null) ??\n error.message,\n data: error.response.data,\n };\n }\n // No response received — covers both \"no request object\" (mock network errors,\n // request setup failures) and \"request sent but no response\" (real network errors).\n // Treat all as status 0 (network-level failure) for a consistent error shape.\n return { status: 0, message: 'No response received from server' };\n}\n\nexport function createApiClient(config: ApiClientConfig): ApiClient {\n return new ApiClient(config);\n}\n","import type { ApiError, QueryStatus, QueryClientConfig } from './types';\n\nexport type { QueryStatus };\n\nexport interface CacheEntry<TData = unknown> {\n data: TData | undefined;\n error: ApiError | undefined;\n status: QueryStatus;\n updatedAt: number;\n staleTime: number;\n}\n\ntype Subscriber = () => void;\n\nexport function serializeKey(key: unknown[]): string {\n return JSON.stringify(key);\n}\n\nexport class QueryCache {\n private entries = new Map<string, CacheEntry>();\n private subscribers = new Map<string, Set<Subscriber>>();\n private inFlight = new Map<string, Promise<unknown>>();\n // Discards responses from requests that were superseded (e.g. after cancelQueries)\n private generations = new Map<string, number>();\n // Evicts entries when no subscriber remains for longer than gcTime\n private gcTimers = new Map<string, ReturnType<typeof setTimeout>>();\n // AbortControllers for in-flight requests\n private abortControllers = new Map<string, AbortController>();\n // Global subscribers (for persistence and devtools)\n private globalSubscribers = new Set<() => void>();\n\n readonly gcTime: number;\n\n constructor(gcTime = 5 * 60_000) {\n this.gcTime = gcTime;\n }\n\n get<TData>(key: string): CacheEntry<TData> | undefined {\n return this.entries.get(key) as CacheEntry<TData> | undefined;\n }\n\n subscribe(key: string, fn: Subscriber): () => void {\n // A new subscriber cancels any pending GC eviction for this key\n const pending = this.gcTimers.get(key);\n if (pending !== undefined) {\n clearTimeout(pending);\n this.gcTimers.delete(key);\n }\n\n if (!this.subscribers.has(key)) this.subscribers.set(key, new Set());\n this.subscribers.get(key)!.add(fn);\n\n return () => {\n const set = this.subscribers.get(key);\n if (!set) return;\n set.delete(fn);\n if (set.size === 0) {\n this.subscribers.delete(key);\n // Schedule eviction after the last subscriber leaves\n const timer = setTimeout(() => {\n this.entries.delete(key);\n this.generations.delete(key);\n this.gcTimers.delete(key);\n }, this.gcTime);\n this.gcTimers.set(key, timer);\n }\n };\n }\n\n subscribeGlobal(fn: () => void): () => void {\n this.globalSubscribers.add(fn);\n return () => this.globalSubscribers.delete(fn);\n }\n\n private notify(key: string): void {\n this.subscribers.get(key)?.forEach((fn) => fn());\n this.globalSubscribers.forEach((fn) => fn());\n }\n\n setData<TData>(key: string, data: TData, staleTime: number): void {\n this.entries.set(key, {\n data,\n error: undefined,\n status: 'success',\n updatedAt: Date.now(),\n staleTime,\n });\n this.inFlight.delete(key);\n this.notify(key);\n }\n\n setError(key: string, error: ApiError): void {\n const existing = this.entries.get(key);\n this.entries.set(key, {\n data: existing?.data,\n error,\n status: 'error',\n updatedAt: Date.now(),\n staleTime: 0,\n });\n this.inFlight.delete(key);\n this.notify(key);\n }\n\n setLoading(key: string): void {\n const existing = this.entries.get(key);\n if (existing?.status === 'loading') return;\n this.entries.set(key, {\n data: existing?.data,\n error: undefined,\n status: 'loading',\n updatedAt: existing?.updatedAt ?? 0,\n staleTime: existing?.staleTime ?? 0,\n });\n this.notify(key);\n }\n\n isStale(key: string): boolean {\n const e = this.entries.get(key);\n if (!e || e.status === 'idle' || e.status === 'error') return true;\n if (e.status === 'loading') return false;\n // updatedAt === 0 is the sentinel written by markStale()\n return e.updatedAt === 0 || Date.now() - e.updatedAt > e.staleTime;\n }\n\n // True only when markStale() was explicitly called on a successful entry.\n // Used to detect *external* invalidation (e.g. after a mutation) vs time-based\n // staleness, so the re-fetch effect doesn't loop when staleTime is 0.\n isExternallyInvalidated(key: string): boolean {\n const e = this.entries.get(key);\n return !!e && e.status === 'success' && e.updatedAt === 0;\n }\n\n getInFlight(key: string): Promise<unknown> | undefined {\n return this.inFlight.get(key);\n }\n\n setInFlight(key: string, p: Promise<unknown>): void {\n this.inFlight.set(key, p);\n }\n\n clearInFlight(key: string): void {\n this.inFlight.delete(key);\n }\n\n // Returns the new generation. Does NOT touch inFlight — call clearInFlight separately.\n bumpGeneration(key: string): number {\n const g = (this.generations.get(key) ?? 0) + 1;\n this.generations.set(key, g);\n return g;\n }\n\n getGeneration(key: string): number {\n return this.generations.get(key) ?? 0;\n }\n\n // Sets updatedAt = 0 as the sentinel for \"externally invalidated\"\n markStale(key: string): void {\n const e = this.entries.get(key);\n if (e) {\n this.entries.set(key, { ...e, updatedAt: 0 });\n this.notify(key);\n }\n }\n\n // AbortController management\n setAbortController(key: string, ctrl: AbortController): void {\n this.abortControllers.set(key, ctrl);\n }\n\n getAbortController(key: string): AbortController | undefined {\n return this.abortControllers.get(key);\n }\n\n clearAbortController(key: string): void {\n this.abortControllers.delete(key);\n }\n\n clear(): void {\n for (const timer of this.gcTimers.values()) clearTimeout(timer);\n this.gcTimers.clear();\n // Abort all in-flight requests\n for (const ctrl of this.abortControllers.values()) ctrl.abort();\n this.abortControllers.clear();\n this.entries.clear();\n this.inFlight.clear();\n this.generations.clear();\n this.subscribers.clear();\n // globalSubscribers intentionally NOT cleared — they survive cache clears\n }\n\n snapshot(): Record<string, CacheEntry> {\n const result: Record<string, CacheEntry> = {};\n for (const [key, entry] of this.entries) {\n if (entry.status === 'success') result[key] = entry;\n }\n return result;\n }\n\n restore(state: Record<string, CacheEntry>): void {\n for (const [key, entry] of Object.entries(state)) {\n if (!this.entries.has(key)) this.entries.set(key, entry);\n }\n }\n}\n\nexport class QueryClient {\n readonly cache: QueryCache;\n private readonly config: QueryClientConfig;\n\n constructor(config?: QueryClientConfig) {\n this.config = config ?? {};\n this.cache = new QueryCache(config?.gcTime);\n }\n\n getQueryData<TData>(key: unknown[]): TData | undefined {\n return this.cache.get<TData>(serializeKey(key))?.data;\n }\n\n setQueryData<TData>(\n key: unknown[],\n updater: TData | ((old: TData | undefined) => TData),\n ): void {\n const k = serializeKey(key);\n const existing = this.cache.get<TData>(k);\n const newData =\n typeof updater === 'function'\n ? (updater as (old: TData | undefined) => TData)(existing?.data)\n : updater;\n this.cache.setData(k, newData, existing?.staleTime ?? 60_000);\n this.config.onSuccess?.(newData, k);\n }\n\n invalidateQueries(options: { queryKey: unknown[] }): void {\n this.cache.markStale(serializeKey(options.queryKey));\n }\n\n async cancelQueries(options: { queryKey: unknown[] }): Promise<void> {\n const k = serializeKey(options.queryKey);\n this.cache.getAbortController(k)?.abort();\n this.cache.clearAbortController(k);\n this.cache.bumpGeneration(k);\n this.cache.clearInFlight(k);\n this.cache.markStale(k);\n }\n\n async prefetchQuery<TData>(options: {\n queryKey: unknown[];\n queryFn: () => Promise<TData>;\n staleTime?: number;\n }): Promise<void> {\n const k = serializeKey(options.queryKey);\n if (!this.cache.isStale(k)) return;\n try {\n const data = await options.queryFn();\n this.cache.setData(k, data, options.staleTime ?? 60_000);\n this.config.onSuccess?.(data, k);\n } catch {\n // Prefetch failures are silent; the client will re-fetch\n }\n }\n\n // Called internally after setData / setError to fire global callbacks\n notifySuccess(data: unknown, key: string): void {\n this.config.onSuccess?.(data, key);\n }\n\n notifyError(error: ApiError, key: string): void {\n this.config.onError?.(error, key);\n }\n}\n","import React, { createContext, useContext, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport { QueryClient } from './cache';\nimport type { ApiClient } from './client';\nimport type { DehydratedState } from './server';\nimport type { QueryClientConfig } from './types';\n\ninterface ApiContextValue {\n apiClient: ApiClient;\n queryClient: QueryClient;\n}\n\nconst ApiContext = createContext<ApiContextValue | null>(null);\n\nexport function useApiContext(): ApiContextValue {\n const ctx = useContext(ApiContext);\n if (!ctx) {\n throw new Error(\n '[api-client] Hooks must be used within <ApiProvider>. ' +\n 'Wrap your app root with <ApiProvider client={api}>.',\n );\n }\n return ctx;\n}\n\nexport function useApiClient(): ApiClient {\n return useApiContext().apiClient;\n}\n\nfunction makeQueryClient(config?: QueryClientConfig): QueryClient {\n return new QueryClient(config);\n}\n\nlet browserQueryClient: QueryClient | undefined;\n\nfunction getQueryClient(config?: QueryClientConfig): QueryClient {\n if (typeof window === 'undefined') return makeQueryClient(config);\n if (!browserQueryClient) browserQueryClient = makeQueryClient(config);\n return browserQueryClient;\n}\n\nexport interface ApiProviderProps {\n client: ApiClient;\n children: ReactNode;\n /** Inject a pre-built QueryClient (advanced / testing) */\n queryClient?: QueryClient;\n /** Override the GC time for entries with no active subscriber (ms, default 5 min) */\n gcTime?: number;\n /** Hydrate from server-prefetched state (SSR) */\n hydratedState?: DehydratedState;\n /** Global QueryClient configuration (callbacks etc.) */\n queryClientConfig?: QueryClientConfig;\n}\n\nexport function ApiProvider({\n client,\n children,\n queryClient,\n gcTime,\n hydratedState,\n queryClientConfig,\n}: ApiProviderProps): React.JSX.Element {\n const qcRef = useRef<QueryClient | null>(null);\n if (!qcRef.current) {\n const config: QueryClientConfig = {\n gcTime,\n ...queryClientConfig,\n };\n qcRef.current = queryClient ?? getQueryClient(config);\n if (hydratedState) {\n qcRef.current.cache.restore(hydratedState.entries);\n }\n }\n\n const ctxRef = useRef<ApiContextValue | null>(null);\n if (!ctxRef.current || ctxRef.current.apiClient !== client) {\n ctxRef.current = { apiClient: client, queryClient: qcRef.current };\n }\n\n return (\n <ApiContext.Provider value={ctxRef.current}>{children}</ApiContext.Provider>\n );\n}\n\nApiProvider.displayName = 'ApiProvider';\n","import type { ApiError } from './types';\n\nexport async function withRetry<T>(fn: () => Promise<T>, retries: number): Promise<T> {\n let lastErr: unknown;\n for (let i = 0; i <= retries; i++) {\n try {\n return await fn();\n } catch (err) {\n lastErr = err;\n if (i < retries) {\n await new Promise<void>((res) =>\n setTimeout(res, Math.min(1_000 * 2 ** i, 30_000)),\n );\n }\n }\n }\n throw lastErr;\n}\n\n// Normalizes any thrown value into a well-shaped ApiError.\n// Axios errors are already normalized by the response interceptor; this handles\n// non-Axios throws from custom mutation functions.\nexport function toApiError(err: unknown): ApiError {\n if (\n err != null &&\n typeof (err as ApiError).status === 'number' &&\n typeof (err as ApiError).message === 'string'\n ) {\n return err as ApiError;\n }\n return {\n status: -1,\n message: err instanceof Error ? err.message : String(err),\n };\n}\n","import { useCallback, useEffect, useRef, useSyncExternalStore } from 'react';\nimport type { AxiosInstance } from 'axios';\nimport { serializeKey } from '../cache';\nimport { useApiContext } from '../provider';\nimport type { UseApiQueryOptions, ApiQueryResult } from '../types';\nimport { withRetry, toApiError } from '../utils';\n\ntype FetcherFn<TData> = (instance: AxiosInstance) => Promise<TData>;\n\n// Internal fetcher receives a signal for AbortController support\ntype InternalFetcherFn<TData> = (signal: AbortSignal) => Promise<TData>;\n\n// Overload 1: useApiQuery('/users') — URL is both key and fetcher\nexport function useApiQuery<TData = unknown, TSelected = TData>(\n url: string,\n options?: UseApiQueryOptions<TData, TSelected>,\n): ApiQueryResult<TSelected>;\n\n// Overload 2: useApiQuery(['/users', id], '/users/1') or useApiQuery(key, fetcherFn)\nexport function useApiQuery<TData = unknown, TSelected = TData>(\n key: unknown[] | string,\n urlOrFn: string | FetcherFn<TData>,\n options?: UseApiQueryOptions<TData, TSelected>,\n): ApiQueryResult<TSelected>;\n\nexport function useApiQuery<TData = unknown, TSelected = TData>(\n keyOrUrl: string | unknown[],\n urlOrFnOrOptions?: string | FetcherFn<TData> | UseApiQueryOptions<TData, TSelected>,\n maybeOptions?: UseApiQueryOptions<TData, TSelected>,\n): ApiQueryResult<TSelected> {\n const { apiClient, queryClient } = useApiContext();\n\n // Resolve overloads into a stable serialized key + a fetcher ref.\n // The fetcher is stored in a ref so doFetch's useCallback deps stay stable\n // even when the URL or custom fn changes between renders.\n let serializedKey: string;\n let options: UseApiQueryOptions<TData, TSelected> | undefined;\n\n const fetcherRef = useRef<InternalFetcherFn<TData>>(null!);\n\n if (typeof urlOrFnOrOptions === 'string') {\n const url = urlOrFnOrOptions;\n serializedKey = serializeKey(\n typeof keyOrUrl === 'string' ? [keyOrUrl] : keyOrUrl,\n );\n fetcherRef.current = (signal) =>\n apiClient.instance.get<TData>(url, { signal }).then((r) => r.data);\n options = maybeOptions;\n } else if (typeof urlOrFnOrOptions === 'function') {\n const fn = urlOrFnOrOptions;\n serializedKey = serializeKey(\n typeof keyOrUrl === 'string' ? [keyOrUrl] : keyOrUrl,\n );\n // Custom fetcher — signal is not forwarded (backward-compat)\n fetcherRef.current = (_signal) => fn(apiClient.instance);\n options = maybeOptions;\n } else {\n const url = keyOrUrl as string;\n serializedKey = serializeKey([url]);\n fetcherRef.current = (signal) =>\n apiClient.instance.get<TData>(url, { signal }).then((r) => r.data);\n options = urlOrFnOrOptions;\n }\n\n const retries = options?.retry === false ? 0 : (options?.retry ?? 1);\n const staleTime = options?.staleTime ?? 60_000;\n\n // initialData: populate cache before first render if empty\n if (options?.initialData !== undefined && !queryClient.cache.get(serializedKey)) {\n queryClient.cache.setData(serializedKey, options.initialData, staleTime);\n }\n\n // keepPreviousData: track last non-undefined data\n const previousDataRef = useRef<TSelected | undefined>(undefined);\n\n // Debounce timer ref\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n const doFetch = useCallback(\n async (force = false) => {\n if (!force && !queryClient.cache.isStale(serializedKey)) return;\n // Deduplicate concurrent calls — only one in-flight request per key\n if (queryClient.cache.getInFlight(serializedKey)) return;\n\n // Create AbortController for this fetch\n const ctrl = new AbortController();\n queryClient.cache.setAbortController(serializedKey, ctrl);\n\n queryClient.cache.setLoading(serializedKey);\n // Bump generation AFTER the in-flight guard so bumpGeneration no longer\n // needs to clear inFlight (fixes the race window between guard and setInFlight)\n const gen = queryClient.cache.bumpGeneration(serializedKey);\n\n const signal = ctrl.signal;\n const promise = withRetry(() => fetcherRef.current(signal), retries);\n queryClient.cache.setInFlight(serializedKey, promise);\n\n try {\n const data = await promise;\n // Discard if a newer generation started (e.g. cancelQueries during optimistic update)\n if (queryClient.cache.getGeneration(serializedKey) !== gen) return;\n queryClient.cache.setData(serializedKey, data, staleTime);\n queryClient.notifySuccess(data, serializedKey);\n queryClient.cache.clearAbortController(serializedKey);\n } catch (err) {\n if (queryClient.cache.getGeneration(serializedKey) !== gen) return;\n // Ignore abort errors — they are expected when the component unmounts or query is cancelled\n if (err instanceof Error && err.name === 'CanceledError') return;\n const apiError = toApiError(err);\n queryClient.cache.setError(serializedKey, apiError);\n queryClient.notifyError(apiError, serializedKey);\n queryClient.cache.clearAbortController(serializedKey);\n }\n },\n [serializedKey, staleTime, retries, queryClient],\n );\n\n // Debounced version of doFetch\n const debouncedDoFetch = useCallback(\n (force = false) => {\n const debounceMs = options?.debounce;\n if (debounceMs) {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n }\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = undefined;\n void doFetch(force);\n }, debounceMs);\n } else {\n void doFetch(force);\n }\n },\n [doFetch, options?.debounce],\n );\n\n const entry = useSyncExternalStore(\n (notify) => queryClient.cache.subscribe(serializedKey, notify),\n () => queryClient.cache.get<TData>(serializedKey),\n () => queryClient.cache.get<TData>(serializedKey),\n );\n\n // Initial fetch (and re-fetch when key/enabled changes)\n useEffect(() => {\n if (options?.enabled === false) return;\n debouncedDoFetch();\n\n // Cleanup: abort in-flight request on unmount\n return () => {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n queryClient.cache.getAbortController(serializedKey)?.abort();\n queryClient.cache.clearAbortController(serializedKey);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [debouncedDoFetch, options?.enabled]);\n\n // Re-fetch when explicitly invalidated externally (e.g. after a mutation).\n // Uses isExternallyInvalidated (updatedAt === 0 sentinel) rather than isStale\n // so that staleTime: 0 does NOT cause an infinite re-fetch loop.\n useEffect(() => {\n if (options?.enabled === false) return;\n if (queryClient.cache.isExternallyInvalidated(serializedKey)) debouncedDoFetch();\n }, [entry, debouncedDoFetch, serializedKey, options?.enabled, queryClient]);\n\n // Polling\n useEffect(() => {\n if (!options?.pollInterval) return;\n const id = setInterval(() => debouncedDoFetch(true), options.pollInterval);\n return () => clearInterval(id);\n }, [debouncedDoFetch, options?.pollInterval]);\n\n // Refetch on window focus (time-based staleness path — not the invalidation path)\n useEffect(() => {\n const enabled = options?.refetchOnWindowFocus ?? true;\n if (!enabled || typeof window === 'undefined') return;\n const handler = () => {\n if (queryClient.cache.isStale(serializedKey)) debouncedDoFetch();\n };\n window.addEventListener('focus', handler);\n return () => window.removeEventListener('focus', handler);\n }, [debouncedDoFetch, serializedKey, options?.refetchOnWindowFocus, queryClient]);\n\n const rawData = entry?.data;\n let data: TSelected | undefined =\n options?.select !== undefined && rawData !== undefined\n ? options.select(rawData)\n : (rawData as unknown as TSelected | undefined);\n\n // placeholderData: show placeholder while loading and no data yet\n let isPlaceholderData = false;\n if (data === undefined && entry?.status === 'loading' && options?.placeholderData !== undefined) {\n data = options.placeholderData;\n isPlaceholderData = true;\n }\n\n // keepPreviousData: return last non-undefined data when data is undefined\n if (data !== undefined) {\n previousDataRef.current = data;\n } else if (options?.keepPreviousData && previousDataRef.current !== undefined) {\n data = previousDataRef.current;\n }\n\n return {\n data,\n isLoading: entry?.status === 'loading' && entry?.data === undefined,\n isRefetching: entry?.status === 'loading' && entry?.data !== undefined,\n isFetching: entry?.status === 'loading',\n isPlaceholderData,\n isSuccess: entry?.status === 'success',\n isError: entry?.status === 'error',\n error: entry?.error ?? null,\n status: entry?.status ?? 'idle',\n refetch: () => void doFetch(true),\n };\n}\n","import { useCallback, useRef, useState } from 'react';\nimport type { AxiosInstance } from 'axios';\nimport { useApiContext } from '../provider';\nimport type { ApiError, UseApiMutationOptions, ApiMutationResult } from '../types';\nimport { toApiError } from '../utils';\n\ntype MutationFn<TData, TVariables> = (\n instance: AxiosInstance,\n variables: TVariables,\n) => Promise<TData>;\n\ntype MutationStatus = 'idle' | 'pending' | 'success' | 'error';\n\ninterface MutationState<TData> {\n data: TData | undefined;\n error: ApiError | null;\n status: MutationStatus;\n}\n\nexport function useApiMutation<TData = unknown, TVariables = unknown>(\n urlOrFn: string | MutationFn<TData, TVariables>,\n options?: UseApiMutationOptions<TData, TVariables>,\n): ApiMutationResult<TData, TVariables> {\n const { apiClient, queryClient } = useApiContext();\n // Always read the latest options without requiring them in useCallback deps\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const [state, setState] = useState<MutationState<TData>>({\n data: undefined,\n error: null,\n status: 'idle',\n });\n\n const mutateAsync = useCallback(\n async (variables: TVariables): Promise<TData> => {\n const { method = 'POST', onSuccess, onError, invalidates, optimistic, onUploadProgress } =\n optionsRef.current ?? {};\n\n setState({ data: undefined, error: null, status: 'pending' });\n\n // Snapshot + apply optimistic update before the request fires\n let previousData: TData | undefined;\n if (optimistic) {\n await queryClient.cancelQueries({ queryKey: optimistic.queryKey });\n previousData = queryClient.getQueryData<TData>(optimistic.queryKey);\n queryClient.setQueryData<TData>(optimistic.queryKey, (old) =>\n optimistic.updater(old, variables),\n );\n }\n\n try {\n const data =\n typeof urlOrFn === 'function'\n ? await urlOrFn(apiClient.instance, variables)\n : await apiClient.instance\n .request<TData>({\n method,\n url: urlOrFn,\n data: variables,\n onUploadProgress:\n onUploadProgress\n ? (evt) => {\n const pct = evt.total\n ? Math.round((evt.loaded / evt.total) * 100)\n : 0;\n onUploadProgress(pct);\n }\n : undefined,\n })\n .then((r) => r.data);\n\n setState({ data, error: null, status: 'success' });\n\n if (invalidates?.length) {\n await Promise.all(\n invalidates.map((key) => queryClient.invalidateQueries({ queryKey: key })),\n );\n }\n\n await onSuccess?.(data, variables);\n return data;\n } catch (err) {\n // Rollback optimistic update on failure\n if (optimistic) {\n queryClient.setQueryData(optimistic.queryKey, previousData);\n }\n const apiError = toApiError(err);\n setState({ data: undefined, error: apiError, status: 'error' });\n onError?.(apiError);\n throw apiError;\n }\n },\n [apiClient, queryClient, urlOrFn],\n );\n\n const mutate = useCallback(\n (variables: TVariables) => {\n // Swallow the rejection — callers observe state.error instead\n void mutateAsync(variables).catch(() => undefined);\n },\n [mutateAsync],\n );\n\n const reset = useCallback(() => {\n setState({ data: undefined, error: null, status: 'idle' });\n }, []);\n\n return {\n mutate,\n mutateAsync,\n data: state.data,\n isPending: state.status === 'pending',\n isSuccess: state.status === 'success',\n isError: state.status === 'error',\n error: state.error,\n reset,\n };\n}\n","import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport { serializeKey } from '../cache';\nimport { useApiContext } from '../provider';\nimport type {\n UseInfiniteApiQueryOptions,\n InfiniteData,\n InfiniteApiQueryResult,\n} from '../types';\nimport { withRetry, toApiError } from '../utils';\n\nexport function useInfiniteApiQuery<TData = unknown>(\n url: string,\n options: UseInfiniteApiQueryOptions<TData>,\n): InfiniteApiQueryResult<TData> {\n const { apiClient, queryClient } = useApiContext();\n\n const cacheKey = serializeKey(['__inf__', url]);\n const retries = options.retry === false ? 0 : (options.retry ?? 1);\n const staleTime = options.staleTime ?? 60_000;\n\n // Store options in a ref to avoid stale closures in callbacks\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const [isFetchingNextPage, setIsFetchingNextPage] = useState(false);\n const [isFetchingPreviousPage, setIsFetchingPreviousPage] = useState(false);\n\n const entry = useSyncExternalStore(\n (notify) => queryClient.cache.subscribe(cacheKey, notify),\n () => queryClient.cache.get<InfiniteData<TData>>(cacheKey),\n () => queryClient.cache.get<InfiniteData<TData>>(cacheKey),\n );\n\n // Build the URL for a given pageParam\n const buildUrl = (pageParam: unknown): string => {\n if (pageParam == null) return url;\n return url + (url.includes('?') ? '&' : '?') + 'cursor=' + String(pageParam);\n };\n\n // Fetch a single page\n const fetchOnePage = useCallback(\n (pageParam: unknown): Promise<TData> => {\n const currentOptions = optionsRef.current;\n if (currentOptions.fetchPage) {\n return withRetry(() => currentOptions.fetchPage!(pageParam, apiClient.instance), retries);\n }\n return withRetry(\n () => apiClient.instance.get<TData>(buildUrl(pageParam)).then((r) => r.data),\n retries,\n );\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [apiClient, retries, url],\n );\n\n // Initial fetch\n const doInitialFetch = useCallback(async () => {\n if (queryClient.cache.getInFlight(cacheKey)) return;\n\n queryClient.cache.setLoading(cacheKey);\n const gen = queryClient.cache.bumpGeneration(cacheKey);\n\n const promise = fetchOnePage(undefined);\n queryClient.cache.setInFlight(cacheKey, promise);\n\n try {\n const firstPage = await promise;\n if (queryClient.cache.getGeneration(cacheKey) !== gen) return;\n const infiniteData: InfiniteData<TData> = {\n pages: [firstPage],\n pageParams: [undefined],\n };\n queryClient.cache.setData(cacheKey, infiniteData, staleTime);\n } catch (err) {\n if (queryClient.cache.getGeneration(cacheKey) !== gen) return;\n const apiError = toApiError(err);\n queryClient.cache.setError(cacheKey, apiError);\n }\n }, [cacheKey, fetchOnePage, staleTime, queryClient]);\n\n useEffect(() => {\n if (options.enabled === false) return;\n if (!queryClient.cache.isStale(cacheKey)) return;\n void doInitialFetch();\n }, [doInitialFetch, cacheKey, options.enabled, queryClient]);\n\n const fetchNextPage = useCallback(() => {\n const currentData = queryClient.cache.get<InfiniteData<TData>>(cacheKey)?.data;\n if (!currentData || currentData.pages.length === 0) return;\n\n const lastPage = currentData.pages[currentData.pages.length - 1];\n const nextPageParam = optionsRef.current.getNextPageParam(lastPage, currentData.pages);\n if (nextPageParam === undefined) return;\n\n setIsFetchingNextPage(true);\n void fetchOnePage(nextPageParam)\n .then((newPage) => {\n const latestData = queryClient.cache.get<InfiniteData<TData>>(cacheKey)?.data;\n if (!latestData) return;\n const updated: InfiniteData<TData> = {\n pages: [...latestData.pages, newPage],\n pageParams: [...latestData.pageParams, nextPageParam],\n };\n queryClient.cache.setData(cacheKey, updated, staleTime);\n })\n .catch((err: unknown) => {\n const apiError = toApiError(err);\n queryClient.cache.setError(cacheKey, apiError);\n })\n .finally(() => {\n setIsFetchingNextPage(false);\n });\n }, [cacheKey, fetchOnePage, staleTime, queryClient]);\n\n const fetchPreviousPage = useCallback(() => {\n const currentData = queryClient.cache.get<InfiniteData<TData>>(cacheKey)?.data;\n if (!currentData || currentData.pages.length === 0) return;\n\n const getPreviousPageParam = optionsRef.current.getPreviousPageParam;\n if (!getPreviousPageParam) return;\n\n const firstPage = currentData.pages[0];\n const prevPageParam = getPreviousPageParam(firstPage, currentData.pages);\n if (prevPageParam === undefined) return;\n\n setIsFetchingPreviousPage(true);\n void fetchOnePage(prevPageParam)\n .then((newPage) => {\n const latestData = queryClient.cache.get<InfiniteData<TData>>(cacheKey)?.data;\n if (!latestData) return;\n const updated: InfiniteData<TData> = {\n pages: [newPage, ...latestData.pages],\n pageParams: [prevPageParam, ...latestData.pageParams],\n };\n queryClient.cache.setData(cacheKey, updated, staleTime);\n })\n .catch((err: unknown) => {\n const apiError = toApiError(err);\n queryClient.cache.setError(cacheKey, apiError);\n })\n .finally(() => {\n setIsFetchingPreviousPage(false);\n });\n }, [cacheKey, fetchOnePage, staleTime, queryClient]);\n\n const refetch = useCallback(() => {\n // Clear data and re-fetch from the first page\n queryClient.cache.bumpGeneration(cacheKey);\n queryClient.cache.clearInFlight(cacheKey);\n void doInitialFetch();\n }, [cacheKey, doInitialFetch, queryClient]);\n\n const infiniteData = entry?.data;\n\n // Compute hasNextPage / hasPreviousPage\n let hasNextPage = false;\n let hasPreviousPage = false;\n if (infiniteData && infiniteData.pages.length > 0) {\n const lastPage = infiniteData.pages[infiniteData.pages.length - 1];\n hasNextPage = optionsRef.current.getNextPageParam(lastPage, infiniteData.pages) !== undefined;\n\n if (optionsRef.current.getPreviousPageParam) {\n const firstPage = infiniteData.pages[0];\n hasPreviousPage =\n optionsRef.current.getPreviousPageParam(firstPage, infiniteData.pages) !== undefined;\n }\n }\n\n return {\n data: infiniteData,\n isLoading: entry?.status === 'loading' && entry?.data === undefined,\n isFetching: entry?.status === 'loading',\n isFetchingNextPage,\n isFetchingPreviousPage,\n isSuccess: entry?.status === 'success',\n isError: entry?.status === 'error',\n error: entry?.error ?? null,\n hasNextPage,\n hasPreviousPage,\n fetchNextPage,\n fetchPreviousPage,\n refetch,\n };\n}\n","import { useCallback, useEffect, useRef, useSyncExternalStore } from 'react';\nimport { serializeKey } from '../cache';\nimport type { CacheEntry } from '../cache';\nimport { useApiContext } from '../provider';\nimport type { ApiError, UseApiQueryOptions, ApiQueryResult, ApiQueryConfig } from '../types';\nimport { withRetry, toApiError } from '../utils';\n\nexport function useApiQueries<TData = unknown, TSelected = TData>(\n queries: ApiQueryConfig<TData, TSelected>[],\n): ApiQueryResult<TSelected>[] {\n const { apiClient, queryClient } = useApiContext();\n\n // Serialize all keys\n const keys = queries.map((q) => serializeKey(q.key ?? [q.url]));\n const keysJoined = keys.join(',');\n\n // Stable snapshot reference to avoid spurious re-renders\n const prevSnapshotRef = useRef<(CacheEntry | undefined)[]>([]);\n\n // keepPreviousData: track last non-undefined data per slot index\n // Indexed by position (not cache key) so data persists when the key changes mid-load\n const previousDataRef = useRef<(TSelected | undefined)[]>([]);\n\n const getSnapshot = useCallback((): (CacheEntry | undefined)[] => {\n const next = keys.map((k) => queryClient.cache.get(k));\n if (\n next.length === prevSnapshotRef.current.length &&\n next.every((e, i) => e === prevSnapshotRef.current[i])\n ) {\n return prevSnapshotRef.current; // same references → no re-render\n }\n prevSnapshotRef.current = next;\n return next;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [keysJoined, queryClient]);\n\n // Stable subscribe that covers all keys\n const subscribe = useCallback(\n (notify: () => void) => {\n const unsubs = keys.map((k) => queryClient.cache.subscribe(k, notify));\n return () => unsubs.forEach((u) => u());\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [keysJoined, queryClient],\n );\n\n const entries = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n // Per-query fetch extracted so refetch() can call it directly with force=true\n const doFetchOne = useCallback(\n (query: ApiQueryConfig<TData, TSelected>, key: string, force = false) => {\n const opts = query.options;\n if (!force && !queryClient.cache.isStale(key)) return;\n if (queryClient.cache.getInFlight(key)) return;\n\n const retries = opts?.retry === false ? 0 : (opts?.retry ?? 1);\n const st = opts?.staleTime ?? 60_000;\n\n queryClient.cache.setLoading(key);\n const gen = queryClient.cache.bumpGeneration(key);\n\n const promise = withRetry(\n () => apiClient.instance.get(query.url).then((r) => r.data),\n retries,\n );\n queryClient.cache.setInFlight(key, promise);\n\n void promise\n .then((data) => {\n if (queryClient.cache.getGeneration(key) !== gen) return;\n queryClient.cache.setData(key, data, st);\n })\n .catch((err: unknown) => {\n if (queryClient.cache.getGeneration(key) !== gen) return;\n const apiError = toApiError(err);\n queryClient.cache.setError(key, apiError);\n });\n },\n [apiClient, queryClient],\n );\n\n // Fire individual fetches when keys change\n useEffect(() => {\n queries.forEach((query, i) => {\n if (query.options?.enabled === false) return;\n doFetchOne(query, keys[i]);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [keysJoined, queryClient, apiClient, doFetchOne]);\n\n return entries.map((entry, i) => {\n const query = queries[i];\n const opts = query?.options as UseApiQueryOptions<TData, TSelected> | undefined;\n const key = keys[i];\n\n const rawData = entry?.data as TData | undefined;\n let data: TSelected | undefined =\n opts?.select !== undefined && rawData !== undefined\n ? opts.select(rawData)\n : (rawData as unknown as TSelected | undefined);\n\n // placeholderData: show placeholder while loading and no data yet\n let isPlaceholderData = false;\n if (data === undefined && entry?.status === 'loading' && opts?.placeholderData !== undefined) {\n data = opts.placeholderData;\n isPlaceholderData = true;\n }\n\n // keepPreviousData: return last non-undefined data when data is undefined\n if (data !== undefined) {\n previousDataRef.current[i] = data;\n } else if (opts?.keepPreviousData && previousDataRef.current[i] !== undefined) {\n data = previousDataRef.current[i];\n }\n\n return {\n data,\n isLoading: entry?.status === 'loading' && entry?.data === undefined,\n isRefetching: entry?.status === 'loading' && entry?.data !== undefined,\n isFetching: entry?.status === 'loading',\n isPlaceholderData,\n isSuccess: entry?.status === 'success',\n isError: entry?.status === 'error',\n error: (entry?.error ?? null) as ApiError | null,\n status: entry?.status ?? 'idle',\n refetch: () => {\n if (!key || !query) return;\n doFetchOne(query, key, true);\n },\n };\n });\n}\n","import { useSyncExternalStore } from 'react';\nimport { serializeKey } from '../cache';\nimport { useApiContext } from '../provider';\nimport type { UseApiQueryOptions, SuspenseApiQueryResult } from '../types';\nimport { withRetry, toApiError } from '../utils';\n\nexport function useSuspenseApiQuery<TData = unknown>(\n url: string,\n options?: Pick<UseApiQueryOptions<TData>, 'staleTime' | 'retry'>,\n): SuspenseApiQueryResult<TData> {\n const { apiClient, queryClient } = useApiContext();\n\n const serializedKey = serializeKey([url]);\n const retries = options?.retry === false ? 0 : (options?.retry ?? 1);\n const staleTime = options?.staleTime ?? 60_000;\n\n const entry = useSyncExternalStore(\n (notify) => queryClient.cache.subscribe(serializedKey, notify),\n () => queryClient.cache.get<TData>(serializedKey),\n () => queryClient.cache.get<TData>(serializedKey),\n );\n\n if (!entry || entry.status === 'loading' || (entry.status === 'idle' && !entry.data)) {\n // Check for existing in-flight promise\n const existing = queryClient.cache.getInFlight(serializedKey);\n if (existing) {\n throw existing; // Suspense re-catches\n }\n\n // Start a new fetch synchronously (render-time, not useEffect)\n const gen = queryClient.cache.bumpGeneration(serializedKey);\n queryClient.cache.setLoading(serializedKey);\n\n const p = withRetry(\n () => apiClient.instance.get<TData>(url).then((r) => r.data),\n retries,\n )\n .then((data) => {\n if (queryClient.cache.getGeneration(serializedKey) === gen) {\n queryClient.cache.setData(serializedKey, data, staleTime);\n }\n })\n .catch((err: unknown) => {\n if (queryClient.cache.getGeneration(serializedKey) === gen) {\n const apiError = toApiError(err);\n queryClient.cache.setError(serializedKey, apiError);\n throw apiError;\n }\n });\n\n queryClient.cache.setInFlight(serializedKey, p);\n throw p; // Suspense catches this\n }\n\n if (entry.status === 'error') {\n throw entry.error; // ErrorBoundary catches this\n }\n\n // entry.status === 'success' at this point\n // Background re-fetch: does NOT throw a new Promise (no Suspense on re-fetch)\n const refetch = () => {\n queryClient.cache.clearInFlight(serializedKey);\n const gen = queryClient.cache.bumpGeneration(serializedKey);\n\n const p = withRetry(\n () => apiClient.instance.get<TData>(url).then((r) => r.data),\n retries,\n )\n .then((data) => {\n if (queryClient.cache.getGeneration(serializedKey) === gen) {\n queryClient.cache.setData(serializedKey, data, staleTime);\n }\n })\n .catch((err: unknown) => {\n if (queryClient.cache.getGeneration(serializedKey) === gen) {\n queryClient.cache.setError(serializedKey, toApiError(err));\n }\n });\n\n queryClient.cache.setInFlight(serializedKey, p);\n };\n\n return {\n data: entry.data as TData,\n isFetching: false,\n isRefetching: false,\n isSuccess: true,\n refetch,\n };\n}\n","import { useCallback } from 'react';\nimport { useApiContext } from '../provider';\n\nexport function usePrefetch<TData = unknown>(\n url: string,\n options?: { staleTime?: number },\n): () => void {\n const { apiClient, queryClient } = useApiContext();\n\n const prefetch = useCallback(() => {\n void queryClient.prefetchQuery<TData>({\n queryKey: [url],\n queryFn: () => apiClient.instance.get<TData>(url).then((r) => r.data),\n staleTime: options?.staleTime,\n });\n }, [url, queryClient, apiClient, options?.staleTime]);\n\n return prefetch;\n}\n","import type { QueryClient, CacheEntry } from './cache';\nimport type { PersistenceStorage, PersistenceConfig } from './types';\n\nexport type { PersistenceStorage, PersistenceConfig };\n\ninterface PersistedCache {\n entries: Record<string, CacheEntry>;\n savedAt: number;\n}\n\nexport async function persistCache(\n queryClient: QueryClient,\n config: PersistenceConfig,\n): Promise<() => void> {\n const storageKey = config.key ?? 'structyl-cache';\n const maxAge = config.maxAge ?? 24 * 60 * 60_000;\n\n // 1. Restore from storage on init\n try {\n const raw = await config.storage.getItem(storageKey);\n if (raw) {\n const parsed = JSON.parse(raw) as PersistedCache;\n if (parsed.savedAt + maxAge > Date.now()) {\n queryClient.cache.restore(parsed.entries);\n } else {\n // Expired — remove stale data\n void config.storage.removeItem(storageKey);\n }\n }\n } catch {\n // Ignore parse/read errors\n }\n\n // 2. Subscribe to global cache changes and debounce writes\n let debounceTimer: ReturnType<typeof setTimeout> | undefined;\n\n const write = () => {\n if (debounceTimer !== undefined) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n debounceTimer = undefined;\n const snapshot = queryClient.cache.snapshot();\n const payload: PersistedCache = {\n entries: snapshot,\n savedAt: Date.now(),\n };\n void config.storage.setItem(storageKey, JSON.stringify(payload));\n }, 1000);\n };\n\n const unsubscribe = queryClient.cache.subscribeGlobal(write);\n\n // Return cleanup function\n return () => {\n unsubscribe();\n if (debounceTimer !== undefined) {\n clearTimeout(debounceTimer);\n debounceTimer = undefined;\n }\n };\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { A as ApiClient, Q as QueryClient, D as DehydratedState, i as QueryClientConfig, k as UseApiQueryOptions, e as ApiQueryResult, U as UseApiMutationOptions, c as ApiMutationResult, l as UseInfiniteApiQueryOptions, I as InfiniteApiQueryResult, d as ApiQueryConfig, S as SuspenseApiQueryResult, P as PersistenceConfig } from './server-BdrIj1E3.cjs';
|
|
2
|
+
export { a as ApiClientConfig, b as ApiError, f as InfiniteData, O as OptimisticConfig, g as PersistenceStorage, j as QueryStatus, m as createApiClient } from './server-BdrIj1E3.cjs';
|
|
3
|
+
import React, { ReactNode } from 'react';
|
|
4
|
+
import { AxiosInstance } from 'axios';
|
|
5
|
+
|
|
6
|
+
interface ApiContextValue {
|
|
7
|
+
apiClient: ApiClient;
|
|
8
|
+
queryClient: QueryClient;
|
|
9
|
+
}
|
|
10
|
+
declare function useApiContext(): ApiContextValue;
|
|
11
|
+
declare function useApiClient(): ApiClient;
|
|
12
|
+
interface ApiProviderProps {
|
|
13
|
+
client: ApiClient;
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
/** Inject a pre-built QueryClient (advanced / testing) */
|
|
16
|
+
queryClient?: QueryClient;
|
|
17
|
+
/** Override the GC time for entries with no active subscriber (ms, default 5 min) */
|
|
18
|
+
gcTime?: number;
|
|
19
|
+
/** Hydrate from server-prefetched state (SSR) */
|
|
20
|
+
hydratedState?: DehydratedState;
|
|
21
|
+
/** Global QueryClient configuration (callbacks etc.) */
|
|
22
|
+
queryClientConfig?: QueryClientConfig;
|
|
23
|
+
}
|
|
24
|
+
declare function ApiProvider({ client, children, queryClient, gcTime, hydratedState, queryClientConfig, }: ApiProviderProps): React.JSX.Element;
|
|
25
|
+
declare namespace ApiProvider {
|
|
26
|
+
var displayName: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
type FetcherFn<TData> = (instance: AxiosInstance) => Promise<TData>;
|
|
30
|
+
declare function useApiQuery<TData = unknown, TSelected = TData>(url: string, options?: UseApiQueryOptions<TData, TSelected>): ApiQueryResult<TSelected>;
|
|
31
|
+
declare function useApiQuery<TData = unknown, TSelected = TData>(key: unknown[] | string, urlOrFn: string | FetcherFn<TData>, options?: UseApiQueryOptions<TData, TSelected>): ApiQueryResult<TSelected>;
|
|
32
|
+
|
|
33
|
+
type MutationFn<TData, TVariables> = (instance: AxiosInstance, variables: TVariables) => Promise<TData>;
|
|
34
|
+
declare function useApiMutation<TData = unknown, TVariables = unknown>(urlOrFn: string | MutationFn<TData, TVariables>, options?: UseApiMutationOptions<TData, TVariables>): ApiMutationResult<TData, TVariables>;
|
|
35
|
+
|
|
36
|
+
declare function useInfiniteApiQuery<TData = unknown>(url: string, options: UseInfiniteApiQueryOptions<TData>): InfiniteApiQueryResult<TData>;
|
|
37
|
+
|
|
38
|
+
declare function useApiQueries<TData = unknown, TSelected = TData>(queries: ApiQueryConfig<TData, TSelected>[]): ApiQueryResult<TSelected>[];
|
|
39
|
+
|
|
40
|
+
declare function useSuspenseApiQuery<TData = unknown>(url: string, options?: Pick<UseApiQueryOptions<TData>, 'staleTime' | 'retry'>): SuspenseApiQueryResult<TData>;
|
|
41
|
+
|
|
42
|
+
declare function usePrefetch<TData = unknown>(url: string, options?: {
|
|
43
|
+
staleTime?: number;
|
|
44
|
+
}): () => void;
|
|
45
|
+
|
|
46
|
+
declare function persistCache(queryClient: QueryClient, config: PersistenceConfig): Promise<() => void>;
|
|
47
|
+
|
|
48
|
+
export { ApiClient, ApiMutationResult, ApiProvider, type ApiProviderProps, ApiQueryConfig, ApiQueryResult, InfiniteApiQueryResult, PersistenceConfig, QueryClient, QueryClientConfig, SuspenseApiQueryResult, UseApiMutationOptions, UseApiQueryOptions, UseInfiniteApiQueryOptions, persistCache, useApiClient, useApiContext, useApiMutation, useApiQueries, useApiQuery, useInfiniteApiQuery, usePrefetch, useSuspenseApiQuery };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { A as ApiClient, Q as QueryClient, D as DehydratedState, i as QueryClientConfig, k as UseApiQueryOptions, e as ApiQueryResult, U as UseApiMutationOptions, c as ApiMutationResult, l as UseInfiniteApiQueryOptions, I as InfiniteApiQueryResult, d as ApiQueryConfig, S as SuspenseApiQueryResult, P as PersistenceConfig } from './server-BdrIj1E3.js';
|
|
2
|
+
export { a as ApiClientConfig, b as ApiError, f as InfiniteData, O as OptimisticConfig, g as PersistenceStorage, j as QueryStatus, m as createApiClient } from './server-BdrIj1E3.js';
|
|
3
|
+
import React, { ReactNode } from 'react';
|
|
4
|
+
import { AxiosInstance } from 'axios';
|
|
5
|
+
|
|
6
|
+
interface ApiContextValue {
|
|
7
|
+
apiClient: ApiClient;
|
|
8
|
+
queryClient: QueryClient;
|
|
9
|
+
}
|
|
10
|
+
declare function useApiContext(): ApiContextValue;
|
|
11
|
+
declare function useApiClient(): ApiClient;
|
|
12
|
+
interface ApiProviderProps {
|
|
13
|
+
client: ApiClient;
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
/** Inject a pre-built QueryClient (advanced / testing) */
|
|
16
|
+
queryClient?: QueryClient;
|
|
17
|
+
/** Override the GC time for entries with no active subscriber (ms, default 5 min) */
|
|
18
|
+
gcTime?: number;
|
|
19
|
+
/** Hydrate from server-prefetched state (SSR) */
|
|
20
|
+
hydratedState?: DehydratedState;
|
|
21
|
+
/** Global QueryClient configuration (callbacks etc.) */
|
|
22
|
+
queryClientConfig?: QueryClientConfig;
|
|
23
|
+
}
|
|
24
|
+
declare function ApiProvider({ client, children, queryClient, gcTime, hydratedState, queryClientConfig, }: ApiProviderProps): React.JSX.Element;
|
|
25
|
+
declare namespace ApiProvider {
|
|
26
|
+
var displayName: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
type FetcherFn<TData> = (instance: AxiosInstance) => Promise<TData>;
|
|
30
|
+
declare function useApiQuery<TData = unknown, TSelected = TData>(url: string, options?: UseApiQueryOptions<TData, TSelected>): ApiQueryResult<TSelected>;
|
|
31
|
+
declare function useApiQuery<TData = unknown, TSelected = TData>(key: unknown[] | string, urlOrFn: string | FetcherFn<TData>, options?: UseApiQueryOptions<TData, TSelected>): ApiQueryResult<TSelected>;
|
|
32
|
+
|
|
33
|
+
type MutationFn<TData, TVariables> = (instance: AxiosInstance, variables: TVariables) => Promise<TData>;
|
|
34
|
+
declare function useApiMutation<TData = unknown, TVariables = unknown>(urlOrFn: string | MutationFn<TData, TVariables>, options?: UseApiMutationOptions<TData, TVariables>): ApiMutationResult<TData, TVariables>;
|
|
35
|
+
|
|
36
|
+
declare function useInfiniteApiQuery<TData = unknown>(url: string, options: UseInfiniteApiQueryOptions<TData>): InfiniteApiQueryResult<TData>;
|
|
37
|
+
|
|
38
|
+
declare function useApiQueries<TData = unknown, TSelected = TData>(queries: ApiQueryConfig<TData, TSelected>[]): ApiQueryResult<TSelected>[];
|
|
39
|
+
|
|
40
|
+
declare function useSuspenseApiQuery<TData = unknown>(url: string, options?: Pick<UseApiQueryOptions<TData>, 'staleTime' | 'retry'>): SuspenseApiQueryResult<TData>;
|
|
41
|
+
|
|
42
|
+
declare function usePrefetch<TData = unknown>(url: string, options?: {
|
|
43
|
+
staleTime?: number;
|
|
44
|
+
}): () => void;
|
|
45
|
+
|
|
46
|
+
declare function persistCache(queryClient: QueryClient, config: PersistenceConfig): Promise<() => void>;
|
|
47
|
+
|
|
48
|
+
export { ApiClient, ApiMutationResult, ApiProvider, type ApiProviderProps, ApiQueryConfig, ApiQueryResult, InfiniteApiQueryResult, PersistenceConfig, QueryClient, QueryClientConfig, SuspenseApiQueryResult, UseApiMutationOptions, UseApiQueryOptions, UseInfiniteApiQueryOptions, persistCache, useApiClient, useApiContext, useApiMutation, useApiQueries, useApiQuery, useInfiniteApiQuery, usePrefetch, useSuspenseApiQuery };
|