@shopify/hydrogen-react 0.0.0-next-ea3959b → 0.0.0-next-dada720

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 (291) hide show
  1. package/README.md +21 -21
  2. package/dist/browser-dev/AddToCartButton.mjs.map +1 -1
  3. package/dist/browser-dev/BuyNowButton.mjs.map +1 -1
  4. package/dist/browser-dev/CartCheckoutButton.mjs.map +1 -1
  5. package/dist/browser-dev/CartCost.mjs +25 -0
  6. package/dist/browser-dev/CartCost.mjs.map +1 -0
  7. package/dist/browser-dev/CartLinePrice.mjs +18 -0
  8. package/dist/browser-dev/CartLinePrice.mjs.map +1 -0
  9. package/dist/browser-dev/CartLineProvider.mjs +19 -0
  10. package/dist/browser-dev/CartLineProvider.mjs.map +1 -0
  11. package/dist/browser-dev/CartProvider.mjs.map +1 -1
  12. package/dist/browser-dev/ExternalVideo.mjs.map +1 -1
  13. package/dist/browser-dev/Image.mjs.map +1 -1
  14. package/dist/browser-dev/MediaFile.mjs.map +1 -1
  15. package/dist/browser-dev/ModelViewer.mjs.map +1 -1
  16. package/dist/browser-dev/ProductPrice.mjs.map +1 -1
  17. package/dist/browser-dev/ProductProvider.mjs.map +1 -1
  18. package/dist/browser-dev/ShopPayButton.mjs +10 -10
  19. package/dist/browser-dev/ShopPayButton.mjs.map +1 -1
  20. package/dist/browser-dev/ShopifyProvider.mjs +9 -21
  21. package/dist/browser-dev/ShopifyProvider.mjs.map +1 -1
  22. package/dist/browser-dev/analytics-constants.mjs +43 -0
  23. package/dist/browser-dev/analytics-constants.mjs.map +1 -0
  24. package/dist/browser-dev/analytics-schema-custom-storefront-customer-tracking.mjs +145 -0
  25. package/dist/browser-dev/analytics-schema-custom-storefront-customer-tracking.mjs.map +1 -0
  26. package/dist/browser-dev/analytics-schema-trekkie-storefront-page-view.mjs +58 -0
  27. package/dist/browser-dev/analytics-schema-trekkie-storefront-page-view.mjs.map +1 -0
  28. package/dist/browser-dev/analytics-utils.mjs +49 -0
  29. package/dist/browser-dev/analytics-utils.mjs.map +1 -0
  30. package/dist/browser-dev/analytics.mjs +159 -0
  31. package/dist/browser-dev/analytics.mjs.map +1 -0
  32. package/dist/browser-dev/cart-hooks.mjs +5 -7
  33. package/dist/browser-dev/cart-hooks.mjs.map +1 -1
  34. package/dist/browser-dev/cookies-utils.mjs +50 -0
  35. package/dist/browser-dev/cookies-utils.mjs.map +1 -0
  36. package/dist/browser-dev/index.mjs +20 -2
  37. package/dist/browser-dev/index.mjs.map +1 -1
  38. package/dist/browser-dev/parse-metafield.mjs.map +1 -1
  39. package/dist/browser-dev/storefront-client.mjs +13 -12
  40. package/dist/browser-dev/storefront-client.mjs.map +1 -1
  41. package/dist/browser-dev/useMoney.mjs +2 -1
  42. package/dist/browser-dev/useMoney.mjs.map +1 -1
  43. package/dist/browser-dev/useShopifyCookies.mjs +41 -0
  44. package/dist/browser-dev/useShopifyCookies.mjs.map +1 -0
  45. package/dist/browser-prod/AddToCartButton.mjs.map +1 -1
  46. package/dist/browser-prod/BuyNowButton.mjs.map +1 -1
  47. package/dist/browser-prod/CartCheckoutButton.mjs.map +1 -1
  48. package/dist/browser-prod/CartCost.mjs +25 -0
  49. package/dist/browser-prod/CartCost.mjs.map +1 -0
  50. package/dist/browser-prod/CartLinePrice.mjs +18 -0
  51. package/dist/browser-prod/CartLinePrice.mjs.map +1 -0
  52. package/dist/browser-prod/CartLineProvider.mjs +19 -0
  53. package/dist/browser-prod/CartLineProvider.mjs.map +1 -0
  54. package/dist/browser-prod/CartProvider.mjs.map +1 -1
  55. package/dist/browser-prod/ExternalVideo.mjs.map +1 -1
  56. package/dist/browser-prod/Image.mjs.map +1 -1
  57. package/dist/browser-prod/MediaFile.mjs.map +1 -1
  58. package/dist/browser-prod/ModelViewer.mjs.map +1 -1
  59. package/dist/browser-prod/ProductPrice.mjs.map +1 -1
  60. package/dist/browser-prod/ProductProvider.mjs.map +1 -1
  61. package/dist/browser-prod/ShopPayButton.mjs +10 -10
  62. package/dist/browser-prod/ShopPayButton.mjs.map +1 -1
  63. package/dist/browser-prod/ShopifyProvider.mjs +9 -16
  64. package/dist/browser-prod/ShopifyProvider.mjs.map +1 -1
  65. package/dist/browser-prod/analytics-constants.mjs +43 -0
  66. package/dist/browser-prod/analytics-constants.mjs.map +1 -0
  67. package/dist/browser-prod/analytics-schema-custom-storefront-customer-tracking.mjs +145 -0
  68. package/dist/browser-prod/analytics-schema-custom-storefront-customer-tracking.mjs.map +1 -0
  69. package/dist/browser-prod/analytics-schema-trekkie-storefront-page-view.mjs +58 -0
  70. package/dist/browser-prod/analytics-schema-trekkie-storefront-page-view.mjs.map +1 -0
  71. package/dist/browser-prod/analytics-utils.mjs +49 -0
  72. package/dist/browser-prod/analytics-utils.mjs.map +1 -0
  73. package/dist/browser-prod/analytics.mjs +158 -0
  74. package/dist/browser-prod/analytics.mjs.map +1 -0
  75. package/dist/browser-prod/cart-hooks.mjs +5 -7
  76. package/dist/browser-prod/cart-hooks.mjs.map +1 -1
  77. package/dist/browser-prod/cookies-utils.mjs +50 -0
  78. package/dist/browser-prod/cookies-utils.mjs.map +1 -0
  79. package/dist/browser-prod/index.mjs +20 -2
  80. package/dist/browser-prod/index.mjs.map +1 -1
  81. package/dist/browser-prod/parse-metafield.mjs.map +1 -1
  82. package/dist/browser-prod/storefront-client.mjs +13 -12
  83. package/dist/browser-prod/storefront-client.mjs.map +1 -1
  84. package/dist/browser-prod/useMoney.mjs +2 -1
  85. package/dist/browser-prod/useMoney.mjs.map +1 -1
  86. package/dist/browser-prod/useShopifyCookies.mjs +41 -0
  87. package/dist/browser-prod/useShopifyCookies.mjs.map +1 -0
  88. package/dist/node-dev/AddToCartButton.js.map +1 -1
  89. package/dist/node-dev/AddToCartButton.mjs.map +1 -1
  90. package/dist/node-dev/BuyNowButton.js.map +1 -1
  91. package/dist/node-dev/BuyNowButton.mjs.map +1 -1
  92. package/dist/node-dev/CartCheckoutButton.js.map +1 -1
  93. package/dist/node-dev/CartCheckoutButton.mjs.map +1 -1
  94. package/dist/node-dev/CartCost.js +25 -0
  95. package/dist/node-dev/CartCost.js.map +1 -0
  96. package/dist/node-dev/CartCost.mjs +25 -0
  97. package/dist/node-dev/CartCost.mjs.map +1 -0
  98. package/dist/node-dev/CartLinePrice.js +18 -0
  99. package/dist/node-dev/CartLinePrice.js.map +1 -0
  100. package/dist/node-dev/CartLinePrice.mjs +18 -0
  101. package/dist/node-dev/CartLinePrice.mjs.map +1 -0
  102. package/dist/node-dev/CartLineProvider.js +19 -0
  103. package/dist/node-dev/CartLineProvider.js.map +1 -0
  104. package/dist/node-dev/CartLineProvider.mjs +19 -0
  105. package/dist/node-dev/CartLineProvider.mjs.map +1 -0
  106. package/dist/node-dev/CartProvider.js.map +1 -1
  107. package/dist/node-dev/CartProvider.mjs.map +1 -1
  108. package/dist/node-dev/ExternalVideo.js.map +1 -1
  109. package/dist/node-dev/ExternalVideo.mjs.map +1 -1
  110. package/dist/node-dev/Image.js.map +1 -1
  111. package/dist/node-dev/Image.mjs.map +1 -1
  112. package/dist/node-dev/MediaFile.js.map +1 -1
  113. package/dist/node-dev/MediaFile.mjs.map +1 -1
  114. package/dist/node-dev/ModelViewer.js.map +1 -1
  115. package/dist/node-dev/ModelViewer.mjs.map +1 -1
  116. package/dist/node-dev/ProductPrice.js.map +1 -1
  117. package/dist/node-dev/ProductPrice.mjs.map +1 -1
  118. package/dist/node-dev/ProductProvider.js.map +1 -1
  119. package/dist/node-dev/ProductProvider.mjs.map +1 -1
  120. package/dist/node-dev/ShopPayButton.js +9 -9
  121. package/dist/node-dev/ShopPayButton.js.map +1 -1
  122. package/dist/node-dev/ShopPayButton.mjs +10 -10
  123. package/dist/node-dev/ShopPayButton.mjs.map +1 -1
  124. package/dist/node-dev/ShopifyProvider.js +9 -21
  125. package/dist/node-dev/ShopifyProvider.js.map +1 -1
  126. package/dist/node-dev/ShopifyProvider.mjs +9 -21
  127. package/dist/node-dev/ShopifyProvider.mjs.map +1 -1
  128. package/dist/node-dev/analytics-constants.js +43 -0
  129. package/dist/node-dev/analytics-constants.js.map +1 -0
  130. package/dist/node-dev/analytics-constants.mjs +43 -0
  131. package/dist/node-dev/analytics-constants.mjs.map +1 -0
  132. package/dist/node-dev/analytics-schema-custom-storefront-customer-tracking.js +145 -0
  133. package/dist/node-dev/analytics-schema-custom-storefront-customer-tracking.js.map +1 -0
  134. package/dist/node-dev/analytics-schema-custom-storefront-customer-tracking.mjs +145 -0
  135. package/dist/node-dev/analytics-schema-custom-storefront-customer-tracking.mjs.map +1 -0
  136. package/dist/node-dev/analytics-schema-trekkie-storefront-page-view.js +58 -0
  137. package/dist/node-dev/analytics-schema-trekkie-storefront-page-view.js.map +1 -0
  138. package/dist/node-dev/analytics-schema-trekkie-storefront-page-view.mjs +58 -0
  139. package/dist/node-dev/analytics-schema-trekkie-storefront-page-view.mjs.map +1 -0
  140. package/dist/node-dev/analytics-utils.js +49 -0
  141. package/dist/node-dev/analytics-utils.js.map +1 -0
  142. package/dist/node-dev/analytics-utils.mjs +49 -0
  143. package/dist/node-dev/analytics-utils.mjs.map +1 -0
  144. package/dist/node-dev/analytics.js +159 -0
  145. package/dist/node-dev/analytics.js.map +1 -0
  146. package/dist/node-dev/analytics.mjs +159 -0
  147. package/dist/node-dev/analytics.mjs.map +1 -0
  148. package/dist/node-dev/cart-hooks.js +4 -6
  149. package/dist/node-dev/cart-hooks.js.map +1 -1
  150. package/dist/node-dev/cart-hooks.mjs +5 -7
  151. package/dist/node-dev/cart-hooks.mjs.map +1 -1
  152. package/dist/node-dev/cookies-utils.js +50 -0
  153. package/dist/node-dev/cookies-utils.js.map +1 -0
  154. package/dist/node-dev/cookies-utils.mjs +50 -0
  155. package/dist/node-dev/cookies-utils.mjs.map +1 -0
  156. package/dist/node-dev/index.js +20 -2
  157. package/dist/node-dev/index.js.map +1 -1
  158. package/dist/node-dev/index.mjs +20 -2
  159. package/dist/node-dev/index.mjs.map +1 -1
  160. package/dist/node-dev/parse-metafield.js.map +1 -1
  161. package/dist/node-dev/parse-metafield.mjs.map +1 -1
  162. package/dist/node-dev/storefront-client.js +13 -12
  163. package/dist/node-dev/storefront-client.js.map +1 -1
  164. package/dist/node-dev/storefront-client.mjs +13 -12
  165. package/dist/node-dev/storefront-client.mjs.map +1 -1
  166. package/dist/node-dev/useMoney.js +2 -1
  167. package/dist/node-dev/useMoney.js.map +1 -1
  168. package/dist/node-dev/useMoney.mjs +2 -1
  169. package/dist/node-dev/useMoney.mjs.map +1 -1
  170. package/dist/node-dev/useShopifyCookies.js +41 -0
  171. package/dist/node-dev/useShopifyCookies.js.map +1 -0
  172. package/dist/node-dev/useShopifyCookies.mjs +41 -0
  173. package/dist/node-dev/useShopifyCookies.mjs.map +1 -0
  174. package/dist/node-prod/AddToCartButton.js.map +1 -1
  175. package/dist/node-prod/AddToCartButton.mjs.map +1 -1
  176. package/dist/node-prod/BuyNowButton.js.map +1 -1
  177. package/dist/node-prod/BuyNowButton.mjs.map +1 -1
  178. package/dist/node-prod/CartCheckoutButton.js.map +1 -1
  179. package/dist/node-prod/CartCheckoutButton.mjs.map +1 -1
  180. package/dist/node-prod/CartCost.js +25 -0
  181. package/dist/node-prod/CartCost.js.map +1 -0
  182. package/dist/node-prod/CartCost.mjs +25 -0
  183. package/dist/node-prod/CartCost.mjs.map +1 -0
  184. package/dist/node-prod/CartLinePrice.js +18 -0
  185. package/dist/node-prod/CartLinePrice.js.map +1 -0
  186. package/dist/node-prod/CartLinePrice.mjs +18 -0
  187. package/dist/node-prod/CartLinePrice.mjs.map +1 -0
  188. package/dist/node-prod/CartLineProvider.js +19 -0
  189. package/dist/node-prod/CartLineProvider.js.map +1 -0
  190. package/dist/node-prod/CartLineProvider.mjs +19 -0
  191. package/dist/node-prod/CartLineProvider.mjs.map +1 -0
  192. package/dist/node-prod/CartProvider.js.map +1 -1
  193. package/dist/node-prod/CartProvider.mjs.map +1 -1
  194. package/dist/node-prod/ExternalVideo.js.map +1 -1
  195. package/dist/node-prod/ExternalVideo.mjs.map +1 -1
  196. package/dist/node-prod/Image.js.map +1 -1
  197. package/dist/node-prod/Image.mjs.map +1 -1
  198. package/dist/node-prod/MediaFile.js.map +1 -1
  199. package/dist/node-prod/MediaFile.mjs.map +1 -1
  200. package/dist/node-prod/ModelViewer.js.map +1 -1
  201. package/dist/node-prod/ModelViewer.mjs.map +1 -1
  202. package/dist/node-prod/ProductPrice.js.map +1 -1
  203. package/dist/node-prod/ProductPrice.mjs.map +1 -1
  204. package/dist/node-prod/ProductProvider.js.map +1 -1
  205. package/dist/node-prod/ProductProvider.mjs.map +1 -1
  206. package/dist/node-prod/ShopPayButton.js +9 -9
  207. package/dist/node-prod/ShopPayButton.js.map +1 -1
  208. package/dist/node-prod/ShopPayButton.mjs +10 -10
  209. package/dist/node-prod/ShopPayButton.mjs.map +1 -1
  210. package/dist/node-prod/ShopifyProvider.js +9 -16
  211. package/dist/node-prod/ShopifyProvider.js.map +1 -1
  212. package/dist/node-prod/ShopifyProvider.mjs +9 -16
  213. package/dist/node-prod/ShopifyProvider.mjs.map +1 -1
  214. package/dist/node-prod/analytics-constants.js +43 -0
  215. package/dist/node-prod/analytics-constants.js.map +1 -0
  216. package/dist/node-prod/analytics-constants.mjs +43 -0
  217. package/dist/node-prod/analytics-constants.mjs.map +1 -0
  218. package/dist/node-prod/analytics-schema-custom-storefront-customer-tracking.js +145 -0
  219. package/dist/node-prod/analytics-schema-custom-storefront-customer-tracking.js.map +1 -0
  220. package/dist/node-prod/analytics-schema-custom-storefront-customer-tracking.mjs +145 -0
  221. package/dist/node-prod/analytics-schema-custom-storefront-customer-tracking.mjs.map +1 -0
  222. package/dist/node-prod/analytics-schema-trekkie-storefront-page-view.js +58 -0
  223. package/dist/node-prod/analytics-schema-trekkie-storefront-page-view.js.map +1 -0
  224. package/dist/node-prod/analytics-schema-trekkie-storefront-page-view.mjs +58 -0
  225. package/dist/node-prod/analytics-schema-trekkie-storefront-page-view.mjs.map +1 -0
  226. package/dist/node-prod/analytics-utils.js +49 -0
  227. package/dist/node-prod/analytics-utils.js.map +1 -0
  228. package/dist/node-prod/analytics-utils.mjs +49 -0
  229. package/dist/node-prod/analytics-utils.mjs.map +1 -0
  230. package/dist/node-prod/analytics.js +158 -0
  231. package/dist/node-prod/analytics.js.map +1 -0
  232. package/dist/node-prod/analytics.mjs +158 -0
  233. package/dist/node-prod/analytics.mjs.map +1 -0
  234. package/dist/node-prod/cart-hooks.js +4 -6
  235. package/dist/node-prod/cart-hooks.js.map +1 -1
  236. package/dist/node-prod/cart-hooks.mjs +5 -7
  237. package/dist/node-prod/cart-hooks.mjs.map +1 -1
  238. package/dist/node-prod/cookies-utils.js +50 -0
  239. package/dist/node-prod/cookies-utils.js.map +1 -0
  240. package/dist/node-prod/cookies-utils.mjs +50 -0
  241. package/dist/node-prod/cookies-utils.mjs.map +1 -0
  242. package/dist/node-prod/index.js +20 -2
  243. package/dist/node-prod/index.js.map +1 -1
  244. package/dist/node-prod/index.mjs +20 -2
  245. package/dist/node-prod/index.mjs.map +1 -1
  246. package/dist/node-prod/parse-metafield.js.map +1 -1
  247. package/dist/node-prod/parse-metafield.mjs.map +1 -1
  248. package/dist/node-prod/storefront-client.js +13 -12
  249. package/dist/node-prod/storefront-client.js.map +1 -1
  250. package/dist/node-prod/storefront-client.mjs +13 -12
  251. package/dist/node-prod/storefront-client.mjs.map +1 -1
  252. package/dist/node-prod/useMoney.js +2 -1
  253. package/dist/node-prod/useMoney.js.map +1 -1
  254. package/dist/node-prod/useMoney.mjs +2 -1
  255. package/dist/node-prod/useMoney.mjs.map +1 -1
  256. package/dist/node-prod/useShopifyCookies.js +41 -0
  257. package/dist/node-prod/useShopifyCookies.js.map +1 -0
  258. package/dist/node-prod/useShopifyCookies.mjs +41 -0
  259. package/dist/node-prod/useShopifyCookies.mjs.map +1 -0
  260. package/dist/types/AddToCartButton.d.ts +3 -2
  261. package/dist/types/BuyNowButton.d.ts +7 -3
  262. package/dist/types/CartCheckoutButton.d.ts +6 -5
  263. package/dist/types/CartCost.d.ts +7 -5
  264. package/dist/types/CartLinePrice.d.ts +4 -4
  265. package/dist/types/CartLineProvider.d.ts +8 -6
  266. package/dist/types/CartProvider.d.ts +12 -2
  267. package/dist/types/ExternalVideo.d.ts +1 -2
  268. package/dist/types/Image.d.ts +5 -3
  269. package/dist/types/MediaFile.d.ts +12 -11
  270. package/dist/types/ModelViewer.d.ts +2 -2
  271. package/dist/types/ProductPrice.d.ts +1 -1
  272. package/dist/types/ProductProvider.d.ts +1 -1
  273. package/dist/types/ShopPayButton.d.ts +10 -10
  274. package/dist/types/ShopifyProvider.d.ts +35 -39
  275. package/dist/types/analytics-constants.d.ts +48 -0
  276. package/dist/types/analytics-schema-custom-storefront-customer-tracking.d.ts +3 -0
  277. package/dist/types/analytics-schema-trekkie-storefront-page-view.d.ts +2 -0
  278. package/dist/types/analytics-types.d.ts +108 -0
  279. package/dist/types/analytics-utils.d.ts +36 -0
  280. package/dist/types/analytics.d.ts +9 -0
  281. package/dist/types/cookies-utils.d.ts +4 -0
  282. package/dist/types/index.d.cts +11 -3
  283. package/dist/types/index.d.ts +11 -3
  284. package/dist/types/parse-metafield.d.ts +1 -3
  285. package/dist/types/storefront-client.d.ts +14 -14
  286. package/dist/types/useShopifyCookies.d.ts +14 -0
  287. package/dist/umd/hydrogen-react.dev.js +704 -172
  288. package/dist/umd/hydrogen-react.dev.js.map +1 -1
  289. package/dist/umd/hydrogen-react.prod.js +18 -16
  290. package/dist/umd/hydrogen-react.prod.js.map +1 -1
  291. package/package.json +12 -7
