bitsnap-react 1.21.1 → 1.22.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.
Files changed (125) hide show
  1. package/dist/BitsnapCart-AINUJQVF.mjs +2 -0
  2. package/dist/BitsnapCart-GP2UJSG4.js +2 -0
  3. package/dist/BitsnapCart-GP2UJSG4.js.map +1 -0
  4. package/dist/CartProvider-HTKGBPVA.js +2 -0
  5. package/dist/CartProvider-HTKGBPVA.js.map +1 -0
  6. package/dist/CartProvider-YUV2Q523.mjs +2 -0
  7. package/dist/PanelModelFiles-EKQRLF46.js.map +1 -1
  8. package/dist/analytics.js +1 -1
  9. package/dist/analytics.js.map +1 -1
  10. package/dist/analytics.mjs +1 -1
  11. package/dist/catalog.js +1 -1
  12. package/dist/catalog.js.map +1 -1
  13. package/dist/catalog.mjs +1 -1
  14. package/dist/chat.d.mts +2 -2
  15. package/dist/chat.d.ts +2 -2
  16. package/dist/chat.js +1 -1
  17. package/dist/chat.js.map +1 -1
  18. package/dist/chat.mjs +1 -1
  19. package/dist/chat.mjs.map +1 -1
  20. package/dist/{chunk-OCJ7YWFX.js → chunk-35ZQU353.js} +2 -2
  21. package/dist/chunk-35ZQU353.js.map +1 -0
  22. package/dist/chunk-3TUL63IC.js.map +1 -1
  23. package/dist/chunk-4JR74NXR.js +2 -0
  24. package/dist/chunk-4JR74NXR.js.map +1 -0
  25. package/dist/{chunk-QWQPAN4F.mjs → chunk-5MXBUGY3.mjs} +2 -2
  26. package/dist/chunk-6Q3VGPSF.js.map +1 -1
  27. package/dist/chunk-7IP3JWZ3.mjs +2 -0
  28. package/dist/chunk-7IP3JWZ3.mjs.map +1 -0
  29. package/dist/{chunk-EXC5Z5VM.mjs → chunk-C2AJ5B32.mjs} +2 -2
  30. package/dist/{chunk-7WTQGXPQ.mjs → chunk-IVB3E4V3.mjs} +2 -2
  31. package/dist/{chunk-6DEKVABT.js → chunk-JS3KK56H.js} +2 -2
  32. package/dist/chunk-JS3KK56H.js.map +1 -0
  33. package/dist/chunk-JSDGZ4NY.js.map +1 -1
  34. package/dist/{chunk-MMQTRSI5.js → chunk-KFY6IOAA.js} +2 -2
  35. package/dist/chunk-KFY6IOAA.js.map +1 -0
  36. package/dist/chunk-KOYBZORL.js.map +1 -1
  37. package/dist/{chunk-J4GUVJP4.js → chunk-MBSXTB6G.js} +2 -2
  38. package/dist/chunk-MBSXTB6G.js.map +1 -0
  39. package/dist/chunk-MDAFPGPA.js.map +1 -1
  40. package/dist/{chunk-2HINORSP.mjs → chunk-NCCP2UDM.mjs} +2 -2
  41. package/dist/chunk-PFKZ7KUU.js +2 -0
  42. package/dist/chunk-PFKZ7KUU.js.map +1 -0
  43. package/dist/chunk-Q337IQNA.js.map +1 -1
  44. package/dist/{chunk-QXCL5CE6.mjs → chunk-QCIETNFZ.mjs} +2 -2
  45. package/dist/{chunk-56X4DBMQ.mjs → chunk-QJBQ45R6.mjs} +2 -2
  46. package/dist/{chunk-FG7NLLJV.mjs → chunk-QJOMFK4X.mjs} +2 -2
  47. package/dist/{chunk-J6WKSO33.mjs → chunk-QQSCVPOG.mjs} +2 -2
  48. package/dist/{chunk-J6WKSO33.mjs.map → chunk-QQSCVPOG.mjs.map} +1 -1
  49. package/dist/{chunk-EK3D44XW.js → chunk-SAKZOHU7.js} +2 -2
  50. package/dist/chunk-SAKZOHU7.js.map +1 -0
  51. package/dist/{chunk-TWZQ4CBY.js → chunk-SZNTXRFD.js} +3 -3
  52. package/dist/chunk-SZNTXRFD.js.map +1 -0
  53. package/dist/chunk-TVZLDLAV.mjs +2 -0
  54. package/dist/chunk-TVZLDLAV.mjs.map +1 -0
  55. package/dist/chunk-U37ZH4YJ.js +2 -0
  56. package/dist/chunk-U37ZH4YJ.js.map +1 -0
  57. package/dist/chunk-W3RGQYPD.js.map +1 -1
  58. package/dist/{chunk-J6YI6FJN.js → chunk-WYRECFVW.js} +2 -2
  59. package/dist/chunk-WYRECFVW.js.map +1 -0
  60. package/dist/chunk-Z3YOJ6NZ.js.map +1 -1
  61. package/dist/{chunk-YV3UGLQ3.mjs → chunk-ZFUE3AX5.mjs} +2 -2
  62. package/dist/{chunk-FPCMLZFM.js → chunk-ZFZR3CI5.js} +2 -2
  63. package/dist/chunk-ZFZR3CI5.js.map +1 -0
  64. package/dist/consent.js.map +1 -1
  65. package/dist/course.js +1 -1
  66. package/dist/course.js.map +1 -1
  67. package/dist/course.mjs +1 -1
  68. package/dist/embed/analytics.js +1 -1
  69. package/dist/errors.js.map +1 -1
  70. package/dist/index.css +1 -1
  71. package/dist/index.css.map +1 -1
  72. package/dist/index.d.mts +2 -2
  73. package/dist/index.d.ts +2 -2
  74. package/dist/index.js +1 -1
  75. package/dist/index.js.map +1 -1
  76. package/dist/index.mjs +1 -1
  77. package/dist/index.mjs.map +1 -1
  78. package/dist/internal.js.map +1 -1
  79. package/dist/methods-4Q37ITIM.js +2 -0
  80. package/dist/methods-4Q37ITIM.js.map +1 -0
  81. package/dist/methods-JLVRTNPE.mjs +2 -0
  82. package/dist/model-files-client-P4PORZJ6.js.map +1 -1
  83. package/dist/models.js.map +1 -1
  84. package/dist/returns.js +1 -1
  85. package/dist/returns.js.map +1 -1
  86. package/dist/returns.mjs +1 -1
  87. package/dist/viewer3d.js.map +1 -1
  88. package/dist/viewer3d.mjs +1 -1
  89. package/dist/{widgets-DmHlIbp8.d.mts → widgets-CAQRHzT7.d.mts} +41 -1
  90. package/dist/{widgets-BL6pCMdc.d.ts → widgets-DS_Pk7Br.d.ts} +41 -1
  91. package/package.json +2 -2
  92. package/dist/BitsnapCart-3RSI3PIM.mjs +0 -2
  93. package/dist/BitsnapCart-4DKJ7OXL.js +0 -2
  94. package/dist/BitsnapCart-4DKJ7OXL.js.map +0 -1
  95. package/dist/CartProvider-TXRCAXOT.mjs +0 -2
  96. package/dist/CartProvider-ZAGTSCHJ.js +0 -2
  97. package/dist/CartProvider-ZAGTSCHJ.js.map +0 -1
  98. package/dist/chunk-6DEKVABT.js.map +0 -1
  99. package/dist/chunk-EK3D44XW.js.map +0 -1
  100. package/dist/chunk-FPCMLZFM.js.map +0 -1
  101. package/dist/chunk-J4GUVJP4.js.map +0 -1
  102. package/dist/chunk-J6YI6FJN.js.map +0 -1
  103. package/dist/chunk-K2HIALKR.js +0 -2
  104. package/dist/chunk-K2HIALKR.js.map +0 -1
  105. package/dist/chunk-MMQTRSI5.js.map +0 -1
  106. package/dist/chunk-NW5PFIZB.js +0 -2
  107. package/dist/chunk-NW5PFIZB.js.map +0 -1
  108. package/dist/chunk-OCJ7YWFX.js.map +0 -1
  109. package/dist/chunk-TWZQ4CBY.js.map +0 -1
  110. package/dist/chunk-VU2MX5HY.mjs +0 -2
  111. package/dist/chunk-VU2MX5HY.mjs.map +0 -1
  112. package/dist/methods-27HZQY5L.js +0 -2
  113. package/dist/methods-27HZQY5L.js.map +0 -1
  114. package/dist/methods-27JU6IH7.mjs +0 -2
  115. /package/dist/{BitsnapCart-3RSI3PIM.mjs.map → BitsnapCart-AINUJQVF.mjs.map} +0 -0
  116. /package/dist/{CartProvider-TXRCAXOT.mjs.map → CartProvider-YUV2Q523.mjs.map} +0 -0
  117. /package/dist/{chunk-QWQPAN4F.mjs.map → chunk-5MXBUGY3.mjs.map} +0 -0
  118. /package/dist/{chunk-EXC5Z5VM.mjs.map → chunk-C2AJ5B32.mjs.map} +0 -0
  119. /package/dist/{chunk-7WTQGXPQ.mjs.map → chunk-IVB3E4V3.mjs.map} +0 -0
  120. /package/dist/{chunk-2HINORSP.mjs.map → chunk-NCCP2UDM.mjs.map} +0 -0
  121. /package/dist/{chunk-QXCL5CE6.mjs.map → chunk-QCIETNFZ.mjs.map} +0 -0
  122. /package/dist/{chunk-56X4DBMQ.mjs.map → chunk-QJBQ45R6.mjs.map} +0 -0
  123. /package/dist/{chunk-FG7NLLJV.mjs.map → chunk-QJOMFK4X.mjs.map} +0 -0
  124. /package/dist/{chunk-YV3UGLQ3.mjs.map → chunk-ZFUE3AX5.mjs.map} +0 -0
  125. /package/dist/{methods-27JU6IH7.mjs.map → methods-JLVRTNPE.mjs.map} +0 -0
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunk6DEKVABTjs = require('./chunk-6DEKVABT.js');var _chunkEK3D44XWjs = require('./chunk-EK3D44XW.js');var f=24,h=48,i=class extends Error{constructor(r,o){super(r),this.name="ProductListError",this.status=o}};function D(t){return t==null||!Number.isFinite(t)?f:Math.min(h,Math.max(1,Math.floor(t)))}function j(t,r){return Math.max(1,Math.ceil(t/r))}function s(t){return t.replace(/\/+$/,"")}function P(t){let r=new URLSearchParams;r.set("limit",String(t.limit)),r.set("offset",String(t.offset)),t.locale&&r.set("locale",t.locale);let o=_optionalChain([t, 'access', _ => _.search, 'optionalAccess', _2 => _2.trim, 'call', _3 => _3()]);return o&&r.set("search",o),`${s(t.host)}/api/integrations/${encodeURIComponent(t.projectID)}/public-commerce/product-list?${r.toString()}`}function I(t){return typeof t=="object"&&t!=null&&Array.isArray(t.items)&&typeof t.totalCount=="number"}async function x(t,r){let o=await fetch(_chunk6DEKVABTjs.c.call(void 0, P(t)),{method:"GET",credentials:"omit",headers:{Accept:"application/json"},signal:r});if(!o.ok)throw new i(`Could not load products (${o.status})`,o.status);let e=await o.json();if(!I(e))throw new i("Unexpected product list response");return e}function m(t,r){if(t.projectID!=null&&t.projectID!==r.projectID)return{ok:!1,reason:`the page cart already belongs to project "${t.projectID}"`};let o=null,e=r.host?s(r.host):"",a=s(t.host);if(e&&e!==a){if(a!==s(t.defaultHost))return{ok:!1,reason:`the page cart already uses the host "${t.host}"`};o=e}return{ok:!0,setProjectID:t.projectID==null?r.projectID:null,setHost:o}}function g(t,r){let o=r.cartItemId!=null&&r.cartItemId!==r.id?r.cartItemId:null;t.track("add_to_cart",{qty:1,value_minor:r.price,currency:r.currency},{product_id:r.id,variant_id:o})}async function E(t,r){let[{Bitsnap:o},{getProjectID:e,setProjectID:a}]=await Promise.all([Promise.resolve().then(() => _interopRequireWildcard(require("./methods-27HZQY5L.js"))),Promise.resolve().then(() => _interopRequireWildcard(require("./CartProvider-ZAGTSCHJ.js")))]),n=m({projectID:e(),host:_chunk6DEKVABTjs.e,defaultHost:_chunk6DEKVABTjs.d},r);if(!n.ok)return b(n.reason);if(n.setProjectID!=null&&a(n.setProjectID),n.setHost!=null&&_chunk6DEKVABTjs.f.call(void 0, n.setHost),await o.addProductToCart(_nullishCoalesce(t.cartItemId, () => (t.id)),1,void 0,{url:r.url,name:t.name,price:t.price,currency:t.currency,amount:t.amount,analytics:_chunkEK3D44XWjs.k})!=null)throw new Error("Could not add the product to the cart");r.analytics!=null&&g(r.analytics,t),r.showCart&&o.showCart()}function b(t){throw console.warn(`bitsnap-react: ProductList did not add to the cart because ${t}. Pass onAddToCart to use another cart.`),new Error("The page cart belongs to another project or host")}exports.a = D; exports.b = j; exports.c = x; exports.d = g; exports.e = E;
2
- //# sourceMappingURL=chunk-OCJ7YWFX.js.map
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkJS3KK56Hjs = require('./chunk-JS3KK56H.js');var _chunkSAKZOHU7js = require('./chunk-SAKZOHU7.js');var f=24,h=48,i=class extends Error{constructor(r,o){super(r),this.name="ProductListError",this.status=o}};function D(t){return t==null||!Number.isFinite(t)?f:Math.min(h,Math.max(1,Math.floor(t)))}function j(t,r){return Math.max(1,Math.ceil(t/r))}function s(t){return t.replace(/\/+$/,"")}function P(t){let r=new URLSearchParams;r.set("limit",String(t.limit)),r.set("offset",String(t.offset)),t.locale&&r.set("locale",t.locale);let o=_optionalChain([t, 'access', _ => _.search, 'optionalAccess', _2 => _2.trim, 'call', _3 => _3()]);return o&&r.set("search",o),`${s(t.host)}/api/integrations/${encodeURIComponent(t.projectID)}/public-commerce/product-list?${r.toString()}`}function I(t){return typeof t=="object"&&t!=null&&Array.isArray(t.items)&&typeof t.totalCount=="number"}async function x(t,r){let o=await fetch(_chunkJS3KK56Hjs.c.call(void 0, P(t)),{method:"GET",credentials:"omit",headers:{Accept:"application/json"},signal:r});if(!o.ok)throw new i(`Could not load products (${o.status})`,o.status);let e=await o.json();if(!I(e))throw new i("Unexpected product list response");return e}function m(t,r){if(t.projectID!=null&&t.projectID!==r.projectID)return{ok:!1,reason:`the page cart already belongs to project "${t.projectID}"`};let o=null,e=r.host?s(r.host):"",a=s(t.host);if(e&&e!==a){if(a!==s(t.defaultHost))return{ok:!1,reason:`the page cart already uses the host "${t.host}"`};o=e}return{ok:!0,setProjectID:t.projectID==null?r.projectID:null,setHost:o}}function g(t,r){let o=r.cartItemId!=null&&r.cartItemId!==r.id?r.cartItemId:null;t.track("add_to_cart",{qty:1,value_minor:r.price,currency:r.currency},{product_id:r.id,variant_id:o})}async function E(t,r){let[{Bitsnap:o},{getProjectID:e,setProjectID:a}]=await Promise.all([Promise.resolve().then(() => _interopRequireWildcard(require("./methods-4Q37ITIM.js"))),Promise.resolve().then(() => _interopRequireWildcard(require("./CartProvider-HTKGBPVA.js")))]),n=m({projectID:e(),host:_chunkJS3KK56Hjs.e,defaultHost:_chunkJS3KK56Hjs.d},r);if(!n.ok)return b(n.reason);if(n.setProjectID!=null&&a(n.setProjectID),n.setHost!=null&&_chunkJS3KK56Hjs.f.call(void 0, n.setHost),await o.addProductToCart(_nullishCoalesce(t.cartItemId, () => (t.id)),1,void 0,{url:r.url,name:t.name,price:t.price,currency:t.currency,amount:t.amount,analytics:_chunkSAKZOHU7js.k})!=null)throw new Error("Could not add the product to the cart");r.analytics!=null&&g(r.analytics,t),r.showCart&&o.showCart()}function b(t){throw console.warn(`bitsnap-react: ProductList did not add to the cart because ${t}. Pass onAddToCart to use another cart.`),new Error("The page cart belongs to another project or host")}exports.a = D; exports.b = j; exports.c = x; exports.d = g; exports.e = E;
2
+ //# sourceMappingURL=chunk-35ZQU353.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/emems/.t3/worktrees/bitsnap-react/emems-chat-payment-requests/dist/chunk-35ZQU353.js","../src/components/products/fetch.ts"],"names":["DEFAULT_PAGE_SIZE","MAX_PAGE_SIZE","ProductListError","message","status","clampPageSize","pageSize","pageCountFor","totalCount","normalizeHost","host","buildProductListURL","query","params","search"],"mappings":"AAAA,y/BAAuD,sDAAwC,ICMlFA,CAAAA,CAAoB,EAAA,CACpBC,CAAAA,CAAgB,EAAA,CAYhBC,CAAAA,CAAN,MAAA,QAA+B,KAAM,CACjC,WAET,CAAYC,CAAAA,CAAiBC,CAAAA,CAAiB,CAC5C,KAAA,CAAMD,CAAO,CAAA,CACb,IAAA,CAAK,IAAA,CAAO,kBAAA,CACZ,IAAA,CAAK,MAAA,CAASC,CAChB,CACF,CAAA,CAGO,SAASC,CAAAA,CAAcC,CAAAA,CAA2B,CACvD,OAAIA,CAAAA,EAAY,IAAA,EAAQ,CAAC,MAAA,CAAO,QAAA,CAASA,CAAQ,CAAA,CACxCN,CAAAA,CAEF,IAAA,CAAK,GAAA,CAAIC,CAAAA,CAAe,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,IAAA,CAAK,KAAA,CAAMK,CAAQ,CAAC,CAAC,CAClE,CAEO,SAASC,CAAAA,CAAaC,CAAAA,CAAoBF,CAAAA,CAA0B,CACzE,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,IAAA,CAAK,IAAA,CAAKE,CAAAA,CAAaF,CAAQ,CAAC,CACrD,CAGO,SAASG,CAAAA,CAAcC,CAAAA,CAAsB,CAClD,OAAOA,CAAAA,CAAK,OAAA,CAAQ,MAAA,CAAQ,EAAE,CAChC,CAEO,SAASC,CAAAA,CAAoBC,CAAAA,CAAiC,CACnE,IAAMC,CAAAA,CAAS,IAAI,eAAA,CACnBA,CAAAA,CAAO,GAAA,CAAI,OAAA,CAAS,MAAA,CAAOD,CAAAA,CAAM,KAAK,CAAC,CAAA,CACvCC,CAAAA,CAAO,GAAA,CAAI,QAAA,CAAU,MAAA,CAAOD,CAAAA,CAAM,MAAM,CAAC,CAAA,CACrCA,CAAAA,CAAM,MAAA,EACRC,CAAAA,CAAO,GAAA,CAAI,QAAA,CAAUD,CAAAA,CAAM,MAAM,CAAA,CAEnC,IAAME,CAAAA,iBAASF,CAAAA,mBAAM,MAAA,6BAAQ,IAAA,mBAAK,GAAA,CAClC,OAAIE,CAAAA,EACFD,CAAAA,CAAO,GAAA,CAAI,QAAA,CAAUC,CAAM,CAAA,CAItB,CAAA,EAAA","file":"/home/emems/.t3/worktrees/bitsnap-react/emems-chat-payment-requests/dist/chunk-35ZQU353.js","sourcesContent":[null,"import { withClientParam } from \"@/src/lib/client-header\";\nimport type { BitsnapModels } from \"@/src/models\";\n\nexport type PublicListProduct = BitsnapModels.PublicListProduct;\nexport type ProductListData = BitsnapModels.ProductListResponse;\n\nexport const DEFAULT_PAGE_SIZE = 24;\nexport const MAX_PAGE_SIZE = 48;\n\nexport type ProductListQuery = {\n projectID: string;\n /** Origin of the Bitsnap backend (or of a custom domain), without a path. */\n host: string;\n locale?: string;\n search?: string;\n limit: number;\n offset: number;\n};\n\nexport class ProductListError extends Error {\n readonly status: number | undefined;\n\n constructor(message: string, status?: number) {\n super(message);\n this.name = \"ProductListError\";\n this.status = status;\n }\n}\n\n/** Page size within what the backend accepts (1 to 48, default 24). */\nexport function clampPageSize(pageSize?: number): number {\n if (pageSize == null || !Number.isFinite(pageSize)) {\n return DEFAULT_PAGE_SIZE;\n }\n return Math.min(MAX_PAGE_SIZE, Math.max(1, Math.floor(pageSize)));\n}\n\nexport function pageCountFor(totalCount: number, pageSize: number): number {\n return Math.max(1, Math.ceil(totalCount / pageSize));\n}\n\n/** Origin without trailing slashes, so equal hosts compare equal as strings. */\nexport function normalizeHost(host: string): string {\n return host.replace(/\\/+$/, \"\");\n}\n\nexport function buildProductListURL(query: ProductListQuery): string {\n const params = new URLSearchParams();\n params.set(\"limit\", String(query.limit));\n params.set(\"offset\", String(query.offset));\n if (query.locale) {\n params.set(\"locale\", query.locale);\n }\n const search = query.search?.trim();\n if (search) {\n params.set(\"search\", search);\n }\n\n const host = normalizeHost(query.host);\n return `${host}/api/integrations/${encodeURIComponent(\n query.projectID,\n )}/public-commerce/product-list?${params.toString()}`;\n}\n\nfunction isProductListData(value: unknown): value is ProductListData {\n return (\n typeof value === \"object\" &&\n value != null &&\n Array.isArray((value as ProductListData).items) &&\n typeof (value as ProductListData).totalCount === \"number\"\n );\n}\n\n/**\n * Loads one page of the catalog with a plain, credential-less `fetch`. It does\n * not touch the global project ID or host.\n */\nexport async function fetchProductList(\n query: ProductListQuery,\n signal?: AbortSignal,\n): Promise<ProductListData> {\n const response = await fetch(withClientParam(buildProductListURL(query)), {\n method: \"GET\",\n credentials: \"omit\",\n headers: { Accept: \"application/json\" },\n signal,\n });\n\n if (!response.ok) {\n throw new ProductListError(\n `Could not load products (${response.status})`,\n response.status,\n );\n }\n\n const payload: unknown = await response.json();\n if (!isProductListData(payload)) {\n throw new ProductListError(\"Unexpected product list response\");\n }\n\n return payload;\n}\n"]}