@xylex-group/athena 3.0.2 → 3.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/README.md +1 -1
- package/dist/billing.cjs +1 -1
- package/dist/billing.cjs.map +1 -1
- package/dist/billing.js +1 -1
- package/dist/billing.js.map +1 -1
- package/dist/browser.cjs +322 -1
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.cts +5 -5
- package/dist/browser.d.ts +5 -5
- package/dist/browser.js +301 -2
- package/dist/browser.js.map +1 -1
- package/dist/cli/index.cjs +5381 -3772
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.d.cts +17 -10
- package/dist/cli/index.d.ts +17 -10
- package/dist/cli/index.js +5385 -3776
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +1723 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +28 -6
- package/dist/index.d.ts +28 -6
- package/dist/index.js +1695 -28
- package/dist/index.js.map +1 -1
- package/dist/model-form-BbdzJ9Uh.d.ts +259 -0
- package/dist/model-form-BhWWsA-7.d.cts +259 -0
- package/dist/{module-CkUM6v58.d.ts → module-DKkJKOuJ.d.ts} +2 -2
- package/dist/{module-CB25egcO.d.cts → module-xFd7_Igv.d.cts} +2 -2
- package/dist/next/client.cjs +1 -1
- package/dist/next/client.cjs.map +1 -1
- package/dist/next/client.js +1 -1
- package/dist/next/client.js.map +1 -1
- package/dist/next/server.cjs +1 -1
- package/dist/next/server.cjs.map +1 -1
- package/dist/next/server.js +1 -1
- package/dist/next/server.js.map +1 -1
- package/dist/pipeline-DuKzYGia.d.cts +93 -0
- package/dist/pipeline-wer2G9xW.d.ts +93 -0
- package/dist/react.cjs +400 -3
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +67 -2
- package/dist/react.d.ts +67 -2
- package/dist/react.js +400 -4
- package/dist/react.js.map +1 -1
- package/dist/{types-BBm-kEBL.d.cts → types-1ztXDgPa.d.cts} +62 -2
- package/dist/{types-BaAMXCqK.d.ts → types-CccOiXPo.d.ts} +62 -2
- package/package.json +1 -1
- package/dist/model-form-Dh0sisdL.d.ts +0 -97
- package/dist/model-form-oOAJUVd4.d.cts +0 -97
- package/dist/pipeline-B8aN2EHe.d.ts +0 -8
- package/dist/pipeline-D4W-Cc-A.d.cts +0 -8
package/dist/react.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/gateway/errors.ts","../src/gateway/url.ts","../src/cookies/cookie-utils.ts","../src/cookies/index.ts","../src/utils/athena-request-headers.ts","../package.json","../src/sdk-version.ts","../src/gateway/client.ts","../src/gateway/use-athena-gateway.ts","../src/react/utils.ts","../src/react/query-client.ts","../src/react/provider.ts","../src/react/use-query.ts","../src/react/use-mutation.ts","../src/react/use-session.ts","../src/react/use-athena-session-client.ts","../src/react/use-storage-upload.ts","../src/react/use-storage-files.ts","../src/react/use-storage-file-delete.ts","../src/schema/model-form.ts"],"names":["useState","useMemo","useCallback","isRecord","serialized","sourceData","selectedData","createContext","createElement","useContext","useRef","useSyncExternalStore","useEffect","React","React2","React3"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBO,IAAM,kBAAA,GAAN,MAAM,mBAAA,SAA2B,KAAA,CAAM;AAAA,EACnC,IAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EAET,YAAY,KAAA,EAAgC;AAC1C,IAAA,KAAA,CAAM,MAAM,OAAO,CAAA;AACnB,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,IAAA;AAClB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAM,MAAA,IAAU,CAAA;AAC9B,IAAA,IAAA,CAAK,WAAW,KAAA,CAAM,QAAA;AACtB,IAAA,IAAA,CAAK,SAAS,KAAA,CAAM,MAAA;AACpB,IAAA,IAAA,CAAK,YAAY,KAAA,CAAM,SAAA;AACvB,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,IAAA;AAClB,IAAA,IAAA,CAAK,cAAc,KAAA,CAAM,KAAA;AAAA,EAC3B;AAAA,EAEA,SAAA,GAAuC;AACrC,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAO,IAAA,CAAK;AAAA,KACd;AAAA,EACF;AAAA,EAEA,OAAO,YAAA,CACL,QAAA,EACA,QAAA,EACA;AACA,IAAA,MAAM,UAAU,QAAA,CAAS,YAAA;AACzB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,IAAI,mBAAA,CAAmB;AAAA,QAC5B,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY,QAAA,CAAS,QAAA;AAAA,QACvC,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,QAAA,CAAS,MAAA;AAAA,QACnC,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,QAAA,CAAS,SAAA;AAAA,QACzC,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,OAAO,OAAA,CAAQ;AAAA,OAChB,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAI,mBAAA,CAAmB;AAAA,MAC5B,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS,SAAS,KAAA,IAAS,wBAAA;AAAA,MAC3B,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,WAAW,QAAA,CAAS;AAAA,KACrB,CAAA;AAAA,EACH;AACF;AAEO,SAAS,qBAAqB,KAAA,EAA6C;AAChF,EAAA,OAAO,KAAA,YAAiB,kBAAA;AAC1B;;;ACtFO,IAAM,uBAAA,GAA0B,oCAAA;AAEvC,SAAS,sBAAsB,KAAA,EAAwB;AACrD,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,WAAA;AAChC,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,MAAA;AAC3B,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA,CAAM,MAAK,CAAE,MAAA,GAAS,IAAI,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAI,iBAAA;AAAA,EAC3D;AACA,EAAA,OAAO,GAAG,OAAO,KAAK,IAAI,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA,CAAA;AACjD;AAEA,SAAS,mBAAA,CAAoB,SAAiB,IAAA,EAAkC;AAC9E,EAAA,OAAO,IAAI,kBAAA,CAAmB;AAAA,IAC5B,IAAA,EAAM,aAAA;AAAA,IACN,OAAA;AAAA,IACA,MAAA,EAAQ,CAAA;AAAA,IACR;AAAA,GACD,CAAA;AACH;AAOO,SAAS,6BAAA,CACd,KAAA,EACA,OAAA,GAAgD,EAAC,EACzC;AACR,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,yBAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,SAAS,OAAA,CAAQ,cAAA;AAEnC,EAAA,IAAI,SAAA,KAAc,MAAA,IAAa,SAAA,KAAc,IAAA,EAAM;AACjD,IAAA,MAAM,mBAAA;AAAA,MACJ,CAAA,EAAG,KAAK,CAAA,oDAAA,EAAuD,qBAAA,CAAsB,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,MAC3F;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,UAAU,IAAA,EAAK;AAC/B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,mBAAA;AAAA,MACJ,CAAA,EAAG,KAAK,CAAA,oDAAA,EAAuD,qBAAA,CAAsB,SAAS,CAAC,CAAA,CAAA,CAAA;AAAA,MAC/F;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAI,IAAI,OAAO,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,mBAAA;AAAA,MACJ,CAAA,EAAG,KAAK,CAAA,gDAAA,EAAmD,qBAAA,CAAsB,SAAS,CAAC,CAAA,CAAA,CAAA;AAAA,MAC3F;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,OAAA,IAAW,MAAA,CAAO,aAAa,QAAA,EAAU;AAC/D,IAAA,MAAM,mBAAA;AAAA,MACJ,GAAG,KAAK,CAAA,kCAAA,EAAqC,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA,CAAA,CAAA;AAAA,MACpE;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,IAAA,EAAM;AAChC,IAAA,MAAM,mBAAA;AAAA,MACJ,GAAG,KAAK,CAAA,+DAAA,EAAkE,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA,CAAA,CAAA;AAAA,MACjG;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,QAAA,EAAS,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC7C;AAEO,SAAS,qBAAA,CAAsB,SAAiB,IAAA,EAAsB;AAC3E,EAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,IAAA,MAAM,mBAAA;AAAA,MACJ,CAAA,kDAAA,EAAqD,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MACzE;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA;AAC1B;;;AC3DO,IAAM,oBAAA,GAAuB,WAAA;AAmJ7B,SAAS,aAAa,YAAA,EAA2C;AACtE,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AACvC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC1B,IAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,MAAA,CAAO,MAAM,QAAQ,CAAA;AAC3C,IAAA,SAAA,CAAU,GAAA,CAAI,MAAgB,KAAe,CAAA;AAAA,EAC/C,CAAC,CAAA;AACD,EAAA,OAAO,SAAA;AACT;AC0KO,IAAM,gBAAA,GAAmB,CAC9B,OAAA,EACA,MAAA,KAOkB;AAClB,EAAA,MAAM,OAAA,GAAA,CAAW,OAAA,YAAmB,OAAA,IAAW,EAAE,SAAA,IAAa,WAAW,OAAA,GAAU,OAAA,CAAQ,OAAA,EAAS,GAAA,CAAI,QAAQ,CAAA;AAChH,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,UAAA,GAAa,eAAA,EAAiB,eAAe,aAAA,EAAc,GAAc,EAAC;AAClF,EAAA,MAAM,YAAA,GAAe,aAAa,OAAO,CAAA;AACzC,EAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KACjB,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,IAAK,YAAA,CAAa,GAAA,CAAI,CAAA,EAAG,oBAAoB,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AAC7E,EAAA,MAAM,oBAAA,GAAuB,KAAA,CAAM,IAAA,iBAAK,IAAI,GAAA,CAAI;AAAA,IAC9C,UAAA;AAAA,IACA,UAAA,CAAW,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAAA,IAC5B,UAAA,CAAW,OAAA,CAAQ,IAAA,EAAM,GAAG;AAAA,GAC7B,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAClB,EAAA,KAAA,MAAW,iBAAiB,oBAAA,EAAsB;AAChD,IAAA,MAAM,YAAA,GACJ,SAAA,CAAU,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,aAAa,CAAA,CAAE,CAAA,IAAK,SAAA,CAAU,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,aAAa,CAAA,CAAE,CAAA;AAC/F,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAO,YAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;;;AC1XA,IAAM,qBAAA,GAAwB,UAAA;AAE9B,IAAM,4BAA4B,CAAC,cAAA,EAAgB,cAAA,EAAgB,WAAA,EAAa,aAAa,QAAQ,CAAA;AACrG,IAAM,4BAAA,GAA+B,CAAC,cAAA,EAAgB,cAAc,CAAA;AACpE,IAAM,+BAAA,GAAkC,CAAC,6BAA6B,CAAA;AACtE,IAAM,+BAAA,GAAkC,CAAC,4BAA4B,CAAA;AACrE,IAAM,wBAAA,GAA2B,CAAC,iBAAA,EAAmB,iBAAiB,CAAA;AACtE,IAAM,wBAAA,GAA2B,CAAC,UAAU,CAAA;AAC5C,IAAM,0BAAA,GAA6B,CAAC,mBAAA,EAAqB,YAAY,CAAA;AAYrE,IAAM,aAAA,GAAqF;AAAA,EACzF,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,mBAAmB,IAAA,EAAK;AAAA,EACzH,IAAA,EAAM,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AAAA,EACvF,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,WAAA,EAAa,IAAA,EAAK;AAAA,EAChG,IAAA,EAAM,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,WAAA,EAAa,IAAA,EAAK;AAAA,EAC7F,OAAA,EAAS,EAAE,OAAA,EAAS,KAAA,EAAO,SAAS,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,KAAA;AAC5E,CAAA;AA+CA,SAAS,qBAAqB,KAAA,EAA2C;AACvE,EAAA,OAAO,QAAQ,KAAA,GAAQ,MAAA;AACzB;AAEA,SAAS,iBAAA,CACP,eACA,WAAA,EACwB;AACxB,EAAA,OAAO,EAAE,GAAI,aAAA,IAAiB,IAAK,GAAI,WAAA,IAAe,EAAC,EAAG;AAC5D;AAEO,SAAS,mBAAA,CACd,SACA,SAAA,EACS;AACT,EAAA,MAAM,mBAAA,GAAsB,UAAU,WAAA,EAAY;AAClD,EAAA,OAAO,MAAA,CAAO,KAAK,OAAO,CAAA,CAAE,KAAK,CAAA,GAAA,KAAO,GAAA,CAAI,WAAA,EAAY,KAAM,mBAAmB,CAAA;AACnF;AAEO,SAAS,kBAAA,CACd,SACA,UAAA,EACoB;AACpB,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,OAAA,CAAQ,SAAS,CAAC,CAAA;AACtD,IAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,EACrB;AAEA,EAAA,MAAM,iBAAA,GAAoB,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,SAAA,KAAa,SAAA,CAAU,WAAA,EAAa,CAAC,CAAA;AACtF,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,CAAA,EAAG;AAC7C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,UAAA,GAAa,qBAAqB,KAAK,CAAA;AAC7C,IAAA,IAAI,YAAY,OAAO,UAAA;AAAA,EACzB;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,yBAAyB,IAAA,EAAuB;AACvD,EAAA,OAAO,IAAA,CAAK,aAAY,KAAM,eAAA;AAChC;AAEA,SAAS,qBAAqB,KAAA,EAAuB;AACnD,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,kBAAkB,CAAA;AAC9C,EAAA,OAAO,KAAA,GAAQ,CAAC,CAAA,EAAG,IAAA,EAAK,IAAK,OAAA;AAC/B;AAEA,SAAS,0CACP,OAAA,EACoB;AACpB,EAAA,MAAM,aAAA,GAAgB,kBAAA,CAAmB,OAAA,EAAS,CAAC,eAAe,CAAC,CAAA;AACnE,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,qBAAqB,aAAa,CAAA;AAChD,EAAA,OAAO,QAAQ,KAAA,GAAQ,MAAA;AACzB;AAEA,SAAS,oCACP,OAAA,EACoB;AACpB,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,OAAA,EAAS,CAAC,QAAQ,CAAC,CAAA;AACrD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,iBAAiB,IAAI,OAAA,CAAQ,EAAE,MAAA,EAAQ,CAAC,CAAA,IAAK,MAAA;AACtD;AAEA,SAAS,mBAAmB,OAAA,EAA6C;AACvE,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,OAAA,CAAQ,IAAA;AACzD;AAEO,SAAS,6BAAA,CACd,MAAA,EACA,OAAA,EACA,QAAA,EACgC;AAChC,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAA,EAAS,MAAA,IAAU,MAAA,CAAO,MAAA;AAAA,IAClC,MAAA,EAAQ,OAAA,EAAS,MAAA,IAAU,MAAA,CAAO,UAAU,QAAA,EAAU,MAAA;AAAA,IACtD,MAAA,EAAQ,OAAA,EAAS,MAAA,IAAU,MAAA,CAAO,MAAA;AAAA,IAClC,cAAA,EAAgB,OAAA,EAAS,cAAA,IAAkB,MAAA,CAAO,cAAA;AAAA,IAClD,OAAA,EAAS,OAAA,EAAS,OAAA,IAAW,MAAA,CAAO,OAAA;AAAA,IACpC,YAAA,EAAc,OAAA,EAAS,YAAA,IAAgB,MAAA,CAAO,YAAA;AAAA,IAC9C,UAAA,EAAY,OAAA,EAAS,UAAA,IAAc,MAAA,CAAO,cAAc,QAAA,EAAU,UAAA;AAAA,IAClE,WAAA,EAAa,OAAA,EAAS,WAAA,IAAe,MAAA,CAAO,WAAA;AAAA,IAC5C,MAAA,EAAQ,OAAA,EAAS,MAAA,IAAU,MAAA,CAAO,MAAA;AAAA,IAClC,YAAA,EAAc,OAAA,EAAS,YAAA,IAAgB,MAAA,CAAO,YAAA;AAAA,IAC9C,KAAA,EAAO,OAAA,EAAS,KAAA,IAAS,MAAA,CAAO,KAAA;AAAA,IAChC,OAAA,EAAS,OAAA,EAAS,OAAA,IAAW,MAAA,CAAO,OAAA;AAAA,IACpC,YAAA,EAAc,OAAA,CAAQ,MAAA,CAAO,YAAA,IAAgB,SAAS,YAAY,CAAA;AAAA,IAClE,eAAe,MAAA,CAAO,OAAA;AAAA,IACtB,aAAa,OAAA,EAAS;AAAA,GACxB;AACF;AAEO,SAAS,0BAAA,CACd,OAAA,EACA,cAAA,EACA,MAAA,EACA,SACA,MAAA,EAIwB;AACxB,EAAA,MAAM,KAAA,GAAQ,cAAc,OAAO,CAAA;AACnC,EAAA,OAAO,yBAAA,CAA0B;AAAA,IAC/B,OAAA;AAAA,IACA,cAAA;AAAA,IACA,GAAG,6BAAA,CAA8B,MAAA,EAAQ,OAAA,EAAS;AAAA,MAChD,MAAA,EAAQ,QAAQ,MAAA,IAAU,MAAA;AAAA,MAC1B,UAAA,EAAY,MAAA,EAAQ,UAAA,KAAyC,IAAA,CAAO;AAAA,KACrE,CAAA;AAAA,IACD,WAAA,EAAa,MAAA,EAAQ,WAAA,KAAoC,kBAAA,CAAqB,CAAA;AAAA,IAC9E,MAAA,EAAQ,MAAA,EAAQ,MAAA,KAAW,KAAA,CAAM,SAAS,kBAAA,GAAqB,MAAA;AAAA,GAChE,CAAA;AACH;AAEO,SAAS,wBAAA,CACd,SACA,MAAA,EACM;AACN,EAAA,MAAM,cAAA,GAAiB,qBAAqB,MAAM,CAAA;AAClD,EAAA,IAAI,cAAA,IAAkB,CAAC,mBAAA,CAAoB,OAAA,EAAS,cAAc,CAAA,EAAG;AACnE,IAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,cAAA;AAAA,EAC5B;AACF;AAEO,SAAS,6BAAA,CACd,SACA,KAAA,EAIM;AACN,EAAA,MAAM,kBAAA,GAAqB,iBAAA,CAAkB,KAAA,CAAM,aAAA,EAAe,MAAM,WAAW,CAAA;AACnF,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,CAAM,OAAO,CAAA;AACzC,EAAA,MAAM,cAAA,GAAiB,oBAAA,CAAqB,KAAA,CAAM,MAAM,CAAA;AACxD,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,kBAAA,CAAmB,MAAA,GAAS,cAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,uBACJ,oBAAA,CAAqB,KAAA,CAAM,YAAY,CAAA,IACvC,kBAAA,CAAmB,oBAAoB,+BAA+B,CAAA;AACxE,EAAA,MAAM,mBAAA,GACJ,oBAAA,IAAwB,mCAAA,CAAoC,kBAAkB,CAAA;AAChF,EAAA,MAAM,iBAAA,GAAoB,kBAAA,CAAmB,kBAAA,EAAoB,CAAC,QAAQ,CAAC,CAAA;AAE3E,EAAA,IAAI,cAAA,IAAkB,CAAC,mBAAA,CAAoB,OAAA,EAAS,QAAQ,CAAA,EAAG;AAC7D,IAAA,OAAA,CAAQ,MAAA,GAAS,cAAA;AAAA,EACnB,WAAW,iBAAA,IAAqB,CAAC,mBAAA,CAAoB,OAAA,EAAS,QAAQ,CAAA,EAAG;AACvE,IAAA,OAAA,CAAQ,MAAA,GAAS,iBAAA;AAAA,EACnB;AAEA,EAAA,MAAM,uBAAuB,MAAM;AACjC,IAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,KAAA,CAAM,WAAW,CAAA;AACzD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAO,qBAAqB,UAAU,CAAA;AAAA,IACxC;AACA,IAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,kBAAA,EAAoB,+BAA+B,CAAA;AACvF,IAAA,OAAO,QAAA,GAAW,oBAAA,CAAqB,QAAQ,CAAA,GAAI,MAAA;AAAA,EACrD,CAAA,GAAG;AACH,EAAA,MAAM,kBAAA,GACJ,mBAAA,IAAuB,yCAAA,CAA0C,kBAAkB,CAAA;AAErF,EAAA,IAAI,MAAM,UAAA,IAAc,kBAAA,IAAsB,CAAC,mBAAA,CAAoB,OAAA,EAAS,eAAe,CAAA,EAAG;AAC5F,IAAA,OAAA,CAAQ,aAAA,GAAgB,UAAU,kBAAkB,CAAA,CAAA;AAAA,EACtD;AAEA,EAAA,IAAI,MAAM,UAAA,EAAY;AACpB,IAAA,IAAI,mBAAA,IAAuB,CAAC,mBAAA,CAAoB,OAAA,EAAS,6BAA6B,CAAA,EAAG;AACvF,MAAA,OAAA,CAAQ,6BAA6B,CAAA,GAAI,mBAAA;AAAA,IAC3C;AACA,IAAA,IAAI,kBAAA,IAAsB,CAAC,mBAAA,CAAoB,OAAA,EAAS,4BAA4B,CAAA,EAAG;AACrF,MAAA,OAAA,CAAQ,4BAA4B,CAAA,GAAI,kBAAA;AAAA,IAC1C;AAAA,EACF,WAAW,mBAAA,IAAuB,CAAC,mBAAA,CAAoB,OAAA,EAAS,6BAA6B,CAAA,EAAG;AAC9F,IAAA,OAAA,CAAQ,6BAA6B,CAAA,GAAI,mBAAA;AAAA,EAC3C;AACF;AAEO,SAAS,uBAAA,CACd,SACA,KAAA,EACM;AACN,EAAA,MAAM,kBAAA,GAAqB,iBAAA,CAAkB,KAAA,CAAM,aAAA,EAAe,MAAM,WAAW,CAAA;AAEnF,EAAA,MAAM,QACJ,oBAAA,CAAqB,KAAA,CAAM,KAAK,CAAA,IAChC,kBAAA,CAAmB,oBAAoB,wBAAwB,CAAA;AACjE,EAAA,IAAI,KAAA,IAAS,CAAC,mBAAA,CAAoB,OAAA,EAAS,UAAU,CAAA,EAAG;AACtD,IAAA,OAAA,CAAQ,UAAU,CAAA,GAAI,KAAA;AAAA,EACxB;AAEA,EAAA,MAAM,UACJ,oBAAA,CAAqB,KAAA,CAAM,OAAO,CAAA,IAClC,kBAAA,CAAmB,oBAAoB,0BAA0B,CAAA;AACnE,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,IAAI,CAAC,mBAAA,CAAoB,OAAA,EAAS,mBAAmB,CAAA,EAAG;AACtD,MAAA,OAAA,CAAQ,mBAAmB,CAAA,GAAI,OAAA;AAAA,IACjC;AACA,IAAA,IAAI,CAAC,mBAAA,CAAoB,OAAA,EAAS,YAAY,CAAA,EAAG;AAC/C,MAAA,OAAA,CAAQ,YAAY,CAAA,GAAI,OAAA;AAAA,IAC1B;AAAA,EACF;AACF;AAwCO,SAAS,0BACd,KAAA,EACwB;AACxB,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,YAAY,CAAA;AAC/C,EAAA,MAAM,kBAAA,GAAqB,iBAAA,CAAkB,KAAA,CAAM,aAAA,EAAe,MAAM,WAAW,CAAA;AACnF,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,CAAM,OAAO,CAAA;AAEzC,EAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,kBAAA,EAAoB,wBAAwB,CAAA;AACpF,EAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,KAAA,CAAM,MAAM,CAAA,IAAK,YAAA;AAC1D,EAAA,MAAM,cACJ,oBAAA,CAAqB,KAAA,CAAM,MAAM,CAAA,IACjC,kBAAA,CAAmB,oBAAoB,yBAAyB,CAAA;AAClE,EAAA,MAAM,cAAA,GACJ,kBAAA,CAAmB,kBAAA,EAAoB,4BAA4B,CAAA,IAAK,WAAA;AAE1E,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,gBAAgB,KAAA,CAAM;AAAA,GACxB;AAEA,EAAA,IAAI,MAAM,WAAA,EAAa;AACrB,IAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,KAAA,CAAM,WAAA,IAAe,kBAAA;AAAA,EACjD;AAEA,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA,EAAQ;AAChC,IAAA,OAAA,CAAQ,MAAA,GAAS,MAAM,MAAA,IAAU,kBAAA;AAAA,EACnC;AAEA,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,IAAI,oBAAA,CAAqB,KAAA,CAAM,MAAM,CAAA,EAAG;AACtC,MAAA,OAAA,CAAQ,WAAW,CAAA,GAAI,KAAA,CAAM,MAAA,IAAU,EAAA;AAAA,IACzC;AACA,IAAA,IAAI,oBAAA,CAAqB,KAAA,CAAM,cAAc,CAAA,EAAG;AAC9C,MAAA,OAAA,CAAQ,mBAAmB,CAAA,GAAI,KAAA,CAAM,cAAA,IAAkB,EAAA;AAAA,IACzD;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,CAAQ,iBAAiB,CAAA,GAAI,WAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,KAAA,CAAM,OAAO,CAAA;AACpD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,CAAQ,gBAAgB,CAAA,GAAI,WAAA;AAAA,IAC9B;AAEA,IAAA,IAAI,OAAO,KAAA,CAAM,UAAA,KAAe,SAAA,EAAW;AACzC,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,KAAA,CAAM,UAAA,GAAa,MAAA,GAAS,OAAA;AAAA,IACzD,CAAA,MAAA,IAAW,MAAM,iBAAA,EAAmB;AAClC,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,MAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,oBAAA,CAAqB,KAAA,CAAM,YAAY,CAAA,EAAG;AAC5C,MAAA,OAAA,CAAQ,iBAAiB,CAAA,GAAI,KAAA,CAAM,YAAA,IAAgB,EAAA;AAAA,IACrD;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,KAAY,WAAA,IAAe,cAAA,CAAA,EAAiB;AACpD,IAAA,wBAAA,CAAyB,SAAS,cAAc,CAAA;AAAA,EAClD;AAEA,EAAA,6BAAA,CAA8B,SAAS,KAAK,CAAA;AAC5C,EAAA,uBAAA,CAAwB,SAAS,KAAK,CAAA;AAEtC,EAAA,MAAM,wBAAA,GAA2B,IAAI,GAAA,CAAI,wBAAA,CAAyB,IAAI,CAAA,GAAA,KAAO,GAAA,CAAI,WAAA,EAAa,CAAC,CAAA;AAC/F,EAAA,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC3D,IAAA,IAAI,wBAAA,CAAyB,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,CAAA,EAAG;AACnD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,YAAA,IAAgB,wBAAA,CAAyB,GAAG,CAAA,EAAG;AACjD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,UAAA,GAAa,qBAAqB,KAAK,CAAA;AAC7C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,UAAA;AAAA,IACjB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,qBAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,OAAA;AACT;;;AC7ZA,IAAA,eAAA,GAAA;AAAA,EA4NE,OAAA,EAAW;AACb,CAAA;;;AC3NO,IAAM,kBAAkB,eAAA,CAAY,OAAA;AAEpC,SAAS,oBAAoB,OAAA,EAAyB;AAC3D,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,eAAe,CAAA,CAAA;AACtC;;;ACuBA,IAAM,cAAA,GAAiB,gBAAA;AACvB,IAAM,QAAA,GAAW,oBAAA;AACjB,IAAM,gBAAA,GAAmB,oBAAoB,QAAQ,CAAA;AACrD,SAAS,iBAAA,CAAkB,SAAiB,WAAA,EAA4B;AACtE,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAiB,WAAA,EAAa,KAAA,EAAM;AAAA,EACvD;AAEA,EAAA,MAAM,0BACJ,WAAA,EAAa,WAAA,EAAY,CAAE,QAAA,CAAS,kBAAkB,CAAA,IAAK,KAAA;AAC7D,EAAA,MAAM,SAAA,GACJ,2BAA2B,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,IAAK,OAAA,CAAQ,WAAW,GAAG,CAAA;AAE9E,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAoB,WAAA,EAAa,KAAA,EAAM;AAAA,EAC1D;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAM,OAAO,CAAA,EAAc,aAAa,KAAA,EAAM;AAAA,EACtE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAoB,WAAA,EAAa,IAAA,EAAK;AAAA,EACzD;AACF;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAO,UAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,eAAe,KAAA,EAAoC;AAC1D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,IAAA,GAAO,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,EAAK,GAAI,MAAA;AAC/E;AAEA,SAAS,8BAA8B,OAAA,EAAkD;AACvF,EAAA,IAAI,CAAC,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,GAAI,QAAQ,KAAA,GAAQ,OAAA;AACnD;AAEA,SAAS,iBAAiB,OAAA,EAAsC;AAC9D,EAAA,OACE,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAC1B,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA,IAC9B,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAA,IACjC,MAAA;AAEJ;AAEA,SAAS,mBAAA,CAAoB,SAAkB,QAAA,EAAkB;AAC/D,EAAA,MAAM,iBAAA,GAAoB,8BAA8B,OAAO,CAAA;AAC/D,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,MAAM,oBAAoB,CAAC,iBAAA,CAAkB,SAAS,iBAAA,CAAkB,KAAA,EAAO,kBAAkB,OAAO,CAAA;AACxG,IAAA,KAAA,MAAW,aAAa,iBAAA,EAAmB;AACzC,MAAA,MAAM,QAAA,GAAW,eAAe,SAAS,CAAA;AACzC,MAAA,IAAI,UAAU,OAAO,QAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,eAAe,OAAO,CAAA;AACzC,EAAA,IAAI,YAAY,OAAO,UAAA;AAEvB,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,iBAAiB,OAAA,EAAsC;AAC9D,EAAA,MAAM,iBAAA,GAAoB,8BAA8B,OAAO,CAAA;AAC/D,EAAA,OAAO,iBAAA,GAAoB,cAAA,CAAe,iBAAA,CAAkB,IAAI,CAAA,GAAI,MAAA;AACtE;AAEA,SAAS,iBAAA,CAAkB,UAAoB,OAAA,EAAiC;AAC9E,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,QAAA,CAAS,UAAU,CAAA;AACxD,EAAA,IAAI,eAAe,OAAO,aAAA;AAC1B,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,OAAO,CAAA,GAAI,OAAA,GAAU,IAAA;AACpD,EAAA,OAAO,aAAA,GAAgB,cAAA,CAAe,aAAA,CAAc,UAAU,KAAK,IAAA,GAAO,IAAA;AAC5E;AAEA,SAAS,iBAAiB,KAAA,EAAsD;AAC9E,EAAA,OAAO,MAAM,SAAA,EAAU;AACzB;AAUA,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,MAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,SAAA,EAAW,OAAO,QAAQ,MAAA,GAAS,OAAA;AACxD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,MAAA,CAAO,SAAS,KAAK,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA,GAAI,MAAA;AAC/E,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAEA,SAAS,aAAa,MAAA,EAA2B;AAC/C,EAAA,OAAO,IAAI,MAAA,CAAO,GAAA,CAAI,aAAa,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAChD;AAEA,SAAS,wBAAwB,KAAA,EAAwB;AACvD,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,aAAa,KAAK,CAAA;AACnD,EAAA,IAAI,SAAS,OAAO,KAAA,KAAU,UAAU,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AACnE,EAAA,OAAO,cAAc,KAAK,CAAA;AAC5B;AAEA,SAAS,sBAAsB,MAAA,EAAiC;AAC9D,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,EAAA,QAAQ,OAAO,QAAA;AAAU,IACvB,KAAK,IAAA,EAAM;AACT,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,QAAA,MAAM,IAAI,kBAAA,CAAmB;AAAA,UAC3B,IAAA,EAAM,eAAA;AAAA,UACN,OAAA,EAAS,CAAA,YAAA,EAAe,MAAA,CAAO,MAAM,CAAA,4CAAA,CAAA;AAAA,UACrC,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AACA,MAAA,OAAO,CAAA,GAAA,EAAM,YAAA,CAAa,KAAK,CAAC,CAAA,CAAA;AAAA,IAClC;AAAA,IACA,KAAK,IAAA;AACH,MAAA,OAAO,CAAA,GAAA,EAAM,aAAA,CAAc,KAAK,CAAC,CAAA,CAAA;AAAA,IACnC,KAAK,IAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,IAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,IAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAO,GAAG,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI,aAAA,CAAc,KAAK,CAAC,CAAA,CAAA;AAAA;AAEvD;AAEA,SAAS,oBAAoB,OAAA,EAAsD;AACjF,EAAA,MAAM,YAAA,GAAA,CAAgB,OAAA,CAAQ,aAAA,IAAiB,OAAA,CAAQ,UAAU,IAAA,EAAK;AACtE,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,kBAAA,CAAmB;AAAA,MAC3B,IAAA,EAAM,eAAA;AAAA,MACN,OAAA,EAAS,8BAAA;AAAA,MACT,MAAA,EAAQ,CAAA;AAAA,MACR,QAAA,EAAU,cAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,EAAA,IAAI,QAAQ,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AACtD,EAAA,IAAI,QAAQ,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AACtD,EAAA,IAAI,QAAQ,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,OAAA,EAAS,QAAQ,KAAK,CAAA;AACnD,EAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,QAAQ,MAAM,CAAA;AAC1C,EAAA,IAAI,OAAO,OAAA,CAAQ,KAAA,KAAU,QAAA,EAAU,KAAA,CAAM,IAAI,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC/E,EAAA,IAAI,OAAO,OAAA,CAAQ,MAAA,KAAW,QAAA,EAAU,KAAA,CAAM,IAAI,QAAA,EAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAClF,EAAA,IAAI,OAAA,CAAQ,OAAO,MAAA,EAAQ;AACzB,IAAA,KAAA,CAAM,GAAA;AAAA,MACJ,OAAA;AAAA,MACA,OAAA,CAAQ,KAAA,CAAM,SAAA,KAAc,KAAA,GACxB,CAAA,EAAG,QAAQ,KAAA,CAAM,MAAM,CAAA,KAAA,CAAA,GACvB,OAAA,CAAQ,KAAA,CAAM;AAAA,KACpB;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvD,MAAA,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,uBAAA,CAAwB,KAAK,CAAC,CAAA;AAAA,IAC/C;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,IAAA,KAAA,MAAW,MAAA,IAAU,QAAQ,OAAA,EAAS;AACpC,MAAA,IAAI,OAAA,CAAQ,IAAA,IAAQ,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,KAAK,OAAA,CAAQ,IAAA,EAAM,MAAA,CAAO,MAAM,CAAA,EAAG;AACrF,QAAA,MAAM,IAAI,kBAAA,CAAmB;AAAA,UAC3B,IAAA,EAAM,eAAA;AAAA,UACN,SAAS,CAAA,YAAA,EAAe,MAAA,CAAO,MAAM,CAAA,+BAAA,EAAkC,OAAO,MAAM,CAAA,aAAA,CAAA;AAAA,UACpF,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AACA,MAAA,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,qBAAA,CAAsB,MAAM,CAAC,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,CAAA,KAAA,EAAQ,kBAAA,CAAmB,YAAY,CAAC,CAAA,CAAA;AACzD,EAAA,MAAM,SAAA,GAAY,MAAM,QAAA,EAAS;AACjC,EAAA,MAAM,YAAY,SAAA,GAAY,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAAK,QAAA;AAC3D,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,YAAA,CACP,QACA,OAAA,EACwB;AACxB,EAAA,OAAO,0BAAA,CAA2B,SAAA,EAAW,gBAAA,EAAkB,MAAA,EAAQ,OAAA,EAAS;AAAA,IAC9E,MAAA,EAAQ,OAAA,EAAS,MAAA,IAAU,MAAA,CAAO,MAAA,IAAU,cAAA;AAAA,IAC5C,UAAA,EAAY,SAAS,UAAA,IAAc;AAAA,GACpC,CAAA;AACH;AAEA,SAAS,oBAAA,CACP,KAAA,EACA,QAAA,EACA,MAAA,EAC0B;AAC1B,EAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,EAAA,MAAM,YAAA,GACJ,KAAA,YAAiB,kBAAA,GACb,KAAA,GACA,IAAI,kBAAA,CAAmB;AAAA,IACrB,IAAA,EAAM,aAAA;AAAA,IACN,OAAA;AAAA,IACA,MAAA,EAAQ,CAAA;AAAA,IACR,QAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA,EAAO,OAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACP,CAAA;AAEP,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,KAAA;AAAA,IACJ,MAAA,EAAQ,CAAA;AAAA,IACR,UAAA,EAAY,IAAA;AAAA,IACZ,IAAA,EAAM,IAAA;AAAA,IACN,OAAO,YAAA,CAAa,OAAA;AAAA,IACpB,YAAA,EAAc,gBAAA;AAAA,MACZ,IAAI,kBAAA,CAAmB;AAAA,QACrB,MAAM,YAAA,CAAa,IAAA;AAAA,QACnB,SAAS,YAAA,CAAa,OAAA;AAAA,QACtB,QAAQ,YAAA,CAAa,MAAA;AAAA,QACrB,QAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAW,YAAA,CAAa,SAAA;AAAA,QACxB,MAAM,YAAA,CAAa,IAAA;AAAA,QACnB,OAAO,YAAA,CAAa;AAAA,OACrB;AAAA,KACH;AAAA,IACA,GAAA,EAAK;AAAA,GACP;AACF;AAEA,SAAS,sBAAsB,KAAA,EAAuB;AACpD,EAAA,OAAO,8BAA8B,KAAA,EAAO;AAAA,IAC1C,cAAA,EAAgB;AAAA,GACjB,CAAA;AACH;AAEA,SAAS,iBAAiB,IAAA,EAAe;AACvC,EAAA,IAAI,CAAC,MAAM,OAAO,GAAA;AAClB,EAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,kBAAA,CAAmB;AAAA,MAC3B,IAAA,EAAM,aAAA;AAAA,MACN,OAAA,EAAS,CAAA,wDAAA,EAA2D,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MACxF,MAAA,EAAQ,CAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,sBAAA,CACP,aACA,OAAA,EACwB;AACxB,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,GAAG,WAAA;AAAA,IACH,GAAI,WAAW;AAAC,GAClB;AAEA,EAAA,IAAI,CAAC,MAAA,CAAO,cAAc,KAAK,CAAC,MAAA,CAAO,cAAc,CAAA,EAAG;AACtD,IAAA,MAAA,CAAO,cAAc,CAAA,GAAI,gBAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,eAAe,sBAAA,CACb,OAAA,EACA,cAAA,EACA,OAAA,EACwC;AACxC,EAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,OAAA,EAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,OAAA,EAAS,IAAI,CAAA;AAE/C,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS,sBAAA,CAAuB,cAAA,EAAgB,OAAA,EAAS,OAAO,CAAA;AAAA,MAChE,QAAQ,OAAA,EAAS;AAAA,KAClB,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,IAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,QAAA,CAAS,OAAO,CAAA;AACnD,IAAA,MAAM,UAAA,GAAa,iBAAA;AAAA,MACjB,OAAA,IAAW,EAAA;AAAA,MACX,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc;AAAA,KACrC;AAEA,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,MAAM,gBAAA,GAAmB,IAAI,kBAAA,CAAmB;AAAA,QAC9C,IAAA,EAAM,cAAA;AAAA,QACN,OAAA,EAAS,uCAAA;AAAA,QACT,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,MAAA,EAAQ,KAAA;AAAA,QACR,SAAA;AAAA,QACA,IAAA,EAAM,iDAAA;AAAA,QACN,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG;AAAA,OAC5B,CAAA;AACD,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,SAAA,EAAW,IAAA;AAAA,QACX,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,UAAA,EAAY,iBAAA,CAAkB,QAAA,EAAU,UAAA,CAAW,MAAM,CAAA;AAAA,QACzD,OAAA;AAAA,QACA,GAAA;AAAA,QACA,OAAO,gBAAA,CAAiB,OAAA;AAAA,QACxB,YAAA,EAAc,iBAAiB,gBAAgB,CAAA;AAAA,QAC/C,KAAK,UAAA,CAAW;AAAA,OAClB;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,UAAA,CAAW,MAAA;AAC1B,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,IAAI,kBAAA,CAAmB;AAAA,QACvC,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,mBAAA;AAAA,UACP,MAAA;AAAA,UACA,CAAA,mBAAA,EAAsB,IAAI,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAM,CAAA;AAAA,SAClE;AAAA,QACA,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,MAAA,EAAQ,KAAA;AAAA,QACR,SAAA;AAAA,QACA,IAAA,EAAM,iBAAiB,MAAM;AAAA,OAC9B,CAAA;AAED,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,SAAA,EAAW,IAAA;AAAA,QACX,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,UAAA,EAAY,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA;AAAA,QAC9C,OAAA;AAAA,QACA,GAAA;AAAA,QACA,OAAO,SAAA,CAAU,OAAA;AAAA,QACjB,YAAA,EAAc,iBAAiB,SAAS,CAAA;AAAA,QACxC,GAAA,EAAK;AAAA,OACP;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAA;AAAA,MACJ,SAAA,EAAW,IAAA;AAAA,MACX,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,UAAA,EAAY,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA;AAAA,MAC9C,OAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA,EAAO,KAAA,CAAA;AAAA,MACP,YAAA,EAAc,IAAA;AAAA,MACd,GAAA,EAAK;AAAA,KACP;AAAA,EACF,SAAS,SAAA,EAAW;AAClB,IAAA,MAAM,UAAU,SAAA,YAAqB,KAAA,GAAQ,SAAA,CAAU,OAAA,GAAU,OAAO,SAAS,CAAA;AACjF,IAAA,MAAM,YAAA,GAAe,IAAI,kBAAA,CAAmB;AAAA,MAC1C,IAAA,EAAM,eAAA;AAAA,MACN,OAAA,EAAS,CAAA,2CAAA,EAA8C,GAAG,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA;AAAA,MACtE,MAAA,EAAQ,KAAA;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,SAAA,EAAW,KAAA;AAAA,MACX,MAAA,EAAQ,CAAA;AAAA,MACR,UAAA,EAAY,IAAA;AAAA,MACZ,OAAA;AAAA,MACA,GAAA;AAAA,MACA,OAAO,YAAA,CAAa,OAAA;AAAA,MACpB,YAAA,EAAc,iBAAiB,YAAY,CAAA;AAAA,MAC3C,GAAA,EAAK;AAAA,KACP;AAAA,EACF;AACF;AAUA,eAAe,UAAA,CACb,MAAA,EACA,QAAA,EACA,MAAA,EACA,SACA,OAAA,EACmC;AACnC,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,qBAAA,CAAsB,OAAA,EAAS,OAAA,IAAW,MAAA,CAAO,OAAO,CAAA;AAAA,EACpE,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,oBAAA,CAAwB,KAAA,EAAO,QAAA,EAAU,MAAM,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,OAAA,EAAS,QAAQ,CAAA;AACnD,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AAE5C,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,GAA2B;AAAA,MAC/B,MAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,WAAA,CAAY,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK,WAAW,CAAA;AAE7C,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,IAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,QAAA,CAAS,OAAO,CAAA;AACnD,IAAA,MAAM,UAAA,GAAa,iBAAA;AAAA,MACjB,OAAA,IAAW,EAAA;AAAA,MACX,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc;AAAA,KACrC;AAEA,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,MAAM,gBAAA,GAAmB,IAAI,kBAAA,CAAmB;AAAA,QAC9C,IAAA,EAAM,cAAA;AAAA,QACN,OAAA,EAAS,iCAAA;AAAA,QACT,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,QAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA;AAAA,QACA,IAAA,EAAM,iDAAA;AAAA,QACN,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG;AAAA,OAC5B,CAAA;AACD,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,UAAA,EAAY,iBAAA,CAAkB,QAAA,EAAU,UAAA,CAAW,MAAM,CAAA;AAAA,QACzD,IAAA,EAAM,IAAA;AAAA,QACN,OAAO,gBAAA,CAAiB,OAAA;AAAA,QACxB,YAAA,EAAc,iBAAiB,gBAAgB,CAAA;AAAA,QAC/C,KAAK,UAAA,CAAW;AAAA,OAClB;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,UAAA,CAAW,MAAA;AAC1B,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,GAAS,IAAA;AAElD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,IAAI,kBAAA,CAAmB;AAAA,QACvC,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,mBAAA;AAAA,UACP,MAAA;AAAA,UACA,kBAAkB,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,oBAAA,EAAuB,SAAS,MAAM,CAAA;AAAA,SAC5E;AAAA,QACA,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,QAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA;AAAA,QACA,IAAA,EAAM,iBAAiB,MAAM;AAAA,OAC9B,CAAA;AAED,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,UAAA,EAAY,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA;AAAA,QAC9C,IAAA,EAAM,IAAA;AAAA,QACN,OAAO,SAAA,CAAU,OAAA;AAAA,QACjB,YAAA,EAAc,iBAAiB,SAAS,CAAA;AAAA,QACxC,GAAA,EAAK;AAAA,OACP;AAAA,IACF;AAIA,IAAA,MAAM,WAAA,GACJ,aAAA,IAAiB,MAAA,IAAU,aAAA,GACtB,cAAc,IAAA,GACd,MAAA;AACP,IAAA,MAAM,YAAA,GACJ,aAAA,IAAiB,OAAA,IAAW,aAAA,GACxB,OAAO,aAAA,CAAc,KAAA,KAAU,QAAA,IAAY,aAAA,CAAc,KAAA,KAAU,IAAA,GAChE,aAAA,CAAc,QACf,KAAA,CAAA,GACF,KAAA,CAAA;AAEN,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAA;AAAA,MACJ,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,UAAA,EAAY,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA;AAAA,MAC9C,MAAM,WAAA,IAAe,IAAA;AAAA,MACrB,KAAA,EAAO,YAAA;AAAA,MACP,KAAA,EAAO,KAAA,CAAA;AAAA,MACP,YAAA,EAAc,IAAA;AAAA,MACd,GAAA,EAAK;AAAA,KACP;AAAA,EACF,SAAS,SAAA,EAAW;AAClB,IAAA,MAAM,UAAU,SAAA,YAAqB,KAAA,GAAQ,SAAA,CAAU,OAAA,GAAU,OAAO,SAAS,CAAA;AACjF,IAAA,MAAM,YAAA,GAAe,IAAI,kBAAA,CAAmB;AAAA,MAC1C,IAAA,EAAM,eAAA;AAAA,MACN,SAAS,CAAA,4BAAA,EAA+B,MAAM,CAAA,CAAA,EAAI,QAAQ,KAAK,OAAO,CAAA,CAAA;AAAA,MACtE,QAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,CAAA;AAAA,MACR,UAAA,EAAY,IAAA;AAAA,MACZ,IAAA,EAAM,IAAA;AAAA,MACN,OAAO,YAAA,CAAa,OAAA;AAAA,MACpB,YAAA,EAAc,iBAAiB,YAAY,CAAA;AAAA,MAC3C,GAAA,EAAK;AAAA,KACP;AAAA,EACF;AACF;AAqCO,SAAS,yBAAA,CACd,MAAA,GAAmC,EAAC,EACf;AACrB,EAAA,MAAM,iBAAA,GAAoB,qBAAA,CAAsB,MAAA,CAAO,OAAO,CAAA;AAC9D,EAAA,MAAM,gBAAA,GAA6C;AAAA,IACjD,GAAG,MAAA;AAAA,IACH,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,iBAAA;AAAA,IACT,aAAa,OAAA,EAAS;AACpB,MAAA,OAAO,YAAA,CAAa,kBAAkB,OAAO,CAAA;AAAA,IAC/C,CAAA;AAAA,IACA,MAAM,mBAAmB,OAAA,EAAS;AAChC,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,iBAAiB,OAAA,EAAS;AACxB,MAAA,OAAO,sBAAA;AAAA,QACL,iBAAA;AAAA,QACA,aAAa,gBAAgB,CAAA;AAAA,QAC7B;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAA,CAAa,SAAS,OAAA,EAAS;AAC7B,MAAA,OAAO,UAAA,CAAW,gBAAA,EAAkB,gBAAA,EAAkB,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,IAChF,CAAA;AAAA,IACA,aAAA,CAAc,SAAS,OAAA,EAAS;AAC9B,MAAA,OAAO,UAAA,CAAW,gBAAA,EAAkB,iBAAA,EAAmB,KAAA,EAAO,SAAS,OAAO,CAAA;AAAA,IAChF,CAAA;AAAA,IACA,aAAA,CAAc,SAAS,OAAA,EAAS;AAC9B,MAAA,OAAO,UAAA,CAAW,gBAAA,EAAkB,iBAAA,EAAmB,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,IACjF,CAAA;AAAA,IACA,aAAA,CAAc,SAAS,OAAA,EAAS;AAC9B,MAAA,OAAO,UAAA,CAAW,gBAAA,EAAkB,iBAAA,EAAmB,QAAA,EAAU,SAAS,OAAO,CAAA;AAAA,IACnF,CAAA;AAAA,IACA,UAAA,CAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,SAAS,GAAA,EAAK;AAChB,QAAA,MAAM,QAAA,GAAW,oBAAoB,OAAO,CAAA;AAC5C,QAAA,OAAO,UAAA,CAAW,gBAAA,EAAkB,QAAA,EAAU,KAAA,EAAO,MAAM,OAAO,CAAA;AAAA,MACpE;AACA,MAAA,OAAO,UAAA,CAAW,gBAAA,EAAkB,cAAA,EAAgB,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,IAC9E,CAAA;AAAA,IACA,YAAA,CAAa,SAAS,OAAA,EAAS;AAC7B,MAAA,OAAO,UAAA,CAAW,gBAAA,EAAkB,gBAAA,EAAkB,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,IAChF;AAAA,GACF;AACF;;;AC3lBO,SAAS,iBACd,MAAA,EACyB;AACzB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,cAAA;AAAA,IACpC;AAAA,GACF;AACA,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAClCA,eAA0C,IAAI,CAAA;AAEhD,EAAA,MAAM,MAAA,GAASC,aAAA;AAAA,IACb,MACE,yBAAA,CAA0B;AAAA,MACxB,QAAQ,MAAA,EAAQ,MAAA;AAAA,MAChB,SAAS,MAAA,EAAQ,OAAA;AAAA,MACjB,QAAQ,MAAA,EAAQ,MAAA;AAAA,MAChB,SAAS,MAAA,EAAQ,OAAA;AAAA,MACjB,cAAc,MAAA,EAAQ,YAAA;AAAA,MACtB,SAAS,MAAA,EAAQ,OAAA;AAAA,MACjB,QAAQ,MAAA,EAAQ,MAAA;AAAA,MAChB,gBAAgB,MAAA,EAAQ;AAAA,KACzB,CAAA;AAAA,IACH;AAAA,MACE,MAAA,EAAQ,OAAA;AAAA,MACR,MAAA,EAAQ,MAAA;AAAA,MACR,MAAA,EAAQ,MAAA;AAAA,MACR,MAAA,EAAQ,OAAA;AAAA,MACR,MAAA,EAAQ,YAAA;AAAA,MACR,MAAA,EAAQ,OAAA;AAAA,MACR,MAAA,EAAQ,MAAA;AAAA,MACR,MAAA,EAAQ;AAAA;AACV,GACF;AAEA,EAAA,MAAM,iBAAA,GAAoBC,iBAAA;AAAA,IACxB,OACE,IACA,QAAA,KAMsC;AACtC,MAAA,MAAM,UAAA,GAAmC;AAAA,QACvC,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,OAAA,EAAS,MAAA,CAAO,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AAAA,QAC7C,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACpC;AAEA,MAAA,cAAA,CAAe,UAAU,CAAA;AACzB,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,MAAM,EAAA,EAAG;AACpB,QAAA,eAAA,CAAgB,EAAE,GAAG,QAAA,EAAU,SAAA,EAAA,qBAAe,IAAA,EAAK,EAAE,WAAA,EAAY,EAAG,CAAA;AAEpE,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,YAAA,CAAa,QAAA,EAAU;AAAA,YACxD,UAAU,QAAA,CAAS,QAAA;AAAA,YACnB,QAAQ,QAAA,CAAS;AAAA,WAClB,CAAA;AACD,UAAA,QAAA,CAAS,QAAQ,OAAO,CAAA;AACxB,UAAA,MAAM,OAAA;AAAA,QACR;AAEA,QAAA,OAAO,QAAA;AAAA,MACT,SAAS,SAAA,EAAW;AAClB,QAAA,MAAM,UACJ,SAAA,YAAqB,KAAA,GAAQ,SAAA,CAAU,OAAA,GAAU,OAAO,SAAS,CAAA;AACnE,QAAA,MAAM,UAAA,GACJ,SAAA,YAAqB,kBAAA,GACjB,SAAA,GACA,IAAI,kBAAA,CAAmB;AAAA,UACrB,IAAA,EAAM,eAAA;AAAA,UACN,OAAA;AAAA,UACA,UAAU,QAAA,CAAS,QAAA;AAAA,UACnB,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,KAAA,EAAO;AAAA,SACR,CAAA;AACP,QAAA,QAAA,CAAS,OAAO,CAAA;AAChB,QAAA,eAAA,CAAgB;AAAA,UACd,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,MAAA,EAAQ,UAAA,CAAW,MAAA,IAAU,QAAA,EAAU,MAAA,IAAU,CAAA;AAAA,UACjD,EAAA,EAAI,KAAA;AAAA,UACJ,IAAA,EAAM,IAAA;AAAA,UACN,GAAA,EAAK,IAAA;AAAA,UACL,OAAO,UAAA,CAAW,OAAA;AAAA,UAClB,YAAA,EAAc,WAAW,SAAA;AAAU,SACpC,CAAA;AACD,QAAA,MAAM,UAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,iBAAA,GAAoB,IAAA;AAE1B,EAAA,MAAM,YAAA,GAAeA,iBAAA;AAAA,IACnB,CACE,SACA,OAAA,KACG;AACH,MAAA,MAAM,iBAAA,GAAwC;AAAA,QAC5C,GAAG,OAAA;AAAA,QACH,UAAA,EAAY,OAAA,CAAQ,UAAA,IAAc,EAAC;AAAA,QACnC,WAAA,EACE,OAAA,CAAQ,WAAA,IAAe,OAAA,EAAS,UAAA,IAAc;AAAA,OAClD;AACA,MAAA,OAAO,iBAAA;AAAA,QACL,MAAM,MAAA,CAAO,YAAA,CAAgB,iBAAA,EAAmB,OAAO,CAAA;AAAA,QACvD;AAAA,UACE,QAAA,EAAU,gBAAA;AAAA,UACV,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,iBAAA;AAAA,UACT;AAAA;AACF,OACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,mBAAmB,MAAM;AAAA,GAC5B;AAEA,EAAA,MAAM,aAAA,GAAgBA,iBAAA;AAAA,IACpB,CACE,SACA,OAAA,KAEA,iBAAA,CAAqB,MAAM,MAAA,CAAO,aAAA,CAAiB,OAAA,EAAS,OAAO,CAAA,EAAG;AAAA,MACpE,QAAA,EAAU,iBAAA;AAAA,MACV,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH,CAAC,mBAAmB,MAAM;AAAA,GAC5B;AAEA,EAAA,MAAM,aAAA,GAAgBA,iBAAA;AAAA,IACpB,CACE,SACA,OAAA,KACG;AACH,MAAA,MAAM,iBAAA,GAAyC;AAAA,QAC7C,GAAG,OAAA;AAAA,QACH,UAAA,EAAY,OAAA,CAAQ,UAAA,IAAc,EAAC;AAAA,QACnC,WAAA,EACE,OAAA,CAAQ,WAAA,IAAe,OAAA,EAAS,UAAA,IAAc;AAAA,OAClD;AACA,MAAA,OAAO,iBAAA;AAAA,QACL,MAAM,MAAA,CAAO,aAAA,CAAiB,iBAAA,EAAmB,OAAO,CAAA;AAAA,QACxD;AAAA,UACE,QAAA,EAAU,iBAAA;AAAA,UACV,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,iBAAA;AAAA,UACT;AAAA;AACF,OACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,mBAAmB,MAAM;AAAA,GAC5B;AAEA,EAAA,MAAM,aAAA,GAAgBA,iBAAA;AAAA,IACpB,CACE,SACA,OAAA,KACG;AACH,MAAA,IAAI,CAAC,QAAQ,WAAA,EAAa;AACxB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO,iBAAA;AAAA,QACL,MAAM,MAAA,CAAO,aAAA,CAAiB,OAAA,EAAS,OAAO,CAAA;AAAA,QAC9C,EAAE,QAAA,EAAU,iBAAA,EAAmB,MAAA,EAAQ,QAAA,EAAU,SAAS,OAAA;AAAQ,OACpE;AAAA,IACF,CAAA;AAAA,IACA,CAAC,mBAAmB,MAAM;AAAA,GAC5B;AAEA,EAAA,MAAM,UAAA,GAAaA,iBAAA;AAAA,IACjB,CAAc,SAA2B,OAAA,KACvC,iBAAA,CAAqB,MAAM,MAAA,CAAO,UAAA,CAAc,OAAA,EAAS,OAAO,CAAA,EAAG;AAAA,MACjE,UAAU,OAAA,EAAS,GAAA,GAAM,CAAA,KAAA,EAAQ,OAAA,CAAQ,QAAQ,CAAA,CAAA,GAAK,cAAA;AAAA,MACtD,MAAA,EAAQ,OAAA,EAAS,GAAA,GAAM,KAAA,GAAQ,MAAA;AAAA,MAC/B,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH,CAAC,mBAAmB,MAAM;AAAA,GAC5B;AAEA,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAS,MAAA,CAAO;AAAA,GAClB;AACF;;;ACrNA,SAASC,UAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAO,UAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,YAAY,KAAA,EAAuE;AAC1F,EAAA,OAAO,KAAA,IAAS,QAAQ,CAAC,QAAA,EAAU,UAAU,SAAS,CAAA,CAAE,QAAA,CAAS,OAAO,KAAK,CAAA;AAC/E;AAEA,SAAS,gBAAgB,KAAA,EAA6D;AACpF,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,SAAA;AAC3B,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,cAAA;AAChC,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU,OAAO,OAAO,KAAA,CAAM,MAAM,IAAI,KAAK,CAAA,CAAA;AAClE,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAMC,cAAa,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA,GAAI,KAAA;AAC5D,IAAA,OAAO,CAAA,IAAA,EAAOA,WAAAA,CAAW,MAAM,CAAA,CAAA,EAAIA,WAAU,CAAA,CAAA;AAAA,EAC/C;AACA,EAAA,MAAM,UAAA,GAAa,QAAQ,GAAA,GAAM,GAAA;AACjC,EAAA,OAAO,CAAA,KAAA,EAAQ,UAAA,CAAW,MAAM,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AAChD;AAEA,SAAS,eAAA,CAAgB,OAAgB,IAAA,EAA+B;AACtE,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,MAAA;AAC3B,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,WAAA;AAEhC,EAAA,MAAM,YAAY,OAAO,KAAA;AACzB,EAAA,IAAI,SAAA,KAAc,QAAA,EAAU,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAC5C,EAAA,IAAI,SAAA,KAAc,UAAU,OAAO,MAAA,CAAO,SAAS,KAAe,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA,GAAI,MAAA;AACtF,EAAA,IAAI,SAAA,KAAc,SAAA,EAAW,OAAQ,KAAA,GAAoB,MAAA,GAAS,OAAA;AAClE,EAAA,IAAI,cAAc,QAAA,EAAU,OAAO,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA,CAAA;AACnD,EAAA,IAAI,cAAc,QAAA,EAAU,OAAO,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAC1D,EAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,IAAA,MAAM,aAAA,GAAgB,KAAA;AACtB,IAAA,OAAO,CAAA,SAAA,EAAY,aAAA,CAAc,IAAA,IAAQ,WAAW,CAAA,CAAA;AAAA,EACtD;AAEA,EAAA,IAAI,iBAAiB,IAAA,EAAM,OAAO,CAAA,KAAA,EAAQ,KAAA,CAAM,aAAa,CAAA,CAAA;AAE7D,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,KAAQ,eAAA,CAAgB,IAAA,EAAM,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,EACrE;AAEA,EAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,IAAA,MAAM,WAAA,GAAc,KAAA;AACpB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,EAAG,OAAO,YAAA;AAClC,IAAA,IAAA,CAAK,IAAI,WAAW,CAAA;AACpB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,WAAW,EAAE,IAAA,EAAK;AAC3C,IAAA,MAAM,aAAa,CAAA,CAAA,EAAI,IAAA,CACpB,IAAI,CAAA,GAAA,KAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,eAAA,CAAgB,WAAA,CAAY,GAAG,GAAG,IAAI,CAAC,EAAE,CAAA,CAC9D,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AACZ,IAAA,IAAA,CAAK,OAAO,WAAW,CAAA;AACvB,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAEO,SAAS,sBAAsB,QAAA,EAA4B;AAChE,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,MAAA,OAAO,OAAO,QAAQ,CAAA,CAAA;AAAA,IACxB;AAEA,IAAA,IAAI,MAAM,OAAA,CAAQ,QAAQ,KAAK,QAAA,CAAS,KAAA,CAAM,WAAW,CAAA,EAAG;AAC1D,MAAA,OAAO,CAAA,IAAA,EAAO,QAAA,CAAS,GAAA,CAAI,CAAA,IAAA,KAAQ,eAAA,CAAgB,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,IACrE;AAEA,IAAA,OAAO,OAAO,eAAA,CAAgB,QAAA,kBAAU,IAAI,OAAA,EAAiB,CAAC,CAAA,CAAA;AAAA,EAChE,CAAA,CAAA,MAAQ;AACN,IAAA,IAAI;AACF,MAAA,OAAO,CAAA,SAAA,EAAY,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAAA,IACrC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,qCAAA;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,MAAM,EAAA,EAA2B;AAC/C,EAAA,IAAI,EAAA,IAAM,CAAA,EAAG,OAAO,OAAA,CAAQ,OAAA,EAAQ;AACpC,EAAA,OAAO,IAAI,QAAQ,CAAA,OAAA,KAAW;AAC5B,IAAA,UAAA,CAAW,SAAS,EAAE,CAAA;AAAA,EACxB,CAAC,CAAA;AACH;AAEA,SAAS,kBAAkB,KAAA,EAA6C;AACtE,EAAA,IAAI,KAAA,KAAU,KAAA,IAAS,KAAA,IAAS,IAAA,EAAM,OAAO,CAAA;AAC7C,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,GAAG,OAAO,CAAA;AACpC,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AACtC;AAEA,SAAS,iBAAA,CAAkB,YAA0C,OAAA,EAAyB;AAC5F,EAAA,IAAI,OAAO,eAAe,UAAA,EAAY;AACpC,IAAA,MAAM,QAAA,GAAW,WAAW,OAAO,CAAA;AACnC,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,QAAQ,GAAG,OAAO,CAAA;AACvC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAA;AAAA,EAC7B;AACA,EAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,UAAU,GAAG,OAAO,CAAA;AACzC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAU,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,CAAA;AACT;AAEA,eAAsB,YAAA,CACpB,SACA,OAAA,EACY;AACZ,EAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,OAAA,EAAS,KAAK,CAAA;AAChD,EAAA,IAAI,OAAA,GAAU,CAAA;AAEd,EAAA,WAAS;AACP,IAAA,OAAA,IAAW,CAAA;AACX,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,QAAQ,OAAO,CAAA;AAAA,IAC9B,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,OAAA,EAAS,UAAA,EAAY,OAAO,CAAA;AAC5D,MAAA,MAAM,MAAM,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,KAAA,EAAwB;AACvD,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,MAAK,EAAG,OAAO,MAAM,IAAA,EAAK;AACjE,EAAA,IAAI,KAAA,YAAiB,SAAS,KAAA,CAAM,OAAA,CAAQ,MAAK,EAAG,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAK;AAC9E,EAAA,IAAID,SAAAA,CAAS,KAAK,CAAA,EAAG;AACnB,IAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,KAAA;AAChD,IAAA,IAAI,OAAO,gBAAA,KAAqB,QAAA,IAAY,gBAAA,CAAiB,MAAK,EAAG;AACnE,MAAA,OAAO,iBAAiB,IAAA,EAAK;AAAA,IAC/B;AAAA,EACF;AACA,EAAA,OAAO,uBAAA;AACT;AAEO,SAAS,oBAAA,CACd,OACA,MAAA,EACkB;AAClB,EAAA,IACEA,SAAAA,CAAS,KAAK,CAAA,IACd,OAAO,MAAM,OAAA,KAAY,QAAA,KACxB,MAAM,MAAA,KAAW,MAAA,IAAa,OAAO,KAAA,CAAM,MAAA,KAAW,cACtD,KAAA,CAAM,IAAA,KAAS,UAAa,OAAO,KAAA,CAAM,SAAS,QAAA,CAAA,EACnD;AACA,IAAA,OAAO;AAAA,MACL,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,QAAQ,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,GAAW,MAAM,MAAA,GAAS,MAAA;AAAA,MAC1D,MAAM,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,MAAM,IAAA,GAAO,MAAA;AAAA,MACpD,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,GAAA,EAAK,KAAA,CAAM,GAAA,IAAO,MAAA,IAAU;AAAA,KAC9B;AAAA,EACF;AAEA,EAAA,IAAI,oBAAA,CAAqB,KAAK,CAAA,EAAG;AAC/B,IAAA,MAAM,OAAA,GAAU,MAAM,SAAA,EAAU;AAChC,IAAA,OAAO;AAAA,MACL,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,OAAA;AAAA,MACA,KAAK,MAAA,IAAU;AAAA,KACjB;AAAA,EACF;AAEA,EAAA,IAAIA,SAAAA,CAAS,MAAM,CAAA,IAAK,MAAA,CAAO,gBAAgBA,SAAAA,CAAS,MAAA,CAAO,YAAY,CAAA,EAAG;AAC5E,IAAA,MAAM,UAAU,MAAA,CAAO,YAAA;AACvB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,uBAAA,CAAwB,KAAA,IAAS,MAAA,CAAO,KAAK,CAAA;AAAA,MACtD,QAAQ,OAAO,MAAA,CAAO,MAAA,KAAW,QAAA,GAAW,OAAO,MAAA,GAAS,MAAA;AAAA,MAC5D,MAAM,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,GAAW,QAAQ,IAAA,GAAO,MAAA;AAAA,MACxD,OAAA;AAAA,MACA,GAAA,EAAK;AAAA,KACP;AAAA,EACF;AAEA,EAAA,IAAIA,UAAS,MAAM,CAAA,IAAK,OAAO,MAAA,CAAO,WAAW,QAAA,EAAU;AACzD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,wBAAwB,KAAK,CAAA;AAAA,MACtC,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAA,EAAS,MAAA;AAAA,MACT,GAAA,EAAK;AAAA,KACP;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,wBAAwB,KAAK,CAAA;AAAA,IACtC,KAAK,MAAA,IAAU;AAAA,GACjB;AACF;AAEO,SAAS,qBAAwB,KAAA,EAAgD;AACtF,EAAA,IAAI,CAACA,SAAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,IAAI,OAAA,IAAW,KAAA,IAAS,cAAA,IAAkB,KAAA,EAAO,OAAO,IAAA;AACxD,EAAA,IAAI,QAAA,IAAY,KAAA,IAAS,OAAO,KAAA,CAAM,WAAW,QAAA,EAAU;AACzD,IAAA,OAAO,MAAA,IAAU,SAAS,KAAA,IAAS,KAAA;AAAA,EACrC;AACA,EAAA,OACE,MAAA,IAAU,KAAA,KACT,KAAA,IAAS,KAAA,IAAS,QAAA,IAAY,KAAA,CAAA;AAEnC;AAEO,SAAS,qBAAA,CACd,OACA,MAAA,EAC0B;AAC1B,EAAA,IAAI,oBAAA,CAAmC,KAAK,CAAA,EAAG;AAC7C,IAAA,MAAM,MAAA,GAAS,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,GAAW,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,IAAS,IAAA,GAAO,GAAA,GAAM,GAAA;AAC7F,IAAA,IAAI,KAAA,CAAM,SAAS,IAAA,EAAM;AACvB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,oBAAA,CAAqB,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA;AAAA,QAC9C,MAAA;AAAA,QACA,GAAA,EAAK,MAAM,GAAA,IAAO;AAAA,OACpB;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,MAAA,IAAU,KAAA;AAC1B,IAAA,MAAME,WAAAA,GAAa,OAAA,GACd,KAAA,CAAM,IAAA,GACP,MAAA;AACJ,IAAA,MAAMC,aAAAA,GACJD,WAAAA,KAAe,MAAA,GACX,MAAA,GACAA,WAAAA,KAAe,OACZ,IAAA,GACH,MAAA,GACE,MAAA,CAAOA,WAAU,CAAA,GAChBA,WAAAA;AAET,IAAA,OAAO;AAAA,MACL,IAAA,EAAMC,aAAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,MAAA;AAAA,MACA,GAAA,EAAK,MAAM,GAAA,IAAO;AAAA,KACpB;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,KAAA;AACnB,EAAA,MAAM,YAAA,GAAe,MAAA,GACjB,MAAA,CAAO,UAAU,CAAA,GAChB,UAAA;AAEL,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,GAAA,EAAK;AAAA,GACP;AACF;;;ACjNA,SAAS,wBAA+B,WAAA,EAA8C;AACpF,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,WAAA,KAAgB,MAAA,GAAY,MAAA,GAAS,SAAA;AAAA,IAC7C,UAAA,EAAY,KAAA;AAAA,IACZ,IAAA,EAAM,WAAA;AAAA,IACN,KAAA,EAAO,IAAA;AAAA,IACP,SAAA,EAAW,WAAA,KAAgB,MAAA,GAAY,MAAA,GAAY,KAAK,GAAA;AAAI,GAC9D;AACF;AAEA,SAAS,0BAAA,GAAwF;AAC/F,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,IAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,aAAA,EAAe,MAAA;AAAA,IACf,YAAA,EAAc,MAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACb;AACF;AAEA,SAAS,qBAAqB,MAAA,EAA0C;AACtE,EAAA,OAAO,MAAA,CAAO,OAAO,IAAA,KAAS,QAAA;AAChC;AAEO,IAAM,oBAAN,MAAwB;AAAA,EACZ,YAAA,uBAAmB,GAAA,EAAwB;AAAA,EAC3C,eAAA,uBAAsB,GAAA,EAA2B;AAAA,EACjD,eAAA,uBAAsB,GAAA,EAAiD;AAAA,EACvE,gBAAA,uBAAuB,GAAA,EAAyC;AAAA,EAChE,QAAA,uBAAe,GAAA,EAAwB;AAAA,EAChD,cAAA,GAAiB,CAAA;AAAA,EAEhB,MAAA;AAAA,EACA,mBAAA;AAAA,EACA,sBAAA;AAAA,EAET,WAAA,CAAY,MAAA,GAAkC,EAAC,EAAG;AAChD,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,MAAA,CAAO,KAAA,EAAO,IAAA,IAAQ,MAAA;AAAA,QAC5B,SAAA,EAAW,OAAO,KAAA,EAAO,SAAA;AAAA,QACzB,MAAA,EAAQ,OAAO,KAAA,EAAO;AAAA,OACxB;AAAA,MACA,qBAAqB,MAAA,CAAO,mBAAA;AAAA,MAC5B,wBAAwB,MAAA,CAAO;AAAA,KACjC;AACA,IAAA,IAAA,CAAK,mBAAA,GAAsB;AAAA,MACzB,KAAA,EAAO,MAAA,CAAO,mBAAA,EAAqB,KAAA,IAAS,CAAA;AAAA,MAC5C,UAAA,EAAY,OAAO,mBAAA,EAAqB,UAAA;AAAA,MACxC,cAAA,EAAgB,MAAA,CAAO,mBAAA,EAAqB,cAAA,IAAkB,IAAA;AAAA,MAC9D,oBAAA,EAAsB,MAAA,CAAO,mBAAA,EAAqB,oBAAA,IAAwB,KAAA;AAAA,MAC1E,kBAAA,EAAoB,MAAA,CAAO,mBAAA,EAAqB,kBAAA,IAAsB;AAAA,KACxE;AACA,IAAA,IAAA,CAAK,sBAAA,GAAyB;AAAA,MAC5B,KAAA,EAAO,MAAA,CAAO,sBAAA,EAAwB,KAAA,IAAS,CAAA;AAAA,MAC/C,UAAA,EAAY,OAAO,sBAAA,EAAwB;AAAA,KAC7C;AAAA,EACF;AAAA,EAEA,iBAAiB,QAAA,EAA4B;AAC3C,IAAA,OAAO,sBAAsB,QAAQ,CAAA;AAAA,EACvC;AAAA,EAEA,oBAAoB,WAAA,EAAgC;AAClD,IAAA,IAAI,eAAe,IAAA,EAAM;AACvB,MAAA,OAAO,uBAAA;AAAA,IACT;AACA,IAAA,OAAO,sBAAsB,WAAW,CAAA;AAAA,EAC1C;AAAA,EAEA,cAA+B,GAAA,EAAsC;AACnE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAA;AACvC,IAAA,OAAO,KAAA,CAAM,KAAA;AAAA,EACf;AAAA,EAEA,iBACE,GAAA,EACwC;AACxC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,mBAAA,CAAoB,GAAG,CAAA;AAC1C,IAAA,OAAO,KAAA,CAAM,KAAA;AAAA,EACf;AAAA,EAEA,cAAA,CAAe,KAAa,QAAA,EAAyC;AACnE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAA;AACvC,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,YAAA,CAAa,MAAM,OAAO,CAAA;AAC1B,MAAA,KAAA,CAAM,OAAA,GAAU,MAAA;AAAA,IAClB;AACA,IAAA,KAAA,CAAM,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC5B,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AACzC,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,OAAA,CAAQ,SAAA,CAAU,OAAO,QAAQ,CAAA;AACjC,MAAA,IAAI,OAAA,CAAQ,SAAA,CAAU,IAAA,KAAS,CAAA,EAAG;AAChC,QAAA,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAAA,MAC9B;AAAA,IACF,CAAA;AAAA,EACF;AAAA,EAEA,iBAAA,CAAkB,KAAa,QAAA,EAAyC;AACtE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,mBAAA,CAAoB,GAAG,CAAA;AAC1C,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,YAAA,CAAa,MAAM,OAAO,CAAA;AAC1B,MAAA,KAAA,CAAM,OAAA,GAAU,MAAA;AAAA,IAClB;AACA,IAAA,KAAA,CAAM,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC5B,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA;AAC5C,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,OAAA,CAAQ,SAAA,CAAU,OAAO,QAAQ,CAAA;AACjC,MAAA,IAAI,OAAA,CAAQ,SAAA,CAAU,IAAA,KAAS,CAAA,EAAG;AAChC,QAAA,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,MACjC;AAAA,IACF,CAAA;AAAA,EACF;AAAA,EAEA,gBAAgB,QAAA,EAAkE;AAChF,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,QAAQ,CAAA;AAClC,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,QAAQ,CAAA;AAAA,IACvC,CAAA;AAAA,EACF;AAAA,EAEA,cAAc,OAAA,EAAgD;AAC5D,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,OAAO,CAAA;AACzB,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,OAAO,CAAA;AAAA,IAC9B,CAAA;AAAA,EACF;AAAA,EAEA,WAAW,QAAA,EAA0B;AACnC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAA;AACvC,IAAA,KAAA,CAAM,eAAA,GAAkB,EAAE,IAAA,CAAK,cAAA;AAC/B,IAAA,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,uBAAA,EAAwB,EAAG,aAAa,CAAA;AAClE,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,GAAG,CAAA;AAAA,EACjC;AAAA,EAEA,cAAc,WAAA,EAA8B;AAC1C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,mBAAA,CAAoB,WAAW,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,mBAAA,CAAoB,GAAG,CAAA;AAC1C,IAAA,KAAA,CAAM,eAAA,GAAkB,EAAE,IAAA,CAAK,cAAA;AAC/B,IAAA,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,0BAAA,EAA2B,EAAG,gBAAgB,CAAA;AAAA,EAC7E;AAAA,EAEA,MAAM,aACJ,KAAA,EACmC;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,KAAA,CAAM,aAAa,CAAA;AAEvD,IAAA,IAAI,KAAA,CAAM,WAAW,KAAA,EAAO;AAC1B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,aAAa,CAAA;AAC7D,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAA,CAAM,KAAA,IAAS,oBAAA,CAAqB,IAAA,CAAK,MAAM,CAAA,EAAG;AACrD,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,SAAA,IAAa,CAAA;AAClD,MAAA,MAAM,eACJ,KAAA,CAAM,KAAA,CAAM,WAAW,SAAA,IACvB,KAAA,CAAM,MAAM,IAAA,KAAS,MAAA,IACrB,KAAA,CAAM,KAAA,CAAM,cAAc,MAAA,IAC1B,IAAA,CAAK,KAAI,GAAI,KAAA,CAAM,MAAM,SAAA,IAAa,SAAA;AACxC,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,MAAM,KAAA,CAAM,IAAA;AAAA,UAClB,KAAA,EAAO,IAAA;AAAA,UACP,MAAA,EAAQ,GAAA;AAAA,UACR,GAAA,EAAK,KAAA,CAAM,KAAA,CAAM,YAAA,IAAgB,MAAM,KAAA,CAAM,IAAA;AAAA,UAC7C,SAAA,EAAW;AAAA,SACb;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,EAAE,IAAA,CAAK,cAAA;AACzB,IAAA,KAAA,CAAM,eAAA,GAAkB,SAAA;AAExB,IAAA,MAAM,eAAA,GAAyC;AAAA,MAC7C,SAAA;AAAA,MACA,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,eAAe,KAAA,CAAM,aAAA;AAAA,MACrB,OAAA,EAAS,CAAA;AAAA,MACT,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAEA,IAAA,MAAM,gBAAgB,KAAA,CAAM,KAAA,CAAM,SAAS,MAAA,GAAY,SAAA,GAAY,MAAM,KAAA,CAAM,MAAA;AAC/E,IAAA,IAAA,CAAK,aAAA;AAAA,MACH,KAAA;AAAA,MACA;AAAA,QACE,GAAG,KAAA,CAAM,KAAA;AAAA,QACT,MAAA,EAAQ,aAAA;AAAA,QACR,UAAA,EAAY,IAAA;AAAA,QACZ,KAAA,EAAO,IAAA;AAAA,QACP,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,gBAAA,GAAmB,YAAA;AAAA,MACvB,OAAM,OAAA,KAAW;AACf,QAAA,MAAM,iBAAA,GAA2C;AAAA,UAC/C,GAAG,eAAA;AAAA,UACH;AAAA,SACF;AAEA,QAAA,IAAI,KAAA,CAAM,oBAAoB,SAAA,EAAW;AACvC,UAAA,IAAA,CAAK,aAAA;AAAA,YACH,KAAA;AAAA,YACA;AAAA,cACE,GAAG,KAAA,CAAM,KAAA;AAAA,cACT,WAAA,EAAa,iBAAA;AAAA,cACb,UAAA,EAAY;AAAA,aACd;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAEA,QAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,OAAA,EAAQ;AACtC,QAAA,MAAM,UAAA,GAAa,qBAAA,CAA2C,SAAA,EAAW,KAAA,CAAM,MAAM,CAAA;AAErF,QAAA,IAAI,WAAW,KAAA,EAAO;AACpB,UAAA,MAAM;AAAA,YACJ,yBAAyB,UAAA,CAAW,KAAA;AAAA,YACpC,gBAAgB,UAAA,CAAW,MAAA;AAAA,YAC3B,aAAa,UAAA,CAAW,GAAA;AAAA,YACxB,gBAAA,EAAkB;AAAA,WACpB;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,UAAA;AAAA,UACA,QAAA,EAAU,SAAA;AAAA,UACV;AAAA,SACF;AAAA,MACF,CAAA;AAAA,MACA;AAAA,QACE,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,YAAY,KAAA,CAAM;AAAA;AACpB,KACF,CACG,KAAK,CAAA,MAAA,KAAU;AACd,MAAA,MAAM,OAAA,GAAU,MAAM,eAAA,KAAoB,SAAA;AAC1C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,UAAA,GAAa,KAAK,GAAA,EAAI;AAC5B,QAAA,MAAM,cAAA,GAAwC;AAAA,UAC5C,GAAG,eAAA;AAAA,UACH,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,OAAA,EAAS;AAAA,SACX;AACA,QAAA,IAAA,CAAK,aAAA;AAAA,UACH,KAAA;AAAA,UACA;AAAA,YACE,GAAG,KAAA,CAAM,KAAA;AAAA,YACT,MAAA,EAAQ,SAAA;AAAA,YACR,UAAA,EAAY,KAAA;AAAA,YACZ,KAAA,EAAO,IAAA;AAAA,YACP,IAAA,EAAM,OAAO,UAAA,CAAW,IAAA;AAAA,YACxB,WAAA,EAAa,cAAA;AAAA,YACb,cAAc,MAAA,CAAO,QAAA;AAAA,YACrB,SAAA,EAAW;AAAA,WACb;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,GAAG,MAAA,CAAO,UAAA;AAAA,QACV,SAAA,EAAW;AAAA,OACb;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,KAAA,KAAS;AACd,MAAA,MAAM,UACJ,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,OAAQ,KAAA,GAAoC,MAAA;AAErF,MAAA,MAAM,kBAAkB,OAAA,EAAS,uBAAA,GAC5B,OAAA,CAAQ,uBAAA,GACT,qBAAqB,KAAK,CAAA;AAE9B,MAAA,MAAM,MAAA,GACJ,OAAO,OAAA,EAAS,cAAA,KAAmB,WAC9B,OAAA,CAAQ,cAAA,GACT,gBAAgB,MAAA,IAAU,GAAA;AAEhC,MAAA,MAAM,GAAA,GAAM,OAAA,EAAS,WAAA,IAAe,eAAA,CAAgB,GAAA,IAAO,IAAA;AAC3D,MAAA,MAAM,QAAA,GAAW,SAAS,gBAAA,IAAoB,GAAA;AAE9C,MAAA,MAAM,OAAA,GAAU,MAAM,eAAA,KAAoB,SAAA;AAC1C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,UAAA,GAAa,KAAK,GAAA,EAAI;AAC5B,QAAA,MAAM,cAAA,GAAwC;AAAA,UAC5C,GAAG,eAAA;AAAA,UACH,OAAA,EAAS,UAAA;AAAA,UACT,OAAA,EACE,KAAA,CAAM,KAAA,CAAM,WAAA,EAAa,SAAA,KAAc,YACnC,KAAA,CAAM,KAAA,CAAM,WAAA,CAAY,OAAA,GACxB,eAAA,CAAgB;AAAA,SACxB;AACA,QAAA,IAAA,CAAK,aAAA;AAAA,UACH,KAAA;AAAA,UACA;AAAA,YACE,GAAG,KAAA,CAAM,KAAA;AAAA,YACT,MAAA,EAAQ,OAAA;AAAA,YACR,UAAA,EAAY,KAAA;AAAA,YACZ,KAAA,EAAO,eAAA;AAAA,YACP,WAAA,EAAa,cAAA;AAAA,YACb,YAAA,EAAc,QAAA;AAAA,YACd,SAAA,EAAW;AAAA,WACb;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,eAAA;AAAA,QACP,MAAA;AAAA,QACA,GAAA;AAAA,QACA,SAAA,EAAW;AAAA,OACb;AAAA,IACF,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,aAAa,CAAA;AAC7D,MAAA,IAAI,aAAa,gBAAA,EAAkB;AACjC,QAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,aAAa,CAAA;AAAA,MACjD;AAAA,IACF,CAAC,CAAA;AAEH,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,KAAA,CAAM,aAAA,EAAe,gBAAuD,CAAA;AAErG,IAAA,OAAO,gBAAA;AAAA,EACT;AAAA,EAEA,MAAM,gBACJ,KAAA,EAC0C;AAC1C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,mBAAA,CAAoB,KAAA,CAAM,gBAAgB,CAAA;AAC7D,IAAA,MAAM,SAAA,GAAY,EAAE,IAAA,CAAK,cAAA;AACzB,IAAA,KAAA,CAAM,eAAA,GAAkB,SAAA;AAExB,IAAA,MAAM,eAAA,GAAwD;AAAA,MAC5D,SAAA;AAAA,MACA,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,kBAAkB,KAAA,CAAM,gBAAA;AAAA,MACxB,OAAA,EAAS,CAAA;AAAA,MACT,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,WAAW,KAAA,CAAM;AAAA,KACnB;AAEA,IAAA,IAAA,CAAK,gBAAA;AAAA,MACH,KAAA;AAAA,MACA;AAAA,QACE,GAAG,KAAA,CAAM,KAAA;AAAA,QACT,MAAA,EAAQ,SAAA;AAAA,QACR,SAAA,EAAW,IAAA;AAAA,QACX,KAAA,EAAO,IAAA;AAAA,QACP,eAAe,KAAA,CAAM,SAAA;AAAA,QACrB,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,YAAA;AAAA,QACnB,OAAM,OAAA,KAAW;AACf,UAAA,MAAM,iBAAA,GAA0D;AAAA,YAC9D,GAAG,eAAA;AAAA,YACH;AAAA,WACF;AAEA,UAAA,IAAI,KAAA,CAAM,oBAAoB,SAAA,EAAW;AACvC,YAAA,IAAA,CAAK,gBAAA;AAAA,cACH,KAAA;AAAA,cACA;AAAA,gBACE,GAAG,KAAA,CAAM,KAAA;AAAA,gBACT,WAAA,EAAa,iBAAA;AAAA,gBACb,SAAA,EAAW;AAAA,eACb;AAAA,cACA;AAAA,aACF;AAAA,UACF;AAEA,UAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,UAAA,CAAW,MAAM,SAAS,CAAA;AACxD,UAAA,MAAM,UAAA,GAAa,qBAAA,CAA8C,SAAA,EAAW,KAAA,CAAM,MAAM,CAAA;AACxF,UAAA,IAAI,WAAW,KAAA,EAAO;AACpB,YAAA,MAAM;AAAA,cACJ,yBAAyB,UAAA,CAAW,KAAA;AAAA,cACpC,gBAAgB,UAAA,CAAW,MAAA;AAAA,cAC3B,aAAa,UAAA,CAAW,GAAA;AAAA,cACxB,gBAAA,EAAkB;AAAA,aACpB;AAAA,UACF;AAEA,UAAA,OAAO;AAAA,YACL,UAAA;AAAA,YACA,QAAA,EAAU,SAAA;AAAA,YACV;AAAA,WACF;AAAA,QACF,CAAA;AAAA,QACA;AAAA,UACE,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,YAAY,KAAA,CAAM;AAAA;AACpB,OACF;AAEA,MAAA,IAAI,KAAA,CAAM,oBAAoB,SAAA,EAAW;AACvC,QAAA,MAAM,UAAA,GAAa,KAAK,GAAA,EAAI;AAC5B,QAAA,MAAM,cAAA,GAAuD;AAAA,UAC3D,GAAG,eAAA;AAAA,UACH,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,OAAA,EAAS;AAAA,SACX;AACA,QAAA,IAAA,CAAK,gBAAA;AAAA,UACH,KAAA;AAAA,UACA;AAAA,YACE,GAAG,KAAA,CAAM,KAAA;AAAA,YACT,MAAA,EAAQ,SAAA;AAAA,YACR,SAAA,EAAW,KAAA;AAAA,YACX,IAAA,EAAM,OAAO,UAAA,CAAW,IAAA;AAAA,YACxB,KAAA,EAAO,IAAA;AAAA,YACP,eAAe,KAAA,CAAM,SAAA;AAAA,YACrB,WAAA,EAAa,cAAA;AAAA,YACb,cAAc,MAAA,CAAO,QAAA;AAAA,YACrB,SAAA,EAAW;AAAA,WACb;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAEA,MAAA,OAAO,MAAA,CAAO,UAAA;AAAA,IAChB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,UACJ,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,OAAQ,KAAA,GAAoC,MAAA;AACrF,MAAA,MAAM,kBAAkB,OAAA,EAAS,uBAAA,GAC5B,OAAA,CAAQ,uBAAA,GACT,qBAAqB,KAAK,CAAA;AAE9B,MAAA,MAAM,MAAA,GACJ,OAAO,OAAA,EAAS,cAAA,KAAmB,WAC9B,OAAA,CAAQ,cAAA,GACT,gBAAgB,MAAA,IAAU,GAAA;AAChC,MAAA,MAAM,GAAA,GAAM,OAAA,EAAS,WAAA,IAAe,eAAA,CAAgB,GAAA,IAAO,IAAA;AAC3D,MAAA,MAAM,QAAA,GAAW,SAAS,gBAAA,IAAoB,GAAA;AAE9C,MAAA,IAAI,KAAA,CAAM,oBAAoB,SAAA,EAAW;AACvC,QAAA,MAAM,UAAA,GAAa,KAAK,GAAA,EAAI;AAC5B,QAAA,MAAM,cAAA,GAAuD;AAAA,UAC3D,GAAG,eAAA;AAAA,UACH,OAAA,EAAS,UAAA;AAAA,UACT,OAAA,EACE,KAAA,CAAM,KAAA,CAAM,WAAA,EAAa,SAAA,KAAc,YACnC,KAAA,CAAM,KAAA,CAAM,WAAA,CAAY,OAAA,GACxB,eAAA,CAAgB;AAAA,SACxB;AAEA,QAAA,IAAA,CAAK,gBAAA;AAAA,UACH,KAAA;AAAA,UACA;AAAA,YACE,GAAG,KAAA,CAAM,KAAA;AAAA,YACT,MAAA,EAAQ,OAAA;AAAA,YACR,SAAA,EAAW,KAAA;AAAA,YACX,KAAA,EAAO,eAAA;AAAA,YACP,eAAe,KAAA,CAAM,SAAA;AAAA,YACrB,WAAA,EAAa,cAAA;AAAA,YACb,YAAA,EAAc,QAAA;AAAA,YACd,SAAA,EAAW;AAAA,WACb;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,eAAA;AAAA,QACP,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBAAiB,GAAA,EAAyB;AAChD,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,IAAI,OAAO,OAAO,KAAA;AAElB,IAAA,KAAA,GAAQ;AAAA,MACN,GAAA;AAAA,MACA,OAAO,uBAAA,EAAwB;AAAA,MAC/B,SAAA,sBAAe,GAAA,EAAI;AAAA,MACnB,eAAA,EAAiB;AAAA,KACnB;AACA,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAChC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,oBAAoB,GAAA,EAA4B;AACtD,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA;AACxC,IAAA,IAAI,OAAO,OAAO,KAAA;AAElB,IAAA,KAAA,GAAQ;AAAA,MACN,GAAA;AAAA,MACA,OAAO,0BAAA,EAA2B;AAAA,MAClC,SAAA,sBAAe,GAAA,EAAI;AAAA,MACnB,eAAA,EAAiB;AAAA,KACnB;AACA,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,gBAAgB,KAAA,EAAyB;AAC/C,IAAA,MAAM,MAAA,GAAS,qBAAqB,IAAA,CAAK,MAAM,IAC3C,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,MAAA,CAAO,OAAO,MAAA,IAAU,GAAO,IAChD,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,MAAA,IAAU,CAAC,CAAA;AAE9C,IAAA,KAAA,CAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAM,GAAG,CAAA;AAC/C,MAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,SAAA,CAAU,OAAO,CAAA,EAAG;AAC5C,MAAA,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAClC,MAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AACrC,MAAA,IAAA,CAAK,SAAA,CAAU;AAAA,QACb,IAAA,EAAM,UAAA;AAAA,QACN,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAAA,IACH,GAAG,MAAM,CAAA;AAAA,EACX;AAAA,EAEQ,mBAAmB,KAAA,EAA4B;AACrD,IAAA,MAAM,MAAA,GAAS,qBAAqB,IAAA,CAAK,MAAM,IAC3C,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,MAAA,CAAO,OAAO,MAAA,IAAU,GAAO,IAChD,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,MAAA,IAAU,CAAC,CAAA;AAE9C,IAAA,KAAA,CAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,GAAG,CAAA;AAClD,MAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,SAAA,CAAU,OAAO,CAAA,EAAG;AAC5C,MAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAAA,IACvC,GAAG,MAAM,CAAA;AAAA,EACX;AAAA,EAEQ,aAAA,CACN,KAAA,EACA,KAAA,EACA,SAAA,EACM;AACN,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AACd,IAAA,KAAA,MAAW,QAAA,IAAY,MAAM,SAAA,EAAW;AACtC,MAAA,QAAA,EAAS;AAAA,IACX;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU;AAAA,MACb,IAAA,EAAM,SAAA;AAAA,MACN,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,KAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACrB,CAAA;AAAA,EACH;AAAA,EAEQ,gBAAA,CACN,KAAA,EACA,KAAA,EACA,SAAA,EACM;AACN,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AACd,IAAA,KAAA,MAAW,QAAA,IAAY,MAAM,SAAA,EAAW;AACtC,MAAA,QAAA,EAAS;AAAA,IACX;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU;AAAA,MACb,IAAA,EAAM,SAAA;AAAA,MACN,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,KAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACrB,CAAA;AAAA,EACH;AAAA,EAEQ,UAAU,KAAA,EAAiC;AACjD,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,gBAAA,EAAkB;AAC5C,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IAChB;AAEA,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,MAAA,OAAA,CAAQ,UAAU,KAAK,CAAA;AACvB,MAAA,IAAI,KAAA,CAAM,SAAS,eAAA,IAAmB,KAAA,CAAM,SAAS,aAAA,IAAiB,KAAA,CAAM,SAAS,UAAA,EAAY;AAC/F,QAAA,OAAA,CAAQ,iBAAiB,KAAK,CAAA;AAAA,MAChC;AACA,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,kBAAA,IAAsB,KAAA,CAAM,SAAS,gBAAA,EAAkB;AACxE,QAAA,OAAA,CAAQ,oBAAoB,KAAK,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,MAAA,EAAqD;AAC3F,EAAA,OAAO,IAAI,kBAAkB,MAAM,CAAA;AACrC;AAEO,SAAS,kBAAA,CACd,QACA,OAAA,EACmB;AACnB,EAAA,OAAO,MAAA,CAAO,cAAc,OAAO,CAAA;AACrC;AC/oBA,IAAM,wBAAA,GAA2BC,oBAAwC,IAAI,CAAA;AAQtE,SAAS,0BAA0B,KAAA,EAAuC;AAC/E,EAAA,MAAM,cAAA,GAAiBN,cAAQ,MAAM;AACnC,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,OAAO,KAAA,CAAM,MAAA;AAAA,IACf;AACA,IAAA,OAAO,uBAAA,CAAwB,MAAM,MAAM,CAAA;AAAA,EAC7C,GAAG,CAAC,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AAE/B,EAAA,OAAOO,mBAAA;AAAA,IACL,wBAAA,CAAyB,QAAA;AAAA,IACzB,EAAE,OAAO,cAAA,EAAe;AAAA,IACxB,KAAA,CAAM;AAAA,GACR;AACF;AAEO,SAAS,oBAAA,GAA0C;AACxD,EAAA,MAAM,MAAA,GAASC,iBAAW,wBAAwB,CAAA;AAClD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;ACbA,SAAS,gBAAA,GAAyC;AAChD,EAAA,MAAM,WAAA,GAAc,UAAA;AAMpB,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KACpB,OAAA,CAAQ,KAAK,CAAA,IACb,OAAO,KAAA,KAAU,QAAA,IACjB,OAAQ,KAAA,CAAwB,gBAAA,KAAqB,UAAA,IACrD,OAAQ,MAAwB,mBAAA,KAAwB,UAAA;AAE1D,EAAA,IAAI,YAAA,CAAa,WAAA,CAAY,MAAM,CAAA,EAAG;AACpC,IAAA,OAAO,WAAA,CAAY,MAAA;AAAA,EACrB;AAEA,EAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,SACd,OAAA,EACuB;AACvB,EAAA,MAAM,SAAS,oBAAA,EAAqB;AAEpC,EAAA,MAAM,WAAA,GAAcC,YAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AAC3C,EAAA,WAAA,CAAY,UAAU,OAAA,CAAQ,QAAA;AAE9B,EAAA,MAAM,UAAA,GAAaA,YAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AACzC,EAAA,UAAA,CAAW,UAAU,OAAA,CAAQ,OAAA;AAE7B,EAAA,MAAM,SAAA,GAAYA,YAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AACvC,EAAA,SAAA,CAAU,UAAU,OAAA,CAAQ,MAAA;AAE5B,EAAA,MAAM,YAAA,GAAeA,YAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAC7C,EAAA,YAAA,CAAa,UAAU,OAAA,CAAQ,SAAA;AAE/B,EAAA,MAAM,UAAA,GAAaA,YAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AACzC,EAAA,UAAA,CAAW,UAAU,OAAA,CAAQ,OAAA;AAE7B,EAAA,MAAM,YAAA,GAAeA,YAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAC7C,EAAA,YAAA,CAAa,UAAU,OAAA,CAAQ,SAAA;AAE/B,EAAA,MAAM,UAAA,GAAaA,YAAA,CAAO,OAAA,CAAQ,OAAA,IAAW,IAAI,CAAA;AACjD,EAAA,UAAA,CAAW,OAAA,GAAU,QAAQ,OAAA,IAAW,IAAA;AAExC,EAAA,MAAM,QAAA,GAAWA,YAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AACrC,EAAA,QAAA,CAAS,UAAU,OAAA,CAAQ,KAAA;AAE3B,EAAA,MAAM,aAAA,GAAgBA,YAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AAC/C,EAAA,aAAA,CAAc,UAAU,OAAA,CAAQ,UAAA;AAEhC,EAAA,MAAM,cAAA,GAAiBA,YAAA,CAAO,OAAA,CAAQ,WAAW,CAAA;AACjD,EAAA,cAAA,CAAe,UAAU,OAAA,CAAQ,WAAA;AAEjC,EAAA,MAAM,iBAAA,GAAoBA,YAAA,CAAO,OAAA,CAAQ,cAAc,CAAA;AACvD,EAAA,iBAAA,CAAkB,UAAU,OAAA,CAAQ,cAAA;AAEpC,EAAA,MAAM,uBAAA,GAA0BA,YAAA,CAAO,OAAA,CAAQ,oBAAoB,CAAA;AACnE,EAAA,uBAAA,CAAwB,UAAU,OAAA,CAAQ,oBAAA;AAE1C,EAAA,MAAM,qBAAA,GAAwBA,YAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA;AAC/D,EAAA,qBAAA,CAAsB,UAAU,OAAA,CAAQ,kBAAA;AAExC,EAAA,MAAM,aAAA,GAAgBT,aAAAA;AAAA,IACpB,MAAM,MAAA,CAAO,gBAAA,CAAiB,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAC9C,CAAC,MAAA,EAAQ,OAAA,CAAQ,QAAQ;AAAA,GAC3B;AACA,EAAA,MAAM,sBAAA,GAAyBS,aAAO,aAAa,CAAA;AACnD,EAAA,sBAAA,CAAuB,OAAA,GAAU,aAAA;AAEjC,EAAA,MAAM,SAAA,GAAYR,iBAAAA;AAAA,IAChB,CAAC,QAAA,KAAyB,MAAA,CAAO,cAAA,CAAe,eAAe,QAAQ,CAAA;AAAA,IACvE,CAAC,QAAQ,aAAa;AAAA,GACxB;AAEA,EAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,IAClB,MAAM,MAAA,CAAO,aAAA,CAAqB,aAAa,CAAA;AAAA,IAC/C,CAAC,QAAQ,aAAa;AAAA,GACxB;AAEA,EAAA,MAAM,QAAA,GAAWS,yBAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAEzE,EAAA,MAAM,iBAAA,GAAoBV,cAAiC,MAAM;AAC/D,IAAA,IACE,QAAA,CAAS,WAAW,MAAA,IACpB,QAAA,CAAS,SAAS,MAAA,IAClB,cAAA,CAAe,YAAY,MAAA,EAC3B;AACA,MAAA,OAAO;AAAA,QACL,GAAG,QAAA;AAAA,QACH,MAAA,EAAQ,SAAA;AAAA,QACR,MAAM,cAAA,CAAe,OAAA;AAAA,QACrB,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,QAAA,GAAWC,iBAAAA;AAAA,IACf,OAAO,QAAQ,KAAA,KAA6C;AAC1D,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,YAAA,CAAkC;AAAA,QAC5D,UAAU,WAAA,CAAY,OAAA;AAAA,QACtB,aAAA;AAAA,QACA,OAAA,EAAS,MAAM,UAAA,CAAW,OAAA,EAAQ;AAAA,QAClC,QAAQ,SAAA,CAAU,OAAA;AAAA,QAClB,KAAA,EACE,QAAA,CAAS,OAAA,IACT,MAAA,CAAO,oBAAoB,KAAA,IAC3B,CAAA;AAAA,QACF,UAAA,EACE,aAAA,CAAc,OAAA,IACd,MAAA,CAAO,mBAAA,CAAoB,UAAA;AAAA,QAC7B,MAAA,EAAQ,IAAA;AAAA,QACR;AAAA,OACD,CAAA;AAED,MAAA,MAAM,cAAA,GAAiB,MAAA;AAGvB,MAAA,IAAI,sBAAA,CAAuB,OAAA,KAAY,aAAA,IAAiB,cAAA,CAAe,cAAc,KAAA,EAAO;AAC1F,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,UAAA,CAAW,OAAA,GAAU,OAAO,KAAK,CAAA;AACjC,QAAA,YAAA,CAAa,OAAA,GAAU,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA;AAChD,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,YAAA,CAAa,OAAA,GAAU,OAAO,IAAa,CAAA;AAC3C,MAAA,YAAA,CAAa,OAAA,GAAU,MAAA,CAAO,IAAA,EAAM,IAAI,CAAA;AACxC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,QAAQ,aAAa;AAAA,GACxB;AAEA,EAAA,MAAM,cAAA,GAAiBQ,aAAsB,IAAI,CAAA;AAEjD,EAAAE,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,cAAA,GACJ,iBAAA,CAAkB,OAAA,IAAW,MAAA,CAAO,oBAAoB,cAAA,IAAkB,IAAA;AAE5E,IAAA,MAAM,mBAAA,GAAsB,eAAe,OAAA,KAAY,aAAA;AACvD,IAAA,cAAA,CAAe,OAAA,GAAU,aAAA;AAEzB,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,aAAA,CAAc,aAAa,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,KAAW,MAAA,IAAW,mBAAA,IAAuB,cAAA;AAEvE,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,KAAK,SAAS,KAAK,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAA,EAAe,QAAQ,CAAC,CAAA;AAEpC,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,UAAU,gBAAA,EAAiB;AACjC,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,UAAA,CAAW,OAAA,EAAS;AACnC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,oBAAA,GACJ,uBAAA,CAAwB,OAAA,IACxB,MAAA,CAAO,oBAAoB,oBAAA,IAC3B,KAAA;AAEF,IAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACzB,MAAA,KAAK,SAAS,IAAI,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,OAAA,CAAQ,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACzC,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,CAAQ,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,IAC9C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAErB,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,UAAU,gBAAA,EAAiB;AACjC,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,UAAA,CAAW,OAAA,EAAS;AACnC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,kBAAA,GACJ,qBAAA,CAAsB,OAAA,IACtB,MAAA,CAAO,oBAAoB,kBAAA,IAC3B,KAAA;AAEF,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACzB,MAAA,KAAK,SAAS,IAAI,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,OAAA,CAAQ,gBAAA,CAAiB,UAAU,WAAW,CAAA;AAC9C,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,CAAQ,mBAAA,CAAoB,UAAU,WAAW,CAAA;AAAA,IACnD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAErB,EAAA,MAAM,OAAA,GAAUV,kBAAY,MAAM,QAAA,CAAS,IAAI,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAE5D,EAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAC9B,IAAA,MAAA,CAAO,UAAA,CAAW,YAAY,OAAO,CAAA;AAAA,EACvC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,OAAO;AAAA,IACL,MAAM,iBAAA,CAAkB,IAAA;AAAA,IACxB,OAAO,iBAAA,CAAkB,KAAA;AAAA,IACzB,SAAA,EACE,iBAAA,CAAkB,MAAA,KAAW,SAAA,IAAa,kBAAkB,IAAA,KAAS,MAAA;AAAA,IACvE,YAAY,iBAAA,CAAkB,UAAA;AAAA,IAC9B,SAAA,EAAW,kBAAkB,MAAA,KAAW,SAAA;AAAA,IACxC,OAAA,EAAS,kBAAkB,MAAA,KAAW,OAAA;AAAA,IACtC,QAAQ,iBAAA,CAAkB,MAAA;AAAA,IAC1B,OAAA;AAAA,IACA,KAAA;AAAA,IACA,cAAc,iBAAA,CAAkB,YAAA;AAAA,IAChC,aAAa,iBAAA,CAAkB;AAAA,GACjC;AACF;ACxPO,SAAS,YACd,OAAA,EACsC;AACtC,EAAA,MAAM,SAAS,oBAAA,EAAqB;AAEpC,EAAA,MAAM,cAAA,GAAiBQ,YAAAA,CAAO,OAAA,CAAQ,WAAW,CAAA;AACjD,EAAA,cAAA,CAAe,UAAU,OAAA,CAAQ,WAAA;AAEjC,EAAA,MAAM,aAAA,GAAgBA,YAAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AAC/C,EAAA,aAAA,CAAc,UAAU,OAAA,CAAQ,UAAA;AAEhC,EAAA,MAAM,SAAA,GAAYA,YAAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AACvC,EAAA,SAAA,CAAU,UAAU,OAAA,CAAQ,MAAA;AAE5B,EAAA,MAAM,QAAA,GAAWA,YAAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AACrC,EAAA,QAAA,CAAS,UAAU,OAAA,CAAQ,KAAA;AAE3B,EAAA,MAAM,aAAA,GAAgBA,YAAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AAC/C,EAAA,aAAA,CAAc,UAAU,OAAA,CAAQ,UAAA;AAEhC,EAAA,MAAM,WAAA,GAAcA,YAAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AAC3C,EAAA,WAAA,CAAY,UAAU,OAAA,CAAQ,QAAA;AAE9B,EAAA,MAAM,YAAA,GAAeA,YAAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAC7C,EAAA,YAAA,CAAa,UAAU,OAAA,CAAQ,SAAA;AAE/B,EAAA,MAAM,UAAA,GAAaA,YAAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AACzC,EAAA,UAAA,CAAW,UAAU,OAAA,CAAQ,OAAA;AAE7B,EAAA,MAAM,YAAA,GAAeA,YAAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAC7C,EAAA,YAAA,CAAa,UAAU,OAAA,CAAQ,SAAA;AAE/B,EAAA,MAAM,gBAAA,GAAmBT,aAAAA;AAAA,IACvB,MAAM,MAAA,CAAO,mBAAA,CAAoB,OAAA,CAAQ,WAAW,CAAA;AAAA,IACpD,CAAC,MAAA,EAAQ,OAAA,CAAQ,WAAW;AAAA,GAC9B;AAEA,EAAA,MAAM,SAAA,GAAYC,iBAAAA;AAAA,IAChB,CAAC,QAAA,KAAyB,MAAA,CAAO,iBAAA,CAAkB,kBAAkB,QAAQ,CAAA;AAAA,IAC7E,CAAC,QAAQ,gBAAgB;AAAA,GAC3B;AAEA,EAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,IAClB,MAAM,MAAA,CAAO,gBAAA,CAAoC,gBAAgB,CAAA;AAAA,IACjE,CAAC,QAAQ,gBAAgB;AAAA,GAC3B;AAEA,EAAA,MAAM,QAAA,GAAWS,yBAAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAEzE,EAAA,MAAM,WAAA,GAAcT,iBAAAA;AAAA,IAClB,OAAO,SAAA,KAA0C;AAC/C,MAAA,MAAM,WAAA,CAAY,UAAU,SAAS,CAAA;AAErC,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAoD;AAAA,QAC9E,aAAa,cAAA,CAAe,OAAA;AAAA,QAC5B,gBAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA,EAAY,CAAA,gBAAA,KAAoB,aAAA,CAAc,OAAA,CAAQ,gBAAgB,CAAA;AAAA,QACtE,QAAQ,SAAA,CAAU,OAAA;AAAA,QAClB,KAAA,EACE,QAAA,CAAS,OAAA,IACT,MAAA,CAAO,uBAAuB,KAAA,IAC9B,CAAA;AAAA,QACF,UAAA,EACE,aAAA,CAAc,OAAA,IACd,MAAA,CAAO,sBAAA,CAAuB;AAAA,OACjC,CAAA;AAED,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,UAAA,CAAW,OAAA,GAAU,MAAA,CAAO,KAAA,EAAO,SAAS,CAAA;AAC5C,QAAA,YAAA,CAAa,OAAA,GAAU,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,OAAO,SAAS,CAAA;AAC3D,QAAA,MAAM,MAAA,CAAO,KAAA;AAAA,MACf;AAEA,MAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,MAAA,YAAA,CAAa,OAAA,GAAU,MAAM,SAAS,CAAA;AACtC,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA,EAAM,IAAA,EAAM,SAAS,CAAA;AAC5C,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,QAAQ,gBAAgB;AAAA,GAC3B;AAEA,EAAA,MAAM,MAAA,GAASA,iBAAAA;AAAA,IACb,CAAC,SAAA,KAA0B;AACzB,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,MAAA,CAAO,aAAA,CAAc,eAAe,OAAO,CAAA;AAAA,EAC7C,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAM,QAAA,CAAS,IAAA;AAAA,IACf,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,MAAA,EAAQ,SAAS,MAAA,KAAW,MAAA;AAAA,IAC5B,SAAA,EAAW,SAAS,MAAA,KAAW,SAAA;AAAA,IAC/B,SAAA,EAAW,SAAS,MAAA,KAAW,SAAA;AAAA,IAC/B,OAAA,EAAS,SAAS,MAAA,KAAW,OAAA;AAAA,IAC7B,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,KAAA;AAAA,IACA,cAAc,QAAA,CAAS,YAAA;AAAA,IACvB,eAAe,QAAA,CAAS,aAAA;AAAA,IACxB,aAAa,QAAA,CAAS;AAAA,GACxB;AACF;AC3DA,SAAS,kBACP,UAAA,EAC6B;AAC7B,EAAA,IAAI,YAAA,IAAgB,UAAA,IAAc,OAAO,UAAA,CAAW,eAAe,UAAA,EAAY;AAC7E,IAAA,OAAO,UAAA,CAAW,UAAA;AAAA,EACpB;AAEA,EAAA,IACE,MAAA,IAAU,cACV,UAAA,CAAW,IAAA,IACX,OAAO,UAAA,CAAW,IAAA,CAAK,eAAe,UAAA,EACtC;AACA,IAAA,OAAO,WAAW,IAAA,CAAK,UAAA;AAAA,EACzB;AAEA,EAAA,MAAM,IAAI,MAAM,qEAAqE,CAAA;AACvF;AAeO,SAAS,UAAA,CACd,UAAA,EACA,OAAA,GAA6B,EAAC,EACe;AAE7C,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,IAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,QAAQ,cAAA,IAAkB,IAAA;AAEjD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIF,eAA6B,IAAI,CAAA;AACzD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwC,IAAI,CAAA;AACtE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAkB,OAAO,CAAA;AAC3D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAkB,KAAK,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAeU,aAAO,CAAC,CAAA;AAC7B,EAAA,MAAM,UAAA,GAAaA,aAAO,IAAI,CAAA;AAC9B,EAAA,MAAM,OAAA,GAAUA,aAA2B,IAAI,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,iBAAA;AAAA,IACjB;AAAA,GACF;AAEA,EAAAE,gBAAU,MAAM;AACd,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,EACpB,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,sBAAA,GAAyB,CAC7B,IAAA,EACA,OAAA,EACA,MAAA,MAC4B;AAAA,IAC5B,IAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,QAAA,GAAWV,kBAAY,YAAY;AACvC,IAAA,MAAM,SAAA,GAAY,EAAE,YAAA,CAAa,OAAA;AACjC,IAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,KAAY,IAAA;AAEpC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,UAAA,CAAW,OAAA,CAAQ,UAAA,EAAY,QAAQ,WAAW,CAAA;AACvE,MAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,SAAA,KAAc,aAAa,OAAA,EAAS;AAC7D,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,IAAI,OAAO,EAAA,EAAI;AACb,QAAA,OAAA,CAAS,MAAA,CAAO,QAAQ,IAA2B,CAAA;AACnD,QAAA,QAAA,CAAS,IAAI,CAAA;AACb,QAAA,OAAQ,OAAO,IAAA,IAAQ,IAAA;AAAA,MACzB;AAEA,MAAA,QAAA;AAAA,QACE,OAAO,YAAA,IACL,sBAAA;AAAA,UACE,eAAA;AAAA,UACA,OAAO,KAAA,IAAS,yBAAA;AAAA,UAChB,MAAA,CAAO;AAAA;AACT,OACJ;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,YAAA,EAAc;AACrB,MAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,SAAA,KAAc,aAAa,OAAA,EAAS;AAC7D,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,OAAA,GACJ,YAAA,YAAwB,KAAA,GAAQ,YAAA,CAAa,OAAA,GAAU,yBAAA;AACzD,MAAA,QAAA,CAAS,sBAAA,CAAuB,eAAA,EAAiB,OAAA,EAAS,CAAC,CAAC,CAAA;AAC5D,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,IAAI,UAAA,CAAW,OAAA,IAAW,SAAA,KAAc,YAAA,CAAa,OAAA,EAAS;AAC5D,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAA,EAAY,QAAQ,WAAA,EAAa,OAAA,CAAQ,UAAU,CAAC,CAAA;AAExD,EAAAU,gBAAU,MAAM;AACd,IAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,IAAA,IAAI,WAAW,cAAA,EAAgB;AAC7B,MAAA,KAAK,QAAA,EAAS;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AACA,IAAA,OAAO,MAAM;AACX,MAAA,UAAA,CAAW,OAAA,GAAU,KAAA;AAAA,IACvB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,cAAA,EAAgB,QAAQ,CAAC,CAAA;AAEtC,EAAA,MAAM,OAAA,GAAUV,kBAAY,YAAY;AACtC,IAAA,OAAO,MAAM,QAAA,EAAS;AAAA,EACxB,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;ACjIO,SAAS,sBAAA,CAGd,UAAA,EACA,OAAA,GAAyC,EAAC,EACH;AACvC,EAAA,MAAM,YAAA,GAAe,UAAA,CAAW,UAAA,EAAY,OAAO,CAAA;AACnD,EAAA,MAAM,YAAA,GAAeD,aAAAA;AAAA,IACnB,MACG,YAAA,CAAa,IAAA,GACV,UAAA,CAAW,WAAA,CAAY;AAAA,MACrB,MAAA,EAAQ,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,EAAA;AAAA,MAC/B,cAAA,EAAgB,YAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,oBAAA;AAAA,MAC1C,WAAA,EAAa,YAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,KAAA;AAAA,MACvC,YAAA,EAAc,YAAA,CAAa,IAAA,CAAK,OAAA,CAAQ;AAAA,KACzC,CAAA,GACD,UAAA;AAAA,IACN,CAAC,UAAA,EAAY,YAAA,CAAa,IAAI;AAAA,GAChC;AACA,EAAA,MAAM,UACJ,YAAA,CAAa,IAAA;AACf,EAAA,MAAM,UACJ,YAAA,CAAa,OAAA;AAEf,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,YAAA;AAAA,IACR,OAAA;AAAA,IACA,MAAA,EAAQ,YAAA,CAAa,IAAA,EAAM,IAAA,CAAK,EAAA,IAAM,IAAA;AAAA,IACtC,cAAA,EACE,YAAA,CAAa,IAAA,EAAM,OAAA,CAAQ,oBAAA,IAAwB,IAAA;AAAA,IACrD,OAAO,YAAA,CAAa,KAAA;AAAA,IACpB,WAAW,YAAA,CAAa,SAAA;AAAA,IACxB,cAAc,YAAA,CAAa,YAAA;AAAA,IAC3B;AAAA,GACF;AACF;AC/DO,SAAS,iBAAiB,OAAA,EAA0D;AACzF,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,UAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,OAAA;AACJ,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAUY,0BAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUA,0BAA6C,IAAI,CAAA;AACvF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,0BAAkB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAUA,0BAA+C,IAAI,CAAA;AACrF,EAAA,MAAM,aAAA,GAAsBA,wBAA+B,IAAI,CAAA;AAE/D,EAAA,MAAM,KAAA,GAAcA,6BAAY,MAAM;AACpC,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,SAAA,CAAU,IAAI,CAAA;AAAA,EAChB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAcA,6BAAY,MAAM;AACpC,IAAA,aAAA,CAAc,SAAS,KAAA,EAAM;AAC7B,IAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAAeA,gBAAA,CAAA,WAAA,CAAY,OAC/B,KAAA,EACA,WAAA,KACG;AACH,IAAA,MAAM,UAAA,GAAa,WAAA,EAAa,MAAA,GAAS,IAAA,GAAO,IAAI,eAAA,EAAgB;AACpE,IAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AACxB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,SAAA,CAAU,IAAI,CAAA;AAEd,IAAA,MAAM,OAAA,GAAU,wBAAA,CAAyB,QAAA,EAAU,KAAA,EAAO,CAAA,aAAA,KAAiB;AACzE,MAAA,WAAA,CAAY,aAAa,CAAA;AACzB,MAAA,UAAA,GAAa,aAAa,CAAA;AAC1B,MAAA,IAAI,oBAAA,CAAqB,KAAK,CAAA,EAAG;AAC/B,QAAA,KAAA,CAAM,aAAa,aAAa,CAAA;AAAA,MAClC;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,OAAA,EAAS;AAAA,QAClD,GAAG,WAAA;AAAA,QACH,MAAA,EAAQ,WAAA,EAAa,MAAA,IAAU,UAAA,EAAY;AAAA,OAC5C,CAAA;AACD,MAAA,SAAA,CAAU,QAAQ,CAAA;AAClB,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,WAAA,EAAa;AACpB,MAAA,QAAA,CAAS,WAAW,CAAA;AACpB,MAAA,MAAM,WAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,IAAI,aAAA,CAAc,YAAY,UAAA,EAAY;AACxC,QAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,UAAA,EAAY,OAAO,CAAC,CAAA;AAElC,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA,EAAS,UAAU,gBAAA,IAAoB,CAAA;AAAA,IACvC,KAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,wBAAA,CACP,QAAA,EACA,KAAA,EACA,UAAA,EAC8B;AAC9B,EAAA,IAAI,oBAAA,CAAqB,KAAK,CAAA,EAAG;AAC/B,IAAA,OAAO;AAAA,MACL,GAAG,QAAA;AAAA,MACH,GAAG,KAAA;AAAA,MACH;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,GAAG,QAAA;AAAA,IACH,KAAA,EAAO,KAAA;AAAA,IACP;AAAA,GACF;AACF;AAEA,SAAS,qBAAqB,KAAA,EAAqE;AACjG,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,IACf,OAAO,UAAU,QAAA,IACjB,OAAA,IAAW,SACX,OAAA,IAAW,KAAA;AAClB;AC1GO,SAAS,gBAAgB,OAAA,EAAwD;AACtF,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAO,UAAU,IAAA,EAAM,WAAA,EAAa,mBAAkB,GAAI,OAAA;AAC3E,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUC,0BAA0C,IAAI,CAAA;AAC5E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,0BAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,0BAAkB,IAAI,CAAA;AACtD,EAAA,MAAM,YAAA,GAAqBA,wBAAO,CAAC,CAAA;AAEnC,EAAA,MAAM,OAAA,GAAgBA,6BAAY,YAAY;AAC5C,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,OAAA,EAAS;AACtB,MAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,aAAa,OAAA,GAAU,CAAA;AACzC,IAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AACvB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,OAAO,WAAW,CAAA;AACzD,MAAA,IAAI,YAAA,CAAa,YAAY,SAAA,EAAW;AACtC,QAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,MAChB;AACA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,SAAA,EAAW;AAClB,MAAA,IAAI,YAAA,CAAa,YAAY,SAAA,EAAW;AACtC,QAAA,QAAA,CAAS,SAAS,CAAA;AAClB,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,MACd;AACA,MAAA,MAAM,SAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAI,YAAA,CAAa,YAAY,SAAA,EAAW;AACtC,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,OAAA,EAAS,KAAA,EAAO,OAAO,CAAC,CAAA;AAEzC,EAAMA,2BAAU,MAAM;AACpB,IAAA,KAAK,OAAA,EAAQ,CAAE,KAAA,CAAM,MAAM;AAAA,IAE3B,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAMA,2BAAU,MAAM;AACpB,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,SAAS,CAAC,iBAAA,IAAqB,qBAAqB,CAAA,EAAG;AACtE,MAAA;AAAA,IACF;AACA,IAAA,MAAM,YAAA,GAAe,UAAA;AAIrB,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,WAAA,CAAY,MAAM;AAC3C,MAAA,KAAK,OAAA,EAAQ,CAAE,KAAA,CAAM,MAAM;AAAA,MAE3B,CAAC,CAAA;AAAA,IACH,GAAG,iBAAiB,CAAA;AACpB,IAAA,OAAO,MAAM,YAAA,CAAa,aAAA,CAAc,KAAK,CAAA;AAAA,EAC/C,GAAG,CAAC,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,iBAAiB,CAAC,CAAA;AAE/C,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,EAAM,KAAA,IAAS,EAAC;AAAA,IACvB,KAAA,EAAO,IAAA,EAAM,KAAA,IAAS,IAAA,EAAM,OAAO,MAAA,IAAU,CAAA;AAAA,IAC7C,OAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AACF;ACvEO,SAAS,qBACd,OAAA,EAC4B;AAC5B,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,OAAA,EAAQ,GAAI,OAAA;AACxC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUC,0BAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,0BAAkB,IAAI,CAAA;AAEtD,EAAA,MAAM,KAAA,GAAcA,6BAAY,MAAM;AACpC,IAAA,WAAA,CAAY,KAAK,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAmBA,gBAAA,CAAA,WAAA;AAAA,IACvB,OACE,QACA,WAAA,KACG;AACH,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,QAAsC,WAAW,CAAA;AAC1F,QAAA,SAAA,GAAY,MAAM,CAAA;AAClB,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,WAAA,EAAa;AACpB,QAAA,QAAA,CAAS,WAAW,CAAA;AACpB,QAAA,OAAA,GAAU,WAAW,CAAA;AACrB,QAAA,MAAM,WAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,WAAA,CAAY,KAAK,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,SAAA,EAAW,OAAO;AAAA,GAC9B;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACIA,SAAS,oBAAoB,IAAA,EAAmD;AAC9E,EAAA,IAAI,IAAA,KAAS,aAAa,OAAO,MAAA;AACjC,EAAA,IAAI,IAAA,KAAS,QAAQ,OAAO,IAAA;AAC5B,EAAA,OAAO,EAAA;AACT;AAEA,SAASZ,UAAS,KAAA,EAA2C;AAC3D,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAO,UAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,gBAAA,CAAiB,OAAoB,GAAA,EAAsB;AAClE,EAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA;AAC5B,EAAA,OAAO,QAAA,GAAW,GAAG,CAAA,KAAM,IAAA;AAC7B;AAKO,SAAS,mBAAA,CAId,KAAA,EACA,MAAA,EACA,OAAA,EACkC;AAClC,EAAA,MAAM,MAAA,GAAS,MAAA;AACf,EAAA,IAAI,CAACA,SAAAA,CAAS,MAAM,CAAA,EAAG;AACrB,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,IAAA,GAAO,SAAS,WAAA,IAAgB,cAAA;AACtC,EAAA,MAAM,YAAA,GAAe,oBAAoB,IAAI,CAAA;AAC7C,EAAA,MAAM,SAA2B,EAAC;AAElC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,gBAAA,CAAiB,KAAA,EAAO,GAAG,CAAA,EAAG;AAClD,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,YAAA;AACd,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,EAChB;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,cAAA,CACd,KAAA,EACA,UAAA,EACA,OAAA,EAC2B;AAC3B,EAAA,MAAM,iBAAA,GAAoB,SAAS,iBAAA,IAAqB,IAAA;AACxD,EAAA,MAAM,cAAA,GAAiB,SAAS,cAAA,IAAkB,IAAA;AAClD,EAAA,MAAM,SAA2B,EAAC;AAElC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,UAA8B,CAAA,EAAG;AAC5E,IAAA,IAAI,QAAA,KAAa,UAAa,cAAA,EAAgB;AAC5C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,qBAAqB,QAAA,KAAa,EAAA,IAAM,gBAAA,CAAiB,KAAA,EAAO,GAAG,CAAA,EAAG;AACxE,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,QAAA;AAAA,EAChB;AAEA,EAAA,OAAO,MAAA;AACT;AAwBO,SAAS,uBAAmD,KAAA,EAAyC;AAC1G,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA,CAAW,QAAQ,OAAA,EAAS;AAC1B,MAAA,OAAO,mBAAA,CAAoB,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,QAAA,CAAS,QAAQ,OAAA,EAAS;AACxB,MAAA,OAAO,cAAA,CAAe,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC9C,CAAA;AAAA,IACA,QAAA,CAAS,QAAQ,OAAA,EAAS;AACxB,MAAA,OAAO,cAAA,CAAe,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC9C;AAAA,GACF;AACF","file":"react.cjs","sourcesContent":["import type {\n AthenaGatewayEndpointPath,\n AthenaGatewayErrorCode,\n AthenaGatewayErrorDetails,\n AthenaGatewayMethod,\n AthenaGatewayResponse,\n} from './types.js'\n\nexport interface AthenaGatewayErrorInput {\n code: AthenaGatewayErrorCode\n message: string\n status?: number\n endpoint?: AthenaGatewayEndpointPath\n method?: AthenaGatewayMethod\n requestId?: string\n hint?: string\n cause?: string\n}\n\n/**\n * Canonical error for gateway failures.\n * Holds request context and machine-readable classification.\n */\nexport class AthenaGatewayError extends Error {\n readonly code: AthenaGatewayErrorCode\n readonly status: number\n readonly endpoint?: AthenaGatewayEndpointPath\n readonly method?: AthenaGatewayMethod\n readonly requestId?: string\n readonly hint?: string\n readonly causeDetail?: string\n\n constructor(input: AthenaGatewayErrorInput) {\n super(input.message)\n this.name = 'AthenaGatewayError'\n this.code = input.code\n this.status = input.status ?? 0\n this.endpoint = input.endpoint\n this.method = input.method\n this.requestId = input.requestId\n this.hint = input.hint\n this.causeDetail = input.cause\n }\n\n toDetails(): AthenaGatewayErrorDetails {\n return {\n code: this.code,\n message: this.message,\n status: this.status,\n endpoint: this.endpoint,\n method: this.method,\n requestId: this.requestId,\n hint: this.hint,\n cause: this.causeDetail,\n }\n }\n\n static fromResponse<T>(\n response: AthenaGatewayResponse<T>,\n fallback: Omit<AthenaGatewayErrorInput, 'code' | 'message' | 'status'>,\n ) {\n const details = response.errorDetails\n if (details) {\n return new AthenaGatewayError({\n code: details.code,\n message: details.message,\n status: details.status,\n endpoint: details.endpoint ?? fallback.endpoint,\n method: details.method ?? fallback.method,\n requestId: details.requestId ?? fallback.requestId,\n hint: details.hint,\n cause: details.cause,\n })\n }\n\n return new AthenaGatewayError({\n code: 'HTTP_ERROR',\n message: response.error ?? 'Gateway request failed',\n status: response.status,\n endpoint: fallback.endpoint,\n method: fallback.method,\n requestId: fallback.requestId,\n })\n }\n}\n\nexport function isAthenaGatewayError(error: unknown): error is AthenaGatewayError {\n return error instanceof AthenaGatewayError\n}\n","import { AthenaGatewayError } from './errors.ts'\n\nexport const ATHENA_DEFAULT_BASE_URL = 'https://mirror2.athena-cluster.com'\n\nfunction describeReceivedValue(value: unknown): string {\n if (value === undefined) return 'undefined'\n if (value === null) return 'null'\n if (typeof value === 'string') {\n return value.trim().length > 0 ? JSON.stringify(value) : 'an empty string'\n }\n return `${typeof value} ${JSON.stringify(value)}`\n}\n\nfunction invalidBaseUrlError(message: string, hint: string): AthenaGatewayError {\n return new AthenaGatewayError({\n code: 'INVALID_URL',\n message,\n status: 0,\n hint,\n })\n}\n\nexport interface NormalizeAthenaGatewayBaseUrlOptions {\n defaultBaseUrl?: string\n label?: string\n}\n\nexport function normalizeAthenaGatewayBaseUrl(\n input: string | null | undefined,\n options: NormalizeAthenaGatewayBaseUrlOptions = {},\n): string {\n const label = options.label ?? 'Athena gateway base URL'\n const candidate = input ?? options.defaultBaseUrl\n\n if (candidate === undefined || candidate === null) {\n throw invalidBaseUrlError(\n `${label} must be a non-empty absolute http(s) URL. Received ${describeReceivedValue(input)}.`,\n 'Set ATHENA_URL in the explicit env object (or pass createClient({ url, key })) to a full URL such as \"https://mirror2.athena-cluster.com\".',\n )\n }\n\n const trimmed = candidate.trim()\n if (!trimmed) {\n throw invalidBaseUrlError(\n `${label} must be a non-empty absolute http(s) URL. Received ${describeReceivedValue(candidate)}.`,\n 'Set ATHENA_URL in the explicit env object (or pass createClient({ url, key })) to a full URL such as \"https://mirror2.athena-cluster.com\".',\n )\n }\n\n let parsed: URL\n try {\n parsed = new URL(trimmed)\n } catch {\n throw invalidBaseUrlError(\n `${label} must be a valid absolute http(s) URL. Received ${describeReceivedValue(candidate)}.`,\n 'Use a full URL including the protocol, for example \"https://mirror2.athena-cluster.com\".',\n )\n }\n\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw invalidBaseUrlError(\n `${label} must use http or https. Received ${JSON.stringify(trimmed)}.`,\n 'Use an Athena gateway URL such as \"https://mirror2.athena-cluster.com\".',\n )\n }\n\n if (parsed.search || parsed.hash) {\n throw invalidBaseUrlError(\n `${label} must not include query parameters or hash fragments. Received ${JSON.stringify(trimmed)}.`,\n 'Pass only the base URL. Endpoint paths such as \"/gateway/fetch\" are appended by the SDK.',\n )\n }\n\n return parsed.toString().replace(/\\/+$/, '')\n}\n\nexport function buildAthenaGatewayUrl(baseUrl: string, path: string): string {\n if (!path.startsWith('/')) {\n throw invalidBaseUrlError(\n `Athena gateway path must start with \"/\". Received ${JSON.stringify(path)}.`,\n 'Use a leading slash such as \"/gateway/fetch\" or \"/\".',\n )\n }\n\n return `${baseUrl}${path}`\n}\n","import type { AthenaCookieOptions } from './types.ts'\n\nfunction tryDecode(str: string): string {\n if (str.indexOf('%') === -1) {\n return str\n }\n try {\n return decodeURIComponent(str)\n } catch {\n return str\n }\n}\n\nexport interface CookieAttributes {\n value: string\n 'max-age'?: number\n expires?: Date\n domain?: string\n path?: string\n secure?: boolean\n httponly?: boolean\n partitioned?: boolean\n samesite?: 'strict' | 'lax' | 'none'\n [key: string]: unknown\n}\n\nexport const SECURE_COOKIE_PREFIX = '__Secure-'\nexport const HOST_COOKIE_PREFIX = '__Host-'\n\n/**\n * Remove __Secure- or __Host- prefix from cookie name.\n */\nexport function stripSecureCookiePrefix(cookieName: string): string {\n if (cookieName.startsWith(SECURE_COOKIE_PREFIX)) {\n return cookieName.slice(SECURE_COOKIE_PREFIX.length)\n }\n if (cookieName.startsWith(HOST_COOKIE_PREFIX)) {\n return cookieName.slice(HOST_COOKIE_PREFIX.length)\n }\n return cookieName\n}\n\n/**\n * Split a comma-joined `Set-Cookie` header string into individual cookies.\n */\nexport function splitSetCookieHeader(setCookie: string): string[] {\n if (!setCookie) {\n return []\n }\n\n const result: string[] = []\n let start = 0\n let i = 0\n\n while (i < setCookie.length) {\n if (setCookie[i] === ',') {\n let j = i + 1\n while (j < setCookie.length && setCookie[j] === ' ') {\n j++\n }\n while (j < setCookie.length && setCookie[j] !== '=' && setCookie[j] !== ';' && setCookie[j] !== ',') {\n j++\n }\n\n if (j < setCookie.length && setCookie[j] === '=') {\n const part = setCookie.slice(start, i).trim()\n if (part) {\n result.push(part)\n }\n start = i + 1\n while (start < setCookie.length && setCookie[start] === ' ') {\n start++\n }\n i = start\n continue\n }\n }\n i++\n }\n\n const last = setCookie.slice(start).trim()\n if (last) {\n result.push(last)\n }\n\n return result\n}\n\nexport function parseSetCookieHeader(setCookie: string): Map<string, CookieAttributes> {\n const cookies = new Map<string, CookieAttributes>()\n const cookieArray = splitSetCookieHeader(setCookie)\n\n for (const cookieString of cookieArray) {\n const parts = cookieString.split(';').map((part) => part.trim())\n const [nameValue, ...attributes] = parts\n const [name, ...valueParts] = (nameValue || '').split('=')\n if (!name) {\n continue\n }\n\n const value = unquoteCookieValue(valueParts.join('='))\n const decodedValue = tryDecode(value)\n const attrObj: CookieAttributes = { value: decodedValue }\n\n for (const attribute of attributes) {\n const [attrName, ...attrValueParts] = attribute.split('=')\n const attrValue = attrValueParts.join('=')\n const normalizedAttrName = attrName.trim().toLowerCase()\n switch (normalizedAttrName) {\n case 'max-age':\n attrObj['max-age'] = attrValue ? parseInt(attrValue.trim(), 10) : undefined\n break\n case 'expires':\n attrObj.expires = attrValue ? new Date(attrValue.trim()) : undefined\n break\n case 'domain':\n attrObj.domain = attrValue ? attrValue.trim() : undefined\n break\n case 'path':\n attrObj.path = attrValue ? attrValue.trim() : undefined\n break\n case 'secure':\n attrObj.secure = true\n break\n case 'httponly':\n attrObj.httponly = true\n break\n case 'samesite':\n attrObj.samesite = attrValue ? (attrValue.trim().toLowerCase() as 'strict' | 'lax' | 'none') : undefined\n break\n case 'partitioned':\n attrObj.partitioned = true\n break\n default:\n attrObj[normalizedAttrName] = attrValue ? attrValue.trim() : true\n break\n }\n }\n\n cookies.set(name, attrObj)\n }\n\n return cookies\n}\n\nexport function toCookieOptions(attributes: CookieAttributes): AthenaCookieOptions {\n return {\n maxAge: attributes['max-age'],\n expires: attributes.expires,\n domain: attributes.domain,\n path: attributes.path,\n secure: attributes.secure,\n httpOnly: attributes.httponly,\n sameSite: attributes.samesite,\n partitioned: attributes.partitioned,\n }\n}\n\n/**\n * Cookie-name token char set per RFC 7230 §3.2.6.\n */\nexport const cookieNameRegex = /^[\\w!#$%&'*.^`|~+-]+$/\n\nfunction unquoteCookieValue(value: string): string {\n if (value.length < 2 || !value.startsWith('\"') || !value.endsWith('\"')) {\n return value\n }\n return value.slice(1, -1)\n}\n\n/**\n * Parse a `Cookie` header into a key/value map.\n */\nexport function parseCookies(cookieHeader: string): Map<string, string> {\n const cookies = cookieHeader.split('; ')\n const cookieMap = new Map<string, string>()\n cookies.forEach((cookie) => {\n const [name, value] = cookie.split(/=(.*)/s)\n cookieMap.set(name as string, value as string)\n })\n return cookieMap\n}\n\n/**\n * Add or replace a cookie in the request `Cookie` header.\n */\nexport function setRequestCookie(headers: Headers, name: string, value: string): void {\n const cookieMap = parseCookies(headers.get('cookie') || '')\n if (cookieNameRegex.test(name)) {\n cookieMap.set(name, value)\n }\n headers.set(\n 'cookie',\n Array.from(cookieMap, ([key, currentValue]) => `${key}=${encodeURIComponent(currentValue)}`).join('; '),\n )\n}\n\n/**\n * Merge `Set-Cookie` values into a `Cookie` header.\n */\nexport function applySetCookies(target: Headers, setCookieValues: Iterable<string>): void {\n const cookieMap = parseCookies(target.get('cookie') || '')\n for (const setCookie of setCookieValues) {\n for (const [name, attr] of parseSetCookieHeader(setCookie)) {\n if (cookieNameRegex.test(name)) {\n cookieMap.set(name, attr.value)\n }\n }\n }\n target.set(\n 'cookie',\n Array.from(cookieMap, ([key, currentValue]) => `${key}=${encodeURIComponent(currentValue)}`).join('; '),\n )\n}\n\nexport function setCookieToHeader(headers: Headers) {\n return (context: { response: Response }) => {\n const setCookieHeader = context.response.headers.get('set-cookie')\n if (!setCookieHeader) {\n return\n }\n applySetCookies(headers, [setCookieHeader])\n }\n}\n","import { decodeBase64UrlToString, encodeStringToBase64Url } from './base64.ts'\nimport {\n HOST_COOKIE_PREFIX,\n SECURE_COOKIE_PREFIX,\n parseCookies,\n parseSetCookieHeader,\n setCookieToHeader,\n setRequestCookie,\n splitSetCookieHeader,\n stripSecureCookiePrefix,\n toCookieOptions,\n} from './cookie-utils.ts'\nimport { signHmacBase64Url, signJwtHS256, verifyJwtHS256 } from './crypto.ts'\nimport { createAccountStore, createSessionStore, getAccountCookie, getChunkedCookie } from './session-store.ts'\nimport type {\n AthenaAuthCookie,\n AthenaAuthCookies,\n AthenaCookieContextRuntime,\n AthenaCookieOptions,\n AthenaCookiesOptions,\n AthenaCookieVersionResolver,\n AthenaGetCookieCacheConfig,\n AthenaSessionPair,\n} from './types.ts'\n\nconst DEFAULT_COOKIE_PREFIX = 'athena-auth'\nconst LEGACY_COOKIE_PREFIX = 'better-auth'\nconst DEFAULT_SESSION_MAX_AGE = 7 * 24 * 60 * 60\nconst DEFAULT_CACHE_MAX_AGE = 60 * 5\n\nfunction isProductionRuntime(): boolean {\n return typeof process !== 'undefined' && process.env?.NODE_ENV === 'production'\n}\n\nfunction getEnvironmentSecret(): string | undefined {\n if (typeof process === 'undefined') {\n return undefined\n }\n return process.env?.ATHENA_AUTH_SECRET || process.env?.BETTER_AUTH_SECRET || process.env?.AUTH_SECRET\n}\n\nfunction isDynamicBaseURLConfig(baseURL: AthenaCookiesOptions['baseURL']): boolean {\n return (\n typeof baseURL === 'object' &&\n baseURL !== null &&\n 'allowedHosts' in baseURL &&\n Array.isArray((baseURL as { allowedHosts?: unknown }).allowedHosts)\n )\n}\n\nfunction resolveCookiePrefixes(primaryPrefix: string): string[] {\n const prefixes = [primaryPrefix]\n if (!prefixes.includes(DEFAULT_COOKIE_PREFIX)) {\n prefixes.push(DEFAULT_COOKIE_PREFIX)\n }\n if (!prefixes.includes(LEGACY_COOKIE_PREFIX)) {\n prefixes.push(LEGACY_COOKIE_PREFIX)\n }\n return prefixes\n}\n\nfunction createError(message: string): Error {\n return new Error(`@xylex-group/athena/cookies: ${message}`)\n}\n\nfunction getSecretOrThrow(secret?: string): string {\n const resolved = secret || getEnvironmentSecret()\n if (!resolved) {\n throw createError(\n 'getCookieCache requires a secret. Pass `secret` or set ATHENA_AUTH_SECRET/BETTER_AUTH_SECRET/AUTH_SECRET.',\n )\n }\n return resolved\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') {\n return null\n }\n return value as Record<string, unknown>\n}\n\nfunction getSessionTokenFromPair(session: AthenaSessionPair): string {\n const token = session.session?.token\n if (typeof token !== 'string' || token.length === 0) {\n throw createError('setSessionCookie requires `session.session.token` to be a non-empty string.')\n }\n return token\n}\n\nasync function resolveCookieVersion(\n versionConfig: AthenaCookieVersionResolver | undefined,\n session: Record<string, unknown>,\n user: Record<string, unknown>,\n): Promise<string> {\n if (!versionConfig) {\n return '1'\n }\n if (typeof versionConfig === 'string') {\n return versionConfig\n }\n return versionConfig(session, user)\n}\n\nfunction getSessionCookieCacheName(cookiePrefix: string, cookieName: string, isSecure: boolean): string {\n return isSecure ? `${SECURE_COOKIE_PREFIX}${cookiePrefix}.${cookieName}` : `${cookiePrefix}.${cookieName}`\n}\n\nasync function setCookieValue(\n ctx: AthenaCookieContextRuntime,\n name: string,\n value: string,\n attributes: AthenaCookieOptions,\n): Promise<void> {\n const secret = ctx.context.secret\n if (secret && typeof ctx.setSignedCookie === 'function') {\n await ctx.setSignedCookie(name, value, secret, attributes)\n return\n }\n ctx.setCookie(name, value, attributes)\n}\n\nfunction parseJsonSafely<T>(value: string): T | null {\n try {\n return JSON.parse(value) as T\n } catch {\n return null\n }\n}\n\nfunction getIsSecureCookie(config: { isSecure?: boolean } | undefined): boolean {\n if (config?.isSecure !== undefined) {\n return config.isSecure\n }\n return isProductionRuntime()\n}\n\nexport function createCookieGetter(options: AthenaCookiesOptions) {\n const baseURLString = typeof options.baseURL === 'string' ? options.baseURL : undefined\n const dynamicProtocol =\n typeof options.baseURL === 'object' && options.baseURL !== null ? options.baseURL.protocol : undefined\n\n const secure =\n options.advanced?.useSecureCookies !== undefined\n ? options.advanced.useSecureCookies\n : dynamicProtocol === 'https'\n ? true\n : dynamicProtocol === 'http'\n ? false\n : baseURLString\n ? baseURLString.startsWith('https://')\n : isProductionRuntime()\n\n const secureCookiePrefix = secure ? SECURE_COOKIE_PREFIX : ''\n const crossSubdomainEnabled = !!options.advanced?.crossSubDomainCookies?.enabled\n const domain = crossSubdomainEnabled\n ? options.advanced?.crossSubDomainCookies?.domain || (baseURLString ? new URL(baseURLString).hostname : undefined)\n : undefined\n\n if (crossSubdomainEnabled && !domain && !isDynamicBaseURLConfig(options.baseURL)) {\n throw createError('baseURL is required when `crossSubDomainCookies.enabled` is true.')\n }\n\n function createCookie(cookieName: string, overrideAttributes: Partial<AthenaCookieOptions> = {}): AthenaAuthCookie {\n const prefix = options.advanced?.cookiePrefix || DEFAULT_COOKIE_PREFIX\n const name = options.advanced?.cookies?.[cookieName]?.name || `${prefix}.${cookieName}`\n const attributes = options.advanced?.cookies?.[cookieName]?.attributes || {}\n\n return {\n name: `${secureCookiePrefix}${name}`,\n attributes: {\n secure: !!secureCookiePrefix,\n sameSite: 'lax',\n path: '/',\n httpOnly: true,\n ...(crossSubdomainEnabled ? { domain } : {}),\n ...options.advanced?.defaultCookieAttributes,\n ...overrideAttributes,\n ...attributes,\n },\n }\n }\n\n return createCookie\n}\n\nexport function getCookies(options: AthenaCookiesOptions): AthenaAuthCookies {\n const createCookie = createCookieGetter(options)\n const sessionToken = createCookie('session_token', { maxAge: options.session?.expiresIn || DEFAULT_SESSION_MAX_AGE })\n const sessionData = createCookie('session_data', { maxAge: options.session?.cookieCache?.maxAge || DEFAULT_CACHE_MAX_AGE })\n const accountData = createCookie('account_data', { maxAge: options.session?.cookieCache?.maxAge || DEFAULT_CACHE_MAX_AGE })\n const dontRememberToken = createCookie('dont_remember')\n\n return {\n sessionToken: {\n name: sessionToken.name,\n attributes: sessionToken.attributes,\n },\n sessionData: {\n name: sessionData.name,\n attributes: sessionData.attributes,\n },\n dontRememberToken: {\n name: dontRememberToken.name,\n attributes: dontRememberToken.attributes,\n },\n accountData: {\n name: accountData.name,\n attributes: accountData.attributes,\n },\n }\n}\n\nexport async function setCookieCache(\n ctx: AthenaCookieContextRuntime,\n session: AthenaSessionPair,\n dontRememberMe: boolean,\n): Promise<void> {\n const cookieCacheConfig = ctx.context.options?.session?.cookieCache\n if (!cookieCacheConfig?.enabled) {\n return\n }\n\n const version = await resolveCookieVersion(\n cookieCacheConfig.version,\n session.session as Record<string, unknown>,\n session.user as Record<string, unknown>,\n )\n\n const sessionData = {\n session: session.session,\n user: session.user,\n updatedAt: Date.now(),\n version,\n }\n\n const baseAttributes = ctx.context.authCookies.sessionData.attributes\n const maxAge = dontRememberMe ? undefined : baseAttributes.maxAge\n const options: AthenaCookieOptions = {\n ...baseAttributes,\n maxAge,\n }\n const expiresAt = Date.now() + ((options.maxAge || 60) * 1000)\n const strategy = cookieCacheConfig.strategy || 'compact'\n const secret = getSecretOrThrow(ctx.context.secret)\n\n let encoded: string\n if (strategy === 'jwt') {\n encoded = await signJwtHS256(sessionData, secret, options.maxAge || DEFAULT_CACHE_MAX_AGE)\n } else if (strategy === 'jwe') {\n throw createError('`jwe` strategy is not supported by the SDK cookie helper.')\n } else {\n const signature = await signHmacBase64Url(\n secret,\n JSON.stringify({\n ...sessionData,\n expiresAt,\n }),\n )\n encoded = encodeStringToBase64Url(\n JSON.stringify({\n session: sessionData,\n expiresAt,\n signature,\n }),\n )\n }\n\n if (encoded.length > 4093) {\n const store = createSessionStore(ctx.context.authCookies.sessionData.name, options, ctx)\n const cookies = store.chunk(encoded, options)\n store.setCookies(cookies)\n } else {\n const store = createSessionStore(ctx.context.authCookies.sessionData.name, options, ctx)\n if (store.hasChunks()) {\n store.setCookies(store.clean())\n }\n ctx.setCookie(ctx.context.authCookies.sessionData.name, encoded, options)\n }\n}\n\nexport async function setSessionCookie(\n ctx: AthenaCookieContextRuntime,\n session: AthenaSessionPair,\n dontRememberMe?: boolean,\n overrides?: Partial<AthenaCookieOptions>,\n): Promise<void> {\n if (dontRememberMe === undefined && typeof ctx.getSignedCookie === 'function' && ctx.context.secret) {\n const existingFlag = await ctx.getSignedCookie(ctx.context.authCookies.dontRememberToken.name, ctx.context.secret)\n dontRememberMe = !!existingFlag\n }\n\n const resolvedDontRememberMe = dontRememberMe ?? false\n const token = getSessionTokenFromPair(session)\n const options = ctx.context.authCookies.sessionToken.attributes\n const maxAge = resolvedDontRememberMe ? undefined : ctx.context.sessionConfig?.expiresIn\n await setCookieValue(ctx, ctx.context.authCookies.sessionToken.name, token, {\n ...options,\n maxAge,\n ...overrides,\n })\n\n if (resolvedDontRememberMe) {\n await setCookieValue(\n ctx,\n ctx.context.authCookies.dontRememberToken.name,\n 'true',\n ctx.context.authCookies.dontRememberToken.attributes,\n )\n }\n\n await setCookieCache(ctx, session, resolvedDontRememberMe)\n ctx.context.setNewSession?.(session)\n}\n\n/**\n * Expires a cookie by setting `maxAge: 0` while preserving attributes.\n */\nexport function expireCookie(ctx: AthenaCookieContextRuntime, cookie: AthenaAuthCookie): void {\n ctx.setCookie(cookie.name, '', {\n ...cookie.attributes,\n maxAge: 0,\n })\n}\n\nexport function deleteSessionCookie(ctx: AthenaCookieContextRuntime, skipDontRememberMe?: boolean): void {\n expireCookie(ctx, ctx.context.authCookies.sessionToken)\n expireCookie(ctx, ctx.context.authCookies.sessionData)\n\n if (ctx.context.options?.account?.storeAccountCookie) {\n expireCookie(ctx, ctx.context.authCookies.accountData)\n const accountStore = createAccountStore(\n ctx.context.authCookies.accountData.name,\n ctx.context.authCookies.accountData.attributes,\n ctx,\n )\n accountStore.setCookies(accountStore.clean())\n }\n\n const sessionStore = createSessionStore(\n ctx.context.authCookies.sessionData.name,\n ctx.context.authCookies.sessionData.attributes,\n ctx,\n )\n sessionStore.setCookies(sessionStore.clean())\n\n if (!skipDontRememberMe) {\n expireCookie(ctx, ctx.context.authCookies.dontRememberToken)\n }\n}\n\nexport const getSessionCookie = (\n request: Request | Headers,\n config?:\n | {\n cookiePrefix?: string\n cookieName?: string\n path?: string\n }\n | undefined,\n): string | null => {\n const cookies = (request instanceof Headers || !('headers' in request) ? request : request.headers).get('cookie')\n if (!cookies) {\n return null\n }\n\n const { cookieName = 'session_token', cookiePrefix = 'athena-auth' } = config || {}\n const parsedCookie = parseCookies(cookies)\n const getCookie = (name: string): string | undefined =>\n parsedCookie.get(name) || parsedCookie.get(`${SECURE_COOKIE_PREFIX}${name}`)\n const candidateCookieNames = Array.from(new Set([\n cookieName,\n cookieName.replace(/_/g, '-'),\n cookieName.replace(/-/g, '_'),\n ])).filter(Boolean)\n for (const candidateName of candidateCookieNames) {\n const sessionToken =\n getCookie(`${cookiePrefix}.${candidateName}`) || getCookie(`${cookiePrefix}-${candidateName}`)\n if (sessionToken) {\n return sessionToken\n }\n }\n return null\n}\n\nexport const getCookieCache = async <\n SessionShape extends Record<string, unknown> = Record<string, unknown>,\n UserShape extends Record<string, unknown> = Record<string, unknown>,\n>(\n request: Request | Headers,\n config?: AthenaGetCookieCacheConfig<SessionShape, UserShape>,\n): Promise<{\n session: SessionShape\n user: UserShape\n updatedAt: number\n version?: string\n} | null> => {\n const headers = request instanceof Headers || !('headers' in request) ? request : request.headers\n const cookieHeader = headers.get('cookie')\n if (!cookieHeader) {\n return null\n }\n\n const parsedCookie = parseCookies(cookieHeader)\n const cookieName = config?.cookieName || 'session_data'\n const requestedPrefix = config?.cookiePrefix || DEFAULT_COOKIE_PREFIX\n const strategy = config?.strategy || 'compact'\n const cookiePrefixes = resolveCookiePrefixes(requestedPrefix)\n const isSecure = getIsSecureCookie(config)\n const secret = getSecretOrThrow(config?.secret)\n\n let sessionData: string | undefined\n\n for (const prefix of cookiePrefixes) {\n const candidate = getSessionCookieCacheName(prefix, cookieName, isSecure)\n const cookieValue = parsedCookie.get(candidate)\n if (cookieValue) {\n sessionData = cookieValue\n break\n }\n }\n\n if (!sessionData) {\n const reconstructedChunks: Array<{ index: number; value: string }> = []\n for (const prefix of cookiePrefixes) {\n const candidate = getSessionCookieCacheName(prefix, cookieName, isSecure)\n for (const [name, value] of parsedCookie.entries()) {\n if (!name.startsWith(`${candidate}.`)) {\n continue\n }\n const parts = name.split('.')\n const indexStr = parts[parts.length - 1]\n const index = parseInt(indexStr || '0', 10)\n if (!Number.isNaN(index)) {\n reconstructedChunks.push({ index, value })\n }\n }\n if (reconstructedChunks.length > 0) {\n break\n }\n }\n\n if (reconstructedChunks.length > 0) {\n reconstructedChunks.sort((left, right) => left.index - right.index)\n sessionData = reconstructedChunks.map((chunk) => chunk.value).join('')\n }\n }\n\n if (!sessionData) {\n return null\n }\n\n if (strategy === 'jwe') {\n throw createError(\n '`jwe` strategy is not supported by the SDK cookie helper. Use compact/jwt or pass cookie data through the auth server.',\n )\n }\n\n if (strategy === 'jwt') {\n const payload = await verifyJwtHS256<Record<string, unknown>>(sessionData, secret)\n if (!payload) {\n return null\n }\n const sessionRecord = asObject(payload.session)\n const userRecord = asObject(payload.user)\n const updatedAt = payload.updatedAt\n if (!sessionRecord || !userRecord || typeof updatedAt !== 'number') {\n return null\n }\n\n if (config?.version) {\n const cookieVersion = typeof payload.version === 'string' ? payload.version : '1'\n const expectedVersion =\n typeof config.version === 'string'\n ? config.version\n : await config.version(sessionRecord as SessionShape, userRecord as UserShape)\n if (cookieVersion !== expectedVersion) {\n return null\n }\n }\n\n return {\n session: sessionRecord as SessionShape,\n user: userRecord as UserShape,\n updatedAt,\n version: typeof payload.version === 'string' ? payload.version : undefined,\n }\n }\n\n const compactPayload = parseJsonSafely<{\n session: {\n session: SessionShape\n user: UserShape\n updatedAt: number\n version?: string\n }\n expiresAt: number\n signature: string\n }>(decodeBase64UrlToString(sessionData))\n\n if (!compactPayload) {\n return null\n }\n\n const expectedSignature = await signHmacBase64Url(\n secret,\n JSON.stringify({\n ...compactPayload.session,\n expiresAt: compactPayload.expiresAt,\n }),\n )\n\n if (expectedSignature !== compactPayload.signature) {\n return null\n }\n\n if (compactPayload.expiresAt <= Date.now()) {\n return null\n }\n\n const resolvedSession = compactPayload.session\n if (config?.version) {\n const cookieVersion = resolvedSession.version || '1'\n const expectedVersion =\n typeof config.version === 'string'\n ? config.version\n : await config.version(resolvedSession.session, resolvedSession.user)\n if (cookieVersion !== expectedVersion) {\n return null\n }\n }\n\n const sessionObject = asObject(resolvedSession.session)\n const userObject = asObject(resolvedSession.user)\n if (!sessionObject || !userObject) {\n return null\n }\n\n return {\n session: sessionObject as SessionShape,\n user: userObject as UserShape,\n updatedAt: resolvedSession.updatedAt,\n version: resolvedSession.version,\n }\n}\n\nexport {\n SESSION_COOKIE_PATTERNS,\n hasAuthSessionCookie,\n} from './session-cookie-detection.ts'\n\nexport {\n HOST_COOKIE_PREFIX,\n SECURE_COOKIE_PREFIX,\n createSessionStore,\n getAccountCookie,\n getChunkedCookie,\n parseCookies,\n parseSetCookieHeader,\n setCookieToHeader,\n setRequestCookie,\n splitSetCookieHeader,\n stripSecureCookiePrefix,\n toCookieOptions,\n}\n\nexport type {\n AthenaAuthCookie,\n AthenaAuthCookies,\n AthenaCookieContextRuntime,\n AthenaCookieOptions,\n AthenaCookiesOptions,\n AthenaGetCookieCacheConfig,\n}\n","import { getSessionCookie } from '../cookies/index.ts'\nimport type { BackendOption } from '../gateway/types.ts'\n\nexport type AthenaRequestHeaderProfile = 'gateway' | 'auth' | 'chat' | 'storage' | 'minimal'\n\nconst NO_CACHE_HEADER_VALUE = 'no-cache'\n\nconst API_KEY_HEADER_CANDIDATES = ['X-Athena-Key', 'x-athena-key', 'X-Api-Key', 'x-api-key', 'apikey'] as const\nconst ATHENA_KEY_HEADER_CANDIDATES = ['X-Athena-Key', 'x-athena-key'] as const\nconst SESSION_TOKEN_HEADER_CANDIDATES = ['X-Athena-Auth-Session-Token'] as const\nconst BEARER_MIRROR_HEADER_CANDIDATES = ['X-Athena-Auth-Bearer-Token'] as const\nconst CLIENT_HEADER_CANDIDATES = ['X-Athena-Client', 'x-athena-client'] as const\nconst PG_URI_HEADER_CANDIDATES = ['x-pg-uri'] as const\nconst JDBC_URI_HEADER_CANDIDATES = ['x-athena-jdbc-url', 'x-jdbc-url'] as const\n\ninterface AthenaRequestHeaderProfileRules {\n apiKeys: boolean\n routing: boolean\n authMirror: boolean\n authBearer: boolean\n contentType?: boolean\n accept?: boolean\n stripNullsDefault?: boolean\n}\n\nconst PROFILE_RULES: Record<AthenaRequestHeaderProfile, AthenaRequestHeaderProfileRules> = {\n gateway: { apiKeys: true, routing: true, authMirror: true, authBearer: false, contentType: true, stripNullsDefault: true },\n chat: { apiKeys: true, routing: true, authMirror: true, authBearer: true, accept: true },\n storage: { apiKeys: true, routing: true, authMirror: true, authBearer: false, contentType: true },\n auth: { apiKeys: true, routing: true, authMirror: false, authBearer: true, contentType: true },\n minimal: { apiKeys: false, routing: false, authMirror: false, authBearer: false },\n}\n\nexport interface BuildAthenaRequestHeadersInput {\n profile: AthenaRequestHeaderProfile\n sdkHeaderValue: string\n apiKey?: string | null\n client?: string | null\n userId?: string | null\n organizationId?: string | null\n backend?: BackendOption\n publishEvent?: string | null\n stripNulls?: boolean\n bearerToken?: string | null\n cookie?: string | null\n sessionToken?: string | null\n pgUri?: string | null\n jdbcUrl?: string | null\n forceNoCache?: boolean\n configHeaders?: Record<string, string>\n callHeaders?: Record<string, string>\n contentType?: string | null\n accept?: string | null\n}\n\n/** Shared config/call fields consumed by gateway, chat, auth, and `client.request(...)`. */\nexport interface AthenaRequestHeaderOverrideFields {\n apiKey?: string | null\n client?: string | null\n userId?: string | null\n organizationId?: string | null\n backend?: BackendOption\n publishEvent?: string | null\n stripNulls?: boolean\n bearerToken?: string | null\n cookie?: string | null\n sessionToken?: string | null\n pgUri?: string | null\n jdbcUrl?: string | null\n forceNoCache?: boolean\n headers?: Record<string, string>\n}\n\nexport type ResolvedRequestHeaderOverrides = Omit<\n BuildAthenaRequestHeadersInput,\n 'profile' | 'sdkHeaderValue' | 'contentType' | 'accept'\n>\n\nfunction normalizeHeaderValue(value?: string | null): string | undefined {\n return value ? value : undefined\n}\n\nfunction mergeExtraHeaders(\n configHeaders?: Record<string, string>,\n callHeaders?: Record<string, string>,\n): Record<string, string> {\n return { ...(configHeaders ?? {}), ...(callHeaders ?? {}) }\n}\n\nexport function hasHeaderIgnoreCase(\n headers: Record<string, string>,\n targetKey: string,\n): boolean {\n const normalizedTargetKey = targetKey.toLowerCase()\n return Object.keys(headers).some(key => key.toLowerCase() === normalizedTargetKey)\n}\n\nexport function resolveHeaderValue(\n headers: Record<string, string>,\n candidates: readonly string[],\n): string | undefined {\n for (const candidate of candidates) {\n const direct = normalizeHeaderValue(headers[candidate])\n if (direct) return direct\n }\n\n const loweredCandidates = new Set(candidates.map(candidate => candidate.toLowerCase()))\n for (const [key, value] of Object.entries(headers)) {\n if (!loweredCandidates.has(key.toLowerCase())) {\n continue\n }\n const normalized = normalizeHeaderValue(value)\n if (normalized) return normalized\n }\n\n return undefined\n}\n\nfunction isCacheControlHeaderName(name: string): boolean {\n return name.toLowerCase() === 'cache-control'\n}\n\nfunction normalizeBearerToken(value: string): string {\n const trimmed = value.trim()\n const match = trimmed.match(/^Bearer\\s+(.+)$/i)\n return match?.[1]?.trim() ?? trimmed\n}\n\nfunction resolveBearerTokenFromAuthorizationHeader(\n headers: Record<string, string>,\n): string | undefined {\n const authorization = resolveHeaderValue(headers, ['Authorization'])\n if (!authorization) {\n return undefined\n }\n\n const token = normalizeBearerToken(authorization)\n return token ? token : undefined\n}\n\nfunction resolveSessionTokenFromCookieHeader(\n headers: Record<string, string>,\n): string | undefined {\n const cookie = resolveHeaderValue(headers, ['Cookie'])\n if (!cookie) {\n return undefined\n }\n\n return getSessionCookie(new Headers({ cookie })) ?? undefined\n}\n\nfunction resolveBackendType(backend?: BackendOption): string | undefined {\n if (!backend) {\n return undefined\n }\n return typeof backend === 'string' ? backend : backend.type\n}\n\nexport function resolveRequestHeaderOverrides(\n config: AthenaRequestHeaderOverrideFields,\n options?: AthenaRequestHeaderOverrideFields,\n defaults?: Pick<AthenaRequestHeaderOverrideFields, 'client' | 'stripNulls'>,\n): ResolvedRequestHeaderOverrides {\n return {\n apiKey: options?.apiKey ?? config.apiKey,\n client: options?.client ?? config.client ?? defaults?.client,\n userId: options?.userId ?? config.userId,\n organizationId: options?.organizationId ?? config.organizationId,\n backend: options?.backend ?? config.backend,\n publishEvent: options?.publishEvent ?? config.publishEvent,\n stripNulls: options?.stripNulls ?? config.stripNulls ?? defaults?.stripNulls,\n bearerToken: options?.bearerToken ?? config.bearerToken,\n cookie: options?.cookie ?? config.cookie,\n sessionToken: options?.sessionToken ?? config.sessionToken,\n pgUri: options?.pgUri ?? config.pgUri,\n jdbcUrl: options?.jdbcUrl ?? config.jdbcUrl,\n forceNoCache: Boolean(config.forceNoCache || options?.forceNoCache),\n configHeaders: config.headers,\n callHeaders: options?.headers,\n }\n}\n\nexport function buildServiceRequestHeaders(\n profile: Exclude<AthenaRequestHeaderProfile, 'minimal'>,\n sdkHeaderValue: string,\n config: AthenaRequestHeaderOverrideFields,\n options?: AthenaRequestHeaderOverrideFields,\n extras?: Pick<BuildAthenaRequestHeadersInput, 'contentType' | 'accept'> & {\n client?: string | null\n stripNulls?: boolean\n },\n): Record<string, string> {\n const rules = PROFILE_RULES[profile]\n return buildAthenaRequestHeaders({\n profile,\n sdkHeaderValue,\n ...resolveRequestHeaderOverrides(config, options, {\n client: extras?.client ?? undefined,\n stripNulls: extras?.stripNulls ?? (rules.stripNullsDefault ? true : undefined),\n }),\n contentType: extras?.contentType ?? (rules.contentType ? 'application/json' : undefined),\n accept: extras?.accept ?? (rules.accept ? 'application/json' : undefined),\n })\n}\n\nexport function applyAthenaApiKeyHeaders(\n headers: Record<string, string>,\n apiKey?: string | null,\n): void {\n const resolvedApiKey = normalizeHeaderValue(apiKey)\n if (resolvedApiKey && !hasHeaderIgnoreCase(headers, 'X-Athena-Key')) {\n headers['X-Athena-Key'] = resolvedApiKey\n }\n}\n\nexport function applyAthenaAuthContextHeaders(\n headers: Record<string, string>,\n input: Pick<\n BuildAthenaRequestHeadersInput,\n 'bearerToken' | 'cookie' | 'sessionToken' | 'profile' | 'configHeaders' | 'callHeaders'\n >,\n): void {\n const mergedExtraHeaders = mergeExtraHeaders(input.configHeaders, input.callHeaders)\n const rules = PROFILE_RULES[input.profile]\n const explicitCookie = normalizeHeaderValue(input.cookie)\n if (explicitCookie) {\n mergedExtraHeaders.Cookie = explicitCookie\n }\n\n const explicitSessionToken =\n normalizeHeaderValue(input.sessionToken) ??\n resolveHeaderValue(mergedExtraHeaders, SESSION_TOKEN_HEADER_CANDIDATES)\n const derivedSessionToken =\n explicitSessionToken ?? resolveSessionTokenFromCookieHeader(mergedExtraHeaders)\n const cookieFromHeaders = resolveHeaderValue(mergedExtraHeaders, ['Cookie'])\n\n if (explicitCookie && !hasHeaderIgnoreCase(headers, 'Cookie')) {\n headers.Cookie = explicitCookie\n } else if (cookieFromHeaders && !hasHeaderIgnoreCase(headers, 'Cookie')) {\n headers.Cookie = cookieFromHeaders\n }\n\n const explicitBearerToken = (() => {\n const configured = normalizeHeaderValue(input.bearerToken)\n if (configured) {\n return normalizeBearerToken(configured)\n }\n const mirrored = resolveHeaderValue(mergedExtraHeaders, BEARER_MIRROR_HEADER_CANDIDATES)\n return mirrored ? normalizeBearerToken(mirrored) : undefined\n })()\n const derivedBearerToken =\n explicitBearerToken ?? resolveBearerTokenFromAuthorizationHeader(mergedExtraHeaders)\n\n if (rules.authBearer && derivedBearerToken && !hasHeaderIgnoreCase(headers, 'Authorization')) {\n headers.Authorization = `Bearer ${derivedBearerToken}`\n }\n\n if (rules.authMirror) {\n if (derivedSessionToken && !hasHeaderIgnoreCase(headers, 'X-Athena-Auth-Session-Token')) {\n headers['X-Athena-Auth-Session-Token'] = derivedSessionToken\n }\n if (derivedBearerToken && !hasHeaderIgnoreCase(headers, 'X-Athena-Auth-Bearer-Token')) {\n headers['X-Athena-Auth-Bearer-Token'] = derivedBearerToken\n }\n } else if (derivedSessionToken && !hasHeaderIgnoreCase(headers, 'X-Athena-Auth-Session-Token')) {\n headers['X-Athena-Auth-Session-Token'] = derivedSessionToken\n }\n}\n\nexport function applyAthenaPgUriHeaders(\n headers: Record<string, string>,\n input: Pick<BuildAthenaRequestHeadersInput, 'pgUri' | 'jdbcUrl' | 'configHeaders' | 'callHeaders'>,\n): void {\n const mergedExtraHeaders = mergeExtraHeaders(input.configHeaders, input.callHeaders)\n\n const pgUri =\n normalizeHeaderValue(input.pgUri) ??\n resolveHeaderValue(mergedExtraHeaders, PG_URI_HEADER_CANDIDATES)\n if (pgUri && !hasHeaderIgnoreCase(headers, 'x-pg-uri')) {\n headers['x-pg-uri'] = pgUri\n }\n\n const jdbcUrl =\n normalizeHeaderValue(input.jdbcUrl) ??\n resolveHeaderValue(mergedExtraHeaders, JDBC_URI_HEADER_CANDIDATES)\n if (jdbcUrl) {\n if (!hasHeaderIgnoreCase(headers, 'x-athena-jdbc-url')) {\n headers['x-athena-jdbc-url'] = jdbcUrl\n }\n if (!hasHeaderIgnoreCase(headers, 'x-jdbc-url')) {\n headers['x-jdbc-url'] = jdbcUrl\n }\n }\n}\n\n/**\n * Minimal gateway/data request headers used by many apps before they adopt\n * the full {@link buildAthenaRequestHeaders} profile model.\n *\n * Additive convenience — does not replace client-built headers. Prefer\n * `createClient({ client, key })` so the SDK sets these on every call.\n */\nexport function buildAthenaGatewayHeaders(input: {\n clientName?: string | null\n gatewayKey?: string | null\n headers?: Record<string, string | null | undefined>\n}): Record<string, string> {\n const trimmedClientName = input.clientName?.trim()\n const trimmedGatewayKey = input.gatewayKey?.trim()\n const merged: Record<string, string | null | undefined> = {\n ...(trimmedClientName\n ? {\n 'X-Athena-Client': trimmedClientName,\n }\n : {}),\n ...(trimmedGatewayKey\n ? {\n 'X-Api-Key': trimmedGatewayKey,\n 'X-Athena-Key': trimmedGatewayKey,\n }\n : {}),\n ...input.headers,\n }\n\n return Object.fromEntries(\n Object.entries(merged).flatMap(([key, value]) =>\n typeof value === 'string' && value.trim()\n ? ([[key, value.trim()]] as const)\n : [],\n ),\n )\n}\n\nexport function buildAthenaRequestHeaders(\n input: BuildAthenaRequestHeadersInput,\n): Record<string, string> {\n const forceNoCache = Boolean(input.forceNoCache)\n const mergedExtraHeaders = mergeExtraHeaders(input.configHeaders, input.callHeaders)\n const rules = PROFILE_RULES[input.profile]\n\n const headerClient = resolveHeaderValue(mergedExtraHeaders, CLIENT_HEADER_CANDIDATES)\n const finalClient = normalizeHeaderValue(input.client) ?? headerClient\n const finalApiKey =\n normalizeHeaderValue(input.apiKey) ??\n resolveHeaderValue(mergedExtraHeaders, API_KEY_HEADER_CANDIDATES)\n const finalAthenaKey =\n resolveHeaderValue(mergedExtraHeaders, ATHENA_KEY_HEADER_CANDIDATES) ?? finalApiKey\n\n const headers: Record<string, string> = {\n 'X-Athena-Sdk': input.sdkHeaderValue,\n }\n\n if (rules.contentType) {\n headers['Content-Type'] = input.contentType ?? 'application/json'\n }\n\n if (input.accept ?? rules.accept) {\n headers.Accept = input.accept ?? 'application/json'\n }\n\n if (rules.routing) {\n if (normalizeHeaderValue(input.userId)) {\n headers['X-User-Id'] = input.userId ?? ''\n }\n if (normalizeHeaderValue(input.organizationId)) {\n headers['X-Organization-Id'] = input.organizationId ?? ''\n }\n if (finalClient) {\n headers['X-Athena-Client'] = finalClient\n }\n\n const backendType = resolveBackendType(input.backend)\n if (backendType) {\n headers['X-Backend-Type'] = backendType\n }\n\n if (typeof input.stripNulls === 'boolean') {\n headers['X-Strip-Nulls'] = input.stripNulls ? 'true' : 'false'\n } else if (rules.stripNullsDefault) {\n headers['X-Strip-Nulls'] = 'true'\n }\n\n if (normalizeHeaderValue(input.publishEvent)) {\n headers['X-Publish-Event'] = input.publishEvent ?? ''\n }\n }\n\n if (rules.apiKeys && (finalApiKey || finalAthenaKey)) {\n applyAthenaApiKeyHeaders(headers, finalAthenaKey)\n }\n\n applyAthenaAuthContextHeaders(headers, input)\n applyAthenaPgUriHeaders(headers, input)\n\n const reservedClientHeaderKeys = new Set(CLIENT_HEADER_CANDIDATES.map(key => key.toLowerCase()))\n Object.entries(mergedExtraHeaders).forEach(([key, value]) => {\n if (reservedClientHeaderKeys.has(key.toLowerCase())) {\n return\n }\n if (forceNoCache && isCacheControlHeaderName(key)) {\n return\n }\n const normalized = normalizeHeaderValue(value)\n if (normalized) {\n headers[key] = normalized\n }\n })\n\n if (forceNoCache) {\n headers['Cache-Control'] = NO_CACHE_HEADER_VALUE\n }\n\n return headers\n}\n","{\n \"author\": \"floris@xylex.group\",\n \"bin\": {\n \"athena-js\": \"bin/athena-js.js\"\n },\n \"dependencies\": {\n \"blessed\": \"^0.1.81\",\n \"chalk\": \"^4.1.2\",\n \"cron-parser\": \"^4.9.0\",\n \"jose\": \"^6.2.3\",\n \"pg\": \"^8.16.0\",\n \"server-only\": \"^0.0.1\",\n \"use-sync-external-store\": \"^1.5.0\",\n \"uuid\": \"^9.0.1\",\n \"zod\": \"^4.0.1\"\n },\n \"description\": \"Athena JS SDK\",\n \"devDependencies\": {\n \"@react-email/components\": \"^1.0.12\",\n \"@react-email/render\": \"^2.0.8\",\n \"@types/blessed\": \"^0.1.25\",\n \"@types/node\": \"^20.10.5\",\n \"@types/pg\": \"^8.15.1\",\n \"@types/react\": \"^18.3.12\",\n \"@types/react-test-renderer\": \"^18.3.1\",\n \"@types/uuid\": \"^9.0.7\",\n \"@typescript-eslint/eslint-plugin\": \"^8.57.0\",\n \"@typescript-eslint/parser\": \"^8.57.0\",\n \"eslint\": \"^8.57.1\",\n \"express\": \"^4.22.2\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"react-test-renderer\": \"^18.3.1\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.7.0\",\n \"typescript\": \"^5.3.3\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"exports\": {\n \".\": {\n \"browser\": {\n \"default\": \"./dist/browser.js\",\n \"import\": \"./dist/browser.js\",\n \"require\": \"./dist/browser.cjs\",\n \"types\": \"./dist/browser.d.ts\"\n },\n \"default\": \"./dist/index.js\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\",\n \"types\": \"./dist/index.d.ts\"\n },\n \"./admin\": {\n \"default\": \"./dist/admin.js\",\n \"import\": \"./dist/admin.js\",\n \"require\": \"./dist/admin.cjs\",\n \"types\": \"./dist/admin.d.ts\"\n },\n \"./billing\": {\n \"default\": \"./dist/billing.js\",\n \"import\": \"./dist/billing.js\",\n \"require\": \"./dist/billing.cjs\",\n \"types\": \"./dist/billing.d.ts\"\n },\n \"./browser\": {\n \"default\": \"./dist/browser.js\",\n \"import\": \"./dist/browser.js\",\n \"require\": \"./dist/browser.cjs\",\n \"types\": \"./dist/browser.d.ts\"\n },\n \"./cookies\": {\n \"default\": \"./dist/cookies.js\",\n \"import\": \"./dist/cookies.js\",\n \"require\": \"./dist/cookies.cjs\",\n \"types\": \"./dist/cookies.d.ts\"\n },\n \"./next/client\": {\n \"default\": \"./dist/next/client.js\",\n \"import\": \"./dist/next/client.js\",\n \"require\": \"./dist/next/client.cjs\",\n \"types\": \"./dist/next/client.d.ts\"\n },\n \"./next/server\": {\n \"default\": \"./dist/next/server.js\",\n \"import\": \"./dist/next/server.js\",\n \"require\": \"./dist/next/server.cjs\",\n \"types\": \"./dist/next/server.d.ts\"\n },\n \"./organization\": {\n \"default\": \"./dist/organization.js\",\n \"import\": \"./dist/organization.js\",\n \"require\": \"./dist/organization.cjs\",\n \"types\": \"./dist/organization.d.ts\"\n },\n \"./package.json\": \"./package.json\",\n \"./react\": {\n \"default\": \"./dist/react.js\",\n \"import\": \"./dist/react.js\",\n \"require\": \"./dist/react.cjs\",\n \"types\": \"./dist/react.d.ts\"\n },\n \"./social-providers\": {\n \"default\": \"./dist/social-providers.js\",\n \"import\": \"./dist/social-providers.js\",\n \"require\": \"./dist/social-providers.cjs\",\n \"types\": \"./dist/social-providers.d.ts\"\n },\n \"./utils\": {\n \"default\": \"./dist/utils.js\",\n \"import\": \"./dist/utils.js\",\n \"require\": \"./dist/utils.cjs\",\n \"types\": \"./dist/utils.d.ts\"\n }\n },\n \"files\": [\n \"dist\",\n \"bin\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"keywords\": [\n \"database\",\n \"driver\",\n \"api-gateway\",\n \"sdk\",\n \"react\",\n \"hooks\",\n \"http\",\n \"postgres\",\n \"query-builder\"\n ],\n \"license\": \"MIT\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"name\": \"@xylex-group/athena\",\n \"peerDependencies\": {\n \"@react-email/components\": \">=1.0.0\",\n \"@react-email/render\": \">=2.0.0\",\n \"react\": \">=17.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@react-email/components\": {\n \"optional\": true\n },\n \"@react-email/render\": {\n \"optional\": true\n },\n \"react\": {\n \"optional\": true\n }\n },\n \"publisher\": \"XYLEX Group\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/xylex-group/athena-js.git\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"check:all\": \"pnpm lint && pnpm typecheck && pnpm test && pnpm build\",\n \"dev\": \"tsup --watch\",\n \"docs:methods\": \"node scripts/generate-sdk-method-reference.mjs\",\n \"docs:site:check\": \"pnpm --dir ../../apps/docs docs:sync-athena-js:check\",\n \"docs:site:sync\": \"pnpm --dir ../../apps/docs docs:sync-athena-js\",\n \"example:api-call\": \"cd examples/api-call && bun run start\",\n \"example:email-resend\": \"cd examples/email-resend && bun run start\",\n \"example:express-api\": \"cd examples/express-api && bun run start\",\n \"example:order-saga\": \"cd examples/order-saga && bun run start\",\n \"example:postgres-connection\": \"cd examples/postgres-connection && bun run start\",\n \"example:recurring-invoice\": \"cd examples/recurring-invoice && bun run start\",\n \"example:retry-patterns\": \"cd examples/retry-patterns && bun run start\",\n \"lint\": \"eslint \\\"src/**/*.ts\\\" \\\"test/**/*.ts\\\"\",\n \"lint:fix\": \"pnpm lint -- --fix\",\n \"prepublishOnly\": \"pnpm typecheck && pnpm build\",\n \"publish:token\": \"node scripts/publish.js\",\n \"test\": \"node --import ./test/register-server-only.mjs --import tsx --test --test-force-exit test/*.test.ts\",\n \"test:integration:postgres\": \"node scripts/run-postgres-introspection-test.mjs\",\n \"test:watch\": \"node --import ./test/register-server-only.mjs --import tsx --test --watch test/*.test.ts\",\n \"typecheck\": \"tsc -p tsconfig.typecheck.json\"\n },\n \"sideEffects\": false,\n \"type\": \"module\",\n \"types\": \"./dist/index.d.ts\",\n \"typesVersions\": {\n \"*\": {\n \"*\": [\n \"dist/index.d.ts\"\n ],\n \"admin\": [\n \"dist/admin.d.ts\"\n ],\n \"billing\": [\n \"dist/billing.d.ts\"\n ],\n \"browser\": [\n \"dist/browser.d.ts\"\n ],\n \"cookies\": [\n \"dist/cookies.d.ts\"\n ],\n \"next/client\": [\n \"dist/next/client.d.ts\"\n ],\n \"next/server\": [\n \"dist/next/server.d.ts\"\n ],\n \"organization\": [\n \"dist/organization.d.ts\"\n ],\n \"react\": [\n \"dist/react.d.ts\"\n ],\n \"social-providers\": [\n \"dist/social-providers.d.ts\"\n ],\n \"utils\": [\n \"dist/utils.d.ts\"\n ]\n }\n },\n \"version\": \"3.0.2\"\n}","import packageJson from '../package.json' with { type: 'json' }\n\nexport const PACKAGE_VERSION = packageJson.version\n\nexport function buildSdkHeaderValue(sdkName: string): string {\n return `${sdkName} ${PACKAGE_VERSION}`\n}\n","import type {\n AthenaGatewayBaseOptions,\n AthenaGatewayCallOptions,\n AthenaGatewayConnectionOptions,\n AthenaGatewayConnectionResult,\n AthenaGatewayEndpointPath,\n AthenaGatewayErrorDetails,\n AthenaGatewayMethod,\n AthenaRpcCallOptions,\n AthenaRpcPayload,\n AthenaGatewayResponse,\n} from \"./types.js\";\nimport type {\n AthenaDeletePayload,\n AthenaFetchPayload,\n AthenaInsertPayload,\n AthenaRpcFilter,\n AthenaUpdatePayload,\n AthenaQueryPayload,\n} from \"./types.js\";\nimport { AthenaGatewayError } from \"./errors.ts\";\nimport {\n ATHENA_DEFAULT_BASE_URL,\n buildAthenaGatewayUrl,\n normalizeAthenaGatewayBaseUrl,\n} from \"./url.ts\";\nimport { buildServiceRequestHeaders } from \"../utils/athena-request-headers.ts\";\nimport { buildSdkHeaderValue } from \"../sdk-version.ts\";\n\nconst DEFAULT_CLIENT = \"DEFAULT_CLIENT\";\nconst SDK_NAME = \"xylex-group/athena\";\nconst SDK_HEADER_VALUE = buildSdkHeaderValue(SDK_NAME);\nfunction parseResponseBody(rawText: string, contentType: string | null) {\n if (!rawText) {\n return { parsed: null as unknown, parseFailed: false };\n }\n\n const contentTypeSuggestsJson =\n contentType?.toLowerCase().includes(\"application/json\") ?? false;\n const looksJson =\n contentTypeSuggestsJson || rawText.startsWith(\"{\") || rawText.startsWith(\"[\");\n\n if (!looksJson) {\n return { parsed: rawText as unknown, parseFailed: false };\n }\n\n try {\n return { parsed: JSON.parse(rawText) as unknown, parseFailed: false };\n } catch {\n return { parsed: rawText as unknown, parseFailed: true };\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction resolveStructuredErrorPayload(payload: unknown): Record<string, unknown> | null {\n if (!isRecord(payload)) return null;\n return isRecord(payload.error) ? payload.error : payload;\n}\n\nfunction resolveRequestId(headers: Headers): string | undefined {\n return (\n headers.get(\"x-request-id\") ??\n headers.get(\"x-correlation-id\") ??\n headers.get(\"x-athena-request-id\") ??\n undefined\n );\n}\n\nfunction resolveErrorMessage(payload: unknown, fallback: string) {\n const structuredPayload = resolveStructuredErrorPayload(payload);\n if (structuredPayload) {\n const messageCandidates = [structuredPayload.message, structuredPayload.error, structuredPayload.details];\n for (const candidate of messageCandidates) {\n const resolved = nonEmptyString(candidate);\n if (resolved) return resolved;\n }\n }\n\n const rawMessage = nonEmptyString(payload);\n if (rawMessage) return rawMessage;\n\n return fallback;\n}\n\nfunction resolveErrorHint(payload: unknown): string | undefined {\n const structuredPayload = resolveStructuredErrorPayload(payload);\n return structuredPayload ? nonEmptyString(structuredPayload.hint) : undefined;\n}\n\nfunction resolveStatusText(response: Response, payload: unknown): string | null {\n const rawStatusText = nonEmptyString(response.statusText);\n if (rawStatusText) return rawStatusText;\n const payloadRecord = isRecord(payload) ? payload : null;\n return payloadRecord ? nonEmptyString(payloadRecord.statusText) ?? null : null;\n}\n\nfunction detailsFromError(error: AthenaGatewayError): AthenaGatewayErrorDetails {\n return error.toDetails();\n}\n\ninterface AthenaFindManyAstPayload {\n table_name: string;\n select: Record<string, unknown>;\n where?: Record<string, unknown>;\n orderBy?: Record<string, unknown>;\n limit?: number;\n}\n\nfunction toQueryScalar(value: unknown): string {\n if (value === null || value === undefined) return \"null\";\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n if (typeof value === \"number\") return Number.isFinite(value) ? String(value) : \"null\";\n return String(value);\n}\n\nfunction toQueryArray(values: unknown[]): string {\n return `{${values.map(toQueryScalar).join(\",\")}}`;\n}\n\nfunction toRpcArgumentQueryValue(value: unknown): string {\n if (Array.isArray(value)) return toQueryArray(value);\n if (value && typeof value === \"object\") return JSON.stringify(value);\n return toQueryScalar(value);\n}\n\nfunction toRpcFilterQueryValue(filter: AthenaRpcFilter): string {\n const value = filter.value;\n switch (filter.operator) {\n case \"in\": {\n if (!Array.isArray(value)) {\n throw new AthenaGatewayError({\n code: \"UNKNOWN_ERROR\",\n message: `RPC filter \"${filter.column}\" with operator \"in\" requires an array value`,\n status: 0,\n });\n }\n return `in.${toQueryArray(value)}`;\n }\n case \"is\":\n return `is.${toQueryScalar(value)}`;\n case \"eq\":\n case \"neq\":\n case \"gt\":\n case \"gte\":\n case \"lt\":\n case \"lte\":\n case \"like\":\n case \"ilike\":\n return `${filter.operator}.${toQueryScalar(value)}`;\n }\n}\n\nfunction buildRpcGetEndpoint(payload: AthenaRpcPayload): AthenaGatewayEndpointPath {\n const functionName = (payload.function_name ?? payload.function).trim();\n if (!functionName) {\n throw new AthenaGatewayError({\n code: \"UNKNOWN_ERROR\",\n message: \"rpc requires a function name\",\n status: 0,\n endpoint: \"/gateway/rpc\",\n method: \"GET\",\n });\n }\n\n const query = new URLSearchParams();\n if (payload.schema) query.set(\"schema\", payload.schema);\n if (payload.select) query.set(\"select\", payload.select);\n if (payload.count) query.set(\"count\", payload.count);\n if (payload.head) query.set(\"head\", \"true\");\n if (typeof payload.limit === \"number\") query.set(\"limit\", String(payload.limit));\n if (typeof payload.offset === \"number\") query.set(\"offset\", String(payload.offset));\n if (payload.order?.column) {\n query.set(\n \"order\",\n payload.order.ascending === false\n ? `${payload.order.column}.desc`\n : payload.order.column,\n );\n }\n\n if (payload.args) {\n for (const [key, value] of Object.entries(payload.args)) {\n query.set(key, toRpcArgumentQueryValue(value));\n }\n }\n\n if (payload.filters?.length) {\n for (const filter of payload.filters) {\n if (payload.args && Object.prototype.hasOwnProperty.call(payload.args, filter.column)) {\n throw new AthenaGatewayError({\n code: \"UNKNOWN_ERROR\",\n message: `RPC filter \"${filter.column}\" conflicts with RPC argument \"${filter.column}\" in GET mode`,\n status: 0,\n });\n }\n query.append(filter.column, toRpcFilterQueryValue(filter));\n }\n }\n\n const endpoint = `/rpc/${encodeURIComponent(functionName)}`;\n const queryText = query.toString();\n const withQuery = queryText ? `${endpoint}?${queryText}` : endpoint;\n return withQuery as AthenaGatewayEndpointPath;\n}\n\nfunction buildHeaders(\n config: AthenaGatewayBaseOptions,\n options?: AthenaGatewayCallOptions,\n): Record<string, string> {\n return buildServiceRequestHeaders(\"gateway\", SDK_HEADER_VALUE, config, options, {\n client: options?.client ?? config.client ?? DEFAULT_CLIENT,\n stripNulls: options?.stripNulls ?? true,\n });\n}\n\nfunction toInvalidUrlResponse<T>(\n error: unknown,\n endpoint: AthenaGatewayEndpointPath,\n method: AthenaGatewayMethod,\n): AthenaGatewayResponse<T> {\n const message = error instanceof Error ? error.message : String(error);\n const gatewayError =\n error instanceof AthenaGatewayError\n ? error\n : new AthenaGatewayError({\n code: \"INVALID_URL\",\n message,\n status: 0,\n endpoint,\n method,\n cause: message,\n hint: \"Set ATHENA_URL to a full http(s) URL before running queries.\",\n });\n\n return {\n ok: false,\n status: 0,\n statusText: null,\n data: null,\n error: gatewayError.message,\n errorDetails: detailsFromError(\n new AthenaGatewayError({\n code: gatewayError.code,\n message: gatewayError.message,\n status: gatewayError.status,\n endpoint,\n method,\n requestId: gatewayError.requestId,\n hint: gatewayError.hint,\n cause: gatewayError.causeDetail,\n }),\n ),\n raw: null,\n };\n}\n\nfunction resolveGatewayBaseUrl(input?: string | null) {\n return normalizeAthenaGatewayBaseUrl(input, {\n defaultBaseUrl: ATHENA_DEFAULT_BASE_URL,\n });\n}\n\nfunction resolveProbePath(path?: string) {\n if (!path) return \"/\";\n if (!path.startsWith(\"/\")) {\n throw new AthenaGatewayError({\n code: \"INVALID_URL\",\n message: `Athena gateway probe path must start with \"/\". Received ${JSON.stringify(path)}.`,\n status: 0,\n hint: 'Use a leading slash such as \"/\" or \"/health\".',\n });\n }\n return path;\n}\n\nfunction mergeConnectionHeaders(\n baseHeaders: Record<string, string>,\n headers?: Record<string, string>,\n): Record<string, string> {\n const merged = {\n ...baseHeaders,\n ...(headers ?? {}),\n };\n\n if (!merged[\"X-Athena-Sdk\"] && !merged[\"x-athena-sdk\"]) {\n merged[\"X-Athena-Sdk\"] = SDK_HEADER_VALUE;\n }\n\n return merged;\n}\n\nasync function performConnectionCheck(\n baseUrl: string,\n requestHeaders: Record<string, string>,\n options?: AthenaGatewayConnectionOptions,\n): Promise<AthenaGatewayConnectionResult> {\n const path = resolveProbePath(options?.path);\n const url = buildAthenaGatewayUrl(baseUrl, path);\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: mergeConnectionHeaders(requestHeaders, options?.headers),\n signal: options?.signal,\n });\n const rawText = await response.text();\n const requestId = resolveRequestId(response.headers);\n const parsedBody = parseResponseBody(\n rawText ?? \"\",\n response.headers.get(\"content-type\"),\n );\n\n if (parsedBody.parseFailed) {\n const invalidJsonError = new AthenaGatewayError({\n code: \"INVALID_JSON\",\n message: \"Gateway probe returned malformed JSON\",\n status: response.status,\n method: \"GET\",\n requestId,\n hint: \"Verify the gateway response body is valid JSON.\",\n cause: rawText.slice(0, 300),\n });\n return {\n ok: false,\n reachable: true,\n status: response.status,\n statusText: resolveStatusText(response, parsedBody.parsed),\n baseUrl,\n url,\n error: invalidJsonError.message,\n errorDetails: detailsFromError(invalidJsonError),\n raw: parsedBody.parsed,\n };\n }\n\n const parsed = parsedBody.parsed;\n if (!response.ok) {\n const httpError = new AthenaGatewayError({\n code: \"HTTP_ERROR\",\n message: resolveErrorMessage(\n parsed,\n `Athena gateway GET ${path} failed with status ${response.status}`,\n ),\n status: response.status,\n method: \"GET\",\n requestId,\n hint: resolveErrorHint(parsed),\n });\n\n return {\n ok: false,\n reachable: true,\n status: response.status,\n statusText: resolveStatusText(response, parsed),\n baseUrl,\n url,\n error: httpError.message,\n errorDetails: detailsFromError(httpError),\n raw: parsed,\n };\n }\n\n return {\n ok: true,\n reachable: true,\n status: response.status,\n statusText: resolveStatusText(response, parsed),\n baseUrl,\n url,\n error: undefined,\n errorDetails: null,\n raw: parsed,\n };\n } catch (callError) {\n const message = callError instanceof Error ? callError.message : String(callError);\n const networkError = new AthenaGatewayError({\n code: \"NETWORK_ERROR\",\n message: `Network error while probing Athena gateway ${url}: ${message}`,\n method: \"GET\",\n cause: message,\n hint: \"Check gateway URL, DNS, and network reachability.\",\n });\n return {\n ok: false,\n reachable: false,\n status: 0,\n statusText: null,\n baseUrl,\n url,\n error: networkError.message,\n errorDetails: detailsFromError(networkError),\n raw: null,\n };\n }\n}\n\nexport async function verifyAthenaGatewayUrl(\n baseUrl: string,\n options?: AthenaGatewayConnectionOptions,\n): Promise<AthenaGatewayConnectionResult> {\n const normalizedBaseUrl = normalizeAthenaGatewayBaseUrl(baseUrl);\n return performConnectionCheck(normalizedBaseUrl, { \"X-Athena-Sdk\": SDK_HEADER_VALUE }, options);\n}\n\nasync function callAthena<T>(\n config: AthenaGatewayBaseOptions,\n endpoint: AthenaGatewayEndpointPath,\n method: AthenaGatewayMethod,\n payload: unknown,\n options?: AthenaGatewayCallOptions,\n): Promise<AthenaGatewayResponse<T>> {\n let baseUrl: string;\n try {\n baseUrl = resolveGatewayBaseUrl(options?.baseUrl ?? config.baseUrl);\n } catch (error) {\n return toInvalidUrlResponse<T>(error, endpoint, method);\n }\n\n const url = buildAthenaGatewayUrl(baseUrl, endpoint);\n const headers = buildHeaders(config, options);\n\n try {\n const requestInit: RequestInit = {\n method,\n headers,\n };\n if (method !== \"GET\") {\n requestInit.body = JSON.stringify(payload);\n }\n\n const response = await fetch(url, requestInit);\n\n const rawText = await response.text();\n const requestId = resolveRequestId(response.headers);\n const parsedBody = parseResponseBody(\n rawText ?? \"\",\n response.headers.get(\"content-type\"),\n );\n\n if (parsedBody.parseFailed) {\n const invalidJsonError = new AthenaGatewayError({\n code: \"INVALID_JSON\",\n message: \"Gateway returned malformed JSON\",\n status: response.status,\n endpoint,\n method,\n requestId,\n hint: \"Verify the gateway response body is valid JSON.\",\n cause: rawText.slice(0, 300),\n });\n return {\n ok: false,\n status: response.status,\n statusText: resolveStatusText(response, parsedBody.parsed),\n data: null,\n error: invalidJsonError.message,\n errorDetails: detailsFromError(invalidJsonError),\n raw: parsedBody.parsed,\n };\n }\n\n const parsed = parsedBody.parsed;\n const parsedPayload = isRecord(parsed) ? parsed : null;\n\n if (!response.ok) {\n const httpError = new AthenaGatewayError({\n code: \"HTTP_ERROR\",\n message: resolveErrorMessage(\n parsed,\n `Athena gateway ${method} ${endpoint} failed with status ${response.status}`,\n ),\n status: response.status,\n endpoint,\n method,\n requestId,\n hint: resolveErrorHint(parsed),\n });\n\n return {\n ok: false,\n status: response.status,\n statusText: resolveStatusText(response, parsed),\n data: null,\n error: httpError.message,\n errorDetails: detailsFromError(httpError),\n raw: parsed,\n };\n }\n\n // Unwrap envelope: API may return { data: [...], error: null } (e.g. when cached)\n // vs raw array when uncached. Use inner data when present to avoid double nesting.\n const payloadData =\n parsedPayload && \"data\" in parsedPayload\n ? (parsedPayload.data as T)\n : (parsed as T);\n const payloadCount =\n parsedPayload && \"count\" in parsedPayload\n ? typeof parsedPayload.count === \"number\" || parsedPayload.count === null\n ? (parsedPayload.count as number | null)\n : undefined\n : undefined;\n\n return {\n ok: true,\n status: response.status,\n statusText: resolveStatusText(response, parsed),\n data: payloadData ?? null,\n count: payloadCount,\n error: undefined,\n errorDetails: null,\n raw: parsed,\n };\n } catch (callError) {\n const message = callError instanceof Error ? callError.message : String(callError);\n const networkError = new AthenaGatewayError({\n code: \"NETWORK_ERROR\",\n message: `Network error while calling ${method} ${endpoint}: ${message}`,\n endpoint,\n method,\n cause: message,\n hint: \"Check gateway URL, DNS, and network reachability.\",\n });\n return {\n ok: false,\n status: 0,\n statusText: null,\n data: null,\n error: networkError.message,\n errorDetails: detailsFromError(networkError),\n raw: null,\n };\n }\n}\n\nexport interface AthenaGatewayClient {\n baseUrl: string;\n buildHeaders(options?: AthenaGatewayCallOptions): Record<string, string>;\n resolveCallOptions(\n options?: AthenaGatewayCallOptions,\n ): Promise<AthenaGatewayCallOptions | undefined>;\n verifyConnection(\n options?: AthenaGatewayConnectionOptions,\n ): Promise<AthenaGatewayConnectionResult>;\n fetchGateway<T>(\n payload: AthenaFetchPayload | AthenaFindManyAstPayload,\n options?: AthenaGatewayCallOptions,\n ): Promise<AthenaGatewayResponse<T>>;\n insertGateway<T>(\n payload: AthenaInsertPayload,\n options?: AthenaGatewayCallOptions,\n ): Promise<AthenaGatewayResponse<T>>;\n updateGateway<T>(\n payload: AthenaUpdatePayload,\n options?: AthenaGatewayCallOptions,\n ): Promise<AthenaGatewayResponse<T>>;\n deleteGateway<T>(\n payload: AthenaDeletePayload,\n options?: AthenaGatewayCallOptions,\n ): Promise<AthenaGatewayResponse<T>>;\n rpcGateway<T>(\n payload: AthenaRpcPayload,\n options?: AthenaRpcCallOptions,\n ): Promise<AthenaGatewayResponse<T>>;\n queryGateway<T>(\n payload: AthenaQueryPayload,\n options?: AthenaGatewayCallOptions,\n ): Promise<AthenaGatewayResponse<T>>;\n}\n\nexport function createAthenaGatewayClient(\n config: AthenaGatewayBaseOptions = {},\n): AthenaGatewayClient {\n const normalizedBaseUrl = resolveGatewayBaseUrl(config.baseUrl);\n const normalizedConfig: AthenaGatewayBaseOptions = {\n ...config,\n baseUrl: normalizedBaseUrl,\n };\n\n return {\n baseUrl: normalizedBaseUrl,\n buildHeaders(options) {\n return buildHeaders(normalizedConfig, options);\n },\n async resolveCallOptions(options) {\n return options;\n },\n verifyConnection(options) {\n return performConnectionCheck(\n normalizedBaseUrl,\n buildHeaders(normalizedConfig),\n options,\n );\n },\n fetchGateway(payload, options) {\n return callAthena(normalizedConfig, \"/gateway/fetch\", \"POST\", payload, options);\n },\n insertGateway(payload, options) {\n return callAthena(normalizedConfig, \"/gateway/insert\", \"PUT\", payload, options);\n },\n updateGateway(payload, options) {\n return callAthena(normalizedConfig, \"/gateway/update\", \"POST\", payload, options);\n },\n deleteGateway(payload, options) {\n return callAthena(normalizedConfig, \"/gateway/delete\", \"DELETE\", payload, options);\n },\n rpcGateway(payload, options) {\n if (options?.get) {\n const endpoint = buildRpcGetEndpoint(payload);\n return callAthena(normalizedConfig, endpoint, \"GET\", null, options);\n }\n return callAthena(normalizedConfig, \"/gateway/rpc\", \"POST\", payload, options);\n },\n queryGateway(payload, options) {\n return callAthena(normalizedConfig, \"/gateway/query\", \"POST\", payload, options);\n },\n };\n}\n\ntype AthenaGatewayCallOptionsResolver = () =>\n | AthenaGatewayCallOptions\n | undefined\n | Promise<AthenaGatewayCallOptions | undefined>;\n\nfunction mergeGatewayCallOptions(\n base?: AthenaGatewayCallOptions,\n override?: AthenaGatewayCallOptions,\n): AthenaGatewayCallOptions | undefined {\n if (!base && !override) return undefined;\n return {\n ...base,\n ...override,\n headers:\n base?.headers || override?.headers\n ? { ...(base?.headers ?? {}), ...(override?.headers ?? {}) }\n : undefined,\n };\n}\n\n/**\n * Creates a request-context view over one immutable gateway transport.\n * The resolver runs once for every operation; the underlying transport and\n * normalized route configuration are never reconstructed.\n */\nexport function createAthenaGatewayClientView(\n transport: AthenaGatewayClient,\n resolveContext: AthenaGatewayCallOptionsResolver,\n): AthenaGatewayClient {\n const resolveCallOptions = async (\n options?: AthenaGatewayCallOptions,\n ): Promise<AthenaGatewayCallOptions | undefined> =>\n mergeGatewayCallOptions(await resolveContext(), options);\n\n return {\n baseUrl: transport.baseUrl,\n buildHeaders(options) {\n return transport.buildHeaders(options);\n },\n resolveCallOptions,\n async verifyConnection(options) {\n const context = await resolveCallOptions();\n const contextHeaders = transport.buildHeaders(context);\n return transport.verifyConnection({\n ...options,\n headers: {\n ...contextHeaders,\n ...(options?.headers ?? {}),\n },\n });\n },\n async fetchGateway(payload, options) {\n return transport.fetchGateway(payload, await resolveCallOptions(options));\n },\n async insertGateway(payload, options) {\n return transport.insertGateway(payload, await resolveCallOptions(options));\n },\n async updateGateway(payload, options) {\n return transport.updateGateway(payload, await resolveCallOptions(options));\n },\n async deleteGateway(payload, options) {\n return transport.deleteGateway(payload, await resolveCallOptions(options));\n },\n async rpcGateway(payload, options) {\n return transport.rpcGateway(payload, await resolveCallOptions(options));\n },\n async queryGateway(payload, options) {\n return transport.queryGateway(payload, await resolveCallOptions(options));\n },\n };\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport type {\n AthenaDeletePayload,\n AthenaFetchPayload,\n AthenaGatewayCallLog,\n AthenaGatewayCallOptions,\n AthenaGatewayEndpointPath,\n AthenaGatewayHookConfig,\n AthenaGatewayHookResult,\n AthenaGatewayMethod,\n AthenaGatewayResponse,\n AthenaGatewayResponseLog,\n AthenaInsertPayload,\n AthenaRpcCallOptions,\n AthenaRpcPayload,\n AthenaUpdatePayload,\n} from \"./types.ts\";\nimport { createAthenaGatewayClient } from \"./client.ts\";\nimport { AthenaGatewayError } from \"./errors.ts\";\n\nexport function useAthenaGateway(\n config?: AthenaGatewayHookConfig,\n): AthenaGatewayHookResult {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [lastRequest, setLastRequest] = useState<AthenaGatewayCallLog | null>(\n null,\n );\n const [lastResponse, setLastResponse] =\n useState<AthenaGatewayResponseLog | null>(null);\n\n const client = useMemo(\n () =>\n createAthenaGatewayClient({\n client: config?.client,\n baseUrl: config?.baseUrl,\n apiKey: config?.apiKey,\n backend: config?.backend,\n publishEvent: config?.publishEvent,\n headers: config?.headers,\n userId: config?.userId,\n organizationId: config?.organizationId,\n }),\n [\n config?.baseUrl,\n config?.client,\n config?.apiKey,\n config?.backend,\n config?.publishEvent,\n config?.headers,\n config?.userId,\n config?.organizationId,\n ],\n );\n\n const callWithLifecycle = useCallback(\n async <T>(\n fn: () => Promise<AthenaGatewayResponse<T>>,\n metadata: {\n endpoint: string;\n method: string;\n payload: unknown;\n options?: AthenaGatewayCallOptions;\n },\n ): Promise<AthenaGatewayResponse<T>> => {\n const requestLog: AthenaGatewayCallLog = {\n endpoint: metadata.endpoint as AthenaGatewayEndpointPath,\n method: metadata.method as AthenaGatewayMethod,\n payload: metadata.payload,\n headers: client.buildHeaders(metadata.options),\n timestamp: new Date().toISOString(),\n };\n\n setLastRequest(requestLog);\n setIsLoading(true);\n setError(null);\n\n let response: AthenaGatewayResponse<T> | undefined;\n try {\n response = await fn();\n setLastResponse({ ...response, timestamp: new Date().toISOString() });\n\n if (!response.ok) {\n const failure = AthenaGatewayError.fromResponse(response, {\n endpoint: metadata.endpoint as AthenaGatewayEndpointPath,\n method: metadata.method as AthenaGatewayMethod,\n });\n setError(failure.message);\n throw failure;\n }\n\n return response;\n } catch (callError) {\n const message =\n callError instanceof Error ? callError.message : String(callError);\n const typedError =\n callError instanceof AthenaGatewayError\n ? callError\n : new AthenaGatewayError({\n code: \"UNKNOWN_ERROR\",\n message,\n endpoint: metadata.endpoint as AthenaGatewayEndpointPath,\n method: metadata.method as AthenaGatewayMethod,\n cause: message,\n });\n setError(message);\n setLastResponse({\n timestamp: new Date().toISOString(),\n status: typedError.status || response?.status || 0,\n ok: false,\n data: null,\n raw: null,\n error: typedError.message,\n errorDetails: typedError.toDetails(),\n });\n throw typedError;\n } finally {\n setIsLoading(false);\n }\n },\n [client],\n );\n\n const defaultStripNulls = true;\n\n const fetchGateway = useCallback(\n <T = unknown>(\n payload: AthenaFetchPayload,\n options?: AthenaGatewayCallOptions,\n ) => {\n const normalizedPayload: AthenaFetchPayload = {\n ...payload,\n conditions: payload.conditions ?? [],\n strip_nulls:\n payload.strip_nulls ?? options?.stripNulls ?? defaultStripNulls,\n };\n return callWithLifecycle<T>(\n () => client.fetchGateway<T>(normalizedPayload, options),\n {\n endpoint: \"/gateway/fetch\",\n method: \"POST\",\n payload: normalizedPayload,\n options,\n },\n );\n },\n [callWithLifecycle, client],\n );\n\n const insertGateway = useCallback(\n <T = unknown>(\n payload: AthenaInsertPayload,\n options?: AthenaGatewayCallOptions,\n ) =>\n callWithLifecycle<T>(() => client.insertGateway<T>(payload, options), {\n endpoint: \"/gateway/insert\",\n method: \"PUT\",\n payload,\n options,\n }),\n [callWithLifecycle, client],\n );\n\n const updateGateway = useCallback(\n <T = unknown>(\n payload: AthenaUpdatePayload,\n options?: AthenaGatewayCallOptions,\n ) => {\n const normalizedPayload: AthenaUpdatePayload = {\n ...payload,\n conditions: payload.conditions ?? [],\n strip_nulls:\n payload.strip_nulls ?? options?.stripNulls ?? defaultStripNulls,\n };\n return callWithLifecycle<T>(\n () => client.updateGateway<T>(normalizedPayload, options),\n {\n endpoint: \"/gateway/update\",\n method: \"POST\",\n payload: normalizedPayload,\n options,\n },\n );\n },\n [callWithLifecycle, client],\n );\n\n const deleteGateway = useCallback(\n <T = unknown>(\n payload: AthenaDeletePayload,\n options?: AthenaGatewayCallOptions,\n ) => {\n if (!payload.resource_id) {\n throw new Error(\n \"deleteGateway requires resource_id (the unique identifier of the record to delete)\",\n );\n }\n return callWithLifecycle<T>(\n () => client.deleteGateway<T>(payload, options),\n { endpoint: \"/gateway/delete\", method: \"DELETE\", payload, options },\n );\n },\n [callWithLifecycle, client],\n );\n\n const rpcGateway = useCallback(\n <T = unknown>(payload: AthenaRpcPayload, options?: AthenaRpcCallOptions) =>\n callWithLifecycle<T>(() => client.rpcGateway<T>(payload, options), {\n endpoint: options?.get ? `/rpc/${payload.function}` : \"/gateway/rpc\",\n method: options?.get ? \"GET\" : \"POST\",\n payload,\n options,\n }),\n [callWithLifecycle, client],\n );\n\n return {\n fetchGateway,\n insertGateway,\n updateGateway,\n deleteGateway,\n rpcGateway,\n isLoading,\n error,\n lastRequest,\n lastResponse,\n baseUrl: client.baseUrl,\n };\n}\n","import { isAthenaGatewayError } from '../gateway/errors.ts'\nimport type {\n AthenaQueryError,\n AthenaQueryResult,\n AthenaResponseLike,\n AthenaRetryCount,\n AthenaRetryDelay,\n QueryKey,\n} from './types.ts'\n\ntype RetryOptions = {\n retry?: AthenaRetryCount\n retryDelay?: AthenaRetryDelay\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction isPrimitive(value: unknown): value is string | number | boolean | null | undefined {\n return value == null || ['string', 'number', 'boolean'].includes(typeof value)\n}\n\nfunction encodePrimitive(value: string | number | boolean | null | undefined): string {\n if (value === null) return 'null:0:'\n if (value === undefined) return 'undefined:0:'\n if (typeof value === 'string') return `str:${value.length}:${value}`\n if (typeof value === 'number') {\n const serialized = Number.isFinite(value) ? String(value) : 'nan'\n return `num:${serialized.length}:${serialized}`\n }\n const serialized = value ? '1' : '0'\n return `bool:${serialized.length}:${serialized}`\n}\n\nfunction stableSerialize(value: unknown, seen: WeakSet<object>): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n\n const valueType = typeof value\n if (valueType === 'string') return `\"${value}\"`\n if (valueType === 'number') return Number.isFinite(value as number) ? String(value) : 'null'\n if (valueType === 'boolean') return (value as boolean) ? 'true' : 'false'\n if (valueType === 'bigint') return `${String(value)}n`\n if (valueType === 'symbol') return `symbol:${String(value)}`\n if (valueType === 'function') {\n const namedFunction = value as { name?: string }\n return `function:${namedFunction.name || 'anonymous'}`\n }\n\n if (value instanceof Date) return `date:${value.toISOString()}`\n\n if (Array.isArray(value)) {\n return `[${value.map(item => stableSerialize(item, seen)).join(',')}]`\n }\n\n if (valueType === 'object') {\n const objectValue = value as Record<string, unknown>\n if (seen.has(objectValue)) return '[circular]'\n seen.add(objectValue)\n const keys = Object.keys(objectValue).sort()\n const serialized = `{${keys\n .map(key => `${key}:${stableSerialize(objectValue[key], seen)}`)\n .join(',')}}`\n seen.delete(objectValue)\n return serialized\n }\n\n return String(value)\n}\n\nexport function safeSerializeQueryKey(queryKey: QueryKey): string {\n try {\n if (typeof queryKey === 'string') {\n return `key:${queryKey}`\n }\n\n if (Array.isArray(queryKey) && queryKey.every(isPrimitive)) {\n return `arr:${queryKey.map(item => encodePrimitive(item)).join('|')}`\n }\n\n return `ser:${stableSerialize(queryKey, new WeakSet<object>())}`\n } catch {\n try {\n return `fallback:${String(queryKey)}`\n } catch {\n return 'fallback:[unserializable-query-key]'\n }\n }\n}\n\nexport function sleep(ms: number): Promise<void> {\n if (ms <= 0) return Promise.resolve()\n return new Promise(resolve => {\n setTimeout(resolve, ms)\n })\n}\n\nfunction resolveRetryCount(retry: AthenaRetryCount | undefined): number {\n if (retry === false || retry == null) return 0\n if (!Number.isFinite(retry)) return 0\n return Math.max(0, Math.trunc(retry))\n}\n\nfunction resolveRetryDelay(retryDelay: AthenaRetryDelay | undefined, attempt: number): number {\n if (typeof retryDelay === 'function') {\n const resolved = retryDelay(attempt)\n if (!Number.isFinite(resolved)) return 0\n return Math.max(0, resolved)\n }\n if (typeof retryDelay === 'number') {\n if (!Number.isFinite(retryDelay)) return 0\n return Math.max(0, retryDelay)\n }\n return 0\n}\n\nexport async function runWithRetry<T>(\n execute: (attempt: number) => Promise<T>,\n options?: RetryOptions,\n): Promise<T> {\n const retries = resolveRetryCount(options?.retry)\n let attempt = 0\n\n for (;;) {\n attempt += 1\n try {\n return await execute(attempt)\n } catch (error) {\n if (attempt > retries) {\n throw error\n }\n const delay = resolveRetryDelay(options?.retryDelay, attempt)\n await sleep(delay)\n }\n }\n}\n\nfunction errorMessageFromUnknown(error: unknown): string {\n if (typeof error === 'string' && error.trim()) return error.trim()\n if (error instanceof Error && error.message.trim()) return error.message.trim()\n if (isRecord(error)) {\n const messageCandidate = error.message ?? error.error\n if (typeof messageCandidate === 'string' && messageCandidate.trim()) {\n return messageCandidate.trim()\n }\n }\n return 'Athena request failed'\n}\n\nexport function normalizeAthenaError(\n error: unknown,\n source?: unknown,\n): AthenaQueryError {\n if (\n isRecord(error) &&\n typeof error.message === 'string' &&\n (error.status === undefined || typeof error.status === 'number') &&\n (error.code === undefined || typeof error.code === 'string')\n ) {\n return {\n message: error.message,\n status: typeof error.status === 'number' ? error.status : undefined,\n code: typeof error.code === 'string' ? error.code : undefined,\n details: error.details,\n raw: error.raw ?? source ?? error,\n }\n }\n\n if (isAthenaGatewayError(error)) {\n const details = error.toDetails()\n return {\n message: details.message,\n status: details.status,\n code: details.code,\n details,\n raw: source ?? error,\n }\n }\n\n if (isRecord(source) && source.errorDetails && isRecord(source.errorDetails)) {\n const details = source.errorDetails\n return {\n message: errorMessageFromUnknown(error ?? source.error),\n status: typeof source.status === 'number' ? source.status : undefined,\n code: typeof details.code === 'string' ? details.code : undefined,\n details,\n raw: source,\n }\n }\n\n if (isRecord(source) && typeof source.status === 'number') {\n return {\n message: errorMessageFromUnknown(error),\n status: source.status,\n details: source,\n raw: source,\n }\n }\n\n return {\n message: errorMessageFromUnknown(error),\n raw: source ?? error,\n }\n}\n\nexport function isAthenaResponseLike<T>(value: unknown): value is AthenaResponseLike<T> {\n if (!isRecord(value)) return false\n if ('error' in value || 'errorDetails' in value) return true\n if ('status' in value && typeof value.status === 'number') {\n return 'data' in value || 'raw' in value\n }\n return (\n 'data' in value &&\n ('raw' in value || 'status' in value)\n )\n}\n\nexport function normalizeAthenaResult<TQueryFnData, TData = TQueryFnData>(\n value: unknown,\n select?: (data: TQueryFnData) => TData,\n): AthenaQueryResult<TData> {\n if (isAthenaResponseLike<TQueryFnData>(value)) {\n const status = typeof value.status === 'number' ? value.status : value.error != null ? 500 : 200\n if (value.error != null) {\n return {\n data: undefined,\n error: normalizeAthenaError(value.error, value),\n status,\n raw: value.raw ?? value,\n }\n }\n\n const hasData = 'data' in value\n const sourceData = hasData\n ? (value.data as TQueryFnData | null | undefined)\n : undefined\n const selectedData =\n sourceData === undefined\n ? undefined\n : sourceData === null\n ? (null as unknown as TData)\n : select\n ? select(sourceData)\n : (sourceData as unknown as TData)\n\n return {\n data: selectedData,\n error: null,\n status,\n raw: value.raw ?? value,\n }\n }\n\n const sourceData = value as TQueryFnData\n const selectedData = select\n ? select(sourceData)\n : (sourceData as unknown as TData)\n\n return {\n data: selectedData,\n error: null,\n status: 200,\n raw: value,\n }\n}\n","import type {\n AthenaMutationDefaults,\n AthenaMutationEvent,\n AthenaMutationRequestLog,\n AthenaMutationResultData,\n AthenaMutationState,\n AthenaQueryClientConfig,\n AthenaQueryDefaults,\n AthenaQueryEvent,\n AthenaQueryRequestLog,\n AthenaQueryResult,\n AthenaQueryState,\n AthenaRuntimeEvent,\n AthenaStateAdapter,\n AthenaUnsubscribe,\n QueryKey,\n} from './types.ts'\nimport { normalizeAthenaError, normalizeAthenaResult, runWithRetry, safeSerializeQueryKey } from './utils.ts'\n\ntype ExecuteQueryInput<TQueryFnData, TData> = {\n queryKey: QueryKey\n queryKeyToken: string\n queryFn: () => Promise<TQueryFnData>\n select?: (data: TQueryFnData) => TData\n retry?: number | false\n retryDelay?: number | ((attempt: number) => number)\n dedupe?: boolean\n force?: boolean\n}\n\ntype ExecuteMutationInput<TVariables, TMutationFnData, TData> = {\n mutationKey?: QueryKey\n mutationKeyToken: string\n variables: TVariables\n mutationFn: (variables: TVariables) => Promise<TMutationFnData>\n select?: (data: TMutationFnData) => TData\n retry?: number | false\n retryDelay?: number | ((attempt: number) => number)\n}\n\ntype QueryEntry = {\n key: string\n state: AthenaQueryState<unknown>\n listeners: Set<() => void>\n gcTimer?: ReturnType<typeof setTimeout>\n activeRequestId: number\n}\n\ntype MutationEntry = {\n key: string\n state: AthenaMutationState<unknown, unknown>\n listeners: Set<() => void>\n gcTimer?: ReturnType<typeof setTimeout>\n activeRequestId: number\n}\n\nfunction createInitialQueryState<TData>(initialData?: TData): AthenaQueryState<TData> {\n return {\n status: initialData === undefined ? 'idle' : 'success',\n isFetching: false,\n data: initialData,\n error: null,\n updatedAt: initialData === undefined ? undefined : Date.now(),\n }\n}\n\nfunction createInitialMutationState<TVariables, TData>(): AthenaMutationState<TVariables, TData> {\n return {\n status: 'idle',\n data: undefined,\n error: null,\n isLoading: false,\n lastVariables: undefined,\n lastResponse: undefined,\n updatedAt: undefined,\n }\n}\n\nfunction shouldUseMemoryCache(config: AthenaQueryClientConfig): boolean {\n return config.cache?.mode === 'memory'\n}\n\nexport class AthenaQueryClient {\n private readonly queryEntries = new Map<string, QueryEntry>()\n private readonly mutationEntries = new Map<string, MutationEntry>()\n private readonly inflightQueries = new Map<string, Promise<AthenaQueryResult<unknown>>>()\n private readonly eventSubscribers = new Set<(event: AthenaRuntimeEvent) => void>()\n private readonly adapters = new Set<AthenaStateAdapter>()\n private requestCounter = 0\n\n readonly config: AthenaQueryClientConfig\n readonly defaultQueryOptions: AthenaQueryDefaults\n readonly defaultMutationOptions: AthenaMutationDefaults\n\n constructor(config: AthenaQueryClientConfig = {}) {\n this.config = {\n cache: {\n mode: config.cache?.mode ?? 'none',\n staleTime: config.cache?.staleTime,\n gcTime: config.cache?.gcTime,\n },\n defaultQueryOptions: config.defaultQueryOptions,\n defaultMutationOptions: config.defaultMutationOptions,\n }\n this.defaultQueryOptions = {\n retry: config.defaultQueryOptions?.retry ?? 0,\n retryDelay: config.defaultQueryOptions?.retryDelay,\n refetchOnMount: config.defaultQueryOptions?.refetchOnMount ?? true,\n refetchOnWindowFocus: config.defaultQueryOptions?.refetchOnWindowFocus ?? false,\n refetchOnReconnect: config.defaultQueryOptions?.refetchOnReconnect ?? false,\n }\n this.defaultMutationOptions = {\n retry: config.defaultMutationOptions?.retry ?? 0,\n retryDelay: config.defaultMutationOptions?.retryDelay,\n }\n }\n\n getQueryKeyToken(queryKey: QueryKey): string {\n return safeSerializeQueryKey(queryKey)\n }\n\n getMutationKeyToken(mutationKey?: QueryKey): string {\n if (mutationKey == null) {\n return '__mutation__default__'\n }\n return safeSerializeQueryKey(mutationKey)\n }\n\n getQueryState<TData = unknown>(key: string): AthenaQueryState<TData> {\n const entry = this.ensureQueryEntry(key)\n return entry.state as AthenaQueryState<TData>\n }\n\n getMutationState<TVariables = unknown, TData = unknown>(\n key: string,\n ): AthenaMutationState<TVariables, TData> {\n const entry = this.ensureMutationEntry(key)\n return entry.state as AthenaMutationState<TVariables, TData>\n }\n\n subscribeQuery(key: string, listener: () => void): AthenaUnsubscribe {\n const entry = this.ensureQueryEntry(key)\n if (entry.gcTimer) {\n clearTimeout(entry.gcTimer)\n entry.gcTimer = undefined\n }\n entry.listeners.add(listener)\n return () => {\n const current = this.queryEntries.get(key)\n if (!current) return\n current.listeners.delete(listener)\n if (current.listeners.size === 0) {\n this.scheduleQueryGc(current)\n }\n }\n }\n\n subscribeMutation(key: string, listener: () => void): AthenaUnsubscribe {\n const entry = this.ensureMutationEntry(key)\n if (entry.gcTimer) {\n clearTimeout(entry.gcTimer)\n entry.gcTimer = undefined\n }\n entry.listeners.add(listener)\n return () => {\n const current = this.mutationEntries.get(key)\n if (!current) return\n current.listeners.delete(listener)\n if (current.listeners.size === 0) {\n this.scheduleMutationGc(current)\n }\n }\n }\n\n subscribeEvents(listener: (event: AthenaRuntimeEvent) => void): AthenaUnsubscribe {\n this.eventSubscribers.add(listener)\n return () => {\n this.eventSubscribers.delete(listener)\n }\n }\n\n attachAdapter(adapter: AthenaStateAdapter): AthenaUnsubscribe {\n this.adapters.add(adapter)\n return () => {\n this.adapters.delete(adapter)\n }\n }\n\n resetQuery(queryKey: QueryKey): void {\n const key = this.getQueryKeyToken(queryKey)\n const entry = this.ensureQueryEntry(key)\n entry.activeRequestId = ++this.requestCounter\n this.setQueryState(entry, createInitialQueryState(), 'query_reset')\n this.inflightQueries.delete(key)\n }\n\n resetMutation(mutationKey?: QueryKey): void {\n const key = this.getMutationKeyToken(mutationKey)\n const entry = this.ensureMutationEntry(key)\n entry.activeRequestId = ++this.requestCounter\n this.setMutationState(entry, createInitialMutationState(), 'mutation_reset')\n }\n\n async executeQuery<TQueryFnData, TData = TQueryFnData>(\n input: ExecuteQueryInput<TQueryFnData, TData>,\n ): Promise<AthenaQueryResult<TData>> {\n const entry = this.ensureQueryEntry(input.queryKeyToken)\n\n if (input.dedupe !== false) {\n const existing = this.inflightQueries.get(input.queryKeyToken)\n if (existing) {\n return existing as Promise<AthenaQueryResult<TData>>\n }\n }\n\n if (!input.force && shouldUseMemoryCache(this.config)) {\n const staleTime = this.config.cache?.staleTime ?? 0\n const hasFreshData =\n entry.state.status === 'success' &&\n entry.state.data !== undefined &&\n entry.state.updatedAt !== undefined &&\n Date.now() - entry.state.updatedAt <= staleTime\n if (hasFreshData) {\n return {\n data: entry.state.data as TData,\n error: null,\n status: 200,\n raw: entry.state.lastResponse ?? entry.state.data,\n __applied: true,\n } as AthenaQueryResult<TData>\n }\n }\n\n const requestId = ++this.requestCounter\n entry.activeRequestId = requestId\n\n const startRequestLog: AthenaQueryRequestLog = {\n requestId,\n queryKey: input.queryKey,\n queryKeyToken: input.queryKeyToken,\n attempt: 1,\n startedAt: Date.now(),\n }\n\n const loadingStatus = entry.state.data === undefined ? 'loading' : entry.state.status\n this.setQueryState(\n entry,\n {\n ...entry.state,\n status: loadingStatus,\n isFetching: true,\n error: null,\n lastRequest: startRequestLog,\n },\n 'query_updated',\n )\n\n const executionPromise = runWithRetry(\n async attempt => {\n const attemptRequestLog: AthenaQueryRequestLog = {\n ...startRequestLog,\n attempt,\n }\n\n if (entry.activeRequestId === requestId) {\n this.setQueryState(\n entry,\n {\n ...entry.state,\n lastRequest: attemptRequestLog,\n isFetching: true,\n },\n 'query_updated',\n )\n }\n\n const rawResult = await input.queryFn()\n const normalized = normalizeAthenaResult<TQueryFnData, TData>(rawResult, input.select)\n\n if (normalized.error) {\n throw {\n __athenaNormalizedError: normalized.error,\n __athenaStatus: normalized.status,\n __athenaRaw: normalized.raw,\n __athenaResponse: rawResult,\n }\n }\n\n return {\n normalized,\n response: rawResult,\n attempt,\n }\n },\n {\n retry: input.retry,\n retryDelay: input.retryDelay,\n },\n )\n .then(result => {\n const applied = entry.activeRequestId === requestId\n if (applied) {\n const finishedAt = Date.now()\n const doneRequestLog: AthenaQueryRequestLog = {\n ...startRequestLog,\n attempt: result.attempt,\n endedAt: finishedAt,\n }\n this.setQueryState(\n entry,\n {\n ...entry.state,\n status: 'success',\n isFetching: false,\n error: null,\n data: result.normalized.data,\n lastRequest: doneRequestLog,\n lastResponse: result.response,\n updatedAt: finishedAt,\n },\n 'query_updated',\n )\n }\n\n return {\n ...result.normalized,\n __applied: applied,\n } as AthenaQueryResult<TData>\n })\n .catch(error => {\n const wrapped =\n typeof error === 'object' && error !== null ? (error as Record<string, unknown>) : undefined\n\n const normalizedError = wrapped?.__athenaNormalizedError\n ? (wrapped.__athenaNormalizedError as ReturnType<typeof normalizeAthenaError>)\n : normalizeAthenaError(error)\n\n const status =\n typeof wrapped?.__athenaStatus === 'number'\n ? (wrapped.__athenaStatus as number)\n : normalizedError.status ?? 500\n\n const raw = wrapped?.__athenaRaw ?? normalizedError.raw ?? null\n const response = wrapped?.__athenaResponse ?? raw\n\n const applied = entry.activeRequestId === requestId\n if (applied) {\n const finishedAt = Date.now()\n const doneRequestLog: AthenaQueryRequestLog = {\n ...startRequestLog,\n endedAt: finishedAt,\n attempt:\n entry.state.lastRequest?.requestId === requestId\n ? entry.state.lastRequest.attempt\n : startRequestLog.attempt,\n }\n this.setQueryState(\n entry,\n {\n ...entry.state,\n status: 'error',\n isFetching: false,\n error: normalizedError,\n lastRequest: doneRequestLog,\n lastResponse: response,\n updatedAt: finishedAt,\n },\n 'query_updated',\n )\n }\n\n return {\n data: undefined,\n error: normalizedError,\n status,\n raw,\n __applied: applied,\n } as AthenaQueryResult<TData>\n })\n .finally(() => {\n const inflight = this.inflightQueries.get(input.queryKeyToken)\n if (inflight === executionPromise) {\n this.inflightQueries.delete(input.queryKeyToken)\n }\n })\n\n this.inflightQueries.set(input.queryKeyToken, executionPromise as Promise<AthenaQueryResult<unknown>>)\n\n return executionPromise\n }\n\n async executeMutation<TVariables, TMutationFnData, TData = TMutationFnData>(\n input: ExecuteMutationInput<TVariables, TMutationFnData, TData>,\n ): Promise<AthenaMutationResultData<TData>> {\n const entry = this.ensureMutationEntry(input.mutationKeyToken)\n const requestId = ++this.requestCounter\n entry.activeRequestId = requestId\n\n const startRequestLog: AthenaMutationRequestLog<TVariables> = {\n requestId,\n mutationKey: input.mutationKey,\n mutationKeyToken: input.mutationKeyToken,\n attempt: 1,\n startedAt: Date.now(),\n variables: input.variables,\n }\n\n this.setMutationState(\n entry,\n {\n ...entry.state,\n status: 'loading',\n isLoading: true,\n error: null,\n lastVariables: input.variables,\n lastRequest: startRequestLog,\n },\n 'mutation_updated',\n )\n\n try {\n const result = await runWithRetry(\n async attempt => {\n const attemptRequestLog: AthenaMutationRequestLog<TVariables> = {\n ...startRequestLog,\n attempt,\n }\n\n if (entry.activeRequestId === requestId) {\n this.setMutationState(\n entry,\n {\n ...entry.state,\n lastRequest: attemptRequestLog,\n isLoading: true,\n },\n 'mutation_updated',\n )\n }\n\n const rawResult = await input.mutationFn(input.variables)\n const normalized = normalizeAthenaResult<TMutationFnData, TData>(rawResult, input.select)\n if (normalized.error) {\n throw {\n __athenaNormalizedError: normalized.error,\n __athenaStatus: normalized.status,\n __athenaRaw: normalized.raw,\n __athenaResponse: rawResult,\n }\n }\n\n return {\n normalized,\n response: rawResult,\n attempt,\n }\n },\n {\n retry: input.retry,\n retryDelay: input.retryDelay,\n },\n )\n\n if (entry.activeRequestId === requestId) {\n const finishedAt = Date.now()\n const doneRequestLog: AthenaMutationRequestLog<TVariables> = {\n ...startRequestLog,\n attempt: result.attempt,\n endedAt: finishedAt,\n }\n this.setMutationState(\n entry,\n {\n ...entry.state,\n status: 'success',\n isLoading: false,\n data: result.normalized.data,\n error: null,\n lastVariables: input.variables,\n lastRequest: doneRequestLog,\n lastResponse: result.response,\n updatedAt: finishedAt,\n },\n 'mutation_updated',\n )\n }\n\n return result.normalized\n } catch (error) {\n const wrapped =\n typeof error === 'object' && error !== null ? (error as Record<string, unknown>) : undefined\n const normalizedError = wrapped?.__athenaNormalizedError\n ? (wrapped.__athenaNormalizedError as ReturnType<typeof normalizeAthenaError>)\n : normalizeAthenaError(error)\n\n const status =\n typeof wrapped?.__athenaStatus === 'number'\n ? (wrapped.__athenaStatus as number)\n : normalizedError.status ?? 500\n const raw = wrapped?.__athenaRaw ?? normalizedError.raw ?? null\n const response = wrapped?.__athenaResponse ?? raw\n\n if (entry.activeRequestId === requestId) {\n const finishedAt = Date.now()\n const doneRequestLog: AthenaMutationRequestLog<TVariables> = {\n ...startRequestLog,\n endedAt: finishedAt,\n attempt:\n entry.state.lastRequest?.requestId === requestId\n ? entry.state.lastRequest.attempt\n : startRequestLog.attempt,\n }\n\n this.setMutationState(\n entry,\n {\n ...entry.state,\n status: 'error',\n isLoading: false,\n error: normalizedError,\n lastVariables: input.variables,\n lastRequest: doneRequestLog,\n lastResponse: response,\n updatedAt: finishedAt,\n },\n 'mutation_updated',\n )\n }\n\n return {\n data: undefined,\n error: normalizedError,\n status,\n raw,\n }\n }\n }\n\n private ensureQueryEntry(key: string): QueryEntry {\n let entry = this.queryEntries.get(key)\n if (entry) return entry\n\n entry = {\n key,\n state: createInitialQueryState(),\n listeners: new Set(),\n activeRequestId: 0,\n }\n this.queryEntries.set(key, entry)\n return entry\n }\n\n private ensureMutationEntry(key: string): MutationEntry {\n let entry = this.mutationEntries.get(key)\n if (entry) return entry\n\n entry = {\n key,\n state: createInitialMutationState(),\n listeners: new Set(),\n activeRequestId: 0,\n }\n this.mutationEntries.set(key, entry)\n return entry\n }\n\n private scheduleQueryGc(entry: QueryEntry): void {\n const gcTime = shouldUseMemoryCache(this.config)\n ? Math.max(0, this.config.cache?.gcTime ?? 300_000)\n : Math.max(0, this.config.cache?.gcTime ?? 0)\n\n entry.gcTimer = setTimeout(() => {\n const current = this.queryEntries.get(entry.key)\n if (!current || current.listeners.size > 0) return\n this.queryEntries.delete(entry.key)\n this.inflightQueries.delete(entry.key)\n this.emitEvent({\n type: 'query_gc',\n key: entry.key,\n state: current.state,\n timestamp: Date.now(),\n })\n }, gcTime)\n }\n\n private scheduleMutationGc(entry: MutationEntry): void {\n const gcTime = shouldUseMemoryCache(this.config)\n ? Math.max(0, this.config.cache?.gcTime ?? 300_000)\n : Math.max(0, this.config.cache?.gcTime ?? 0)\n\n entry.gcTimer = setTimeout(() => {\n const current = this.mutationEntries.get(entry.key)\n if (!current || current.listeners.size > 0) return\n this.mutationEntries.delete(entry.key)\n }, gcTime)\n }\n\n private setQueryState(\n entry: QueryEntry,\n state: AthenaQueryState<unknown>,\n eventType: AthenaQueryEvent['type'],\n ): void {\n entry.state = state\n for (const listener of entry.listeners) {\n listener()\n }\n\n this.emitEvent({\n type: eventType,\n key: entry.key,\n state,\n timestamp: Date.now(),\n })\n }\n\n private setMutationState(\n entry: MutationEntry,\n state: AthenaMutationState<unknown, unknown>,\n eventType: AthenaMutationEvent['type'],\n ): void {\n entry.state = state\n for (const listener of entry.listeners) {\n listener()\n }\n\n this.emitEvent({\n type: eventType,\n key: entry.key,\n state,\n timestamp: Date.now(),\n })\n }\n\n private emitEvent(event: AthenaRuntimeEvent): void {\n for (const listener of this.eventSubscribers) {\n listener(event)\n }\n\n for (const adapter of this.adapters) {\n adapter.onEvent?.(event)\n if (event.type === 'query_updated' || event.type === 'query_reset' || event.type === 'query_gc') {\n adapter.onQueryUpdated?.(event)\n }\n if (event.type === 'mutation_updated' || event.type === 'mutation_reset') {\n adapter.onMutationUpdated?.(event)\n }\n }\n }\n}\n\nexport function createAthenaQueryClient(config?: AthenaQueryClientConfig): AthenaQueryClient {\n return new AthenaQueryClient(config)\n}\n\nexport function attachStateAdapter(\n client: AthenaQueryClient,\n adapter: AthenaStateAdapter,\n): AthenaUnsubscribe {\n return client.attachAdapter(adapter)\n}\n","import { createContext, createElement, useContext, useMemo, type ReactNode } from 'react'\nimport type { AthenaQueryClientConfig } from './types.ts'\nimport { AthenaQueryClient, createAthenaQueryClient } from './query-client.ts'\n\nconst AthenaQueryClientContext = createContext<AthenaQueryClient | null>(null)\n\nexport interface AthenaQueryClientProviderProps {\n client?: AthenaQueryClient\n config?: AthenaQueryClientConfig\n children: ReactNode\n}\n\nexport function AthenaQueryClientProvider(props: AthenaQueryClientProviderProps) {\n const memoizedClient = useMemo(() => {\n if (props.client) {\n return props.client\n }\n return createAthenaQueryClient(props.config)\n }, [props.client, props.config])\n\n return createElement(\n AthenaQueryClientContext.Provider,\n { value: memoizedClient },\n props.children,\n )\n}\n\nexport function useAthenaQueryClient(): AthenaQueryClient {\n const client = useContext(AthenaQueryClientContext)\n if (!client) {\n throw new Error(\n 'No AthenaQueryClient found. Wrap your component tree with AthenaQueryClientProvider.',\n )\n }\n return client\n}\n\nexport { AthenaQueryClientContext }\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from 'react'\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\nimport type {\n AthenaQueryResult,\n AthenaQueryState,\n UseQueryOptions,\n UseQueryResult,\n} from './types.ts'\nimport { useAthenaQueryClient } from './provider.ts'\n\ntype BrowserEventName = 'focus' | 'online'\n\ntype BrowserTarget = {\n addEventListener: (event: BrowserEventName, listener: () => void) => void\n removeEventListener: (event: BrowserEventName, listener: () => void) => void\n}\n\nfunction getBrowserTarget(): BrowserTarget | null {\n const maybeGlobal = globalThis as unknown as {\n addEventListener?: unknown\n removeEventListener?: unknown\n window?: unknown\n }\n\n const hasListeners = (value: unknown): value is BrowserTarget =>\n Boolean(value) &&\n typeof value === 'object' &&\n typeof (value as BrowserTarget).addEventListener === 'function' &&\n typeof (value as BrowserTarget).removeEventListener === 'function'\n\n if (hasListeners(maybeGlobal.window)) {\n return maybeGlobal.window\n }\n\n if (hasListeners(maybeGlobal)) {\n return maybeGlobal\n }\n\n return null\n}\n\nexport function useQuery<TQueryFnData, TData = TQueryFnData>(\n options: UseQueryOptions<TQueryFnData, TData>,\n): UseQueryResult<TData> {\n const client = useAthenaQueryClient()\n\n const queryKeyRef = useRef(options.queryKey)\n queryKeyRef.current = options.queryKey\n\n const queryFnRef = useRef(options.queryFn)\n queryFnRef.current = options.queryFn\n\n const selectRef = useRef(options.select)\n selectRef.current = options.select\n\n const onSuccessRef = useRef(options.onSuccess)\n onSuccessRef.current = options.onSuccess\n\n const onErrorRef = useRef(options.onError)\n onErrorRef.current = options.onError\n\n const onSettledRef = useRef(options.onSettled)\n onSettledRef.current = options.onSettled\n\n const enabledRef = useRef(options.enabled ?? true)\n enabledRef.current = options.enabled ?? true\n\n const retryRef = useRef(options.retry)\n retryRef.current = options.retry\n\n const retryDelayRef = useRef(options.retryDelay)\n retryDelayRef.current = options.retryDelay\n\n const initialDataRef = useRef(options.initialData)\n initialDataRef.current = options.initialData\n\n const refetchOnMountRef = useRef(options.refetchOnMount)\n refetchOnMountRef.current = options.refetchOnMount\n\n const refetchOnWindowFocusRef = useRef(options.refetchOnWindowFocus)\n refetchOnWindowFocusRef.current = options.refetchOnWindowFocus\n\n const refetchOnReconnectRef = useRef(options.refetchOnReconnect)\n refetchOnReconnectRef.current = options.refetchOnReconnect\n\n const queryKeyToken = useMemo(\n () => client.getQueryKeyToken(options.queryKey),\n [client, options.queryKey],\n )\n const activeQueryKeyTokenRef = useRef(queryKeyToken)\n activeQueryKeyTokenRef.current = queryKeyToken\n\n const subscribe = useCallback(\n (listener: () => void) => client.subscribeQuery(queryKeyToken, listener),\n [client, queryKeyToken],\n )\n\n const getSnapshot = useCallback(\n () => client.getQueryState<TData>(queryKeyToken),\n [client, queryKeyToken],\n )\n\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n const effectiveSnapshot = useMemo<AthenaQueryState<TData>>(() => {\n if (\n snapshot.status === 'idle' &&\n snapshot.data === undefined &&\n initialDataRef.current !== undefined\n ) {\n return {\n ...snapshot,\n status: 'success',\n data: initialDataRef.current,\n error: null,\n }\n }\n return snapshot\n }, [snapshot])\n\n const runQuery = useCallback(\n async (force = false): Promise<AthenaQueryResult<TData>> => {\n const result = await client.executeQuery<TQueryFnData, TData>({\n queryKey: queryKeyRef.current,\n queryKeyToken,\n queryFn: () => queryFnRef.current(),\n select: selectRef.current,\n retry:\n retryRef.current ??\n client.defaultQueryOptions.retry ??\n 0,\n retryDelay:\n retryDelayRef.current ??\n client.defaultQueryOptions.retryDelay,\n dedupe: true,\n force,\n })\n\n const internalResult = result as AthenaQueryResult<TData> & {\n __applied?: boolean\n }\n if (activeQueryKeyTokenRef.current !== queryKeyToken || internalResult.__applied === false) {\n return result\n }\n\n if (result.error) {\n onErrorRef.current?.(result.error)\n onSettledRef.current?.(result.data, result.error)\n return result\n }\n\n onSuccessRef.current?.(result.data as TData)\n onSettledRef.current?.(result.data, null)\n return result\n },\n [client, queryKeyToken],\n )\n\n const lastAutoKeyRef = useRef<string | null>(null)\n\n useEffect(() => {\n const refetchOnMount =\n refetchOnMountRef.current ?? client.defaultQueryOptions.refetchOnMount ?? true\n\n const isFirstRenderForKey = lastAutoKeyRef.current !== queryKeyToken\n lastAutoKeyRef.current = queryKeyToken\n\n if (!enabledRef.current) {\n return\n }\n\n const state = client.getQueryState(queryKeyToken)\n const shouldFetch = state.status === 'idle' || (isFirstRenderForKey && refetchOnMount)\n\n if (shouldFetch) {\n void runQuery(false)\n }\n }, [client, queryKeyToken, runQuery])\n\n useEffect(() => {\n const browser = getBrowserTarget()\n if (!browser || !enabledRef.current) {\n return undefined\n }\n\n const refetchOnWindowFocus =\n refetchOnWindowFocusRef.current ??\n client.defaultQueryOptions.refetchOnWindowFocus ??\n false\n\n if (!refetchOnWindowFocus) {\n return undefined\n }\n\n const onFocus = () => {\n if (!enabledRef.current) return\n void runQuery(true)\n }\n\n browser.addEventListener('focus', onFocus)\n return () => {\n browser.removeEventListener('focus', onFocus)\n }\n }, [client, runQuery])\n\n useEffect(() => {\n const browser = getBrowserTarget()\n if (!browser || !enabledRef.current) {\n return undefined\n }\n\n const refetchOnReconnect =\n refetchOnReconnectRef.current ??\n client.defaultQueryOptions.refetchOnReconnect ??\n false\n\n if (!refetchOnReconnect) {\n return undefined\n }\n\n const onReconnect = () => {\n if (!enabledRef.current) return\n void runQuery(true)\n }\n\n browser.addEventListener('online', onReconnect)\n return () => {\n browser.removeEventListener('online', onReconnect)\n }\n }, [client, runQuery])\n\n const refetch = useCallback(() => runQuery(true), [runQuery])\n\n const reset = useCallback(() => {\n client.resetQuery(queryKeyRef.current)\n }, [client])\n\n return {\n data: effectiveSnapshot.data,\n error: effectiveSnapshot.error,\n isLoading:\n effectiveSnapshot.status === 'loading' && effectiveSnapshot.data === undefined,\n isFetching: effectiveSnapshot.isFetching,\n isSuccess: effectiveSnapshot.status === 'success',\n isError: effectiveSnapshot.status === 'error',\n status: effectiveSnapshot.status,\n refetch,\n reset,\n lastResponse: effectiveSnapshot.lastResponse,\n lastRequest: effectiveSnapshot.lastRequest,\n }\n}\n","import { useCallback, useMemo, useRef } from 'react'\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\nimport type {\n UseMutationOptions,\n UseMutationResult,\n} from './types.ts'\nimport { useAthenaQueryClient } from './provider.ts'\n\nexport function useMutation<TVariables, TMutationFnData, TData = TMutationFnData>(\n options: UseMutationOptions<TVariables, TMutationFnData, TData>,\n): UseMutationResult<TVariables, TData> {\n const client = useAthenaQueryClient()\n\n const mutationKeyRef = useRef(options.mutationKey)\n mutationKeyRef.current = options.mutationKey\n\n const mutationFnRef = useRef(options.mutationFn)\n mutationFnRef.current = options.mutationFn\n\n const selectRef = useRef(options.select)\n selectRef.current = options.select\n\n const retryRef = useRef(options.retry)\n retryRef.current = options.retry\n\n const retryDelayRef = useRef(options.retryDelay)\n retryDelayRef.current = options.retryDelay\n\n const onMutateRef = useRef(options.onMutate)\n onMutateRef.current = options.onMutate\n\n const onSuccessRef = useRef(options.onSuccess)\n onSuccessRef.current = options.onSuccess\n\n const onErrorRef = useRef(options.onError)\n onErrorRef.current = options.onError\n\n const onSettledRef = useRef(options.onSettled)\n onSettledRef.current = options.onSettled\n\n const mutationKeyToken = useMemo(\n () => client.getMutationKeyToken(options.mutationKey),\n [client, options.mutationKey],\n )\n\n const subscribe = useCallback(\n (listener: () => void) => client.subscribeMutation(mutationKeyToken, listener),\n [client, mutationKeyToken],\n )\n\n const getSnapshot = useCallback(\n () => client.getMutationState<TVariables, TData>(mutationKeyToken),\n [client, mutationKeyToken],\n )\n\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n const mutateAsync = useCallback(\n async (variables: TVariables): Promise<TData> => {\n await onMutateRef.current?.(variables)\n\n const result = await client.executeMutation<TVariables, TMutationFnData, TData>({\n mutationKey: mutationKeyRef.current,\n mutationKeyToken,\n variables,\n mutationFn: currentVariables => mutationFnRef.current(currentVariables),\n select: selectRef.current,\n retry:\n retryRef.current ??\n client.defaultMutationOptions.retry ??\n 0,\n retryDelay:\n retryDelayRef.current ??\n client.defaultMutationOptions.retryDelay,\n })\n\n if (result.error) {\n onErrorRef.current?.(result.error, variables)\n onSettledRef.current?.(result.data, result.error, variables)\n throw result.error\n }\n\n const data = result.data as TData\n onSuccessRef.current?.(data, variables)\n onSettledRef.current?.(data, null, variables)\n return data\n },\n [client, mutationKeyToken],\n )\n\n const mutate = useCallback(\n (variables: TVariables) => {\n void mutateAsync(variables).catch(() => undefined)\n },\n [mutateAsync],\n )\n\n const reset = useCallback(() => {\n client.resetMutation(mutationKeyRef.current)\n }, [client])\n\n return {\n mutate,\n mutateAsync,\n data: snapshot.data,\n error: snapshot.error,\n isIdle: snapshot.status === 'idle',\n isLoading: snapshot.status === 'loading',\n isSuccess: snapshot.status === 'success',\n isError: snapshot.status === 'error',\n status: snapshot.status,\n reset,\n lastResponse: snapshot.lastResponse,\n lastVariables: snapshot.lastVariables,\n lastRequest: snapshot.lastRequest,\n }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type {\n AthenaAuthCallOptions,\n AthenaAuthErrorCode,\n AthenaAuthErrorDetails,\n AthenaAuthFetchCompatibleInput,\n AthenaAuthResult,\n AthenaAuthSessionResponse,\n} from '../auth/types.ts'\n\nexport interface UseSessionOptions {\n enabled?: boolean\n refetchOnMount?: boolean\n fetchInput?: AthenaAuthFetchCompatibleInput\n callOptions?: AthenaAuthCallOptions\n}\n\nexport interface UseSessionResult<\n TSessionData extends AthenaAuthSessionResponse = AthenaAuthSessionResponse,\n> {\n data: TSessionData | null\n error: AthenaAuthErrorDetails | null\n isPending: boolean\n isRefetching: boolean\n refetch: () => Promise<TSessionData | null>\n}\n\ntype SessionGetter<TSessionData extends AthenaAuthSessionResponse> = (\n input?: AthenaAuthFetchCompatibleInput,\n options?: AthenaAuthCallOptions,\n) => Promise<AthenaAuthResult<TSessionData>>\n\n/**\n * Anything `useSession` can resolve a `getSession` from:\n * - auth-ui compatibility client → top-level `getSession`\n * - `createClient(...)` → `auth.getSession`\n * - `createClient(...).auth` → `getSession` on bindings\n */\nexport type UseSessionAuthClient<\n TSessionData extends AthenaAuthSessionResponse = AthenaAuthSessionResponse,\n> =\n | { getSession: SessionGetter<TSessionData> }\n | { auth: { getSession: SessionGetter<TSessionData> } }\n\ntype InferSessionData<TClient> =\n TClient extends { getSession: (...args: unknown[]) => Promise<AthenaAuthResult<infer TSessionData>> }\n ? TSessionData extends AthenaAuthSessionResponse\n ? TSessionData\n : AthenaAuthSessionResponse\n : TClient extends {\n auth: { getSession: (...args: unknown[]) => Promise<AthenaAuthResult<infer TSessionData>> }\n }\n ? TSessionData extends AthenaAuthSessionResponse\n ? TSessionData\n : AthenaAuthSessionResponse\n : AthenaAuthSessionResponse\n\nfunction resolveGetSession<TSessionData extends AthenaAuthSessionResponse>(\n authClient: UseSessionAuthClient<TSessionData>,\n): SessionGetter<TSessionData> {\n if ('getSession' in authClient && typeof authClient.getSession === 'function') {\n return authClient.getSession\n }\n\n if (\n 'auth' in authClient &&\n authClient.auth &&\n typeof authClient.auth.getSession === 'function'\n ) {\n return authClient.auth.getSession\n }\n\n throw new Error('useSession requires an auth-capable client (createClient(...).auth)')\n}\n\n/**\n * Better Auth style session hook for Athena.\n *\n * Pass any of:\n * - `createClient({ url, key, auth: { url } })` — uses `client.auth.getSession`\n * - `createClient(...).auth` — auth bindings only\n *\n * @example\n * ```tsx\n * const athena = createClient({ url, key, auth: { url: \"/api/auth\" } })\n * const { data, isPending } = useSession(athena)\n * ```\n */\nexport function useSession<TClient extends UseSessionAuthClient>(\n authClient: TClient,\n options: UseSessionOptions = {},\n): UseSessionResult<InferSessionData<TClient>> {\n type SessionData = InferSessionData<TClient>\n const enabled = options.enabled ?? true\n const refetchOnMount = options.refetchOnMount ?? true\n\n const [data, setData] = useState<SessionData | null>(null)\n const [error, setError] = useState<AthenaAuthErrorDetails | null>(null)\n const [isPending, setIsPending] = useState<boolean>(enabled)\n const [isRefetching, setIsRefetching] = useState<boolean>(false)\n const requestIdRef = useRef(0)\n const mountedRef = useRef(true)\n const dataRef = useRef<SessionData | null>(null)\n const getSession = resolveGetSession<SessionData>(\n authClient as UseSessionAuthClient<SessionData>,\n )\n\n useEffect(() => {\n dataRef.current = data\n }, [data])\n\n const toFallbackErrorDetails = (\n code: AthenaAuthErrorCode,\n message: string,\n status: number,\n ): AthenaAuthErrorDetails => ({\n code,\n message,\n status,\n })\n\n const runFetch = useCallback(async () => {\n const requestId = ++requestIdRef.current\n const hasData = dataRef.current !== null\n\n if (hasData) {\n setIsRefetching(true)\n } else {\n setIsPending(true)\n }\n\n try {\n const result = await getSession(options.fetchInput, options.callOptions)\n if (!mountedRef.current || requestId !== requestIdRef.current) {\n return null\n }\n\n if (result.ok) {\n setData((result.data ?? null) as SessionData | null)\n setError(null)\n return (result.data ?? null) as SessionData | null\n }\n\n setError(\n result.errorDetails ??\n toFallbackErrorDetails(\n 'UNKNOWN_ERROR',\n result.error ?? 'Failed to fetch session',\n result.status,\n ),\n )\n return null\n } catch (requestError) {\n if (!mountedRef.current || requestId !== requestIdRef.current) {\n return null\n }\n\n const message =\n requestError instanceof Error ? requestError.message : 'Failed to fetch session'\n setError(toFallbackErrorDetails('NETWORK_ERROR', message, 0))\n return null\n } finally {\n if (mountedRef.current && requestId === requestIdRef.current) {\n setIsPending(false)\n setIsRefetching(false)\n }\n }\n }, [getSession, options.callOptions, options.fetchInput])\n\n useEffect(() => {\n mountedRef.current = true\n if (enabled && refetchOnMount) {\n void runFetch()\n } else {\n setIsPending(false)\n }\n return () => {\n mountedRef.current = false\n }\n }, [enabled, refetchOnMount, runFetch])\n\n const refetch = useCallback(async () => {\n return await runFetch()\n }, [runFetch])\n\n return {\n data,\n error,\n isPending,\n isRefetching,\n refetch,\n }\n}\n","import { useMemo } from 'react'\nimport type {\n AthenaAuthErrorDetails,\n AthenaAuthFetchCompatibleInput,\n AthenaAuthResult,\n AthenaAuthSessionResponse,\n AthenaAuthCallOptions,\n} from '../auth/types.ts'\nimport type { AthenaRequestContext } from '../v3-client.ts'\nimport {\n useSession,\n type UseSessionOptions,\n type UseSessionResult,\n} from './use-session.ts'\n\ntype SessionGetter<TSessionData extends AthenaAuthSessionResponse> = (\n input?: AthenaAuthFetchCompatibleInput,\n options?: AthenaAuthCallOptions,\n) => Promise<AthenaAuthResult<TSessionData>>\n\ntype AthenaContextScopedClient<\n TSessionData extends AthenaAuthSessionResponse = AthenaAuthSessionResponse,\n> = {\n auth: {\n getSession: SessionGetter<TSessionData>\n }\n withContext(context: AthenaRequestContext): unknown\n}\n\ntype InferSessionData<TClient> =\n TClient extends {\n auth: {\n getSession: (\n ...args: unknown[]\n ) => Promise<AthenaAuthResult<infer TSessionData>>\n }\n }\n ? TSessionData extends AthenaAuthSessionResponse\n ? TSessionData\n : AthenaAuthSessionResponse\n : AthenaAuthSessionResponse\n\ntype InferScopedClient<TClient> = TClient extends {\n withContext(context: AthenaRequestContext): infer TScopedClient\n}\n ? TScopedClient\n : TClient\n\nexport type UseAthenaSessionClientOptions = UseSessionOptions\n\nexport interface UseAthenaSessionClientResult<\n TClient,\n> {\n client: InferScopedClient<TClient>\n session: UseSessionResult<InferSessionData<TClient>>['data']\n userId: string | null\n organizationId: string | null\n error: AthenaAuthErrorDetails | null\n isPending: boolean\n isRefetching: boolean\n refetch: UseSessionResult<InferSessionData<TClient>>['refetch']\n}\n\nexport function useAthenaSessionClient<\n TClient extends AthenaContextScopedClient,\n>(\n baseClient: TClient,\n options: UseAthenaSessionClientOptions = {},\n): UseAthenaSessionClientResult<TClient> {\n const sessionState = useSession(baseClient, options)\n const scopedClient = useMemo(\n () =>\n (sessionState.data\n ? baseClient.withContext({\n userId: sessionState.data.user.id,\n organizationId: sessionState.data.session.activeOrganizationId,\n bearerToken: sessionState.data.session.token,\n sessionToken: sessionState.data.session.token,\n })\n : baseClient) as InferScopedClient<TClient>,\n [baseClient, sessionState.data],\n )\n const session =\n sessionState.data as UseAthenaSessionClientResult<TClient>['session']\n const refetch =\n sessionState.refetch as UseAthenaSessionClientResult<TClient>['refetch']\n\n return {\n client: scopedClient,\n session,\n userId: sessionState.data?.user.id ?? null,\n organizationId:\n sessionState.data?.session.activeOrganizationId ?? null,\n error: sessionState.error,\n isPending: sessionState.isPending,\n isRefetching: sessionState.isRefetching,\n refetch,\n } as UseAthenaSessionClientResult<TClient>\n}\n","import * as React from 'react'\nimport type { AthenaStorageCallOptions, AthenaStorageModule } from '../storage/module.ts'\nimport type {\n AthenaStorageFileUploadInput,\n AthenaStorageFileUploadResult,\n AthenaStorageUploadProgress,\n AthenaStorageUploadProgressHandler,\n AthenaStorageUploadSource,\n} from '../storage/file.ts'\n\nexport type UseStorageUploadInput =\n | AthenaStorageFileUploadInput\n | AthenaStorageUploadSource\n | readonly AthenaStorageUploadSource[]\n | ArrayLike<AthenaStorageUploadSource>\n\nexport interface UseStorageUploadOptions extends Omit<Partial<AthenaStorageFileUploadInput>, 'files' | 'onProgress'> {\n storage: Pick<AthenaStorageModule, 'file'>\n onProgress?: AthenaStorageUploadProgressHandler\n}\n\nexport interface UseStorageUploadResult {\n uploading: boolean\n progress: AthenaStorageUploadProgress | null\n percent: number\n error: unknown\n result: AthenaStorageFileUploadResult | null\n upload(\n input: UseStorageUploadInput,\n options?: AthenaStorageCallOptions,\n ): Promise<AthenaStorageFileUploadResult>\n abort(): void\n reset(): void\n}\n\nexport function useStorageUpload(options: UseStorageUploadOptions): UseStorageUploadResult {\n const {\n storage,\n onProgress,\n ...defaults\n } = options\n const [uploading, setUploading] = React.useState(false)\n const [progress, setProgress] = React.useState<AthenaStorageUploadProgress | null>(null)\n const [error, setError] = React.useState<unknown>(null)\n const [result, setResult] = React.useState<AthenaStorageFileUploadResult | null>(null)\n const controllerRef = React.useRef<AbortController | null>(null)\n\n const reset = React.useCallback(() => {\n setUploading(false)\n setProgress(null)\n setError(null)\n setResult(null)\n }, [])\n\n const abort = React.useCallback(() => {\n controllerRef.current?.abort()\n controllerRef.current = null\n }, [])\n\n const upload = React.useCallback(async (\n input: UseStorageUploadInput,\n callOptions?: AthenaStorageCallOptions,\n ) => {\n const controller = callOptions?.signal ? null : new AbortController()\n controllerRef.current = controller\n setUploading(true)\n setError(null)\n setResult(null)\n\n const request = normalizeHookUploadInput(defaults, input, progressEvent => {\n setProgress(progressEvent)\n onProgress?.(progressEvent)\n if (isStorageUploadInput(input)) {\n input.onProgress?.(progressEvent)\n }\n })\n\n try {\n const uploaded = await storage.file.upload(request, {\n ...callOptions,\n signal: callOptions?.signal ?? controller?.signal,\n })\n setResult(uploaded)\n return uploaded\n } catch (uploadError) {\n setError(uploadError)\n throw uploadError\n } finally {\n setUploading(false)\n if (controllerRef.current === controller) {\n controllerRef.current = null\n }\n }\n }, [defaults, onProgress, storage])\n\n return {\n uploading,\n progress,\n percent: progress?.aggregatePercent ?? 0,\n error,\n result,\n upload,\n abort,\n reset,\n }\n}\n\nfunction normalizeHookUploadInput(\n defaults: Omit<Partial<AthenaStorageFileUploadInput>, 'files' | 'onProgress'>,\n input: UseStorageUploadInput,\n onProgress: AthenaStorageUploadProgressHandler,\n): AthenaStorageFileUploadInput {\n if (isStorageUploadInput(input)) {\n return {\n ...defaults,\n ...input,\n onProgress,\n } as AthenaStorageFileUploadInput\n }\n return {\n ...defaults,\n files: input,\n onProgress,\n } as AthenaStorageFileUploadInput\n}\n\nfunction isStorageUploadInput(input: UseStorageUploadInput): input is AthenaStorageFileUploadInput {\n return Boolean(input)\n && typeof input === 'object'\n && 'files' in input\n && 's3_id' in input\n}\n","import * as React from 'react'\nimport type {\n AthenaStorageCallOptions,\n AthenaStorageModule,\n StorageListFilesResponse,\n} from '../storage/module.ts'\nimport type { AthenaStorageFileListInput } from '../storage/file.ts'\n\nexport interface UseStorageFilesOptions {\n storage: Pick<AthenaStorageModule, 'file'>\n input: AthenaStorageFileListInput | null | undefined\n enabled?: boolean\n callOptions?: AthenaStorageCallOptions\n refreshIntervalMs?: number\n}\n\nexport interface UseStorageFilesResult {\n files: StorageListFilesResponse['files']\n count: number\n loading: boolean\n error: unknown\n data: StorageListFilesResponse | null\n refetch(): Promise<StorageListFilesResponse | null>\n}\n\nexport function useStorageFiles(options: UseStorageFilesOptions): UseStorageFilesResult {\n const { storage, input, enabled = true, callOptions, refreshIntervalMs } = options\n const [data, setData] = React.useState<StorageListFilesResponse | null>(null)\n const [loading, setLoading] = React.useState(false)\n const [error, setError] = React.useState<unknown>(null)\n const requestIdRef = React.useRef(0)\n\n const refetch = React.useCallback(async () => {\n if (!input || !enabled) {\n setData(null)\n setError(null)\n setLoading(false)\n return null\n }\n\n const requestId = requestIdRef.current + 1\n requestIdRef.current = requestId\n setLoading(true)\n setError(null)\n\n try {\n const result = await storage.file.list(input, callOptions)\n if (requestIdRef.current === requestId) {\n setData(result)\n }\n return result\n } catch (listError) {\n if (requestIdRef.current === requestId) {\n setError(listError)\n setData(null)\n }\n throw listError\n } finally {\n if (requestIdRef.current === requestId) {\n setLoading(false)\n }\n }\n }, [callOptions, enabled, input, storage])\n\n React.useEffect(() => {\n void refetch().catch(() => {\n // Error is already stored in state.\n })\n }, [refetch])\n\n React.useEffect(() => {\n if (!enabled || !input || !refreshIntervalMs || refreshIntervalMs <= 0) {\n return\n }\n const globalObject = globalThis as typeof globalThis & {\n setInterval: typeof setInterval\n clearInterval: typeof clearInterval\n }\n const timer = globalObject.setInterval(() => {\n void refetch().catch(() => {\n // Error is already stored in state.\n })\n }, refreshIntervalMs)\n return () => globalObject.clearInterval(timer)\n }, [enabled, input, refetch, refreshIntervalMs])\n\n return {\n files: data?.files ?? [],\n count: data?.count ?? data?.files?.length ?? 0,\n loading,\n error,\n data,\n refetch,\n }\n}\n","import * as React from 'react'\nimport type {\n AthenaStorageCallOptions,\n AthenaStorageModule,\n StorageFileMutationResponse,\n} from '../storage/module.ts'\n\nexport interface UseStorageFileDeleteOptions {\n storage: Pick<AthenaStorageModule, 'file'>\n onSuccess?: (result: StorageFileMutationResponse | StorageFileMutationResponse[]) => void\n onError?: (error: unknown) => void\n}\n\nexport interface UseStorageFileDeleteResult {\n deleting: boolean\n error: unknown\n deleteFile(\n fileId: string | readonly string[],\n options?: AthenaStorageCallOptions,\n ): Promise<StorageFileMutationResponse | StorageFileMutationResponse[]>\n reset(): void\n}\n\nexport function useStorageFileDelete(\n options: UseStorageFileDeleteOptions,\n): UseStorageFileDeleteResult {\n const { storage, onSuccess, onError } = options\n const [deleting, setDeleting] = React.useState(false)\n const [error, setError] = React.useState<unknown>(null)\n\n const reset = React.useCallback(() => {\n setDeleting(false)\n setError(null)\n }, [])\n\n const deleteFile = React.useCallback(\n async (\n fileId: string | readonly string[],\n callOptions?: AthenaStorageCallOptions,\n ) => {\n setDeleting(true)\n setError(null)\n try {\n const result = await storage.file.delete(fileId as string & readonly string[], callOptions)\n onSuccess?.(result)\n return result\n } catch (deleteError) {\n setError(deleteError)\n onError?.(deleteError)\n throw deleteError\n } finally {\n setDeleting(false)\n }\n },\n [onError, onSuccess, storage],\n )\n\n return {\n deleting,\n error,\n deleteFile,\n reset,\n }\n}\n","import type { AnyModelDef, InsertOf, RowOf, UpdateOf } from './types.ts'\n\ntype ModelValueRecord = Record<string, unknown>\n\nexport type ModelFormNullishMode = 'empty-string' | 'undefined' | 'null'\n\ntype NullishValueByMode = {\n 'empty-string': ''\n undefined: undefined\n null: null\n}\n\ntype MapNullableToFormValue<TField, TMode extends ModelFormNullishMode> =\n null extends TField\n ? Exclude<TField, null> | NullishValueByMode[TMode]\n : TField\n\n/**\n * Form value shape derived from a model insert payload.\n * Nullable fields are remapped to the selected nullish representation.\n */\nexport type ModelFormValues<\n TModel extends AnyModelDef,\n TMode extends ModelFormNullishMode = 'empty-string',\n> = {\n [K in keyof InsertOf<TModel>]: MapNullableToFormValue<InsertOf<TModel>[K], TMode>\n}\n\n/**\n * Alias for deriving form value types from any model contract.\n */\nexport type FormValuesOf<\n TModel extends AnyModelDef,\n TMode extends ModelFormNullishMode = 'empty-string',\n> = ModelFormValues<TModel, TMode>\n\n/**\n * Default value shape for form initialization.\n */\nexport type ModelFormDefaults<\n TModel extends AnyModelDef,\n TMode extends ModelFormNullishMode = 'empty-string',\n> = Partial<ModelFormValues<TModel, TMode>>\n\nexport interface ToModelFormDefaultsOptions<TMode extends ModelFormNullishMode = 'empty-string'> {\n /**\n * Controls how nullable model values are represented in form defaults.\n * - `empty-string` (default): `null -> \"\"`\n * - `undefined`: `null -> undefined`\n * - `null`: keeps `null`\n */\n nullishMode?: TMode\n}\n\nexport interface ToModelPayloadOptions {\n /**\n * Converts `\"\"` into `null` for nullable model fields.\n * Defaults to `true`.\n */\n emptyStringAsNull?: boolean\n /**\n * Omits `undefined` keys from the outgoing payload.\n * Defaults to `true`.\n */\n stripUndefined?: boolean\n}\n\nfunction resolveNullishValue(mode: ModelFormNullishMode): '' | undefined | null {\n if (mode === 'undefined') return undefined\n if (mode === 'null') return null\n return ''\n}\n\nfunction isRecord(value: unknown): value is ModelValueRecord {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction isNullableColumn(model: AnyModelDef, key: string): boolean {\n const nullable = model.meta.nullable as Partial<Record<string, boolean>> | undefined\n return nullable?.[key] === true\n}\n\n/**\n * Normalizes model data into form-safe defaults using model nullability metadata.\n */\nexport function toModelFormDefaults<\n TModel extends AnyModelDef,\n TMode extends ModelFormNullishMode = 'empty-string',\n>(\n model: TModel,\n values?: Partial<RowOf<TModel>> | Partial<InsertOf<TModel>> | null,\n options?: ToModelFormDefaultsOptions<TMode>,\n): ModelFormDefaults<TModel, TMode> {\n const source = values as ModelValueRecord | null | undefined\n if (!isRecord(source)) {\n return {} as ModelFormDefaults<TModel, TMode>\n }\n\n const mode = options?.nullishMode ?? ('empty-string' as TMode)\n const nullishValue = resolveNullishValue(mode)\n const result: ModelValueRecord = {}\n\n for (const [key, value] of Object.entries(source)) {\n if (value === null && isNullableColumn(model, key)) {\n result[key] = nullishValue\n continue\n }\n result[key] = value\n }\n\n return result as ModelFormDefaults<TModel, TMode>\n}\n\n/**\n * Normalizes form values back into model-compatible insert/update payloads.\n */\nexport function toModelPayload<TModel extends AnyModelDef>(\n model: TModel,\n formValues: Partial<ModelFormValues<TModel, 'empty-string' | 'undefined' | 'null'>>,\n options?: ToModelPayloadOptions,\n): Partial<InsertOf<TModel>> {\n const emptyStringAsNull = options?.emptyStringAsNull ?? true\n const stripUndefined = options?.stripUndefined ?? true\n const result: ModelValueRecord = {}\n\n for (const [key, rawValue] of Object.entries(formValues as ModelValueRecord)) {\n if (rawValue === undefined && stripUndefined) {\n continue\n }\n\n if (emptyStringAsNull && rawValue === '' && isNullableColumn(model, key)) {\n result[key] = null\n continue\n }\n\n result[key] = rawValue\n }\n\n return result as Partial<InsertOf<TModel>>\n}\n\n/**\n * Runtime form adapter bound to a model contract.\n */\nexport interface ModelFormAdapter<TModel extends AnyModelDef> {\n model: TModel\n toDefaults<TMode extends ModelFormNullishMode = 'empty-string'>(\n values?: Partial<RowOf<TModel>> | Partial<InsertOf<TModel>> | null,\n options?: ToModelFormDefaultsOptions<TMode>,\n ): ModelFormDefaults<TModel, TMode>\n toInsert(\n values: Partial<ModelFormValues<TModel, 'empty-string' | 'undefined' | 'null'>>,\n options?: ToModelPayloadOptions,\n ): Partial<InsertOf<TModel>>\n toUpdate(\n values: Partial<ModelFormValues<TModel, 'empty-string' | 'undefined' | 'null'>>,\n options?: ToModelPayloadOptions,\n ): Partial<UpdateOf<TModel>>\n}\n\n/**\n * Creates a small model-aware adapter for form defaults and payload normalization.\n */\nexport function createModelFormAdapter<TModel extends AnyModelDef>(model: TModel): ModelFormAdapter<TModel> {\n return {\n model,\n toDefaults(values, options) {\n return toModelFormDefaults(model, values, options)\n },\n toInsert(values, options) {\n return toModelPayload(model, values, options) as Partial<InsertOf<TModel>>\n },\n toUpdate(values, options) {\n return toModelPayload(model, values, options) as Partial<UpdateOf<TModel>>\n },\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/gateway/errors.ts","../src/gateway/url.ts","../src/cookies/cookie-utils.ts","../src/cookies/index.ts","../src/utils/athena-request-headers.ts","../package.json","../src/sdk-version.ts","../src/gateway/client.ts","../src/gateway/use-athena-gateway.ts","../src/react/utils.ts","../src/react/query-client.ts","../src/react/provider.ts","../src/react/use-query.ts","../src/react/use-mutation.ts","../src/query-debug-ast.ts","../src/query/read-query.ts","../src/react/use-athena-read-query.ts","../src/react/use-session.ts","../src/react/use-athena-session-client.ts","../src/react/use-storage-upload.ts","../src/react/use-storage-files.ts","../src/react/use-storage-file-delete.ts","../src/schema/model-form.ts"],"names":["useState","useMemo","useCallback","isRecord","serialized","sourceData","selectedData","createContext","createElement","useContext","useRef","useSyncExternalStore","useEffect","relationColumns","result","rows","React","React2","React3"],"mappings":"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","file":"react.cjs","sourcesContent":["import type {\n AthenaGatewayEndpointPath,\n AthenaGatewayErrorCode,\n AthenaGatewayErrorDetails,\n AthenaGatewayMethod,\n AthenaGatewayResponse,\n} from './types.js'\n\nexport interface AthenaGatewayErrorInput {\n code: AthenaGatewayErrorCode\n message: string\n status?: number\n endpoint?: AthenaGatewayEndpointPath\n method?: AthenaGatewayMethod\n requestId?: string\n hint?: string\n cause?: string\n}\n\n/**\n * Canonical error for gateway failures.\n * Holds request context and machine-readable classification.\n */\nexport class AthenaGatewayError extends Error {\n readonly code: AthenaGatewayErrorCode\n readonly status: number\n readonly endpoint?: AthenaGatewayEndpointPath\n readonly method?: AthenaGatewayMethod\n readonly requestId?: string\n readonly hint?: string\n readonly causeDetail?: string\n\n constructor(input: AthenaGatewayErrorInput) {\n super(input.message)\n this.name = 'AthenaGatewayError'\n this.code = input.code\n this.status = input.status ?? 0\n this.endpoint = input.endpoint\n this.method = input.method\n this.requestId = input.requestId\n this.hint = input.hint\n this.causeDetail = input.cause\n }\n\n toDetails(): AthenaGatewayErrorDetails {\n return {\n code: this.code,\n message: this.message,\n status: this.status,\n endpoint: this.endpoint,\n method: this.method,\n requestId: this.requestId,\n hint: this.hint,\n cause: this.causeDetail,\n }\n }\n\n static fromResponse<T>(\n response: AthenaGatewayResponse<T>,\n fallback: Omit<AthenaGatewayErrorInput, 'code' | 'message' | 'status'>,\n ) {\n const details = response.errorDetails\n if (details) {\n return new AthenaGatewayError({\n code: details.code,\n message: details.message,\n status: details.status,\n endpoint: details.endpoint ?? fallback.endpoint,\n method: details.method ?? fallback.method,\n requestId: details.requestId ?? fallback.requestId,\n hint: details.hint,\n cause: details.cause,\n })\n }\n\n return new AthenaGatewayError({\n code: 'HTTP_ERROR',\n message: response.error ?? 'Gateway request failed',\n status: response.status,\n endpoint: fallback.endpoint,\n method: fallback.method,\n requestId: fallback.requestId,\n })\n }\n}\n\nexport function isAthenaGatewayError(error: unknown): error is AthenaGatewayError {\n return error instanceof AthenaGatewayError\n}\n","import { AthenaGatewayError } from './errors.ts'\n\nexport const ATHENA_DEFAULT_BASE_URL = 'https://mirror2.athena-cluster.com'\n\nfunction describeReceivedValue(value: unknown): string {\n if (value === undefined) return 'undefined'\n if (value === null) return 'null'\n if (typeof value === 'string') {\n return value.trim().length > 0 ? JSON.stringify(value) : 'an empty string'\n }\n return `${typeof value} ${JSON.stringify(value)}`\n}\n\nfunction invalidBaseUrlError(message: string, hint: string): AthenaGatewayError {\n return new AthenaGatewayError({\n code: 'INVALID_URL',\n message,\n status: 0,\n hint,\n })\n}\n\nexport interface NormalizeAthenaGatewayBaseUrlOptions {\n defaultBaseUrl?: string\n label?: string\n}\n\nexport function normalizeAthenaGatewayBaseUrl(\n input: string | null | undefined,\n options: NormalizeAthenaGatewayBaseUrlOptions = {},\n): string {\n const label = options.label ?? 'Athena gateway base URL'\n const candidate = input ?? options.defaultBaseUrl\n\n if (candidate === undefined || candidate === null) {\n throw invalidBaseUrlError(\n `${label} must be a non-empty absolute http(s) URL. Received ${describeReceivedValue(input)}.`,\n 'Set ATHENA_URL in the explicit env object (or pass createClient({ url, key })) to a full URL such as \"https://mirror2.athena-cluster.com\".',\n )\n }\n\n const trimmed = candidate.trim()\n if (!trimmed) {\n throw invalidBaseUrlError(\n `${label} must be a non-empty absolute http(s) URL. Received ${describeReceivedValue(candidate)}.`,\n 'Set ATHENA_URL in the explicit env object (or pass createClient({ url, key })) to a full URL such as \"https://mirror2.athena-cluster.com\".',\n )\n }\n\n let parsed: URL\n try {\n parsed = new URL(trimmed)\n } catch {\n throw invalidBaseUrlError(\n `${label} must be a valid absolute http(s) URL. Received ${describeReceivedValue(candidate)}.`,\n 'Use a full URL including the protocol, for example \"https://mirror2.athena-cluster.com\".',\n )\n }\n\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw invalidBaseUrlError(\n `${label} must use http or https. Received ${JSON.stringify(trimmed)}.`,\n 'Use an Athena gateway URL such as \"https://mirror2.athena-cluster.com\".',\n )\n }\n\n if (parsed.search || parsed.hash) {\n throw invalidBaseUrlError(\n `${label} must not include query parameters or hash fragments. Received ${JSON.stringify(trimmed)}.`,\n 'Pass only the base URL. Endpoint paths such as \"/gateway/fetch\" are appended by the SDK.',\n )\n }\n\n return parsed.toString().replace(/\\/+$/, '')\n}\n\nexport function buildAthenaGatewayUrl(baseUrl: string, path: string): string {\n if (!path.startsWith('/')) {\n throw invalidBaseUrlError(\n `Athena gateway path must start with \"/\". Received ${JSON.stringify(path)}.`,\n 'Use a leading slash such as \"/gateway/fetch\" or \"/\".',\n )\n }\n\n return `${baseUrl}${path}`\n}\n","import type { AthenaCookieOptions } from './types.ts'\n\nfunction tryDecode(str: string): string {\n if (str.indexOf('%') === -1) {\n return str\n }\n try {\n return decodeURIComponent(str)\n } catch {\n return str\n }\n}\n\nexport interface CookieAttributes {\n value: string\n 'max-age'?: number\n expires?: Date\n domain?: string\n path?: string\n secure?: boolean\n httponly?: boolean\n partitioned?: boolean\n samesite?: 'strict' | 'lax' | 'none'\n [key: string]: unknown\n}\n\nexport const SECURE_COOKIE_PREFIX = '__Secure-'\nexport const HOST_COOKIE_PREFIX = '__Host-'\n\n/**\n * Remove __Secure- or __Host- prefix from cookie name.\n */\nexport function stripSecureCookiePrefix(cookieName: string): string {\n if (cookieName.startsWith(SECURE_COOKIE_PREFIX)) {\n return cookieName.slice(SECURE_COOKIE_PREFIX.length)\n }\n if (cookieName.startsWith(HOST_COOKIE_PREFIX)) {\n return cookieName.slice(HOST_COOKIE_PREFIX.length)\n }\n return cookieName\n}\n\n/**\n * Split a comma-joined `Set-Cookie` header string into individual cookies.\n */\nexport function splitSetCookieHeader(setCookie: string): string[] {\n if (!setCookie) {\n return []\n }\n\n const result: string[] = []\n let start = 0\n let i = 0\n\n while (i < setCookie.length) {\n if (setCookie[i] === ',') {\n let j = i + 1\n while (j < setCookie.length && setCookie[j] === ' ') {\n j++\n }\n while (j < setCookie.length && setCookie[j] !== '=' && setCookie[j] !== ';' && setCookie[j] !== ',') {\n j++\n }\n\n if (j < setCookie.length && setCookie[j] === '=') {\n const part = setCookie.slice(start, i).trim()\n if (part) {\n result.push(part)\n }\n start = i + 1\n while (start < setCookie.length && setCookie[start] === ' ') {\n start++\n }\n i = start\n continue\n }\n }\n i++\n }\n\n const last = setCookie.slice(start).trim()\n if (last) {\n result.push(last)\n }\n\n return result\n}\n\nexport function parseSetCookieHeader(setCookie: string): Map<string, CookieAttributes> {\n const cookies = new Map<string, CookieAttributes>()\n const cookieArray = splitSetCookieHeader(setCookie)\n\n for (const cookieString of cookieArray) {\n const parts = cookieString.split(';').map((part) => part.trim())\n const [nameValue, ...attributes] = parts\n const [name, ...valueParts] = (nameValue || '').split('=')\n if (!name) {\n continue\n }\n\n const value = unquoteCookieValue(valueParts.join('='))\n const decodedValue = tryDecode(value)\n const attrObj: CookieAttributes = { value: decodedValue }\n\n for (const attribute of attributes) {\n const [attrName, ...attrValueParts] = attribute.split('=')\n const attrValue = attrValueParts.join('=')\n const normalizedAttrName = attrName.trim().toLowerCase()\n switch (normalizedAttrName) {\n case 'max-age':\n attrObj['max-age'] = attrValue ? parseInt(attrValue.trim(), 10) : undefined\n break\n case 'expires':\n attrObj.expires = attrValue ? new Date(attrValue.trim()) : undefined\n break\n case 'domain':\n attrObj.domain = attrValue ? attrValue.trim() : undefined\n break\n case 'path':\n attrObj.path = attrValue ? attrValue.trim() : undefined\n break\n case 'secure':\n attrObj.secure = true\n break\n case 'httponly':\n attrObj.httponly = true\n break\n case 'samesite':\n attrObj.samesite = attrValue ? (attrValue.trim().toLowerCase() as 'strict' | 'lax' | 'none') : undefined\n break\n case 'partitioned':\n attrObj.partitioned = true\n break\n default:\n attrObj[normalizedAttrName] = attrValue ? attrValue.trim() : true\n break\n }\n }\n\n cookies.set(name, attrObj)\n }\n\n return cookies\n}\n\nexport function toCookieOptions(attributes: CookieAttributes): AthenaCookieOptions {\n return {\n maxAge: attributes['max-age'],\n expires: attributes.expires,\n domain: attributes.domain,\n path: attributes.path,\n secure: attributes.secure,\n httpOnly: attributes.httponly,\n sameSite: attributes.samesite,\n partitioned: attributes.partitioned,\n }\n}\n\n/**\n * Cookie-name token char set per RFC 7230 §3.2.6.\n */\nexport const cookieNameRegex = /^[\\w!#$%&'*.^`|~+-]+$/\n\nfunction unquoteCookieValue(value: string): string {\n if (value.length < 2 || !value.startsWith('\"') || !value.endsWith('\"')) {\n return value\n }\n return value.slice(1, -1)\n}\n\n/**\n * Parse a `Cookie` header into a key/value map.\n */\nexport function parseCookies(cookieHeader: string): Map<string, string> {\n const cookies = cookieHeader.split('; ')\n const cookieMap = new Map<string, string>()\n cookies.forEach((cookie) => {\n const [name, value] = cookie.split(/=(.*)/s)\n cookieMap.set(name as string, value as string)\n })\n return cookieMap\n}\n\n/**\n * Add or replace a cookie in the request `Cookie` header.\n */\nexport function setRequestCookie(headers: Headers, name: string, value: string): void {\n const cookieMap = parseCookies(headers.get('cookie') || '')\n if (cookieNameRegex.test(name)) {\n cookieMap.set(name, value)\n }\n headers.set(\n 'cookie',\n Array.from(cookieMap, ([key, currentValue]) => `${key}=${encodeURIComponent(currentValue)}`).join('; '),\n )\n}\n\n/**\n * Merge `Set-Cookie` values into a `Cookie` header.\n */\nexport function applySetCookies(target: Headers, setCookieValues: Iterable<string>): void {\n const cookieMap = parseCookies(target.get('cookie') || '')\n for (const setCookie of setCookieValues) {\n for (const [name, attr] of parseSetCookieHeader(setCookie)) {\n if (cookieNameRegex.test(name)) {\n cookieMap.set(name, attr.value)\n }\n }\n }\n target.set(\n 'cookie',\n Array.from(cookieMap, ([key, currentValue]) => `${key}=${encodeURIComponent(currentValue)}`).join('; '),\n )\n}\n\nexport function setCookieToHeader(headers: Headers) {\n return (context: { response: Response }) => {\n const setCookieHeader = context.response.headers.get('set-cookie')\n if (!setCookieHeader) {\n return\n }\n applySetCookies(headers, [setCookieHeader])\n }\n}\n","import { decodeBase64UrlToString, encodeStringToBase64Url } from './base64.ts'\nimport {\n HOST_COOKIE_PREFIX,\n SECURE_COOKIE_PREFIX,\n parseCookies,\n parseSetCookieHeader,\n setCookieToHeader,\n setRequestCookie,\n splitSetCookieHeader,\n stripSecureCookiePrefix,\n toCookieOptions,\n} from './cookie-utils.ts'\nimport { signHmacBase64Url, signJwtHS256, verifyJwtHS256 } from './crypto.ts'\nimport { createAccountStore, createSessionStore, getAccountCookie, getChunkedCookie } from './session-store.ts'\nimport type {\n AthenaAuthCookie,\n AthenaAuthCookies,\n AthenaCookieContextRuntime,\n AthenaCookieOptions,\n AthenaCookiesOptions,\n AthenaCookieVersionResolver,\n AthenaGetCookieCacheConfig,\n AthenaSessionPair,\n} from './types.ts'\n\nconst DEFAULT_COOKIE_PREFIX = 'athena-auth'\nconst LEGACY_COOKIE_PREFIX = 'better-auth'\nconst DEFAULT_SESSION_MAX_AGE = 7 * 24 * 60 * 60\nconst DEFAULT_CACHE_MAX_AGE = 60 * 5\n\nfunction isProductionRuntime(): boolean {\n return typeof process !== 'undefined' && process.env?.NODE_ENV === 'production'\n}\n\nfunction getEnvironmentSecret(): string | undefined {\n if (typeof process === 'undefined') {\n return undefined\n }\n return process.env?.ATHENA_AUTH_SECRET || process.env?.BETTER_AUTH_SECRET || process.env?.AUTH_SECRET\n}\n\nfunction isDynamicBaseURLConfig(baseURL: AthenaCookiesOptions['baseURL']): boolean {\n return (\n typeof baseURL === 'object' &&\n baseURL !== null &&\n 'allowedHosts' in baseURL &&\n Array.isArray((baseURL as { allowedHosts?: unknown }).allowedHosts)\n )\n}\n\nfunction resolveCookiePrefixes(primaryPrefix: string): string[] {\n const prefixes = [primaryPrefix]\n if (!prefixes.includes(DEFAULT_COOKIE_PREFIX)) {\n prefixes.push(DEFAULT_COOKIE_PREFIX)\n }\n if (!prefixes.includes(LEGACY_COOKIE_PREFIX)) {\n prefixes.push(LEGACY_COOKIE_PREFIX)\n }\n return prefixes\n}\n\nfunction createError(message: string): Error {\n return new Error(`@xylex-group/athena/cookies: ${message}`)\n}\n\nfunction getSecretOrThrow(secret?: string): string {\n const resolved = secret || getEnvironmentSecret()\n if (!resolved) {\n throw createError(\n 'getCookieCache requires a secret. Pass `secret` or set ATHENA_AUTH_SECRET/BETTER_AUTH_SECRET/AUTH_SECRET.',\n )\n }\n return resolved\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') {\n return null\n }\n return value as Record<string, unknown>\n}\n\nfunction getSessionTokenFromPair(session: AthenaSessionPair): string {\n const token = session.session?.token\n if (typeof token !== 'string' || token.length === 0) {\n throw createError('setSessionCookie requires `session.session.token` to be a non-empty string.')\n }\n return token\n}\n\nasync function resolveCookieVersion(\n versionConfig: AthenaCookieVersionResolver | undefined,\n session: Record<string, unknown>,\n user: Record<string, unknown>,\n): Promise<string> {\n if (!versionConfig) {\n return '1'\n }\n if (typeof versionConfig === 'string') {\n return versionConfig\n }\n return versionConfig(session, user)\n}\n\nfunction getSessionCookieCacheName(cookiePrefix: string, cookieName: string, isSecure: boolean): string {\n return isSecure ? `${SECURE_COOKIE_PREFIX}${cookiePrefix}.${cookieName}` : `${cookiePrefix}.${cookieName}`\n}\n\nasync function setCookieValue(\n ctx: AthenaCookieContextRuntime,\n name: string,\n value: string,\n attributes: AthenaCookieOptions,\n): Promise<void> {\n const secret = ctx.context.secret\n if (secret && typeof ctx.setSignedCookie === 'function') {\n await ctx.setSignedCookie(name, value, secret, attributes)\n return\n }\n ctx.setCookie(name, value, attributes)\n}\n\nfunction parseJsonSafely<T>(value: string): T | null {\n try {\n return JSON.parse(value) as T\n } catch {\n return null\n }\n}\n\nfunction getIsSecureCookie(config: { isSecure?: boolean } | undefined): boolean {\n if (config?.isSecure !== undefined) {\n return config.isSecure\n }\n return isProductionRuntime()\n}\n\nexport function createCookieGetter(options: AthenaCookiesOptions) {\n const baseURLString = typeof options.baseURL === 'string' ? options.baseURL : undefined\n const dynamicProtocol =\n typeof options.baseURL === 'object' && options.baseURL !== null ? options.baseURL.protocol : undefined\n\n const secure =\n options.advanced?.useSecureCookies !== undefined\n ? options.advanced.useSecureCookies\n : dynamicProtocol === 'https'\n ? true\n : dynamicProtocol === 'http'\n ? false\n : baseURLString\n ? baseURLString.startsWith('https://')\n : isProductionRuntime()\n\n const secureCookiePrefix = secure ? SECURE_COOKIE_PREFIX : ''\n const crossSubdomainEnabled = !!options.advanced?.crossSubDomainCookies?.enabled\n const domain = crossSubdomainEnabled\n ? options.advanced?.crossSubDomainCookies?.domain || (baseURLString ? new URL(baseURLString).hostname : undefined)\n : undefined\n\n if (crossSubdomainEnabled && !domain && !isDynamicBaseURLConfig(options.baseURL)) {\n throw createError('baseURL is required when `crossSubDomainCookies.enabled` is true.')\n }\n\n function createCookie(cookieName: string, overrideAttributes: Partial<AthenaCookieOptions> = {}): AthenaAuthCookie {\n const prefix = options.advanced?.cookiePrefix || DEFAULT_COOKIE_PREFIX\n const name = options.advanced?.cookies?.[cookieName]?.name || `${prefix}.${cookieName}`\n const attributes = options.advanced?.cookies?.[cookieName]?.attributes || {}\n\n return {\n name: `${secureCookiePrefix}${name}`,\n attributes: {\n secure: !!secureCookiePrefix,\n sameSite: 'lax',\n path: '/',\n httpOnly: true,\n ...(crossSubdomainEnabled ? { domain } : {}),\n ...options.advanced?.defaultCookieAttributes,\n ...overrideAttributes,\n ...attributes,\n },\n }\n }\n\n return createCookie\n}\n\nexport function getCookies(options: AthenaCookiesOptions): AthenaAuthCookies {\n const createCookie = createCookieGetter(options)\n const sessionToken = createCookie('session_token', { maxAge: options.session?.expiresIn || DEFAULT_SESSION_MAX_AGE })\n const sessionData = createCookie('session_data', { maxAge: options.session?.cookieCache?.maxAge || DEFAULT_CACHE_MAX_AGE })\n const accountData = createCookie('account_data', { maxAge: options.session?.cookieCache?.maxAge || DEFAULT_CACHE_MAX_AGE })\n const dontRememberToken = createCookie('dont_remember')\n\n return {\n sessionToken: {\n name: sessionToken.name,\n attributes: sessionToken.attributes,\n },\n sessionData: {\n name: sessionData.name,\n attributes: sessionData.attributes,\n },\n dontRememberToken: {\n name: dontRememberToken.name,\n attributes: dontRememberToken.attributes,\n },\n accountData: {\n name: accountData.name,\n attributes: accountData.attributes,\n },\n }\n}\n\nexport async function setCookieCache(\n ctx: AthenaCookieContextRuntime,\n session: AthenaSessionPair,\n dontRememberMe: boolean,\n): Promise<void> {\n const cookieCacheConfig = ctx.context.options?.session?.cookieCache\n if (!cookieCacheConfig?.enabled) {\n return\n }\n\n const version = await resolveCookieVersion(\n cookieCacheConfig.version,\n session.session as Record<string, unknown>,\n session.user as Record<string, unknown>,\n )\n\n const sessionData = {\n session: session.session,\n user: session.user,\n updatedAt: Date.now(),\n version,\n }\n\n const baseAttributes = ctx.context.authCookies.sessionData.attributes\n const maxAge = dontRememberMe ? undefined : baseAttributes.maxAge\n const options: AthenaCookieOptions = {\n ...baseAttributes,\n maxAge,\n }\n const expiresAt = Date.now() + ((options.maxAge || 60) * 1000)\n const strategy = cookieCacheConfig.strategy || 'compact'\n const secret = getSecretOrThrow(ctx.context.secret)\n\n let encoded: string\n if (strategy === 'jwt') {\n encoded = await signJwtHS256(sessionData, secret, options.maxAge || DEFAULT_CACHE_MAX_AGE)\n } else if (strategy === 'jwe') {\n throw createError('`jwe` strategy is not supported by the SDK cookie helper.')\n } else {\n const signature = await signHmacBase64Url(\n secret,\n JSON.stringify({\n ...sessionData,\n expiresAt,\n }),\n )\n encoded = encodeStringToBase64Url(\n JSON.stringify({\n session: sessionData,\n expiresAt,\n signature,\n }),\n )\n }\n\n if (encoded.length > 4093) {\n const store = createSessionStore(ctx.context.authCookies.sessionData.name, options, ctx)\n const cookies = store.chunk(encoded, options)\n store.setCookies(cookies)\n } else {\n const store = createSessionStore(ctx.context.authCookies.sessionData.name, options, ctx)\n if (store.hasChunks()) {\n store.setCookies(store.clean())\n }\n ctx.setCookie(ctx.context.authCookies.sessionData.name, encoded, options)\n }\n}\n\nexport async function setSessionCookie(\n ctx: AthenaCookieContextRuntime,\n session: AthenaSessionPair,\n dontRememberMe?: boolean,\n overrides?: Partial<AthenaCookieOptions>,\n): Promise<void> {\n if (dontRememberMe === undefined && typeof ctx.getSignedCookie === 'function' && ctx.context.secret) {\n const existingFlag = await ctx.getSignedCookie(ctx.context.authCookies.dontRememberToken.name, ctx.context.secret)\n dontRememberMe = !!existingFlag\n }\n\n const resolvedDontRememberMe = dontRememberMe ?? false\n const token = getSessionTokenFromPair(session)\n const options = ctx.context.authCookies.sessionToken.attributes\n const maxAge = resolvedDontRememberMe ? undefined : ctx.context.sessionConfig?.expiresIn\n await setCookieValue(ctx, ctx.context.authCookies.sessionToken.name, token, {\n ...options,\n maxAge,\n ...overrides,\n })\n\n if (resolvedDontRememberMe) {\n await setCookieValue(\n ctx,\n ctx.context.authCookies.dontRememberToken.name,\n 'true',\n ctx.context.authCookies.dontRememberToken.attributes,\n )\n }\n\n await setCookieCache(ctx, session, resolvedDontRememberMe)\n ctx.context.setNewSession?.(session)\n}\n\n/**\n * Expires a cookie by setting `maxAge: 0` while preserving attributes.\n */\nexport function expireCookie(ctx: AthenaCookieContextRuntime, cookie: AthenaAuthCookie): void {\n ctx.setCookie(cookie.name, '', {\n ...cookie.attributes,\n maxAge: 0,\n })\n}\n\nexport function deleteSessionCookie(ctx: AthenaCookieContextRuntime, skipDontRememberMe?: boolean): void {\n expireCookie(ctx, ctx.context.authCookies.sessionToken)\n expireCookie(ctx, ctx.context.authCookies.sessionData)\n\n if (ctx.context.options?.account?.storeAccountCookie) {\n expireCookie(ctx, ctx.context.authCookies.accountData)\n const accountStore = createAccountStore(\n ctx.context.authCookies.accountData.name,\n ctx.context.authCookies.accountData.attributes,\n ctx,\n )\n accountStore.setCookies(accountStore.clean())\n }\n\n const sessionStore = createSessionStore(\n ctx.context.authCookies.sessionData.name,\n ctx.context.authCookies.sessionData.attributes,\n ctx,\n )\n sessionStore.setCookies(sessionStore.clean())\n\n if (!skipDontRememberMe) {\n expireCookie(ctx, ctx.context.authCookies.dontRememberToken)\n }\n}\n\nexport const getSessionCookie = (\n request: Request | Headers,\n config?:\n | {\n cookiePrefix?: string\n cookieName?: string\n path?: string\n }\n | undefined,\n): string | null => {\n const cookies = (request instanceof Headers || !('headers' in request) ? request : request.headers).get('cookie')\n if (!cookies) {\n return null\n }\n\n const { cookieName = 'session_token', cookiePrefix = 'athena-auth' } = config || {}\n const parsedCookie = parseCookies(cookies)\n const getCookie = (name: string): string | undefined =>\n parsedCookie.get(name) || parsedCookie.get(`${SECURE_COOKIE_PREFIX}${name}`)\n const candidateCookieNames = Array.from(new Set([\n cookieName,\n cookieName.replace(/_/g, '-'),\n cookieName.replace(/-/g, '_'),\n ])).filter(Boolean)\n for (const candidateName of candidateCookieNames) {\n const sessionToken =\n getCookie(`${cookiePrefix}.${candidateName}`) || getCookie(`${cookiePrefix}-${candidateName}`)\n if (sessionToken) {\n return sessionToken\n }\n }\n return null\n}\n\nexport const getCookieCache = async <\n SessionShape extends Record<string, unknown> = Record<string, unknown>,\n UserShape extends Record<string, unknown> = Record<string, unknown>,\n>(\n request: Request | Headers,\n config?: AthenaGetCookieCacheConfig<SessionShape, UserShape>,\n): Promise<{\n session: SessionShape\n user: UserShape\n updatedAt: number\n version?: string\n} | null> => {\n const headers = request instanceof Headers || !('headers' in request) ? request : request.headers\n const cookieHeader = headers.get('cookie')\n if (!cookieHeader) {\n return null\n }\n\n const parsedCookie = parseCookies(cookieHeader)\n const cookieName = config?.cookieName || 'session_data'\n const requestedPrefix = config?.cookiePrefix || DEFAULT_COOKIE_PREFIX\n const strategy = config?.strategy || 'compact'\n const cookiePrefixes = resolveCookiePrefixes(requestedPrefix)\n const isSecure = getIsSecureCookie(config)\n const secret = getSecretOrThrow(config?.secret)\n\n let sessionData: string | undefined\n\n for (const prefix of cookiePrefixes) {\n const candidate = getSessionCookieCacheName(prefix, cookieName, isSecure)\n const cookieValue = parsedCookie.get(candidate)\n if (cookieValue) {\n sessionData = cookieValue\n break\n }\n }\n\n if (!sessionData) {\n const reconstructedChunks: Array<{ index: number; value: string }> = []\n for (const prefix of cookiePrefixes) {\n const candidate = getSessionCookieCacheName(prefix, cookieName, isSecure)\n for (const [name, value] of parsedCookie.entries()) {\n if (!name.startsWith(`${candidate}.`)) {\n continue\n }\n const parts = name.split('.')\n const indexStr = parts[parts.length - 1]\n const index = parseInt(indexStr || '0', 10)\n if (!Number.isNaN(index)) {\n reconstructedChunks.push({ index, value })\n }\n }\n if (reconstructedChunks.length > 0) {\n break\n }\n }\n\n if (reconstructedChunks.length > 0) {\n reconstructedChunks.sort((left, right) => left.index - right.index)\n sessionData = reconstructedChunks.map((chunk) => chunk.value).join('')\n }\n }\n\n if (!sessionData) {\n return null\n }\n\n if (strategy === 'jwe') {\n throw createError(\n '`jwe` strategy is not supported by the SDK cookie helper. Use compact/jwt or pass cookie data through the auth server.',\n )\n }\n\n if (strategy === 'jwt') {\n const payload = await verifyJwtHS256<Record<string, unknown>>(sessionData, secret)\n if (!payload) {\n return null\n }\n const sessionRecord = asObject(payload.session)\n const userRecord = asObject(payload.user)\n const updatedAt = payload.updatedAt\n if (!sessionRecord || !userRecord || typeof updatedAt !== 'number') {\n return null\n }\n\n if (config?.version) {\n const cookieVersion = typeof payload.version === 'string' ? payload.version : '1'\n const expectedVersion =\n typeof config.version === 'string'\n ? config.version\n : await config.version(sessionRecord as SessionShape, userRecord as UserShape)\n if (cookieVersion !== expectedVersion) {\n return null\n }\n }\n\n return {\n session: sessionRecord as SessionShape,\n user: userRecord as UserShape,\n updatedAt,\n version: typeof payload.version === 'string' ? payload.version : undefined,\n }\n }\n\n const compactPayload = parseJsonSafely<{\n session: {\n session: SessionShape\n user: UserShape\n updatedAt: number\n version?: string\n }\n expiresAt: number\n signature: string\n }>(decodeBase64UrlToString(sessionData))\n\n if (!compactPayload) {\n return null\n }\n\n const expectedSignature = await signHmacBase64Url(\n secret,\n JSON.stringify({\n ...compactPayload.session,\n expiresAt: compactPayload.expiresAt,\n }),\n )\n\n if (expectedSignature !== compactPayload.signature) {\n return null\n }\n\n if (compactPayload.expiresAt <= Date.now()) {\n return null\n }\n\n const resolvedSession = compactPayload.session\n if (config?.version) {\n const cookieVersion = resolvedSession.version || '1'\n const expectedVersion =\n typeof config.version === 'string'\n ? config.version\n : await config.version(resolvedSession.session, resolvedSession.user)\n if (cookieVersion !== expectedVersion) {\n return null\n }\n }\n\n const sessionObject = asObject(resolvedSession.session)\n const userObject = asObject(resolvedSession.user)\n if (!sessionObject || !userObject) {\n return null\n }\n\n return {\n session: sessionObject as SessionShape,\n user: userObject as UserShape,\n updatedAt: resolvedSession.updatedAt,\n version: resolvedSession.version,\n }\n}\n\nexport {\n SESSION_COOKIE_PATTERNS,\n hasAuthSessionCookie,\n} from './session-cookie-detection.ts'\n\nexport {\n HOST_COOKIE_PREFIX,\n SECURE_COOKIE_PREFIX,\n createSessionStore,\n getAccountCookie,\n getChunkedCookie,\n parseCookies,\n parseSetCookieHeader,\n setCookieToHeader,\n setRequestCookie,\n splitSetCookieHeader,\n stripSecureCookiePrefix,\n toCookieOptions,\n}\n\nexport type {\n AthenaAuthCookie,\n AthenaAuthCookies,\n AthenaCookieContextRuntime,\n AthenaCookieOptions,\n AthenaCookiesOptions,\n AthenaGetCookieCacheConfig,\n}\n","import { getSessionCookie } from '../cookies/index.ts'\nimport type { BackendOption } from '../gateway/types.ts'\n\nexport type AthenaRequestHeaderProfile = 'gateway' | 'auth' | 'chat' | 'storage' | 'minimal'\n\nconst NO_CACHE_HEADER_VALUE = 'no-cache'\n\nconst API_KEY_HEADER_CANDIDATES = ['X-Athena-Key', 'x-athena-key', 'X-Api-Key', 'x-api-key', 'apikey'] as const\nconst ATHENA_KEY_HEADER_CANDIDATES = ['X-Athena-Key', 'x-athena-key'] as const\nconst SESSION_TOKEN_HEADER_CANDIDATES = ['X-Athena-Auth-Session-Token'] as const\nconst BEARER_MIRROR_HEADER_CANDIDATES = ['X-Athena-Auth-Bearer-Token'] as const\nconst CLIENT_HEADER_CANDIDATES = ['X-Athena-Client', 'x-athena-client'] as const\nconst PG_URI_HEADER_CANDIDATES = ['x-pg-uri'] as const\nconst JDBC_URI_HEADER_CANDIDATES = ['x-athena-jdbc-url', 'x-jdbc-url'] as const\n\ninterface AthenaRequestHeaderProfileRules {\n apiKeys: boolean\n routing: boolean\n authMirror: boolean\n authBearer: boolean\n contentType?: boolean\n accept?: boolean\n stripNullsDefault?: boolean\n}\n\nconst PROFILE_RULES: Record<AthenaRequestHeaderProfile, AthenaRequestHeaderProfileRules> = {\n gateway: { apiKeys: true, routing: true, authMirror: true, authBearer: false, contentType: true, stripNullsDefault: true },\n chat: { apiKeys: true, routing: true, authMirror: true, authBearer: true, accept: true },\n storage: { apiKeys: true, routing: true, authMirror: true, authBearer: false, contentType: true },\n auth: { apiKeys: true, routing: true, authMirror: false, authBearer: true, contentType: true },\n minimal: { apiKeys: false, routing: false, authMirror: false, authBearer: false },\n}\n\nexport interface BuildAthenaRequestHeadersInput {\n profile: AthenaRequestHeaderProfile\n sdkHeaderValue: string\n apiKey?: string | null\n client?: string | null\n userId?: string | null\n organizationId?: string | null\n backend?: BackendOption\n publishEvent?: string | null\n stripNulls?: boolean\n bearerToken?: string | null\n cookie?: string | null\n sessionToken?: string | null\n pgUri?: string | null\n jdbcUrl?: string | null\n forceNoCache?: boolean\n configHeaders?: Record<string, string>\n callHeaders?: Record<string, string>\n contentType?: string | null\n accept?: string | null\n}\n\n/** Shared config/call fields consumed by gateway, chat, auth, and `client.request(...)`. */\nexport interface AthenaRequestHeaderOverrideFields {\n apiKey?: string | null\n client?: string | null\n userId?: string | null\n organizationId?: string | null\n backend?: BackendOption\n publishEvent?: string | null\n stripNulls?: boolean\n bearerToken?: string | null\n cookie?: string | null\n sessionToken?: string | null\n pgUri?: string | null\n jdbcUrl?: string | null\n forceNoCache?: boolean\n headers?: Record<string, string>\n}\n\nexport type ResolvedRequestHeaderOverrides = Omit<\n BuildAthenaRequestHeadersInput,\n 'profile' | 'sdkHeaderValue' | 'contentType' | 'accept'\n>\n\nfunction normalizeHeaderValue(value?: string | null): string | undefined {\n return value ? value : undefined\n}\n\nfunction mergeExtraHeaders(\n configHeaders?: Record<string, string>,\n callHeaders?: Record<string, string>,\n): Record<string, string> {\n return { ...(configHeaders ?? {}), ...(callHeaders ?? {}) }\n}\n\nexport function hasHeaderIgnoreCase(\n headers: Record<string, string>,\n targetKey: string,\n): boolean {\n const normalizedTargetKey = targetKey.toLowerCase()\n return Object.keys(headers).some(key => key.toLowerCase() === normalizedTargetKey)\n}\n\nexport function resolveHeaderValue(\n headers: Record<string, string>,\n candidates: readonly string[],\n): string | undefined {\n for (const candidate of candidates) {\n const direct = normalizeHeaderValue(headers[candidate])\n if (direct) return direct\n }\n\n const loweredCandidates = new Set(candidates.map(candidate => candidate.toLowerCase()))\n for (const [key, value] of Object.entries(headers)) {\n if (!loweredCandidates.has(key.toLowerCase())) {\n continue\n }\n const normalized = normalizeHeaderValue(value)\n if (normalized) return normalized\n }\n\n return undefined\n}\n\nfunction isCacheControlHeaderName(name: string): boolean {\n return name.toLowerCase() === 'cache-control'\n}\n\nfunction normalizeBearerToken(value: string): string {\n const trimmed = value.trim()\n const match = trimmed.match(/^Bearer\\s+(.+)$/i)\n return match?.[1]?.trim() ?? trimmed\n}\n\nfunction resolveBearerTokenFromAuthorizationHeader(\n headers: Record<string, string>,\n): string | undefined {\n const authorization = resolveHeaderValue(headers, ['Authorization'])\n if (!authorization) {\n return undefined\n }\n\n const token = normalizeBearerToken(authorization)\n return token ? token : undefined\n}\n\nfunction resolveSessionTokenFromCookieHeader(\n headers: Record<string, string>,\n): string | undefined {\n const cookie = resolveHeaderValue(headers, ['Cookie'])\n if (!cookie) {\n return undefined\n }\n\n return getSessionCookie(new Headers({ cookie })) ?? undefined\n}\n\nfunction resolveBackendType(backend?: BackendOption): string | undefined {\n if (!backend) {\n return undefined\n }\n return typeof backend === 'string' ? backend : backend.type\n}\n\nexport function resolveRequestHeaderOverrides(\n config: AthenaRequestHeaderOverrideFields,\n options?: AthenaRequestHeaderOverrideFields,\n defaults?: Pick<AthenaRequestHeaderOverrideFields, 'client' | 'stripNulls'>,\n): ResolvedRequestHeaderOverrides {\n return {\n apiKey: options?.apiKey ?? config.apiKey,\n client: options?.client ?? config.client ?? defaults?.client,\n userId: options?.userId ?? config.userId,\n organizationId: options?.organizationId ?? config.organizationId,\n backend: options?.backend ?? config.backend,\n publishEvent: options?.publishEvent ?? config.publishEvent,\n stripNulls: options?.stripNulls ?? config.stripNulls ?? defaults?.stripNulls,\n bearerToken: options?.bearerToken ?? config.bearerToken,\n cookie: options?.cookie ?? config.cookie,\n sessionToken: options?.sessionToken ?? config.sessionToken,\n pgUri: options?.pgUri ?? config.pgUri,\n jdbcUrl: options?.jdbcUrl ?? config.jdbcUrl,\n forceNoCache: Boolean(config.forceNoCache || options?.forceNoCache),\n configHeaders: config.headers,\n callHeaders: options?.headers,\n }\n}\n\nexport function buildServiceRequestHeaders(\n profile: Exclude<AthenaRequestHeaderProfile, 'minimal'>,\n sdkHeaderValue: string,\n config: AthenaRequestHeaderOverrideFields,\n options?: AthenaRequestHeaderOverrideFields,\n extras?: Pick<BuildAthenaRequestHeadersInput, 'contentType' | 'accept'> & {\n client?: string | null\n stripNulls?: boolean\n },\n): Record<string, string> {\n const rules = PROFILE_RULES[profile]\n return buildAthenaRequestHeaders({\n profile,\n sdkHeaderValue,\n ...resolveRequestHeaderOverrides(config, options, {\n client: extras?.client ?? undefined,\n stripNulls: extras?.stripNulls ?? (rules.stripNullsDefault ? true : undefined),\n }),\n contentType: extras?.contentType ?? (rules.contentType ? 'application/json' : undefined),\n accept: extras?.accept ?? (rules.accept ? 'application/json' : undefined),\n })\n}\n\nexport function applyAthenaApiKeyHeaders(\n headers: Record<string, string>,\n apiKey?: string | null,\n): void {\n const resolvedApiKey = normalizeHeaderValue(apiKey)\n if (resolvedApiKey && !hasHeaderIgnoreCase(headers, 'X-Athena-Key')) {\n headers['X-Athena-Key'] = resolvedApiKey\n }\n}\n\nexport function applyAthenaAuthContextHeaders(\n headers: Record<string, string>,\n input: Pick<\n BuildAthenaRequestHeadersInput,\n 'bearerToken' | 'cookie' | 'sessionToken' | 'profile' | 'configHeaders' | 'callHeaders'\n >,\n): void {\n const mergedExtraHeaders = mergeExtraHeaders(input.configHeaders, input.callHeaders)\n const rules = PROFILE_RULES[input.profile]\n const explicitCookie = normalizeHeaderValue(input.cookie)\n if (explicitCookie) {\n mergedExtraHeaders.Cookie = explicitCookie\n }\n\n const explicitSessionToken =\n normalizeHeaderValue(input.sessionToken) ??\n resolveHeaderValue(mergedExtraHeaders, SESSION_TOKEN_HEADER_CANDIDATES)\n const derivedSessionToken =\n explicitSessionToken ?? resolveSessionTokenFromCookieHeader(mergedExtraHeaders)\n const cookieFromHeaders = resolveHeaderValue(mergedExtraHeaders, ['Cookie'])\n\n if (explicitCookie && !hasHeaderIgnoreCase(headers, 'Cookie')) {\n headers.Cookie = explicitCookie\n } else if (cookieFromHeaders && !hasHeaderIgnoreCase(headers, 'Cookie')) {\n headers.Cookie = cookieFromHeaders\n }\n\n const explicitBearerToken = (() => {\n const configured = normalizeHeaderValue(input.bearerToken)\n if (configured) {\n return normalizeBearerToken(configured)\n }\n const mirrored = resolveHeaderValue(mergedExtraHeaders, BEARER_MIRROR_HEADER_CANDIDATES)\n return mirrored ? normalizeBearerToken(mirrored) : undefined\n })()\n const derivedBearerToken =\n explicitBearerToken ?? resolveBearerTokenFromAuthorizationHeader(mergedExtraHeaders)\n\n if (rules.authBearer && derivedBearerToken && !hasHeaderIgnoreCase(headers, 'Authorization')) {\n headers.Authorization = `Bearer ${derivedBearerToken}`\n }\n\n if (rules.authMirror) {\n if (derivedSessionToken && !hasHeaderIgnoreCase(headers, 'X-Athena-Auth-Session-Token')) {\n headers['X-Athena-Auth-Session-Token'] = derivedSessionToken\n }\n if (derivedBearerToken && !hasHeaderIgnoreCase(headers, 'X-Athena-Auth-Bearer-Token')) {\n headers['X-Athena-Auth-Bearer-Token'] = derivedBearerToken\n }\n } else if (derivedSessionToken && !hasHeaderIgnoreCase(headers, 'X-Athena-Auth-Session-Token')) {\n headers['X-Athena-Auth-Session-Token'] = derivedSessionToken\n }\n}\n\nexport function applyAthenaPgUriHeaders(\n headers: Record<string, string>,\n input: Pick<BuildAthenaRequestHeadersInput, 'pgUri' | 'jdbcUrl' | 'configHeaders' | 'callHeaders'>,\n): void {\n const mergedExtraHeaders = mergeExtraHeaders(input.configHeaders, input.callHeaders)\n\n const pgUri =\n normalizeHeaderValue(input.pgUri) ??\n resolveHeaderValue(mergedExtraHeaders, PG_URI_HEADER_CANDIDATES)\n if (pgUri && !hasHeaderIgnoreCase(headers, 'x-pg-uri')) {\n headers['x-pg-uri'] = pgUri\n }\n\n const jdbcUrl =\n normalizeHeaderValue(input.jdbcUrl) ??\n resolveHeaderValue(mergedExtraHeaders, JDBC_URI_HEADER_CANDIDATES)\n if (jdbcUrl) {\n if (!hasHeaderIgnoreCase(headers, 'x-athena-jdbc-url')) {\n headers['x-athena-jdbc-url'] = jdbcUrl\n }\n if (!hasHeaderIgnoreCase(headers, 'x-jdbc-url')) {\n headers['x-jdbc-url'] = jdbcUrl\n }\n }\n}\n\n/**\n * Minimal gateway/data request headers used by many apps before they adopt\n * the full {@link buildAthenaRequestHeaders} profile model.\n *\n * Additive convenience — does not replace client-built headers. Prefer\n * `createClient({ client, key })` so the SDK sets these on every call.\n */\nexport function buildAthenaGatewayHeaders(input: {\n clientName?: string | null\n gatewayKey?: string | null\n headers?: Record<string, string | null | undefined>\n}): Record<string, string> {\n const trimmedClientName = input.clientName?.trim()\n const trimmedGatewayKey = input.gatewayKey?.trim()\n const merged: Record<string, string | null | undefined> = {\n ...(trimmedClientName\n ? {\n 'X-Athena-Client': trimmedClientName,\n }\n : {}),\n ...(trimmedGatewayKey\n ? {\n 'X-Api-Key': trimmedGatewayKey,\n 'X-Athena-Key': trimmedGatewayKey,\n }\n : {}),\n ...input.headers,\n }\n\n return Object.fromEntries(\n Object.entries(merged).flatMap(([key, value]) =>\n typeof value === 'string' && value.trim()\n ? ([[key, value.trim()]] as const)\n : [],\n ),\n )\n}\n\nexport function buildAthenaRequestHeaders(\n input: BuildAthenaRequestHeadersInput,\n): Record<string, string> {\n const forceNoCache = Boolean(input.forceNoCache)\n const mergedExtraHeaders = mergeExtraHeaders(input.configHeaders, input.callHeaders)\n const rules = PROFILE_RULES[input.profile]\n\n const headerClient = resolveHeaderValue(mergedExtraHeaders, CLIENT_HEADER_CANDIDATES)\n const finalClient = normalizeHeaderValue(input.client) ?? headerClient\n const finalApiKey =\n normalizeHeaderValue(input.apiKey) ??\n resolveHeaderValue(mergedExtraHeaders, API_KEY_HEADER_CANDIDATES)\n const finalAthenaKey =\n resolveHeaderValue(mergedExtraHeaders, ATHENA_KEY_HEADER_CANDIDATES) ?? finalApiKey\n\n const headers: Record<string, string> = {\n 'X-Athena-Sdk': input.sdkHeaderValue,\n }\n\n if (rules.contentType) {\n headers['Content-Type'] = input.contentType ?? 'application/json'\n }\n\n if (input.accept ?? rules.accept) {\n headers.Accept = input.accept ?? 'application/json'\n }\n\n if (rules.routing) {\n if (normalizeHeaderValue(input.userId)) {\n headers['X-User-Id'] = input.userId ?? ''\n }\n if (normalizeHeaderValue(input.organizationId)) {\n headers['X-Organization-Id'] = input.organizationId ?? ''\n }\n if (finalClient) {\n headers['X-Athena-Client'] = finalClient\n }\n\n const backendType = resolveBackendType(input.backend)\n if (backendType) {\n headers['X-Backend-Type'] = backendType\n }\n\n if (typeof input.stripNulls === 'boolean') {\n headers['X-Strip-Nulls'] = input.stripNulls ? 'true' : 'false'\n } else if (rules.stripNullsDefault) {\n headers['X-Strip-Nulls'] = 'true'\n }\n\n if (normalizeHeaderValue(input.publishEvent)) {\n headers['X-Publish-Event'] = input.publishEvent ?? ''\n }\n }\n\n if (rules.apiKeys && (finalApiKey || finalAthenaKey)) {\n applyAthenaApiKeyHeaders(headers, finalAthenaKey)\n }\n\n applyAthenaAuthContextHeaders(headers, input)\n applyAthenaPgUriHeaders(headers, input)\n\n const reservedClientHeaderKeys = new Set(CLIENT_HEADER_CANDIDATES.map(key => key.toLowerCase()))\n Object.entries(mergedExtraHeaders).forEach(([key, value]) => {\n if (reservedClientHeaderKeys.has(key.toLowerCase())) {\n return\n }\n if (forceNoCache && isCacheControlHeaderName(key)) {\n return\n }\n const normalized = normalizeHeaderValue(value)\n if (normalized) {\n headers[key] = normalized\n }\n })\n\n if (forceNoCache) {\n headers['Cache-Control'] = NO_CACHE_HEADER_VALUE\n }\n\n return headers\n}\n","{\n \"author\": \"floris@xylex.group\",\n \"bin\": {\n \"athena-js\": \"bin/athena-js.js\"\n },\n \"dependencies\": {\n \"blessed\": \"^0.1.81\",\n \"chalk\": \"^4.1.2\",\n \"cron-parser\": \"^4.9.0\",\n \"jose\": \"^6.2.3\",\n \"pg\": \"^8.16.0\",\n \"server-only\": \"^0.0.1\",\n \"use-sync-external-store\": \"^1.5.0\",\n \"uuid\": \"^9.0.1\",\n \"zod\": \"^4.0.1\"\n },\n \"description\": \"Athena JS SDK\",\n \"devDependencies\": {\n \"@react-email/components\": \"^1.0.12\",\n \"@react-email/render\": \"^2.0.8\",\n \"@types/blessed\": \"^0.1.25\",\n \"@types/node\": \"^20.10.5\",\n \"@types/pg\": \"^8.15.1\",\n \"@types/react\": \"^18.3.12\",\n \"@types/react-test-renderer\": \"^18.3.1\",\n \"@types/uuid\": \"^9.0.7\",\n \"@typescript-eslint/eslint-plugin\": \"^8.57.0\",\n \"@typescript-eslint/parser\": \"^8.57.0\",\n \"eslint\": \"^8.57.1\",\n \"express\": \"^4.22.2\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"react-test-renderer\": \"^18.3.1\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.7.0\",\n \"typescript\": \"^5.3.3\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"exports\": {\n \".\": {\n \"browser\": {\n \"default\": \"./dist/browser.js\",\n \"import\": \"./dist/browser.js\",\n \"require\": \"./dist/browser.cjs\",\n \"types\": \"./dist/browser.d.ts\"\n },\n \"default\": \"./dist/index.js\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\",\n \"types\": \"./dist/index.d.ts\"\n },\n \"./admin\": {\n \"default\": \"./dist/admin.js\",\n \"import\": \"./dist/admin.js\",\n \"require\": \"./dist/admin.cjs\",\n \"types\": \"./dist/admin.d.ts\"\n },\n \"./billing\": {\n \"default\": \"./dist/billing.js\",\n \"import\": \"./dist/billing.js\",\n \"require\": \"./dist/billing.cjs\",\n \"types\": \"./dist/billing.d.ts\"\n },\n \"./browser\": {\n \"default\": \"./dist/browser.js\",\n \"import\": \"./dist/browser.js\",\n \"require\": \"./dist/browser.cjs\",\n \"types\": \"./dist/browser.d.ts\"\n },\n \"./cookies\": {\n \"default\": \"./dist/cookies.js\",\n \"import\": \"./dist/cookies.js\",\n \"require\": \"./dist/cookies.cjs\",\n \"types\": \"./dist/cookies.d.ts\"\n },\n \"./next/client\": {\n \"default\": \"./dist/next/client.js\",\n \"import\": \"./dist/next/client.js\",\n \"require\": \"./dist/next/client.cjs\",\n \"types\": \"./dist/next/client.d.ts\"\n },\n \"./next/server\": {\n \"default\": \"./dist/next/server.js\",\n \"import\": \"./dist/next/server.js\",\n \"require\": \"./dist/next/server.cjs\",\n \"types\": \"./dist/next/server.d.ts\"\n },\n \"./organization\": {\n \"default\": \"./dist/organization.js\",\n \"import\": \"./dist/organization.js\",\n \"require\": \"./dist/organization.cjs\",\n \"types\": \"./dist/organization.d.ts\"\n },\n \"./package.json\": \"./package.json\",\n \"./react\": {\n \"default\": \"./dist/react.js\",\n \"import\": \"./dist/react.js\",\n \"require\": \"./dist/react.cjs\",\n \"types\": \"./dist/react.d.ts\"\n },\n \"./social-providers\": {\n \"default\": \"./dist/social-providers.js\",\n \"import\": \"./dist/social-providers.js\",\n \"require\": \"./dist/social-providers.cjs\",\n \"types\": \"./dist/social-providers.d.ts\"\n },\n \"./utils\": {\n \"default\": \"./dist/utils.js\",\n \"import\": \"./dist/utils.js\",\n \"require\": \"./dist/utils.cjs\",\n \"types\": \"./dist/utils.d.ts\"\n }\n },\n \"files\": [\n \"dist\",\n \"bin\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"keywords\": [\n \"database\",\n \"driver\",\n \"api-gateway\",\n \"sdk\",\n \"react\",\n \"hooks\",\n \"http\",\n \"postgres\",\n \"query-builder\"\n ],\n \"license\": \"MIT\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"name\": \"@xylex-group/athena\",\n \"peerDependencies\": {\n \"@react-email/components\": \">=1.0.0\",\n \"@react-email/render\": \">=2.0.0\",\n \"react\": \">=17.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@react-email/components\": {\n \"optional\": true\n },\n \"@react-email/render\": {\n \"optional\": true\n },\n \"react\": {\n \"optional\": true\n }\n },\n \"publisher\": \"XYLEX Group\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/xylex-group/athena-js.git\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"check:all\": \"pnpm lint && pnpm typecheck && pnpm test && pnpm build\",\n \"dev\": \"tsup --watch\",\n \"docs:methods\": \"node scripts/generate-sdk-method-reference.mjs\",\n \"docs:site:check\": \"pnpm --dir ../../apps/docs docs:sync-athena-js:check\",\n \"docs:site:sync\": \"pnpm --dir ../../apps/docs docs:sync-athena-js\",\n \"example:api-call\": \"cd examples/api-call && bun run start\",\n \"example:email-resend\": \"cd examples/email-resend && bun run start\",\n \"example:express-api\": \"cd examples/express-api && bun run start\",\n \"example:order-saga\": \"cd examples/order-saga && bun run start\",\n \"example:postgres-connection\": \"cd examples/postgres-connection && bun run start\",\n \"example:recurring-invoice\": \"cd examples/recurring-invoice && bun run start\",\n \"example:retry-patterns\": \"cd examples/retry-patterns && bun run start\",\n \"lint\": \"eslint \\\"src/**/*.ts\\\" \\\"test/**/*.ts\\\"\",\n \"lint:fix\": \"pnpm lint -- --fix\",\n \"prepublishOnly\": \"pnpm typecheck && pnpm build\",\n \"publish:token\": \"node scripts/publish.js\",\n \"test\": \"node --import ./test/register-server-only.mjs --import tsx --test --test-force-exit test/*.test.ts\",\n \"test:integration:postgres\": \"node scripts/run-postgres-introspection-test.mjs\",\n \"test:watch\": \"node --import ./test/register-server-only.mjs --import tsx --test --watch test/*.test.ts\",\n \"typecheck\": \"tsc -p tsconfig.typecheck.json\"\n },\n \"sideEffects\": false,\n \"type\": \"module\",\n \"types\": \"./dist/index.d.ts\",\n \"typesVersions\": {\n \"*\": {\n \"*\": [\n \"dist/index.d.ts\"\n ],\n \"admin\": [\n \"dist/admin.d.ts\"\n ],\n \"billing\": [\n \"dist/billing.d.ts\"\n ],\n \"browser\": [\n \"dist/browser.d.ts\"\n ],\n \"cookies\": [\n \"dist/cookies.d.ts\"\n ],\n \"next/client\": [\n \"dist/next/client.d.ts\"\n ],\n \"next/server\": [\n \"dist/next/server.d.ts\"\n ],\n \"organization\": [\n \"dist/organization.d.ts\"\n ],\n \"react\": [\n \"dist/react.d.ts\"\n ],\n \"social-providers\": [\n \"dist/social-providers.d.ts\"\n ],\n \"utils\": [\n \"dist/utils.d.ts\"\n ]\n }\n },\n \"version\": \"3.1.0\"\n}","import packageJson from '../package.json' with { type: 'json' }\n\nexport const PACKAGE_VERSION = packageJson.version\n\nexport function buildSdkHeaderValue(sdkName: string): string {\n return `${sdkName} ${PACKAGE_VERSION}`\n}\n","import type {\n AthenaGatewayBaseOptions,\n AthenaGatewayCallOptions,\n AthenaGatewayConnectionOptions,\n AthenaGatewayConnectionResult,\n AthenaGatewayEndpointPath,\n AthenaGatewayErrorDetails,\n AthenaGatewayMethod,\n AthenaRpcCallOptions,\n AthenaRpcPayload,\n AthenaGatewayResponse,\n} from \"./types.js\";\nimport type {\n AthenaDeletePayload,\n AthenaFetchPayload,\n AthenaInsertPayload,\n AthenaRpcFilter,\n AthenaUpdatePayload,\n AthenaQueryPayload,\n} from \"./types.js\";\nimport { AthenaGatewayError } from \"./errors.ts\";\nimport {\n ATHENA_DEFAULT_BASE_URL,\n buildAthenaGatewayUrl,\n normalizeAthenaGatewayBaseUrl,\n} from \"./url.ts\";\nimport { buildServiceRequestHeaders } from \"../utils/athena-request-headers.ts\";\nimport { buildSdkHeaderValue } from \"../sdk-version.ts\";\n\nconst DEFAULT_CLIENT = \"DEFAULT_CLIENT\";\nconst SDK_NAME = \"xylex-group/athena\";\nconst SDK_HEADER_VALUE = buildSdkHeaderValue(SDK_NAME);\nfunction parseResponseBody(rawText: string, contentType: string | null) {\n if (!rawText) {\n return { parsed: null as unknown, parseFailed: false };\n }\n\n const contentTypeSuggestsJson =\n contentType?.toLowerCase().includes(\"application/json\") ?? false;\n const looksJson =\n contentTypeSuggestsJson || rawText.startsWith(\"{\") || rawText.startsWith(\"[\");\n\n if (!looksJson) {\n return { parsed: rawText as unknown, parseFailed: false };\n }\n\n try {\n return { parsed: JSON.parse(rawText) as unknown, parseFailed: false };\n } catch {\n return { parsed: rawText as unknown, parseFailed: true };\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction resolveStructuredErrorPayload(payload: unknown): Record<string, unknown> | null {\n if (!isRecord(payload)) return null;\n return isRecord(payload.error) ? payload.error : payload;\n}\n\nfunction resolveRequestId(headers: Headers): string | undefined {\n return (\n headers.get(\"x-request-id\") ??\n headers.get(\"x-correlation-id\") ??\n headers.get(\"x-athena-request-id\") ??\n undefined\n );\n}\n\nfunction resolveErrorMessage(payload: unknown, fallback: string) {\n const structuredPayload = resolveStructuredErrorPayload(payload);\n if (structuredPayload) {\n const messageCandidates = [structuredPayload.message, structuredPayload.error, structuredPayload.details];\n for (const candidate of messageCandidates) {\n const resolved = nonEmptyString(candidate);\n if (resolved) return resolved;\n }\n }\n\n const rawMessage = nonEmptyString(payload);\n if (rawMessage) return rawMessage;\n\n return fallback;\n}\n\nfunction resolveErrorHint(payload: unknown): string | undefined {\n const structuredPayload = resolveStructuredErrorPayload(payload);\n return structuredPayload ? nonEmptyString(structuredPayload.hint) : undefined;\n}\n\nfunction resolveStatusText(response: Response, payload: unknown): string | null {\n const rawStatusText = nonEmptyString(response.statusText);\n if (rawStatusText) return rawStatusText;\n const payloadRecord = isRecord(payload) ? payload : null;\n return payloadRecord ? nonEmptyString(payloadRecord.statusText) ?? null : null;\n}\n\nfunction detailsFromError(error: AthenaGatewayError): AthenaGatewayErrorDetails {\n return error.toDetails();\n}\n\ninterface AthenaFindManyAstPayload {\n table_name: string;\n select: Record<string, unknown>;\n where?: Record<string, unknown>;\n orderBy?: Record<string, unknown>;\n limit?: number;\n}\n\nfunction toQueryScalar(value: unknown): string {\n if (value === null || value === undefined) return \"null\";\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n if (typeof value === \"number\") return Number.isFinite(value) ? String(value) : \"null\";\n return String(value);\n}\n\nfunction toQueryArray(values: unknown[]): string {\n return `{${values.map(toQueryScalar).join(\",\")}}`;\n}\n\nfunction toRpcArgumentQueryValue(value: unknown): string {\n if (Array.isArray(value)) return toQueryArray(value);\n if (value && typeof value === \"object\") return JSON.stringify(value);\n return toQueryScalar(value);\n}\n\nfunction toRpcFilterQueryValue(filter: AthenaRpcFilter): string {\n const value = filter.value;\n switch (filter.operator) {\n case \"in\": {\n if (!Array.isArray(value)) {\n throw new AthenaGatewayError({\n code: \"UNKNOWN_ERROR\",\n message: `RPC filter \"${filter.column}\" with operator \"in\" requires an array value`,\n status: 0,\n });\n }\n return `in.${toQueryArray(value)}`;\n }\n case \"is\":\n return `is.${toQueryScalar(value)}`;\n case \"eq\":\n case \"neq\":\n case \"gt\":\n case \"gte\":\n case \"lt\":\n case \"lte\":\n case \"like\":\n case \"ilike\":\n return `${filter.operator}.${toQueryScalar(value)}`;\n }\n}\n\nfunction buildRpcGetEndpoint(payload: AthenaRpcPayload): AthenaGatewayEndpointPath {\n const functionName = (payload.function_name ?? payload.function).trim();\n if (!functionName) {\n throw new AthenaGatewayError({\n code: \"UNKNOWN_ERROR\",\n message: \"rpc requires a function name\",\n status: 0,\n endpoint: \"/gateway/rpc\",\n method: \"GET\",\n });\n }\n\n const query = new URLSearchParams();\n if (payload.schema) query.set(\"schema\", payload.schema);\n if (payload.select) query.set(\"select\", payload.select);\n if (payload.count) query.set(\"count\", payload.count);\n if (payload.head) query.set(\"head\", \"true\");\n if (typeof payload.limit === \"number\") query.set(\"limit\", String(payload.limit));\n if (typeof payload.offset === \"number\") query.set(\"offset\", String(payload.offset));\n if (payload.order?.column) {\n query.set(\n \"order\",\n payload.order.ascending === false\n ? `${payload.order.column}.desc`\n : payload.order.column,\n );\n }\n\n if (payload.args) {\n for (const [key, value] of Object.entries(payload.args)) {\n query.set(key, toRpcArgumentQueryValue(value));\n }\n }\n\n if (payload.filters?.length) {\n for (const filter of payload.filters) {\n if (payload.args && Object.prototype.hasOwnProperty.call(payload.args, filter.column)) {\n throw new AthenaGatewayError({\n code: \"UNKNOWN_ERROR\",\n message: `RPC filter \"${filter.column}\" conflicts with RPC argument \"${filter.column}\" in GET mode`,\n status: 0,\n });\n }\n query.append(filter.column, toRpcFilterQueryValue(filter));\n }\n }\n\n const endpoint = `/rpc/${encodeURIComponent(functionName)}`;\n const queryText = query.toString();\n const withQuery = queryText ? `${endpoint}?${queryText}` : endpoint;\n return withQuery as AthenaGatewayEndpointPath;\n}\n\nfunction buildHeaders(\n config: AthenaGatewayBaseOptions,\n options?: AthenaGatewayCallOptions,\n): Record<string, string> {\n return buildServiceRequestHeaders(\"gateway\", SDK_HEADER_VALUE, config, options, {\n client: options?.client ?? config.client ?? DEFAULT_CLIENT,\n stripNulls: options?.stripNulls ?? true,\n });\n}\n\nfunction toInvalidUrlResponse<T>(\n error: unknown,\n endpoint: AthenaGatewayEndpointPath,\n method: AthenaGatewayMethod,\n): AthenaGatewayResponse<T> {\n const message = error instanceof Error ? error.message : String(error);\n const gatewayError =\n error instanceof AthenaGatewayError\n ? error\n : new AthenaGatewayError({\n code: \"INVALID_URL\",\n message,\n status: 0,\n endpoint,\n method,\n cause: message,\n hint: \"Set ATHENA_URL to a full http(s) URL before running queries.\",\n });\n\n return {\n ok: false,\n status: 0,\n statusText: null,\n data: null,\n error: gatewayError.message,\n errorDetails: detailsFromError(\n new AthenaGatewayError({\n code: gatewayError.code,\n message: gatewayError.message,\n status: gatewayError.status,\n endpoint,\n method,\n requestId: gatewayError.requestId,\n hint: gatewayError.hint,\n cause: gatewayError.causeDetail,\n }),\n ),\n raw: null,\n };\n}\n\nfunction resolveGatewayBaseUrl(input?: string | null) {\n return normalizeAthenaGatewayBaseUrl(input, {\n defaultBaseUrl: ATHENA_DEFAULT_BASE_URL,\n });\n}\n\nfunction resolveProbePath(path?: string) {\n if (!path) return \"/\";\n if (!path.startsWith(\"/\")) {\n throw new AthenaGatewayError({\n code: \"INVALID_URL\",\n message: `Athena gateway probe path must start with \"/\". Received ${JSON.stringify(path)}.`,\n status: 0,\n hint: 'Use a leading slash such as \"/\" or \"/health\".',\n });\n }\n return path;\n}\n\nfunction mergeConnectionHeaders(\n baseHeaders: Record<string, string>,\n headers?: Record<string, string>,\n): Record<string, string> {\n const merged = {\n ...baseHeaders,\n ...(headers ?? {}),\n };\n\n if (!merged[\"X-Athena-Sdk\"] && !merged[\"x-athena-sdk\"]) {\n merged[\"X-Athena-Sdk\"] = SDK_HEADER_VALUE;\n }\n\n return merged;\n}\n\nasync function performConnectionCheck(\n baseUrl: string,\n requestHeaders: Record<string, string>,\n options?: AthenaGatewayConnectionOptions,\n): Promise<AthenaGatewayConnectionResult> {\n const path = resolveProbePath(options?.path);\n const url = buildAthenaGatewayUrl(baseUrl, path);\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: mergeConnectionHeaders(requestHeaders, options?.headers),\n signal: options?.signal,\n });\n const rawText = await response.text();\n const requestId = resolveRequestId(response.headers);\n const parsedBody = parseResponseBody(\n rawText ?? \"\",\n response.headers.get(\"content-type\"),\n );\n\n if (parsedBody.parseFailed) {\n const invalidJsonError = new AthenaGatewayError({\n code: \"INVALID_JSON\",\n message: \"Gateway probe returned malformed JSON\",\n status: response.status,\n method: \"GET\",\n requestId,\n hint: \"Verify the gateway response body is valid JSON.\",\n cause: rawText.slice(0, 300),\n });\n return {\n ok: false,\n reachable: true,\n status: response.status,\n statusText: resolveStatusText(response, parsedBody.parsed),\n baseUrl,\n url,\n error: invalidJsonError.message,\n errorDetails: detailsFromError(invalidJsonError),\n raw: parsedBody.parsed,\n };\n }\n\n const parsed = parsedBody.parsed;\n if (!response.ok) {\n const httpError = new AthenaGatewayError({\n code: \"HTTP_ERROR\",\n message: resolveErrorMessage(\n parsed,\n `Athena gateway GET ${path} failed with status ${response.status}`,\n ),\n status: response.status,\n method: \"GET\",\n requestId,\n hint: resolveErrorHint(parsed),\n });\n\n return {\n ok: false,\n reachable: true,\n status: response.status,\n statusText: resolveStatusText(response, parsed),\n baseUrl,\n url,\n error: httpError.message,\n errorDetails: detailsFromError(httpError),\n raw: parsed,\n };\n }\n\n return {\n ok: true,\n reachable: true,\n status: response.status,\n statusText: resolveStatusText(response, parsed),\n baseUrl,\n url,\n error: undefined,\n errorDetails: null,\n raw: parsed,\n };\n } catch (callError) {\n const message = callError instanceof Error ? callError.message : String(callError);\n const networkError = new AthenaGatewayError({\n code: \"NETWORK_ERROR\",\n message: `Network error while probing Athena gateway ${url}: ${message}`,\n method: \"GET\",\n cause: message,\n hint: \"Check gateway URL, DNS, and network reachability.\",\n });\n return {\n ok: false,\n reachable: false,\n status: 0,\n statusText: null,\n baseUrl,\n url,\n error: networkError.message,\n errorDetails: detailsFromError(networkError),\n raw: null,\n };\n }\n}\n\nexport async function verifyAthenaGatewayUrl(\n baseUrl: string,\n options?: AthenaGatewayConnectionOptions,\n): Promise<AthenaGatewayConnectionResult> {\n const normalizedBaseUrl = normalizeAthenaGatewayBaseUrl(baseUrl);\n return performConnectionCheck(normalizedBaseUrl, { \"X-Athena-Sdk\": SDK_HEADER_VALUE }, options);\n}\n\nasync function callAthena<T>(\n config: AthenaGatewayBaseOptions,\n endpoint: AthenaGatewayEndpointPath,\n method: AthenaGatewayMethod,\n payload: unknown,\n options?: AthenaGatewayCallOptions,\n): Promise<AthenaGatewayResponse<T>> {\n let baseUrl: string;\n try {\n baseUrl = resolveGatewayBaseUrl(options?.baseUrl ?? config.baseUrl);\n } catch (error) {\n return toInvalidUrlResponse<T>(error, endpoint, method);\n }\n\n const url = buildAthenaGatewayUrl(baseUrl, endpoint);\n const headers = buildHeaders(config, options);\n\n try {\n const requestInit: RequestInit = {\n method,\n headers,\n };\n if (method !== \"GET\") {\n requestInit.body = JSON.stringify(payload);\n }\n\n const response = await fetch(url, requestInit);\n\n const rawText = await response.text();\n const requestId = resolveRequestId(response.headers);\n const parsedBody = parseResponseBody(\n rawText ?? \"\",\n response.headers.get(\"content-type\"),\n );\n\n if (parsedBody.parseFailed) {\n const invalidJsonError = new AthenaGatewayError({\n code: \"INVALID_JSON\",\n message: \"Gateway returned malformed JSON\",\n status: response.status,\n endpoint,\n method,\n requestId,\n hint: \"Verify the gateway response body is valid JSON.\",\n cause: rawText.slice(0, 300),\n });\n return {\n ok: false,\n status: response.status,\n statusText: resolveStatusText(response, parsedBody.parsed),\n data: null,\n error: invalidJsonError.message,\n errorDetails: detailsFromError(invalidJsonError),\n raw: parsedBody.parsed,\n };\n }\n\n const parsed = parsedBody.parsed;\n const parsedPayload = isRecord(parsed) ? parsed : null;\n\n if (!response.ok) {\n const httpError = new AthenaGatewayError({\n code: \"HTTP_ERROR\",\n message: resolveErrorMessage(\n parsed,\n `Athena gateway ${method} ${endpoint} failed with status ${response.status}`,\n ),\n status: response.status,\n endpoint,\n method,\n requestId,\n hint: resolveErrorHint(parsed),\n });\n\n return {\n ok: false,\n status: response.status,\n statusText: resolveStatusText(response, parsed),\n data: null,\n error: httpError.message,\n errorDetails: detailsFromError(httpError),\n raw: parsed,\n };\n }\n\n // Unwrap envelope: API may return { data: [...], error: null } (e.g. when cached)\n // vs raw array when uncached. Use inner data when present to avoid double nesting.\n const payloadData =\n parsedPayload && \"data\" in parsedPayload\n ? (parsedPayload.data as T)\n : (parsed as T);\n const payloadCount =\n parsedPayload && \"count\" in parsedPayload\n ? typeof parsedPayload.count === \"number\" || parsedPayload.count === null\n ? (parsedPayload.count as number | null)\n : undefined\n : undefined;\n\n return {\n ok: true,\n status: response.status,\n statusText: resolveStatusText(response, parsed),\n data: payloadData ?? null,\n count: payloadCount,\n error: undefined,\n errorDetails: null,\n raw: parsed,\n };\n } catch (callError) {\n const message = callError instanceof Error ? callError.message : String(callError);\n const networkError = new AthenaGatewayError({\n code: \"NETWORK_ERROR\",\n message: `Network error while calling ${method} ${endpoint}: ${message}`,\n endpoint,\n method,\n cause: message,\n hint: \"Check gateway URL, DNS, and network reachability.\",\n });\n return {\n ok: false,\n status: 0,\n statusText: null,\n data: null,\n error: networkError.message,\n errorDetails: detailsFromError(networkError),\n raw: null,\n };\n }\n}\n\nexport interface AthenaGatewayClient {\n baseUrl: string;\n buildHeaders(options?: AthenaGatewayCallOptions): Record<string, string>;\n resolveCallOptions(\n options?: AthenaGatewayCallOptions,\n ): Promise<AthenaGatewayCallOptions | undefined>;\n verifyConnection(\n options?: AthenaGatewayConnectionOptions,\n ): Promise<AthenaGatewayConnectionResult>;\n fetchGateway<T>(\n payload: AthenaFetchPayload | AthenaFindManyAstPayload,\n options?: AthenaGatewayCallOptions,\n ): Promise<AthenaGatewayResponse<T>>;\n insertGateway<T>(\n payload: AthenaInsertPayload,\n options?: AthenaGatewayCallOptions,\n ): Promise<AthenaGatewayResponse<T>>;\n updateGateway<T>(\n payload: AthenaUpdatePayload,\n options?: AthenaGatewayCallOptions,\n ): Promise<AthenaGatewayResponse<T>>;\n deleteGateway<T>(\n payload: AthenaDeletePayload,\n options?: AthenaGatewayCallOptions,\n ): Promise<AthenaGatewayResponse<T>>;\n rpcGateway<T>(\n payload: AthenaRpcPayload,\n options?: AthenaRpcCallOptions,\n ): Promise<AthenaGatewayResponse<T>>;\n queryGateway<T>(\n payload: AthenaQueryPayload,\n options?: AthenaGatewayCallOptions,\n ): Promise<AthenaGatewayResponse<T>>;\n}\n\nexport function createAthenaGatewayClient(\n config: AthenaGatewayBaseOptions = {},\n): AthenaGatewayClient {\n const normalizedBaseUrl = resolveGatewayBaseUrl(config.baseUrl);\n const normalizedConfig: AthenaGatewayBaseOptions = {\n ...config,\n baseUrl: normalizedBaseUrl,\n };\n\n return {\n baseUrl: normalizedBaseUrl,\n buildHeaders(options) {\n return buildHeaders(normalizedConfig, options);\n },\n async resolveCallOptions(options) {\n return options;\n },\n verifyConnection(options) {\n return performConnectionCheck(\n normalizedBaseUrl,\n buildHeaders(normalizedConfig),\n options,\n );\n },\n fetchGateway(payload, options) {\n return callAthena(normalizedConfig, \"/gateway/fetch\", \"POST\", payload, options);\n },\n insertGateway(payload, options) {\n return callAthena(normalizedConfig, \"/gateway/insert\", \"PUT\", payload, options);\n },\n updateGateway(payload, options) {\n return callAthena(normalizedConfig, \"/gateway/update\", \"POST\", payload, options);\n },\n deleteGateway(payload, options) {\n return callAthena(normalizedConfig, \"/gateway/delete\", \"DELETE\", payload, options);\n },\n rpcGateway(payload, options) {\n if (options?.get) {\n const endpoint = buildRpcGetEndpoint(payload);\n return callAthena(normalizedConfig, endpoint, \"GET\", null, options);\n }\n return callAthena(normalizedConfig, \"/gateway/rpc\", \"POST\", payload, options);\n },\n queryGateway(payload, options) {\n return callAthena(normalizedConfig, \"/gateway/query\", \"POST\", payload, options);\n },\n };\n}\n\ntype AthenaGatewayCallOptionsResolver = () =>\n | AthenaGatewayCallOptions\n | undefined\n | Promise<AthenaGatewayCallOptions | undefined>;\n\nfunction mergeGatewayCallOptions(\n base?: AthenaGatewayCallOptions,\n override?: AthenaGatewayCallOptions,\n): AthenaGatewayCallOptions | undefined {\n if (!base && !override) return undefined;\n return {\n ...base,\n ...override,\n headers:\n base?.headers || override?.headers\n ? { ...(base?.headers ?? {}), ...(override?.headers ?? {}) }\n : undefined,\n };\n}\n\n/**\n * Creates a request-context view over one immutable gateway transport.\n * The resolver runs once for every operation; the underlying transport and\n * normalized route configuration are never reconstructed.\n */\nexport function createAthenaGatewayClientView(\n transport: AthenaGatewayClient,\n resolveContext: AthenaGatewayCallOptionsResolver,\n): AthenaGatewayClient {\n const resolveCallOptions = async (\n options?: AthenaGatewayCallOptions,\n ): Promise<AthenaGatewayCallOptions | undefined> =>\n mergeGatewayCallOptions(await resolveContext(), options);\n\n return {\n baseUrl: transport.baseUrl,\n buildHeaders(options) {\n return transport.buildHeaders(options);\n },\n resolveCallOptions,\n async verifyConnection(options) {\n const context = await resolveCallOptions();\n const contextHeaders = transport.buildHeaders(context);\n return transport.verifyConnection({\n ...options,\n headers: {\n ...contextHeaders,\n ...(options?.headers ?? {}),\n },\n });\n },\n async fetchGateway(payload, options) {\n return transport.fetchGateway(payload, await resolveCallOptions(options));\n },\n async insertGateway(payload, options) {\n return transport.insertGateway(payload, await resolveCallOptions(options));\n },\n async updateGateway(payload, options) {\n return transport.updateGateway(payload, await resolveCallOptions(options));\n },\n async deleteGateway(payload, options) {\n return transport.deleteGateway(payload, await resolveCallOptions(options));\n },\n async rpcGateway(payload, options) {\n return transport.rpcGateway(payload, await resolveCallOptions(options));\n },\n async queryGateway(payload, options) {\n return transport.queryGateway(payload, await resolveCallOptions(options));\n },\n };\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport type {\n AthenaDeletePayload,\n AthenaFetchPayload,\n AthenaGatewayCallLog,\n AthenaGatewayCallOptions,\n AthenaGatewayEndpointPath,\n AthenaGatewayHookConfig,\n AthenaGatewayHookResult,\n AthenaGatewayMethod,\n AthenaGatewayResponse,\n AthenaGatewayResponseLog,\n AthenaInsertPayload,\n AthenaRpcCallOptions,\n AthenaRpcPayload,\n AthenaUpdatePayload,\n} from \"./types.ts\";\nimport { createAthenaGatewayClient } from \"./client.ts\";\nimport { AthenaGatewayError } from \"./errors.ts\";\n\nexport function useAthenaGateway(\n config?: AthenaGatewayHookConfig,\n): AthenaGatewayHookResult {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [lastRequest, setLastRequest] = useState<AthenaGatewayCallLog | null>(\n null,\n );\n const [lastResponse, setLastResponse] =\n useState<AthenaGatewayResponseLog | null>(null);\n\n const client = useMemo(\n () =>\n createAthenaGatewayClient({\n client: config?.client,\n baseUrl: config?.baseUrl,\n apiKey: config?.apiKey,\n backend: config?.backend,\n publishEvent: config?.publishEvent,\n headers: config?.headers,\n userId: config?.userId,\n organizationId: config?.organizationId,\n }),\n [\n config?.baseUrl,\n config?.client,\n config?.apiKey,\n config?.backend,\n config?.publishEvent,\n config?.headers,\n config?.userId,\n config?.organizationId,\n ],\n );\n\n const callWithLifecycle = useCallback(\n async <T>(\n fn: () => Promise<AthenaGatewayResponse<T>>,\n metadata: {\n endpoint: string;\n method: string;\n payload: unknown;\n options?: AthenaGatewayCallOptions;\n },\n ): Promise<AthenaGatewayResponse<T>> => {\n const requestLog: AthenaGatewayCallLog = {\n endpoint: metadata.endpoint as AthenaGatewayEndpointPath,\n method: metadata.method as AthenaGatewayMethod,\n payload: metadata.payload,\n headers: client.buildHeaders(metadata.options),\n timestamp: new Date().toISOString(),\n };\n\n setLastRequest(requestLog);\n setIsLoading(true);\n setError(null);\n\n let response: AthenaGatewayResponse<T> | undefined;\n try {\n response = await fn();\n setLastResponse({ ...response, timestamp: new Date().toISOString() });\n\n if (!response.ok) {\n const failure = AthenaGatewayError.fromResponse(response, {\n endpoint: metadata.endpoint as AthenaGatewayEndpointPath,\n method: metadata.method as AthenaGatewayMethod,\n });\n setError(failure.message);\n throw failure;\n }\n\n return response;\n } catch (callError) {\n const message =\n callError instanceof Error ? callError.message : String(callError);\n const typedError =\n callError instanceof AthenaGatewayError\n ? callError\n : new AthenaGatewayError({\n code: \"UNKNOWN_ERROR\",\n message,\n endpoint: metadata.endpoint as AthenaGatewayEndpointPath,\n method: metadata.method as AthenaGatewayMethod,\n cause: message,\n });\n setError(message);\n setLastResponse({\n timestamp: new Date().toISOString(),\n status: typedError.status || response?.status || 0,\n ok: false,\n data: null,\n raw: null,\n error: typedError.message,\n errorDetails: typedError.toDetails(),\n });\n throw typedError;\n } finally {\n setIsLoading(false);\n }\n },\n [client],\n );\n\n const defaultStripNulls = true;\n\n const fetchGateway = useCallback(\n <T = unknown>(\n payload: AthenaFetchPayload,\n options?: AthenaGatewayCallOptions,\n ) => {\n const normalizedPayload: AthenaFetchPayload = {\n ...payload,\n conditions: payload.conditions ?? [],\n strip_nulls:\n payload.strip_nulls ?? options?.stripNulls ?? defaultStripNulls,\n };\n return callWithLifecycle<T>(\n () => client.fetchGateway<T>(normalizedPayload, options),\n {\n endpoint: \"/gateway/fetch\",\n method: \"POST\",\n payload: normalizedPayload,\n options,\n },\n );\n },\n [callWithLifecycle, client],\n );\n\n const insertGateway = useCallback(\n <T = unknown>(\n payload: AthenaInsertPayload,\n options?: AthenaGatewayCallOptions,\n ) =>\n callWithLifecycle<T>(() => client.insertGateway<T>(payload, options), {\n endpoint: \"/gateway/insert\",\n method: \"PUT\",\n payload,\n options,\n }),\n [callWithLifecycle, client],\n );\n\n const updateGateway = useCallback(\n <T = unknown>(\n payload: AthenaUpdatePayload,\n options?: AthenaGatewayCallOptions,\n ) => {\n const normalizedPayload: AthenaUpdatePayload = {\n ...payload,\n conditions: payload.conditions ?? [],\n strip_nulls:\n payload.strip_nulls ?? options?.stripNulls ?? defaultStripNulls,\n };\n return callWithLifecycle<T>(\n () => client.updateGateway<T>(normalizedPayload, options),\n {\n endpoint: \"/gateway/update\",\n method: \"POST\",\n payload: normalizedPayload,\n options,\n },\n );\n },\n [callWithLifecycle, client],\n );\n\n const deleteGateway = useCallback(\n <T = unknown>(\n payload: AthenaDeletePayload,\n options?: AthenaGatewayCallOptions,\n ) => {\n if (!payload.resource_id) {\n throw new Error(\n \"deleteGateway requires resource_id (the unique identifier of the record to delete)\",\n );\n }\n return callWithLifecycle<T>(\n () => client.deleteGateway<T>(payload, options),\n { endpoint: \"/gateway/delete\", method: \"DELETE\", payload, options },\n );\n },\n [callWithLifecycle, client],\n );\n\n const rpcGateway = useCallback(\n <T = unknown>(payload: AthenaRpcPayload, options?: AthenaRpcCallOptions) =>\n callWithLifecycle<T>(() => client.rpcGateway<T>(payload, options), {\n endpoint: options?.get ? `/rpc/${payload.function}` : \"/gateway/rpc\",\n method: options?.get ? \"GET\" : \"POST\",\n payload,\n options,\n }),\n [callWithLifecycle, client],\n );\n\n return {\n fetchGateway,\n insertGateway,\n updateGateway,\n deleteGateway,\n rpcGateway,\n isLoading,\n error,\n lastRequest,\n lastResponse,\n baseUrl: client.baseUrl,\n };\n}\n","import { isAthenaGatewayError } from '../gateway/errors.ts'\nimport type {\n AthenaQueryError,\n AthenaQueryResult,\n AthenaResponseLike,\n AthenaRetryCount,\n AthenaRetryDelay,\n QueryKey,\n} from './types.ts'\n\ntype RetryOptions = {\n retry?: AthenaRetryCount\n retryDelay?: AthenaRetryDelay\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction isPrimitive(value: unknown): value is string | number | boolean | null | undefined {\n return value == null || ['string', 'number', 'boolean'].includes(typeof value)\n}\n\nfunction encodePrimitive(value: string | number | boolean | null | undefined): string {\n if (value === null) return 'null:0:'\n if (value === undefined) return 'undefined:0:'\n if (typeof value === 'string') return `str:${value.length}:${value}`\n if (typeof value === 'number') {\n const serialized = Number.isFinite(value) ? String(value) : 'nan'\n return `num:${serialized.length}:${serialized}`\n }\n const serialized = value ? '1' : '0'\n return `bool:${serialized.length}:${serialized}`\n}\n\nfunction stableSerialize(value: unknown, seen: WeakSet<object>): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n\n const valueType = typeof value\n if (valueType === 'string') return `\"${value}\"`\n if (valueType === 'number') return Number.isFinite(value as number) ? String(value) : 'null'\n if (valueType === 'boolean') return (value as boolean) ? 'true' : 'false'\n if (valueType === 'bigint') return `${String(value)}n`\n if (valueType === 'symbol') return `symbol:${String(value)}`\n if (valueType === 'function') {\n const namedFunction = value as { name?: string }\n return `function:${namedFunction.name || 'anonymous'}`\n }\n\n if (value instanceof Date) return `date:${value.toISOString()}`\n\n if (Array.isArray(value)) {\n return `[${value.map(item => stableSerialize(item, seen)).join(',')}]`\n }\n\n if (valueType === 'object') {\n const objectValue = value as Record<string, unknown>\n if (seen.has(objectValue)) return '[circular]'\n seen.add(objectValue)\n const keys = Object.keys(objectValue).sort()\n const serialized = `{${keys\n .map(key => `${key}:${stableSerialize(objectValue[key], seen)}`)\n .join(',')}}`\n seen.delete(objectValue)\n return serialized\n }\n\n return String(value)\n}\n\nexport function safeSerializeQueryKey(queryKey: QueryKey): string {\n try {\n if (typeof queryKey === 'string') {\n return `key:${queryKey}`\n }\n\n if (Array.isArray(queryKey) && queryKey.every(isPrimitive)) {\n return `arr:${queryKey.map(item => encodePrimitive(item)).join('|')}`\n }\n\n return `ser:${stableSerialize(queryKey, new WeakSet<object>())}`\n } catch {\n try {\n return `fallback:${String(queryKey)}`\n } catch {\n return 'fallback:[unserializable-query-key]'\n }\n }\n}\n\nexport function sleep(ms: number): Promise<void> {\n if (ms <= 0) return Promise.resolve()\n return new Promise(resolve => {\n setTimeout(resolve, ms)\n })\n}\n\nfunction resolveRetryCount(retry: AthenaRetryCount | undefined): number {\n if (retry === false || retry == null) return 0\n if (!Number.isFinite(retry)) return 0\n return Math.max(0, Math.trunc(retry))\n}\n\nfunction resolveRetryDelay(retryDelay: AthenaRetryDelay | undefined, attempt: number): number {\n if (typeof retryDelay === 'function') {\n const resolved = retryDelay(attempt)\n if (!Number.isFinite(resolved)) return 0\n return Math.max(0, resolved)\n }\n if (typeof retryDelay === 'number') {\n if (!Number.isFinite(retryDelay)) return 0\n return Math.max(0, retryDelay)\n }\n return 0\n}\n\nexport async function runWithRetry<T>(\n execute: (attempt: number) => Promise<T>,\n options?: RetryOptions,\n): Promise<T> {\n const retries = resolveRetryCount(options?.retry)\n let attempt = 0\n\n for (;;) {\n attempt += 1\n try {\n return await execute(attempt)\n } catch (error) {\n if (attempt > retries) {\n throw error\n }\n const delay = resolveRetryDelay(options?.retryDelay, attempt)\n await sleep(delay)\n }\n }\n}\n\nfunction errorMessageFromUnknown(error: unknown): string {\n if (typeof error === 'string' && error.trim()) return error.trim()\n if (error instanceof Error && error.message.trim()) return error.message.trim()\n if (isRecord(error)) {\n const messageCandidate = error.message ?? error.error\n if (typeof messageCandidate === 'string' && messageCandidate.trim()) {\n return messageCandidate.trim()\n }\n }\n return 'Athena request failed'\n}\n\nexport function normalizeAthenaError(\n error: unknown,\n source?: unknown,\n): AthenaQueryError {\n if (\n isRecord(error) &&\n typeof error.message === 'string' &&\n (error.status === undefined || typeof error.status === 'number') &&\n (error.code === undefined || typeof error.code === 'string')\n ) {\n return {\n message: error.message,\n status: typeof error.status === 'number' ? error.status : undefined,\n code: typeof error.code === 'string' ? error.code : undefined,\n details: error.details,\n raw: error.raw ?? source ?? error,\n }\n }\n\n if (isAthenaGatewayError(error)) {\n const details = error.toDetails()\n return {\n message: details.message,\n status: details.status,\n code: details.code,\n details,\n raw: source ?? error,\n }\n }\n\n if (isRecord(source) && source.errorDetails && isRecord(source.errorDetails)) {\n const details = source.errorDetails\n return {\n message: errorMessageFromUnknown(error ?? source.error),\n status: typeof source.status === 'number' ? source.status : undefined,\n code: typeof details.code === 'string' ? details.code : undefined,\n details,\n raw: source,\n }\n }\n\n if (isRecord(source) && typeof source.status === 'number') {\n return {\n message: errorMessageFromUnknown(error),\n status: source.status,\n details: source,\n raw: source,\n }\n }\n\n return {\n message: errorMessageFromUnknown(error),\n raw: source ?? error,\n }\n}\n\nexport function isAthenaResponseLike<T>(value: unknown): value is AthenaResponseLike<T> {\n if (!isRecord(value)) return false\n if ('error' in value || 'errorDetails' in value) return true\n if ('status' in value && typeof value.status === 'number') {\n return 'data' in value || 'raw' in value\n }\n return (\n 'data' in value &&\n ('raw' in value || 'status' in value)\n )\n}\n\nexport function normalizeAthenaResult<TQueryFnData, TData = TQueryFnData>(\n value: unknown,\n select?: (data: TQueryFnData) => TData,\n): AthenaQueryResult<TData> {\n if (isAthenaResponseLike<TQueryFnData>(value)) {\n const status = typeof value.status === 'number' ? value.status : value.error != null ? 500 : 200\n if (value.error != null) {\n return {\n data: undefined,\n error: normalizeAthenaError(value.error, value),\n status,\n raw: value.raw ?? value,\n }\n }\n\n const hasData = 'data' in value\n const sourceData = hasData\n ? (value.data as TQueryFnData | null | undefined)\n : undefined\n const selectedData =\n sourceData === undefined\n ? undefined\n : sourceData === null\n ? (null as unknown as TData)\n : select\n ? select(sourceData)\n : (sourceData as unknown as TData)\n\n return {\n data: selectedData,\n error: null,\n status,\n raw: value.raw ?? value,\n }\n }\n\n const sourceData = value as TQueryFnData\n const selectedData = select\n ? select(sourceData)\n : (sourceData as unknown as TData)\n\n return {\n data: selectedData,\n error: null,\n status: 200,\n raw: value,\n }\n}\n","import type {\n AthenaMutationDefaults,\n AthenaMutationEvent,\n AthenaMutationRequestLog,\n AthenaMutationResultData,\n AthenaMutationState,\n AthenaQueryClientConfig,\n AthenaQueryDefaults,\n AthenaQueryEvent,\n AthenaQueryRequestLog,\n AthenaQueryResult,\n AthenaQueryState,\n AthenaRuntimeEvent,\n AthenaStateAdapter,\n AthenaUnsubscribe,\n QueryKey,\n} from './types.ts'\nimport { normalizeAthenaError, normalizeAthenaResult, runWithRetry, safeSerializeQueryKey } from './utils.ts'\n\ntype ExecuteQueryInput<TQueryFnData, TData> = {\n queryKey: QueryKey\n queryKeyToken: string\n queryFn: () => Promise<TQueryFnData>\n select?: (data: TQueryFnData) => TData\n retry?: number | false\n retryDelay?: number | ((attempt: number) => number)\n dedupe?: boolean\n force?: boolean\n}\n\ntype ExecuteMutationInput<TVariables, TMutationFnData, TData> = {\n mutationKey?: QueryKey\n mutationKeyToken: string\n variables: TVariables\n mutationFn: (variables: TVariables) => Promise<TMutationFnData>\n select?: (data: TMutationFnData) => TData\n retry?: number | false\n retryDelay?: number | ((attempt: number) => number)\n}\n\ntype QueryEntry = {\n key: string\n state: AthenaQueryState<unknown>\n listeners: Set<() => void>\n gcTimer?: ReturnType<typeof setTimeout>\n activeRequestId: number\n}\n\ntype MutationEntry = {\n key: string\n state: AthenaMutationState<unknown, unknown>\n listeners: Set<() => void>\n gcTimer?: ReturnType<typeof setTimeout>\n activeRequestId: number\n}\n\nfunction createInitialQueryState<TData>(initialData?: TData): AthenaQueryState<TData> {\n return {\n status: initialData === undefined ? 'idle' : 'success',\n isFetching: false,\n data: initialData,\n error: null,\n updatedAt: initialData === undefined ? undefined : Date.now(),\n }\n}\n\nfunction createInitialMutationState<TVariables, TData>(): AthenaMutationState<TVariables, TData> {\n return {\n status: 'idle',\n data: undefined,\n error: null,\n isLoading: false,\n lastVariables: undefined,\n lastResponse: undefined,\n updatedAt: undefined,\n }\n}\n\nfunction shouldUseMemoryCache(config: AthenaQueryClientConfig): boolean {\n return config.cache?.mode === 'memory'\n}\n\nexport class AthenaQueryClient {\n private readonly queryEntries = new Map<string, QueryEntry>()\n private readonly mutationEntries = new Map<string, MutationEntry>()\n private readonly inflightQueries = new Map<string, Promise<AthenaQueryResult<unknown>>>()\n private readonly eventSubscribers = new Set<(event: AthenaRuntimeEvent) => void>()\n private readonly adapters = new Set<AthenaStateAdapter>()\n private requestCounter = 0\n\n readonly config: AthenaQueryClientConfig\n readonly defaultQueryOptions: AthenaQueryDefaults\n readonly defaultMutationOptions: AthenaMutationDefaults\n\n constructor(config: AthenaQueryClientConfig = {}) {\n this.config = {\n cache: {\n mode: config.cache?.mode ?? 'none',\n staleTime: config.cache?.staleTime,\n gcTime: config.cache?.gcTime,\n },\n defaultQueryOptions: config.defaultQueryOptions,\n defaultMutationOptions: config.defaultMutationOptions,\n }\n this.defaultQueryOptions = {\n retry: config.defaultQueryOptions?.retry ?? 0,\n retryDelay: config.defaultQueryOptions?.retryDelay,\n refetchOnMount: config.defaultQueryOptions?.refetchOnMount ?? true,\n refetchOnWindowFocus: config.defaultQueryOptions?.refetchOnWindowFocus ?? false,\n refetchOnReconnect: config.defaultQueryOptions?.refetchOnReconnect ?? false,\n }\n this.defaultMutationOptions = {\n retry: config.defaultMutationOptions?.retry ?? 0,\n retryDelay: config.defaultMutationOptions?.retryDelay,\n }\n }\n\n getQueryKeyToken(queryKey: QueryKey): string {\n return safeSerializeQueryKey(queryKey)\n }\n\n getMutationKeyToken(mutationKey?: QueryKey): string {\n if (mutationKey == null) {\n return '__mutation__default__'\n }\n return safeSerializeQueryKey(mutationKey)\n }\n\n getQueryState<TData = unknown>(key: string): AthenaQueryState<TData> {\n const entry = this.ensureQueryEntry(key)\n return entry.state as AthenaQueryState<TData>\n }\n\n getMutationState<TVariables = unknown, TData = unknown>(\n key: string,\n ): AthenaMutationState<TVariables, TData> {\n const entry = this.ensureMutationEntry(key)\n return entry.state as AthenaMutationState<TVariables, TData>\n }\n\n subscribeQuery(key: string, listener: () => void): AthenaUnsubscribe {\n const entry = this.ensureQueryEntry(key)\n if (entry.gcTimer) {\n clearTimeout(entry.gcTimer)\n entry.gcTimer = undefined\n }\n entry.listeners.add(listener)\n return () => {\n const current = this.queryEntries.get(key)\n if (!current) return\n current.listeners.delete(listener)\n if (current.listeners.size === 0) {\n this.scheduleQueryGc(current)\n }\n }\n }\n\n subscribeMutation(key: string, listener: () => void): AthenaUnsubscribe {\n const entry = this.ensureMutationEntry(key)\n if (entry.gcTimer) {\n clearTimeout(entry.gcTimer)\n entry.gcTimer = undefined\n }\n entry.listeners.add(listener)\n return () => {\n const current = this.mutationEntries.get(key)\n if (!current) return\n current.listeners.delete(listener)\n if (current.listeners.size === 0) {\n this.scheduleMutationGc(current)\n }\n }\n }\n\n subscribeEvents(listener: (event: AthenaRuntimeEvent) => void): AthenaUnsubscribe {\n this.eventSubscribers.add(listener)\n return () => {\n this.eventSubscribers.delete(listener)\n }\n }\n\n attachAdapter(adapter: AthenaStateAdapter): AthenaUnsubscribe {\n this.adapters.add(adapter)\n return () => {\n this.adapters.delete(adapter)\n }\n }\n\n resetQuery(queryKey: QueryKey): void {\n const key = this.getQueryKeyToken(queryKey)\n const entry = this.ensureQueryEntry(key)\n entry.activeRequestId = ++this.requestCounter\n this.setQueryState(entry, createInitialQueryState(), 'query_reset')\n this.inflightQueries.delete(key)\n }\n\n resetMutation(mutationKey?: QueryKey): void {\n const key = this.getMutationKeyToken(mutationKey)\n const entry = this.ensureMutationEntry(key)\n entry.activeRequestId = ++this.requestCounter\n this.setMutationState(entry, createInitialMutationState(), 'mutation_reset')\n }\n\n async executeQuery<TQueryFnData, TData = TQueryFnData>(\n input: ExecuteQueryInput<TQueryFnData, TData>,\n ): Promise<AthenaQueryResult<TData>> {\n const entry = this.ensureQueryEntry(input.queryKeyToken)\n\n if (input.dedupe !== false) {\n const existing = this.inflightQueries.get(input.queryKeyToken)\n if (existing) {\n return existing as Promise<AthenaQueryResult<TData>>\n }\n }\n\n if (!input.force && shouldUseMemoryCache(this.config)) {\n const staleTime = this.config.cache?.staleTime ?? 0\n const hasFreshData =\n entry.state.status === 'success' &&\n entry.state.data !== undefined &&\n entry.state.updatedAt !== undefined &&\n Date.now() - entry.state.updatedAt <= staleTime\n if (hasFreshData) {\n return {\n data: entry.state.data as TData,\n error: null,\n status: 200,\n raw: entry.state.lastResponse ?? entry.state.data,\n __applied: true,\n } as AthenaQueryResult<TData>\n }\n }\n\n const requestId = ++this.requestCounter\n entry.activeRequestId = requestId\n\n const startRequestLog: AthenaQueryRequestLog = {\n requestId,\n queryKey: input.queryKey,\n queryKeyToken: input.queryKeyToken,\n attempt: 1,\n startedAt: Date.now(),\n }\n\n const loadingStatus = entry.state.data === undefined ? 'loading' : entry.state.status\n this.setQueryState(\n entry,\n {\n ...entry.state,\n status: loadingStatus,\n isFetching: true,\n error: null,\n lastRequest: startRequestLog,\n },\n 'query_updated',\n )\n\n const executionPromise = runWithRetry(\n async attempt => {\n const attemptRequestLog: AthenaQueryRequestLog = {\n ...startRequestLog,\n attempt,\n }\n\n if (entry.activeRequestId === requestId) {\n this.setQueryState(\n entry,\n {\n ...entry.state,\n lastRequest: attemptRequestLog,\n isFetching: true,\n },\n 'query_updated',\n )\n }\n\n const rawResult = await input.queryFn()\n const normalized = normalizeAthenaResult<TQueryFnData, TData>(rawResult, input.select)\n\n if (normalized.error) {\n throw {\n __athenaNormalizedError: normalized.error,\n __athenaStatus: normalized.status,\n __athenaRaw: normalized.raw,\n __athenaResponse: rawResult,\n }\n }\n\n return {\n normalized,\n response: rawResult,\n attempt,\n }\n },\n {\n retry: input.retry,\n retryDelay: input.retryDelay,\n },\n )\n .then(result => {\n const applied = entry.activeRequestId === requestId\n if (applied) {\n const finishedAt = Date.now()\n const doneRequestLog: AthenaQueryRequestLog = {\n ...startRequestLog,\n attempt: result.attempt,\n endedAt: finishedAt,\n }\n this.setQueryState(\n entry,\n {\n ...entry.state,\n status: 'success',\n isFetching: false,\n error: null,\n data: result.normalized.data,\n lastRequest: doneRequestLog,\n lastResponse: result.response,\n updatedAt: finishedAt,\n },\n 'query_updated',\n )\n }\n\n return {\n ...result.normalized,\n __applied: applied,\n } as AthenaQueryResult<TData>\n })\n .catch(error => {\n const wrapped =\n typeof error === 'object' && error !== null ? (error as Record<string, unknown>) : undefined\n\n const normalizedError = wrapped?.__athenaNormalizedError\n ? (wrapped.__athenaNormalizedError as ReturnType<typeof normalizeAthenaError>)\n : normalizeAthenaError(error)\n\n const status =\n typeof wrapped?.__athenaStatus === 'number'\n ? (wrapped.__athenaStatus as number)\n : normalizedError.status ?? 500\n\n const raw = wrapped?.__athenaRaw ?? normalizedError.raw ?? null\n const response = wrapped?.__athenaResponse ?? raw\n\n const applied = entry.activeRequestId === requestId\n if (applied) {\n const finishedAt = Date.now()\n const doneRequestLog: AthenaQueryRequestLog = {\n ...startRequestLog,\n endedAt: finishedAt,\n attempt:\n entry.state.lastRequest?.requestId === requestId\n ? entry.state.lastRequest.attempt\n : startRequestLog.attempt,\n }\n this.setQueryState(\n entry,\n {\n ...entry.state,\n status: 'error',\n isFetching: false,\n error: normalizedError,\n lastRequest: doneRequestLog,\n lastResponse: response,\n updatedAt: finishedAt,\n },\n 'query_updated',\n )\n }\n\n return {\n data: undefined,\n error: normalizedError,\n status,\n raw,\n __applied: applied,\n } as AthenaQueryResult<TData>\n })\n .finally(() => {\n const inflight = this.inflightQueries.get(input.queryKeyToken)\n if (inflight === executionPromise) {\n this.inflightQueries.delete(input.queryKeyToken)\n }\n })\n\n this.inflightQueries.set(input.queryKeyToken, executionPromise as Promise<AthenaQueryResult<unknown>>)\n\n return executionPromise\n }\n\n async executeMutation<TVariables, TMutationFnData, TData = TMutationFnData>(\n input: ExecuteMutationInput<TVariables, TMutationFnData, TData>,\n ): Promise<AthenaMutationResultData<TData>> {\n const entry = this.ensureMutationEntry(input.mutationKeyToken)\n const requestId = ++this.requestCounter\n entry.activeRequestId = requestId\n\n const startRequestLog: AthenaMutationRequestLog<TVariables> = {\n requestId,\n mutationKey: input.mutationKey,\n mutationKeyToken: input.mutationKeyToken,\n attempt: 1,\n startedAt: Date.now(),\n variables: input.variables,\n }\n\n this.setMutationState(\n entry,\n {\n ...entry.state,\n status: 'loading',\n isLoading: true,\n error: null,\n lastVariables: input.variables,\n lastRequest: startRequestLog,\n },\n 'mutation_updated',\n )\n\n try {\n const result = await runWithRetry(\n async attempt => {\n const attemptRequestLog: AthenaMutationRequestLog<TVariables> = {\n ...startRequestLog,\n attempt,\n }\n\n if (entry.activeRequestId === requestId) {\n this.setMutationState(\n entry,\n {\n ...entry.state,\n lastRequest: attemptRequestLog,\n isLoading: true,\n },\n 'mutation_updated',\n )\n }\n\n const rawResult = await input.mutationFn(input.variables)\n const normalized = normalizeAthenaResult<TMutationFnData, TData>(rawResult, input.select)\n if (normalized.error) {\n throw {\n __athenaNormalizedError: normalized.error,\n __athenaStatus: normalized.status,\n __athenaRaw: normalized.raw,\n __athenaResponse: rawResult,\n }\n }\n\n return {\n normalized,\n response: rawResult,\n attempt,\n }\n },\n {\n retry: input.retry,\n retryDelay: input.retryDelay,\n },\n )\n\n if (entry.activeRequestId === requestId) {\n const finishedAt = Date.now()\n const doneRequestLog: AthenaMutationRequestLog<TVariables> = {\n ...startRequestLog,\n attempt: result.attempt,\n endedAt: finishedAt,\n }\n this.setMutationState(\n entry,\n {\n ...entry.state,\n status: 'success',\n isLoading: false,\n data: result.normalized.data,\n error: null,\n lastVariables: input.variables,\n lastRequest: doneRequestLog,\n lastResponse: result.response,\n updatedAt: finishedAt,\n },\n 'mutation_updated',\n )\n }\n\n return result.normalized\n } catch (error) {\n const wrapped =\n typeof error === 'object' && error !== null ? (error as Record<string, unknown>) : undefined\n const normalizedError = wrapped?.__athenaNormalizedError\n ? (wrapped.__athenaNormalizedError as ReturnType<typeof normalizeAthenaError>)\n : normalizeAthenaError(error)\n\n const status =\n typeof wrapped?.__athenaStatus === 'number'\n ? (wrapped.__athenaStatus as number)\n : normalizedError.status ?? 500\n const raw = wrapped?.__athenaRaw ?? normalizedError.raw ?? null\n const response = wrapped?.__athenaResponse ?? raw\n\n if (entry.activeRequestId === requestId) {\n const finishedAt = Date.now()\n const doneRequestLog: AthenaMutationRequestLog<TVariables> = {\n ...startRequestLog,\n endedAt: finishedAt,\n attempt:\n entry.state.lastRequest?.requestId === requestId\n ? entry.state.lastRequest.attempt\n : startRequestLog.attempt,\n }\n\n this.setMutationState(\n entry,\n {\n ...entry.state,\n status: 'error',\n isLoading: false,\n error: normalizedError,\n lastVariables: input.variables,\n lastRequest: doneRequestLog,\n lastResponse: response,\n updatedAt: finishedAt,\n },\n 'mutation_updated',\n )\n }\n\n return {\n data: undefined,\n error: normalizedError,\n status,\n raw,\n }\n }\n }\n\n private ensureQueryEntry(key: string): QueryEntry {\n let entry = this.queryEntries.get(key)\n if (entry) return entry\n\n entry = {\n key,\n state: createInitialQueryState(),\n listeners: new Set(),\n activeRequestId: 0,\n }\n this.queryEntries.set(key, entry)\n return entry\n }\n\n private ensureMutationEntry(key: string): MutationEntry {\n let entry = this.mutationEntries.get(key)\n if (entry) return entry\n\n entry = {\n key,\n state: createInitialMutationState(),\n listeners: new Set(),\n activeRequestId: 0,\n }\n this.mutationEntries.set(key, entry)\n return entry\n }\n\n private scheduleQueryGc(entry: QueryEntry): void {\n const gcTime = shouldUseMemoryCache(this.config)\n ? Math.max(0, this.config.cache?.gcTime ?? 300_000)\n : Math.max(0, this.config.cache?.gcTime ?? 0)\n\n entry.gcTimer = setTimeout(() => {\n const current = this.queryEntries.get(entry.key)\n if (!current || current.listeners.size > 0) return\n this.queryEntries.delete(entry.key)\n this.inflightQueries.delete(entry.key)\n this.emitEvent({\n type: 'query_gc',\n key: entry.key,\n state: current.state,\n timestamp: Date.now(),\n })\n }, gcTime)\n }\n\n private scheduleMutationGc(entry: MutationEntry): void {\n const gcTime = shouldUseMemoryCache(this.config)\n ? Math.max(0, this.config.cache?.gcTime ?? 300_000)\n : Math.max(0, this.config.cache?.gcTime ?? 0)\n\n entry.gcTimer = setTimeout(() => {\n const current = this.mutationEntries.get(entry.key)\n if (!current || current.listeners.size > 0) return\n this.mutationEntries.delete(entry.key)\n }, gcTime)\n }\n\n private setQueryState(\n entry: QueryEntry,\n state: AthenaQueryState<unknown>,\n eventType: AthenaQueryEvent['type'],\n ): void {\n entry.state = state\n for (const listener of entry.listeners) {\n listener()\n }\n\n this.emitEvent({\n type: eventType,\n key: entry.key,\n state,\n timestamp: Date.now(),\n })\n }\n\n private setMutationState(\n entry: MutationEntry,\n state: AthenaMutationState<unknown, unknown>,\n eventType: AthenaMutationEvent['type'],\n ): void {\n entry.state = state\n for (const listener of entry.listeners) {\n listener()\n }\n\n this.emitEvent({\n type: eventType,\n key: entry.key,\n state,\n timestamp: Date.now(),\n })\n }\n\n private emitEvent(event: AthenaRuntimeEvent): void {\n for (const listener of this.eventSubscribers) {\n listener(event)\n }\n\n for (const adapter of this.adapters) {\n adapter.onEvent?.(event)\n if (event.type === 'query_updated' || event.type === 'query_reset' || event.type === 'query_gc') {\n adapter.onQueryUpdated?.(event)\n }\n if (event.type === 'mutation_updated' || event.type === 'mutation_reset') {\n adapter.onMutationUpdated?.(event)\n }\n }\n }\n}\n\nexport function createAthenaQueryClient(config?: AthenaQueryClientConfig): AthenaQueryClient {\n return new AthenaQueryClient(config)\n}\n\nexport function attachStateAdapter(\n client: AthenaQueryClient,\n adapter: AthenaStateAdapter,\n): AthenaUnsubscribe {\n return client.attachAdapter(adapter)\n}\n","import { createContext, createElement, useContext, useMemo, type ReactNode } from 'react'\nimport type { AthenaQueryClientConfig } from './types.ts'\nimport { AthenaQueryClient, createAthenaQueryClient } from './query-client.ts'\n\nconst AthenaQueryClientContext = createContext<AthenaQueryClient | null>(null)\n\nexport interface AthenaQueryClientProviderProps {\n client?: AthenaQueryClient\n config?: AthenaQueryClientConfig\n children: ReactNode\n}\n\nexport function AthenaQueryClientProvider(props: AthenaQueryClientProviderProps) {\n const memoizedClient = useMemo(() => {\n if (props.client) {\n return props.client\n }\n return createAthenaQueryClient(props.config)\n }, [props.client, props.config])\n\n return createElement(\n AthenaQueryClientContext.Provider,\n { value: memoizedClient },\n props.children,\n )\n}\n\nexport function useAthenaQueryClient(): AthenaQueryClient {\n const client = useContext(AthenaQueryClientContext)\n if (!client) {\n throw new Error(\n 'No AthenaQueryClient found. Wrap your component tree with AthenaQueryClientProvider.',\n )\n }\n return client\n}\n\nexport { AthenaQueryClientContext }\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from 'react'\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\nimport type {\n AthenaQueryResult,\n AthenaQueryState,\n UseQueryOptions,\n UseQueryResult,\n} from './types.ts'\nimport { useAthenaQueryClient } from './provider.ts'\n\ntype BrowserEventName = 'focus' | 'online'\n\ntype BrowserTarget = {\n addEventListener: (event: BrowserEventName, listener: () => void) => void\n removeEventListener: (event: BrowserEventName, listener: () => void) => void\n}\n\nfunction getBrowserTarget(): BrowserTarget | null {\n const maybeGlobal = globalThis as unknown as {\n addEventListener?: unknown\n removeEventListener?: unknown\n window?: unknown\n }\n\n const hasListeners = (value: unknown): value is BrowserTarget =>\n Boolean(value) &&\n typeof value === 'object' &&\n typeof (value as BrowserTarget).addEventListener === 'function' &&\n typeof (value as BrowserTarget).removeEventListener === 'function'\n\n if (hasListeners(maybeGlobal.window)) {\n return maybeGlobal.window\n }\n\n if (hasListeners(maybeGlobal)) {\n return maybeGlobal\n }\n\n return null\n}\n\nexport function useQuery<TQueryFnData, TData = TQueryFnData>(\n options: UseQueryOptions<TQueryFnData, TData>,\n): UseQueryResult<TData> {\n const client = useAthenaQueryClient()\n\n const queryKeyRef = useRef(options.queryKey)\n queryKeyRef.current = options.queryKey\n\n const queryFnRef = useRef(options.queryFn)\n queryFnRef.current = options.queryFn\n\n const selectRef = useRef(options.select)\n selectRef.current = options.select\n\n const onSuccessRef = useRef(options.onSuccess)\n onSuccessRef.current = options.onSuccess\n\n const onErrorRef = useRef(options.onError)\n onErrorRef.current = options.onError\n\n const onSettledRef = useRef(options.onSettled)\n onSettledRef.current = options.onSettled\n\n const enabledRef = useRef(options.enabled ?? true)\n enabledRef.current = options.enabled ?? true\n\n const retryRef = useRef(options.retry)\n retryRef.current = options.retry\n\n const retryDelayRef = useRef(options.retryDelay)\n retryDelayRef.current = options.retryDelay\n\n const initialDataRef = useRef(options.initialData)\n initialDataRef.current = options.initialData\n\n const refetchOnMountRef = useRef(options.refetchOnMount)\n refetchOnMountRef.current = options.refetchOnMount\n\n const refetchOnWindowFocusRef = useRef(options.refetchOnWindowFocus)\n refetchOnWindowFocusRef.current = options.refetchOnWindowFocus\n\n const refetchOnReconnectRef = useRef(options.refetchOnReconnect)\n refetchOnReconnectRef.current = options.refetchOnReconnect\n\n const queryKeyToken = useMemo(\n () => client.getQueryKeyToken(options.queryKey),\n [client, options.queryKey],\n )\n const activeQueryKeyTokenRef = useRef(queryKeyToken)\n activeQueryKeyTokenRef.current = queryKeyToken\n\n const subscribe = useCallback(\n (listener: () => void) => client.subscribeQuery(queryKeyToken, listener),\n [client, queryKeyToken],\n )\n\n const getSnapshot = useCallback(\n () => client.getQueryState<TData>(queryKeyToken),\n [client, queryKeyToken],\n )\n\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n const effectiveSnapshot = useMemo<AthenaQueryState<TData>>(() => {\n if (\n snapshot.status === 'idle' &&\n snapshot.data === undefined &&\n initialDataRef.current !== undefined\n ) {\n return {\n ...snapshot,\n status: 'success',\n data: initialDataRef.current,\n error: null,\n }\n }\n return snapshot\n }, [snapshot])\n\n const runQuery = useCallback(\n async (force = false): Promise<AthenaQueryResult<TData>> => {\n const result = await client.executeQuery<TQueryFnData, TData>({\n queryKey: queryKeyRef.current,\n queryKeyToken,\n queryFn: () => queryFnRef.current(),\n select: selectRef.current,\n retry:\n retryRef.current ??\n client.defaultQueryOptions.retry ??\n 0,\n retryDelay:\n retryDelayRef.current ??\n client.defaultQueryOptions.retryDelay,\n dedupe: true,\n force,\n })\n\n const internalResult = result as AthenaQueryResult<TData> & {\n __applied?: boolean\n }\n if (activeQueryKeyTokenRef.current !== queryKeyToken || internalResult.__applied === false) {\n return result\n }\n\n if (result.error) {\n onErrorRef.current?.(result.error)\n onSettledRef.current?.(result.data, result.error)\n return result\n }\n\n onSuccessRef.current?.(result.data as TData)\n onSettledRef.current?.(result.data, null)\n return result\n },\n [client, queryKeyToken],\n )\n\n const lastAutoKeyRef = useRef<string | null>(null)\n\n useEffect(() => {\n const refetchOnMount =\n refetchOnMountRef.current ?? client.defaultQueryOptions.refetchOnMount ?? true\n\n const isFirstRenderForKey = lastAutoKeyRef.current !== queryKeyToken\n lastAutoKeyRef.current = queryKeyToken\n\n if (!enabledRef.current) {\n return\n }\n\n const state = client.getQueryState(queryKeyToken)\n const shouldFetch = state.status === 'idle' || (isFirstRenderForKey && refetchOnMount)\n\n if (shouldFetch) {\n void runQuery(false)\n }\n }, [client, queryKeyToken, runQuery])\n\n useEffect(() => {\n const browser = getBrowserTarget()\n if (!browser || !enabledRef.current) {\n return undefined\n }\n\n const refetchOnWindowFocus =\n refetchOnWindowFocusRef.current ??\n client.defaultQueryOptions.refetchOnWindowFocus ??\n false\n\n if (!refetchOnWindowFocus) {\n return undefined\n }\n\n const onFocus = () => {\n if (!enabledRef.current) return\n void runQuery(true)\n }\n\n browser.addEventListener('focus', onFocus)\n return () => {\n browser.removeEventListener('focus', onFocus)\n }\n }, [client, runQuery])\n\n useEffect(() => {\n const browser = getBrowserTarget()\n if (!browser || !enabledRef.current) {\n return undefined\n }\n\n const refetchOnReconnect =\n refetchOnReconnectRef.current ??\n client.defaultQueryOptions.refetchOnReconnect ??\n false\n\n if (!refetchOnReconnect) {\n return undefined\n }\n\n const onReconnect = () => {\n if (!enabledRef.current) return\n void runQuery(true)\n }\n\n browser.addEventListener('online', onReconnect)\n return () => {\n browser.removeEventListener('online', onReconnect)\n }\n }, [client, runQuery])\n\n const refetch = useCallback(() => runQuery(true), [runQuery])\n\n const reset = useCallback(() => {\n client.resetQuery(queryKeyRef.current)\n }, [client])\n\n return {\n data: effectiveSnapshot.data,\n error: effectiveSnapshot.error,\n isLoading:\n effectiveSnapshot.status === 'loading' && effectiveSnapshot.data === undefined,\n isFetching: effectiveSnapshot.isFetching,\n isSuccess: effectiveSnapshot.status === 'success',\n isError: effectiveSnapshot.status === 'error',\n status: effectiveSnapshot.status,\n refetch,\n reset,\n lastResponse: effectiveSnapshot.lastResponse,\n lastRequest: effectiveSnapshot.lastRequest,\n }\n}\n","import { useCallback, useMemo, useRef } from 'react'\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\nimport type {\n UseMutationOptions,\n UseMutationResult,\n} from './types.ts'\nimport { useAthenaQueryClient } from './provider.ts'\n\nexport function useMutation<TVariables, TMutationFnData, TData = TMutationFnData>(\n options: UseMutationOptions<TVariables, TMutationFnData, TData>,\n): UseMutationResult<TVariables, TData> {\n const client = useAthenaQueryClient()\n\n const mutationKeyRef = useRef(options.mutationKey)\n mutationKeyRef.current = options.mutationKey\n\n const mutationFnRef = useRef(options.mutationFn)\n mutationFnRef.current = options.mutationFn\n\n const selectRef = useRef(options.select)\n selectRef.current = options.select\n\n const retryRef = useRef(options.retry)\n retryRef.current = options.retry\n\n const retryDelayRef = useRef(options.retryDelay)\n retryDelayRef.current = options.retryDelay\n\n const onMutateRef = useRef(options.onMutate)\n onMutateRef.current = options.onMutate\n\n const onSuccessRef = useRef(options.onSuccess)\n onSuccessRef.current = options.onSuccess\n\n const onErrorRef = useRef(options.onError)\n onErrorRef.current = options.onError\n\n const onSettledRef = useRef(options.onSettled)\n onSettledRef.current = options.onSettled\n\n const mutationKeyToken = useMemo(\n () => client.getMutationKeyToken(options.mutationKey),\n [client, options.mutationKey],\n )\n\n const subscribe = useCallback(\n (listener: () => void) => client.subscribeMutation(mutationKeyToken, listener),\n [client, mutationKeyToken],\n )\n\n const getSnapshot = useCallback(\n () => client.getMutationState<TVariables, TData>(mutationKeyToken),\n [client, mutationKeyToken],\n )\n\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n const mutateAsync = useCallback(\n async (variables: TVariables): Promise<TData> => {\n await onMutateRef.current?.(variables)\n\n const result = await client.executeMutation<TVariables, TMutationFnData, TData>({\n mutationKey: mutationKeyRef.current,\n mutationKeyToken,\n variables,\n mutationFn: currentVariables => mutationFnRef.current(currentVariables),\n select: selectRef.current,\n retry:\n retryRef.current ??\n client.defaultMutationOptions.retry ??\n 0,\n retryDelay:\n retryDelayRef.current ??\n client.defaultMutationOptions.retryDelay,\n })\n\n if (result.error) {\n onErrorRef.current?.(result.error, variables)\n onSettledRef.current?.(result.data, result.error, variables)\n throw result.error\n }\n\n const data = result.data as TData\n onSuccessRef.current?.(data, variables)\n onSettledRef.current?.(data, null, variables)\n return data\n },\n [client, mutationKeyToken],\n )\n\n const mutate = useCallback(\n (variables: TVariables) => {\n void mutateAsync(variables).catch(() => undefined)\n },\n [mutateAsync],\n )\n\n const reset = useCallback(() => {\n client.resetMutation(mutationKeyRef.current)\n }, [client])\n\n return {\n mutate,\n mutateAsync,\n data: snapshot.data,\n error: snapshot.error,\n isIdle: snapshot.status === 'idle',\n isLoading: snapshot.status === 'loading',\n isSuccess: snapshot.status === 'success',\n isError: snapshot.status === 'error',\n status: snapshot.status,\n reset,\n lastResponse: snapshot.lastResponse,\n lastVariables: snapshot.lastVariables,\n lastRequest: snapshot.lastRequest,\n }\n}\n","import type {\n AthenaDeletePayload,\n AthenaFetchPayload,\n AthenaGatewayCondition,\n AthenaInsertPayload,\n AthenaJsonObject,\n AthenaRpcFilter,\n AthenaRpcPayload,\n AthenaSortBy,\n AthenaUpdatePayload,\n} from './gateway/types.ts'\nimport type {\n AthenaFindManyOptions,\n AthenaOrderBy,\n AthenaSelectShape,\n AthenaWhere,\n} from './query-ast.ts'\nimport type { AthenaFindManyAstPayload, AthenaSelectTransportPlan } from './query-transport.ts'\n\nconst ATHENA_DEBUG_AST_KEY = '__athenaDebugAst' as const\n\nexport interface AthenaTableBuilderStateAst {\n conditions: AthenaGatewayCondition[]\n limit?: number\n offset?: number\n order?: AthenaSortBy\n currentPage?: number\n pageSize?: number\n totalPages?: number\n}\n\nexport interface AthenaRpcBuilderStateAst {\n filters: AthenaRpcFilter[]\n limit?: number\n offset?: number\n order?: {\n column: string\n ascending?: boolean\n }\n}\n\nexport type AthenaDebugQueryEndpoint =\n | '/gateway/fetch'\n | '/gateway/insert'\n | '/gateway/update'\n | '/gateway/delete'\n | '/gateway/rpc'\n | '/gateway/query'\n | `/rpc/${string}`\n\ninterface AthenaDebugAstBase<TKind extends string> {\n version: 1\n kind: TKind\n}\n\nexport type AthenaSelectDebugTransport =\n | {\n mode: 'compiled-fetch' | 'structured-fetch'\n endpoint: '/gateway/fetch'\n payload: AthenaFetchPayload\n }\n | {\n mode: 'typed-query'\n endpoint: '/gateway/query'\n payload: {\n query: string\n }\n }\n\nexport interface AthenaSelectDebugAst extends AthenaDebugAstBase<'select'> {\n tableName: string\n input: {\n columns: string | string[]\n state: AthenaTableBuilderStateAst\n }\n transport: AthenaSelectDebugTransport\n}\n\nexport type AthenaFindManyDebugTransport<\n Row = Record<string, unknown>,\n TSelect extends AthenaSelectShape = AthenaSelectShape,\n> =\n | {\n mode: 'direct-ast-fetch'\n endpoint: '/gateway/fetch'\n payload: AthenaFindManyAstPayload<Row, TSelect>\n }\n | {\n mode: 'compiled-fetch' | 'structured-fetch'\n endpoint: '/gateway/fetch'\n payload: AthenaFetchPayload\n }\n | {\n mode: 'compiled-query'\n endpoint: '/gateway/query'\n payload: {\n query: string\n }\n }\n\nexport interface AthenaFindManyDebugAst<\n Row = Record<string, unknown>,\n TSelect extends AthenaSelectShape = AthenaSelectShape,\n> extends AthenaDebugAstBase<'findMany'> {\n tableName: string\n input: {\n select: TSelect\n where?: AthenaWhere<Row>\n orderBy?: AthenaOrderBy<Row>\n limit?: number\n }\n compiled: {\n columns: string\n baseState: AthenaTableBuilderStateAst\n executionState: AthenaTableBuilderStateAst\n }\n transport: AthenaFindManyDebugTransport<Row, TSelect>\n}\n\nexport interface AthenaInsertDebugAst extends AthenaDebugAstBase<'insert'> {\n tableName: string\n input: {\n values: AthenaInsertPayload['insert_body']\n returning?: AthenaInsertPayload['columns']\n count?: AthenaInsertPayload['count']\n head?: boolean\n defaultToNull?: boolean\n }\n transport: {\n mode: 'insert'\n endpoint: '/gateway/insert'\n payload: AthenaInsertPayload\n }\n}\n\nexport interface AthenaUpsertDebugAst extends AthenaDebugAstBase<'upsert'> {\n tableName: string\n input: {\n values: AthenaInsertPayload['insert_body']\n updateBody?: AthenaInsertPayload['update_body']\n onConflict?: AthenaInsertPayload['on_conflict']\n returning?: AthenaInsertPayload['columns']\n count?: AthenaInsertPayload['count']\n head?: boolean\n defaultToNull?: boolean\n }\n transport: {\n mode: 'upsert'\n endpoint: '/gateway/insert'\n payload: AthenaInsertPayload\n }\n}\n\nexport interface AthenaUpdateDebugAst extends AthenaDebugAstBase<'update'> {\n tableName: string\n input: {\n values: AthenaUpdatePayload['update_body']\n state: AthenaTableBuilderStateAst\n returning?: AthenaUpdatePayload['columns']\n }\n transport: {\n mode: 'update'\n endpoint: '/gateway/update'\n payload: AthenaUpdatePayload\n }\n}\n\nexport interface AthenaDeleteDebugAst extends AthenaDebugAstBase<'delete'> {\n tableName: string\n input: {\n resourceId?: AthenaDeletePayload['resource_id']\n state: AthenaTableBuilderStateAst\n returning?: AthenaDeletePayload['columns']\n }\n transport: {\n mode: 'delete'\n endpoint: '/gateway/delete'\n payload: AthenaDeletePayload\n }\n}\n\nexport interface AthenaRpcDebugAst extends AthenaDebugAstBase<'rpc'> {\n functionName: string\n input: {\n args?: AthenaJsonObject\n select?: string | string[]\n state: AthenaRpcBuilderStateAst\n }\n transport: {\n mode: 'rpc-post' | 'rpc-get'\n endpoint: '/gateway/rpc' | `/rpc/${string}`\n payload: AthenaRpcPayload\n }\n}\n\nexport interface AthenaRawQueryDebugAst extends AthenaDebugAstBase<'query'> {\n input: {\n query: string\n }\n transport: {\n mode: 'raw-query'\n endpoint: '/gateway/query'\n payload: {\n query: string\n }\n }\n}\n\nexport type AthenaQueryDebugAst =\n | AthenaSelectDebugAst\n | AthenaFindManyDebugAst\n | AthenaInsertDebugAst\n | AthenaUpsertDebugAst\n | AthenaUpdateDebugAst\n | AthenaDeleteDebugAst\n | AthenaRpcDebugAst\n | AthenaRawQueryDebugAst\n\nfunction cloneConditions(conditions: AthenaGatewayCondition[]): AthenaGatewayCondition[] {\n return conditions.map(condition => ({ ...condition }))\n}\n\nexport function cloneTableBuilderStateAst(\n state: AthenaTableBuilderStateAst,\n): AthenaTableBuilderStateAst {\n return {\n conditions: cloneConditions(state.conditions),\n limit: state.limit,\n offset: state.offset,\n order: state.order ? { ...state.order } : undefined,\n currentPage: state.currentPage,\n pageSize: state.pageSize,\n totalPages: state.totalPages,\n }\n}\n\nexport function cloneRpcBuilderStateAst(\n state: AthenaRpcBuilderStateAst,\n): AthenaRpcBuilderStateAst {\n return {\n filters: state.filters.map(filter => ({ ...filter })),\n limit: state.limit,\n offset: state.offset,\n order: state.order ? { ...state.order } : undefined,\n }\n}\n\nfunction toSelectTransportAst(plan: AthenaSelectTransportPlan): AthenaSelectDebugTransport {\n if (plan.kind === 'query') {\n return {\n mode: 'typed-query',\n endpoint: '/gateway/query',\n payload: plan.payload,\n }\n }\n\n return {\n mode: plan.payload.select !== undefined ? 'structured-fetch' : 'compiled-fetch',\n endpoint: '/gateway/fetch',\n payload: plan.payload,\n }\n}\n\nfunction resolveDebugTableName(tableName: string | undefined): string {\n return tableName ?? '__unknown_table__'\n}\n\nexport function buildSelectDebugAst(input: {\n tableName: string\n columns: string | string[]\n state: AthenaTableBuilderStateAst\n plan: AthenaSelectTransportPlan\n}): AthenaSelectDebugAst {\n return {\n version: 1,\n kind: 'select',\n tableName: input.tableName,\n input: {\n columns: input.columns,\n state: cloneTableBuilderStateAst(input.state),\n },\n transport: toSelectTransportAst(input.plan),\n }\n}\n\nexport function buildFindManyCompiledDebugAst<\n Row,\n TSelect extends AthenaSelectShape,\n>(input: {\n tableName: string\n /** Already validated at the public `findMany` callsite. */\n options: AthenaFindManyOptions<Row, TSelect>\n compiledColumns: string\n baseState: AthenaTableBuilderStateAst\n executionState: AthenaTableBuilderStateAst\n plan: AthenaSelectTransportPlan\n}): AthenaFindManyDebugAst<Row, TSelect> {\n return {\n version: 1,\n kind: 'findMany',\n tableName: input.tableName,\n input: {\n select: input.options.select,\n where: input.options.where,\n orderBy: input.options.orderBy,\n limit: input.options.limit,\n },\n compiled: {\n columns: input.compiledColumns,\n baseState: cloneTableBuilderStateAst(input.baseState),\n executionState: cloneTableBuilderStateAst(input.executionState),\n },\n transport: planToFindManyTransport<Row, TSelect>(input.plan),\n }\n}\n\nexport function buildFindManyDirectDebugAst<\n Row,\n TSelect extends AthenaSelectShape,\n>(input: {\n tableName: string\n /** Already validated at the public `findMany` callsite. */\n options: AthenaFindManyOptions<Row, TSelect>\n compiledColumns: string\n baseState: AthenaTableBuilderStateAst\n executionState: AthenaTableBuilderStateAst\n payload: AthenaFindManyAstPayload<Row, TSelect>\n}): AthenaFindManyDebugAst<Row, TSelect> {\n return {\n version: 1,\n kind: 'findMany',\n tableName: input.tableName,\n input: {\n select: input.options.select,\n where: input.options.where,\n orderBy: input.options.orderBy,\n limit: input.options.limit,\n },\n compiled: {\n columns: input.compiledColumns,\n baseState: cloneTableBuilderStateAst(input.baseState),\n executionState: cloneTableBuilderStateAst(input.executionState),\n },\n transport: {\n mode: 'direct-ast-fetch',\n endpoint: '/gateway/fetch',\n payload: input.payload,\n },\n }\n}\n\nfunction planToFindManyTransport<\n Row,\n TSelect extends AthenaSelectShape,\n>(\n plan: AthenaSelectTransportPlan,\n): AthenaFindManyDebugTransport<Row, TSelect> {\n if (plan.kind === 'query') {\n return {\n mode: 'compiled-query',\n endpoint: '/gateway/query',\n payload: plan.payload,\n }\n }\n\n return {\n mode: plan.payload.select !== undefined ? 'structured-fetch' : 'compiled-fetch',\n endpoint: '/gateway/fetch',\n payload: plan.payload,\n }\n}\n\nexport function buildInsertDebugAst(payload: AthenaInsertPayload): AthenaInsertDebugAst {\n return {\n version: 1,\n kind: 'insert',\n tableName: payload.table_name,\n input: {\n values: payload.insert_body,\n returning: payload.columns,\n count: payload.count,\n head: payload.head,\n defaultToNull: payload.default_to_null,\n },\n transport: {\n mode: 'insert',\n endpoint: '/gateway/insert',\n payload,\n },\n }\n}\n\nexport function buildUpsertDebugAst(payload: AthenaInsertPayload): AthenaUpsertDebugAst {\n return {\n version: 1,\n kind: 'upsert',\n tableName: payload.table_name,\n input: {\n values: payload.insert_body,\n updateBody: payload.update_body,\n onConflict: payload.on_conflict,\n returning: payload.columns,\n count: payload.count,\n head: payload.head,\n defaultToNull: payload.default_to_null,\n },\n transport: {\n mode: 'upsert',\n endpoint: '/gateway/insert',\n payload,\n },\n }\n}\n\nexport function buildUpdateDebugAst(input: {\n state: AthenaTableBuilderStateAst\n payload: AthenaUpdatePayload\n}): AthenaUpdateDebugAst {\n return {\n version: 1,\n kind: 'update',\n tableName: resolveDebugTableName(input.payload.table_name),\n input: {\n values: input.payload.update_body,\n state: cloneTableBuilderStateAst(input.state),\n returning: input.payload.columns,\n },\n transport: {\n mode: 'update',\n endpoint: '/gateway/update',\n payload: input.payload,\n },\n }\n}\n\nexport function buildDeleteDebugAst(input: {\n state: AthenaTableBuilderStateAst\n payload: AthenaDeletePayload\n}): AthenaDeleteDebugAst {\n return {\n version: 1,\n kind: 'delete',\n tableName: input.payload.table_name,\n input: {\n resourceId: input.payload.resource_id,\n state: cloneTableBuilderStateAst(input.state),\n returning: input.payload.columns,\n },\n transport: {\n mode: 'delete',\n endpoint: '/gateway/delete',\n payload: input.payload,\n },\n }\n}\n\nexport function buildRpcDebugAst(input: {\n functionName: string\n args?: AthenaJsonObject\n selectedColumns?: string | string[]\n state: AthenaRpcBuilderStateAst\n payload: AthenaRpcPayload\n endpoint: '/gateway/rpc' | `/rpc/${string}`\n}): AthenaRpcDebugAst {\n return {\n version: 1,\n kind: 'rpc',\n functionName: input.functionName,\n input: {\n args: input.args,\n select: input.selectedColumns,\n state: cloneRpcBuilderStateAst(input.state),\n },\n transport: {\n mode: input.endpoint === '/gateway/rpc' ? 'rpc-post' : 'rpc-get',\n endpoint: input.endpoint,\n payload: input.payload,\n },\n }\n}\n\nexport function buildRawQueryDebugAst(query: string): AthenaRawQueryDebugAst {\n return {\n version: 1,\n kind: 'query',\n input: {\n query,\n },\n transport: {\n mode: 'raw-query',\n endpoint: '/gateway/query',\n payload: {\n query,\n },\n },\n }\n}\n\nexport function attachAthenaDebugAst(\n target: unknown,\n ast: AthenaQueryDebugAst | undefined,\n): void {\n if (!ast) {\n return\n }\n if (!target || (typeof target !== 'object' && typeof target !== 'function')) {\n return\n }\n Object.defineProperty(target, ATHENA_DEBUG_AST_KEY, {\n value: ast,\n enumerable: false,\n configurable: true,\n writable: false,\n })\n}\n\nexport function getAthenaDebugAst(\n value: unknown,\n): AthenaQueryDebugAst | null {\n if (!value || (typeof value !== 'object' && typeof value !== 'function')) {\n return null\n }\n return ((value as Record<string, unknown>)[ATHENA_DEBUG_AST_KEY] as AthenaQueryDebugAst | undefined) ?? null\n}\n","/**\n * Portable Athena read-query definition and executor.\n *\n * Runs findMany / select page queries against `createClient(...).db` with\n * expression columns, display aliases, filters, order, and total-count handling.\n * UI hooks (pagination, dataProxy, TanStack) live in consumer packages such as\n * athena-auth-ui — this module is the SDK contract only.\n */\n\nimport type { AthenaClient } from '../v3-client.ts'\nimport {\n type AthenaQueryDebugAst,\n getAthenaDebugAst,\n} from '../query-debug-ast.ts'\n\nexport type AthenaReadQueryMode = 'findMany' | 'select'\n\nexport type AthenaReadQueryFilterOperator =\n | 'eq'\n | 'gt'\n | 'gte'\n | 'ilike'\n | 'in'\n | 'is'\n | 'like'\n | 'lt'\n | 'lte'\n | 'neq'\n\nexport type AthenaReadQueryOrderDirection = 'asc' | 'desc'\n\nexport interface AthenaReadQueryRelationRef {\n name: string\n schema?: string\n table: string\n}\n\n/**\n * One projected field: `column` is the Athena select expression (or base column),\n * `key` is the flat-row alias after execution.\n */\nexport interface AthenaReadQueryColumn {\n column: string\n key: string\n label?: string\n relation?: AthenaReadQueryRelationRef\n}\n\nexport type AthenaReadQueryFilterValue =\n | boolean\n | number\n | null\n | readonly (boolean | number | string | null)[]\n | string\n\nexport interface AthenaReadQueryFilter {\n column: string\n operator?: AthenaReadQueryFilterOperator\n value: AthenaReadQueryFilterValue\n}\n\nexport interface AthenaReadQueryOrder {\n column: string\n direction?: AthenaReadQueryOrderDirection\n}\n\nexport type AthenaReadQueryOrderByInput =\n | AthenaReadQueryOrder\n | readonly AthenaReadQueryOrder[]\n\n/**\n * Portable read definition shared by SDK callers, app data proxies, and UI hooks.\n */\nexport interface AthenaReadQueryDefinition {\n columns: readonly AthenaReadQueryColumn[]\n countColumn: string\n filters?: readonly AthenaReadQueryFilter[]\n limit?: number\n mode?: AthenaReadQueryMode\n /** Single order or multi-column order list. */\n orderBy?: AthenaReadQueryOrderByInput\n rowKey?: string\n schema?: string\n table: string\n}\n\nexport function normalizeAthenaReadQueryOrderBy(\n orderBy: AthenaReadQueryOrderByInput | undefined,\n): AthenaReadQueryOrder[] {\n if (!orderBy) {\n return []\n }\n const list = Array.isArray(orderBy) ? orderBy : [orderBy]\n return list.filter(\n (entry) =>\n entry &&\n typeof entry.column === 'string' &&\n entry.column.trim().length > 0,\n )\n}\n\nexport type AthenaReadQueryFlatRow = Record<string, unknown> & {\n __rowKey: string\n}\n\n/** Minimal client shape: any `createClient(...)` result (or scoped view) with `.db`. */\nexport interface AthenaReadQueryClient {\n readonly db: AthenaClient['db'] | object\n}\n\nexport interface AthenaReadQueryExecutionInput {\n client: AthenaReadQueryClient\n page: number\n pageSize: number\n query: AthenaReadQueryDefinition\n}\n\nexport interface AthenaReadQueryExecutionResult {\n debugAst?: AthenaQueryDebugAst\n rows: AthenaReadQueryFlatRow[]\n totalItems: number\n}\n\n// ---------------------------------------------------------------------------\n// Back-compat table-oriented aliases (athena-auth-ui and existing consumers)\n// ---------------------------------------------------------------------------\n\n/** @deprecated Prefer {@link AthenaReadQueryMode}. */\nexport type AthenaTableQueryMode = AthenaReadQueryMode\n/** @deprecated Prefer {@link AthenaReadQueryFilterOperator}. */\nexport type AthenaTableFilterOperator = AthenaReadQueryFilterOperator\n/** @deprecated Prefer {@link AthenaReadQueryOrderDirection}. */\nexport type AthenaTableOrderDirection = AthenaReadQueryOrderDirection\n/** @deprecated Prefer {@link AthenaReadQueryRelationRef}. */\nexport type AthenaTableRelationRef = AthenaReadQueryRelationRef\n/** @deprecated Prefer {@link AthenaReadQueryColumn}. */\nexport type AthenaTableQueryColumn = AthenaReadQueryColumn\n/** @deprecated Prefer {@link AthenaReadQueryFilterValue}. */\nexport type AthenaTableFilterValue = AthenaReadQueryFilterValue\n/** @deprecated Prefer {@link AthenaReadQueryFilter}. */\nexport type AthenaTableFilter = AthenaReadQueryFilter\n/** @deprecated Prefer {@link AthenaReadQueryOrder}. */\nexport type AthenaTableOrder = AthenaReadQueryOrder\n/** @deprecated Prefer {@link AthenaReadQueryOrderByInput}. */\nexport type AthenaTableOrderByInput = AthenaReadQueryOrderByInput\n/** @deprecated Prefer {@link AthenaReadQueryDefinition}. */\nexport type AthenaTableQueryDefinition = AthenaReadQueryDefinition\n/** @deprecated Prefer {@link AthenaReadQueryFlatRow}. */\nexport type AthenaTableFlatRow = AthenaReadQueryFlatRow\n/** @deprecated Prefer {@link AthenaReadQueryClient}. */\nexport type AthenaTableQueryClient = AthenaReadQueryClient\n/** @deprecated Prefer {@link AthenaReadQueryExecutionInput}. */\nexport type AthenaTableQueryExecutionInput = AthenaReadQueryExecutionInput\n/** @deprecated Prefer {@link AthenaReadQueryExecutionResult}. */\nexport type AthenaTableQueryExecutionResult = AthenaReadQueryExecutionResult\n\ninterface AthenaSelectRelationNode {\n schema?: string\n select: AthenaSelectShape\n}\n\ntype AthenaSelectShape = Record<string, true | AthenaSelectRelationNode>\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction flattenAthenaRowValue(\n row: Record<string, unknown>,\n column: AthenaReadQueryColumn,\n) {\n if (!column.relation) {\n return row[column.column]\n }\n\n const relationValue = row[column.relation.name]\n\n if (Array.isArray(relationValue)) {\n return relationValue\n .map((entry) => (isRecord(entry) ? entry[column.column] : undefined))\n .filter((entry) => entry !== undefined)\n }\n\n if (isRecord(relationValue)) {\n return relationValue[column.column]\n }\n\n return undefined\n}\n\nfunction resolveFlatRowKey(\n row: AthenaReadQueryFlatRow,\n index: number,\n preferredKey: string | undefined,\n) {\n const preferredValue =\n preferredKey && preferredKey in row ? row[preferredKey] : undefined\n\n if (\n preferredValue !== undefined &&\n preferredValue !== null &&\n `${preferredValue}`.trim().length > 0\n ) {\n return String(preferredValue)\n }\n\n for (const [key, value] of Object.entries(row)) {\n if (key === '__rowKey') {\n continue\n }\n\n if (value === undefined || value === null) {\n continue\n }\n\n if (Array.isArray(value)) {\n if (value.length > 0) {\n return `${key}-${value.join('-')}`\n }\n\n continue\n }\n\n const nextValue = String(value).trim()\n\n if (nextValue.length > 0) {\n return nextValue\n }\n }\n\n return `row-${index + 1}`\n}\n\nexport function flattenAthenaReadQueryRows(\n rows: readonly unknown[],\n columns: readonly AthenaReadQueryColumn[],\n preferredKey: string | undefined,\n) {\n return rows.map((entry, index) => {\n const sourceRow = isRecord(entry) ? entry : {}\n const flatRow = columns.reduce<AthenaReadQueryFlatRow>(\n (currentRow, column) => {\n currentRow[column.key] = flattenAthenaRowValue(sourceRow, column)\n return currentRow\n },\n { __rowKey: '' },\n )\n\n flatRow.__rowKey = resolveFlatRowKey(flatRow, index, preferredKey)\n\n return flatRow\n })\n}\n\n/** @deprecated Prefer {@link flattenAthenaReadQueryRows}. */\nexport const flattenAthenaRows = flattenAthenaReadQueryRows\n\nexport function buildAthenaReadQuerySelectString(\n columns: readonly AthenaReadQueryColumn[],\n) {\n const baseColumns = columns\n .filter((column) => !column.relation)\n .map((column) => column.column)\n const relationGroups = new Map<\n string,\n { columns: string[]; relation: AthenaReadQueryRelationRef }\n >()\n\n for (const column of columns) {\n if (!column.relation) {\n continue\n }\n\n const groupKey = [\n column.relation.name,\n column.relation.schema ?? '',\n column.relation.table,\n ].join(':')\n const existingGroup = relationGroups.get(groupKey)\n\n if (existingGroup) {\n if (!existingGroup.columns.includes(column.column)) {\n existingGroup.columns.push(column.column)\n }\n continue\n }\n\n relationGroups.set(groupKey, {\n columns: [column.column],\n relation: column.relation,\n })\n }\n\n const relationColumns = [...relationGroups.values()].map(\n ({ columns: relationColumns, relation }) => {\n const relationTarget = relation.schema\n ? `${relation.schema}.${relation.table}`\n : relation.table\n\n return `${relation.name}:${relationTarget}(${relationColumns.join(',')})`\n },\n )\n\n return [...baseColumns, ...relationColumns].join(',')\n}\n\n/** @deprecated Prefer {@link buildAthenaReadQuerySelectString}. */\nexport const buildAthenaTableSelectString = buildAthenaReadQuerySelectString\n\nexport function buildAthenaReadQueryFindManySelect(\n columns: readonly AthenaReadQueryColumn[],\n) {\n const select: AthenaSelectShape = {}\n\n for (const column of columns) {\n if (!column.relation) {\n select[column.column] = true\n continue\n }\n\n const existingRelation = select[column.relation.name]\n\n if (\n existingRelation &&\n existingRelation !== true &&\n isRecord(existingRelation.select)\n ) {\n existingRelation.select[column.column] = true\n continue\n }\n\n select[column.relation.name] = {\n ...(column.relation.schema ? { schema: column.relation.schema } : {}),\n select: {\n [column.column]: true,\n },\n }\n }\n\n return select\n}\n\n/** @deprecated Prefer {@link buildAthenaReadQueryFindManySelect}. */\nexport const buildAthenaTableFindManySelect = buildAthenaReadQueryFindManySelect\n\nexport function buildAthenaReadQueryFindManyWhere(\n filters: readonly AthenaReadQueryFilter[] | undefined,\n) {\n if (!filters?.length) {\n return\n }\n\n return filters.reduce<Record<string, AthenaReadQueryFilterValue | object>>(\n (where, filter) => {\n const operator = filter.operator ?? 'eq'\n\n where[filter.column] =\n operator === 'eq' ? filter.value : { [operator]: filter.value }\n\n return where\n },\n {},\n )\n}\n\n/** @deprecated Prefer {@link buildAthenaReadQueryFindManyWhere}. */\nexport const buildAthenaTableFindManyWhere = buildAthenaReadQueryFindManyWhere\n\n/**\n * Builds findMany `orderBy` in the Athena SDK object shape.\n * Single-order keeps the legacy `{ column, ascending }` form for back-compat.\n */\nexport function buildAthenaReadQueryFindManyOrderBy(\n orderBy: AthenaReadQueryOrderByInput | undefined,\n):\n | Record<string, 'asc' | 'desc' | { ascending: boolean }>\n | { ascending: boolean; column: string }\n | undefined {\n const normalized = normalizeAthenaReadQueryOrderBy(orderBy)\n if (normalized.length === 0) {\n return\n }\n\n if (normalized.length === 1) {\n const primary = normalized[0]\n if (!primary) {\n return\n }\n return {\n ascending: primary.direction !== 'desc',\n column: primary.column,\n }\n }\n\n return Object.fromEntries(\n normalized.map((entry) => [\n entry.column,\n entry.direction === 'desc' ? 'desc' : 'asc',\n ]),\n )\n}\n\n/** @deprecated Prefer {@link buildAthenaReadQueryFindManyOrderBy}. */\nexport const buildAthenaTableFindManyOrderBy = buildAthenaReadQueryFindManyOrderBy\n\n/** @deprecated Prefer {@link normalizeAthenaReadQueryOrderBy}. */\nexport const normalizeAthenaTableOrderBy = normalizeAthenaReadQueryOrderBy\n\nexport function applyAthenaReadQueryFilters<T extends object>(\n queryBuilder: T,\n filters: readonly AthenaReadQueryFilter[] | undefined,\n) {\n if (!filters?.length) {\n return queryBuilder\n }\n\n return filters.reduce<T>((currentBuilder, filter) => {\n const operator = filter.operator ?? 'eq'\n const builderMethod = (currentBuilder as Record<string, unknown>)[operator]\n\n if (typeof builderMethod !== 'function') {\n return currentBuilder\n }\n\n return builderMethod.call(currentBuilder, filter.column, filter.value) as T\n }, queryBuilder)\n}\n\n/** @deprecated Prefer {@link applyAthenaReadQueryFilters}. */\nexport const applyAthenaTableFilters = applyAthenaReadQueryFilters\n\nexport function applyAthenaReadQuerySelectOrder<\n T extends { order: (column: string, options: { ascending: boolean }) => T },\n>(queryBuilder: T, orderBy: AthenaReadQueryOrderByInput | undefined) {\n const normalized = normalizeAthenaReadQueryOrderBy(orderBy)\n if (normalized.length === 0) {\n return queryBuilder\n }\n\n return normalized.reduce<T>(\n (builder, entry) =>\n builder.order(entry.column, {\n ascending: entry.direction !== 'desc',\n }),\n queryBuilder,\n )\n}\n\n/** @deprecated Prefer {@link applyAthenaReadQuerySelectOrder}. */\nexport const applyAthenaTableSelectOrder = applyAthenaReadQuerySelectOrder\n\nexport function applyAthenaReadQuerySelectLimit<\n T extends { limit: (value: number) => T },\n>(queryBuilder: T, limit: number | undefined) {\n if (!limit || limit < 1) {\n return queryBuilder\n }\n\n return queryBuilder.limit(limit)\n}\n\n/** @deprecated Prefer {@link applyAthenaReadQuerySelectLimit}. */\nexport const applyAthenaTableSelectLimit = applyAthenaReadQuerySelectLimit\n\nexport function clampAthenaReadQueryTotalItems(\n totalItems: number,\n limit: number | undefined,\n) {\n if (!limit || limit < 1) {\n return totalItems\n }\n\n return Math.min(totalItems, limit)\n}\n\n/** @deprecated Prefer {@link clampAthenaReadQueryTotalItems}. */\nexport const clampAthenaTableTotalItems = clampAthenaReadQueryTotalItems\n\nfunction resolveCountValue(\n ...candidates: Array<number | null | undefined>\n): number {\n for (const candidate of candidates) {\n if (typeof candidate === 'number' && Number.isFinite(candidate)) {\n return Math.max(0, Math.trunc(candidate))\n }\n }\n return 0\n}\n\nfunction resolveTotalItemsFromPage({\n countCandidates,\n limit,\n page,\n pageSize,\n rowCount,\n}: {\n countCandidates: Array<number | null | undefined>\n limit: number | undefined\n page: number\n pageSize: number\n rowCount: number\n}) {\n const exactCount = resolveCountValue(...countCandidates)\n if (exactCount > 0) {\n return clampAthenaReadQueryTotalItems(exactCount, limit)\n }\n\n // Prefer a synthetic total over \"0 results\" when the page has rows\n // (count head failed or returned null while data succeeded).\n if (rowCount > 0) {\n const base = (page - 1) * pageSize + rowCount\n const synthetic = rowCount >= pageSize ? base + 1 : base\n return clampAthenaReadQueryTotalItems(synthetic, limit)\n }\n\n return clampAthenaReadQueryTotalItems(exactCount, limit)\n}\n\n/**\n * Execute a portable {@link AthenaReadQueryDefinition} against a v3 Athena client.\n *\n * Pass `createClient({ url, key })` or a `withContext` / session-scoped view.\n * Does not construct clients and does not perform HTTP proxy routing.\n */\nexport async function executeAthenaReadQuery({\n client,\n page,\n pageSize,\n query,\n}: AthenaReadQueryExecutionInput): Promise<AthenaReadQueryExecutionResult> {\n const db = (client as AthenaClient).db\n const baseBuilder = db.from(query.table, {\n schema: query.schema,\n })\n const countBuilder = applyAthenaReadQueryFilters(\n db.from(query.table, { schema: query.schema }),\n query.filters,\n )\n const countResult = await countBuilder.select(query.countColumn, {\n count: 'exact',\n head: true,\n })\n\n if ((query.mode ?? 'findMany') === 'select') {\n const selectBuilder = applyAthenaReadQuerySelectLimit(\n applyAthenaReadQuerySelectOrder(\n applyAthenaReadQueryFilters(baseBuilder, query.filters),\n query.orderBy,\n ),\n query.limit,\n )\n const result = await selectBuilder\n .currentPage(page)\n .pageSize(pageSize)\n .select(buildAthenaReadQuerySelectString(query.columns), {\n count: 'exact',\n })\n const rows = flattenAthenaReadQueryRows(\n Array.isArray(result.data) ? result.data : [],\n query.columns,\n query.rowKey,\n )\n\n return {\n debugAst: getAthenaDebugAst(result) ?? undefined,\n rows,\n totalItems: resolveTotalItemsFromPage({\n countCandidates: [countResult.count, result.count],\n limit: query.limit,\n page,\n pageSize,\n rowCount: rows.length,\n }),\n }\n }\n\n const findManyOrderBy = buildAthenaReadQueryFindManyOrderBy(query.orderBy)\n const findManyOptions: Parameters<typeof baseBuilder.findMany>[0] = {\n ...(query.limit ? { limit: query.limit } : {}),\n ...(findManyOrderBy ? { orderBy: findManyOrderBy } : {}),\n select: buildAthenaReadQueryFindManySelect(query.columns) as never,\n ...(query.filters?.length\n ? { where: buildAthenaReadQueryFindManyWhere(query.filters) as never }\n : {}),\n }\n\n const result = await baseBuilder\n .currentPage(page)\n .pageSize(pageSize)\n .findMany(findManyOptions)\n const rows = flattenAthenaReadQueryRows(\n Array.isArray(result.data) ? result.data : [],\n query.columns,\n query.rowKey,\n )\n\n return {\n debugAst: getAthenaDebugAst(result) ?? undefined,\n rows,\n totalItems: resolveTotalItemsFromPage({\n countCandidates: [countResult.count, result.count],\n limit: query.limit,\n page,\n pageSize,\n rowCount: rows.length,\n }),\n }\n}\n\n/**\n * @deprecated Prefer {@link executeAthenaReadQuery}. Same implementation.\n */\nexport const executeAthenaTableQuery = executeAthenaReadQuery\n","import { useMemo } from 'react'\nimport {\n type AthenaReadQueryClient,\n type AthenaReadQueryDefinition,\n type AthenaReadQueryExecutionResult,\n type AthenaReadQueryFlatRow,\n executeAthenaReadQuery,\n} from '../query/read-query.ts'\nimport type { AthenaQueryError, QueryKey, QueryStatus } from './types.ts'\nimport { useQuery } from './use-query.ts'\n\nconst DEFAULT_PAGE = 1\nconst DEFAULT_PAGE_SIZE = 10\n\nexport interface UseAthenaReadQueryOptions {\n /**\n * v3 Athena client (`createClient(...)` or a `withContext` / session-scoped view).\n * Required for fetches when `enabled` is true.\n */\n client?: AthenaReadQueryClient | null\n /** Portable definition (expression columns + aliases). */\n query: AthenaReadQueryDefinition\n /** 1-based page (default 1). */\n page?: number\n /** Page size (default 10). */\n pageSize?: number\n enabled?: boolean\n /** Full cache key; when set, overrides the default key composition. */\n queryKey?: QueryKey\n /** Prepended to the default key when `queryKey` is omitted. */\n queryKeyPrefix?: QueryKey\n refetchOnMount?: boolean\n refetchOnWindowFocus?: boolean\n refetchOnReconnect?: boolean\n retry?: number | false\n}\n\nexport interface UseAthenaReadQueryResult {\n data: AthenaReadQueryExecutionResult | undefined\n rows: AthenaReadQueryFlatRow[]\n totalItems: number\n debugAst: AthenaReadQueryExecutionResult['debugAst']\n page: number\n pageSize: number\n error: AthenaQueryError | null\n isLoading: boolean\n isFetching: boolean\n isSuccess: boolean\n isError: boolean\n status: QueryStatus\n refetch: () => Promise<unknown>\n reset: () => void\n}\n\nfunction isReadQueryRunnable(query: AthenaReadQueryDefinition): boolean {\n return (\n query.table.trim().length > 0 &&\n query.columns.length > 0 &&\n query.countColumn.trim().length > 0\n )\n}\n\n/**\n * Athena-native React hook for {@link AthenaReadQueryDefinition} page reads.\n *\n * Uses `@xylex-group/athena/react` `useQuery` + `AthenaQueryClient` (not TanStack).\n * Does **not** construct clients, open a data proxy, or manage table UI pagination.\n *\n * For HeroUI tables / TanStack / `dataProxy`, use auth-ui `useAthenaQuery` instead.\n *\n * @example\n * ```tsx\n * const athena = createClient({ url, key })\n * // under AthenaQueryClientProvider\n * const { rows, totalItems, isLoading } = useAthenaReadQuery({\n * client: athena,\n * page: 1,\n * pageSize: 20,\n * query: {\n * table: 'orders',\n * countColumn: 'id',\n * columns: [{ column: 'id', key: 'id' }],\n * },\n * })\n * ```\n */\nexport function useAthenaReadQuery({\n client,\n query,\n page = DEFAULT_PAGE,\n pageSize = DEFAULT_PAGE_SIZE,\n enabled = true,\n queryKey,\n queryKeyPrefix,\n refetchOnMount,\n refetchOnWindowFocus,\n refetchOnReconnect,\n retry,\n}: UseAthenaReadQueryOptions): UseAthenaReadQueryResult {\n const resolvedPage = page > 0 ? Math.trunc(page) : DEFAULT_PAGE\n const resolvedPageSize = pageSize > 0 ? Math.trunc(pageSize) : DEFAULT_PAGE_SIZE\n\n const queryEnabled =\n enabled && !!client && isReadQueryRunnable(query)\n\n const defaultQueryKey = useMemo(\n () =>\n [\n 'athena',\n 'read-query',\n query.mode ?? 'findMany',\n query.table,\n query.schema,\n query.columns,\n query.filters,\n query.limit,\n query.orderBy,\n query.rowKey,\n query.countColumn,\n resolvedPage,\n resolvedPageSize,\n ] as const,\n [\n query.columns,\n query.countColumn,\n query.filters,\n query.limit,\n query.mode,\n query.orderBy,\n query.rowKey,\n query.schema,\n query.table,\n resolvedPage,\n resolvedPageSize,\n ],\n )\n\n const resolvedQueryKey = useMemo((): QueryKey => {\n if (queryKey !== undefined) {\n return queryKey\n }\n if (queryKeyPrefix !== undefined) {\n const prefix = Array.isArray(queryKeyPrefix)\n ? queryKeyPrefix\n : [queryKeyPrefix]\n return [...prefix, ...defaultQueryKey]\n }\n return defaultQueryKey\n }, [defaultQueryKey, queryKey, queryKeyPrefix])\n\n const result = useQuery<AthenaReadQueryExecutionResult>({\n enabled: queryEnabled,\n queryKey: resolvedQueryKey,\n queryFn: async () => {\n if (!client) {\n throw new Error('Athena client is required to run the read query.')\n }\n return executeAthenaReadQuery({\n client,\n page: resolvedPage,\n pageSize: resolvedPageSize,\n query,\n })\n },\n refetchOnMount,\n refetchOnWindowFocus,\n refetchOnReconnect,\n retry,\n })\n\n return {\n data: result.data,\n rows: result.data?.rows ?? [],\n totalItems: result.data?.totalItems ?? 0,\n debugAst: result.data?.debugAst,\n page: resolvedPage,\n pageSize: resolvedPageSize,\n error: result.error,\n isLoading: result.isLoading,\n isFetching: result.isFetching,\n isSuccess: result.isSuccess,\n isError: result.isError,\n status: result.status,\n refetch: result.refetch,\n reset: result.reset,\n }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type {\n AthenaAuthCallOptions,\n AthenaAuthErrorCode,\n AthenaAuthErrorDetails,\n AthenaAuthFetchCompatibleInput,\n AthenaAuthResult,\n AthenaAuthSessionResponse,\n} from '../auth/types.ts'\n\nexport interface UseSessionOptions {\n enabled?: boolean\n refetchOnMount?: boolean\n fetchInput?: AthenaAuthFetchCompatibleInput\n callOptions?: AthenaAuthCallOptions\n}\n\nexport interface UseSessionResult<\n TSessionData extends AthenaAuthSessionResponse = AthenaAuthSessionResponse,\n> {\n data: TSessionData | null\n error: AthenaAuthErrorDetails | null\n isPending: boolean\n isRefetching: boolean\n refetch: () => Promise<TSessionData | null>\n}\n\ntype SessionGetter<TSessionData extends AthenaAuthSessionResponse> = (\n input?: AthenaAuthFetchCompatibleInput,\n options?: AthenaAuthCallOptions,\n) => Promise<AthenaAuthResult<TSessionData>>\n\n/**\n * Anything `useSession` can resolve a `getSession` from:\n * - auth-ui compatibility client → top-level `getSession`\n * - `createClient(...)` → `auth.getSession`\n * - `createClient(...).auth` → `getSession` on bindings\n */\nexport type UseSessionAuthClient<\n TSessionData extends AthenaAuthSessionResponse = AthenaAuthSessionResponse,\n> =\n | { getSession: SessionGetter<TSessionData> }\n | { auth: { getSession: SessionGetter<TSessionData> } }\n\ntype InferSessionData<TClient> =\n TClient extends { getSession: (...args: unknown[]) => Promise<AthenaAuthResult<infer TSessionData>> }\n ? TSessionData extends AthenaAuthSessionResponse\n ? TSessionData\n : AthenaAuthSessionResponse\n : TClient extends {\n auth: { getSession: (...args: unknown[]) => Promise<AthenaAuthResult<infer TSessionData>> }\n }\n ? TSessionData extends AthenaAuthSessionResponse\n ? TSessionData\n : AthenaAuthSessionResponse\n : AthenaAuthSessionResponse\n\nfunction resolveGetSession<TSessionData extends AthenaAuthSessionResponse>(\n authClient: UseSessionAuthClient<TSessionData>,\n): SessionGetter<TSessionData> {\n if ('getSession' in authClient && typeof authClient.getSession === 'function') {\n return authClient.getSession\n }\n\n if (\n 'auth' in authClient &&\n authClient.auth &&\n typeof authClient.auth.getSession === 'function'\n ) {\n return authClient.auth.getSession\n }\n\n throw new Error('useSession requires an auth-capable client (createClient(...).auth)')\n}\n\n/**\n * Better Auth style session hook for Athena.\n *\n * Pass any of:\n * - `createClient({ url, key, auth: { url } })` — uses `client.auth.getSession`\n * - `createClient(...).auth` — auth bindings only\n *\n * @example\n * ```tsx\n * const athena = createClient({ url, key, auth: { url: \"/api/auth\" } })\n * const { data, isPending } = useSession(athena)\n * ```\n */\nexport function useSession<TClient extends UseSessionAuthClient>(\n authClient: TClient,\n options: UseSessionOptions = {},\n): UseSessionResult<InferSessionData<TClient>> {\n type SessionData = InferSessionData<TClient>\n const enabled = options.enabled ?? true\n const refetchOnMount = options.refetchOnMount ?? true\n\n const [data, setData] = useState<SessionData | null>(null)\n const [error, setError] = useState<AthenaAuthErrorDetails | null>(null)\n const [isPending, setIsPending] = useState<boolean>(enabled)\n const [isRefetching, setIsRefetching] = useState<boolean>(false)\n const requestIdRef = useRef(0)\n const mountedRef = useRef(true)\n const dataRef = useRef<SessionData | null>(null)\n const getSession = resolveGetSession<SessionData>(\n authClient as UseSessionAuthClient<SessionData>,\n )\n\n useEffect(() => {\n dataRef.current = data\n }, [data])\n\n const toFallbackErrorDetails = (\n code: AthenaAuthErrorCode,\n message: string,\n status: number,\n ): AthenaAuthErrorDetails => ({\n code,\n message,\n status,\n })\n\n const runFetch = useCallback(async () => {\n const requestId = ++requestIdRef.current\n const hasData = dataRef.current !== null\n\n if (hasData) {\n setIsRefetching(true)\n } else {\n setIsPending(true)\n }\n\n try {\n const result = await getSession(options.fetchInput, options.callOptions)\n if (!mountedRef.current || requestId !== requestIdRef.current) {\n return null\n }\n\n if (result.ok) {\n setData((result.data ?? null) as SessionData | null)\n setError(null)\n return (result.data ?? null) as SessionData | null\n }\n\n setError(\n result.errorDetails ??\n toFallbackErrorDetails(\n 'UNKNOWN_ERROR',\n result.error ?? 'Failed to fetch session',\n result.status,\n ),\n )\n return null\n } catch (requestError) {\n if (!mountedRef.current || requestId !== requestIdRef.current) {\n return null\n }\n\n const message =\n requestError instanceof Error ? requestError.message : 'Failed to fetch session'\n setError(toFallbackErrorDetails('NETWORK_ERROR', message, 0))\n return null\n } finally {\n if (mountedRef.current && requestId === requestIdRef.current) {\n setIsPending(false)\n setIsRefetching(false)\n }\n }\n }, [getSession, options.callOptions, options.fetchInput])\n\n useEffect(() => {\n mountedRef.current = true\n if (enabled && refetchOnMount) {\n void runFetch()\n } else {\n setIsPending(false)\n }\n return () => {\n mountedRef.current = false\n }\n }, [enabled, refetchOnMount, runFetch])\n\n const refetch = useCallback(async () => {\n return await runFetch()\n }, [runFetch])\n\n return {\n data,\n error,\n isPending,\n isRefetching,\n refetch,\n }\n}\n","import { useMemo } from 'react'\nimport type {\n AthenaAuthErrorDetails,\n AthenaAuthFetchCompatibleInput,\n AthenaAuthResult,\n AthenaAuthSessionResponse,\n AthenaAuthCallOptions,\n} from '../auth/types.ts'\nimport type { AthenaRequestContext } from '../v3-client.ts'\nimport {\n useSession,\n type UseSessionOptions,\n type UseSessionResult,\n} from './use-session.ts'\n\ntype SessionGetter<TSessionData extends AthenaAuthSessionResponse> = (\n input?: AthenaAuthFetchCompatibleInput,\n options?: AthenaAuthCallOptions,\n) => Promise<AthenaAuthResult<TSessionData>>\n\ntype AthenaContextScopedClient<\n TSessionData extends AthenaAuthSessionResponse = AthenaAuthSessionResponse,\n> = {\n auth: {\n getSession: SessionGetter<TSessionData>\n }\n withContext(context: AthenaRequestContext): unknown\n}\n\ntype InferSessionData<TClient> =\n TClient extends {\n auth: {\n getSession: (\n ...args: unknown[]\n ) => Promise<AthenaAuthResult<infer TSessionData>>\n }\n }\n ? TSessionData extends AthenaAuthSessionResponse\n ? TSessionData\n : AthenaAuthSessionResponse\n : AthenaAuthSessionResponse\n\ntype InferScopedClient<TClient> = TClient extends {\n withContext(context: AthenaRequestContext): infer TScopedClient\n}\n ? TScopedClient\n : TClient\n\nexport type UseAthenaSessionClientOptions = UseSessionOptions\n\nexport interface UseAthenaSessionClientResult<\n TClient,\n> {\n client: InferScopedClient<TClient>\n session: UseSessionResult<InferSessionData<TClient>>['data']\n userId: string | null\n organizationId: string | null\n error: AthenaAuthErrorDetails | null\n isPending: boolean\n isRefetching: boolean\n refetch: UseSessionResult<InferSessionData<TClient>>['refetch']\n}\n\nexport function useAthenaSessionClient<\n TClient extends AthenaContextScopedClient,\n>(\n baseClient: TClient,\n options: UseAthenaSessionClientOptions = {},\n): UseAthenaSessionClientResult<TClient> {\n const sessionState = useSession(baseClient, options)\n const scopedClient = useMemo(\n () =>\n (sessionState.data\n ? baseClient.withContext({\n userId: sessionState.data.user.id,\n organizationId: sessionState.data.session.activeOrganizationId,\n bearerToken: sessionState.data.session.token,\n sessionToken: sessionState.data.session.token,\n })\n : baseClient) as InferScopedClient<TClient>,\n [baseClient, sessionState.data],\n )\n const session =\n sessionState.data as UseAthenaSessionClientResult<TClient>['session']\n const refetch =\n sessionState.refetch as UseAthenaSessionClientResult<TClient>['refetch']\n\n return {\n client: scopedClient,\n session,\n userId: sessionState.data?.user.id ?? null,\n organizationId:\n sessionState.data?.session.activeOrganizationId ?? null,\n error: sessionState.error,\n isPending: sessionState.isPending,\n isRefetching: sessionState.isRefetching,\n refetch,\n } as UseAthenaSessionClientResult<TClient>\n}\n","import * as React from 'react'\nimport type { AthenaStorageCallOptions, AthenaStorageModule } from '../storage/module.ts'\nimport type {\n AthenaStorageFileUploadInput,\n AthenaStorageFileUploadResult,\n AthenaStorageUploadProgress,\n AthenaStorageUploadProgressHandler,\n AthenaStorageUploadSource,\n} from '../storage/file.ts'\n\nexport type UseStorageUploadInput =\n | AthenaStorageFileUploadInput\n | AthenaStorageUploadSource\n | readonly AthenaStorageUploadSource[]\n | ArrayLike<AthenaStorageUploadSource>\n\nexport interface UseStorageUploadOptions extends Omit<Partial<AthenaStorageFileUploadInput>, 'files' | 'onProgress'> {\n storage: Pick<AthenaStorageModule, 'file'>\n onProgress?: AthenaStorageUploadProgressHandler\n}\n\nexport interface UseStorageUploadResult {\n uploading: boolean\n progress: AthenaStorageUploadProgress | null\n percent: number\n error: unknown\n result: AthenaStorageFileUploadResult | null\n upload(\n input: UseStorageUploadInput,\n options?: AthenaStorageCallOptions,\n ): Promise<AthenaStorageFileUploadResult>\n abort(): void\n reset(): void\n}\n\nexport function useStorageUpload(options: UseStorageUploadOptions): UseStorageUploadResult {\n const {\n storage,\n onProgress,\n ...defaults\n } = options\n const [uploading, setUploading] = React.useState(false)\n const [progress, setProgress] = React.useState<AthenaStorageUploadProgress | null>(null)\n const [error, setError] = React.useState<unknown>(null)\n const [result, setResult] = React.useState<AthenaStorageFileUploadResult | null>(null)\n const controllerRef = React.useRef<AbortController | null>(null)\n\n const reset = React.useCallback(() => {\n setUploading(false)\n setProgress(null)\n setError(null)\n setResult(null)\n }, [])\n\n const abort = React.useCallback(() => {\n controllerRef.current?.abort()\n controllerRef.current = null\n }, [])\n\n const upload = React.useCallback(async (\n input: UseStorageUploadInput,\n callOptions?: AthenaStorageCallOptions,\n ) => {\n const controller = callOptions?.signal ? null : new AbortController()\n controllerRef.current = controller\n setUploading(true)\n setError(null)\n setResult(null)\n\n const request = normalizeHookUploadInput(defaults, input, progressEvent => {\n setProgress(progressEvent)\n onProgress?.(progressEvent)\n if (isStorageUploadInput(input)) {\n input.onProgress?.(progressEvent)\n }\n })\n\n try {\n const uploaded = await storage.file.upload(request, {\n ...callOptions,\n signal: callOptions?.signal ?? controller?.signal,\n })\n setResult(uploaded)\n return uploaded\n } catch (uploadError) {\n setError(uploadError)\n throw uploadError\n } finally {\n setUploading(false)\n if (controllerRef.current === controller) {\n controllerRef.current = null\n }\n }\n }, [defaults, onProgress, storage])\n\n return {\n uploading,\n progress,\n percent: progress?.aggregatePercent ?? 0,\n error,\n result,\n upload,\n abort,\n reset,\n }\n}\n\nfunction normalizeHookUploadInput(\n defaults: Omit<Partial<AthenaStorageFileUploadInput>, 'files' | 'onProgress'>,\n input: UseStorageUploadInput,\n onProgress: AthenaStorageUploadProgressHandler,\n): AthenaStorageFileUploadInput {\n if (isStorageUploadInput(input)) {\n return {\n ...defaults,\n ...input,\n onProgress,\n } as AthenaStorageFileUploadInput\n }\n return {\n ...defaults,\n files: input,\n onProgress,\n } as AthenaStorageFileUploadInput\n}\n\nfunction isStorageUploadInput(input: UseStorageUploadInput): input is AthenaStorageFileUploadInput {\n return Boolean(input)\n && typeof input === 'object'\n && 'files' in input\n && 's3_id' in input\n}\n","import * as React from 'react'\nimport type {\n AthenaStorageCallOptions,\n AthenaStorageModule,\n StorageListFilesResponse,\n} from '../storage/module.ts'\nimport type { AthenaStorageFileListInput } from '../storage/file.ts'\n\nexport interface UseStorageFilesOptions {\n storage: Pick<AthenaStorageModule, 'file'>\n input: AthenaStorageFileListInput | null | undefined\n enabled?: boolean\n callOptions?: AthenaStorageCallOptions\n refreshIntervalMs?: number\n}\n\nexport interface UseStorageFilesResult {\n files: StorageListFilesResponse['files']\n count: number\n loading: boolean\n error: unknown\n data: StorageListFilesResponse | null\n refetch(): Promise<StorageListFilesResponse | null>\n}\n\nexport function useStorageFiles(options: UseStorageFilesOptions): UseStorageFilesResult {\n const { storage, input, enabled = true, callOptions, refreshIntervalMs } = options\n const [data, setData] = React.useState<StorageListFilesResponse | null>(null)\n const [loading, setLoading] = React.useState(false)\n const [error, setError] = React.useState<unknown>(null)\n const requestIdRef = React.useRef(0)\n\n const refetch = React.useCallback(async () => {\n if (!input || !enabled) {\n setData(null)\n setError(null)\n setLoading(false)\n return null\n }\n\n const requestId = requestIdRef.current + 1\n requestIdRef.current = requestId\n setLoading(true)\n setError(null)\n\n try {\n const result = await storage.file.list(input, callOptions)\n if (requestIdRef.current === requestId) {\n setData(result)\n }\n return result\n } catch (listError) {\n if (requestIdRef.current === requestId) {\n setError(listError)\n setData(null)\n }\n throw listError\n } finally {\n if (requestIdRef.current === requestId) {\n setLoading(false)\n }\n }\n }, [callOptions, enabled, input, storage])\n\n React.useEffect(() => {\n void refetch().catch(() => {\n // Error is already stored in state.\n })\n }, [refetch])\n\n React.useEffect(() => {\n if (!enabled || !input || !refreshIntervalMs || refreshIntervalMs <= 0) {\n return\n }\n const globalObject = globalThis as typeof globalThis & {\n setInterval: typeof setInterval\n clearInterval: typeof clearInterval\n }\n const timer = globalObject.setInterval(() => {\n void refetch().catch(() => {\n // Error is already stored in state.\n })\n }, refreshIntervalMs)\n return () => globalObject.clearInterval(timer)\n }, [enabled, input, refetch, refreshIntervalMs])\n\n return {\n files: data?.files ?? [],\n count: data?.count ?? data?.files?.length ?? 0,\n loading,\n error,\n data,\n refetch,\n }\n}\n","import * as React from 'react'\nimport type {\n AthenaStorageCallOptions,\n AthenaStorageModule,\n StorageFileMutationResponse,\n} from '../storage/module.ts'\n\nexport interface UseStorageFileDeleteOptions {\n storage: Pick<AthenaStorageModule, 'file'>\n onSuccess?: (result: StorageFileMutationResponse | StorageFileMutationResponse[]) => void\n onError?: (error: unknown) => void\n}\n\nexport interface UseStorageFileDeleteResult {\n deleting: boolean\n error: unknown\n deleteFile(\n fileId: string | readonly string[],\n options?: AthenaStorageCallOptions,\n ): Promise<StorageFileMutationResponse | StorageFileMutationResponse[]>\n reset(): void\n}\n\nexport function useStorageFileDelete(\n options: UseStorageFileDeleteOptions,\n): UseStorageFileDeleteResult {\n const { storage, onSuccess, onError } = options\n const [deleting, setDeleting] = React.useState(false)\n const [error, setError] = React.useState<unknown>(null)\n\n const reset = React.useCallback(() => {\n setDeleting(false)\n setError(null)\n }, [])\n\n const deleteFile = React.useCallback(\n async (\n fileId: string | readonly string[],\n callOptions?: AthenaStorageCallOptions,\n ) => {\n setDeleting(true)\n setError(null)\n try {\n const result = await storage.file.delete(fileId as string & readonly string[], callOptions)\n onSuccess?.(result)\n return result\n } catch (deleteError) {\n setError(deleteError)\n onError?.(deleteError)\n throw deleteError\n } finally {\n setDeleting(false)\n }\n },\n [onError, onSuccess, storage],\n )\n\n return {\n deleting,\n error,\n deleteFile,\n reset,\n }\n}\n","import type { AnyModelDef, InsertOf, RowOf, UpdateOf } from './types.ts'\n\ntype ModelValueRecord = Record<string, unknown>\n\nexport type ModelFormNullishMode = 'empty-string' | 'undefined' | 'null'\n\ntype NullishValueByMode = {\n 'empty-string': ''\n undefined: undefined\n null: null\n}\n\ntype MapNullableToFormValue<TField, TMode extends ModelFormNullishMode> =\n null extends TField\n ? Exclude<TField, null> | NullishValueByMode[TMode]\n : TField\n\n/**\n * Form value shape derived from a model insert payload.\n * Nullable fields are remapped to the selected nullish representation.\n */\nexport type ModelFormValues<\n TModel extends AnyModelDef,\n TMode extends ModelFormNullishMode = 'empty-string',\n> = {\n [K in keyof InsertOf<TModel>]: MapNullableToFormValue<InsertOf<TModel>[K], TMode>\n}\n\n/**\n * Alias for deriving form value types from any model contract.\n */\nexport type FormValuesOf<\n TModel extends AnyModelDef,\n TMode extends ModelFormNullishMode = 'empty-string',\n> = ModelFormValues<TModel, TMode>\n\n/**\n * Default value shape for form initialization.\n */\nexport type ModelFormDefaults<\n TModel extends AnyModelDef,\n TMode extends ModelFormNullishMode = 'empty-string',\n> = Partial<ModelFormValues<TModel, TMode>>\n\nexport interface ToModelFormDefaultsOptions<TMode extends ModelFormNullishMode = 'empty-string'> {\n /**\n * Controls how nullable model values are represented in form defaults.\n * - `empty-string` (default): `null -> \"\"`\n * - `undefined`: `null -> undefined`\n * - `null`: keeps `null`\n */\n nullishMode?: TMode\n}\n\nexport interface ToModelPayloadOptions {\n /**\n * Converts `\"\"` into `null` for nullable model fields.\n * Defaults to `true`.\n */\n emptyStringAsNull?: boolean\n /**\n * Omits `undefined` keys from the outgoing payload.\n * Defaults to `true`.\n */\n stripUndefined?: boolean\n}\n\nfunction resolveNullishValue(mode: ModelFormNullishMode): '' | undefined | null {\n if (mode === 'undefined') return undefined\n if (mode === 'null') return null\n return ''\n}\n\nfunction isRecord(value: unknown): value is ModelValueRecord {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction isNullableColumn(model: AnyModelDef, key: string): boolean {\n const nullable = model.meta.nullable as Partial<Record<string, boolean>> | undefined\n return nullable?.[key] === true\n}\n\n/**\n * Normalizes model data into form-safe defaults using model nullability metadata.\n */\nexport function toModelFormDefaults<\n TModel extends AnyModelDef,\n TMode extends ModelFormNullishMode = 'empty-string',\n>(\n model: TModel,\n values?: Partial<RowOf<TModel>> | Partial<InsertOf<TModel>> | null,\n options?: ToModelFormDefaultsOptions<TMode>,\n): ModelFormDefaults<TModel, TMode> {\n const source = values as ModelValueRecord | null | undefined\n if (!isRecord(source)) {\n return {} as ModelFormDefaults<TModel, TMode>\n }\n\n const mode = options?.nullishMode ?? ('empty-string' as TMode)\n const nullishValue = resolveNullishValue(mode)\n const result: ModelValueRecord = {}\n\n for (const [key, value] of Object.entries(source)) {\n if (value === null && isNullableColumn(model, key)) {\n result[key] = nullishValue\n continue\n }\n result[key] = value\n }\n\n return result as ModelFormDefaults<TModel, TMode>\n}\n\n/**\n * Normalizes form values back into model-compatible insert/update payloads.\n */\nexport function toModelPayload<TModel extends AnyModelDef>(\n model: TModel,\n formValues: Partial<ModelFormValues<TModel, 'empty-string' | 'undefined' | 'null'>>,\n options?: ToModelPayloadOptions,\n): Partial<InsertOf<TModel>> {\n const emptyStringAsNull = options?.emptyStringAsNull ?? true\n const stripUndefined = options?.stripUndefined ?? true\n const result: ModelValueRecord = {}\n\n for (const [key, rawValue] of Object.entries(formValues as ModelValueRecord)) {\n if (rawValue === undefined && stripUndefined) {\n continue\n }\n\n if (emptyStringAsNull && rawValue === '' && isNullableColumn(model, key)) {\n result[key] = null\n continue\n }\n\n result[key] = rawValue\n }\n\n return result as Partial<InsertOf<TModel>>\n}\n\n/**\n * Runtime form adapter bound to a model contract.\n */\nexport interface ModelFormAdapter<TModel extends AnyModelDef> {\n model: TModel\n toDefaults<TMode extends ModelFormNullishMode = 'empty-string'>(\n values?: Partial<RowOf<TModel>> | Partial<InsertOf<TModel>> | null,\n options?: ToModelFormDefaultsOptions<TMode>,\n ): ModelFormDefaults<TModel, TMode>\n toInsert(\n values: Partial<ModelFormValues<TModel, 'empty-string' | 'undefined' | 'null'>>,\n options?: ToModelPayloadOptions,\n ): Partial<InsertOf<TModel>>\n toUpdate(\n values: Partial<ModelFormValues<TModel, 'empty-string' | 'undefined' | 'null'>>,\n options?: ToModelPayloadOptions,\n ): Partial<UpdateOf<TModel>>\n}\n\n/**\n * Creates a small model-aware adapter for form defaults and payload normalization.\n */\nexport function createModelFormAdapter<TModel extends AnyModelDef>(model: TModel): ModelFormAdapter<TModel> {\n return {\n model,\n toDefaults(values, options) {\n return toModelFormDefaults(model, values, options)\n },\n toInsert(values, options) {\n return toModelPayload(model, values, options) as Partial<InsertOf<TModel>>\n },\n toUpdate(values, options) {\n return toModelPayload(model, values, options) as Partial<UpdateOf<TModel>>\n },\n }\n}\n"]}
|