@@ -1,5 +1,5 @@
1
1
  (function(global, factory) {
2
- typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("react")) : typeof define === "function" && define.amd ? define(["exports", "react"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global.hydrogenreact = {}, global.React));
2
+ typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("react")) : typeof define === "function" && define.amd ? define(["exports", "react"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global.storefrontkitreact = {}, global.React));
3
3
  })(this, function(exports2, React) {
4
4
  "use strict";
5
5
  function _interopNamespaceDefault(e2) {
@@ -140,7 +140,7 @@
140
140
  } };
141
141
  return y;
142
142
  }
143
- var l = function(t2, n2) {
143
+ var l$1 = function(t2, n2) {
144
144
  return t2.actions.forEach(function(e2) {
145
145
  var r2 = e2.exec;
146
146
  return r2 && r2(t2.context, n2);
@@ -148,7 +148,7 @@
148
148
  };
149
149
  function v(t2) {
150
150
  var r2 = t2.initialState, i2 = n.NotStarted, o2 = /* @__PURE__ */ new Set(), c2 = { _machine: t2, send: function(e2) {
151
- i2 === n.Running && (r2 = t2.transition(r2, e2), l(r2, u$1(e2)), o2.forEach(function(t3) {
151
+ i2 === n.Running && (r2 = t2.transition(r2, e2), l$1(r2, u$1(e2)), o2.forEach(function(t3) {
152
152
  return t3(r2);
153
153
  }));
154
154
  }, subscribe: function(t3) {
@@ -161,7 +161,7 @@
161
161
  r2 = { value: u2.value, actions: [], context: u2.context, matches: a(u2.value) };
162
162
  } else
163
163
  r2 = t2.initialState;
164
- return i2 = n.Running, l(r2, e), c2;
164
+ return i2 = n.Running, l$1(r2, e), c2;
165
165
  }, stop: function() {
166
166
  return i2 = n.Stopped, o2.clear(), c2;
167
167
  }, get state() {
@@ -949,13 +949,6 @@
949
949
  `
950
950
  );
951
951
  const SFAPI_VERSION = "2023-01";
952
- const warnings = /* @__PURE__ */ new Set();
953
- const warnOnce = (string) => {
954
- if (!warnings.has(string)) {
955
- console.warn(string);
956
- warnings.add(string);
957
- }
958
- };
959
952
  function createStorefrontClient({
960
953
  storeDomain,
961
954
  privateStorefrontToken,
@@ -965,7 +958,7 @@
965
958
  }) {
966
959
  if (storefrontApiVersion !== SFAPI_VERSION) {
967
960
  warnOnce(
968
- `StorefrontClient: The Storefront API version that you're using is different than the version this build of Hydrogen-UI is targeting. You may run into unexpected errors if these versions don't match. Received verion: "${storefrontApiVersion}"; expected version "${SFAPI_VERSION}"`
961
+ `StorefrontClient: The Storefront API version that you're using is different than the version this build of Hydrogen React is targeting. You may run into unexpected errors if these versions don't match. Received verion: "${storefrontApiVersion}"; expected version "${SFAPI_VERSION}"`
969
962
  );
970
963
  }
971
964
  if (!privateStorefrontToken && !globalThis.document) {
@@ -980,10 +973,11 @@
980
973
  }
981
974
  return {
982
975
  getShopifyDomain(overrideProps) {
983
- return `https://${(overrideProps == null ? void 0 : overrideProps.storeDomain) ?? storeDomain}.myshopify.com`;
976
+ return (overrideProps == null ? void 0 : overrideProps.storeDomain) ?? storeDomain;
984
977
  },
985
978
  getStorefrontApiUrl(overrideProps) {
986
- return `https://${(overrideProps == null ? void 0 : overrideProps.storeDomain) ?? storeDomain}.myshopify.com/api/${(overrideProps == null ? void 0 : overrideProps.storefrontApiVersion) ?? storefrontApiVersion}/graphql.json`;
979
+ const finalDomainUrl = (overrideProps == null ? void 0 : overrideProps.storeDomain) ?? storeDomain;
980
+ return `${finalDomainUrl}${finalDomainUrl.endsWith("/") ? "" : "/"}api/${(overrideProps == null ? void 0 : overrideProps.storefrontApiVersion) ?? storefrontApiVersion}/graphql.json`;
987
981
  },
988
982
  getPrivateTokenHeaders(overrideProps) {
989
983
  if (!privateStorefrontToken && !(overrideProps == null ? void 0 : overrideProps.privateStorefrontToken)) {
@@ -1000,7 +994,7 @@
1000
994
  return {
1001
995
  // default to json
1002
996
  "content-type": finalContentType === "graphql" ? "application/graphql" : "application/json",
1003
- "X-SDK-Variant": "hydrogen-ui",
997
+ "X-SDK-Variant": "hydrogen-react",
1004
998
  "X-SDK-Variant-Source": "react",
1005
999
  "X-SDK-Version": storefrontApiVersion,
1006
1000
  "Shopify-Storefront-Private-Token": (overrideProps == null ? void 0 : overrideProps.privateStorefrontToken) ?? privateStorefrontToken ?? "",
@@ -1026,23 +1020,25 @@
1026
1020
  return {
1027
1021
  // default to json
1028
1022
  "content-type": contentType === "graphql" ? "application/graphql" : "application/json",
1029
- "X-SDK-Variant": "hydrogen-ui",
1023
+ "X-SDK-Variant": "hydrogen-react",
1030
1024
  "X-SDK-Variant-Source": "react",
1031
1025
  "X-SDK-Version": storefrontApiVersion,
1032
1026
  "X-Shopify-Storefront-Access-Token": accessToken
1033
1027
  };
1034
1028
  }
1029
+ const warnings = /* @__PURE__ */ new Set();
1030
+ const warnOnce = (string) => {
1031
+ if (!warnings.has(string)) {
1032
+ console.warn(string);
1033
+ warnings.add(string);
1034
+ }
1035
+ };
1035
1036
  const ShopifyContext = React.createContext({
1036
1037
  storeDomain: "test",
1037
1038
  storefrontToken: "abc123",
1038
1039
  storefrontApiVersion: SFAPI_VERSION,
1039
- country: {
1040
- isoCode: "US"
1041
- },
1042
- language: {
1043
- isoCode: "EN"
1044
- },
1045
- locale: "EN-US",
1040
+ countryIsoCode: "US",
1041
+ languageIsoCode: "EN",
1046
1042
  getStorefrontApiUrl() {
1047
1043
  return "";
1048
1044
  },
@@ -1055,16 +1051,16 @@
1055
1051
  });
1056
1052
  function ShopifyProvider({
1057
1053
  children,
1058
- shopifyConfig
1054
+ ...shopifyConfig
1059
1055
  }) {
1060
- if (!shopifyConfig) {
1056
+ if (!shopifyConfig.countryIsoCode || !shopifyConfig.languageIsoCode || !shopifyConfig.storeDomain || !shopifyConfig.storefrontToken || !shopifyConfig.storefrontApiVersion) {
1061
1057
  throw new Error(
1062
- `The 'shopifyConfig' prop must be passed to '<ShopifyProvider/>'`
1058
+ `Please provide the necessary props to '<ShopifyProvider/>'`
1063
1059
  );
1064
1060
  }
1065
1061
  if (shopifyConfig.storefrontApiVersion !== SFAPI_VERSION) {
1066
1062
  console.warn(
1067
- `<ShopifyProvider/>: This version of Hydrogen-UI is built for Shopify's Storefront API version ${SFAPI_VERSION}, but it looks like you're using version ${shopifyConfig.storefrontApiVersion}. There may be issues or bugs if you use a mismatched version of Hydrogen-UI and the Storefront API.`
1063
+ `<ShopifyProvider/>: This version of Hydrogen React is built for Shopify's Storefront API version ${SFAPI_VERSION}, but it looks like you're using version ${shopifyConfig.storefrontApiVersion}. There may be issues or bugs if you use a mismatched version of Hydrogen React and the Storefront API.`
1068
1064
  );
1069
1065
  }
1070
1066
  const finalConfig = React.useMemo(() => {
@@ -1082,17 +1078,10 @@
1082
1078
  },
1083
1079
  getShopifyDomain,
1084
1080
  getStorefrontApiUrl(overrideProps) {
1085
- var _a;
1086
- if ((_a = overrideProps == null ? void 0 : overrideProps.storeDomain) == null ? void 0 : _a.includes(".myshopify.com")) {
1087
- {
1088
- console.warn(
1089
- `<ShopifyProvider/>: passing a 'storeDomain' prop that includes '.myshopify.com' will be unsupported in the future. Passing only the subdomain (for example, if the URL is 'test.myshopify.com', passing in 'test') will be the supported way going forward.`
1090
- );
1091
- }
1092
- }
1093
- return `${getShopifyDomain({
1081
+ const finalDomainUrl = getShopifyDomain({
1094
1082
  storeDomain: (overrideProps == null ? void 0 : overrideProps.storeDomain) ?? shopifyConfig.storeDomain
1095
- })}/api/${(overrideProps == null ? void 0 : overrideProps.storefrontApiVersion) ?? shopifyConfig.storefrontApiVersion}/graphql.json`;
1083
+ });
1084
+ return `${finalDomainUrl}${finalDomainUrl.endsWith("/") ? "" : "/"}api/${(overrideProps == null ? void 0 : overrideProps.storefrontApiVersion) ?? shopifyConfig.storefrontApiVersion}/graphql.json`;
1096
1085
  }
1097
1086
  };
1098
1087
  }, [shopifyConfig]);
@@ -1134,6 +1123,52 @@
1134
1123
  (s2 = t2.trim().toLowerCase()) && (s2 === "httponly" || s2 === "secure") && (r2[s2] = true);
1135
1124
  return r2;
1136
1125
  }
1126
+ function l(a2, r2, e2 = {}) {
1127
+ let t2 = a2 + "=" + encodeURIComponent(r2);
1128
+ return e2.expires && (t2 += "; Expires=" + new Date(e2.expires).toUTCString()), e2.maxage != null && e2.maxage >= 0 && (t2 += "; Max-Age=" + (e2.maxage | 0)), e2.domain && (t2 += "; Domain=" + e2.domain), e2.path && (t2 += "; Path=" + e2.path), e2.samesite && (t2 += "; SameSite=" + e2.samesite), (e2.secure || e2.samesite === "None") && (t2 += "; Secure"), e2.httponly && (t2 += "; HttpOnly"), t2;
1129
+ }
1130
+ const tokenHash = "xxxx-4xxx-xxxx-xxxxxxxxxxxx";
1131
+ function buildUUID() {
1132
+ let hash = "";
1133
+ try {
1134
+ const crypto = window.crypto;
1135
+ const randomValuesArray = new Uint16Array(31);
1136
+ crypto.getRandomValues(randomValuesArray);
1137
+ let i2 = 0;
1138
+ hash = tokenHash.replace(/[x]/g, (c2) => {
1139
+ const r2 = randomValuesArray[i2] % 16;
1140
+ const v2 = c2 === "x" ? r2 : r2 & 3 | 8;
1141
+ i2++;
1142
+ return v2.toString(16);
1143
+ }).toUpperCase();
1144
+ } catch (err) {
1145
+ hash = tokenHash.replace(/[x]/g, (c2) => {
1146
+ const r2 = Math.random() * 16 | 0;
1147
+ const v2 = c2 === "x" ? r2 : r2 & 3 | 8;
1148
+ return v2.toString(16);
1149
+ }).toUpperCase();
1150
+ }
1151
+ return `${hexTime()}-${hash}`;
1152
+ }
1153
+ function hexTime() {
1154
+ let dateNumber = 0;
1155
+ let perfNumber = 0;
1156
+ dateNumber = new Date().getTime() >>> 0;
1157
+ try {
1158
+ perfNumber = performance.now() >>> 0;
1159
+ } catch (err) {
1160
+ perfNumber = 0;
1161
+ }
1162
+ const output = Math.abs(dateNumber + perfNumber).toString(16).toLowerCase();
1163
+ return output.padStart(8 - output.length, "0");
1164
+ }
1165
+ function getShopifyCookies(cookies) {
1166
+ const cookieData = u(cookies);
1167
+ return {
1168
+ [SHOPIFY_Y]: cookieData[SHOPIFY_Y] || "",
1169
+ [SHOPIFY_S]: cookieData[SHOPIFY_S] || ""
1170
+ };
1171
+ }
1137
1172
  function useCartFetch() {
1138
1173
  const { storefrontId, getPublicTokenHeaders, getStorefrontApiUrl } = useShop();
1139
1174
  return React.useCallback(
@@ -1145,11 +1180,9 @@
1145
1180
  if (storefrontId) {
1146
1181
  headers[SHOPIFY_STOREFRONT_ID_HEADER] = storefrontId;
1147
1182
  }
1148
- const cookieData = u(document.cookie);
1149
- if (cookieData[SHOPIFY_Y] && cookieData[SHOPIFY_S]) {
1150
- headers[SHOPIFY_STOREFRONT_Y_HEADER] = cookieData[SHOPIFY_Y];
1151
- headers[SHOPIFY_STOREFRONT_S_HEADER] = cookieData[SHOPIFY_S];
1152
- }
1183
+ const cookieData = getShopifyCookies(document.cookie);
1184
+ headers[SHOPIFY_STOREFRONT_Y_HEADER] = cookieData[SHOPIFY_Y];
1185
+ headers[SHOPIFY_STOREFRONT_S_HEADER] = cookieData[SHOPIFY_S];
1153
1186
  return fetch(getStorefrontApiUrl(), {
1154
1187
  method: "POST",
1155
1188
  headers,
@@ -2315,6 +2348,420 @@
2315
2348
  addingItem ? accessibleAddingToCartLabel : null
2316
2349
  ) : null);
2317
2350
  }
2351
+ const AnalyticsEventName = {
2352
+ PAGE_VIEW: "PAGE_VIEW",
2353
+ ADD_TO_CART: "ADD_TO_CART"
2354
+ };
2355
+ const AnalyticsPageType = {
2356
+ article: "article",
2357
+ blog: "blog",
2358
+ captcha: "captcha",
2359
+ cart: "cart",
2360
+ collection: "collection",
2361
+ customersAccount: "customers/account",
2362
+ customersActivateAccount: "customers/activate_account",
2363
+ customersAddresses: "customers/addresses",
2364
+ customersLogin: "customers/login",
2365
+ customersOrder: "customers/order",
2366
+ customersRegister: "customers/register",
2367
+ customersResetPassword: "customers/reset_password",
2368
+ giftCard: "gift_card",
2369
+ home: "index",
2370
+ listCollections: "list-collections",
2371
+ forbidden: "403",
2372
+ notFound: "404",
2373
+ page: "page",
2374
+ password: "password",
2375
+ product: "product",
2376
+ policy: "policy",
2377
+ search: "search"
2378
+ };
2379
+ const ShopifySalesChannel = {
2380
+ hydrogen: "hydrogen",
2381
+ headless: "headless"
2382
+ };
2383
+ const ShopifyAppId = {
2384
+ hydrogen: "6167201",
2385
+ headless: "12875497473"
2386
+ };
2387
+ function schemaWrapper(schemaId, payload) {
2388
+ return {
2389
+ schema_id: schemaId,
2390
+ payload,
2391
+ metadata: {
2392
+ event_created_at_ms: Date.now()
2393
+ }
2394
+ };
2395
+ }
2396
+ function parseGid(gid) {
2397
+ const defaultReturn = { id: "", resource: null };
2398
+ if (typeof gid !== "string") {
2399
+ return defaultReturn;
2400
+ }
2401
+ const matches = gid.match(/^gid:\/\/shopify\/(\w+)\/([a-z0-9]+)/);
2402
+ if (!matches || matches.length === 1) {
2403
+ return defaultReturn;
2404
+ }
2405
+ const id = matches[2] ?? null;
2406
+ const resource = matches[1] ?? null;
2407
+ return { id, resource };
2408
+ }
2409
+ function addDataIf(keyValuePairs, formattedData) {
2410
+ if (typeof keyValuePairs !== "object") {
2411
+ return {};
2412
+ }
2413
+ Object.entries(keyValuePairs).forEach(([key, value]) => {
2414
+ if (value) {
2415
+ formattedData[key] = value;
2416
+ }
2417
+ });
2418
+ return formattedData;
2419
+ }
2420
+ function errorIfServer(fnName) {
2421
+ if (typeof document === "undefined") {
2422
+ console.error(
2423
+ `${fnName} should only be used within the useEffect callback or event handlers`
2424
+ );
2425
+ return true;
2426
+ }
2427
+ return false;
2428
+ }
2429
+ const SCHEMA_ID$1 = "trekkie_storefront_page_view/1.4";
2430
+ const OXYGEN_DOMAIN = "myshopify.dev";
2431
+ function pageView$1(payload) {
2432
+ const pageViewPayload = payload;
2433
+ const { id, resource } = parseGid(pageViewPayload.resourceId);
2434
+ const resourceType = resource ? resource.toLowerCase() : void 0;
2435
+ return [
2436
+ schemaWrapper(
2437
+ SCHEMA_ID$1,
2438
+ addDataIf(
2439
+ {
2440
+ pageType: pageViewPayload.pageType,
2441
+ customerId: pageViewPayload.customerId,
2442
+ resourceType,
2443
+ resourceId: parseInt(id)
2444
+ },
2445
+ formatPayload$1(pageViewPayload)
2446
+ )
2447
+ )
2448
+ ];
2449
+ }
2450
+ function formatPayload$1(payload) {
2451
+ return {
2452
+ appClientId: payload.shopifySalesChannel ? ShopifyAppId[payload.shopifySalesChannel] : ShopifyAppId.headless,
2453
+ isMerchantRequest: isMerchantRequest(payload.url),
2454
+ hydrogenSubchannelId: payload.storefrontId || "0",
2455
+ isPersistentCookie: payload.hasUserConsent,
2456
+ uniqToken: payload.uniqueToken,
2457
+ visitToken: payload.visitToken,
2458
+ microSessionId: buildUUID(),
2459
+ microSessionCount: 1,
2460
+ url: payload.url,
2461
+ path: payload.path,
2462
+ search: payload.search,
2463
+ referrer: payload.referrer,
2464
+ title: payload.title,
2465
+ shopId: parseInt(parseGid(payload.shopId).id),
2466
+ currency: payload.currency,
2467
+ contentLanguage: payload.acceptedLanguage || "en"
2468
+ };
2469
+ }
2470
+ function isMerchantRequest(url) {
2471
+ if (typeof url !== "string") {
2472
+ return false;
2473
+ }
2474
+ const hostname = new URL(url).hostname;
2475
+ if (hostname.indexOf(OXYGEN_DOMAIN) !== -1 || hostname === "localhost") {
2476
+ return true;
2477
+ }
2478
+ return false;
2479
+ }
2480
+ const SCHEMA_ID = "custom_storefront_customer_tracking/1.0";
2481
+ const PAGE_RENDERED_EVENT_NAME = "page_rendered";
2482
+ const COLLECTION_PAGE_RENDERED_EVENT_NAME = "collection_page_rendered";
2483
+ const PRODUCT_PAGE_RENDERED_EVENT_NAME = "product_page_rendered";
2484
+ const PRODUCT_ADDED_TO_CART_EVENT_NAME = "product_added_to_cart";
2485
+ const SEARCH_SUBMITTED_EVENT_NAME = "search_submitted";
2486
+ function pageView(payload) {
2487
+ const pageViewPayload = payload;
2488
+ const additionalPayload = {
2489
+ canonical_url: pageViewPayload.canonicalUrl || pageViewPayload.url,
2490
+ customer_id: pageViewPayload.customerId
2491
+ };
2492
+ const pageType = pageViewPayload.pageType;
2493
+ const pageViewEvents = [];
2494
+ pageViewEvents.push(
2495
+ schemaWrapper(
2496
+ SCHEMA_ID,
2497
+ addDataIf(
2498
+ {
2499
+ event_name: PAGE_RENDERED_EVENT_NAME,
2500
+ ...additionalPayload
2501
+ },
2502
+ formatPayload(pageViewPayload)
2503
+ )
2504
+ )
2505
+ );
2506
+ switch (pageType) {
2507
+ case AnalyticsPageType.collection:
2508
+ pageViewEvents.push(
2509
+ schemaWrapper(
2510
+ SCHEMA_ID,
2511
+ addDataIf(
2512
+ {
2513
+ event_name: COLLECTION_PAGE_RENDERED_EVENT_NAME,
2514
+ ...additionalPayload,
2515
+ collection_name: pageViewPayload.collectionHandle
2516
+ },
2517
+ formatPayload(pageViewPayload)
2518
+ )
2519
+ )
2520
+ );
2521
+ break;
2522
+ case AnalyticsPageType.product:
2523
+ pageViewEvents.push(
2524
+ schemaWrapper(
2525
+ SCHEMA_ID,
2526
+ addDataIf(
2527
+ {
2528
+ event_name: PRODUCT_PAGE_RENDERED_EVENT_NAME,
2529
+ ...additionalPayload,
2530
+ products: formatProductPayload(pageViewPayload.products),
2531
+ total_value: pageViewPayload.totalValue
2532
+ },
2533
+ formatPayload(pageViewPayload)
2534
+ )
2535
+ )
2536
+ );
2537
+ break;
2538
+ case AnalyticsPageType.search:
2539
+ pageViewEvents.push(
2540
+ schemaWrapper(
2541
+ SCHEMA_ID,
2542
+ addDataIf(
2543
+ {
2544
+ event_name: SEARCH_SUBMITTED_EVENT_NAME,
2545
+ ...additionalPayload,
2546
+ search_string: pageViewPayload.searchString
2547
+ },
2548
+ formatPayload(pageViewPayload)
2549
+ )
2550
+ )
2551
+ );
2552
+ break;
2553
+ }
2554
+ return pageViewEvents;
2555
+ }
2556
+ function addToCart(payload) {
2557
+ const addToCartPayload = payload;
2558
+ const cartToken = parseGid(addToCartPayload.cartId);
2559
+ const cart_token = (cartToken == null ? void 0 : cartToken.id) ? `${cartToken.id}` : null;
2560
+ return [
2561
+ schemaWrapper(
2562
+ SCHEMA_ID,
2563
+ addDataIf(
2564
+ {
2565
+ event_name: PRODUCT_ADDED_TO_CART_EVENT_NAME,
2566
+ customerId: addToCartPayload.customerId,
2567
+ cart_token,
2568
+ total_value: addToCartPayload.totalValue,
2569
+ products: formatProductPayload(addToCartPayload.products)
2570
+ },
2571
+ formatPayload(addToCartPayload)
2572
+ )
2573
+ )
2574
+ ];
2575
+ }
2576
+ function formatPayload(payload) {
2577
+ return {
2578
+ source: payload.shopifySalesChannel || ShopifySalesChannel.headless,
2579
+ hydrogenSubchannelId: payload.storefrontId || "0",
2580
+ is_persistent_cookie: payload.hasUserConsent,
2581
+ ccpa_enforced: false,
2582
+ gdpr_enforced: false,
2583
+ unique_token: payload.uniqueToken,
2584
+ event_time: Date.now(),
2585
+ event_id: buildUUID(),
2586
+ event_source_url: payload.url,
2587
+ referrer: payload.referrer,
2588
+ user_agent: payload.userAgent,
2589
+ navigation_type: payload.navigationType,
2590
+ navigation_api: payload.navigationApi,
2591
+ shop_id: parseInt(parseGid(payload.shopId).id),
2592
+ currency: payload.currency
2593
+ };
2594
+ }
2595
+ function formatProductPayload(products) {
2596
+ return products ? products.map((p) => {
2597
+ const product = addDataIf(
2598
+ {
2599
+ variant_gid: p.variantGid,
2600
+ category: p.category,
2601
+ sku: p.sku,
2602
+ product_id: parseInt(parseGid(p.productGid).id),
2603
+ variant_id: parseInt(parseGid(p.variantGid).id)
2604
+ },
2605
+ {
2606
+ product_gid: p.productGid,
2607
+ name: p.name,
2608
+ variant: p.variantName || "",
2609
+ brand: p.brand,
2610
+ price: p.price,
2611
+ quantity: Number(p.quantity || 0)
2612
+ }
2613
+ );
2614
+ return JSON.stringify(product);
2615
+ }) : [];
2616
+ }
2617
+ function sendShopifyAnalytics(event, shopDomain) {
2618
+ const { eventName, payload } = event;
2619
+ if (!payload.hasUserConsent)
2620
+ return Promise.resolve();
2621
+ let events = [];
2622
+ if (eventName === AnalyticsEventName.PAGE_VIEW) {
2623
+ const pageViewPayload = payload;
2624
+ events = events.concat(
2625
+ pageView$1(pageViewPayload),
2626
+ pageView(pageViewPayload)
2627
+ );
2628
+ } else if (eventName === AnalyticsEventName.ADD_TO_CART) {
2629
+ events = events.concat(
2630
+ addToCart(payload)
2631
+ );
2632
+ }
2633
+ if (events.length) {
2634
+ return sendToShopify(events, shopDomain);
2635
+ } else {
2636
+ return Promise.resolve();
2637
+ }
2638
+ }
2639
+ const ERROR_MESSAGE = "sendShopifyAnalytics request is unsuccessful";
2640
+ function sendToShopify(events, shopDomain) {
2641
+ const eventsToBeSent = {
2642
+ events,
2643
+ metadata: {
2644
+ event_sent_at_ms: Date.now()
2645
+ }
2646
+ };
2647
+ try {
2648
+ return fetch(
2649
+ shopDomain ? `https://${shopDomain}/.well-known/shopify/monorail/unstable/produce_batch` : "https://monorail-edge.shopifysvc.com/unstable/produce_batch",
2650
+ {
2651
+ method: "post",
2652
+ headers: {
2653
+ "content-type": "text/plain"
2654
+ },
2655
+ body: JSON.stringify(eventsToBeSent)
2656
+ }
2657
+ ).then((response) => {
2658
+ if (!response.ok) {
2659
+ throw new Error("Response failed");
2660
+ }
2661
+ return response.text();
2662
+ }).then((data) => {
2663
+ if (data) {
2664
+ const jsonResponse = JSON.parse(data);
2665
+ jsonResponse.result.forEach((eventResponse) => {
2666
+ if (eventResponse.status !== 200) {
2667
+ console.error(ERROR_MESSAGE, "\n\n", eventResponse.message);
2668
+ }
2669
+ });
2670
+ }
2671
+ }).catch((err) => {
2672
+ console.error(ERROR_MESSAGE, err);
2673
+ if (true) {
2674
+ throw new Error(ERROR_MESSAGE);
2675
+ }
2676
+ });
2677
+ } catch (error) {
2678
+ return Promise.resolve();
2679
+ }
2680
+ }
2681
+ function getClientBrowserParameters() {
2682
+ if (errorIfServer("getClientBrowserParameters")) {
2683
+ return {
2684
+ uniqueToken: "",
2685
+ visitToken: "",
2686
+ url: "",
2687
+ path: "",
2688
+ search: "",
2689
+ referrer: "",
2690
+ title: "",
2691
+ userAgent: "",
2692
+ navigationType: "",
2693
+ navigationApi: ""
2694
+ };
2695
+ }
2696
+ const [navigationType, navigationApi] = getNavigationType();
2697
+ const cookies = getShopifyCookies(document.cookie);
2698
+ return {
2699
+ uniqueToken: cookies[SHOPIFY_Y],
2700
+ visitToken: cookies[SHOPIFY_S],
2701
+ url: location.href,
2702
+ path: location.pathname,
2703
+ search: location.search,
2704
+ referrer: document.referrer,
2705
+ title: document.title,
2706
+ userAgent: navigator.userAgent,
2707
+ navigationType,
2708
+ navigationApi
2709
+ };
2710
+ }
2711
+ function getNavigationTypeExperimental() {
2712
+ try {
2713
+ const navigationEntries = (performance == null ? void 0 : performance.getEntriesByType) && (performance == null ? void 0 : performance.getEntriesByType("navigation"));
2714
+ if (navigationEntries && navigationEntries[0]) {
2715
+ const rawType = window.performance.getEntriesByType(
2716
+ "navigation"
2717
+ )[0]["type"];
2718
+ const navType = rawType && rawType.toString();
2719
+ return navType;
2720
+ }
2721
+ } catch (err) {
2722
+ }
2723
+ return void 0;
2724
+ }
2725
+ function getNavigationTypeLegacy() {
2726
+ var _a, _b;
2727
+ try {
2728
+ if (PerformanceNavigation && ((_a = performance == null ? void 0 : performance.navigation) == null ? void 0 : _a.type) !== null && ((_b = performance == null ? void 0 : performance.navigation) == null ? void 0 : _b.type) !== void 0) {
2729
+ const rawType = performance.navigation.type;
2730
+ switch (rawType) {
2731
+ case PerformanceNavigation.TYPE_NAVIGATE:
2732
+ return "navigate";
2733
+ break;
2734
+ case PerformanceNavigation.TYPE_RELOAD:
2735
+ return "reload";
2736
+ break;
2737
+ case PerformanceNavigation.TYPE_BACK_FORWARD:
2738
+ return "back_forward";
2739
+ break;
2740
+ default:
2741
+ return `unknown: ${rawType}`;
2742
+ }
2743
+ }
2744
+ } catch (err) {
2745
+ }
2746
+ return void 0;
2747
+ }
2748
+ function getNavigationType() {
2749
+ try {
2750
+ let navApi = "PerformanceNavigationTiming";
2751
+ let navType = getNavigationTypeExperimental();
2752
+ if (!navType) {
2753
+ navType = getNavigationTypeLegacy();
2754
+ navApi = "performance.navigation";
2755
+ }
2756
+ if (navType) {
2757
+ return [navType, navApi];
2758
+ } else {
2759
+ return ["unknown", "unknown"];
2760
+ }
2761
+ } catch (err) {
2762
+ }
2763
+ return ["error", "error"];
2764
+ }
2318
2765
  function BuyNowButton(props) {
2319
2766
  const { cartCreate, checkoutUrl } = useCart();
2320
2767
  const [loading, setLoading] = React.useState(false);
@@ -2373,6 +2820,170 @@
2373
2820
  children
2374
2821
  );
2375
2822
  }
2823
+ function useMoney(money) {
2824
+ const { countryIsoCode, languageIsoCode } = useShop();
2825
+ const locale = `${languageIsoCode}-${countryIsoCode}`;
2826
+ if (!locale) {
2827
+ throw new Error(
2828
+ `useMoney(): Unable to get 'locale' from 'useShop()', which means that 'locale' was not passed to '<ShopifyProvider/>'. 'locale' is required for 'useMoney()' to work`
2829
+ );
2830
+ }
2831
+ const amount = parseFloat(money.amount);
2832
+ const options = React.useMemo(
2833
+ () => ({
2834
+ style: "currency",
2835
+ currency: money.currencyCode
2836
+ }),
2837
+ [money.currencyCode]
2838
+ );
2839
+ const defaultFormatter = useLazyFormatter(locale, options);
2840
+ const nameFormatter = useLazyFormatter(locale, {
2841
+ ...options,
2842
+ currencyDisplay: "name"
2843
+ });
2844
+ const narrowSymbolFormatter = useLazyFormatter(locale, {
2845
+ ...options,
2846
+ currencyDisplay: "narrowSymbol"
2847
+ });
2848
+ const withoutTrailingZerosFormatter = useLazyFormatter(locale, {
2849
+ ...options,
2850
+ minimumFractionDigits: 0,
2851
+ maximumFractionDigits: 0
2852
+ });
2853
+ const withoutCurrencyFormatter = useLazyFormatter(locale);
2854
+ const withoutTrailingZerosOrCurrencyFormatter = useLazyFormatter(locale, {
2855
+ minimumFractionDigits: 0,
2856
+ maximumFractionDigits: 0
2857
+ });
2858
+ const isPartCurrency = (part) => part.type === "currency";
2859
+ const lazyFormatters = React.useMemo(
2860
+ () => ({
2861
+ original: () => money,
2862
+ currencyCode: () => money.currencyCode,
2863
+ localizedString: () => defaultFormatter().format(amount),
2864
+ parts: () => defaultFormatter().formatToParts(amount),
2865
+ withoutTrailingZeros: () => amount % 1 === 0 ? withoutTrailingZerosFormatter().format(amount) : defaultFormatter().format(amount),
2866
+ withoutTrailingZerosAndCurrency: () => amount % 1 === 0 ? withoutTrailingZerosOrCurrencyFormatter().format(amount) : withoutCurrencyFormatter().format(amount),
2867
+ currencyName: () => {
2868
+ var _a;
2869
+ return ((_a = nameFormatter().formatToParts(amount).find(isPartCurrency)) == null ? void 0 : _a.value) ?? money.currencyCode;
2870
+ },
2871
+ // e.g. "US dollars"
2872
+ currencySymbol: () => {
2873
+ var _a;
2874
+ return ((_a = defaultFormatter().formatToParts(amount).find(isPartCurrency)) == null ? void 0 : _a.value) ?? money.currencyCode;
2875
+ },
2876
+ // e.g. "USD"
2877
+ currencyNarrowSymbol: () => {
2878
+ var _a;
2879
+ return ((_a = narrowSymbolFormatter().formatToParts(amount).find(isPartCurrency)) == null ? void 0 : _a.value) ?? "";
2880
+ },
2881
+ // e.g. "$"
2882
+ amount: () => defaultFormatter().formatToParts(amount).filter(
2883
+ (part) => ["decimal", "fraction", "group", "integer", "literal"].includes(
2884
+ part.type
2885
+ )
2886
+ ).map((part) => part.value).join("")
2887
+ }),
2888
+ [
2889
+ money,
2890
+ amount,
2891
+ nameFormatter,
2892
+ defaultFormatter,
2893
+ narrowSymbolFormatter,
2894
+ withoutCurrencyFormatter,
2895
+ withoutTrailingZerosFormatter,
2896
+ withoutTrailingZerosOrCurrencyFormatter
2897
+ ]
2898
+ );
2899
+ return React.useMemo(
2900
+ () => new Proxy(lazyFormatters, {
2901
+ get: (target, key) => {
2902
+ var _a;
2903
+ return (_a = Reflect.get(target, key)) == null ? void 0 : _a.call(null);
2904
+ }
2905
+ }),
2906
+ [lazyFormatters]
2907
+ );
2908
+ }
2909
+ function useLazyFormatter(locale, options) {
2910
+ return React.useMemo(() => {
2911
+ let memoized;
2912
+ return () => memoized ?? (memoized = new Intl.NumberFormat(locale, options));
2913
+ }, [locale, options]);
2914
+ }
2915
+ function Money({
2916
+ data,
2917
+ as,
2918
+ withoutCurrency,
2919
+ withoutTrailingZeros,
2920
+ measurement,
2921
+ measurementSeparator = "/",
2922
+ ...passthroughProps
2923
+ }) {
2924
+ if (!isMoney(data)) {
2925
+ throw new Error(
2926
+ `<Money/> needs a valid 'data' prop that has 'amount' and 'currencyCode'`
2927
+ );
2928
+ }
2929
+ const moneyObject = useMoney(data);
2930
+ const Wrapper = as ?? "div";
2931
+ let output = moneyObject.localizedString;
2932
+ if (withoutCurrency || withoutTrailingZeros) {
2933
+ if (withoutCurrency && !withoutTrailingZeros) {
2934
+ output = moneyObject.amount;
2935
+ } else if (!withoutCurrency && withoutTrailingZeros) {
2936
+ output = moneyObject.withoutTrailingZeros;
2937
+ } else {
2938
+ output = moneyObject.withoutTrailingZerosAndCurrency;
2939
+ }
2940
+ }
2941
+ return /* @__PURE__ */ React.createElement(Wrapper, { ...passthroughProps }, output, measurement && measurement.referenceUnit && /* @__PURE__ */ React.createElement(React.Fragment, null, measurementSeparator, measurement.referenceUnit));
2942
+ }
2943
+ function isMoney(maybeMoney) {
2944
+ return typeof maybeMoney.amount === "string" && !!maybeMoney.amount && typeof maybeMoney.currencyCode === "string" && !!maybeMoney.currencyCode;
2945
+ }
2946
+ function CartCost(props) {
2947
+ const { cost } = useCart();
2948
+ const { amountType = "total", children, ...passthroughProps } = props;
2949
+ let amount;
2950
+ if (amountType == "total") {
2951
+ amount = cost == null ? void 0 : cost.totalAmount;
2952
+ } else if (amountType == "subtotal") {
2953
+ amount = cost == null ? void 0 : cost.subtotalAmount;
2954
+ } else if (amountType == "tax") {
2955
+ amount = cost == null ? void 0 : cost.totalTaxAmount;
2956
+ } else if (amountType == "duty") {
2957
+ amount = cost == null ? void 0 : cost.totalDutyAmount;
2958
+ }
2959
+ if (amount == null) {
2960
+ return null;
2961
+ }
2962
+ return /* @__PURE__ */ React.createElement(Money, { ...passthroughProps, data: amount }, children);
2963
+ }
2964
+ function CartLinePrice(props) {
2965
+ var _a, _b;
2966
+ const { data: cartLine, priceType = "regular", ...passthroughProps } = props;
2967
+ if (cartLine == null) {
2968
+ throw new Error(`<CartLinePrice/> requires a cart line as the 'data' prop`);
2969
+ }
2970
+ const moneyV2 = priceType === "regular" ? (_a = cartLine.cost) == null ? void 0 : _a.totalAmount : (_b = cartLine.cost) == null ? void 0 : _b.compareAtAmountPerQuantity;
2971
+ if (moneyV2 == null) {
2972
+ return null;
2973
+ }
2974
+ return /* @__PURE__ */ React.createElement(Money, { ...passthroughProps, data: moneyV2 });
2975
+ }
2976
+ const CartLineContext = React.createContext(null);
2977
+ function useCartLine() {
2978
+ const context = React.useContext(CartLineContext);
2979
+ if (context == null) {
2980
+ throw new Error("Expected a cart line context but none was found");
2981
+ }
2982
+ return context;
2983
+ }
2984
+ function CartLineProvider({ children, line }) {
2985
+ return /* @__PURE__ */ React.createElement(CartLineContext.Provider, { value: line }, children);
2986
+ }
2376
2987
  const storefrontApiCustomScalars = {
2377
2988
  // Keep in sync with the definitions in the app/nextjs/codegen.ts!
2378
2989
  DateTime: "string",
@@ -3053,128 +3664,6 @@
3053
3664
  }
3054
3665
  return JSON.parse(json);
3055
3666
  }
3056
- function useMoney(money) {
3057
- const { locale } = useShop();
3058
- if (!locale) {
3059
- throw new Error(
3060
- `useMoney(): Unable to get 'locale' from 'useShop()', which means that 'locale' was not passed to '<ShopifyProvider/>'. 'locale' is required for 'useMoney()' to work`
3061
- );
3062
- }
3063
- const amount = parseFloat(money.amount);
3064
- const options = React.useMemo(
3065
- () => ({
3066
- style: "currency",
3067
- currency: money.currencyCode
3068
- }),
3069
- [money.currencyCode]
3070
- );
3071
- const defaultFormatter = useLazyFormatter(locale, options);
3072
- const nameFormatter = useLazyFormatter(locale, {
3073
- ...options,
3074
- currencyDisplay: "name"
3075
- });
3076
- const narrowSymbolFormatter = useLazyFormatter(locale, {
3077
- ...options,
3078
- currencyDisplay: "narrowSymbol"
3079
- });
3080
- const withoutTrailingZerosFormatter = useLazyFormatter(locale, {
3081
- ...options,
3082
- minimumFractionDigits: 0,
3083
- maximumFractionDigits: 0
3084
- });
3085
- const withoutCurrencyFormatter = useLazyFormatter(locale);
3086
- const withoutTrailingZerosOrCurrencyFormatter = useLazyFormatter(locale, {
3087
- minimumFractionDigits: 0,
3088
- maximumFractionDigits: 0
3089
- });
3090
- const isPartCurrency = (part) => part.type === "currency";
3091
- const lazyFormatters = React.useMemo(
3092
- () => ({
3093
- original: () => money,
3094
- currencyCode: () => money.currencyCode,
3095
- localizedString: () => defaultFormatter().format(amount),
3096
- parts: () => defaultFormatter().formatToParts(amount),
3097
- withoutTrailingZeros: () => amount % 1 === 0 ? withoutTrailingZerosFormatter().format(amount) : defaultFormatter().format(amount),
3098
- withoutTrailingZerosAndCurrency: () => amount % 1 === 0 ? withoutTrailingZerosOrCurrencyFormatter().format(amount) : withoutCurrencyFormatter().format(amount),
3099
- currencyName: () => {
3100
- var _a;
3101
- return ((_a = nameFormatter().formatToParts(amount).find(isPartCurrency)) == null ? void 0 : _a.value) ?? money.currencyCode;
3102
- },
3103
- // e.g. "US dollars"
3104
- currencySymbol: () => {
3105
- var _a;
3106
- return ((_a = defaultFormatter().formatToParts(amount).find(isPartCurrency)) == null ? void 0 : _a.value) ?? money.currencyCode;
3107
- },
3108
- // e.g. "USD"
3109
- currencyNarrowSymbol: () => {
3110
- var _a;
3111
- return ((_a = narrowSymbolFormatter().formatToParts(amount).find(isPartCurrency)) == null ? void 0 : _a.value) ?? "";
3112
- },
3113
- // e.g. "$"
3114
- amount: () => defaultFormatter().formatToParts(amount).filter(
3115
- (part) => ["decimal", "fraction", "group", "integer", "literal"].includes(
3116
- part.type
3117
- )
3118
- ).map((part) => part.value).join("")
3119
- }),
3120
- [
3121
- money,
3122
- amount,
3123
- nameFormatter,
3124
- defaultFormatter,
3125
- narrowSymbolFormatter,
3126
- withoutCurrencyFormatter,
3127
- withoutTrailingZerosFormatter,
3128
- withoutTrailingZerosOrCurrencyFormatter
3129
- ]
3130
- );
3131
- return React.useMemo(
3132
- () => new Proxy(lazyFormatters, {
3133
- get: (target, key) => {
3134
- var _a;
3135
- return (_a = Reflect.get(target, key)) == null ? void 0 : _a.call(null);
3136
- }
3137
- }),
3138
- [lazyFormatters]
3139
- );
3140
- }
3141
- function useLazyFormatter(locale, options) {
3142
- return React.useMemo(() => {
3143
- let memoized;
3144
- return () => memoized ?? (memoized = new Intl.NumberFormat(locale, options));
3145
- }, [locale, options]);
3146
- }
3147
- function Money({
3148
- data,
3149
- as,
3150
- withoutCurrency,
3151
- withoutTrailingZeros,
3152
- measurement,
3153
- measurementSeparator = "/",
3154
- ...passthroughProps
3155
- }) {
3156
- if (!isMoney(data)) {
3157
- throw new Error(
3158
- `<Money/> needs a valid 'data' prop that has 'amount' and 'currencyCode'`
3159
- );
3160
- }
3161
- const moneyObject = useMoney(data);
3162
- const Wrapper = as ?? "div";
3163
- let output = moneyObject.localizedString;
3164
- if (withoutCurrency || withoutTrailingZeros) {
3165
- if (withoutCurrency && !withoutTrailingZeros) {
3166
- output = moneyObject.amount;
3167
- } else if (!withoutCurrency && withoutTrailingZeros) {
3168
- output = moneyObject.withoutTrailingZeros;
3169
- } else {
3170
- output = moneyObject.withoutTrailingZerosAndCurrency;
3171
- }
3172
- }
3173
- return /* @__PURE__ */ React.createElement(Wrapper, { ...passthroughProps }, output, measurement && measurement.referenceUnit && /* @__PURE__ */ React.createElement(React.Fragment, null, measurementSeparator, measurement.referenceUnit));
3174
- }
3175
- function isMoney(maybeMoney) {
3176
- return typeof maybeMoney.amount === "string" && !!maybeMoney.amount && typeof maybeMoney.currencyCode === "string" && !!maybeMoney.currencyCode;
3177
- }
3178
3667
  function ProductPrice(props) {
3179
3668
  var _a, _b, _c, _d, _e, _f;
3180
3669
  const {
@@ -3233,13 +3722,13 @@
3233
3722
  }) {
3234
3723
  const { storeDomain } = useShop();
3235
3724
  const shopPayLoadedStatus = useLoadScript(SHOPJS_URL);
3236
- let ids;
3725
+ let ids = [];
3237
3726
  if (variantIds && variantIdsAndQuantities) {
3238
3727
  throw new Error(DoublePropsErrorMessage);
3239
3728
  }
3240
3729
  if (variantIds) {
3241
3730
  ids = variantIds.reduce((prev, curr) => {
3242
- const bareId = getIdFromGid(curr);
3731
+ const bareId = parseGid(curr).id;
3243
3732
  if (bareId) {
3244
3733
  prev.push(bareId);
3245
3734
  }
@@ -3247,7 +3736,7 @@
3247
3736
  }, []);
3248
3737
  } else if (variantIdsAndQuantities) {
3249
3738
  ids = variantIdsAndQuantities.reduce((prev, curr) => {
3250
- const bareId = getIdFromGid(curr == null ? void 0 : curr.id);
3739
+ const bareId = parseGid(curr == null ? void 0 : curr.id).id;
3251
3740
  if (bareId) {
3252
3741
  prev.push(`${bareId}:${(curr == null ? void 0 : curr.quantity) ?? 1}`);
3253
3742
  }
@@ -3256,21 +3745,58 @@
3256
3745
  } else {
3257
3746
  throw new Error(MissingPropsErrorMessage);
3258
3747
  }
3748
+ if (ids.length === 0) {
3749
+ throw new Error(InvalidPropsErrorMessage);
3750
+ }
3259
3751
  const style = width ? {
3260
3752
  "--shop-pay-button-width": width
3261
3753
  } : void 0;
3262
3754
  return /* @__PURE__ */ React.createElement("div", { className, style }, shopPayLoadedStatus === "done" && /* @__PURE__ */ React.createElement("shop-pay-button", { "store-url": storeDomain, variants: ids.join(",") }));
3263
3755
  }
3264
- function getIdFromGid(id) {
3265
- if (!id)
3266
- return;
3267
- return id.split("/").pop();
3268
- }
3756
+ const InvalidPropsErrorMessage = `You must pass in "variantIds" in the form of ["gid://shopify/ProductVariant/1"]`;
3269
3757
  const MissingPropsErrorMessage = `You must pass in either "variantIds" or "variantIdsAndQuantities" to ShopPayButton`;
3270
3758
  const DoublePropsErrorMessage = `You must provide either a variantIds or variantIdsAndQuantities prop, but not both in the ShopPayButton component`;
3759
+ const longTermLength = 60 * 60 * 24 * 360 * 1;
3760
+ const shortTermLength = 60 * 30;
3761
+ function useShopifyCookies(options) {
3762
+ const { hasUserConsent = false, domain = "" } = options || {};
3763
+ React.useEffect(() => {
3764
+ const cookies = getShopifyCookies(document.cookie);
3765
+ if (hasUserConsent) {
3766
+ setCookie(
3767
+ SHOPIFY_Y,
3768
+ cookies[SHOPIFY_Y] || buildUUID(),
3769
+ longTermLength,
3770
+ domain
3771
+ );
3772
+ setCookie(
3773
+ SHOPIFY_S,
3774
+ cookies[SHOPIFY_S] || buildUUID(),
3775
+ shortTermLength,
3776
+ domain
3777
+ );
3778
+ } else {
3779
+ setCookie(SHOPIFY_Y, "", 0, domain);
3780
+ setCookie(SHOPIFY_S, "", 0, domain);
3781
+ }
3782
+ });
3783
+ }
3784
+ function setCookie(name, value, maxage, domain) {
3785
+ document.cookie = l(name, value, {
3786
+ maxage,
3787
+ domain,
3788
+ samesite: "Lax",
3789
+ path: "/"
3790
+ });
3791
+ }
3271
3792
  exports2.AddToCartButton = AddToCartButton;
3793
+ exports2.AnalyticsEventName = AnalyticsEventName;
3794
+ exports2.AnalyticsPageType = AnalyticsPageType;
3272
3795
  exports2.BuyNowButton = BuyNowButton;
3273
3796
  exports2.CartCheckoutButton = CartCheckoutButton;
3797
+ exports2.CartCost = CartCost;
3798
+ exports2.CartLinePrice = CartLinePrice;
3799
+ exports2.CartLineProvider = CartLineProvider;
3274
3800
  exports2.CartProvider = CartProvider;
3275
3801
  exports2.ExternalVideo = ExternalVideo;
3276
3802
  exports2.Image = Image;
@@ -3281,15 +3807,21 @@
3281
3807
  exports2.ProductProvider = ProductProvider;
3282
3808
  exports2.ShopPayButton = ShopPayButton;
3283
3809
  exports2.ShopifyProvider = ShopifyProvider;
3810
+ exports2.ShopifySalesChannel = ShopifySalesChannel;
3284
3811
  exports2.Video = Video;
3285
3812
  exports2.createStorefrontClient = createStorefrontClient;
3286
3813
  exports2.flattenConnection = flattenConnection;
3814
+ exports2.getClientBrowserParameters = getClientBrowserParameters;
3815
+ exports2.getShopifyCookies = getShopifyCookies;
3287
3816
  exports2.parseMetafield = parseMetafield;
3817
+ exports2.sendShopifyAnalytics = sendShopifyAnalytics;
3288
3818
  exports2.storefrontApiCustomScalars = storefrontApiCustomScalars;
3289
3819
  exports2.useCart = useCart;
3820
+ exports2.useCartLine = useCartLine;
3290
3821
  exports2.useMoney = useMoney;
3291
3822
  exports2.useProduct = useProduct;
3292
3823
  exports2.useShop = useShop;
3824
+ exports2.useShopifyCookies = useShopifyCookies;
3293
3825
  Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
3294
3826
  });
3295
3827
  //# sourceMappingURL=hydrogen-react.dev.js.map