the-foxy-library 1.0.13 → 1.0.14

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 (207) hide show
  1. package/dist/cjs/{app-globals-C6OZa8WS.js → app-globals-MPl5n0hu.js} +4 -3
  2. package/dist/cjs/app-globals-MPl5n0hu.js.map +1 -0
  3. package/dist/cjs/{factory-C4yF_u3m.js → factory-CrhcL_74.js} +5 -5
  4. package/dist/cjs/factory-CrhcL_74.js.map +1 -0
  5. package/dist/cjs/{index-BLYkKpmH.js → index-CDQIUkok.js} +189 -11
  6. package/dist/cjs/index-CDQIUkok.js.map +1 -0
  7. package/dist/cjs/intravenous.cjs.js +2 -2
  8. package/dist/cjs/ion-icon_12.cjs.entry.js +2 -2
  9. package/dist/cjs/iv-banner.cjs.entry.js +1 -1
  10. package/dist/cjs/iv-card_3.cjs.entry.js +2 -2
  11. package/dist/cjs/iv-carousel.cjs.entry.js +1 -1
  12. package/dist/cjs/iv-compare-product.cjs.entry.js +1 -1
  13. package/dist/cjs/iv-dynamic-products-carousel.cjs.entry.js +4 -4
  14. package/dist/cjs/iv-dynamic-products-carousel.entry.cjs.js.map +1 -1
  15. package/dist/cjs/iv-dynamic-products.cjs.entry.js +4 -4
  16. package/dist/cjs/iv-dynamic-products.entry.cjs.js.map +1 -1
  17. package/dist/cjs/iv-filters.cjs.entry.js +1 -1
  18. package/dist/cjs/iv-predictive-search.cjs.entry.js +1 -1
  19. package/dist/cjs/iv-product-pin.cjs.entry.js +1 -1
  20. package/dist/cjs/iv-product-upsell.cjs.entry.js +1 -1
  21. package/dist/cjs/iv-recently-viewed.cjs.entry.js +2 -2
  22. package/dist/cjs/iv-shop-the-look.cjs.entry.js +1 -1
  23. package/dist/cjs/iv-suggest.cjs.entry.js +1 -1
  24. package/dist/cjs/iv-tabs.cjs.entry.js +1 -1
  25. package/dist/cjs/iv-toast-container.cjs.entry.js +1 -1
  26. package/dist/cjs/iv-toast.cjs.entry.js +1 -1
  27. package/dist/cjs/iv-wishlist.cjs.entry.js +1 -1
  28. package/dist/cjs/loader.cjs.js +2 -2
  29. package/dist/cjs/{productCache-tzQQpgt2.js → productCache-DAt5ukE_.js} +2 -136
  30. package/dist/cjs/productCache-DAt5ukE_.js.map +1 -0
  31. package/dist/cjs/sw-in-grid-content.cjs.entry.js +1 -1
  32. package/dist/cjs/sw-size-guide.cjs.entry.js +1 -1
  33. package/dist/collection/global/app.js +2 -1
  34. package/dist/collection/global/app.js.map +1 -1
  35. package/dist/collection/utils/config/factory.js +38 -19
  36. package/dist/collection/utils/config/factory.js.map +1 -1
  37. package/dist/collection/utils/store/store.js.map +1 -1
  38. package/dist/collection/utils/storefront_api/factory.js +2 -2
  39. package/dist/collection/utils/storefront_api/factory.js.map +1 -1
  40. package/dist/components/index.js +3 -2
  41. package/dist/components/index.js.map +1 -1
  42. package/dist/components/ion-icon.js +1 -1
  43. package/dist/components/iv-accordion.js +2 -2
  44. package/dist/components/iv-banner.js +1 -1
  45. package/dist/components/iv-button.js +1 -1
  46. package/dist/components/iv-card.js +1 -1
  47. package/dist/components/iv-carousel.js +1 -1
  48. package/dist/components/iv-compare-product.js +1 -1
  49. package/dist/components/iv-dynamic-products-carousel.js +7 -7
  50. package/dist/components/iv-dynamic-products.js +8 -8
  51. package/dist/components/iv-event-button.js +1 -1
  52. package/dist/components/iv-filters.js +1 -1
  53. package/dist/components/iv-footer.js +1 -1
  54. package/dist/components/iv-layout.js +1 -1
  55. package/dist/components/iv-link-list.js +2 -2
  56. package/dist/components/iv-link.js +1 -1
  57. package/dist/components/iv-modal.js +3 -3
  58. package/dist/components/iv-newsletter.js +2 -2
  59. package/dist/components/iv-predictive-search.js +5 -5
  60. package/dist/components/iv-product-pin.js +1 -1
  61. package/dist/components/iv-product-upsell.js +1 -1
  62. package/dist/components/iv-recently-viewed.js +6 -6
  63. package/dist/components/iv-shop-the-look.js +2 -2
  64. package/dist/components/iv-sidebar.js +3 -3
  65. package/dist/components/iv-spinner.js +1 -1
  66. package/dist/components/iv-suggest.js +6 -6
  67. package/dist/components/iv-tabs.js +1 -1
  68. package/dist/components/iv-toast-container.js +2 -2
  69. package/dist/components/iv-toast.js +1 -1
  70. package/dist/components/iv-two-col-media.js +1 -1
  71. package/dist/components/iv-wishlist-view.js +1 -1
  72. package/dist/components/iv-wishlist.js +2 -2
  73. package/dist/components/{p-CBJOTE3D.js → p-B5w_P7b4.js} +6 -6
  74. package/dist/components/{p-CBJOTE3D.js.map → p-B5w_P7b4.js.map} +1 -1
  75. package/dist/components/{p-DJ-np6Lt.js → p-BO-kjHMg.js} +5 -5
  76. package/dist/components/{p-DJ-np6Lt.js.map → p-BO-kjHMg.js.map} +1 -1
  77. package/dist/components/{p-BXV50Hqo.js → p-BOKziYxu.js} +5 -5
  78. package/dist/components/p-BOKziYxu.js.map +1 -0
  79. package/dist/components/{p-DUAqMOrr.js → p-BmXOzntB.js} +3 -3
  80. package/dist/components/{p-DUAqMOrr.js.map → p-BmXOzntB.js.map} +1 -1
  81. package/dist/components/{p-CacGtt5_.js → p-CIpHIQGS.js} +3 -3
  82. package/dist/components/{p-CacGtt5_.js.map → p-CIpHIQGS.js.map} +1 -1
  83. package/dist/components/{p-COlU6VmF.js → p-CJDWXoPC.js} +3 -3
  84. package/dist/components/{p-COlU6VmF.js.map → p-CJDWXoPC.js.map} +1 -1
  85. package/dist/components/{p-B1VVyZxw.js → p-CL_8xnlV.js} +3 -3
  86. package/dist/components/{p-B1VVyZxw.js.map → p-CL_8xnlV.js.map} +1 -1
  87. package/dist/components/{p-CCCziqh4.js → p-ChzZA9_Q.js} +3 -3
  88. package/dist/components/{p-CCCziqh4.js.map → p-ChzZA9_Q.js.map} +1 -1
  89. package/dist/components/{p-B2AtAV9P.js → p-CvS5LD0r.js} +3 -3
  90. package/dist/components/{p-B2AtAV9P.js.map → p-CvS5LD0r.js.map} +1 -1
  91. package/dist/components/{p-DEyPXy6v.js → p-Cx7D8zH9.js} +3 -116
  92. package/dist/components/p-Cx7D8zH9.js.map +1 -0
  93. package/dist/components/{p-B6an0_sP.js → p-CyTo7nDL.js} +3 -3
  94. package/dist/components/{p-B6an0_sP.js.map → p-CyTo7nDL.js.map} +1 -1
  95. package/dist/components/{p-DM5KWm2Y.js → p-D47WTEtv.js} +168 -12
  96. package/dist/components/p-D47WTEtv.js.map +1 -0
  97. package/dist/components/{p-C8RhX3zz.js → p-DN5YTq-K.js} +3 -3
  98. package/dist/components/{p-C8RhX3zz.js.map → p-DN5YTq-K.js.map} +1 -1
  99. package/dist/components/{p-BqsPNuWP.js → p-Dnzh9QyQ.js} +3 -3
  100. package/dist/components/{p-BqsPNuWP.js.map → p-Dnzh9QyQ.js.map} +1 -1
  101. package/dist/components/sw-in-grid-content.js +1 -1
  102. package/dist/components/sw-size-guide.js +1 -1
  103. package/dist/esm/{app-globals-BsRaq-kz.js → app-globals-B9on9Ml0.js} +4 -3
  104. package/dist/esm/app-globals-B9on9Ml0.js.map +1 -0
  105. package/dist/esm/{factory-BaAt_Bic.js → factory-9v-13NdO.js} +5 -5
  106. package/dist/esm/factory-9v-13NdO.js.map +1 -0
  107. package/dist/esm/{index-B8oaG8GL.js → index-unzQs7uG.js} +188 -12
  108. package/dist/esm/index-unzQs7uG.js.map +1 -0
  109. package/dist/esm/intravenous.js +3 -3
  110. package/dist/esm/ion-icon_12.entry.js +2 -2
  111. package/dist/esm/iv-banner.entry.js +1 -1
  112. package/dist/esm/iv-card_3.entry.js +2 -2
  113. package/dist/esm/iv-carousel.entry.js +1 -1
  114. package/dist/esm/iv-compare-product.entry.js +1 -1
  115. package/dist/esm/iv-dynamic-products-carousel.entry.js +3 -3
  116. package/dist/esm/iv-dynamic-products.entry.js +3 -3
  117. package/dist/esm/iv-filters.entry.js +1 -1
  118. package/dist/esm/iv-predictive-search.entry.js +1 -1
  119. package/dist/esm/iv-product-pin.entry.js +1 -1
  120. package/dist/esm/iv-product-upsell.entry.js +1 -1
  121. package/dist/esm/iv-recently-viewed.entry.js +2 -2
  122. package/dist/esm/iv-shop-the-look.entry.js +1 -1
  123. package/dist/esm/iv-suggest.entry.js +1 -1
  124. package/dist/esm/iv-tabs.entry.js +1 -1
  125. package/dist/esm/iv-toast-container.entry.js +1 -1
  126. package/dist/esm/iv-toast.entry.js +1 -1
  127. package/dist/esm/iv-wishlist.entry.js +1 -1
  128. package/dist/esm/loader.js +3 -3
  129. package/dist/esm/{productCache-Cas6qE1D.js → productCache-C9YXddZh.js} +3 -136
  130. package/dist/esm/productCache-C9YXddZh.js.map +1 -0
  131. package/dist/esm/sw-in-grid-content.entry.js +1 -1
  132. package/dist/esm/sw-size-guide.entry.js +1 -1
  133. package/dist/intravenous/intravenous.esm.js +1 -1
  134. package/dist/intravenous/p-184153bc.entry.js +2 -0
  135. package/dist/intravenous/{p-42c7c048.entry.js.map → p-184153bc.entry.js.map} +1 -1
  136. package/dist/intravenous/p-1e572996.entry.js +2 -0
  137. package/dist/intravenous/{p-d59f072f.entry.js.map → p-1e572996.entry.js.map} +1 -1
  138. package/dist/intravenous/{p-bd3a065b.entry.js → p-20260729.entry.js} +2 -2
  139. package/dist/intravenous/p-22892969.entry.js +2 -0
  140. package/dist/intravenous/{p-8dd8e0da.entry.js → p-39df9f36.entry.js} +2 -2
  141. package/dist/intravenous/{p-616266e6.entry.js → p-40ddb642.entry.js} +2 -2
  142. package/dist/intravenous/{p-f0ad3966.entry.js → p-7935be65.entry.js} +2 -2
  143. package/dist/intravenous/p-7d31a457.entry.js +2 -0
  144. package/dist/intravenous/{p-29af21db.entry.js → p-9208edd1.entry.js} +2 -2
  145. package/dist/intravenous/p-C9YXddZh.js +2 -0
  146. package/dist/intravenous/p-C9YXddZh.js.map +1 -0
  147. package/dist/intravenous/p-Ckaeq7E6.js +2 -0
  148. package/dist/{esm/factory-BaAt_Bic.js.map → intravenous/p-Ckaeq7E6.js.map} +1 -1
  149. package/dist/intravenous/{p-ac016d91.entry.js → p-a07cd9a5.entry.js} +2 -2
  150. package/dist/intravenous/{p-ac016d91.entry.js.map → p-a07cd9a5.entry.js.map} +1 -1
  151. package/dist/intravenous/{p-654f8622.entry.js → p-a089e5b7.entry.js} +2 -2
  152. package/dist/intravenous/{p-f6c0e87f.entry.js → p-c3174335.entry.js} +2 -2
  153. package/dist/intravenous/{p-a6118811.entry.js → p-c7c03f29.entry.js} +2 -2
  154. package/dist/intravenous/{p-78dad884.entry.js → p-cd4293ed.entry.js} +2 -2
  155. package/dist/intravenous/{p-6f58e822.entry.js → p-cec9c4d3.entry.js} +2 -2
  156. package/dist/intravenous/{p-d611ab02.entry.js → p-d4078a2b.entry.js} +2 -2
  157. package/dist/intravenous/{p-8652bf37.entry.js → p-e040daf6.entry.js} +2 -2
  158. package/dist/intravenous/p-eb472ab8.entry.js +2 -0
  159. package/dist/intravenous/{p-78eb870a.entry.js → p-f83d6d70.entry.js} +2 -2
  160. package/dist/intravenous/{p-78eb870a.entry.js.map → p-f83d6d70.entry.js.map} +1 -1
  161. package/dist/intravenous/p-fee9ee91.entry.js +2 -0
  162. package/dist/intravenous/p-unzQs7uG.js +3 -0
  163. package/dist/intravenous/p-unzQs7uG.js.map +1 -0
  164. package/dist/intravenous/p-zdaLPMim.js +2 -0
  165. package/dist/intravenous/p-zdaLPMim.js.map +1 -0
  166. package/dist/types/utils/config/factory.d.ts +2 -1
  167. package/package.json +1 -1
  168. package/dist/cjs/app-globals-C6OZa8WS.js.map +0 -1
  169. package/dist/cjs/factory-C4yF_u3m.js.map +0 -1
  170. package/dist/cjs/index-BLYkKpmH.js.map +0 -1
  171. package/dist/cjs/productCache-tzQQpgt2.js.map +0 -1
  172. package/dist/components/p-BXV50Hqo.js.map +0 -1
  173. package/dist/components/p-DEyPXy6v.js.map +0 -1
  174. package/dist/components/p-DM5KWm2Y.js.map +0 -1
  175. package/dist/esm/app-globals-BsRaq-kz.js.map +0 -1
  176. package/dist/esm/index-B8oaG8GL.js.map +0 -1
  177. package/dist/esm/productCache-Cas6qE1D.js.map +0 -1
  178. package/dist/intravenous/p-2U-r93PP.js +0 -2
  179. package/dist/intravenous/p-2U-r93PP.js.map +0 -1
  180. package/dist/intravenous/p-42c7c048.entry.js +0 -2
  181. package/dist/intravenous/p-5967510c.entry.js +0 -2
  182. package/dist/intravenous/p-5f71c549.entry.js +0 -2
  183. package/dist/intravenous/p-B8oaG8GL.js +0 -3
  184. package/dist/intravenous/p-B8oaG8GL.js.map +0 -1
  185. package/dist/intravenous/p-BYkzuEKD.js +0 -2
  186. package/dist/intravenous/p-BYkzuEKD.js.map +0 -1
  187. package/dist/intravenous/p-B_lgwTw3.js +0 -2
  188. package/dist/intravenous/p-B_lgwTw3.js.map +0 -1
  189. package/dist/intravenous/p-d59f072f.entry.js +0 -2
  190. package/dist/intravenous/p-ea143fe8.entry.js +0 -2
  191. package/dist/intravenous/p-ee790d47.entry.js +0 -2
  192. /package/dist/intravenous/{p-bd3a065b.entry.js.map → p-20260729.entry.js.map} +0 -0
  193. /package/dist/intravenous/{p-ea143fe8.entry.js.map → p-22892969.entry.js.map} +0 -0
  194. /package/dist/intravenous/{p-8dd8e0da.entry.js.map → p-39df9f36.entry.js.map} +0 -0
  195. /package/dist/intravenous/{p-616266e6.entry.js.map → p-40ddb642.entry.js.map} +0 -0
  196. /package/dist/intravenous/{p-f0ad3966.entry.js.map → p-7935be65.entry.js.map} +0 -0
  197. /package/dist/intravenous/{p-5f71c549.entry.js.map → p-7d31a457.entry.js.map} +0 -0
  198. /package/dist/intravenous/{p-29af21db.entry.js.map → p-9208edd1.entry.js.map} +0 -0
  199. /package/dist/intravenous/{p-654f8622.entry.js.map → p-a089e5b7.entry.js.map} +0 -0
  200. /package/dist/intravenous/{p-f6c0e87f.entry.js.map → p-c3174335.entry.js.map} +0 -0
  201. /package/dist/intravenous/{p-a6118811.entry.js.map → p-c7c03f29.entry.js.map} +0 -0
  202. /package/dist/intravenous/{p-78dad884.entry.js.map → p-cd4293ed.entry.js.map} +0 -0
  203. /package/dist/intravenous/{p-6f58e822.entry.js.map → p-cec9c4d3.entry.js.map} +0 -0
  204. /package/dist/intravenous/{p-d611ab02.entry.js.map → p-d4078a2b.entry.js.map} +0 -0
  205. /package/dist/intravenous/{p-8652bf37.entry.js.map → p-e040daf6.entry.js.map} +0 -0
  206. /package/dist/intravenous/{p-5967510c.entry.js.map → p-eb472ab8.entry.js.map} +0 -0
  207. /package/dist/intravenous/{p-ee790d47.entry.js.map → p-fee9ee91.entry.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-BLYkKpmH.js');
3
+ var index = require('./index-CDQIUkok.js');
4
4
 
5
5
  // Idempotent global init (prevents double execution if script loaded twice)
6
6
  // Also resolves Stencil v update expecting a default export from globalScript.
@@ -11,6 +11,7 @@ const w = (typeof window !== 'undefined') ? window : {};
11
11
  async function intravenousGlobalInit() {
12
12
  try {
13
13
  if (!w.__IV_API_SETUP_DONE) {
14
+ index.setStoreDomain();
14
15
  index.apiSetup();
15
16
  w.__IV_API_SETUP_DONE = true;
16
17
  }
@@ -34,6 +35,6 @@ async function intravenousGlobalInit() {
34
35
  const globalScripts = intravenousGlobalInit;
35
36
 
36
37
  exports.globalScripts = globalScripts;
37
- //# sourceMappingURL=app-globals-C6OZa8WS.js.map
38
+ //# sourceMappingURL=app-globals-MPl5n0hu.js.map
38
39
 
39
- //# sourceMappingURL=app-globals-C6OZa8WS.js.map
40
+ //# sourceMappingURL=app-globals-MPl5n0hu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-globals-MPl5n0hu.js","sources":["src/global/app.ts","@stencil/core/internal/app-globals"],"sourcesContent":["import { apiSetup, setStoreDomain, fetchShopifyCurrencyCode } from '../utils/config/factory';\r\nimport { state } from '../utils/store/store';\r\n\r\n// Idempotent global init (prevents double execution if script loaded twice)\r\n// Also resolves Stencil v update expecting a default export from globalScript.\r\n// Flags kept minimal to avoid polluting window.\r\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n// @ts-ignore\r\nconst w: any = (typeof window !== 'undefined') ? window : {};\r\n\r\nexport default async function intravenousGlobalInit() {\r\n try {\r\n if(!w.__IV_API_SETUP_DONE) {\r\n setStoreDomain();\r\n apiSetup();\r\n w.__IV_API_SETUP_DONE = true;\r\n }\r\n if(!w.__IV_CURRENCY_FETCH_DONE) {\r\n try {\r\n const code = await fetchShopifyCurrencyCode();\r\n if(code) state.setCurrencyCode(code);\r\n } catch (err) {\r\n console.debug('[IV] currency fetch skipped', err);\r\n }\r\n w.__IV_CURRENCY_FETCH_DONE = true;\r\n }\r\n } catch(err) {\r\n console.error('[IV] Global init failed', err);\r\n }\r\n}","import appGlobalScript from 'C:/Users/BeauBuxton/OneDrive - Herd Agency Limited/Documents/junk/The-Foxy-Library/src/global/app.ts';\nexport const globalScripts = appGlobalScript;\nexport const globalStyles = \"\";\n"],"names":["setStoreDomain","apiSetup","fetchShopifyCurrencyCode","state","appGlobalScript"],"mappings":";;;;AAGA;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC,GAAQ,CAAC,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,GAAG,EAAE;AAE7C,eAAe,qBAAqB,GAAA;AACjD,IAAA,IAAI;AACF,QAAA,IAAG,CAAC,CAAC,CAAC,mBAAmB,EAAE;AACzB,YAAAA,oBAAc,EAAE;AAChB,YAAAC,cAAQ,EAAE;AACV,YAAA,CAAC,CAAC,mBAAmB,GAAG,IAAI;;AAE9B,QAAA,IAAG,CAAC,CAAC,CAAC,wBAAwB,EAAE;AAC9B,YAAA,IAAI;AACF,gBAAA,MAAM,IAAI,GAAG,MAAMC,8BAAwB,EAAE;AAC7C,gBAAA,IAAG,IAAI;AAAE,oBAAAC,WAAK,CAAC,eAAe,CAAC,IAAI,CAAC;;YACpC,OAAO,GAAG,EAAE;AACZ,gBAAA,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC;;AAEnD,YAAA,CAAC,CAAC,wBAAwB,GAAG,IAAI;;;IAEnC,OAAM,GAAG,EAAE;AACX,QAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC;;AAEjD;;AC5BY,MAAC,aAAa,GAAGC;;;;"}
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-BLYkKpmH.js');
3
+ var index = require('./index-CDQIUkok.js');
4
4
 
5
5
  async function shopifyFetch(query, variables = {}) {
6
6
  try {
7
- if (!index.state.shopDomain || !index.state.storefrontToken)
7
+ if (!index.state.shopDomainApi || !index.state.storefrontToken)
8
8
  throw new Error('Missing Shopify configuration (shopDomain/storefrontToken)');
9
- const endpoint = `https://${index.state.shopDomain}/api/2025-07/graphql.json`;
9
+ const endpoint = `https://${index.state.shopDomainApi}/api/2025-07/graphql.json`;
10
10
  const token = index.state.storefrontToken;
11
11
  const res = await fetch(endpoint, {
12
12
  method: 'POST',
@@ -214,6 +214,6 @@ exports.addToCart = addToCart;
214
214
  exports.fetchProductByID = fetchProductByID;
215
215
  exports.fetchProducts = fetchProducts;
216
216
  exports.getIdFromHandle = getIdFromHandle;
217
- //# sourceMappingURL=factory-C4yF_u3m.js.map
217
+ //# sourceMappingURL=factory-CrhcL_74.js.map
218
218
 
219
- //# sourceMappingURL=factory-C4yF_u3m.js.map
219
+ //# sourceMappingURL=factory-CrhcL_74.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory-CrhcL_74.js","sources":["src/utils/storefront_api/factory.ts"],"sourcesContent":["import { state, showToast } from \"../store/store\";\r\n\r\nasync function shopifyFetch(query: string, variables: Record<string, any> = {}): Promise<any> {\r\n try {\r\n if(!state.shopDomainApi || !state.storefrontToken) throw new Error('Missing Shopify configuration (shopDomain/storefrontToken)');\r\n const endpoint = `https://${state.shopDomainApi}/api/2025-07/graphql.json`;\r\n const token = state.storefrontToken;\r\n const res = await fetch(endpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Shopify-Storefront-Access-Token': token\r\n },\r\n body: JSON.stringify({ query, variables })\r\n });\r\n const json = await res.json();\r\n if(json.errors) throw new Error(json.errors.map((e: any) => e.message).join(', '));\r\n return json.data;\r\n } catch(error) {\r\n console.error('Shopify Fetch Error:', error);\r\n throw error; \r\n };\r\n};\r\n\r\nexport async function getIdFromHandle(handle: string): Promise<string | null> {\r\n const query = `\r\n query ($handle: String!) {\r\n product(handle: $handle) {\r\n id\r\n }\r\n }`;\r\n try {\r\n const data = await shopifyFetch(query, { handle });\r\n return data?.product?.id || null;\r\n } catch (error) {\r\n console.error('getIdFromHandle error:', error);\r\n return null;\r\n };\r\n};\r\n\r\n// Field + normalization helpers\r\nconst BASE_PRODUCT_FIELDS = ['id','handle','title'];\r\nconst DEFAULT_VARIANT_FIELDS = ['id','title','price { amount currencyCode }'];\r\n\r\nfunction mergeFields(requested: string[] | string, defaults: string[]): string[] {\r\n const req = (Array.isArray(requested) ? requested : requested.split(','))\r\n .map(f => f.trim())\r\n .filter(Boolean);\r\n const seen = new Set<string>();\r\n const ordered: string[] = [];\r\n for(const f of req) { \r\n if(!seen.has(f)) { \r\n seen.add(f); ordered.push(f); \r\n }; \r\n };\r\n for(const d of defaults) { \r\n if(!seen.has(d)) { \r\n seen.add(d); \r\n ordered.push(d); \r\n }; \r\n };\r\n return ordered;\r\n};\r\n\r\nfunction expandProductFields(fields: string[]): string {\r\n return fields\r\n .filter(f => f !== 'price')\r\n .map(f => {\r\n if(f === 'images') return 'images(first: 10) { nodes { url altText } }';\r\n return f;\r\n })\r\n .join('\\n');\r\n};\r\n\r\nfunction variantSelection(fields: string[] = DEFAULT_VARIANT_FIELDS): string {\r\n return fields.join('\\n');\r\n};\r\n\r\ninterface NormalizedProduct {\r\n id: string;\r\n handle?: string;\r\n title?: string;\r\n variantId?: string;\r\n price?: string | null;\r\n imageUrl?: string | null;\r\n imageAlt?: string | null;\r\n // index signature for dynamic requested fields\r\n [key: string]: any;\r\n};\r\n\r\nfunction normalizeProduct(product: any, selectedVariant?: any): NormalizedProduct {\r\n const variant = selectedVariant || product.variants?.edges?.[0]?.node || {};\r\n let imageUrl = null;\r\n let imageAlt = null;\r\n if(product.images?.nodes && product.images.nodes.length > 0) {\r\n imageUrl = product.images.nodes[0].url || null;\r\n imageAlt = product.images.nodes[0].altText || null;\r\n };\r\n const { id: variantId, price } = variant;\r\n return {\r\n id: product.id,\r\n ...Object.fromEntries(Object.entries(product).filter(([key]) => key !== 'variants')),\r\n variantId,\r\n price: price?.amount || null,\r\n imageUrl,\r\n imageAlt,\r\n };\r\n};\r\n\r\n// Query builders\r\nfunction buildProductsQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($limit: Int!, $sortKey: ProductSortKeys!, $reverse: Boolean) {\r\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\r\n edges {\r\n node {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildCollectionProductsQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($handle: String!, $limit: Int!, $sortKey: ProductCollectionSortKeys!, $reverse: Boolean) {\r\n collection(handle: $handle) {\r\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\r\n edges {\r\n node {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildSingleProductQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($id: ID!) {\r\n product(id: $id) {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildVariantProductQuery(productFieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($id: ID!) {\r\n productVariant(id: $id) {\r\n ${variantFieldsString}\r\n product {\r\n ${productFieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\n// Public API\r\nexport async function fetchProducts(limit: number, collectionHandle: string, sortKey: string, fields: string[] | string, reversed: boolean = false) {\r\n try {\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const fieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const isAll = !collectionHandle || collectionHandle === 'all';\r\n const query = isAll ? buildProductsQuery(fieldsString, variantFieldsString) : buildCollectionProductsQuery(fieldsString, variantFieldsString);\r\n const reverse = !!reversed;\r\n const variables: Record<string, any> = isAll ? { limit, sortKey, reverse } : { handle: collectionHandle, limit, sortKey, reverse };\r\n const data = await shopifyFetch(query, variables);\r\n const productEdges = data.products?.edges || data.collection?.products?.edges || [];\r\n return productEdges.map((edge: any) => normalizeProduct(edge.node));\r\n } catch(error) { \r\n console.error('Fetch Products Error:', error); throw error;\r\n };\r\n};\r\n\r\nexport async function fetchProductByID(id: string, fields: string[] | string, options?: { variantId?: string }): Promise<NormalizedProduct | null> {\r\n try {\r\n if(options?.variantId) return await getVariantProduct(options.variantId, fields);\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const fieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const query = buildSingleProductQuery(fieldsString, variantFieldsString);\r\n const data = await shopifyFetch(query, { id });\r\n const product = data?.product;\r\n if(!product) return null;\r\n return normalizeProduct(product);\r\n } catch(error) { console.error('Fetch Product By ID Error:', error); throw error; };\r\n};\r\n\r\nexport async function getVariantProduct(variantId: string, fields: string[] | string): Promise<NormalizedProduct | null> {\r\n try {\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const productFieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const query = buildVariantProductQuery(productFieldsString, variantFieldsString);\r\n const data = await shopifyFetch(query, { id: variantId });\r\n const variantNode = data?.productVariant;\r\n if(!variantNode) return null;\r\n const product = variantNode.product;\r\n if(!product) return null;\r\n return normalizeProduct(product, variantNode); \r\n } catch(error) { console.error('Get Variant Product Error:', error); throw error; };\r\n};\r\n\r\nexport async function addToCart(options: {\r\n id: number;\r\n quantity?: number;\r\n properties?: Record<string, any>;\r\n}) {\r\n try {\r\n console.log('IV add to cart called');\r\n if(!options.id) throw new Error('No variant id provided for addToCart');\r\n const quantity = options.quantity || 1;\r\n const properties = options.properties || {};\r\n const payload = {\r\n items: [\r\n {\r\n id: options.id,\r\n quantity,\r\n properties\r\n }\r\n ]\r\n };\r\n const url = '/cart/add.js';\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json',\r\n 'X-Requested-With': 'XMLHttpRequest'\r\n },\r\n body: JSON.stringify(payload)\r\n });\r\n if(!res.ok) {\r\n const errorText = await res.text();\r\n throw new Error(errorText);\r\n };\r\n const cartItem = await res.json();\r\n showToast('Added to cart!', 'success', 3000);\r\n return cartItem;\r\n } catch (error) {\r\n showToast('Error adding to cart', 'error', 5000);\r\n throw error;\r\n };\r\n};"],"names":["state","showToast"],"mappings":";;;;AAEA,eAAe,YAAY,CAAC,KAAa,EAAE,YAAiC,EAAE,EAAA;AAC5E,IAAA,IAAI;QACF,IAAG,CAACA,WAAK,CAAC,aAAa,IAAI,CAACA,WAAK,CAAC,eAAe;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC;AAChI,QAAA,MAAM,QAAQ,GAAG,CAAA,QAAA,EAAWA,WAAK,CAAC,aAAa,2BAA2B;AAC1E,QAAA,MAAM,KAAK,GAAGA,WAAK,CAAC,eAAe;AACnC,QAAA,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;AAChC,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,kBAAkB;AAClC,gBAAA,mCAAmC,EAAE;AACtC,aAAA;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,SAAA,CAAC;AACF,QAAA,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE;QAC7B,IAAG,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,IAAI;;IAChB,OAAM,KAAK,EAAE;AACb,QAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC;AAC5C,QAAA,MAAM,KAAK;;AAEf;AAEO,eAAe,eAAe,CAAC,MAAc,EAAA;AAClD,IAAA,MAAM,KAAK,GAAG,CAAA;;;;;MAKV;AACJ,IAAA,IAAI;QACF,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC;AAClD,QAAA,OAAO,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,IAAI;;IAChC,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC;AAC9C,QAAA,OAAO,IAAI;;AAEf;AAEA;AACA,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,CAAC;AACnD,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAC,OAAO,EAAC,+BAA+B,CAAC;AAE7E,SAAS,WAAW,CAAC,SAA4B,EAAE,QAAkB,EAAA;IACnE,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;SACrE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;SACjB,MAAM,CAAC,OAAO,CAAC;AAClB,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;IAC9B,MAAM,OAAO,GAAa,EAAE;AAC5B,IAAA,KAAI,MAAM,CAAC,IAAI,GAAG,EAAE;QAClB,IAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;AACf,YAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;;;AAGhC,IAAA,KAAI,MAAM,CAAC,IAAI,QAAQ,EAAE;QACvB,IAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;AACf,YAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACX,YAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;;;AAGnB,IAAA,OAAO,OAAO;AAChB;AAEA,SAAS,mBAAmB,CAAC,MAAgB,EAAA;AAC3C,IAAA,OAAO;SACJ,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,OAAO;SACzB,GAAG,CAAC,CAAC,IAAG;QACP,IAAG,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,6CAA6C;AACvE,QAAA,OAAO,CAAC;AACV,KAAC;SACA,IAAI,CAAC,IAAI,CAAC;AACf;AAEA,SAAS,gBAAgB,CAAC,MAAA,GAAmB,sBAAsB,EAAA;AACjE,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AAC1B;AAcA,SAAS,gBAAgB,CAAC,OAAY,EAAE,eAAqB,EAAA;AAC3D,IAAA,MAAM,OAAO,GAAG,eAAe,IAAI,OAAO,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE;IAC3E,IAAI,QAAQ,GAAG,IAAI;IACnB,IAAI,QAAQ,GAAG,IAAI;AACnB,IAAA,IAAG,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3D,QAAA,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI;AAC9C,QAAA,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI;;IAEpD,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,OAAO;IACxC,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,UAAU,CAAC,CAAC;QACpF,SAAS;AACT,QAAA,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI;QAC5B,QAAQ;QACR,QAAQ;KACT;AACH;AAEA;AACA,SAAS,kBAAkB,CAAC,YAAoB,EAAE,mBAA2B,EAAA;IAC3E,OAAO,CAAA;;;;;cAKK,YAAY,CAAA;kDACwB,mBAAmB,CAAA;;;;MAI/D;AACN;AAEA,SAAS,4BAA4B,CAAC,YAAoB,EAAE,mBAA2B,EAAA;IACrF,OAAO,CAAA;;;;;;gBAMO,YAAY,CAAA;oDACwB,mBAAmB,CAAA;;;;;MAKjE;AACN;AAEA,SAAS,uBAAuB,CAAC,YAAoB,EAAE,mBAA2B,EAAA;IAChF,OAAO,CAAA;;;UAGC,YAAY,CAAA;8CACwB,mBAAmB,CAAA;;MAE3D;AACN;AAeA;AACO,eAAe,aAAa,CAAC,KAAa,EAAE,gBAAwB,EAAE,OAAe,EAAE,MAAyB,EAAE,WAAoB,KAAK,EAAA;AAChJ,IAAA,IAAI;QACF,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC;AACvD,QAAA,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC;AAChD,QAAA,MAAM,mBAAmB,GAAG,gBAAgB,EAAE;QAC9C,MAAM,KAAK,GAAG,CAAC,gBAAgB,IAAI,gBAAgB,KAAK,KAAK;QAC7D,MAAM,KAAK,GAAG,KAAK,GAAG,kBAAkB,CAAC,YAAY,EAAE,mBAAmB,CAAC,GAAG,4BAA4B,CAAC,YAAY,EAAE,mBAAmB,CAAC;AAC7I,QAAA,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ;QAC1B,MAAM,SAAS,GAAwB,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE;QAClI,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC;AACjD,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE;AACnF,QAAA,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,IAAS,KAAK,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;IACnE,OAAM,KAAK,EAAE;AACb,QAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC;AAAE,QAAA,MAAM,KAAK;;AAE9D;AAEO,eAAe,gBAAgB,CAAC,EAAU,EAAE,MAAyB,EAAE,OAAgC,EAAA;AAC5G,IAAA,IAAI;QAEF,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC;AACvD,QAAA,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC;AAChD,QAAA,MAAM,mBAAmB,GAAG,gBAAgB,EAAE;QAC9C,MAAM,KAAK,GAAG,uBAAuB,CAAC,YAAY,EAAE,mBAAmB,CAAC;QACxE,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC;AAC9C,QAAA,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO;AAC7B,QAAA,IAAG,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;AACxB,QAAA,OAAO,gBAAgB,CAAC,OAAO,CAAC;;IAChC,OAAM,KAAK,EAAE;AAAE,QAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC;AAAE,QAAA,MAAM,KAAK;;AAClF;AAiBO,eAAe,SAAS,CAAC,OAI/B,EAAA;AACC,IAAA,IAAI;AACF,QAAA,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;QACpC,IAAG,CAAC,OAAO,CAAC,EAAE;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC;AACvE,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC;AACtC,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE;AAC3C,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,KAAK,EAAE;AACL,gBAAA;oBACE,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,QAAQ;oBACR;AACD;AACF;SACF;QACD,MAAM,GAAG,GAAG,cAAc;AAC1B,QAAA,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;AAC3B,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,kBAAkB;AAClC,gBAAA,QAAQ,EAAE,kBAAkB;AAC5B,gBAAA,kBAAkB,EAAE;AACrB,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO;AAC7B,SAAA,CAAC;AACF,QAAA,IAAG,CAAC,GAAG,CAAC,EAAE,EAAE;AACV,YAAA,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE;AAClC,YAAA,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC;;AAE5B,QAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE;AACjC,QAAAC,eAAS,CAAC,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC;AAC5C,QAAA,OAAO,QAAQ;;IACf,OAAO,KAAK,EAAE;AACd,QAAAA,eAAS,CAAC,sBAAsB,EAAE,OAAO,EAAE,IAAI,CAAC;AAChD,QAAA,MAAM,KAAK;;AAEf;;;;;;;"}
@@ -301,17 +301,193 @@ function togglePullout(content) {
301
301
  state.pulloutContent = content;
302
302
  }
303
303
 
304
- // Check where this is called!
305
- function apiSetup() {
306
- let token = document.documentElement.getAttribute('store-token');
307
- if (!token) {
308
- console.error('[Intravenous] Missing store-url or store-token attribute on <html>.');
309
- return;
304
+ function createErrorHandler(config = {}) {
305
+ const { component, toast, toastDuration = 3000, emitEvents = true, target = window, classifier, dedupeMs = 4000, defaultUserMessage = 'Something went wrong. Please try again.', maxConsoleStack = 6, telemetry, _sharedRecent } = config;
306
+ const recent = _sharedRecent || new Map();
307
+ function severityToToastType(sev) {
308
+ if (sev === 'warn')
309
+ return 'warning';
310
+ if (sev === 'debug' || sev === 'info')
311
+ return 'info';
312
+ return 'error';
313
+ }
314
+ function dispatchToast(message, severity) {
315
+ const type = severityToToastType(severity);
316
+ try {
317
+ toast ? toast({ message, variant: type }) : showToast(message, type, toastDuration);
318
+ }
319
+ catch (_) { /* swallow toast errors */ }
320
+ }
321
+ function classify(base) {
322
+ let severity = base.severity || base.level || 'error';
323
+ let userSafe = !!base.userMessage;
324
+ let userMessage = base.userMessage;
325
+ const err = base.error;
326
+ const isNetwork = err?.name === 'TypeError' && /fetch/i.test(err?.message || '');
327
+ if (isNetwork) {
328
+ userSafe = true;
329
+ userMessage ||= 'Network issue. Please retry.';
330
+ }
331
+ const status = err?.status || err?.response?.status;
332
+ if (status) {
333
+ if (status >= 400 && status < 500)
334
+ userSafe = true;
335
+ if (status >= 500) {
336
+ userSafe = false;
337
+ severity = 'error';
338
+ }
339
+ }
340
+ if (!userMessage && userSafe)
341
+ userMessage = defaultUserMessage;
342
+ if (classifier) {
343
+ const override = classifier({ error: err, scope: base.scope }) || {};
344
+ if (override.userSafe !== undefined)
345
+ userSafe = override.userSafe;
346
+ if (override.severity)
347
+ severity = override.severity;
348
+ if (override.userMessage)
349
+ userMessage = override.userMessage;
350
+ }
351
+ if (!userSafe)
352
+ userMessage = undefined;
353
+ return { userSafe, severity, userMessage };
354
+ }
355
+ function dedupeKey(n) {
356
+ return `${n.component || ''}|${n.scope}|${n.devMessage || n.userMessage || n.raw?.message || ''}|${n.severity}`;
357
+ }
358
+ function handle(opts) {
359
+ const { error, scope, devMessage, meta } = opts;
360
+ const { userSafe, severity, userMessage } = classify(opts);
361
+ const stack = (error?.stack || '').split('\n').slice(0, maxConsoleStack).join('\n');
362
+ const normalized = {
363
+ id: crypto?.randomUUID ? crypto.randomUUID() : Date.now().toString(36) + Math.random().toString(36).slice(2),
364
+ ts: Date.now(),
365
+ component,
366
+ scope,
367
+ severity,
368
+ userSafe,
369
+ userMessage,
370
+ devMessage: devMessage ?? (userSafe ? error?.message : undefined),
371
+ raw: error,
372
+ meta,
373
+ stack
374
+ };
375
+ if (telemetry?.enrich) {
376
+ try {
377
+ Object.assign(normalized, telemetry.enrich(normalized));
378
+ }
379
+ catch (_) { }
380
+ }
381
+ const key = dedupeKey(normalized);
382
+ const last = recent.get(key);
383
+ last && (Date.now() - last) < dedupeMs ? normalized.deduped = true : recent.set(key, Date.now());
384
+ const consolePayload = { ...normalized, raw: undefined };
385
+ if (severity === 'debug')
386
+ console.debug('[iv-error]', consolePayload, error);
387
+ else if (severity === 'info')
388
+ console.info('[iv-error]', consolePayload, error);
389
+ else if (severity === 'warn')
390
+ console.warn('[iv-error]', consolePayload, error);
391
+ else
392
+ console.error('[iv-error]', consolePayload, error);
393
+ if (userSafe && !normalized.deduped && userMessage) {
394
+ dispatchToast(userMessage, severity);
395
+ }
396
+ if (emitEvents && (opts.emitEvent !== false) && target && typeof target.dispatchEvent === 'function') {
397
+ try {
398
+ target.dispatchEvent(new CustomEvent('iv-error', { detail: normalized, bubbles: true, composed: true }));
399
+ }
400
+ catch (_) { }
401
+ }
402
+ if (telemetry && (!telemetry.sampleRate || Math.random() < telemetry.sampleRate)) {
403
+ if (!telemetry.filter || telemetry.filter(normalized)) {
404
+ try {
405
+ Promise.resolve(telemetry.record(normalized)).catch(() => { });
406
+ }
407
+ catch (_) { }
408
+ }
409
+ }
410
+ return normalized;
411
+ }
412
+ return { handle };
413
+ }
414
+ // Usage in a component:
415
+ /*
416
+ import { createErrorHandler } from '../../utils/error_handling/factory';
417
+ const errors = createErrorHandler({ component: 'iv-dynamic-products', toast: showToast });
418
+
419
+ try {
420
+ await fetchProducts(...);
421
+ } catch(err) {
422
+ errors.handle({
423
+ error: err,
424
+ scope: 'fetchProducts',
425
+ userMessage: 'Could not load products.',
426
+ devMessage: 'Storefront API fetch failed',
427
+ severity: 'error'
428
+ });
429
+ }
430
+
431
+ So simplest component usage:
432
+ const errors = createErrorHandler({ component: 'iv-card' }); try { ... } catch (e) { errors.handle({ error: e, scope: 'load', userMessage: 'Failed to load.' }); }
433
+ */
434
+
435
+ const errors = createErrorHandler({ component: 'iv-set-up' });
436
+ function setStoreDomain() {
437
+ try {
438
+ const storeUrl = typeof window !== 'undefined' && window.location ? window.location.hostname : '';
439
+ if (!storeUrl)
440
+ throw new Error('Could not set store domain.');
441
+ state.shopDomain = storeUrl;
442
+ }
443
+ catch (err) {
444
+ errors.handle({
445
+ error: err,
446
+ scope: 'SetStoreDomain',
447
+ userMessage: 'Something has gone wrong, please try again.',
448
+ devMessage: 'Failed to set store domain in store.ts',
449
+ severity: 'critical'
450
+ });
310
451
  }
311
- if (state.shopDomain && !state.shopDomain.includes('.myshopify.com')) {
312
- state.shopDomain = state.shopDomain + '.myshopify.com';
452
+ }
453
+ function setToken() {
454
+ try {
455
+ const token = document.documentElement.getAttribute('store-token');
456
+ if (!token)
457
+ throw new Error('Store token not found on document.');
458
+ state.storefrontToken = token;
459
+ }
460
+ catch (err) {
461
+ errors.handle({
462
+ error: err,
463
+ scope: 'SetToken',
464
+ userMessage: 'Something has gone wrong, please try again.',
465
+ devMessage: 'Failed to set store token in store.ts',
466
+ severity: 'critical'
467
+ });
313
468
  }
314
- state.storefrontToken = token;
469
+ }
470
+ function setEndpoint() {
471
+ try {
472
+ const endpoint = state.shopDomain;
473
+ if (!endpoint)
474
+ throw new Error('Shop domain not set in store.');
475
+ state.shopDomainApi = endpoint + '.myshopify.com';
476
+ }
477
+ catch (err) {
478
+ errors.handle({
479
+ error: err,
480
+ scope: 'SetEndpoint',
481
+ userMessage: 'Something has gone wrong, please try again.',
482
+ devMessage: 'Failed to set store endpoint in store.ts',
483
+ severity: 'critical'
484
+ });
485
+ }
486
+ }
487
+ // Check where this is called!
488
+ function apiSetup() {
489
+ setToken();
490
+ setEndpoint();
315
491
  }
316
492
  if (typeof window !== 'undefined') {
317
493
  if (document.readyState === 'loading') {
@@ -2314,6 +2490,7 @@ var setNonce = (nonce) => plt.$nonce$ = nonce;
2314
2490
  exports.Host = Host;
2315
2491
  exports.apiSetup = apiSetup;
2316
2492
  exports.bootstrapLazy = bootstrapLazy;
2493
+ exports.createErrorHandler = createErrorHandler;
2317
2494
  exports.createEvent = createEvent;
2318
2495
  exports.fetchShopifyCurrencyCode = fetchShopifyCurrencyCode;
2319
2496
  exports.getAssetPath = getAssetPath;
@@ -2324,10 +2501,11 @@ exports.promiseResolve = promiseResolve;
2324
2501
  exports.registerInstance = registerInstance;
2325
2502
  exports.removeFromWishlist = removeFromWishlist;
2326
2503
  exports.setNonce = setNonce;
2504
+ exports.setStoreDomain = setStoreDomain;
2327
2505
  exports.showToast = showToast;
2328
2506
  exports.state = state;
2329
2507
  exports.toggleModal = toggleModal;
2330
2508
  exports.togglePullout = togglePullout;
2331
- //# sourceMappingURL=index-BLYkKpmH.js.map
2509
+ //# sourceMappingURL=index-CDQIUkok.js.map
2332
2510
 
2333
- //# sourceMappingURL=index-BLYkKpmH.js.map
2511
+ //# sourceMappingURL=index-CDQIUkok.js.map