@viu/emporix-sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +407 -0
- package/LICENSE +21 -0
- package/README.md +115 -0
- package/dist/cart.cjs +214 -0
- package/dist/cart.cjs.map +1 -0
- package/dist/cart.d.cts +1807 -0
- package/dist/cart.d.ts +1807 -0
- package/dist/cart.js +4 -0
- package/dist/cart.js.map +1 -0
- package/dist/category.cjs +97 -0
- package/dist/category.cjs.map +1 -0
- package/dist/category.d.cts +313 -0
- package/dist/category.d.ts +313 -0
- package/dist/category.js +4 -0
- package/dist/category.js.map +1 -0
- package/dist/checkout.cjs +98 -0
- package/dist/checkout.cjs.map +1 -0
- package/dist/checkout.d.cts +252 -0
- package/dist/checkout.d.ts +252 -0
- package/dist/checkout.js +4 -0
- package/dist/checkout.js.map +1 -0
- package/dist/chunk-4BJUCCKJ.js +86 -0
- package/dist/chunk-4BJUCCKJ.js.map +1 -0
- package/dist/chunk-6UNFMCHZ.js +95 -0
- package/dist/chunk-6UNFMCHZ.js.map +1 -0
- package/dist/chunk-B56JZNI7.js +49 -0
- package/dist/chunk-B56JZNI7.js.map +1 -0
- package/dist/chunk-BFQ732VZ.js +11 -0
- package/dist/chunk-BFQ732VZ.js.map +1 -0
- package/dist/chunk-F3WAQH2E.js +120 -0
- package/dist/chunk-F3WAQH2E.js.map +1 -0
- package/dist/chunk-GWJ2U2CP.js +14 -0
- package/dist/chunk-GWJ2U2CP.js.map +1 -0
- package/dist/chunk-HEO34WLO.js +47 -0
- package/dist/chunk-HEO34WLO.js.map +1 -0
- package/dist/chunk-HKPZI7Y5.js +30 -0
- package/dist/chunk-HKPZI7Y5.js.map +1 -0
- package/dist/chunk-IEZHGU7F.js +171 -0
- package/dist/chunk-IEZHGU7F.js.map +1 -0
- package/dist/chunk-KTODT6DV.js +86 -0
- package/dist/chunk-KTODT6DV.js.map +1 -0
- package/dist/chunk-NM7VDXBR.js +57 -0
- package/dist/chunk-NM7VDXBR.js.map +1 -0
- package/dist/chunk-OMYVOOSX.js +57 -0
- package/dist/chunk-OMYVOOSX.js.map +1 -0
- package/dist/chunk-QDABAMVN.js +89 -0
- package/dist/chunk-QDABAMVN.js.map +1 -0
- package/dist/chunk-RXVVFNYN.js +56 -0
- package/dist/chunk-RXVVFNYN.js.map +1 -0
- package/dist/chunk-SKX7KCMH.js +23 -0
- package/dist/chunk-SKX7KCMH.js.map +1 -0
- package/dist/chunk-TLH6SLAF.js +215 -0
- package/dist/chunk-TLH6SLAF.js.map +1 -0
- package/dist/chunk-Z6PNI5VT.js +142 -0
- package/dist/chunk-Z6PNI5VT.js.map +1 -0
- package/dist/companies.cjs +58 -0
- package/dist/companies.cjs.map +1 -0
- package/dist/companies.d.cts +31 -0
- package/dist/companies.d.ts +31 -0
- package/dist/companies.js +3 -0
- package/dist/companies.js.map +1 -0
- package/dist/contacts.cjs +51 -0
- package/dist/contacts.cjs.map +1 -0
- package/dist/contacts.d.cts +28 -0
- package/dist/contacts.d.ts +28 -0
- package/dist/contacts.js +3 -0
- package/dist/contacts.js.map +1 -0
- package/dist/context-vKgzZ-5f.d.cts +329 -0
- package/dist/context-vKgzZ-5f.d.ts +329 -0
- package/dist/customer-groups.cjs +25 -0
- package/dist/customer-groups.cjs.map +1 -0
- package/dist/customer-groups.d.cts +36 -0
- package/dist/customer-groups.d.ts +36 -0
- package/dist/customer-groups.js +3 -0
- package/dist/customer-groups.js.map +1 -0
- package/dist/customer.cjs +262 -0
- package/dist/customer.cjs.map +1 -0
- package/dist/customer.d.cts +386 -0
- package/dist/customer.d.ts +386 -0
- package/dist/customer.js +5 -0
- package/dist/customer.js.map +1 -0
- package/dist/index.cjs +2075 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +218 -0
- package/dist/index.d.ts +218 -0
- package/dist/index.js +791 -0
- package/dist/index.js.map +1 -0
- package/dist/locations.cjs +59 -0
- package/dist/locations.cjs.map +1 -0
- package/dist/locations.d.cts +30 -0
- package/dist/locations.d.ts +30 -0
- package/dist/locations.js +3 -0
- package/dist/locations.js.map +1 -0
- package/dist/media.cjs +123 -0
- package/dist/media.cjs.map +1 -0
- package/dist/media.d.cts +219 -0
- package/dist/media.d.ts +219 -0
- package/dist/media.js +3 -0
- package/dist/media.js.map +1 -0
- package/dist/orders.cjs +98 -0
- package/dist/orders.cjs.map +1 -0
- package/dist/orders.d.cts +167 -0
- package/dist/orders.d.ts +167 -0
- package/dist/orders.js +3 -0
- package/dist/orders.js.map +1 -0
- package/dist/payment.cjs +77 -0
- package/dist/payment.cjs.map +1 -0
- package/dist/payment.d.cts +110 -0
- package/dist/payment.d.ts +110 -0
- package/dist/payment.js +5 -0
- package/dist/payment.js.map +1 -0
- package/dist/price.cjs +88 -0
- package/dist/price.cjs.map +1 -0
- package/dist/price.d.cts +445 -0
- package/dist/price.d.ts +445 -0
- package/dist/price.js +4 -0
- package/dist/price.js.map +1 -0
- package/dist/product.cjs +100 -0
- package/dist/product.cjs.map +1 -0
- package/dist/product.d.cts +400 -0
- package/dist/product.d.ts +400 -0
- package/dist/product.js +4 -0
- package/dist/product.js.map +1 -0
- package/dist/segment.cjs +189 -0
- package/dist/segment.cjs.map +1 -0
- package/dist/segment.d.cts +241 -0
- package/dist/segment.d.ts +241 -0
- package/dist/segment.js +5 -0
- package/dist/segment.js.map +1 -0
- package/dist/types.gen-D1QuqPLs.d.cts +166 -0
- package/dist/types.gen-D1QuqPLs.d.ts +166 -0
- package/package.json +141 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/config.ts","../src/core/logger.ts","../src/core/auth.ts","../src/core/http.ts","../src/services/site.ts","../src/services/session-context.ts","../src/client.ts"],"names":["ANON"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,IAAM,YAAA,GAAe;AAM5B,IAAM,SAAA,GAAY,uBAAA;AAuDX,SAAS,eAAe,KAAA,EAAsC;AACnE,EAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,EAAG;AACjC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,gBAAA,EAAmB,MAAM,MAAM,CAAA,6DAAA;AAAA,KACjC;AAAA,EACF;AACA,EAAA,IAAI,CAAC,MAAM,WAAA,EAAa;AACtB,IAAA,MAAM,IAAI,MAAM,6EAA6E,CAAA;AAAA,EAC/F;AACA,EAAA,OAAO;AAAA,IACL,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,IAAA,EAAM,MAAM,IAAA,IAAQ,YAAA;AAAA,IACpB,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,eAAe,KAAA,CAAM,aAAA;AAAA,IACrB,QAAA,EAAU;AAAA,MACR,SAAA,EAAW,KAAA,CAAM,QAAA,EAAU,SAAA,IAAa,GAAA;AAAA,MACxC,MAAA,EAAQ,KAAA,CAAM,QAAA,EAAU,MAAA,IAAU;AAAA,KACpC;AAAA,IACA,OAAO,EAAE,WAAA,EAAa,KAAA,CAAM,KAAA,EAAO,eAAe,CAAA,EAAE;AAAA,IACpD,KAAA,EAAO;AAAA,MACL,uBAAA,EAAyB,KAAA,CAAM,KAAA,EAAO,uBAAA,IAA2B,EAAA;AAAA,MACjE,kBAAA,EAAoB,KAAA,CAAM,KAAA,EAAO,kBAAA,IAAsB;AAAA,KACzD;AAAA,IACA,QAAQ,KAAA,CAAM;AAAA,GAChB;AACF;;;ACtFO,IAAM,KAAA,GAAkC;AAAA,EAC7C,KAAA,EAAO,EAAA;AAAA,EAAI,KAAA,EAAO,EAAA;AAAA,EAAI,IAAA,EAAM,EAAA;AAAA,EAAI,IAAA,EAAM,EAAA;AAAA,EAAI,KAAA,EAAO,EAAA;AAAA,EAAI,MAAA,EAAQ;AAC/D;AAgDA,SAAS,aAAa,CAAA,EAAsC;AAC1D,EAAA,OAAO,CAAA,KAAM,UAAa,CAAA,IAAK,KAAA;AACjC;AAGA,SAAS,QAAQ,IAAA,EAAkC;AACjD,EAAA,IAAI;AACF,IAAA,OAAO,OAAO,YAAY,WAAA,IAAe,OAAA,CAAQ,MAAM,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,EAC7E,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAQO,IAAM,gBAAN,MAAoB;AAAA,EAOzB,WAAA,CACE,GAAA,EACiB,IAAA,GAA8B,MAAM;AAAA,EAAC,CAAA,EACtD;AADiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAEjB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,KAAA,IAAS,MAAA;AAC7B,IAAA,IAAA,CAAK,WAAA,GAAc,EAAE,GAAG,GAAA,CAAI,QAAA,EAAS;AAAA,EACvC;AAAA,EAJmB,IAAA;AAAA,EARX,QAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAyD,EAAC;AAAA,EAC1D,YAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EAUT,OAAO,GAAA,EAAwC;AACrD,IAAA,MAAM,MAAM,OAAA,CAAQ,CAAA,kBAAA,EAAqB,GAAA,CAAI,WAAA,EAAa,CAAA,CAAE,CAAA;AAC5D,IAAA,IAAI,GAAA,KAAQ,QAAW,OAAO,MAAA;AAC9B,IAAA,IAAI,YAAA,CAAa,GAAG,CAAA,EAAG,OAAO,GAAA;AAC9B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA,IAAA,CAAK,KAAK,CAAA,0BAAA,EAA6B,GAAA,CAAI,aAAa,CAAA,EAAA,EAAK,GAAG,CAAA,SAAA,CAAW,CAAA;AAAA,IAC7E;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,SAAA,GAAkC;AACxC,IAAA,MAAM,GAAA,GAAM,QAAQ,mBAAmB,CAAA;AACvC,IAAA,IAAI,GAAA,KAAQ,QAAW,OAAO,MAAA;AAC9B,IAAA,IAAI,YAAA,CAAa,GAAG,CAAA,EAAG,OAAO,GAAA;AAC9B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,2BAAA,EAA8B,GAAG,CAAA,SAAA,CAAW,CAAA;AAAA,IACxD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,GAAA,EAA4B;AAC9B,IAAA,OACE,KAAK,cAAA,CAAe,GAAG,KACvB,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,IACf,IAAA,CAAK,YAAA,IACL,IAAA,CAAK,WAAU,IACf,IAAA,CAAK,YAAY,GAAG,CAAA,IACpB,KAAK,QAAA,IACL,MAAA;AAAA,EAEJ;AAAA;AAAA,EAGA,aAAa,GAAA,EAA0B;AACrC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EAC5B;AAAA;AAAA,EAGA,SAAA,CAAU,KAAkB,EAAA,EAAuB;AACjD,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAG,CAAA,IAAK,MAAM,EAAE,CAAA;AAAA,EAC3C;AAAA;AAAA,EAGA,GAAA,CAAI,KAAA,EAAiB,GAAA,EAAmB,KAAA,GAAQ,KAAA,EAAa;AAC3D,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,WAAW,OAAA,CAAQ,CAAA,kBAAA,EAAqB,IAAI,WAAA,EAAa,EAAE,CAAA,KAAM,MAAA;AACvE,MAAA,IAAI,QAAA,IAAY,CAAC,KAAA,EAAO;AACtB,QAAA,IAAA,CAAK,IAAA,CAAK,CAAA,WAAA,EAAc,GAAG,CAAA,2CAAA,CAA6C,CAAA;AACxE,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAA,EAAO,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA,GAAI,KAAA;AAAA,WACjC,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA,GAAI,KAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,mBAAmB,CAAA,KAAM,MAAA;AAClD,MAAA,IAAI,QAAA,IAAY,CAAC,KAAA,EAAO;AACtB,QAAA,IAAA,CAAK,KAAK,wDAAwD,CAAA;AAClE,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAA,OAAY,YAAA,GAAe,KAAA;AAAA,gBACrB,QAAA,GAAW,KAAA;AAAA,IACvB;AAAA,EACF;AACF;AAGA,IAAM,cAAA,uBAAqB,GAAA,CAAI;AAAA,EAC7B,eAAA;AAAA,EAAiB,UAAA;AAAA,EAAY,aAAA;AAAA,EAAe,aAAA;AAAA,EAAe,cAAA;AAAA,EAC3D,QAAA;AAAA,EAAU,cAAA;AAAA,EAAgB,eAAA;AAAA,EAAiB,eAAA;AAAA,EAAiB,WAAA;AAAA,EAC5D,YAAA;AAAA,EAAc,aAAA;AAAA,EAAe,QAAA;AAAA,EAAU;AACzC,CAAC,CAAA;AAGM,SAAS,MAAA,CAAO,KAAA,EAAgB,KAAA,GAAkB,EAAC,EAAY;AACpE,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,cAAc,CAAA;AACnC,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,aAAa,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAwB;AACpC,IAAA,IAAI,MAAM,OAAA,CAAQ,CAAC,GAAG,OAAO,CAAA,CAAE,IAAI,IAAI,CAAA;AACvC,IAAA,IAAI,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,EAAU;AAC9B,MAAA,MAAM,GAAA,GAAM,CAAA;AAEZ,MAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,IAAY,OAAA,IAAW,KAAK,OAAO,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK;AAC5E,MAAA,MAAM,MAA+B,EAAC;AACtC,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC1C,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG;AAC7B,UAAA,GAAA,CAAI,CAAC,IACH,CAAA,CAAE,WAAA,OAAkB,eAAA,IAAmB,OAAO,GAAA,KAAQ,QAAA,GAClD,uBAAA,GACA,gBAAA;AAAA,QACR,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,GAAG,CAAA;AAAA,QACnB;AAAA,MACF;AACA,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AACA,EAAA,OAAO,KAAK,KAAK,CAAA;AACnB;AASA,IAAM,IAAA,GAAoD;AAAA,EACxD,OAAO,KAAA,CAAM,KAAA;AAAA,EAAO,OAAO,KAAA,CAAM,KAAA;AAAA,EAAO,MAAM,KAAA,CAAM,IAAA;AAAA,EAAM,MAAM,KAAA,CAAM,IAAA;AAAA,EAAM,OAAO,KAAA,CAAM;AAC3F,CAAA;AAEA,IAAe,aAAf,MAA4C;AAAA,EAC1C,WAAA,CACqB,QAAA,EACA,QAAA,EACA,WAAA,EACnB;AAHmB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAClB;AAAA,EAHkB,QAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EAEb,GAAA,GAAmB;AACzB,IAAA,OAAQ,IAAA,CAAK,SAAS,OAAA,IAA2B,MAAA;AAAA,EACnD;AAAA,EACA,IAAI,KAAA,GAAkB;AACpB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAAA,EACrC;AAAA,EACA,eAAe,KAAA,EAA0B;AACvC,IAAA,OAAO,KAAK,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,GAAA,IAAO,KAAK,CAAA;AAAA,EAClD;AAAA,EAMQ,EAAA,CAAG,KAAA,EAAoC,GAAA,EAAa,MAAA,EAA0B;AACpF,IAAA,IAAI,IAAA,CAAK,SAAS,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,KAAK,CAAA,EAAG;AAC1D,IAAA,MAAM,MAAA,GAAS,EAAE,GAAG,IAAA,CAAK,UAAU,GAAI,MAAA,IAAU,EAAC,EAAG;AACrD,IAAA,IAAA,CAAK,KAAK,KAAA,EAAO,GAAA,EAAK,OAAO,MAAA,EAAQ,IAAA,CAAK,WAAW,CAAc,CAAA;AAAA,EACrE;AAAA,EACA,KAAA,CAAM,GAAW,CAAA,EAAqB;AAAE,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AAAA,EAAG;AAAA,EAChE,KAAA,CAAM,GAAW,CAAA,EAAqB;AAAE,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AAAA,EAAG;AAAA,EAChE,IAAA,CAAK,GAAW,CAAA,EAAqB;AAAE,IAAA,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,EAAG;AAAA,EAC9D,IAAA,CAAK,GAAW,CAAA,EAAqB;AAAE,IAAA,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,EAAG;AAAA,EAC9D,KAAA,CAAM,GAAW,CAAA,EAAqB;AAAE,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AAAA,EAAG;AAElE,CAAA;AAEA,IAAM,aAAA,GAAN,MAAM,cAAA,SAAsB,UAAA,CAAW;AAAA,EACrC,WAAA,CACE,QAAA,EACA,QAAA,EACA,KAAA,EACiB,MACA,MAAA,EACjB;AACA,IAAA,KAAA,CAAM,QAAA,EAAU,UAAU,KAAK,CAAA;AAHd,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAGnB;AAAA,EAJmB,IAAA;AAAA,EACA,MAAA;AAAA,EAIT,IAAA,CAAK,KAAA,EAAoC,GAAA,EAAa,MAAA,EAAyB;AACvF,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,MAAM,KACJ,KAAA,KAAU,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,QAC5B,KAAA,KAAU,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,OAC7B,KAAA,KAAU,MAAA,GAAS,KAAK,IAAA,CAAK,IAAA,GAC7B,KAAK,IAAA,CAAK,GAAA;AACd,MAAA,EAAA,CAAG,CAAA,CAAA,EAAI,KAAK,CAAA,EAAA,EAAK,GAAG,IAAI,MAAM,CAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAK,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,qBAAI,IAAI,IAAA,EAAK,EAAE,WAAA,IAAe,KAAA,EAAO,GAAA,EAAK,GAAG,MAAA,EAAQ,CAAC,CAAA;AAAA,IACvF;AAAA,EACF;AAAA,EACA,MAAM,QAAA,EAA6B;AACjC,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,IAAA,CAAK,QAAA;AAAA,MACL,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,GAAG,QAAA,EAAS;AAAA,MAChC,IAAA,CAAK,WAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AACF,CAAA;AAEA,IAAM,aAAN,MAAmC;AAAA,EACjC,KAAA,GAAkB,QAAA;AAAA,EAClB,cAAA,GAA0B;AAAE,IAAA,OAAO,KAAA;AAAA,EAAO;AAAA,EAC1C,KAAA,GAAc;AAAA,EAAC;AAAA,EACf,KAAA,GAAc;AAAA,EAAC;AAAA,EACf,IAAA,GAAa;AAAA,EAAC;AAAA,EACd,IAAA,GAAa;AAAA,EAAC;AAAA,EACd,KAAA,GAAc;AAAA,EAAC;AAAA,EACf,KAAA,GAAgB;AAAE,IAAA,OAAO,IAAA;AAAA,EAAM;AACjC,CAAA;AAGO,SAAS,oBACd,QAAA,EACA,QAAA,GAAsB,EAAC,EACvB,IAAA,GAA6D,EAAC,EACtD;AACR,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,OAAA,CAAQ,UAAU,CAAA,KAAM,YAAA;AACtD,EAAA,MAAM,IAAA,GAAa,KAAK,IAAA,IAAQ;AAAA,IAC9B,KAAK,OAAA,CAAQ,GAAA;AAAA,IACb,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,OAAO,OAAA,CAAQ;AAAA,GACjB;AACA,EAAA,OAAO,IAAI,cAAc,QAAA,EAAU,QAAA,EAAU,KAAK,MAAA,IAAU,EAAC,EAAG,IAAA,EAAM,MAAM,CAAA;AAC9E;AAGO,SAAS,gBAAA,GAA2B;AACzC,EAAA,OAAO,IAAI,UAAA,EAAW;AACxB;;;ACxOO,IAAM,IAAA,GAAO;AAAA;AAAA,EAElB,OAAA,EAAS,CAAC,WAAA,KACR,WAAA,KAAgB,MAAA,GAAY,EAAE,IAAA,EAAM,SAAA,EAAU,GAAI,EAAE,IAAA,EAAM,SAAA,EAAW,WAAA,EAAY;AAAA;AAAA,EAEnF,SAAA,EAAW,OAAoB,EAAE,IAAA,EAAM,WAAA,EAAY,CAAA;AAAA;AAAA,EAEnD,UAAU,CAAC,KAAA,MAAgC,EAAE,IAAA,EAAM,YAAY,KAAA,EAAM,CAAA;AAAA;AAAA,EAErE,KAAK,CAAC,KAAA,MAAgC,EAAE,IAAA,EAAM,OAAO,KAAA,EAAM;AAC7D;AAGA,eAAsB,YAAA,CAAa,KAAkB,QAAA,EAA0C;AAC7F,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,SAAA;AACH,MAAA,OAAO,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,WAAA,IAAe,SAAS,CAAA;AAAA,IACvD,KAAK,WAAA;AACH,MAAA,OAAA,CAAQ,MAAM,QAAA,CAAS,iBAAA,EAAkB,EAAG,WAAA;AAAA,IAC9C,KAAK,UAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,OAAO,GAAA,CAAI,KAAA;AAAA;AAEjB;AASO,IAAM,uBAAN,MAAoD;AAAA,EAUzD,YAA6B,GAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAAsB;AAAA,EAAtB,GAAA;AAAA,EATZ,YAAA,uBAAmB,GAAA,EAAwB;AAAA,EAC3C,YAAA,uBAAmB,GAAA,EAA6B;AAAA,EACzD,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACS,gBAAA,uBAAuB,GAAA,EAEtC;AAAA,EAIF,UACE,QAAA,EACY;AACZ,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,EAEQ,aAAA,CAAc,MAAgC,OAAA,EAAwB;AAC5E,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,gBAAA,EAAkB;AACrC,MAAA,IAAI;AACF,QAAA,CAAA,CAAE,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,MACrB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEA,qBAAqB,KAAA,EAAoC;AACvD,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAIjB,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,EAAK;AAC7B,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,IAAA,CAAK,IAAA,GAAO;AAAA,UACV,WAAA,EAAa,EAAA;AAAA,UACb,cAAc,SAAA,CAAU,YAAA;AAAA,UACxB,WAAW,SAAA,CAAU,SAAA;AAAA,UACrB,SAAA,EAAW,CAAA;AAAA,UACX,SAAA,EAAW;AAAA,SACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,MAAM,GAAA,EAAiC;AAC7C,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,OAAA;AAC/B,MAAA,IAAI,CAAC,CAAA,EAAG,QAAA,IAAY,CAAC,EAAE,MAAA,EAAQ;AAC7B,QAAA,MAAM,IAAI,gBAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,SAAS,GAAG,CAAA;AAC3C,IAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,GAAG,CAAA,CAAA,CAAG,CAAA;AACzD,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEQ,MAAM,CAAA,EAAoC;AAChD,IAAA,IAAI,CAAC,GAAG,OAAO,KAAA;AACf,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,GAAA,GAAM,EAAE,UAAA,IAAc,IAAA,CAAK,IAAI,KAAA,CAAM,kBAAA,GAAqB,KAAM,OAAO,KAAA;AAC3E,IAAA,OAAO,MAAM,CAAA,CAAE,SAAA;AAAA,EACjB;AAAA,EAEA,MAAM,SAAS,GAAA,EAA8B;AAE3C,IAAA,IAAA,CAAK,MAAM,GAAG,CAAA;AACd,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AACxC,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,SAAU,MAAA,CAAQ,KAAA;AACvC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AAC1C,IAAA,IAAI,UAAU,OAAO,QAAA;AACrB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,mBAAA,CAAoB,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAM,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,GAAG,CAAC,CAAA;AACnF,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA;AAC5B,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,MAAc,oBAAoB,GAAA,EAA8B;AAC9D,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACxB,IAAA,MAAM,IAAA,GAAO,IAAI,eAAA,CAAgB;AAAA,MAC/B,UAAA,EAAY,oBAAA;AAAA,MACZ,WAAW,CAAA,CAAE,QAAA;AAAA,MACb,eAAe,CAAA,CAAE;AAAA,KAClB,CAAA;AACD,IAAA,IAAI,EAAE,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,EAAE,KAAK,CAAA;AACtC,IAAA,MAAM,MAAM,MAAM,KAAA,CAAM,GAAG,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,YAAA,CAAA,EAAgB;AAAA,MACtD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,mCAAA,EAAoC;AAAA,MAC/D;AAAA,KACD,CAAA;AACD,IAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAC/C,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,0BAAA,EAA6B,GAAG,CAAA,CAAA,CAAA,EAAK,GAAA,CAAI,QAAQ,IAAI,CAAA;AAAA,IAClF;AACA,IAAA,MAAM,UAAA,GAAa,KAAK,GAAA,EAAI;AAC5B,IAAA,MAAM,GAAA,GAAM,MAAA,CAAQ,IAAA,CAAK,UAAA,IAAqC,IAAI,CAAA;AAClE,IAAA,IAAA,CAAK,YAAA,CAAa,IAAI,GAAA,EAAK;AAAA,MACzB,OAAO,IAAA,CAAK,YAAA;AAAA,MACZ,UAAA;AAAA,MACA,WAAW,UAAA,GAAA,CAAc,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,MAAM,uBAAA,IAA2B;AAAA,KAC1E,CAAA;AACD,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,CAAG,KAAA;AAAA,EACrC;AAAA,EAEA,WAAW,GAAA,EAAmB;AAC5B,IAAA,IAAA,CAAK,YAAA,CAAa,OAAO,GAAG,CAAA;AAAA,EAC9B;AAAA,EAEQ,SAAA,GAAqB;AAC3B,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,IAAA,IAAQ,KAAK,GAAA,EAAI,GAAI,KAAK,IAAA,CAAK,SAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,iBAAA,GAA+C;AACnD,IAAA,IAAI,KAAK,SAAA,EAAU,SAAU,IAAA,CAAK,WAAA,CAAY,KAAK,IAAK,CAAA;AACxD,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AAG/B,IAAA,MAAM,UAAA,GAAa,CAAC,CAAC,IAAA,CAAK,IAAA,EAAM,YAAA;AAChC,IAAA,MAAM,MAAA,GAAS,UAAA,GACX,IAAA,CAAK,cAAA,CAAe,SAAS,CAAA,CAAE,KAAA,CAAM,MAAM,IAAA,CAAK,eAAe,OAAO,CAAC,CAAA,GACvE,IAAA,CAAK,eAAe,OAAO,CAAA;AAC/B,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,MAAM;AAC7B,MAAA,IAAA,CAAK,QAAA,GAAW,MAAA;AAAA,IAClB,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,OAAO,CAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,gBAAA,GAA8C;AAClD,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAM,OAAO,KAAK,iBAAA,EAAkB;AAC9C,IAAA,OAAO,IAAA,CAAK,eAAe,SAAS,CAAA;AAAA,EACtC;AAAA,EAEA,mBAAA,GAA4B;AAC1B,IAAA,IAAA,CAAK,IAAA,GAAO,MAAA;AACZ,IAAA,IAAA,CAAK,SAAA,EAAW,MAAM,IAAI,CAAA;AAAA,EAC5B;AAAA;AAAA,EAGA,eAAA,GAAwB;AACtB,IAAA,IAAI,IAAA,CAAK,MAAM,IAAA,CAAK,IAAA,GAAO,EAAE,GAAG,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,CAAA,EAAE;AAAA,EAC1D;AAAA,EAEQ,YAAY,CAAA,EAA+D;AACjF,IAAA,MAAM,EAAE,SAAA,EAAW,UAAA,EAAY,GAAG,MAAK,GAAI,CAAA;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,eAAe,IAAA,EAAsD;AACjF,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,UAAA;AAChC,IAAA,IAAI,CAAC,IAAI,QAAA,EAAU;AACjB,MAAA,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAAA,IACpF;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,IAAI,CAAA,8BAAA,EAAiC,IAAI,CAAA,CAAE,CAAA;AAC3E,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,IAAI,MAAM,CAAA;AAC9C,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,EAAA,CAAG,QAAQ,CAAA;AAE7C,IAAA,MAAM,IAAI,EAAA,CAAG,OAAA;AACb,IAAA,IAAI,GAAG,QAAA,EAAU,GAAA,CAAI,aAAa,GAAA,CAAI,UAAA,EAAY,EAAE,QAAQ,CAAA;AAC5D,IAAA,IAAI,GAAG,QAAA,EAAU,GAAA,CAAI,aAAa,GAAA,CAAI,UAAA,EAAY,EAAE,QAAQ,CAAA;AAC5D,IAAA,IAAI,GAAG,cAAA,EAAgB,GAAA,CAAI,aAAa,GAAA,CAAI,gBAAA,EAAkB,EAAE,cAAc,CAAA;AAC9E,IAAA,IAAI,IAAA,KAAS,SAAA,IAAa,IAAA,CAAK,IAAA,EAAM;AACnC,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,eAAA,EAAiB,IAAA,CAAK,KAAK,YAAY,CAAA;AAAA,IAC9D;AACA,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAO,CAAA;AAC9C,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAC/C,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,IAAA,CAAK,aAAA,CAAc,aAAa,KAAK,CAAA;AACrC,QAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,gBAAA,EAAmB,IAAI,CAAA,OAAA,CAAA,EAAW,GAAA,CAAI,QAAQ,IAAI,CAAA;AAAA,MAC/E;AACA,MAAA,MAAM,UAAA,GAAa,KAAK,GAAA,EAAI;AAC5B,MAAA,IAAA,CAAK,IAAA,GAAO;AAAA,QACV,aAAa,IAAA,CAAK,YAAA;AAAA,QAClB,cAAc,IAAA,CAAK,aAAA;AAAA,QACnB,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,WAAW,IAAA,CAAK,UAAA;AAAA,QAChB,WACE,UAAA,GAAA,CACE,IAAA,CAAK,aAAwB,IAAA,CAAK,GAAA,CAAI,MAAM,uBAAA,IAA2B;AAAA,OAC7E;AACA,MAAA,IAAA,CAAK,WAAW,KAAA,CAAM;AAAA,QACpB,YAAA,EAAc,KAAK,IAAA,CAAK,YAAA;AAAA,QACxB,SAAA,EAAW,KAAK,IAAA,CAAK;AAAA,OACtB,CAAA;AACD,MAAA,IAAA,CAAK,aAAA,CAAc,aAAa,IAAI,CAAA;AACpC,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAAA,IACnC,SAAS,GAAA,EAAK;AAEZ,MAAA,IAAI,EAAE,eAAe,gBAAA,CAAA,EAAmB;AACtC,QAAA,IAAA,CAAK,aAAA,CAAc,aAAa,KAAK,CAAA;AAAA,MACvC;AACA,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AACF;;;ACnRA,IAAI,UAAA,GAAa,CAAA;AAEjB,SAAS,SAAS,IAAA,EAAuB;AACvC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAGO,IAAM,aAAN,MAAiB;AAAA,EAEtB,YAA6B,IAAA,EAAyB;AAAzB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAC3B,IAAA,IAAA,CAAK,KAAA,GACH,IAAA,CAAK,KAAA,KAAU,CAAC,EAAA,KAAe,IAAI,OAAA,CAAc,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,EAC7E;AAAA,EAH6B,IAAA;AAAA,EADZ,KAAA;AAAA,EAMjB,MAAM,QAAqB,CAAA,EAA+B;AACxD,IAAA,MAAM,SAAA,GAAY,CAAA,IAAA,EAAO,EAAE,UAAU,CAAA,CAAA;AACrC,IAAA,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,OAAO,KAAA,CAAM,EAAE,WAAW,CAAA;AAChD,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,KAAK,IAAA,CAAK,IAAA,GAAO,EAAE,IAAI,CAAA;AAC3C,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,MAAA,CAAO,QAAQ,CAAA,CAAE,KAAA,IAAS,EAAE,CAAA,EAAG;AAClD,MAAA,IAAI,CAAA,KAAM,QAAW,GAAA,CAAI,YAAA,CAAa,IAAI,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IACxD;AACA,IAAA,MAAM,aAAa,CAAA,CAAE,IAAA,CAAK,SAAS,SAAA,IAAa,CAAA,CAAE,KAAK,IAAA,KAAS,WAAA;AAChE,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,WAAA;AACpC,IAAA,IAAI,QAAA,GAAW,KAAA;AAEf,IAAA,KAAA,IAAS,OAAA,GAAU,KAAK,OAAA,EAAA,EAAW;AACjC,MAAA,MAAM,QAAQ,MAAM,YAAA,CAAa,EAAE,IAAA,EAAM,IAAA,CAAK,KAAK,QAAQ,CAAA;AAC3D,MAAA,GAAA,CAAI,MAAM,cAAA,EAAgB;AAAA,QACxB,QAAA,EAAU,EAAE,IAAA,CAAK,IAAA;AAAA,QACjB,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,KAAK,GAAA,CAAI,QAAA;AAAA,QACT;AAAA,OACD,CAAA;AAED,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,MAAM,KAAA,GAAQ,UAAA;AAAA,QACZ,MAAM,WAAW,KAAA,EAAM;AAAA,QACvB,CAAA,CAAE,SAAA,IAAa,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS;AAAA,OACpC;AACA,MAAA,MAAM,UAAA,GACJ,OAAO,QAAA,KAAa,WAAA,IAAe,EAAE,IAAA,YAAgB,QAAA;AACvD,MAAA,MAAM,IAAA,GAAoB;AAAA,QACxB,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,OAAA,EAAS;AAAA,UACP,GAAI,CAAA,CAAE,OAAA,IAAW,EAAC;AAAA,UAClB,aAAA,EAAe,UAAU,KAAK,CAAA,CAAA;AAAA;AAAA;AAAA,UAG9B,GAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAa,CAAC,aACzB,EAAE,cAAA,EAAgB,kBAAA,EAAmB,GACrC;AAAC,SACP;AAAA,QACA,QAAQ,UAAA,CAAW;AAAA,OACrB;AACA,MAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAW;AACxB,QAAA,IAAA,CAAK,OAAO,UAAA,GAAc,CAAA,CAAE,OAAoB,IAAA,CAAK,SAAA,CAAU,EAAE,IAAI,CAAA;AAAA,MACvE;AACA,MAAA,IAAI,GAAA;AACJ,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA;AAAA,MAC7B,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,MAAA,GAAS,IAAA,GAAO,QAAA,CAAS,IAAI,CAAA,GAAI,MAAA;AACvC,MAAA,IAAI,IAAI,EAAA,EAAI;AACV,QAAA,GAAA,CAAI,MAAM,SAAA,EAAW,EAAE,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAA;AAC3C,QAAA,OAAO,MAAA;AAAA,MACT;AAGA,MAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK;AACtB,QAAA,IAAI,UAAA,IAAc,CAAC,QAAA,EAAU;AAC3B,UAAA,QAAA,GAAW,IAAA;AACX,UAAA,IAAI,CAAA,CAAE,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW;AAC7B,YAAA,IAAA,CAAK,KAAK,QAAA,CAAS,UAAA,GAAa,CAAA,CAAE,IAAA,CAAK,eAAe,SAAS,CAAA;AAAA,UACjE,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,eAAA,EAAiB;AAG7C,YAAA,IAAA,CAAK,IAAA,CAAK,SAAS,eAAA,EAAgB;AAAA,UACrC,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,IAAA,CAAK,SAAS,mBAAA,IAAsB;AAAA,UAC3C;AACA,UAAA,GAAA,CAAI,KAAK,kCAAA,EAAoC,EAAE,UAAU,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AACtE,UAAA;AAAA,QACF;AACA,QAAA,MAAM,iBAAA,CAAkB,GAAA,CAAI,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,WAAA,CAAA,EAAU,MAAM,CAAA;AAAA,MAC3E;AAGA,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,MAAA,IAAU,GAAA,IAAO,IAAI,MAAA,KAAW,GAAA;AACtD,MAAA,IAAI,SAAA,IAAa,UAAU,WAAA,EAAa;AACtC,QAAA,MAAM,aAAa,MAAA,CAAO,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAC,CAAA;AACxD,QAAA,MAAM,UACJ,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,IAAK,UAAA,IAAc,IACzC,UAAA,GAAa,GAAA,GACb,KAAK,GAAA,CAAI,GAAA,GAAO,MAAM,OAAA,GAAU,CAAA,CAAA,EAAI,GAAI,CAAA,GAAI,IAAA,CAAK,QAAO,GAAI,GAAA;AAClE,QAAA,GAAA,CAAI,IAAA,CAAK,qBAAqB,EAAE,MAAA,EAAQ,IAAI,MAAA,EAAQ,OAAA,EAAS,SAAA,EAAW,OAAA,EAAS,CAAA;AACjF,QAAA,MAAM,IAAA,CAAK,MAAM,OAAO,CAAA;AACxB,QAAA;AAAA,MACF;AAEA,MAAA,GAAA,CAAI,MAAM,oBAAA,EAAsB,EAAE,QAAQ,GAAA,CAAI,MAAA,EAAQ,SAAS,CAAA;AAC/D,MAAA,MAAM,iBAAA,CAAkB,GAAA,CAAI,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,QAAA,EAAM,GAAA,CAAI,MAAM,IAAI,MAAM,CAAA;AAAA,IACrF;AAAA,EACF;AACF;;;ACxIA,IAAM,IAAA,GAAoB,KAAK,SAAA,EAAU;AAoClC,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6B,GAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAAqB;AAAA,EAArB,GAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CAAK,OAAA,GAAuB,IAAA,EAAuB;AACvD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAgB;AAAA,MACnC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,MAAA,CAAA;AAAA,MAC9B,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,GAAA,CAAI,IAAA,EAAc,OAAA,GAAuB,IAAA,EAAqB;AAClE,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAc;AAAA,MACjC,MAAA,EAAQ,KAAA;AAAA,MACR,MAAM,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,CAAI,MAAM,UAAU,IAAI,CAAA,CAAA;AAAA,MAC5C,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,CAAQ,OAAA,GAAuB,IAAA,EAAqB;AACxD,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AACrC,IAAA,MAAM,MAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AACvC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,iDAAA,EAAoD,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,CAAA;AAAA,OACrE;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACF;;;ACvEA,IAAMA,KAAAA,GAAoB,KAAK,SAAA,EAAU;AA8ClC,IAAM,wBAAN,MAA4B;AAAA,EACjC,YAA6B,GAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAAqB;AAAA,EAArB,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,MAAM,GAAA,CAAI,OAAA,GAAuBA,KAAAA,EAAsC;AACrE,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAwB;AAAA,QACjD,MAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAM,CAAA,iBAAA,EAAoB,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,WAAA,CAAA;AAAA,QACzC,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,IAAA;AAC5B,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAA,CAAM,KAAA,EAA4B,OAAA,GAAuBA,KAAAA,EAAwB;AACrF,IAAA,IAAI,UAAU,KAAA,CAAM,OAAA;AACpB,IAAA,IAAI,YAAY,MAAA,EAAW;AACzB,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AACtC,MAAA,IAAI,OAAA,KAAY,MAAM,OAAO,KAAA;AAC7B,MAAA,OAAA,GAAU,QAAQ,QAAA,EAAU,OAAA;AAC5B,MAAA,IAAI,YAAY,MAAA,EAAW;AACzB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,EAAE,OAAA,EAAS,EAAA,EAAI,GAAG,QAAO,GAAI,KAAA;AAEnC,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAc;AAAA,MAChC,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,CAAA,iBAAA,EAAoB,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,WAAA,CAAA;AAAA,MACzC,IAAA,EAAM;AAAA,QACJ,GAAG,MAAA;AAAA,QACH,QAAA,EAAU,EAAE,OAAA;AAAQ,OACtB;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAW,GAAA,EAAuB;AACzC,EAAA,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AAClC,IAAA,MAAM,SAAU,GAAA,CAA6B,MAAA;AAC7C,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,KAAK,OAAO,IAAA;AAAA,EAC3D;AACA,EAAA,OAAO,KAAA;AACT;;;AC/EA,IAAM,WAAA,GAAc,OAAA;AAGb,IAAM,gBAAN,MAAoB;AAAA,EAChB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA;AAAA,EAEA,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA;AAAA,EACQ,QAAA;AAAA,EAEjB,YAAY,MAAA,EAAuB;AACjC,IAAA,MAAM,GAAA,GAAM,eAAe,MAAM,CAAA;AACjC,IAAA,IAAA,CAAK,SAAS,GAAA,CAAI,MAAA;AAClB,IAAA,IAAA,CAAK,MAAA,GAAS,GAAA;AAEd,IAAA,IAAI,YAAgC,EAAC;AACrC,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,GAAA,CAAI,WAAW,KAAA,EAAO;AACxB,MAAA,UAAA,GAAa,gBAAA,EAAiB;AAAA,IAChC,WAAW,GAAA,CAAI,MAAA,IAAU,OAAQ,GAAA,CAAI,MAAA,CAAkB,UAAU,UAAA,EAAY;AAC3E,MAAA,UAAA,GAAa,GAAA,CAAI,MAAA;AAAA,IACnB,CAAA,MAAA,IAAW,IAAI,MAAA,EAAQ;AACrB,MAAA,SAAA,GAAY,GAAA,CAAI,MAAA;AAAA,IAClB;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,aAAA,CAAc,SAAS,CAAA;AAC3C,IAAA,MAAM,IAAA,GACJ,UAAA,IACA,mBAAA,CAAoB,IAAA,CAAK,QAAA,EAAU;AAAA,MACjC,GAAA,EAAK,SAAA;AAAA,MACL,UAAA,EAAY,WAAA;AAAA,MACZ,QAAQ,GAAA,CAAI;AAAA,KACb,CAAA;AAEH,IAAA,MAAM,aAAA,GAA+B,GAAA,CAAI,aAAA,IAAiB,IAAI,qBAAqB,GAAG,CAAA;AACtF,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAErB,IAAA,MAAM,EAAA,GAAK,CAAC,OAAA,MAAyC;AAAA,MACnD,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,aAAA;AAAA,MACA,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,EAAE,SAAS,CAAA;AAAA,MAC9B,IAAA,EAAM,IAAI,UAAA,CAAW;AAAA,QACnB,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,QAAA,EAAU,aAAA;AAAA,QACV,QAAQ,IAAA,CAAK,KAAA,CAAM,EAAE,OAAA,EAAS,QAAQ,CAAA;AAAA,QACtC,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,UAAU,GAAA,CAAI;AAAA,OACf;AAAA,KACH,CAAA;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,eAAA,CAAgB,EAAA,CAAG,UAAU,CAAC,CAAA;AACnD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,cAAA,CAAe,EAAA,CAAG,SAAS,CAAC,CAAA;AAChD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,eAAA,CAAgB,EAAA,CAAG,UAAU,CAAC,CAAA;AACpD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,CAAY,EAAA,CAAG,MAAM,CAAC,CAAA;AACvC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,eAAA,CAAgB,EAAA,CAAG,UAAU,CAAC,CAAA;AAClD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,qBAAA,CAAsB,EAAA,CAAG,SAAS,CAAC,CAAA;AACvD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,YAAA,CAAa,EAAA,CAAG,OAAO,CAAC,CAAA;AAC1C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,YAAA,CAAa,EAAA,CAAG,OAAO,CAAC,CAAA;AACzC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,cAAA,CAAe,EAAA,CAAG,SAAS,CAAA,EAAG;AAAA,MAChD,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK;AAAA,KAClB,CAAA;AACD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,CAAY,EAAA,CAAG,MAAM,CAAC,CAAA;AACvC,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,qBAAA,CAAsB,EAAA,CAAG,iBAAiB,CAAC,CAAA;AACrE,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,gBAAA,CAAiB,EAAA,CAAG,qBAAqB,CAAC,CAAA;AAC/D,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,eAAA,CAAgB,EAAA,CAAG,qBAAqB,CAAC,CAAA;AAC7D,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,gBAAA,CAAiB,EAAA,CAAG,qBAAqB,CAAC,CAAA;AAC/D,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,qBAAA,CAAsB,EAAA,CAAG,KAAK,CAAC,CAAA;AACzD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,aAAA,CAAc,EAAA,CAAG,QAAQ,CAAC,CAAA;AAC5C,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,kBAAA,CAAmB,EAAA,CAAG,cAAc,CAAC,CAAA;AAAA,EAC9D;AAAA;AAAA,EAGA,WAAA,CAAY,KAAA,EAAiB,IAAA,GAAmD,EAAC,EAAS;AACxF,IAAA,IAAA,CAAK,SAAS,GAAA,CAAI,KAAA,EAAO,KAAK,OAAA,EAAS,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC5D;AAAA;AAAA,EAGA,YAAY,OAAA,EAAgC;AAC1C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,EAClC;AACF","file":"index.js","sourcesContent":["import type { LoggerConfig } from \"./logger\";\nimport type { TokenProvider } from \"./auth\";\n\n/** Default Emporix API host. */\nexport const DEFAULT_HOST = \"https://api.emporix.io\";\n\n/**\n * Tenant guard. Emporix docs only state \"always lowercase\"; the 3–16 char\n * `^[a-z][a-z0-9]+$` rule is an SDK-side guard, not a documented constraint.\n */\nconst TENANT_RE = /^[a-z][a-z0-9]{2,15}$/;\n\n/** A client-credentials credential set (service / custom). */\nexport interface ServiceCredentials {\n clientId: string;\n secret: string;\n scope?: string;\n}\n\n/** Storefront credential — anonymous token needs the client id only, no secret. */\nexport interface StorefrontCredentials {\n clientId: string;\n /**\n * Session context bound at anonymous-login time. Required for\n * `prices.matchByContext` to resolve currency/site/country server-side.\n * `targetLocation` is an ISO country code.\n */\n context?: { currency?: string; siteCode?: string; targetLocation?: string };\n}\n\n/** User-supplied SDK configuration. */\nexport interface EmporixConfig {\n tenant: string;\n host?: string;\n credentials: {\n /**\n * Service (client-credentials) credentials. Optional: storefront/SPA apps\n * use only `storefront` (anonymous) + caller-supplied customer tokens and\n * must never ship a backend secret. Required only when a `service`\n * AuthContext is actually used — enforced lazily by the TokenProvider.\n */\n backend?: ServiceCredentials;\n storefront?: StorefrontCredentials;\n custom?: Record<string, ServiceCredentials>;\n };\n tokenProvider?: TokenProvider;\n timeouts?: { connectMs?: number; readMs?: number };\n retry?: { maxAttempts?: number };\n cache?: { expirationBufferSeconds?: number; maxLifetimeSeconds?: number };\n logger?: LoggerConfig;\n}\n\n/** Fully-resolved configuration with defaults applied. */\nexport interface ResolvedConfig {\n tenant: string;\n host: string;\n credentials: EmporixConfig[\"credentials\"];\n tokenProvider: TokenProvider | undefined;\n timeouts: { connectMs: number; readMs: number };\n retry: { maxAttempts: number };\n cache: { expirationBufferSeconds: number; maxLifetimeSeconds: number };\n logger: LoggerConfig | undefined;\n}\n\n/** Validates user config and applies defaults. Throws on invalid tenant/credentials. */\nexport function validateConfig(input: EmporixConfig): ResolvedConfig {\n if (!TENANT_RE.test(input.tenant)) {\n throw new Error(\n `Invalid tenant \"${input.tenant}\": must be lowercase, 3–16 chars, match ^[a-z][a-z0-9]+$`,\n );\n }\n if (!input.credentials) {\n throw new Error(\"credentials is required (provide at least one of backend/storefront/custom)\");\n }\n return {\n tenant: input.tenant,\n host: input.host ?? DEFAULT_HOST,\n credentials: input.credentials,\n tokenProvider: input.tokenProvider,\n timeouts: {\n connectMs: input.timeouts?.connectMs ?? 10_000,\n readMs: input.timeouts?.readMs ?? 60_000,\n },\n retry: { maxAttempts: input.retry?.maxAttempts ?? 3 },\n cache: {\n expirationBufferSeconds: input.cache?.expirationBufferSeconds ?? 60,\n maxLifetimeSeconds: input.cache?.maxLifetimeSeconds ?? 3600,\n },\n logger: input.logger,\n };\n}\n","/** Log severity, low → high. */\nexport type LogLevel = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\n/** Numeric ordering used for fast comparison. */\nexport const LEVEL: Record<LogLevel, number> = {\n trace: 10, debug: 20, info: 30, warn: 40, error: 50, silent: 60,\n};\n\n/** Services that bind their own logger and are independently level-controllable. */\nexport type ServiceName =\n | \"customer\"\n | \"product\"\n | \"category\"\n | \"cart\"\n | \"checkout\"\n | \"payment\"\n | \"price\"\n | \"media\"\n | \"segment\"\n | \"site\"\n | \"session-context\"\n | \"customer-management\"\n | \"iam\"\n | \"orders\"\n | \"sales-orders\"\n | \"http\"\n | \"auth\";\n\n/** Arbitrary structured fields attached to a log line. */\nexport interface LogFields { [key: string]: unknown; }\n\n/** The logger contract consumers may implement or swap. */\nexport interface Logger {\n level: LogLevel;\n isLevelEnabled(level: LogLevel): boolean;\n trace(msg: string, fields?: LogFields): void;\n debug(msg: string, fields?: LogFields): void;\n info(msg: string, fields?: LogFields): void;\n warn(msg: string, fields?: LogFields): void;\n error(msg: string, fields?: LogFields): void;\n child(bindings: LogFields): Logger;\n}\n\n/** Object form of logger configuration. */\nexport interface LoggerObjectConfig {\n level?: LogLevel;\n services?: Partial<Record<ServiceName, LogLevel>>;\n pretty?: boolean;\n redact?: string[];\n}\n\n/** `false` → noop logger; `Logger` → user-supplied; object → built-in console logger. */\nexport type LoggerConfig = false | Logger | LoggerObjectConfig;\n\nfunction isValidLevel(v: string | undefined): v is LogLevel {\n return v !== undefined && v in LEVEL;\n}\n\n/** Browser-safe env read — `process` is undefined in browsers/edge runtimes. */\nfunction readEnv(name: string): string | undefined {\n try {\n return typeof process !== \"undefined\" && process.env ? process.env[name] : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolves the effective level per service following:\n * env per-service > env global > config.services[svc] > config.level > \"warn\".\n * Runtime `set()` mutates programmatic levels but never overrides env-set ones\n * unless `force` is passed.\n */\nexport class LevelResolver {\n private cfgLevel: LogLevel;\n private cfgServices: Partial<Record<ServiceName, LogLevel>>;\n private forcedServices: Partial<Record<ServiceName, LogLevel>> = {};\n private forcedGlobal: LogLevel | undefined;\n private warned = false;\n\n constructor(\n cfg: LoggerObjectConfig,\n private readonly warn: (msg: string) => void = () => {},\n ) {\n this.cfgLevel = cfg.level ?? \"warn\";\n this.cfgServices = { ...cfg.services };\n }\n\n private envFor(svc: ServiceName): LogLevel | undefined {\n const raw = readEnv(`EMPORIX_LOG_LEVEL_${svc.toUpperCase()}`);\n if (raw === undefined) return undefined;\n if (isValidLevel(raw)) return raw;\n if (!this.warned) {\n this.warned = true;\n this.warn(`Invalid EMPORIX_LOG_LEVEL_${svc.toUpperCase()}=\"${raw}\" ignored`);\n }\n return undefined;\n }\n\n private envGlobal(): LogLevel | undefined {\n const raw = readEnv(\"EMPORIX_LOG_LEVEL\");\n if (raw === undefined) return undefined;\n if (isValidLevel(raw)) return raw;\n if (!this.warned) {\n this.warned = true;\n this.warn(`Invalid EMPORIX_LOG_LEVEL=\"${raw}\" ignored`);\n }\n return undefined;\n }\n\n /**\n * Effective level for a service. Forced overrides (from `set(..., force)`)\n * take precedence over env vars; otherwise env > programmatic config.\n */\n get(svc: ServiceName): LogLevel {\n return (\n this.forcedServices[svc] ??\n this.envFor(svc) ??\n this.forcedGlobal ??\n this.envGlobal() ??\n this.cfgServices[svc] ??\n this.cfgLevel ??\n \"warn\"\n );\n }\n\n /** Numeric effective level for a service. */\n numericLevel(svc: ServiceName): number {\n return LEVEL[this.get(svc)];\n }\n\n /** True if `svc`'s effective level allows emitting at `at`. */\n isAtLeast(svc: ServiceName, at: LogLevel): boolean {\n return this.numericLevel(svc) <= LEVEL[at];\n }\n\n /** Mutates programmatic level (global or one service). Env-set levels are sticky unless `force`. */\n set(level: LogLevel, svc?: ServiceName, force = false): void {\n if (svc) {\n const envBound = readEnv(`EMPORIX_LOG_LEVEL_${svc.toUpperCase()}`) !== undefined;\n if (envBound && !force) {\n this.warn(`Level for \"${svc}\" is env-controlled; pass force to override`);\n return;\n }\n if (force) this.forcedServices[svc] = level;\n else this.cfgServices[svc] = level;\n } else {\n const envBound = readEnv(\"EMPORIX_LOG_LEVEL\") !== undefined;\n if (envBound && !force) {\n this.warn(\"Global level is env-controlled; pass force to override\");\n return;\n }\n if (force) this.forcedGlobal = level;\n else this.cfgLevel = level;\n }\n }\n}\n\n/** Default redaction floor — never reducible. */\nconst DEFAULT_REDACT = new Set([\n \"authorization\", \"password\", \"oldpassword\", \"newpassword\", \"clientsecret\",\n \"secret\", \"access_token\", \"refresh_token\", \"customertoken\", \"saastoken\",\n \"saas-token\", \"bearertoken\", \"apikey\", \"token\",\n]);\n\n/** Deep-clones `value`, replacing redacted keys with a mask. AuthContext token is stripped. */\nexport function redact(value: unknown, extra: string[] = []): unknown {\n const keys = new Set(DEFAULT_REDACT);\n for (const k of extra) keys.add(k.toLowerCase());\n const walk = (v: unknown): unknown => {\n if (Array.isArray(v)) return v.map(walk);\n if (v && typeof v === \"object\") {\n const src = v as Record<string, unknown>;\n // AuthContext: keep only `kind`.\n if (typeof src.kind === \"string\" && \"token\" in src) return { kind: src.kind };\n const out: Record<string, unknown> = {};\n for (const [k, val] of Object.entries(src)) {\n if (keys.has(k.toLowerCase())) {\n out[k] =\n k.toLowerCase() === \"authorization\" && typeof val === \"string\"\n ? \"Bearer ***redacted***\"\n : \"***redacted***\";\n } else {\n out[k] = walk(val);\n }\n }\n return out;\n }\n return v;\n };\n return walk(value);\n}\n\ninterface Sink {\n log: (...a: unknown[]) => void;\n info: (...a: unknown[]) => void;\n warn: (...a: unknown[]) => void;\n error: (...a: unknown[]) => void;\n}\n\nconst EMIT: Record<Exclude<LogLevel, \"silent\">, number> = {\n trace: LEVEL.trace, debug: LEVEL.debug, info: LEVEL.info, warn: LEVEL.warn, error: LEVEL.error,\n};\n\nabstract class BaseLogger implements Logger {\n constructor(\n protected readonly resolver: LevelResolver,\n protected readonly bindings: LogFields,\n protected readonly extraRedact: string[],\n ) {}\n private svc(): ServiceName {\n return (this.bindings.service as ServiceName) ?? \"http\";\n }\n get level(): LogLevel {\n return this.resolver.get(this.svc());\n }\n isLevelEnabled(level: LogLevel): boolean {\n return this.resolver.isAtLeast(this.svc(), level);\n }\n protected abstract emit(\n level: Exclude<LogLevel, \"silent\">,\n msg: string,\n fields: LogFields,\n ): void;\n private at(level: Exclude<LogLevel, \"silent\">, msg: string, fields?: LogFields): void {\n if (this.resolver.numericLevel(this.svc()) > EMIT[level]) return;\n const merged = { ...this.bindings, ...(fields ?? {}) };\n this.emit(level, msg, redact(merged, this.extraRedact) as LogFields);\n }\n trace(m: string, f?: LogFields): void { this.at(\"trace\", m, f); }\n debug(m: string, f?: LogFields): void { this.at(\"debug\", m, f); }\n info(m: string, f?: LogFields): void { this.at(\"info\", m, f); }\n warn(m: string, f?: LogFields): void { this.at(\"warn\", m, f); }\n error(m: string, f?: LogFields): void { this.at(\"error\", m, f); }\n abstract child(bindings: LogFields): Logger;\n}\n\nclass ConsoleLogger extends BaseLogger {\n constructor(\n resolver: LevelResolver,\n bindings: LogFields,\n extra: string[],\n private readonly sink: Sink,\n private readonly pretty: boolean,\n ) {\n super(resolver, bindings, extra);\n }\n protected emit(level: Exclude<LogLevel, \"silent\">, msg: string, fields: LogFields): void {\n if (this.pretty) {\n const fn =\n level === \"error\" ? this.sink.error\n : level === \"warn\" ? this.sink.warn\n : level === \"info\" ? this.sink.info\n : this.sink.log;\n fn(`[${level}] ${msg}`, fields);\n } else {\n this.sink.log(JSON.stringify({ ts: new Date().toISOString(), level, msg, ...fields }));\n }\n }\n child(bindings: LogFields): Logger {\n return new ConsoleLogger(\n this.resolver,\n { ...this.bindings, ...bindings },\n this.extraRedact,\n this.sink,\n this.pretty,\n );\n }\n}\n\nclass NoopLogger implements Logger {\n level: LogLevel = \"silent\";\n isLevelEnabled(): boolean { return false; }\n trace(): void {}\n debug(): void {}\n info(): void {}\n warn(): void {}\n error(): void {}\n child(): Logger { return this; }\n}\n\n/** Creates the built-in console logger. `opts.sink` overrides `console` (used in tests). */\nexport function createConsoleLogger(\n resolver: LevelResolver,\n bindings: LogFields = {},\n opts: { pretty?: boolean; redact?: string[]; sink?: Sink } = {},\n): Logger {\n const pretty = opts.pretty ?? readEnv(\"NODE_ENV\") !== \"production\";\n const sink: Sink = opts.sink ?? {\n log: console.log,\n info: console.info,\n warn: console.warn,\n error: console.error,\n };\n return new ConsoleLogger(resolver, bindings, opts.redact ?? [], sink, pretty);\n}\n\n/** Creates a logger that discards everything. */\nexport function createNoopLogger(): Logger {\n return new NoopLogger();\n}\n","import type { ResolvedConfig, ServiceCredentials } from \"./config\";\nimport { EmporixAuthError } from \"./errors\";\n\n/** Which token a call should use. */\nexport type AuthKind = \"service\" | \"customer\" | \"anonymous\" | \"raw\";\n\n/** Caller-supplied, per-call auth selector. Never stored on the client. */\nexport type AuthContext =\n | { kind: \"service\"; credentials?: string }\n | { kind: \"anonymous\" }\n | { kind: \"customer\"; token: string }\n | { kind: \"raw\"; token: string };\n\n/** An obtained anonymous storefront session. */\nexport interface AnonymousSession {\n accessToken: string;\n refreshToken: string;\n sessionId: string;\n expiresIn: number;\n}\n\n/**\n * Persistence callback for anonymous sessions. `read` is called once on the\n * first need for an anonymous token to bootstrap a possibly-existing session;\n * `write` is called after every successful login or refresh. `write(null)`\n * means the SDK is invalidating the stored session.\n */\nexport interface AnonymousSessionStore {\n read(): { refreshToken: string; sessionId: string } | null;\n write(session: { refreshToken: string; sessionId: string } | null): void;\n}\n\n/** Supplies SDK-managed tokens (service/custom + anonymous). May be user-injected. */\nexport interface TokenProvider {\n /** Service/custom client-credentials token for the named credential set. */\n getToken(credentialSet: string): Promise<string>;\n /** Cached anonymous storefront session (preserves sessionId across refreshes). */\n getAnonymousToken(): Promise<AnonymousSession>;\n /** Refresh the anonymous session, preserving sessionId. */\n refreshAnonymous?(): Promise<AnonymousSession>;\n /** Invalidate a cached SDK-managed token so the next call re-auths. */\n invalidate?(credentialSet: string): void;\n /** Invalidate the cached anonymous session entirely (next call re-logs in). */\n invalidateAnonymous?(): void;\n /**\n * Mark the anonymous access token stale but keep the refresh token, so the\n * next {@link getAnonymousToken} refreshes (preserving sessionId) rather\n * than starting a brand-new session.\n */\n expireAnonymous?(): void;\n /**\n * Install a persistence adapter for the anonymous session. The host (e.g.\n * `EmporixProvider`) calls this at construction so the SDK can bootstrap\n * an existing session and persist refreshes. Idempotent: a later call\n * replaces the previous adapter.\n */\n attachAnonymousStore?(store: AnonymousSessionStore): void;\n /**\n * Subscribe to token-refresh events. Optional — implementations may no-op.\n * Returns an unsubscribe function. `DefaultTokenProvider` emits for the\n * anonymous-login / anonymous-refresh paths.\n */\n onRefresh?(\n listener: (event: { kind: \"anonymous\" | \"customer\"; success: boolean }) => void,\n ): () => void;\n}\n\n/** Tiny constructors for {@link AuthContext}. */\nexport const auth = {\n /** Service/custom credential set (default `backend`). */\n service: (credentials?: string): AuthContext =>\n credentials === undefined ? { kind: \"service\" } : { kind: \"service\", credentials },\n /** Cached anonymous storefront token. */\n anonymous: (): AuthContext => ({ kind: \"anonymous\" }),\n /** Caller-owned customer bearer token. */\n customer: (token: string): AuthContext => ({ kind: \"customer\", token }),\n /** Exact token, no transformation (SSO / token-exchange). */\n raw: (token: string): AuthContext => ({ kind: \"raw\", token }),\n};\n\n/** Resolves an {@link AuthContext} to a concrete bearer token. */\nexport async function resolveToken(ctx: AuthContext, provider: TokenProvider): Promise<string> {\n switch (ctx.kind) {\n case \"service\":\n return provider.getToken(ctx.credentials ?? \"backend\");\n case \"anonymous\":\n return (await provider.getAnonymousToken()).accessToken;\n case \"customer\":\n case \"raw\":\n return ctx.token;\n }\n}\n\ninterface CacheEntry {\n token: string;\n expiresAt: number;\n obtainedAt: number;\n}\n\n/** SDK-owned token provider: client-credentials service tokens + anonymous session. */\nexport class DefaultTokenProvider implements TokenProvider {\n private readonly serviceCache = new Map<string, CacheEntry>();\n private readonly serviceLocks = new Map<string, Promise<string>>();\n private anon: (AnonymousSession & { expiresAt: number }) | undefined;\n private anonLock: Promise<AnonymousSession> | undefined;\n private anonStore?: AnonymousSessionStore;\n private readonly refreshListeners = new Set<\n (event: { kind: \"anonymous\" | \"customer\"; success: boolean }) => void\n >();\n\n constructor(private readonly cfg: ResolvedConfig) {}\n\n onRefresh(\n listener: (event: { kind: \"anonymous\" | \"customer\"; success: boolean }) => void,\n ): () => void {\n this.refreshListeners.add(listener);\n return () => {\n this.refreshListeners.delete(listener);\n };\n }\n\n private notifyRefresh(kind: \"anonymous\" | \"customer\", success: boolean): void {\n for (const l of this.refreshListeners) {\n try {\n l({ kind, success });\n } catch {\n // Never let a telemetry listener break the auth path.\n }\n }\n }\n\n attachAnonymousStore(store: AnonymousSessionStore): void {\n this.anonStore = store;\n // Bootstrap `this.anon` from the store if we don't have it yet. The seeded\n // session has expiresAt = 0 so the next getAnonymousToken triggers a refresh\n // (which preserves sessionId) instead of a fresh login.\n if (!this.anon) {\n const persisted = store.read();\n if (persisted) {\n this.anon = {\n accessToken: \"\",\n refreshToken: persisted.refreshToken,\n sessionId: persisted.sessionId,\n expiresIn: 0,\n expiresAt: 0,\n };\n }\n }\n }\n\n private creds(set: string): ServiceCredentials {\n if (set === \"backend\") {\n const b = this.cfg.credentials.backend;\n if (!b?.clientId || !b.secret) {\n throw new EmporixAuthError(\n \"A 'service' AuthContext was used but credentials.backend is not configured\",\n );\n }\n return b;\n }\n const c = this.cfg.credentials.custom?.[set];\n if (!c) throw new Error(`Unknown credential set \"${set}\"`);\n return c;\n }\n\n private fresh(e: CacheEntry | undefined): boolean {\n if (!e) return false;\n const now = Date.now();\n if (now - e.obtainedAt >= this.cfg.cache.maxLifetimeSeconds * 1000) return false;\n return now < e.expiresAt;\n }\n\n async getToken(set: string): Promise<string> {\n // Surface an unknown credential set before entering the cache/lock path.\n this.creds(set);\n const cached = this.serviceCache.get(set);\n if (this.fresh(cached)) return cached!.token;\n const inflight = this.serviceLocks.get(set);\n if (inflight) return inflight;\n const p = this.requestServiceToken(set).finally(() => this.serviceLocks.delete(set));\n this.serviceLocks.set(set, p);\n return p;\n }\n\n private async requestServiceToken(set: string): Promise<string> {\n const c = this.creds(set);\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: c.clientId,\n client_secret: c.secret,\n });\n if (c.scope) body.set(\"scope\", c.scope);\n const res = await fetch(`${this.cfg.host}/oauth/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body,\n });\n const json = (await res.json().catch(() => ({}))) as Record<string, unknown>;\n if (!res.ok) {\n throw new EmporixAuthError(`Token request failed for \"${set}\"`, res.status, json);\n }\n const obtainedAt = Date.now();\n const ttl = Number((json.expires_in as number | undefined) ?? 3600);\n this.serviceCache.set(set, {\n token: json.access_token as string,\n obtainedAt,\n expiresAt: obtainedAt + (ttl - this.cfg.cache.expirationBufferSeconds) * 1000,\n });\n return this.serviceCache.get(set)!.token;\n }\n\n invalidate(set: string): void {\n this.serviceCache.delete(set);\n }\n\n private anonFresh(): boolean {\n return !!this.anon && Date.now() < this.anon.expiresAt;\n }\n\n async getAnonymousToken(): Promise<AnonymousSession> {\n if (this.anonFresh()) return this.stripExpiry(this.anon!);\n if (this.anonLock) return this.anonLock;\n // Token expired but a refresh token survives → refresh to keep the same\n // sessionId; only fall back to a brand-new login if the refresh fails.\n const canRefresh = !!this.anon?.refreshToken;\n const obtain = canRefresh\n ? this.fetchAnonymous(\"refresh\").catch(() => this.fetchAnonymous(\"login\"))\n : this.fetchAnonymous(\"login\");\n const p = obtain.finally(() => {\n this.anonLock = undefined;\n });\n this.anonLock = p;\n return p;\n }\n\n /** Refreshes the anonymous session, preserving its sessionId. */\n async refreshAnonymous(): Promise<AnonymousSession> {\n if (!this.anon) return this.getAnonymousToken();\n return this.fetchAnonymous(\"refresh\");\n }\n\n invalidateAnonymous(): void {\n this.anon = undefined;\n this.anonStore?.write(null);\n }\n\n /** Force a stale access token while keeping the refresh token + sessionId. */\n expireAnonymous(): void {\n if (this.anon) this.anon = { ...this.anon, expiresAt: 0 };\n }\n\n private stripExpiry(s: AnonymousSession & { expiresAt: number }): AnonymousSession {\n const { expiresAt: _expiresAt, ...rest } = s;\n return rest;\n }\n\n private async fetchAnonymous(mode: \"login\" | \"refresh\"): Promise<AnonymousSession> {\n const sf = this.cfg.credentials.storefront;\n if (!sf?.clientId) {\n throw new Error(\"credentials.storefront.clientId is required for anonymous tokens\");\n }\n const url = new URL(`${this.cfg.host}/customerlogin/auth/anonymous/${mode}`);\n url.searchParams.set(\"tenant\", this.cfg.tenant);\n url.searchParams.set(\"client_id\", sf.clientId);\n // Context is config-fixed → single anon slot stays correct (no per-call ctx).\n const c = sf.context;\n if (c?.currency) url.searchParams.set(\"currency\", c.currency);\n if (c?.siteCode) url.searchParams.set(\"siteCode\", c.siteCode);\n if (c?.targetLocation) url.searchParams.set(\"targetLocation\", c.targetLocation);\n if (mode === \"refresh\" && this.anon) {\n url.searchParams.set(\"refresh_token\", this.anon.refreshToken);\n }\n try {\n const res = await fetch(url, { method: \"GET\" });\n const json = (await res.json().catch(() => ({}))) as Record<string, unknown>;\n if (!res.ok) {\n this.notifyRefresh(\"anonymous\", false);\n throw new EmporixAuthError(`Anonymous token ${mode} failed`, res.status, json);\n }\n const obtainedAt = Date.now();\n this.anon = {\n accessToken: json.access_token as string,\n refreshToken: json.refresh_token as string,\n sessionId: json.sessionId as string,\n expiresIn: json.expires_in as number,\n expiresAt:\n obtainedAt +\n ((json.expires_in as number) - this.cfg.cache.expirationBufferSeconds) * 1000,\n };\n this.anonStore?.write({\n refreshToken: this.anon.refreshToken,\n sessionId: this.anon.sessionId,\n });\n this.notifyRefresh(\"anonymous\", true);\n return this.stripExpiry(this.anon);\n } catch (err) {\n // Re-throw EmporixAuthError as-is; for non-Emporix errors (network), also notify.\n if (!(err instanceof EmporixAuthError)) {\n this.notifyRefresh(\"anonymous\", false);\n }\n throw err;\n }\n }\n}\n// Customer-token refreshes happen via client.customers.refresh() and don't\n// route through this TokenProvider — only the anonymous flow notifies.\n// React-side useCustomerSession.refresh emits its own telemetry event in a\n// follow-up if needed.\n","import { type AuthContext, type TokenProvider, resolveToken } from \"./auth\";\nimport { errorFromResponse } from \"./errors\";\nimport type { Logger } from \"./logger\";\n\n/** A single HTTP request through the SDK. */\nexport interface RequestOptions {\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n path: string;\n auth: AuthContext;\n query?: Record<string, string | number | undefined>;\n body?: unknown;\n /** Extra request headers (merged before auth; cannot override Authorization). */\n headers?: Record<string, string>;\n /** Per-request abort timeout override (ms). */\n timeoutMs?: number;\n}\n\n/** Construction options for {@link HttpClient}. */\nexport interface HttpClientOptions {\n host: string;\n provider: TokenProvider;\n logger: Logger;\n retry: { maxAttempts: number };\n timeouts: { connectMs: number; readMs: number };\n /** Override the retry backoff delay (ms → Promise). Defaults to a real timer. */\n sleep?: (ms: number) => Promise<void>;\n}\n\nlet requestSeq = 0;\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\n/** Fetch wrapper: auth resolution, JSON parsing, typed error mapping, logging. */\nexport class HttpClient {\n private readonly sleep: (ms: number) => Promise<void>;\n constructor(private readonly opts: HttpClientOptions) {\n this.sleep =\n opts.sleep ?? ((ms: number) => new Promise<void>((r) => setTimeout(r, ms)));\n }\n\n async request<T = unknown>(o: RequestOptions): Promise<T> {\n const requestId = `req-${++requestSeq}`;\n const log = this.opts.logger.child({ requestId });\n const url = new URL(this.opts.host + o.path);\n for (const [k, v] of Object.entries(o.query ?? {})) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n const sdkManaged = o.auth.kind === \"service\" || o.auth.kind === \"anonymous\";\n const maxAttempts = this.opts.retry.maxAttempts;\n let reauthed = false;\n\n for (let attempt = 1; ; attempt++) {\n const token = await resolveToken(o.auth, this.opts.provider);\n log.debug(\"http request\", {\n authKind: o.auth.kind,\n method: o.method,\n url: url.pathname,\n attempt,\n });\n\n const controller = new AbortController();\n const timer = setTimeout(\n () => controller.abort(),\n o.timeoutMs ?? this.opts.timeouts.readMs,\n );\n const isFormData =\n typeof FormData !== \"undefined\" && o.body instanceof FormData;\n const init: RequestInit = {\n method: o.method,\n headers: {\n ...(o.headers ?? {}),\n Authorization: `Bearer ${token}`,\n // JSON bodies: set Content-Type. FormData bodies: let `fetch`\n // emit `multipart/form-data; boundary=...` itself.\n ...(o.body !== undefined && !isFormData\n ? { \"Content-Type\": \"application/json\" }\n : {}),\n },\n signal: controller.signal,\n };\n if (o.body !== undefined) {\n init.body = isFormData ? (o.body as FormData) : JSON.stringify(o.body);\n }\n let res: Response;\n try {\n res = await fetch(url, init);\n } finally {\n clearTimeout(timer);\n }\n\n const text = await res.text();\n const parsed = text ? safeJson(text) : undefined;\n if (res.ok) {\n log.debug(\"http ok\", { status: res.status });\n return parsed as T;\n }\n\n // 401 asymmetry.\n if (res.status === 401) {\n if (sdkManaged && !reauthed) {\n reauthed = true;\n if (o.auth.kind === \"service\") {\n this.opts.provider.invalidate?.(o.auth.credentials ?? \"backend\");\n } else if (this.opts.provider.expireAnonymous) {\n // Keep the refresh token so the retry refreshes (same sessionId)\n // instead of starting a new anonymous session.\n this.opts.provider.expireAnonymous();\n } else {\n this.opts.provider.invalidateAnonymous?.();\n }\n log.warn(\"sdk-managed 401, re-authing once\", { authKind: o.auth.kind });\n continue;\n }\n throw errorFromResponse(res.status, `${o.method} ${o.path} → 401`, parsed);\n }\n\n // Retry 5xx / 429.\n const retryable = res.status >= 500 || res.status === 429;\n if (retryable && attempt < maxAttempts) {\n const retryAfter = Number(res.headers.get(\"Retry-After\"));\n const backoff =\n Number.isFinite(retryAfter) && retryAfter >= 0\n ? retryAfter * 1000\n : Math.min(1000 * 2 ** (attempt - 1), 8000) + Math.random() * 100;\n log.warn(\"retryable failure\", { status: res.status, attempt, backoffMs: backoff });\n await this.sleep(backoff);\n continue;\n }\n\n log.error(\"http error (final)\", { status: res.status, attempt });\n throw errorFromResponse(res.status, `${o.method} ${o.path} → ${res.status}`, parsed);\n }\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport { auth, type AuthContext } from \"../core/auth\";\n\nconst ANON: AuthContext = auth.anonymous();\n\n/**\n * One site as returned by the Site Settings Service. Mirrors the public\n * SiteDto schema with the fields a storefront actually consumes.\n */\nexport interface Site {\n code: string;\n name: string;\n active: boolean;\n default: boolean;\n includesTax?: boolean;\n defaultLanguage: string;\n languages: string[];\n currency: string;\n availableCurrencies?: string[];\n homeBase: {\n address: {\n country: string;\n zipCode: string;\n street?: string;\n city?: string;\n state?: string;\n };\n timezone?: string;\n };\n shipToCountries: string[];\n cartCalculationScale?: number;\n metadata?: { version?: number };\n}\n\n/**\n * Read-only access to the tenant's site catalog. List returns active sites\n * visible to the storefront context (the `site_manage` scope is only needed\n * to read inactive sites).\n */\nexport class SiteService {\n constructor(private readonly ctx: ClientContext) {}\n\n /** Lists active sites. */\n async list(authCtx: AuthContext = ANON): Promise<Site[]> {\n return this.ctx.http.request<Site[]>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites`,\n auth: authCtx,\n });\n }\n\n /** Retrieves one site by code. */\n async get(code: string, authCtx: AuthContext = ANON): Promise<Site> {\n return this.ctx.http.request<Site>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites/${code}`,\n auth: authCtx,\n });\n }\n\n /**\n * Returns the tenant's default site (the one with `default: true`).\n * Throws if no default is configured — a tenant should always have one.\n */\n async current(authCtx: AuthContext = ANON): Promise<Site> {\n const sites = await this.list(authCtx);\n const def = sites.find((s) => s.default);\n if (!def) {\n throw new Error(\n `SiteService.current: no default site for tenant \"${this.ctx.tenant}\"`,\n );\n }\n return def;\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport { auth, type AuthContext } from \"../core/auth\";\n\nconst ANON: AuthContext = auth.anonymous();\n\n/**\n * One session context as returned by `GET /session-context/{tenant}/me/context`.\n * Created server-side when the user creates a cart. Until then, the server\n * returns 404 and {@link SessionContextService.get} resolves to `null`.\n */\nexport interface SessionContext {\n sessionId: string;\n customerId?: string;\n siteCode?: string;\n currency?: string;\n cartId?: string;\n targetLocation?: string;\n language?: string;\n context?: Record<string, unknown>;\n metadata?: {\n version?: number;\n createdAt?: string;\n modifiedAt?: string;\n };\n}\n\n/**\n * Input for {@link SessionContextService.patch}. Only the listed fields are\n * accepted by the server; everything else is ignored.\n *\n * If `version` is omitted, the service fetches the current version via GET\n * before PATCHing (one extra round-trip). Pass it explicitly when you already\n * know it (e.g. after a `get()` call earlier in the same flow).\n */\nexport interface SessionContextPatch {\n siteCode?: string;\n currency?: string;\n targetLocation?: string;\n language?: string;\n context?: Record<string, unknown>;\n /** Override for optimistic-locking version. If omitted, GET resolves it. */\n version?: number;\n}\n\n/**\n * Session-context binding for the current storefront session. Both endpoints\n * resolve the session-id from the `Authorization` token — no path/query\n * parameter required.\n */\nexport class SessionContextService {\n constructor(private readonly ctx: ClientContext) {}\n\n /**\n * Retrieves the current session context, or `null` when the server returns\n * 404 (no session exists yet — the session-context is created server-side\n * only after the user creates a cart).\n */\n async get(authCtx: AuthContext = ANON): Promise<SessionContext | null> {\n try {\n return await this.ctx.http.request<SessionContext>({\n method: \"GET\",\n path: `/session-context/${this.ctx.tenant}/me/context`,\n auth: authCtx,\n });\n } catch (err) {\n if (isNotFound(err)) return null;\n throw err;\n }\n }\n\n /**\n * Partially updates the current session context. Returns `true` when the\n * PATCH was applied, `false` when there is no session context yet (the\n * server returned 404 on the version-lookup GET, so there is nothing to\n * update). Non-404 errors propagate.\n */\n async patch(input: SessionContextPatch, authCtx: AuthContext = ANON): Promise<boolean> {\n let version = input.version;\n if (version === undefined) {\n const current = await this.get(authCtx);\n if (current === null) return false;\n version = current.metadata?.version;\n if (version === undefined) {\n throw new Error(\n \"SessionContextService.patch: no metadata.version in server response\",\n );\n }\n }\n const { version: _v, ...fields } = input;\n void _v;\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `/session-context/${this.ctx.tenant}/me/context`,\n body: {\n ...fields,\n metadata: { version },\n },\n auth: authCtx,\n });\n return true;\n }\n}\n\nfunction isNotFound(err: unknown): boolean {\n if (err && typeof err === \"object\") {\n const status = (err as { status?: unknown }).status;\n if (typeof status === \"number\" && status === 404) return true;\n }\n return false;\n}\n","import { validateConfig, type EmporixConfig, type ResolvedConfig } from \"./core/config\";\nimport { DefaultTokenProvider, type TokenProvider } from \"./core/auth\";\nimport { HttpClient } from \"./core/http\";\nimport {\n LevelResolver,\n createConsoleLogger,\n createNoopLogger,\n type Logger,\n type LogLevel,\n type ServiceName,\n type LoggerObjectConfig,\n} from \"./core/logger\";\nimport type { ClientContext } from \"./core/context\";\nimport { CustomerService } from \"./services/customer\";\nimport { ProductService } from \"./services/product\";\nimport { CategoryService } from \"./services/category\";\nimport { CartService } from \"./services/cart\";\nimport { CheckoutService } from \"./services/checkout\";\nimport { PaymentGatewayService } from \"./services/payment\";\nimport { PriceService } from \"./services/price\";\nimport { MediaService } from \"./services/media\";\nimport { SegmentService } from \"./services/segment\";\nimport { SiteService } from \"./services/site\";\nimport { SessionContextService } from \"./services/session-context\";\nimport { CompaniesService } from \"./services/companies\";\nimport { ContactsService } from \"./services/contacts\";\nimport { LocationsService } from \"./services/locations\";\nimport { CustomerGroupsService } from \"./services/customer-groups\";\nimport { OrdersService, SalesOrdersService } from \"./services/orders\";\n\nconst SDK_VERSION = \"0.0.0\";\n\n/** The Emporix SDK entry point. One instance safely serves many concurrent shoppers. */\nexport class EmporixClient {\n readonly customers: CustomerService;\n readonly products: ProductService;\n readonly categories: CategoryService;\n readonly carts: CartService;\n readonly checkout: CheckoutService;\n readonly payments: PaymentGatewayService;\n readonly prices: PriceService;\n readonly media: MediaService;\n readonly segments: SegmentService;\n readonly sites: SiteService;\n readonly sessionContext: SessionContextService;\n readonly companies: CompaniesService;\n readonly contacts: ContactsService;\n readonly locations: LocationsService;\n readonly customerGroups: CustomerGroupsService;\n readonly orders: OrdersService;\n readonly salesOrders: SalesOrdersService;\n /** The validated tenant this client is bound to. */\n readonly tenant: string;\n /**\n * The token provider in use by this client. Exposed so React/Next hosts can\n * call `attachAnonymousStore` to wire session persistence. Treat as\n * read-only — replacing it after construction is not supported.\n */\n readonly tokenProvider: TokenProvider;\n /**\n * The validated config used to construct this client. Exposed so React /\n * Next hosts can read static settings such as `credentials.storefront.context`\n * (siteCode, currency, targetLocation) without re-plumbing them through the\n * Provider tree. Treat as read-only.\n */\n readonly config: ResolvedConfig;\n private readonly resolver: LevelResolver;\n\n constructor(config: EmporixConfig) {\n const cfg = validateConfig(config);\n this.tenant = cfg.tenant;\n this.config = cfg;\n\n let loggerObj: LoggerObjectConfig = {};\n let baseLogger: Logger | undefined;\n if (cfg.logger === false) {\n baseLogger = createNoopLogger();\n } else if (cfg.logger && typeof (cfg.logger as Logger).child === \"function\") {\n baseLogger = cfg.logger as Logger;\n } else if (cfg.logger) {\n loggerObj = cfg.logger as LoggerObjectConfig;\n }\n this.resolver = new LevelResolver(loggerObj);\n const root =\n baseLogger ??\n createConsoleLogger(this.resolver, {\n sdk: \"emporix\",\n sdkVersion: SDK_VERSION,\n tenant: cfg.tenant,\n });\n\n const tokenProvider: TokenProvider = cfg.tokenProvider ?? new DefaultTokenProvider(cfg);\n this.tokenProvider = tokenProvider;\n\n const mk = (service: ServiceName): ClientContext => ({\n tenant: cfg.tenant,\n tokenProvider,\n logger: root.child({ service }),\n http: new HttpClient({\n host: cfg.host,\n provider: tokenProvider,\n logger: root.child({ service: \"http\" }),\n retry: cfg.retry,\n timeouts: cfg.timeouts,\n }),\n });\n\n this.customers = new CustomerService(mk(\"customer\"));\n this.products = new ProductService(mk(\"product\"));\n this.categories = new CategoryService(mk(\"category\"));\n this.carts = new CartService(mk(\"cart\"));\n this.checkout = new CheckoutService(mk(\"checkout\"));\n this.payments = new PaymentGatewayService(mk(\"payment\"));\n this.prices = new PriceService(mk(\"price\"));\n this.media = new MediaService(mk(\"media\"));\n this.segments = new SegmentService(mk(\"segment\"), {\n products: this.products,\n categories: this.categories,\n });\n this.sites = new SiteService(mk(\"site\"));\n this.sessionContext = new SessionContextService(mk(\"session-context\"));\n this.companies = new CompaniesService(mk(\"customer-management\"));\n this.contacts = new ContactsService(mk(\"customer-management\"));\n this.locations = new LocationsService(mk(\"customer-management\"));\n this.customerGroups = new CustomerGroupsService(mk(\"iam\"));\n this.orders = new OrdersService(mk(\"orders\"));\n this.salesOrders = new SalesOrdersService(mk(\"sales-orders\"));\n }\n\n /** Sets the runtime log level globally or for one service. */\n setLogLevel(level: LogLevel, opts: { service?: ServiceName; force?: boolean } = {}): void {\n this.resolver.set(level, opts.service, opts.force ?? false);\n }\n\n /** Returns the effective log level for a service. */\n getLogLevel(service: ServiceName): LogLevel {\n return this.resolver.get(service);\n }\n}\n"]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/services/locations.ts
|
|
4
|
+
var LocationsService = class {
|
|
5
|
+
constructor(ctx) {
|
|
6
|
+
this.ctx = ctx;
|
|
7
|
+
}
|
|
8
|
+
ctx;
|
|
9
|
+
base() {
|
|
10
|
+
return `/customer-management/${this.ctx.tenant}/locations`;
|
|
11
|
+
}
|
|
12
|
+
/** Lists locations owned by one legal entity. */
|
|
13
|
+
async listForCompany(legalEntityId, auth) {
|
|
14
|
+
return this.ctx.http.request({
|
|
15
|
+
method: "GET",
|
|
16
|
+
path: this.base(),
|
|
17
|
+
query: { legalEntityId },
|
|
18
|
+
auth
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/** Fetches one location by id. */
|
|
22
|
+
async get(locationId, auth) {
|
|
23
|
+
return this.ctx.http.request({
|
|
24
|
+
method: "GET",
|
|
25
|
+
path: `${this.base()}/${locationId}`,
|
|
26
|
+
auth
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/** Creates a location for a legal entity. */
|
|
30
|
+
async create(input, auth) {
|
|
31
|
+
return this.ctx.http.request({
|
|
32
|
+
method: "POST",
|
|
33
|
+
path: this.base(),
|
|
34
|
+
auth,
|
|
35
|
+
body: input
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/** Patches a location. */
|
|
39
|
+
async update(locationId, patch, auth) {
|
|
40
|
+
return this.ctx.http.request({
|
|
41
|
+
method: "PATCH",
|
|
42
|
+
path: `${this.base()}/${locationId}`,
|
|
43
|
+
auth,
|
|
44
|
+
body: patch
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/** Deletes a location. */
|
|
48
|
+
async delete(locationId, auth) {
|
|
49
|
+
await this.ctx.http.request({
|
|
50
|
+
method: "DELETE",
|
|
51
|
+
path: `${this.base()}/${locationId}`,
|
|
52
|
+
auth
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
exports.LocationsService = LocationsService;
|
|
58
|
+
//# sourceMappingURL=locations.cjs.map
|
|
59
|
+
//# sourceMappingURL=locations.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/services/locations.ts"],"names":[],"mappings":";;;AAeO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,GAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAAqB;AAAA,EAArB,GAAA;AAAA,EAErB,IAAA,GAAe;AACrB,IAAA,OAAO,CAAA,qBAAA,EAAwB,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,UAAA,CAAA;AAAA,EAChD;AAAA;AAAA,EAGA,MAAM,cAAA,CAAe,aAAA,EAAuB,IAAA,EAAwC;AAClF,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAoB;AAAA,MACvC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,MAChB,KAAA,EAAO,EAAE,aAAA,EAAc;AAAA,MACvB;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,GAAA,CAAI,UAAA,EAAoB,IAAA,EAAsC;AAClE,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAkB;AAAA,MACrC,MAAA,EAAQ,KAAA;AAAA,MACR,MAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,UAAU,CAAA,CAAA;AAAA,MAClC;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,KAAA,EAAuB,IAAA,EAA4C;AAC9E,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAwB;AAAA,MAC3C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,MAChB,IAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,MAAA,CACJ,UAAA,EACA,KAAA,EACA,IAAA,EACmB;AACnB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAkB;AAAA,MACrC,MAAA,EAAQ,OAAA;AAAA,MACR,MAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,UAAU,CAAA,CAAA;AAAA,MAClC,IAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,UAAA,EAAoB,IAAA,EAAkC;AACjE,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAc;AAAA,MAChC,MAAA,EAAQ,QAAA;AAAA,MACR,MAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,UAAU,CAAA,CAAA;AAAA,MAClC;AAAA,KACD,CAAA;AAAA,EACH;AACF","file":"locations.cjs","sourcesContent":["import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Location,\n LocationCreate,\n LocationUpdate,\n} from \"../generated/customer-management\";\n\n/**\n * Manages locations owned by a legal entity. Three types are supported:\n * HEADQUARTER, WAREHOUSE, OFFICE.\n *\n * Reads require `customermanagement.location_read`; mutations require\n * `_manage`.\n */\nexport class LocationsService {\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/customer-management/${this.ctx.tenant}/locations`;\n }\n\n /** Lists locations owned by one legal entity. */\n async listForCompany(legalEntityId: string, auth: AuthContext): Promise<Location[]> {\n return this.ctx.http.request<Location[]>({\n method: \"GET\",\n path: this.base(),\n query: { legalEntityId },\n auth,\n });\n }\n\n /** Fetches one location by id. */\n async get(locationId: string, auth: AuthContext): Promise<Location> {\n return this.ctx.http.request<Location>({\n method: \"GET\",\n path: `${this.base()}/${locationId}`,\n auth,\n });\n }\n\n /** Creates a location for a legal entity. */\n async create(input: LocationCreate, auth: AuthContext): Promise<{ id: string }> {\n return this.ctx.http.request<{ id: string }>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /** Patches a location. */\n async update(\n locationId: string,\n patch: LocationUpdate,\n auth: AuthContext,\n ): Promise<Location> {\n return this.ctx.http.request<Location>({\n method: \"PATCH\",\n path: `${this.base()}/${locationId}`,\n auth,\n body: patch,\n });\n }\n\n /** Deletes a location. */\n async delete(locationId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${locationId}`,\n auth,\n });\n }\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { C as ClientContext, b as AuthContext } from './context-vKgzZ-5f.cjs';
|
|
2
|
+
import { j as Location, k as LocationCreate, m as LocationUpdate } from './types.gen-D1QuqPLs.cjs';
|
|
3
|
+
export { d as ContactDetails, l as LocationType } from './types.gen-D1QuqPLs.cjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Manages locations owned by a legal entity. Three types are supported:
|
|
7
|
+
* HEADQUARTER, WAREHOUSE, OFFICE.
|
|
8
|
+
*
|
|
9
|
+
* Reads require `customermanagement.location_read`; mutations require
|
|
10
|
+
* `_manage`.
|
|
11
|
+
*/
|
|
12
|
+
declare class LocationsService {
|
|
13
|
+
private readonly ctx;
|
|
14
|
+
constructor(ctx: ClientContext);
|
|
15
|
+
private base;
|
|
16
|
+
/** Lists locations owned by one legal entity. */
|
|
17
|
+
listForCompany(legalEntityId: string, auth: AuthContext): Promise<Location[]>;
|
|
18
|
+
/** Fetches one location by id. */
|
|
19
|
+
get(locationId: string, auth: AuthContext): Promise<Location>;
|
|
20
|
+
/** Creates a location for a legal entity. */
|
|
21
|
+
create(input: LocationCreate, auth: AuthContext): Promise<{
|
|
22
|
+
id: string;
|
|
23
|
+
}>;
|
|
24
|
+
/** Patches a location. */
|
|
25
|
+
update(locationId: string, patch: LocationUpdate, auth: AuthContext): Promise<Location>;
|
|
26
|
+
/** Deletes a location. */
|
|
27
|
+
delete(locationId: string, auth: AuthContext): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { Location, LocationCreate, LocationUpdate, LocationsService };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { C as ClientContext, b as AuthContext } from './context-vKgzZ-5f.js';
|
|
2
|
+
import { j as Location, k as LocationCreate, m as LocationUpdate } from './types.gen-D1QuqPLs.js';
|
|
3
|
+
export { d as ContactDetails, l as LocationType } from './types.gen-D1QuqPLs.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Manages locations owned by a legal entity. Three types are supported:
|
|
7
|
+
* HEADQUARTER, WAREHOUSE, OFFICE.
|
|
8
|
+
*
|
|
9
|
+
* Reads require `customermanagement.location_read`; mutations require
|
|
10
|
+
* `_manage`.
|
|
11
|
+
*/
|
|
12
|
+
declare class LocationsService {
|
|
13
|
+
private readonly ctx;
|
|
14
|
+
constructor(ctx: ClientContext);
|
|
15
|
+
private base;
|
|
16
|
+
/** Lists locations owned by one legal entity. */
|
|
17
|
+
listForCompany(legalEntityId: string, auth: AuthContext): Promise<Location[]>;
|
|
18
|
+
/** Fetches one location by id. */
|
|
19
|
+
get(locationId: string, auth: AuthContext): Promise<Location>;
|
|
20
|
+
/** Creates a location for a legal entity. */
|
|
21
|
+
create(input: LocationCreate, auth: AuthContext): Promise<{
|
|
22
|
+
id: string;
|
|
23
|
+
}>;
|
|
24
|
+
/** Patches a location. */
|
|
25
|
+
update(locationId: string, patch: LocationUpdate, auth: AuthContext): Promise<Location>;
|
|
26
|
+
/** Deletes a location. */
|
|
27
|
+
delete(locationId: string, auth: AuthContext): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { Location, LocationCreate, LocationUpdate, LocationsService };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"locations.js"}
|
package/dist/media.cjs
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/services/media.ts
|
|
4
|
+
var SERVICE = { kind: "service" };
|
|
5
|
+
function isProductRef(r, productId) {
|
|
6
|
+
return r.type === "PRODUCT" && r.id === productId;
|
|
7
|
+
}
|
|
8
|
+
var MediaService = class {
|
|
9
|
+
constructor(ctx) {
|
|
10
|
+
this.ctx = ctx;
|
|
11
|
+
}
|
|
12
|
+
ctx;
|
|
13
|
+
base() {
|
|
14
|
+
return `/media/${this.ctx.tenant}/assets`;
|
|
15
|
+
}
|
|
16
|
+
/** Create an asset. BLOB uploads via multipart; LINK via JSON. */
|
|
17
|
+
async create(input, auth = SERVICE) {
|
|
18
|
+
if (input.kind === "blob") {
|
|
19
|
+
const fd = new FormData();
|
|
20
|
+
fd.set("file", input.file);
|
|
21
|
+
fd.set("body", JSON.stringify(input.body));
|
|
22
|
+
return this.ctx.http.request({
|
|
23
|
+
method: "POST",
|
|
24
|
+
path: this.base(),
|
|
25
|
+
auth,
|
|
26
|
+
body: fd
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return this.ctx.http.request({
|
|
30
|
+
method: "POST",
|
|
31
|
+
path: this.base(),
|
|
32
|
+
auth,
|
|
33
|
+
body: input.body
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/** List assets. Optional `query` is passed through to Emporix verbatim. */
|
|
37
|
+
async list(query, auth = SERVICE) {
|
|
38
|
+
return this.ctx.http.request({
|
|
39
|
+
method: "GET",
|
|
40
|
+
path: this.base(),
|
|
41
|
+
auth,
|
|
42
|
+
...query ? { query } : {}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/** Fetch an asset by id. */
|
|
46
|
+
async get(assetId, auth = SERVICE) {
|
|
47
|
+
return this.ctx.http.request({
|
|
48
|
+
method: "GET",
|
|
49
|
+
path: `${this.base()}/${assetId}`,
|
|
50
|
+
auth
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/** Update an asset (e.g. swap `refIds` or `access`). */
|
|
54
|
+
async update(assetId, patch, auth = SERVICE) {
|
|
55
|
+
return this.ctx.http.request({
|
|
56
|
+
method: "PUT",
|
|
57
|
+
path: `${this.base()}/${assetId}`,
|
|
58
|
+
auth,
|
|
59
|
+
body: patch
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/** Remove an asset. */
|
|
63
|
+
async remove(assetId, auth = SERVICE) {
|
|
64
|
+
await this.ctx.http.request({
|
|
65
|
+
method: "DELETE",
|
|
66
|
+
path: `${this.base()}/${assetId}`,
|
|
67
|
+
auth
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/** Multipart upload sugar: builds `AssetCreateBlob` from input. */
|
|
71
|
+
async uploadFile(input, auth = SERVICE) {
|
|
72
|
+
const body = {
|
|
73
|
+
type: "BLOB",
|
|
74
|
+
access: input.access ?? "PUBLIC",
|
|
75
|
+
...input.productId ? { refIds: [{ type: "PRODUCT", id: input.productId }] } : {},
|
|
76
|
+
...input.filename || input.mimeType ? {
|
|
77
|
+
details: {
|
|
78
|
+
...input.filename ? { filename: input.filename } : {},
|
|
79
|
+
...input.mimeType ? { mimeType: input.mimeType } : {}
|
|
80
|
+
}
|
|
81
|
+
} : {}
|
|
82
|
+
};
|
|
83
|
+
return this.create({ kind: "blob", file: input.file, body }, auth);
|
|
84
|
+
}
|
|
85
|
+
/** External-URL sugar: builds `AssetCreateLink`. */
|
|
86
|
+
async link(input, auth = SERVICE) {
|
|
87
|
+
const body = {
|
|
88
|
+
type: "LINK",
|
|
89
|
+
access: input.access ?? "PUBLIC",
|
|
90
|
+
url: input.url,
|
|
91
|
+
...input.productId ? { refIds: [{ type: "PRODUCT", id: input.productId }] } : {}
|
|
92
|
+
};
|
|
93
|
+
return this.create({ kind: "link", body }, auth);
|
|
94
|
+
}
|
|
95
|
+
/** Idempotently add a PRODUCT refId to an asset. */
|
|
96
|
+
async attachToProduct(assetId, productId, auth = SERVICE) {
|
|
97
|
+
const a = await this.get(assetId, auth);
|
|
98
|
+
const refIds = a.refIds ?? [];
|
|
99
|
+
if (refIds.some((r) => isProductRef(r, productId))) return a;
|
|
100
|
+
const next = [...refIds, { type: "PRODUCT", id: productId }];
|
|
101
|
+
const patch = { type: a.type, refIds: next };
|
|
102
|
+
return this.update(assetId, patch, auth);
|
|
103
|
+
}
|
|
104
|
+
/** Remove a PRODUCT refId from an asset (no-op if absent). */
|
|
105
|
+
async detachFromProduct(assetId, productId, auth = SERVICE) {
|
|
106
|
+
const a = await this.get(assetId, auth);
|
|
107
|
+
const refIds = a.refIds ?? [];
|
|
108
|
+
const next = refIds.filter((r) => !isProductRef(r, productId));
|
|
109
|
+
if (next.length === refIds.length) return a;
|
|
110
|
+
const patch = { type: a.type, refIds: next };
|
|
111
|
+
return this.update(assetId, patch, auth);
|
|
112
|
+
}
|
|
113
|
+
/** Convenience: list assets attached to a product (server-side filter). */
|
|
114
|
+
async listForProduct(productId, auth = SERVICE) {
|
|
115
|
+
return this.list({ "refIds.id": productId }, auth);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
var _internalMedia = { isProductRef };
|
|
119
|
+
|
|
120
|
+
exports.MediaService = MediaService;
|
|
121
|
+
exports._internalMedia = _internalMedia;
|
|
122
|
+
//# sourceMappingURL=media.cjs.map
|
|
123
|
+
//# sourceMappingURL=media.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/services/media.ts"],"names":[],"mappings":"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","file":"media.cjs","sourcesContent":["import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n AssetCreateBlob,\n AssetCreateLink,\n AssetUpdateBlob,\n AssetUpdateLink,\n GetAsset,\n RefId,\n} from \"../generated/media\";\n\n/** Generated media types (caller sends the exact wire shape). */\nexport type AssetCreateBlobInput = AssetCreateBlob;\nexport type AssetCreateLinkInput = AssetCreateLink;\nexport type AssetUpdateInput = AssetUpdateBlob | AssetUpdateLink;\nexport type Asset = GetAsset;\nexport type AssetRefId = RefId;\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\nfunction isProductRef(r: AssetRefId, productId: string): boolean {\n return r.type === \"PRODUCT\" && r.id === productId;\n}\n\n/**\n * Media assets (BLOB/LINK). All endpoints require a backend-only scope\n * (`media.asset_manage` / `media.asset_read`) — default auth: service.\n */\nexport class MediaService {\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/media/${this.ctx.tenant}/assets`;\n }\n\n /** Create an asset. BLOB uploads via multipart; LINK via JSON. */\n async create(\n input:\n | { kind: \"blob\"; file: Blob; body: AssetCreateBlobInput }\n | { kind: \"link\"; body: AssetCreateLinkInput },\n auth: AuthContext = SERVICE,\n ): Promise<{ id: string }> {\n if (input.kind === \"blob\") {\n const fd = new FormData();\n fd.set(\"file\", input.file);\n fd.set(\"body\", JSON.stringify(input.body));\n return this.ctx.http.request<{ id: string }>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: fd,\n });\n }\n return this.ctx.http.request<{ id: string }>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input.body,\n });\n }\n\n /** List assets. Optional `query` is passed through to Emporix verbatim. */\n async list(\n query?: Record<string, string | number | undefined>,\n auth: AuthContext = SERVICE,\n ): Promise<Asset[]> {\n return this.ctx.http.request<Asset[]>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(query ? { query } : {}),\n });\n }\n\n /** Fetch an asset by id. */\n async get(assetId: string, auth: AuthContext = SERVICE): Promise<Asset> {\n return this.ctx.http.request<Asset>({\n method: \"GET\",\n path: `${this.base()}/${assetId}`,\n auth,\n });\n }\n\n /** Update an asset (e.g. swap `refIds` or `access`). */\n async update(\n assetId: string,\n patch: AssetUpdateInput,\n auth: AuthContext = SERVICE,\n ): Promise<Asset> {\n return this.ctx.http.request<Asset>({\n method: \"PUT\",\n path: `${this.base()}/${assetId}`,\n auth,\n body: patch,\n });\n }\n\n /** Remove an asset. */\n async remove(assetId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${assetId}`,\n auth,\n });\n }\n\n /** Multipart upload sugar: builds `AssetCreateBlob` from input. */\n async uploadFile(\n input: {\n file: Blob;\n productId?: string;\n filename?: string;\n mimeType?: string;\n access?: \"PUBLIC\" | \"PRIVATE\";\n },\n auth: AuthContext = SERVICE,\n ): Promise<{ id: string }> {\n const body: AssetCreateBlobInput = {\n type: \"BLOB\",\n access: input.access ?? \"PUBLIC\",\n ...(input.productId\n ? { refIds: [{ type: \"PRODUCT\", id: input.productId }] }\n : {}),\n ...(input.filename || input.mimeType\n ? {\n details: {\n ...(input.filename ? { filename: input.filename } : {}),\n ...(input.mimeType ? { mimeType: input.mimeType } : {}),\n },\n }\n : {}),\n };\n return this.create({ kind: \"blob\", file: input.file, body }, auth);\n }\n\n /** External-URL sugar: builds `AssetCreateLink`. */\n async link(\n input: { url: string; productId?: string; access?: \"PUBLIC\" | \"PRIVATE\" },\n auth: AuthContext = SERVICE,\n ): Promise<{ id: string }> {\n const body: AssetCreateLinkInput = {\n type: \"LINK\",\n access: input.access ?? \"PUBLIC\",\n url: input.url,\n ...(input.productId\n ? { refIds: [{ type: \"PRODUCT\", id: input.productId }] }\n : {}),\n };\n return this.create({ kind: \"link\", body }, auth);\n }\n\n /** Idempotently add a PRODUCT refId to an asset. */\n async attachToProduct(\n assetId: string,\n productId: string,\n auth: AuthContext = SERVICE,\n ): Promise<Asset> {\n const a = await this.get(assetId, auth);\n const refIds: AssetRefId[] = a.refIds ?? [];\n if (refIds.some((r) => isProductRef(r, productId))) return a;\n const next: AssetRefId[] = [...refIds, { type: \"PRODUCT\", id: productId }];\n // Preserve the asset's type discriminator so the update body satisfies\n // the AssetUpdateBlob | AssetUpdateLink union.\n const patch = { type: a.type, refIds: next } as unknown as AssetUpdateInput;\n return this.update(assetId, patch, auth);\n }\n\n /** Remove a PRODUCT refId from an asset (no-op if absent). */\n async detachFromProduct(\n assetId: string,\n productId: string,\n auth: AuthContext = SERVICE,\n ): Promise<Asset> {\n const a = await this.get(assetId, auth);\n const refIds: AssetRefId[] = a.refIds ?? [];\n const next = refIds.filter((r) => !isProductRef(r, productId));\n if (next.length === refIds.length) return a;\n const patch = { type: a.type, refIds: next } as unknown as AssetUpdateInput;\n return this.update(assetId, patch, auth);\n }\n\n /** Convenience: list assets attached to a product (server-side filter). */\n async listForProduct(productId: string, auth: AuthContext = SERVICE): Promise<Asset[]> {\n return this.list({ \"refIds.id\": productId }, auth);\n }\n}\n\n// Re-export so consumers can `import { isProductRef } from \"@viu/emporix-sdk/media\"`?\n// Internal helper — kept module-private; convenience methods in Task 4 use it.\nexport const _internalMedia = { isProductRef };\n"]}
|