@shopify/hydrogen-react 2022.10.2 → 2022.10.4

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 (621) hide show
  1. package/README.md +49 -0
  2. package/dist/{dev → browser-dev}/AddToCartButton.mjs +0 -0
  3. package/dist/browser-dev/AddToCartButton.mjs.map +1 -0
  4. package/dist/{dev → browser-dev}/BaseButton.mjs +0 -0
  5. package/dist/{dev → browser-dev}/BaseButton.mjs.map +1 -1
  6. package/dist/{dev → browser-dev}/BuyNowButton.mjs +0 -0
  7. package/dist/{dev → browser-dev}/BuyNowButton.mjs.map +1 -1
  8. package/dist/{dev → browser-dev}/CartCheckoutButton.mjs +0 -0
  9. package/dist/{dev → browser-dev}/CartCheckoutButton.mjs.map +1 -1
  10. package/dist/{dev → browser-dev}/CartProvider.mjs +0 -0
  11. package/dist/{prod → browser-dev}/CartProvider.mjs.map +1 -1
  12. package/dist/{dev → browser-dev}/ExternalVideo.mjs +0 -0
  13. package/dist/{dev → browser-dev}/ExternalVideo.mjs.map +1 -1
  14. package/dist/{dev → browser-dev}/Image.mjs +0 -0
  15. package/dist/{dev → browser-dev}/Image.mjs.map +1 -1
  16. package/dist/{dev → browser-dev}/MediaFile.mjs +1 -1
  17. package/dist/browser-dev/MediaFile.mjs.map +1 -0
  18. package/dist/{dev → browser-dev}/Metafield.mjs +0 -0
  19. package/dist/{dev → browser-dev}/Metafield.mjs.map +1 -1
  20. package/dist/{dev → browser-dev}/ModelViewer.mjs +0 -0
  21. package/dist/{dev → browser-dev}/ModelViewer.mjs.map +1 -1
  22. package/dist/{dev → browser-dev}/Money.mjs +0 -0
  23. package/dist/{dev → browser-dev}/Money.mjs.map +1 -1
  24. package/dist/{dev → browser-dev}/ProductPrice.mjs +0 -0
  25. package/dist/{dev → browser-dev}/ProductPrice.mjs.map +1 -1
  26. package/dist/{dev → browser-dev}/ProductProvider.mjs +0 -0
  27. package/dist/{dev → browser-dev}/ProductProvider.mjs.map +1 -1
  28. package/dist/{dev → browser-dev}/ShopPayButton.mjs +0 -0
  29. package/dist/{prod → browser-dev}/ShopPayButton.mjs.map +1 -1
  30. package/dist/browser-dev/ShopifyProvider.mjs +86 -0
  31. package/dist/browser-dev/ShopifyProvider.mjs.map +1 -0
  32. package/dist/{dev → browser-dev}/Video.mjs +0 -0
  33. package/dist/{dev → browser-dev}/Video.mjs.map +1 -1
  34. package/dist/{dev → browser-dev}/_virtual/index.mjs +0 -0
  35. package/dist/{dev → browser-dev}/_virtual/index.mjs.map +0 -0
  36. package/dist/{dev → browser-dev}/_virtual/use-sync-external-store-shim.development.mjs +0 -0
  37. package/dist/{dev → browser-dev}/_virtual/use-sync-external-store-shim.development.mjs.map +0 -0
  38. package/dist/{dev → browser-dev}/_virtual/use-sync-external-store-shim.production.min.mjs +0 -0
  39. package/dist/{dev → browser-dev}/_virtual/use-sync-external-store-shim.production.min.mjs.map +0 -0
  40. package/dist/{dev → browser-dev}/_virtual/with-selector.development.mjs +0 -0
  41. package/dist/{dev → browser-dev}/_virtual/with-selector.development.mjs.map +0 -0
  42. package/dist/{dev → browser-dev}/_virtual/with-selector.mjs +0 -0
  43. package/dist/{dev → browser-dev}/_virtual/with-selector.mjs.map +0 -0
  44. package/dist/{dev → browser-dev}/_virtual/with-selector.production.min.mjs +0 -0
  45. package/dist/{dev → browser-dev}/_virtual/with-selector.production.min.mjs.map +0 -0
  46. package/dist/{prod → browser-dev}/cart-constants.mjs +1 -3
  47. package/dist/browser-dev/cart-constants.mjs.map +1 -0
  48. package/dist/{dev → browser-dev}/cart-hooks.mjs +9 -13
  49. package/dist/browser-dev/cart-hooks.mjs.map +1 -0
  50. package/dist/{dev → browser-dev}/cart-queries.mjs +0 -0
  51. package/dist/{dev → browser-dev}/cart-queries.mjs.map +0 -0
  52. package/dist/browser-dev/codegen.helpers.mjs +12 -0
  53. package/dist/browser-dev/codegen.helpers.mjs.map +1 -0
  54. package/dist/{dev → browser-dev}/flatten-connection.mjs +0 -0
  55. package/dist/{dev → browser-dev}/flatten-connection.mjs.map +0 -0
  56. package/dist/{dev → browser-dev}/image-size.mjs +0 -0
  57. package/dist/{dev → browser-dev}/image-size.mjs.map +0 -0
  58. package/dist/{prod → browser-dev}/index.mjs +2 -0
  59. package/dist/browser-dev/index.mjs.map +1 -0
  60. package/dist/{dev → browser-dev}/load-script.mjs +0 -0
  61. package/dist/{prod → browser-dev}/load-script.mjs.map +1 -1
  62. package/dist/{dev → browser-dev}/metafield-parser.mjs +0 -0
  63. package/dist/browser-dev/metafield-parser.mjs.map +1 -0
  64. package/dist/{dev → browser-dev}/node_modules/@xstate/fsm/es/index.mjs +0 -0
  65. package/dist/{dev → browser-dev}/node_modules/@xstate/fsm/es/index.mjs.map +0 -0
  66. package/dist/{dev → browser-dev}/node_modules/@xstate/react/es/fsm.mjs +0 -0
  67. package/dist/{dev → browser-dev}/node_modules/@xstate/react/es/fsm.mjs.map +0 -0
  68. package/dist/{dev → browser-dev}/node_modules/@xstate/react/es/useConstant.mjs +0 -0
  69. package/dist/{dev → browser-dev}/node_modules/@xstate/react/es/useConstant.mjs.map +0 -0
  70. package/dist/{dev → browser-dev}/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.mjs +0 -0
  71. package/dist/{dev → browser-dev}/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.mjs.map +0 -0
  72. package/dist/{dev → browser-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs +0 -0
  73. package/dist/{dev → browser-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs.map +0 -0
  74. package/dist/{dev → browser-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.mjs +0 -0
  75. package/dist/{dev → browser-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.mjs.map +0 -0
  76. package/dist/{dev → browser-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs +0 -0
  77. package/dist/{dev → browser-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs.map +0 -0
  78. package/dist/{dev → browser-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.mjs +0 -0
  79. package/dist/{dev → browser-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.mjs.map +0 -0
  80. package/dist/{dev → browser-dev}/node_modules/use-sync-external-store/shim/index.mjs +0 -0
  81. package/dist/{dev → browser-dev}/node_modules/use-sync-external-store/shim/index.mjs.map +0 -0
  82. package/dist/{dev → browser-dev}/node_modules/use-sync-external-store/shim/with-selector.mjs +0 -0
  83. package/dist/{dev → browser-dev}/node_modules/use-sync-external-store/shim/with-selector.mjs.map +0 -0
  84. package/dist/{dev → browser-dev}/storefront-api-constants.mjs +0 -0
  85. package/dist/{dev → browser-dev}/storefront-api-constants.mjs.map +0 -0
  86. package/dist/{dev → browser-dev}/storefront-client.mjs +22 -10
  87. package/dist/browser-dev/storefront-client.mjs.map +1 -0
  88. package/dist/{dev → browser-dev}/useCartAPIStateMachine.mjs +0 -0
  89. package/dist/{dev → browser-dev}/useCartAPIStateMachine.mjs.map +1 -1
  90. package/dist/{dev → browser-dev}/useCartActions.mjs +0 -0
  91. package/dist/{dev → browser-dev}/useCartActions.mjs.map +1 -1
  92. package/dist/{dev → browser-dev}/useMoney.mjs +0 -0
  93. package/dist/{prod → browser-dev}/useMoney.mjs.map +1 -1
  94. package/dist/{prod → browser-prod}/AddToCartButton.mjs +0 -0
  95. package/dist/browser-prod/AddToCartButton.mjs.map +1 -0
  96. package/dist/{prod → browser-prod}/BaseButton.mjs +0 -0
  97. package/dist/{prod → browser-prod}/BaseButton.mjs.map +1 -1
  98. package/dist/{prod → browser-prod}/BuyNowButton.mjs +0 -0
  99. package/dist/{prod → browser-prod}/BuyNowButton.mjs.map +1 -1
  100. package/dist/{prod → browser-prod}/CartCheckoutButton.mjs +0 -0
  101. package/dist/{prod → browser-prod}/CartCheckoutButton.mjs.map +1 -1
  102. package/dist/{prod → browser-prod}/CartProvider.mjs +0 -0
  103. package/dist/{dev → browser-prod}/CartProvider.mjs.map +1 -1
  104. package/dist/{prod → browser-prod}/ExternalVideo.mjs +0 -0
  105. package/dist/{prod → browser-prod}/ExternalVideo.mjs.map +1 -1
  106. package/dist/{prod → browser-prod}/Image.mjs +0 -0
  107. package/dist/{prod → browser-prod}/Image.mjs.map +1 -1
  108. package/dist/{prod → browser-prod}/MediaFile.mjs +2 -2
  109. package/dist/browser-prod/MediaFile.mjs.map +1 -0
  110. package/dist/{prod → browser-prod}/Metafield.mjs +0 -0
  111. package/dist/{prod → browser-prod}/Metafield.mjs.map +1 -1
  112. package/dist/{prod → browser-prod}/ModelViewer.mjs +0 -0
  113. package/dist/{prod → browser-prod}/ModelViewer.mjs.map +1 -1
  114. package/dist/{prod → browser-prod}/Money.mjs +0 -0
  115. package/dist/{prod → browser-prod}/Money.mjs.map +1 -1
  116. package/dist/{prod → browser-prod}/ProductPrice.mjs +0 -0
  117. package/dist/{prod → browser-prod}/ProductPrice.mjs.map +1 -1
  118. package/dist/{prod → browser-prod}/ProductProvider.mjs +0 -0
  119. package/dist/{prod → browser-prod}/ProductProvider.mjs.map +1 -1
  120. package/dist/{prod → browser-prod}/ShopPayButton.mjs +0 -0
  121. package/dist/{dev → browser-prod}/ShopPayButton.mjs.map +1 -1
  122. package/dist/browser-prod/ShopifyProvider.mjs +80 -0
  123. package/dist/browser-prod/ShopifyProvider.mjs.map +1 -0
  124. package/dist/{prod → browser-prod}/Video.mjs +0 -0
  125. package/dist/{prod → browser-prod}/Video.mjs.map +1 -1
  126. package/dist/{prod → browser-prod}/_virtual/index.mjs +0 -0
  127. package/dist/{prod → browser-prod}/_virtual/index.mjs.map +0 -0
  128. package/dist/{prod → browser-prod}/_virtual/use-sync-external-store-shim.development.mjs +0 -0
  129. package/dist/{prod → browser-prod}/_virtual/use-sync-external-store-shim.development.mjs.map +0 -0
  130. package/dist/{prod → browser-prod}/_virtual/use-sync-external-store-shim.production.min.mjs +0 -0
  131. package/dist/{prod → browser-prod}/_virtual/use-sync-external-store-shim.production.min.mjs.map +0 -0
  132. package/dist/{prod → browser-prod}/_virtual/with-selector.development.mjs +0 -0
  133. package/dist/{prod → browser-prod}/_virtual/with-selector.development.mjs.map +0 -0
  134. package/dist/{prod → browser-prod}/_virtual/with-selector.mjs +0 -0
  135. package/dist/{prod → browser-prod}/_virtual/with-selector.mjs.map +0 -0
  136. package/dist/{prod → browser-prod}/_virtual/with-selector.production.min.mjs +0 -0
  137. package/dist/{prod → browser-prod}/_virtual/with-selector.production.min.mjs.map +0 -0
  138. package/dist/{dev → browser-prod}/cart-constants.mjs +1 -3
  139. package/dist/browser-prod/cart-constants.mjs.map +1 -0
  140. package/dist/{prod → browser-prod}/cart-hooks.mjs +9 -13
  141. package/dist/browser-prod/cart-hooks.mjs.map +1 -0
  142. package/dist/{prod → browser-prod}/cart-queries.mjs +0 -0
  143. package/dist/{prod → browser-prod}/cart-queries.mjs.map +0 -0
  144. package/dist/browser-prod/codegen.helpers.mjs +12 -0
  145. package/dist/browser-prod/codegen.helpers.mjs.map +1 -0
  146. package/dist/{prod → browser-prod}/flatten-connection.mjs +0 -0
  147. package/dist/{prod → browser-prod}/flatten-connection.mjs.map +0 -0
  148. package/dist/{prod → browser-prod}/image-size.mjs +0 -0
  149. package/dist/{prod → browser-prod}/image-size.mjs.map +0 -0
  150. package/dist/{dev → browser-prod}/index.mjs +2 -0
  151. package/dist/browser-prod/index.mjs.map +1 -0
  152. package/dist/{prod → browser-prod}/load-script.mjs +0 -0
  153. package/dist/{dev → browser-prod}/load-script.mjs.map +1 -1
  154. package/dist/{prod → browser-prod}/metafield-parser.mjs +0 -0
  155. package/dist/browser-prod/metafield-parser.mjs.map +1 -0
  156. package/dist/{prod → browser-prod}/node_modules/@xstate/fsm/es/index.mjs +0 -0
  157. package/dist/{prod → browser-prod}/node_modules/@xstate/fsm/es/index.mjs.map +0 -0
  158. package/dist/{prod → browser-prod}/node_modules/@xstate/react/es/fsm.mjs +0 -0
  159. package/dist/{prod → browser-prod}/node_modules/@xstate/react/es/fsm.mjs.map +0 -0
  160. package/dist/{prod → browser-prod}/node_modules/@xstate/react/es/useConstant.mjs +0 -0
  161. package/dist/{prod → browser-prod}/node_modules/@xstate/react/es/useConstant.mjs.map +0 -0
  162. package/dist/{prod → browser-prod}/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.mjs +0 -0
  163. package/dist/{prod → browser-prod}/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.mjs.map +0 -0
  164. package/dist/{prod → browser-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs +0 -0
  165. package/dist/{prod → browser-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs.map +0 -0
  166. package/dist/{prod → browser-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.mjs +0 -0
  167. package/dist/{prod → browser-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.mjs.map +0 -0
  168. package/dist/{prod → browser-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs +0 -0
  169. package/dist/{prod → browser-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs.map +0 -0
  170. package/dist/{prod → browser-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.mjs +0 -0
  171. package/dist/{prod → browser-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.mjs.map +0 -0
  172. package/dist/{prod → browser-prod}/node_modules/use-sync-external-store/shim/index.mjs +0 -0
  173. package/dist/{prod → browser-prod}/node_modules/use-sync-external-store/shim/index.mjs.map +0 -0
  174. package/dist/{prod → browser-prod}/node_modules/use-sync-external-store/shim/with-selector.mjs +0 -0
  175. package/dist/{prod → browser-prod}/node_modules/use-sync-external-store/shim/with-selector.mjs.map +0 -0
  176. package/dist/{prod → browser-prod}/storefront-api-constants.mjs +0 -0
  177. package/dist/{prod → browser-prod}/storefront-api-constants.mjs.map +0 -0
  178. package/dist/{prod → browser-prod}/storefront-client.mjs +22 -10
  179. package/dist/browser-prod/storefront-client.mjs.map +1 -0
  180. package/dist/{prod → browser-prod}/useCartAPIStateMachine.mjs +0 -0
  181. package/dist/{prod → browser-prod}/useCartAPIStateMachine.mjs.map +1 -1
  182. package/dist/{prod → browser-prod}/useCartActions.mjs +0 -0
  183. package/dist/{prod → browser-prod}/useCartActions.mjs.map +1 -1
  184. package/dist/{prod → browser-prod}/useMoney.mjs +0 -0
  185. package/dist/{dev → browser-prod}/useMoney.mjs.map +1 -1
  186. package/dist/{dev → node-dev}/AddToCartButton.js +0 -0
  187. package/dist/node-dev/AddToCartButton.js.map +1 -0
  188. package/dist/node-dev/AddToCartButton.mjs +70 -0
  189. package/dist/node-dev/AddToCartButton.mjs.map +1 -0
  190. package/dist/{dev → node-dev}/BaseButton.js +0 -0
  191. package/dist/{dev → node-dev}/BaseButton.js.map +1 -1
  192. package/dist/node-dev/BaseButton.mjs +31 -0
  193. package/dist/node-dev/BaseButton.mjs.map +1 -0
  194. package/dist/{dev → node-dev}/BuyNowButton.js +0 -0
  195. package/dist/{dev → node-dev}/BuyNowButton.js.map +1 -1
  196. package/dist/node-dev/BuyNowButton.mjs +45 -0
  197. package/dist/node-dev/BuyNowButton.mjs.map +1 -0
  198. package/dist/{dev → node-dev}/CartCheckoutButton.js +0 -0
  199. package/dist/{dev → node-dev}/CartCheckoutButton.js.map +1 -1
  200. package/dist/node-dev/CartCheckoutButton.mjs +30 -0
  201. package/dist/node-dev/CartCheckoutButton.mjs.map +1 -0
  202. package/dist/{dev → node-dev}/CartProvider.js +0 -0
  203. package/dist/{prod → node-dev}/CartProvider.js.map +1 -1
  204. package/dist/node-dev/CartProvider.mjs +485 -0
  205. package/dist/node-dev/CartProvider.mjs.map +1 -0
  206. package/dist/{dev → node-dev}/ExternalVideo.js +0 -0
  207. package/dist/{dev → node-dev}/ExternalVideo.js.map +1 -1
  208. package/dist/node-dev/ExternalVideo.mjs +39 -0
  209. package/dist/node-dev/ExternalVideo.mjs.map +1 -0
  210. package/dist/{dev → node-dev}/Image.js +0 -0
  211. package/dist/{dev → node-dev}/Image.js.map +1 -1
  212. package/dist/node-dev/Image.mjs +104 -0
  213. package/dist/node-dev/Image.mjs.map +1 -0
  214. package/dist/{dev → node-dev}/MediaFile.js +1 -1
  215. package/dist/node-dev/MediaFile.js.map +1 -0
  216. package/dist/node-dev/MediaFile.mjs +57 -0
  217. package/dist/node-dev/MediaFile.mjs.map +1 -0
  218. package/dist/{dev → node-dev}/Metafield.js +0 -0
  219. package/dist/{dev → node-dev}/Metafield.js.map +1 -1
  220. package/dist/node-dev/Metafield.mjs +301 -0
  221. package/dist/node-dev/Metafield.mjs.map +1 -0
  222. package/dist/{dev → node-dev}/ModelViewer.js +0 -0
  223. package/dist/{dev → node-dev}/ModelViewer.js.map +1 -1
  224. package/dist/node-dev/ModelViewer.mjs +145 -0
  225. package/dist/node-dev/ModelViewer.mjs.map +1 -0
  226. package/dist/{dev → node-dev}/Money.js +0 -0
  227. package/dist/{dev → node-dev}/Money.js.map +1 -1
  228. package/dist/node-dev/Money.mjs +40 -0
  229. package/dist/node-dev/Money.mjs.map +1 -0
  230. package/dist/{dev → node-dev}/ProductPrice.js +0 -0
  231. package/dist/{dev → node-dev}/ProductPrice.js.map +1 -1
  232. package/dist/node-dev/ProductPrice.mjs +61 -0
  233. package/dist/node-dev/ProductPrice.mjs.map +1 -0
  234. package/dist/{dev → node-dev}/ProductProvider.js +0 -0
  235. package/dist/{prod → node-dev}/ProductProvider.js.map +1 -1
  236. package/dist/node-dev/ProductProvider.mjs +161 -0
  237. package/dist/node-dev/ProductProvider.mjs.map +1 -0
  238. package/dist/{dev → node-dev}/ShopPayButton.js +0 -0
  239. package/dist/{prod → node-dev}/ShopPayButton.js.map +1 -1
  240. package/dist/node-dev/ShopPayButton.mjs +64 -0
  241. package/dist/node-dev/ShopPayButton.mjs.map +1 -0
  242. package/dist/node-dev/ShopifyProvider.js +86 -0
  243. package/dist/node-dev/ShopifyProvider.js.map +1 -0
  244. package/dist/node-dev/ShopifyProvider.mjs +86 -0
  245. package/dist/node-dev/ShopifyProvider.mjs.map +1 -0
  246. package/dist/{dev → node-dev}/Video.js +0 -0
  247. package/dist/{dev → node-dev}/Video.js.map +1 -1
  248. package/dist/node-dev/Video.mjs +44 -0
  249. package/dist/node-dev/Video.mjs.map +1 -0
  250. package/dist/{dev → node-dev}/_virtual/index.js +0 -0
  251. package/dist/{dev → node-dev}/_virtual/index.js.map +0 -0
  252. package/dist/node-dev/_virtual/index.mjs +5 -0
  253. package/dist/{dev → node-dev/_virtual}/index.mjs.map +1 -1
  254. package/dist/{dev → node-dev}/_virtual/use-sync-external-store-shim.development.js +0 -0
  255. package/dist/{dev → node-dev}/_virtual/use-sync-external-store-shim.development.js.map +0 -0
  256. package/dist/node-dev/_virtual/use-sync-external-store-shim.development.mjs +5 -0
  257. package/dist/node-dev/_virtual/use-sync-external-store-shim.development.mjs.map +1 -0
  258. package/dist/{dev → node-dev}/_virtual/use-sync-external-store-shim.production.min.js +0 -0
  259. package/dist/{dev → node-dev}/_virtual/use-sync-external-store-shim.production.min.js.map +0 -0
  260. package/dist/node-dev/_virtual/use-sync-external-store-shim.production.min.mjs +5 -0
  261. package/dist/node-dev/_virtual/use-sync-external-store-shim.production.min.mjs.map +1 -0
  262. package/dist/{dev → node-dev}/_virtual/with-selector.development.js +0 -0
  263. package/dist/{dev → node-dev}/_virtual/with-selector.development.js.map +0 -0
  264. package/dist/node-dev/_virtual/with-selector.development.mjs +5 -0
  265. package/dist/node-dev/_virtual/with-selector.development.mjs.map +1 -0
  266. package/dist/{dev → node-dev}/_virtual/with-selector.js +0 -0
  267. package/dist/{dev → node-dev}/_virtual/with-selector.js.map +0 -0
  268. package/dist/node-dev/_virtual/with-selector.mjs +5 -0
  269. package/dist/node-dev/_virtual/with-selector.mjs.map +1 -0
  270. package/dist/{dev → node-dev}/_virtual/with-selector.production.min.js +0 -0
  271. package/dist/{dev → node-dev}/_virtual/with-selector.production.min.js.map +0 -0
  272. package/dist/node-dev/_virtual/with-selector.production.min.mjs +5 -0
  273. package/dist/node-dev/_virtual/with-selector.production.min.mjs.map +1 -0
  274. package/dist/{dev → node-dev}/cart-constants.js +0 -2
  275. package/dist/node-dev/cart-constants.js.map +1 -0
  276. package/dist/node-dev/cart-constants.mjs +15 -0
  277. package/dist/node-dev/cart-constants.mjs.map +1 -0
  278. package/dist/{dev → node-dev}/cart-hooks.js +8 -12
  279. package/dist/node-dev/cart-hooks.js.map +1 -0
  280. package/dist/node-dev/cart-hooks.mjs +44 -0
  281. package/dist/node-dev/cart-hooks.mjs.map +1 -0
  282. package/dist/{dev → node-dev}/cart-queries.js +0 -0
  283. package/dist/{dev → node-dev}/cart-queries.js.map +0 -0
  284. package/dist/node-dev/cart-queries.mjs +114 -0
  285. package/dist/node-dev/cart-queries.mjs.map +1 -0
  286. package/dist/node-dev/codegen.helpers.js +12 -0
  287. package/dist/node-dev/codegen.helpers.js.map +1 -0
  288. package/dist/node-dev/codegen.helpers.mjs +12 -0
  289. package/dist/node-dev/codegen.helpers.mjs.map +1 -0
  290. package/dist/{dev → node-dev}/flatten-connection.js +0 -0
  291. package/dist/{dev → node-dev}/flatten-connection.js.map +0 -0
  292. package/dist/node-dev/flatten-connection.mjs +29 -0
  293. package/dist/node-dev/flatten-connection.mjs.map +1 -0
  294. package/dist/{dev → node-dev}/image-size.js +0 -0
  295. package/dist/{dev → node-dev}/image-size.js.map +0 -0
  296. package/dist/node-dev/image-size.mjs +80 -0
  297. package/dist/node-dev/image-size.mjs.map +1 -0
  298. package/dist/{dev → node-dev}/index.js +2 -0
  299. package/dist/{dev → node-dev}/index.js.map +1 -1
  300. package/dist/node-dev/index.mjs +48 -0
  301. package/dist/node-dev/index.mjs.map +1 -0
  302. package/dist/{dev → node-dev}/load-script.js +0 -0
  303. package/dist/{dev → node-dev}/load-script.js.map +1 -1
  304. package/dist/node-dev/load-script.mjs +52 -0
  305. package/dist/node-dev/load-script.mjs.map +1 -0
  306. package/dist/{dev → node-dev}/metafield-parser.js +0 -0
  307. package/dist/node-dev/metafield-parser.js.map +1 -0
  308. package/dist/node-dev/metafield-parser.mjs +103 -0
  309. package/dist/node-dev/metafield-parser.mjs.map +1 -0
  310. package/dist/{dev → node-dev}/node_modules/@xstate/fsm/es/index.js +0 -0
  311. package/dist/{dev → node-dev}/node_modules/@xstate/fsm/es/index.js.map +0 -0
  312. package/dist/node-dev/node_modules/@xstate/fsm/es/index.mjs +159 -0
  313. package/dist/node-dev/node_modules/@xstate/fsm/es/index.mjs.map +1 -0
  314. package/dist/{dev → node-dev}/node_modules/@xstate/react/es/fsm.js +2 -2
  315. package/dist/{dev → node-dev}/node_modules/@xstate/react/es/fsm.js.map +1 -1
  316. package/dist/node-dev/node_modules/@xstate/react/es/fsm.mjs +94 -0
  317. package/dist/node-dev/node_modules/@xstate/react/es/fsm.mjs.map +1 -0
  318. package/dist/{dev → node-dev}/node_modules/@xstate/react/es/useConstant.js +0 -0
  319. package/dist/{dev → node-dev}/node_modules/@xstate/react/es/useConstant.js.map +0 -0
  320. package/dist/node-dev/node_modules/@xstate/react/es/useConstant.mjs +12 -0
  321. package/dist/node-dev/node_modules/@xstate/react/es/useConstant.mjs.map +1 -0
  322. package/dist/node-dev/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.esm.js +5 -0
  323. package/dist/node-dev/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.esm.js.map +1 -0
  324. package/dist/node-dev/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.esm.mjs +6 -0
  325. package/dist/node-dev/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.esm.mjs.map +1 -0
  326. package/dist/{dev → node-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +0 -0
  327. package/dist/{dev → node-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js.map +0 -0
  328. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs +105 -0
  329. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs.map +1 -0
  330. package/dist/{dev → node-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js +0 -0
  331. package/dist/{dev → node-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js.map +0 -0
  332. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.mjs +72 -0
  333. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.mjs.map +1 -0
  334. package/dist/{dev → node-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +0 -0
  335. package/dist/{dev → node-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +0 -0
  336. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs +136 -0
  337. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs.map +1 -0
  338. package/dist/{dev → node-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js +0 -0
  339. package/dist/{dev → node-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js.map +0 -0
  340. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.mjs +58 -0
  341. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.mjs.map +1 -0
  342. package/dist/{dev → node-dev}/node_modules/use-sync-external-store/shim/index.js +0 -0
  343. package/dist/{dev → node-dev}/node_modules/use-sync-external-store/shim/index.js.map +0 -0
  344. package/dist/node-dev/node_modules/use-sync-external-store/shim/index.mjs +21 -0
  345. package/dist/node-dev/node_modules/use-sync-external-store/shim/index.mjs.map +1 -0
  346. package/dist/{dev → node-dev}/node_modules/use-sync-external-store/shim/with-selector.js +0 -0
  347. package/dist/{dev → node-dev}/node_modules/use-sync-external-store/shim/with-selector.js.map +0 -0
  348. package/dist/node-dev/node_modules/use-sync-external-store/shim/with-selector.mjs +11 -0
  349. package/dist/node-dev/node_modules/use-sync-external-store/shim/with-selector.mjs.map +1 -0
  350. package/dist/{dev → node-dev}/storefront-api-constants.js +0 -0
  351. package/dist/{dev → node-dev}/storefront-api-constants.js.map +0 -0
  352. package/dist/node-dev/storefront-api-constants.mjs +5 -0
  353. package/dist/node-dev/storefront-api-constants.mjs.map +1 -0
  354. package/dist/{dev → node-dev}/storefront-client.js +21 -9
  355. package/dist/node-dev/storefront-client.js.map +1 -0
  356. package/dist/node-dev/storefront-client.mjs +84 -0
  357. package/dist/node-dev/storefront-client.mjs.map +1 -0
  358. package/dist/{dev → node-dev}/useCartAPIStateMachine.js +0 -0
  359. package/dist/{dev → node-dev}/useCartAPIStateMachine.js.map +1 -1
  360. package/dist/node-dev/useCartAPIStateMachine.mjs +326 -0
  361. package/dist/node-dev/useCartAPIStateMachine.mjs.map +1 -0
  362. package/dist/{dev → node-dev}/useCartActions.js +0 -0
  363. package/dist/{prod → node-dev}/useCartActions.js.map +1 -1
  364. package/dist/node-dev/useCartActions.mjs +123 -0
  365. package/dist/node-dev/useCartActions.mjs.map +1 -0
  366. package/dist/{dev → node-dev}/useMoney.js +0 -0
  367. package/dist/{prod → node-dev}/useMoney.js.map +1 -1
  368. package/dist/node-dev/useMoney.mjs +72 -0
  369. package/dist/node-dev/useMoney.mjs.map +1 -0
  370. package/dist/{prod → node-prod}/AddToCartButton.js +0 -0
  371. package/dist/node-prod/AddToCartButton.js.map +1 -0
  372. package/dist/node-prod/AddToCartButton.mjs +70 -0
  373. package/dist/node-prod/AddToCartButton.mjs.map +1 -0
  374. package/dist/{prod → node-prod}/BaseButton.js +0 -0
  375. package/dist/{prod → node-prod}/BaseButton.js.map +1 -1
  376. package/dist/node-prod/BaseButton.mjs +31 -0
  377. package/dist/node-prod/BaseButton.mjs.map +1 -0
  378. package/dist/{prod → node-prod}/BuyNowButton.js +0 -0
  379. package/dist/{prod → node-prod}/BuyNowButton.js.map +1 -1
  380. package/dist/node-prod/BuyNowButton.mjs +45 -0
  381. package/dist/node-prod/BuyNowButton.mjs.map +1 -0
  382. package/dist/{prod → node-prod}/CartCheckoutButton.js +0 -0
  383. package/dist/{prod → node-prod}/CartCheckoutButton.js.map +1 -1
  384. package/dist/node-prod/CartCheckoutButton.mjs +30 -0
  385. package/dist/node-prod/CartCheckoutButton.mjs.map +1 -0
  386. package/dist/{prod → node-prod}/CartProvider.js +0 -0
  387. package/dist/{dev → node-prod}/CartProvider.js.map +1 -1
  388. package/dist/node-prod/CartProvider.mjs +485 -0
  389. package/dist/node-prod/CartProvider.mjs.map +1 -0
  390. package/dist/{prod → node-prod}/ExternalVideo.js +0 -0
  391. package/dist/{prod → node-prod}/ExternalVideo.js.map +1 -1
  392. package/dist/node-prod/ExternalVideo.mjs +39 -0
  393. package/dist/node-prod/ExternalVideo.mjs.map +1 -0
  394. package/dist/{prod → node-prod}/Image.js +0 -0
  395. package/dist/{prod → node-prod}/Image.js.map +1 -1
  396. package/dist/node-prod/Image.mjs +99 -0
  397. package/dist/node-prod/Image.mjs.map +1 -0
  398. package/dist/{prod → node-prod}/MediaFile.js +2 -2
  399. package/dist/node-prod/MediaFile.js.map +1 -0
  400. package/dist/node-prod/MediaFile.mjs +59 -0
  401. package/dist/node-prod/MediaFile.mjs.map +1 -0
  402. package/dist/{prod → node-prod}/Metafield.js +0 -0
  403. package/dist/{prod → node-prod}/Metafield.js.map +1 -1
  404. package/dist/node-prod/Metafield.mjs +288 -0
  405. package/dist/node-prod/Metafield.mjs.map +1 -0
  406. package/dist/{prod → node-prod}/ModelViewer.js +0 -0
  407. package/dist/{prod → node-prod}/ModelViewer.js.map +1 -1
  408. package/dist/node-prod/ModelViewer.mjs +143 -0
  409. package/dist/node-prod/ModelViewer.mjs.map +1 -0
  410. package/dist/{prod → node-prod}/Money.js +0 -0
  411. package/dist/{prod → node-prod}/Money.js.map +1 -1
  412. package/dist/node-prod/Money.mjs +40 -0
  413. package/dist/node-prod/Money.mjs.map +1 -0
  414. package/dist/{prod → node-prod}/ProductPrice.js +0 -0
  415. package/dist/{prod → node-prod}/ProductPrice.js.map +1 -1
  416. package/dist/node-prod/ProductPrice.mjs +61 -0
  417. package/dist/node-prod/ProductPrice.mjs.map +1 -0
  418. package/dist/{prod → node-prod}/ProductProvider.js +0 -0
  419. package/dist/{dev → node-prod}/ProductProvider.js.map +1 -1
  420. package/dist/node-prod/ProductProvider.mjs +161 -0
  421. package/dist/node-prod/ProductProvider.mjs.map +1 -0
  422. package/dist/{prod → node-prod}/ShopPayButton.js +0 -0
  423. package/dist/{dev → node-prod}/ShopPayButton.js.map +1 -1
  424. package/dist/node-prod/ShopPayButton.mjs +64 -0
  425. package/dist/node-prod/ShopPayButton.mjs.map +1 -0
  426. package/dist/node-prod/ShopifyProvider.js +80 -0
  427. package/dist/node-prod/ShopifyProvider.js.map +1 -0
  428. package/dist/node-prod/ShopifyProvider.mjs +80 -0
  429. package/dist/node-prod/ShopifyProvider.mjs.map +1 -0
  430. package/dist/{prod → node-prod}/Video.js +0 -0
  431. package/dist/{prod → node-prod}/Video.js.map +1 -1
  432. package/dist/node-prod/Video.mjs +44 -0
  433. package/dist/node-prod/Video.mjs.map +1 -0
  434. package/dist/{prod → node-prod}/_virtual/index.js +0 -0
  435. package/dist/{prod → node-prod}/_virtual/index.js.map +0 -0
  436. package/dist/node-prod/_virtual/index.mjs +5 -0
  437. package/dist/{prod → node-prod/_virtual}/index.mjs.map +1 -1
  438. package/dist/{prod → node-prod}/_virtual/use-sync-external-store-shim.development.js +0 -0
  439. package/dist/{prod → node-prod}/_virtual/use-sync-external-store-shim.development.js.map +0 -0
  440. package/dist/node-prod/_virtual/use-sync-external-store-shim.development.mjs +5 -0
  441. package/dist/node-prod/_virtual/use-sync-external-store-shim.development.mjs.map +1 -0
  442. package/dist/{prod → node-prod}/_virtual/use-sync-external-store-shim.production.min.js +0 -0
  443. package/dist/{prod → node-prod}/_virtual/use-sync-external-store-shim.production.min.js.map +0 -0
  444. package/dist/node-prod/_virtual/use-sync-external-store-shim.production.min.mjs +5 -0
  445. package/dist/node-prod/_virtual/use-sync-external-store-shim.production.min.mjs.map +1 -0
  446. package/dist/{prod → node-prod}/_virtual/with-selector.development.js +0 -0
  447. package/dist/{prod → node-prod}/_virtual/with-selector.development.js.map +0 -0
  448. package/dist/node-prod/_virtual/with-selector.development.mjs +5 -0
  449. package/dist/node-prod/_virtual/with-selector.development.mjs.map +1 -0
  450. package/dist/{prod → node-prod}/_virtual/with-selector.js +0 -0
  451. package/dist/{prod → node-prod}/_virtual/with-selector.js.map +0 -0
  452. package/dist/node-prod/_virtual/with-selector.mjs +5 -0
  453. package/dist/node-prod/_virtual/with-selector.mjs.map +1 -0
  454. package/dist/{prod → node-prod}/_virtual/with-selector.production.min.js +0 -0
  455. package/dist/{prod → node-prod}/_virtual/with-selector.production.min.js.map +0 -0
  456. package/dist/node-prod/_virtual/with-selector.production.min.mjs +5 -0
  457. package/dist/node-prod/_virtual/with-selector.production.min.mjs.map +1 -0
  458. package/dist/{prod → node-prod}/cart-constants.js +0 -2
  459. package/dist/node-prod/cart-constants.js.map +1 -0
  460. package/dist/node-prod/cart-constants.mjs +15 -0
  461. package/dist/node-prod/cart-constants.mjs.map +1 -0
  462. package/dist/{prod → node-prod}/cart-hooks.js +8 -12
  463. package/dist/node-prod/cart-hooks.js.map +1 -0
  464. package/dist/node-prod/cart-hooks.mjs +44 -0
  465. package/dist/node-prod/cart-hooks.mjs.map +1 -0
  466. package/dist/{prod → node-prod}/cart-queries.js +0 -0
  467. package/dist/{prod → node-prod}/cart-queries.js.map +0 -0
  468. package/dist/node-prod/cart-queries.mjs +114 -0
  469. package/dist/node-prod/cart-queries.mjs.map +1 -0
  470. package/dist/node-prod/codegen.helpers.js +12 -0
  471. package/dist/node-prod/codegen.helpers.js.map +1 -0
  472. package/dist/node-prod/codegen.helpers.mjs +12 -0
  473. package/dist/node-prod/codegen.helpers.mjs.map +1 -0
  474. package/dist/{prod → node-prod}/flatten-connection.js +0 -0
  475. package/dist/{prod → node-prod}/flatten-connection.js.map +0 -0
  476. package/dist/node-prod/flatten-connection.mjs +25 -0
  477. package/dist/node-prod/flatten-connection.mjs.map +1 -0
  478. package/dist/{prod → node-prod}/image-size.js +0 -0
  479. package/dist/{prod → node-prod}/image-size.js.map +0 -0
  480. package/dist/node-prod/image-size.mjs +80 -0
  481. package/dist/node-prod/image-size.mjs.map +1 -0
  482. package/dist/{prod → node-prod}/index.js +2 -0
  483. package/dist/{prod → node-prod}/index.js.map +1 -1
  484. package/dist/node-prod/index.mjs +48 -0
  485. package/dist/node-prod/index.mjs.map +1 -0
  486. package/dist/{prod → node-prod}/load-script.js +0 -0
  487. package/dist/{prod → node-prod}/load-script.js.map +1 -1
  488. package/dist/node-prod/load-script.mjs +52 -0
  489. package/dist/node-prod/load-script.mjs.map +1 -0
  490. package/dist/{prod → node-prod}/metafield-parser.js +0 -0
  491. package/dist/node-prod/metafield-parser.js.map +1 -0
  492. package/dist/node-prod/metafield-parser.mjs +114 -0
  493. package/dist/node-prod/metafield-parser.mjs.map +1 -0
  494. package/dist/{prod → node-prod}/node_modules/@xstate/fsm/es/index.js +0 -0
  495. package/dist/{prod → node-prod}/node_modules/@xstate/fsm/es/index.js.map +0 -0
  496. package/dist/node-prod/node_modules/@xstate/fsm/es/index.mjs +159 -0
  497. package/dist/node-prod/node_modules/@xstate/fsm/es/index.mjs.map +1 -0
  498. package/dist/{prod → node-prod}/node_modules/@xstate/react/es/fsm.js +2 -2
  499. package/dist/{prod → node-prod}/node_modules/@xstate/react/es/fsm.js.map +1 -1
  500. package/dist/node-prod/node_modules/@xstate/react/es/fsm.mjs +94 -0
  501. package/dist/node-prod/node_modules/@xstate/react/es/fsm.mjs.map +1 -0
  502. package/dist/{prod → node-prod}/node_modules/@xstate/react/es/useConstant.js +0 -0
  503. package/dist/{prod → node-prod}/node_modules/@xstate/react/es/useConstant.js.map +0 -0
  504. package/dist/node-prod/node_modules/@xstate/react/es/useConstant.mjs +12 -0
  505. package/dist/node-prod/node_modules/@xstate/react/es/useConstant.mjs.map +1 -0
  506. package/dist/node-prod/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.esm.js +5 -0
  507. package/dist/node-prod/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.esm.js.map +1 -0
  508. package/dist/node-prod/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.esm.mjs +6 -0
  509. package/dist/node-prod/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.esm.mjs.map +1 -0
  510. package/dist/{prod → node-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +0 -0
  511. package/dist/{prod → node-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js.map +0 -0
  512. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs +105 -0
  513. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs.map +1 -0
  514. package/dist/{prod → node-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js +0 -0
  515. package/dist/{prod → node-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js.map +0 -0
  516. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.mjs +72 -0
  517. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.mjs.map +1 -0
  518. package/dist/{prod → node-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +0 -0
  519. package/dist/{prod → node-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +0 -0
  520. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs +136 -0
  521. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs.map +1 -0
  522. package/dist/{prod → node-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js +0 -0
  523. package/dist/{prod → node-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js.map +0 -0
  524. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.mjs +58 -0
  525. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.mjs.map +1 -0
  526. package/dist/{prod → node-prod}/node_modules/use-sync-external-store/shim/index.js +0 -0
  527. package/dist/{prod → node-prod}/node_modules/use-sync-external-store/shim/index.js.map +0 -0
  528. package/dist/node-prod/node_modules/use-sync-external-store/shim/index.mjs +21 -0
  529. package/dist/node-prod/node_modules/use-sync-external-store/shim/index.mjs.map +1 -0
  530. package/dist/{prod → node-prod}/node_modules/use-sync-external-store/shim/with-selector.js +0 -0
  531. package/dist/{prod → node-prod}/node_modules/use-sync-external-store/shim/with-selector.js.map +0 -0
  532. package/dist/node-prod/node_modules/use-sync-external-store/shim/with-selector.mjs +11 -0
  533. package/dist/node-prod/node_modules/use-sync-external-store/shim/with-selector.mjs.map +1 -0
  534. package/dist/{prod → node-prod}/storefront-api-constants.js +0 -0
  535. package/dist/{prod → node-prod}/storefront-api-constants.js.map +0 -0
  536. package/dist/node-prod/storefront-api-constants.mjs +5 -0
  537. package/dist/node-prod/storefront-api-constants.mjs.map +1 -0
  538. package/dist/{prod → node-prod}/storefront-client.js +21 -9
  539. package/dist/node-prod/storefront-client.js.map +1 -0
  540. package/dist/node-prod/storefront-client.mjs +69 -0
  541. package/dist/node-prod/storefront-client.mjs.map +1 -0
  542. package/dist/{prod → node-prod}/useCartAPIStateMachine.js +0 -0
  543. package/dist/{prod → node-prod}/useCartAPIStateMachine.js.map +1 -1
  544. package/dist/node-prod/useCartAPIStateMachine.mjs +326 -0
  545. package/dist/node-prod/useCartAPIStateMachine.mjs.map +1 -0
  546. package/dist/{prod → node-prod}/useCartActions.js +0 -0
  547. package/dist/{dev → node-prod}/useCartActions.js.map +1 -1
  548. package/dist/node-prod/useCartActions.mjs +123 -0
  549. package/dist/node-prod/useCartActions.mjs.map +1 -0
  550. package/dist/{prod → node-prod}/useMoney.js +0 -0
  551. package/dist/{dev → node-prod}/useMoney.js.map +1 -1
  552. package/dist/node-prod/useMoney.mjs +72 -0
  553. package/dist/node-prod/useMoney.mjs.map +1 -0
  554. package/dist/types/AddToCartButton.d.ts +1 -2
  555. package/dist/types/BaseButton.d.ts +1 -1
  556. package/dist/types/CartCheckoutButton.d.ts +1 -1
  557. package/dist/types/CartLinePrice.d.ts +17 -0
  558. package/dist/types/CartLineProvider.d.ts +16 -0
  559. package/dist/types/ExternalVideo.d.ts +3 -3
  560. package/dist/types/Image.d.ts +4 -4
  561. package/dist/types/MediaFile.d.ts +5 -5
  562. package/dist/types/Metafield.d.ts +2 -2
  563. package/dist/types/ModelViewer.d.ts +2 -2
  564. package/dist/types/Money.d.ts +1 -1
  565. package/dist/types/ProductProvider.d.ts +3 -3
  566. package/dist/types/ShopPayButton.d.ts +1 -1
  567. package/dist/types/ShopifyProvider.d.ts +48 -5
  568. package/dist/types/cart-constants.d.ts +0 -1
  569. package/dist/types/cart-types.d.ts +21 -21
  570. package/dist/types/codegen.helpers.d.ts +9 -0
  571. package/dist/types/image-size.d.ts +3 -3
  572. package/dist/types/index.d.cts +1 -0
  573. package/dist/types/index.d.ts +1 -0
  574. package/dist/types/load-script.d.ts +2 -2
  575. package/dist/types/metafield-parser.d.ts +27 -27
  576. package/dist/types/storefront-api-response.types.d.ts +6 -6
  577. package/dist/types/storefront-api-types.d.ts +1 -1
  578. package/dist/types/storefront-client.d.ts +20 -5
  579. package/dist/types/useCartActions.d.ts +1 -1
  580. package/dist/types/useMoney.d.ts +1 -1
  581. package/dist/umd/hydrogen-react.dev.js +143 -89
  582. package/dist/umd/hydrogen-react.dev.js.map +1 -1
  583. package/dist/umd/hydrogen-react.prod.js +16 -16
  584. package/dist/umd/hydrogen-react.prod.js.map +1 -1
  585. package/package.json +44 -29
  586. package/dist/dev/AddToCartButton.js.map +0 -1
  587. package/dist/dev/AddToCartButton.mjs.map +0 -1
  588. package/dist/dev/MediaFile.js.map +0 -1
  589. package/dist/dev/MediaFile.mjs.map +0 -1
  590. package/dist/dev/ShopifyProvider.js +0 -46
  591. package/dist/dev/ShopifyProvider.js.map +0 -1
  592. package/dist/dev/ShopifyProvider.mjs +0 -46
  593. package/dist/dev/ShopifyProvider.mjs.map +0 -1
  594. package/dist/dev/cart-constants.js.map +0 -1
  595. package/dist/dev/cart-constants.mjs.map +0 -1
  596. package/dist/dev/cart-hooks.js.map +0 -1
  597. package/dist/dev/cart-hooks.mjs.map +0 -1
  598. package/dist/dev/metafield-parser.js.map +0 -1
  599. package/dist/dev/metafield-parser.mjs.map +0 -1
  600. package/dist/dev/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js +0 -5
  601. package/dist/dev/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js.map +0 -1
  602. package/dist/dev/storefront-client.js.map +0 -1
  603. package/dist/dev/storefront-client.mjs.map +0 -1
  604. package/dist/prod/AddToCartButton.js.map +0 -1
  605. package/dist/prod/AddToCartButton.mjs.map +0 -1
  606. package/dist/prod/MediaFile.js.map +0 -1
  607. package/dist/prod/MediaFile.mjs.map +0 -1
  608. package/dist/prod/ShopifyProvider.js +0 -46
  609. package/dist/prod/ShopifyProvider.js.map +0 -1
  610. package/dist/prod/ShopifyProvider.mjs +0 -46
  611. package/dist/prod/ShopifyProvider.mjs.map +0 -1
  612. package/dist/prod/cart-constants.js.map +0 -1
  613. package/dist/prod/cart-constants.mjs.map +0 -1
  614. package/dist/prod/cart-hooks.js.map +0 -1
  615. package/dist/prod/cart-hooks.mjs.map +0 -1
  616. package/dist/prod/metafield-parser.js.map +0 -1
  617. package/dist/prod/metafield-parser.mjs.map +0 -1
  618. package/dist/prod/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js +0 -5
  619. package/dist/prod/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js.map +0 -1
  620. package/dist/prod/storefront-client.js.map +0 -1
  621. package/dist/prod/storefront-client.mjs.map +0 -1
package/README.md CHANGED
@@ -59,6 +59,7 @@ const client = createStorefrontClient({
59
59
 
60
60
  export const getStorefrontApiUrl = client.getStorefrontApiUrl;
61
61
  export const getPrivateTokenHeaders = client.getPrivateTokenHeaders;
62
+ export const getShopifyDomain = client.getShopifyDomain;
62
63
  ```
63
64
 
64
65
  You can then use this in your server-side queries. Here's an example of using it for [NextJS's `getServerSideProps`](https://nextjs.org/docs/basic-features/data-fetching/get-server-side-props):
@@ -84,6 +85,31 @@ export async function getServerSideProps() {
84
85
  }
85
86
  ```
86
87
 
88
+ You can also use this to proxy the liquid online store:
89
+
90
+ ```ts
91
+ // Next.js API route support: https://nextjs.org/docs/api-routes/introduction
92
+ import {getShopifyDomain} from '../shopify-client.js';
93
+
94
+ export default function handler(req, res) {
95
+ fetch(getShopifyDomain() + '/products', {
96
+ headers: {
97
+ /** forward some of the headers from the original request **/
98
+ },
99
+ })
100
+ .then((resp) => resp.text())
101
+ .then((text) => res.status(200).send(text))
102
+ .catch((error) => {
103
+ console.error(
104
+ `Error proxying the online store: ${
105
+ error instanceof Error ? error.stack : error
106
+ }`
107
+ );
108
+ res.status(500).send('Server error occurred');
109
+ });
110
+ }
111
+ ```
112
+
87
113
  ### (Optional) Set the content type for the Storefront client
88
114
 
89
115
  By default, the Storefront client sends the `"content-type": "application/json"` header. Use the `json` content type when you have GraphQL variables and when the body is an object with the following shape:
@@ -154,6 +180,29 @@ If you're having trouble getting it to work, then consult our [troubleshooting s
154
180
 
155
181
  Improve your development experience by adding strong typing to Storefront API responses. The following are some options for doing this.
156
182
 
183
+ ## GraphQL CodeGen
184
+
185
+ To use GraphQL CodeGen, follow [their guide](https://the-guild.dev/graphql/codegen/docs/getting-started/installation) to get started. Then, when you have a `codegen.ts` file, you can modify the following lines in the codegen object to improve the CodgeGen experience:
186
+
187
+ ```ts
188
+ import {storefrontApiCustomScalars} from '@shopify/hydrogen-react';
189
+
190
+ const config: CodegenConfig = {
191
+ // Use the schema that's bundled with @shopify/hydrogen-react
192
+ schema: './node_modules/@shopify/hydrogen-react/storefront.schema.json',
193
+ generates: {
194
+ './gql/': {
195
+ preset: 'client',
196
+ plugins: [],
197
+ config: {
198
+ // Use the custom scalar definitions that @shopify/hydrogen-react provides to improve the types
199
+ scalars: storefrontApiCustomScalars,
200
+ },
201
+ },
202
+ },
203
+ };
204
+ ```
205
+
157
206
  ### Use the `StorefrontApiResponseError` and `StorefrontApiResponseOk` helpers
158
207
 
159
208
  The following is an example:
File without changes
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddToCartButton.mjs","sources":["../../src/AddToCartButton.tsx"],"sourcesContent":["import {useCallback, useEffect, useState} from 'react';\n\nimport {useCart} from './CartProvider.js';\nimport {useProduct} from './ProductProvider.js';\nimport {BaseButton, BaseButtonProps} from './BaseButton.js';\n\nexport interface AddToCartButtonProps {\n /** An array of cart line attributes that belong to the item being added to the cart. */\n attributes?: {\n key: string;\n value: string;\n }[];\n /** The ID of the variant. */\n variantId?: string | null;\n /** The item quantity. */\n quantity?: number;\n /** The text that is announced by the screen reader when the item is being added to the cart. Used for accessibility purposes only and not displayed on the page. */\n accessibleAddingToCartLabel?: string;\n /** The selling plan ID of the subscription variant */\n sellingPlanId?: string;\n}\n\n/**\n * The `AddToCartButton` component renders a button that adds an item to the cart when pressed.\n * It must be a descendent of the `CartProvider` component.\n */\nexport function AddToCartButton<AsType extends React.ElementType = 'button'>(\n props: AddToCartButtonProps & BaseButtonProps<AsType>\n) {\n const [addingItem, setAddingItem] = useState<boolean>(false);\n const {\n variantId: explicitVariantId,\n quantity = 1,\n attributes,\n sellingPlanId,\n onClick,\n children,\n accessibleAddingToCartLabel,\n ...passthroughProps\n } = props;\n const {status, linesAdd} = useCart();\n const {selectedVariant} = useProduct();\n const variantId = explicitVariantId ?? selectedVariant?.id ?? '';\n const disabled =\n explicitVariantId === null ||\n variantId === '' ||\n selectedVariant === null ||\n addingItem ||\n passthroughProps.disabled;\n\n useEffect(() => {\n if (addingItem && status === 'idle') {\n setAddingItem(false);\n }\n }, [status, addingItem]);\n\n const handleAddItem = useCallback(() => {\n setAddingItem(true);\n linesAdd([\n {\n quantity,\n merchandiseId: variantId || '',\n attributes,\n sellingPlanId,\n },\n ]);\n }, [linesAdd, quantity, variantId, attributes, sellingPlanId]);\n\n return (\n <>\n <BaseButton\n {...passthroughProps}\n disabled={disabled}\n onClick={onClick}\n defaultOnClick={handleAddItem}\n >\n {children}\n </BaseButton>\n {accessibleAddingToCartLabel ? (\n <p\n style={{\n position: 'absolute',\n width: '1px',\n height: '1px',\n padding: '0',\n margin: '-1px',\n overflow: 'hidden',\n clip: 'rect(0, 0, 0, 0)',\n whiteSpace: 'nowrap',\n borderWidth: '0',\n }}\n role=\"alert\"\n aria-live=\"assertive\"\n >\n {addingItem ? accessibleAddingToCartLabel : null}\n </p>\n ) : null}\n </>\n );\n}\n"],"names":["AddToCartButton","props","addingItem","setAddingItem","useState","variantId","explicitVariantId","quantity","attributes","sellingPlanId","onClick","children","accessibleAddingToCartLabel","passthroughProps","status","linesAdd","useCart","selectedVariant","useProduct","id","disabled","useEffect","handleAddItem","useCallback","merchandiseId","_Fragment","_jsx","position","width","height","padding","margin","overflow","clip","whiteSpace","borderWidth"],"mappings":";;;;;AA0BO,SAASA,gBACdC,OACA;;AACA,QAAM,CAACC,YAAYC,aAAa,IAAIC,SAAkB,KAAK;AACrD,QAAA;AAAA,IACJC,WAAWC;AAAAA,IACXC,WAAW;AAAA,IACXC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,OACGC;AAAAA,EACDZ,IAAAA;AACE,QAAA;AAAA,IAACa;AAAAA,IAAQC;AAAAA,MAAYC,QAAS;AAC9B,QAAA;AAAA,IAACC;AAAAA,MAAmBC,WAAY;AAChCb,QAAAA,aAAYC,qDAAqBW,mDAAiBE,OAAtCb,YAA4C;AACxDc,QAAAA,WACJd,sBAAsB,QACtBD,cAAc,MACdY,oBAAoB,QACpBf,cACAW,iBAAiBO;AAEnBC,YAAU,MAAM;AACVnB,QAAAA,cAAcY,WAAW,QAAQ;AACnCX,oBAAc,KAAK;AAAA,IACrB;AAAA,EAAA,GACC,CAACW,QAAQZ,UAAU,CAAC;AAEjBoB,QAAAA,gBAAgBC,YAAY,MAAM;AACtCpB,kBAAc,IAAI;AAClBY,aAAS,CACP;AAAA,MACER;AAAAA,MACAiB,eAAenB,aAAa;AAAA,MAC5BG;AAAAA,MACAC;AAAAA,IACD,CAAA,CACF;AAAA,EAAA,GACA,CAACM,UAAUR,UAAUF,WAAWG,YAAYC,aAAa,CAAC;AAE7D,8BACEgB,UAAA;AAAA,IAAA,UAAA,CACEC,oBAAC,YAAU;AAAA,MAAA,GACLb;AAAAA,MACJ;AAAA,MACA;AAAA,MACA,gBAAgBS;AAAAA,MAAc;AAAA,IAAA,CAGnB,GACZV,8BACCc,oBAAA,KAAA;AAAA,MACE,OAAO;AAAA,QACLC,UAAU;AAAA,QACVC,OAAO;AAAA,QACPC,QAAQ;AAAA,QACRC,SAAS;AAAA,QACTC,QAAQ;AAAA,QACRC,UAAU;AAAA,QACVC,MAAM;AAAA,QACNC,YAAY;AAAA,QACZC,aAAa;AAAA,MACf;AAAA,MACA,MAAK;AAAA,MACL,aAAU;AAAA,MAAW,UAEpBjC,aAAaU,8BAA8B;AAAA,IAAI,CAAA,IAEhD,IAAI;AAAA,EAAA,CACP;AAEP;"}
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"BaseButton.mjs","sources":["../../src/BaseButton.tsx"],"sourcesContent":["import {ReactNode, Ref, useCallback} from 'react';\n\nexport interface CustomBaseButtonProps<AsType> {\n /** Provide a React element or component to render as the underlying button. Note: for accessibility compliance, almost always you should use a `button` element, or a component that renders an underlying button. */\n as?: AsType;\n /** Any ReactNode elements. */\n children: ReactNode;\n /** Click event handler. Default behaviour triggers unless prevented */\n onClick?: (\n event?: React.MouseEvent<HTMLButtonElement, MouseEvent>\n ) => void | boolean;\n /** A default onClick behavior */\n defaultOnClick?: (\n event?: React.MouseEvent<HTMLButtonElement, MouseEvent>\n ) => void | boolean;\n /** A ref to the underlying button */\n buttonRef?: Ref<HTMLButtonElement>;\n}\n\nexport type BaseButtonProps<AsType extends React.ElementType> =\n CustomBaseButtonProps<AsType> &\n Omit<\n React.ComponentPropsWithoutRef<AsType>,\n keyof CustomBaseButtonProps<AsType>\n >;\n\nexport function BaseButton<AsType extends React.ElementType = 'button'>(\n props: BaseButtonProps<AsType>\n) {\n const {\n as,\n onClick,\n defaultOnClick,\n children,\n buttonRef,\n ...passthroughProps\n } = props;\n\n const handleOnClick = useCallback(\n (event?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n if (onClick) {\n const clickShouldContinue = onClick(event);\n if (\n (typeof clickShouldContinue === 'boolean' &&\n clickShouldContinue === false) ||\n event?.defaultPrevented\n )\n return;\n }\n\n defaultOnClick?.(event);\n },\n [defaultOnClick, onClick]\n );\n\n const Component = as || 'button';\n\n return (\n <Component ref={buttonRef} onClick={handleOnClick} {...passthroughProps}>\n {children}\n </Component>\n );\n}\n"],"names":["BaseButton","props","as","onClick","defaultOnClick","children","buttonRef","passthroughProps","handleOnClick","useCallback","event","clickShouldContinue","defaultPrevented","Component"],"mappings":";;AA0BO,SAASA,WACdC,OACA;AACM,QAAA;AAAA,IACJC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,OACGC;AAAAA,EACDN,IAAAA;AAEEO,QAAAA,gBAAgBC,YACpB,CAACC,UAA4D;AAC3D,QAAIP,SAAS;AACLQ,YAAAA,sBAAsBR,QAAQO,KAAD;AACnC,UACG,OAAOC,wBAAwB,aAC9BA,wBAAwB,UAC1BD,+BAAOE;AAEP;AAAA,IACH;AAEDR,qDAAiBM;AAAAA,EAAH,GAEhB,CAACN,gBAAgBD,OAAjB,CAd+B;AAiBjC,QAAMU,YAAYX,MAAM;AAExB,6BACG,WAAD;AAAA,IAAW,KAAKI;AAAAA,IAAW,SAASE;AAAAA,IAApC,GAAuDD;AAAAA,IAAvD;AAAA,EAAA,CADF;AAKD;"}
1
+ {"version":3,"file":"BaseButton.mjs","sources":["../../src/BaseButton.tsx"],"sourcesContent":["import {ReactNode, Ref, useCallback} from 'react';\n\nexport interface CustomBaseButtonProps<AsType> {\n /** Provide a React element or component to render as the underlying button. Note: for accessibility compliance, almost always you should use a `button` element, or a component that renders an underlying button. */\n as?: AsType;\n /** Any ReactNode elements. */\n children: ReactNode;\n /** Click event handler. Default behaviour triggers unless prevented */\n onClick?: (\n event?: React.MouseEvent<HTMLButtonElement, MouseEvent>\n ) => void | boolean;\n /** A default onClick behavior */\n defaultOnClick?: (\n event?: React.MouseEvent<HTMLButtonElement, MouseEvent>\n ) => void | boolean;\n /** A ref to the underlying button */\n buttonRef?: Ref<HTMLButtonElement>;\n}\n\nexport type BaseButtonProps<AsType extends React.ElementType> =\n CustomBaseButtonProps<AsType> &\n Omit<\n React.ComponentPropsWithoutRef<AsType>,\n keyof CustomBaseButtonProps<AsType>\n >;\n\nexport function BaseButton<AsType extends React.ElementType = 'button'>(\n props: BaseButtonProps<AsType>\n) {\n const {\n as,\n onClick,\n defaultOnClick,\n children,\n buttonRef,\n ...passthroughProps\n } = props;\n\n const handleOnClick = useCallback(\n (event?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n if (onClick) {\n const clickShouldContinue = onClick(event);\n if (\n (typeof clickShouldContinue === 'boolean' &&\n clickShouldContinue === false) ||\n event?.defaultPrevented\n )\n return;\n }\n\n defaultOnClick?.(event);\n },\n [defaultOnClick, onClick]\n );\n\n const Component = as || 'button';\n\n return (\n <Component ref={buttonRef} onClick={handleOnClick} {...passthroughProps}>\n {children}\n </Component>\n );\n}\n"],"names":["BaseButton","props","as","onClick","defaultOnClick","children","buttonRef","passthroughProps","handleOnClick","useCallback","event","clickShouldContinue","defaultPrevented","Component"],"mappings":";;AA0BO,SAASA,WACdC,OACA;AACM,QAAA;AAAA,IACJC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,OACGC;AAAAA,EACDN,IAAAA;AAEEO,QAAAA,gBAAgBC,YACpB,CAACC,UAA4D;AAC3D,QAAIP,SAAS;AACLQ,YAAAA,sBAAsBR,QAAQO,KAAK;AACzC,UACG,OAAOC,wBAAwB,aAC9BA,wBAAwB,UAC1BD,+BAAOE;AAEP;AAAA,IACJ;AAEAR,qDAAiBM;AAAAA,EAAK,GAExB,CAACN,gBAAgBD,OAAO,CAAC;AAG3B,QAAMU,YAAYX,MAAM;AAExB,6BACG,WAAS;AAAA,IAAC,KAAKI;AAAAA,IAAW,SAASE;AAAAA,IAAc,GAAKD;AAAAA,IAAgB;AAAA,EAAA,CAE3D;AAEhB;"}
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"BuyNowButton.mjs","sources":["../../src/BuyNowButton.tsx"],"sourcesContent":["import {useEffect, useState, useCallback} from 'react';\nimport {useCart} from './CartProvider.js';\nimport {BaseButton, BaseButtonProps} from './BaseButton.js';\n\ninterface BuyNowButtonProps {\n /** The item quantity. Defaults to 1. */\n quantity?: number;\n /** The ID of the variant. */\n variantId: string;\n /** An array of cart line attributes that belong to the item being added to the cart. */\n attributes?: {\n key: string;\n value: string;\n }[];\n}\n\n/** The `BuyNowButton` component renders a button that adds an item to the cart and redirects the customer to checkout. */\nexport function BuyNowButton<AsType extends React.ElementType = 'button'>(\n props: BuyNowButtonProps & BaseButtonProps<AsType>\n) {\n const {cartCreate, checkoutUrl} = useCart();\n const [loading, setLoading] = useState<boolean>(false);\n\n const {\n quantity,\n variantId,\n onClick,\n attributes,\n children,\n ...passthroughProps\n } = props;\n\n useEffect(() => {\n if (checkoutUrl) {\n window.location.href = checkoutUrl;\n }\n }, [checkoutUrl]);\n\n const handleBuyNow = useCallback(() => {\n setLoading(true);\n cartCreate({\n lines: [\n {\n quantity: quantity ?? 1,\n merchandiseId: variantId,\n attributes,\n },\n ],\n });\n }, [cartCreate, quantity, variantId, attributes]);\n\n return (\n <BaseButton\n disabled={loading ?? passthroughProps.disabled}\n {...passthroughProps}\n onClick={onClick}\n defaultOnClick={handleBuyNow}\n >\n {children}\n </BaseButton>\n );\n}\n"],"names":["BuyNowButton","props","cartCreate","checkoutUrl","useCart","loading","setLoading","useState","quantity","variantId","onClick","attributes","children","passthroughProps","useEffect","window","location","href","handleBuyNow","useCallback","lines","merchandiseId","disabled"],"mappings":";;;;AAiBO,SAASA,aACdC,OACA;AACM,QAAA;AAAA,IAACC;AAAAA,IAAYC;AAAAA,MAAeC,QAAlC;AACA,QAAM,CAACC,SAASC,UAAV,IAAwBC,SAAkB,KAAV;AAEhC,QAAA;AAAA,IACJC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,OACGC;AAAAA,EACDZ,IAAAA;AAEJa,YAAU,MAAM;AACd,QAAIX,aAAa;AACfY,aAAOC,SAASC,OAAOd;AAAAA,IACxB;AAAA,EAAA,GACA,CAACA,WAAD,CAJM;AAMHe,QAAAA,eAAeC,YAAY,MAAM;AACrCb,eAAW,IAAD;AACC,eAAA;AAAA,MACTc,OAAO,CACL;AAAA,QACEZ,UAAUA,8BAAY;AAAA,QACtBa,eAAeZ;AAAAA,QACfE;AAAAA,MAAAA,CAJG;AAAA,IAAA,CADC;AAAA,KAST,CAACT,YAAYM,UAAUC,WAAWE,UAAlC,CAX6B;AAahC,6BACG,YAAD;AAAA,IACE,UAAUN,4BAAWQ,iBAAiBS;AAAAA,IADxC,GAEMT;AAAAA,IACJ;AAAA,IACA,gBAAgBK;AAAAA,IAJlB;AAAA,EAAA,CADF;AAUD;"}
1
+ {"version":3,"file":"BuyNowButton.mjs","sources":["../../src/BuyNowButton.tsx"],"sourcesContent":["import {useEffect, useState, useCallback} from 'react';\nimport {useCart} from './CartProvider.js';\nimport {BaseButton, BaseButtonProps} from './BaseButton.js';\n\ninterface BuyNowButtonProps {\n /** The item quantity. Defaults to 1. */\n quantity?: number;\n /** The ID of the variant. */\n variantId: string;\n /** An array of cart line attributes that belong to the item being added to the cart. */\n attributes?: {\n key: string;\n value: string;\n }[];\n}\n\n/** The `BuyNowButton` component renders a button that adds an item to the cart and redirects the customer to checkout. */\nexport function BuyNowButton<AsType extends React.ElementType = 'button'>(\n props: BuyNowButtonProps & BaseButtonProps<AsType>\n) {\n const {cartCreate, checkoutUrl} = useCart();\n const [loading, setLoading] = useState<boolean>(false);\n\n const {\n quantity,\n variantId,\n onClick,\n attributes,\n children,\n ...passthroughProps\n } = props;\n\n useEffect(() => {\n if (checkoutUrl) {\n window.location.href = checkoutUrl;\n }\n }, [checkoutUrl]);\n\n const handleBuyNow = useCallback(() => {\n setLoading(true);\n cartCreate({\n lines: [\n {\n quantity: quantity ?? 1,\n merchandiseId: variantId,\n attributes,\n },\n ],\n });\n }, [cartCreate, quantity, variantId, attributes]);\n\n return (\n <BaseButton\n disabled={loading ?? passthroughProps.disabled}\n {...passthroughProps}\n onClick={onClick}\n defaultOnClick={handleBuyNow}\n >\n {children}\n </BaseButton>\n );\n}\n"],"names":["BuyNowButton","props","cartCreate","checkoutUrl","useCart","loading","setLoading","useState","quantity","variantId","onClick","attributes","children","passthroughProps","useEffect","window","location","href","handleBuyNow","useCallback","lines","merchandiseId","disabled"],"mappings":";;;;AAiBO,SAASA,aACdC,OACA;AACM,QAAA;AAAA,IAACC;AAAAA,IAAYC;AAAAA,MAAeC,QAAS;AAC3C,QAAM,CAACC,SAASC,UAAU,IAAIC,SAAkB,KAAK;AAE/C,QAAA;AAAA,IACJC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,OACGC;AAAAA,EACDZ,IAAAA;AAEJa,YAAU,MAAM;AACd,QAAIX,aAAa;AACfY,aAAOC,SAASC,OAAOd;AAAAA,IACzB;AAAA,EAAA,GACC,CAACA,WAAW,CAAC;AAEVe,QAAAA,eAAeC,YAAY,MAAM;AACrCb,eAAW,IAAI;AACJ,eAAA;AAAA,MACTc,OAAO,CACL;AAAA,QACEZ,UAAUA,8BAAY;AAAA,QACtBa,eAAeZ;AAAAA,QACfE;AAAAA,MAAAA,CACD;AAAA,IAAA,CAEJ;AAAA,KACA,CAACT,YAAYM,UAAUC,WAAWE,UAAU,CAAC;AAEhD,6BACG,YAAU;AAAA,IACT,UAAUN,4BAAWQ,iBAAiBS;AAAAA,IAAS,GAC3CT;AAAAA,IACJ;AAAA,IACA,gBAAgBK;AAAAA,IAAa;AAAA,EAAA,CAGlB;AAEjB;"}
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"CartCheckoutButton.mjs","sources":["../../src/CartCheckoutButton.tsx"],"sourcesContent":["import {ReactNode, useEffect, useState} from 'react';\nimport {useCart} from './CartProvider.js';\nimport {BaseButton, BaseButtonProps} from './BaseButton.js';\n\ntype PropsWeControl = 'onClick';\n\n/**\n * The `CartCheckoutButton` component renders a button that redirects to the checkout URL for the cart.\n * It must be a descendent of a `CartProvider` component.\n */\nexport function CartCheckoutButton(\n props: Omit<BaseButtonProps<'button'>, PropsWeControl> & {\n /** A `ReactNode` element. */\n children: ReactNode;\n }\n) {\n const [requestedCheckout, setRequestedCheckout] = useState(false);\n const {status, checkoutUrl} = useCart();\n const {children, ...passthroughProps} = props;\n\n useEffect(() => {\n if (requestedCheckout && checkoutUrl && status === 'idle') {\n window.location.href = checkoutUrl;\n }\n }, [requestedCheckout, status, checkoutUrl]);\n\n return (\n <BaseButton\n {...passthroughProps}\n disabled={requestedCheckout || passthroughProps.disabled}\n onClick={() => setRequestedCheckout(true)}\n >\n {children}\n </BaseButton>\n );\n}\n"],"names":["CartCheckoutButton","props","requestedCheckout","setRequestedCheckout","useState","status","checkoutUrl","useCart","children","passthroughProps","useEffect","window","location","href","disabled"],"mappings":";;;;AAUO,SAASA,mBACdC,OAIA;AACA,QAAM,CAACC,mBAAmBC,oBAApB,IAA4CC,SAAS,KAAD;AACpD,QAAA;AAAA,IAACC;AAAAA,IAAQC;AAAAA,MAAeC,QAA9B;AACM,QAAA;AAAA,IAACC;AAAAA,OAAaC;AAAAA,EAAoBR,IAAAA;AAExCS,YAAU,MAAM;AACVR,QAAAA,qBAAqBI,eAAeD,WAAW,QAAQ;AACzDM,aAAOC,SAASC,OAAOP;AAAAA,IACxB;AAAA,EACA,GAAA,CAACJ,mBAAmBG,QAAQC,WAA5B,CAJM;AAMT,6BACG,YAAD;AAAA,IAAA,GACMG;AAAAA,IACJ,UAAUP,qBAAqBO,iBAAiBK;AAAAA,IAChD,SAAS,MAAMX,qBAAqB,IAAD;AAAA,IAHrC;AAAA,EAAA,CADF;AASD;"}
1
+ {"version":3,"file":"CartCheckoutButton.mjs","sources":["../../src/CartCheckoutButton.tsx"],"sourcesContent":["import {ReactNode, useEffect, useState} from 'react';\nimport {useCart} from './CartProvider.js';\nimport {BaseButton, BaseButtonProps} from './BaseButton.js';\n\ntype PropsWeControl = 'onClick';\n\n/**\n * The `CartCheckoutButton` component renders a button that redirects to the checkout URL for the cart.\n * It must be a descendent of a `CartProvider` component.\n */\nexport function CartCheckoutButton(\n props: Omit<BaseButtonProps<'button'>, PropsWeControl> & {\n /** A `ReactNode` element. */\n children: ReactNode;\n }\n) {\n const [requestedCheckout, setRequestedCheckout] = useState(false);\n const {status, checkoutUrl} = useCart();\n const {children, ...passthroughProps} = props;\n\n useEffect(() => {\n if (requestedCheckout && checkoutUrl && status === 'idle') {\n window.location.href = checkoutUrl;\n }\n }, [requestedCheckout, status, checkoutUrl]);\n\n return (\n <BaseButton\n {...passthroughProps}\n disabled={requestedCheckout || passthroughProps.disabled}\n onClick={() => setRequestedCheckout(true)}\n >\n {children}\n </BaseButton>\n );\n}\n"],"names":["CartCheckoutButton","props","requestedCheckout","setRequestedCheckout","useState","status","checkoutUrl","useCart","children","passthroughProps","useEffect","window","location","href","disabled"],"mappings":";;;;AAUO,SAASA,mBACdC,OAIA;AACA,QAAM,CAACC,mBAAmBC,oBAAoB,IAAIC,SAAS,KAAK;AAC1D,QAAA;AAAA,IAACC;AAAAA,IAAQC;AAAAA,MAAeC,QAAS;AACjC,QAAA;AAAA,IAACC;AAAAA,OAAaC;AAAAA,EAAoBR,IAAAA;AAExCS,YAAU,MAAM;AACVR,QAAAA,qBAAqBI,eAAeD,WAAW,QAAQ;AACzDM,aAAOC,SAASC,OAAOP;AAAAA,IACzB;AAAA,EACC,GAAA,CAACJ,mBAAmBG,QAAQC,WAAW,CAAC;AAE3C,6BACG,YAAU;AAAA,IAAA,GACLG;AAAAA,IACJ,UAAUP,qBAAqBO,iBAAiBK;AAAAA,IAChD,SAAS,MAAMX,qBAAqB,IAAI;AAAA,IAAE;AAAA,EAAA,CAG/B;AAEjB;"}
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"CartProvider.mjs","sources":["../../src/CartProvider.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useTransition,\n createContext,\n useContext,\n} from 'react';\nimport {\n AttributeInput,\n CartBuyerIdentityInput,\n CartInput,\n CartLineInput,\n CartLineUpdateInput,\n CountryCode,\n Cart as CartType,\n MutationCartNoteUpdateArgs,\n} from './storefront-api-types.js';\nimport {\n BuyerIdentityUpdateEvent,\n CartMachineContext,\n CartMachineEvent,\n CartMachineTypeState,\n CartWithActions,\n} from './cart-types.js';\nimport {useCartAPIStateMachine} from './useCartAPIStateMachine.js';\nimport {CART_ID_STORAGE_KEY} from './cart-constants.js';\nimport {PartialDeep} from 'type-fest';\n\nexport const CartContext = createContext<CartWithActions | null>(null);\n\n/**\n * The `useCart` hook provides access to the cart object. It must be a descendent of a `CartProvider` component.\n */\nexport function useCart() {\n const context = useContext(CartContext);\n\n if (!context) {\n throw new Error('Expected a Cart Context, but no Cart Context was found');\n }\n\n return context;\n}\n\nexport function CartProvider({\n children,\n numCartLines,\n onCreate,\n onLineAdd,\n onLineRemove,\n onLineUpdate,\n onNoteUpdate,\n onBuyerIdentityUpdate,\n onAttributesUpdate,\n onDiscountCodesUpdate,\n onCreateComplete,\n onLineAddComplete,\n onLineRemoveComplete,\n onLineUpdateComplete,\n onNoteUpdateComplete,\n onBuyerIdentityUpdateComplete,\n onAttributesUpdateComplete,\n onDiscountCodesUpdateComplete,\n data: cart,\n cartFragment = defaultCartFragment,\n customerAccessToken,\n countryCode = 'US',\n}: {\n /** Any `ReactNode` elements. */\n children: React.ReactNode;\n /** Maximum number of cart lines to fetch. Defaults to 250 cart lines. */\n numCartLines?: number;\n /** A callback that is invoked when the process to create a cart begins, but before the cart is created in the Storefront API. */\n onCreate?: () => void;\n /** A callback that is invoked when the process to add a line item to the cart begins, but before the line item is added to the Storefront API. */\n onLineAdd?: () => void;\n /** A callback that is invoked when the process to remove a line item to the cart begins, but before the line item is removed from the Storefront API. */\n onLineRemove?: () => void;\n /** A callback that is invoked when the process to update a line item in the cart begins, but before the line item is updated in the Storefront API. */\n onLineUpdate?: () => void;\n /** A callback that is invoked when the process to add or update a note in the cart begins, but before the note is added or updated in the Storefront API. */\n onNoteUpdate?: () => void;\n /** A callback that is invoked when the process to update the buyer identity begins, but before the buyer identity is updated in the Storefront API. */\n onBuyerIdentityUpdate?: () => void;\n /** A callback that is invoked when the process to update the cart attributes begins, but before the attributes are updated in the Storefront API. */\n onAttributesUpdate?: () => void;\n /** A callback that is invoked when the process to update the cart discount codes begins, but before the discount codes are updated in the Storefront API. */\n onDiscountCodesUpdate?: () => void;\n /** A callback that is invoked when the process to create a cart completes */\n onCreateComplete?: () => void;\n /** A callback that is invoked when the process to add a line item to the cart completes */\n onLineAddComplete?: () => void;\n /** A callback that is invoked when the process to remove a line item to the cart completes */\n onLineRemoveComplete?: () => void;\n /** A callback that is invoked when the process to update a line item in the cart completes */\n onLineUpdateComplete?: () => void;\n /** A callback that is invoked when the process to add or update a note in the cart completes */\n onNoteUpdateComplete?: () => void;\n /** A callback that is invoked when the process to update the buyer identity completes */\n onBuyerIdentityUpdateComplete?: () => void;\n /** A callback that is invoked when the process to update the cart attributes completes */\n onAttributesUpdateComplete?: () => void;\n /** A callback that is invoked when the process to update the cart discount codes completes */\n onDiscountCodesUpdateComplete?: () => void;\n /** An object with fields that correspond to the Storefront API's [Cart object](https://shopify.dev/api/storefront/latest/objects/cart). */\n data?: PartialDeep<CartType, {recurseIntoArrays: true}>;\n /** A fragment used to query the Storefront API's [Cart object](https://shopify.dev/api/storefront/latest/objects/cart) for all queries and mutations. A default value is used if no argument is provided. */\n cartFragment?: string;\n /** A customer access token that's accessible on the server if there's a customer login. */\n customerAccessToken?: CartBuyerIdentityInput['customerAccessToken'];\n /** The ISO country code for i18n. */\n countryCode?: CountryCode;\n}) {\n if (countryCode) countryCode = countryCode.toUpperCase() as CountryCode;\n const [prevCountryCode, setPrevCountryCode] = useState(countryCode);\n const [prevCustomerAccessToken, setPrevCustomerAccessToken] =\n useState(customerAccessToken);\n const customerOverridesCountryCode = useRef(false);\n\n if (\n prevCountryCode !== countryCode ||\n prevCustomerAccessToken !== customerAccessToken\n ) {\n setPrevCountryCode(countryCode);\n setPrevCustomerAccessToken(customerAccessToken);\n customerOverridesCountryCode.current = false;\n }\n\n const [cartState, cartSend] = useCartAPIStateMachine({\n numCartLines,\n data: cart,\n cartFragment,\n countryCode,\n onCartActionEntry(context, event) {\n try {\n switch (event.type) {\n case 'CART_CREATE':\n return onCreate?.();\n case 'CARTLINE_ADD':\n return onLineAdd?.();\n case 'CARTLINE_REMOVE':\n return onLineRemove?.();\n case 'CARTLINE_UPDATE':\n return onLineUpdate?.();\n case 'NOTE_UPDATE':\n return onNoteUpdate?.();\n case 'BUYER_IDENTITY_UPDATE':\n return onBuyerIdentityUpdate?.();\n case 'CART_ATTRIBUTES_UPDATE':\n return onAttributesUpdate?.();\n case 'DISCOUNT_CODES_UPDATE':\n return onDiscountCodesUpdate?.();\n }\n } catch (error) {\n console.error('Cart entry action failed', error);\n }\n },\n onCartActionOptimisticUI(context, event) {\n if (!context?.cart) return {cart: undefined};\n switch (event.type) {\n case 'CARTLINE_REMOVE':\n return {\n ...context,\n lastValidCart: context.cart,\n cart: {\n ...context.cart,\n lines: context?.cart?.lines?.filter(\n (line) => line?.id && !event.payload.lines.includes(line?.id)\n ),\n },\n };\n case 'CARTLINE_UPDATE':\n return {\n ...context,\n lastValidCart: context.cart,\n cart: {\n ...context.cart,\n lines: context?.cart?.lines?.map((line) => {\n const updatedLine = event.payload.lines.find(\n ({id}) => id === line?.id\n );\n\n if (updatedLine && updatedLine.quantity) {\n return {\n ...line,\n quantity: updatedLine.quantity,\n };\n }\n\n return line;\n }),\n },\n };\n }\n return {cart: context.cart ? {...context.cart} : undefined};\n },\n onCartActionComplete(context, event) {\n const cartActionEvent = event.payload.cartActionEvent;\n try {\n switch (event.type) {\n case 'RESOLVE':\n switch (cartActionEvent.type) {\n case 'CART_CREATE':\n return onCreateComplete?.();\n case 'CARTLINE_ADD':\n return onLineAddComplete?.();\n case 'CARTLINE_REMOVE':\n return onLineRemoveComplete?.();\n case 'CARTLINE_UPDATE':\n return onLineUpdateComplete?.();\n case 'NOTE_UPDATE':\n return onNoteUpdateComplete?.();\n case 'BUYER_IDENTITY_UPDATE':\n if (countryCodeNotUpdated(context, cartActionEvent)) {\n customerOverridesCountryCode.current = true;\n }\n return onBuyerIdentityUpdateComplete?.();\n case 'CART_ATTRIBUTES_UPDATE':\n return onAttributesUpdateComplete?.();\n case 'DISCOUNT_CODES_UPDATE':\n return onDiscountCodesUpdateComplete?.();\n }\n }\n } catch (error) {\n console.error('onCartActionComplete failed', error);\n }\n },\n });\n\n const cartReady = useRef(false);\n const cartCompleted = cartState.matches('cartCompleted');\n\n const countryChanged =\n (cartState.value === 'idle' ||\n cartState.value === 'error' ||\n cartState.value === 'cartCompleted') &&\n countryCode !== cartState?.context?.cart?.buyerIdentity?.countryCode &&\n !cartState.context.errors;\n\n const fetchingFromStorage = useRef(false);\n\n /**\n * Initializes cart with priority in this order:\n * 1. cart props\n * 2. localStorage cartId\n */\n useEffect(() => {\n if (!cartReady.current && !fetchingFromStorage.current) {\n if (!cart && storageAvailable('localStorage')) {\n fetchingFromStorage.current = true;\n try {\n const cartId = window.localStorage.getItem(CART_ID_STORAGE_KEY);\n if (cartId) {\n cartSend({type: 'CART_FETCH', payload: {cartId}});\n }\n } catch (error) {\n console.warn('error fetching cartId');\n console.warn(error);\n }\n }\n cartReady.current = true;\n }\n }, [cart, cartReady, cartSend]);\n\n // Update cart country code if cart and props countryCode's as different\n useEffect(() => {\n if (!countryChanged || customerOverridesCountryCode.current) return;\n cartSend({\n type: 'BUYER_IDENTITY_UPDATE',\n payload: {buyerIdentity: {countryCode, customerAccessToken}},\n });\n }, [\n countryCode,\n customerAccessToken,\n countryChanged,\n customerOverridesCountryCode,\n cartSend,\n ]);\n\n // send cart events when ready\n const onCartReadySend = useCallback(\n (cartEvent: CartMachineEvent) => {\n if (!cartReady.current) {\n return console.warn(\"Cart isn't ready yet\");\n }\n cartSend(cartEvent);\n },\n [cartSend]\n );\n\n // save cart id to local storage\n useEffect(() => {\n if (cartState?.context?.cart?.id && storageAvailable('localStorage')) {\n try {\n window.localStorage.setItem(\n CART_ID_STORAGE_KEY,\n cartState.context.cart?.id\n );\n } catch (error) {\n console.warn('Failed to save cartId to localStorage', error);\n }\n }\n }, [cartState?.context?.cart?.id]);\n\n // delete cart from local storage if cart fetched has been completed\n useEffect(() => {\n if (cartCompleted && storageAvailable('localStorage')) {\n try {\n window.localStorage.removeItem(CART_ID_STORAGE_KEY);\n } catch (error) {\n console.warn('Failed to delete cartId from localStorage', error);\n }\n }\n }, [cartCompleted]);\n\n const cartCreate = useCallback(\n (cartInput: CartInput) => {\n if (countryCode && !cartInput.buyerIdentity?.countryCode) {\n if (cartInput.buyerIdentity == null) {\n cartInput.buyerIdentity = {};\n }\n cartInput.buyerIdentity.countryCode = countryCode;\n }\n\n if (\n customerAccessToken &&\n !cartInput.buyerIdentity?.customerAccessToken\n ) {\n if (cartInput.buyerIdentity == null) {\n cartInput.buyerIdentity = {};\n }\n cartInput.buyerIdentity.customerAccessToken = customerAccessToken;\n }\n onCartReadySend({\n type: 'CART_CREATE',\n payload: cartInput,\n });\n },\n [countryCode, customerAccessToken, onCartReadySend]\n );\n\n // Delays the cart state in the context if the page is hydrating\n // preventing suspense boundary errors.\n const cartDisplayState = useDelayedStateUntilHydration(cartState);\n\n const cartContextValue = useMemo<CartWithActions>(() => {\n return {\n ...(cartDisplayState?.context?.cart ?? {lines: [], attributes: []}),\n status: transposeStatus(cartDisplayState.value),\n error: cartDisplayState?.context?.errors,\n totalQuantity: cartDisplayState?.context?.cart?.totalQuantity ?? 0,\n cartCreate,\n linesAdd(lines: CartLineInput[]) {\n if (cartDisplayState?.context?.cart?.id) {\n onCartReadySend({\n type: 'CARTLINE_ADD',\n payload: {lines},\n });\n } else {\n cartCreate({lines});\n }\n },\n linesRemove(lines: string[]) {\n onCartReadySend({\n type: 'CARTLINE_REMOVE',\n payload: {\n lines,\n },\n });\n },\n linesUpdate(lines: CartLineUpdateInput[]) {\n onCartReadySend({\n type: 'CARTLINE_UPDATE',\n payload: {\n lines,\n },\n });\n },\n noteUpdate(note: MutationCartNoteUpdateArgs['note']) {\n onCartReadySend({\n type: 'NOTE_UPDATE',\n payload: {\n note,\n },\n });\n },\n buyerIdentityUpdate(buyerIdentity: CartBuyerIdentityInput) {\n onCartReadySend({\n type: 'BUYER_IDENTITY_UPDATE',\n payload: {\n buyerIdentity,\n },\n });\n },\n cartAttributesUpdate(attributes: AttributeInput[]) {\n onCartReadySend({\n type: 'CART_ATTRIBUTES_UPDATE',\n payload: {\n attributes,\n },\n });\n },\n discountCodesUpdate(discountCodes: string[]) {\n onCartReadySend({\n type: 'DISCOUNT_CODES_UPDATE',\n payload: {\n discountCodes,\n },\n });\n },\n cartFragment,\n };\n }, [\n cartCreate,\n cartDisplayState?.context?.cart,\n cartDisplayState?.context?.errors,\n cartDisplayState.value,\n cartFragment,\n onCartReadySend,\n ]);\n\n return (\n <CartContext.Provider value={cartContextValue}>\n {children}\n </CartContext.Provider>\n );\n}\n\nfunction transposeStatus(\n status: CartMachineTypeState['value']\n): CartWithActions['status'] {\n switch (status) {\n case 'uninitialized':\n case 'initializationError':\n return 'uninitialized';\n case 'idle':\n case 'cartCompleted':\n case 'error':\n return 'idle';\n case 'cartFetching':\n return 'fetching';\n case 'cartCreating':\n return 'creating';\n case 'cartLineAdding':\n case 'cartLineRemoving':\n case 'cartLineUpdating':\n case 'noteUpdating':\n case 'buyerIdentityUpdating':\n case 'cartAttributesUpdating':\n case 'discountCodesUpdating':\n return 'updating';\n }\n}\n\n/**\n * Delays a state update until hydration finishes. Useful for preventing suspense boundaries errors when updating a context\n * @remarks this uses startTransition and waits for it to finish.\n */\nfunction useDelayedStateUntilHydration<T>(state: T) {\n const [isPending, startTransition] = useTransition();\n const [delayedState, setDelayedState] = useState(state);\n\n const firstTimePending = useRef(false);\n if (isPending) {\n firstTimePending.current = true;\n }\n\n const firstTimePendingFinished = useRef(false);\n if (!isPending && firstTimePending.current) {\n firstTimePendingFinished.current = true;\n }\n\n useEffect(() => {\n startTransition(() => {\n if (!firstTimePendingFinished.current) {\n setDelayedState(state);\n }\n });\n }, [state]);\n\n const displayState = firstTimePendingFinished.current ? state : delayedState;\n\n return displayState;\n}\n\n/** Check for storage availability funciton obtained from\n * https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API\n */\nexport function storageAvailable(type: 'localStorage' | 'sessionStorage') {\n let storage;\n try {\n storage = window[type];\n const x = '__storage_test__';\n storage.setItem(x, x);\n storage.removeItem(x);\n return true;\n } catch (e) {\n return (\n e instanceof DOMException &&\n // everything except Firefox\n (e.code === 22 ||\n // Firefox\n e.code === 1014 ||\n // test name field too, because code might not be present\n // everything except Firefox\n e.name === 'QuotaExceededError' ||\n // Firefox\n e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&\n // acknowledge QuotaExceededError only if there's something already stored\n storage &&\n storage.length !== 0\n );\n }\n}\n\nfunction countryCodeNotUpdated(\n context: CartMachineContext,\n event: BuyerIdentityUpdateEvent\n) {\n return (\n event.payload.buyerIdentity.countryCode &&\n context.cart?.buyerIdentity?.countryCode !==\n event.payload.buyerIdentity.countryCode\n );\n}\n\nexport const defaultCartFragment = `\nfragment CartFragment on Cart {\n id\n checkoutUrl\n totalQuantity\n buyerIdentity {\n countryCode\n customer {\n id\n email\n firstName\n lastName\n displayName\n }\n email\n phone\n }\n lines(first: $numCartLines) {\n edges {\n node {\n id\n quantity\n attributes {\n key\n value\n }\n cost {\n totalAmount {\n amount\n currencyCode\n }\n compareAtAmountPerQuantity {\n amount\n currencyCode\n }\n }\n merchandise {\n ... on ProductVariant {\n id\n availableForSale\n compareAtPriceV2 {\n ...MoneyFragment\n }\n priceV2 {\n ...MoneyFragment\n }\n requiresShipping\n title\n image {\n ...ImageFragment\n }\n product {\n handle\n title\n }\n selectedOptions {\n name\n value\n }\n }\n }\n }\n }\n }\n cost {\n subtotalAmount {\n ...MoneyFragment\n }\n totalAmount {\n ...MoneyFragment\n }\n totalDutyAmount {\n ...MoneyFragment\n }\n totalTaxAmount {\n ...MoneyFragment\n }\n }\n note\n attributes {\n key\n value\n }\n discountCodes {\n code\n }\n}\n\nfragment MoneyFragment on MoneyV2 {\n currencyCode\n amount\n}\nfragment ImageFragment on Image {\n id\n url\n altText\n width\n height\n}\n`;\n"],"names":["CartContext","createContext","useCart","context","useContext","Error","CartProvider","children","numCartLines","onCreate","onLineAdd","onLineRemove","onLineUpdate","onNoteUpdate","onBuyerIdentityUpdate","onAttributesUpdate","onDiscountCodesUpdate","onCreateComplete","onLineAddComplete","onLineRemoveComplete","onLineUpdateComplete","onNoteUpdateComplete","onBuyerIdentityUpdateComplete","onAttributesUpdateComplete","onDiscountCodesUpdateComplete","data","cart","cartFragment","defaultCartFragment","customerAccessToken","countryCode","toUpperCase","prevCountryCode","setPrevCountryCode","useState","prevCustomerAccessToken","setPrevCustomerAccessToken","customerOverridesCountryCode","useRef","current","cartState","cartSend","useCartAPIStateMachine","onCartActionEntry","event","type","error","onCartActionOptimisticUI","undefined","lastValidCart","lines","filter","line","id","payload","includes","map","updatedLine","find","quantity","onCartActionComplete","cartActionEvent","countryCodeNotUpdated","cartReady","cartCompleted","matches","countryChanged","value","buyerIdentity","errors","fetchingFromStorage","useEffect","storageAvailable","cartId","window","localStorage","getItem","CART_ID_STORAGE_KEY","console","warn","onCartReadySend","useCallback","cartEvent","setItem","removeItem","cartCreate","cartInput","cartDisplayState","useDelayedStateUntilHydration","cartContextValue","useMemo","attributes","status","transposeStatus","totalQuantity","linesAdd","linesRemove","linesUpdate","noteUpdate","note","buyerIdentityUpdate","cartAttributesUpdate","discountCodesUpdate","discountCodes","_jsx","state","isPending","startTransition","useTransition","delayedState","setDelayedState","firstTimePending","firstTimePendingFinished","displayState","storage","x","e","DOMException","code","name","length"],"mappings":"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"}
1
+ {"version":3,"file":"CartProvider.mjs","sources":["../../src/CartProvider.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useTransition,\n createContext,\n useContext,\n} from 'react';\nimport {\n AttributeInput,\n CartBuyerIdentityInput,\n CartInput,\n CartLineInput,\n CartLineUpdateInput,\n CountryCode,\n Cart as CartType,\n MutationCartNoteUpdateArgs,\n} from './storefront-api-types.js';\nimport {\n BuyerIdentityUpdateEvent,\n CartMachineContext,\n CartMachineEvent,\n CartMachineTypeState,\n CartWithActions,\n} from './cart-types.js';\nimport {useCartAPIStateMachine} from './useCartAPIStateMachine.js';\nimport {CART_ID_STORAGE_KEY} from './cart-constants.js';\nimport {PartialDeep} from 'type-fest';\n\nexport const CartContext = createContext<CartWithActions | null>(null);\n\n/**\n * The `useCart` hook provides access to the cart object. It must be a descendent of a `CartProvider` component.\n */\nexport function useCart() {\n const context = useContext(CartContext);\n\n if (!context) {\n throw new Error('Expected a Cart Context, but no Cart Context was found');\n }\n\n return context;\n}\n\nexport function CartProvider({\n children,\n numCartLines,\n onCreate,\n onLineAdd,\n onLineRemove,\n onLineUpdate,\n onNoteUpdate,\n onBuyerIdentityUpdate,\n onAttributesUpdate,\n onDiscountCodesUpdate,\n onCreateComplete,\n onLineAddComplete,\n onLineRemoveComplete,\n onLineUpdateComplete,\n onNoteUpdateComplete,\n onBuyerIdentityUpdateComplete,\n onAttributesUpdateComplete,\n onDiscountCodesUpdateComplete,\n data: cart,\n cartFragment = defaultCartFragment,\n customerAccessToken,\n countryCode = 'US',\n}: {\n /** Any `ReactNode` elements. */\n children: React.ReactNode;\n /** Maximum number of cart lines to fetch. Defaults to 250 cart lines. */\n numCartLines?: number;\n /** A callback that is invoked when the process to create a cart begins, but before the cart is created in the Storefront API. */\n onCreate?: () => void;\n /** A callback that is invoked when the process to add a line item to the cart begins, but before the line item is added to the Storefront API. */\n onLineAdd?: () => void;\n /** A callback that is invoked when the process to remove a line item to the cart begins, but before the line item is removed from the Storefront API. */\n onLineRemove?: () => void;\n /** A callback that is invoked when the process to update a line item in the cart begins, but before the line item is updated in the Storefront API. */\n onLineUpdate?: () => void;\n /** A callback that is invoked when the process to add or update a note in the cart begins, but before the note is added or updated in the Storefront API. */\n onNoteUpdate?: () => void;\n /** A callback that is invoked when the process to update the buyer identity begins, but before the buyer identity is updated in the Storefront API. */\n onBuyerIdentityUpdate?: () => void;\n /** A callback that is invoked when the process to update the cart attributes begins, but before the attributes are updated in the Storefront API. */\n onAttributesUpdate?: () => void;\n /** A callback that is invoked when the process to update the cart discount codes begins, but before the discount codes are updated in the Storefront API. */\n onDiscountCodesUpdate?: () => void;\n /** A callback that is invoked when the process to create a cart completes */\n onCreateComplete?: () => void;\n /** A callback that is invoked when the process to add a line item to the cart completes */\n onLineAddComplete?: () => void;\n /** A callback that is invoked when the process to remove a line item to the cart completes */\n onLineRemoveComplete?: () => void;\n /** A callback that is invoked when the process to update a line item in the cart completes */\n onLineUpdateComplete?: () => void;\n /** A callback that is invoked when the process to add or update a note in the cart completes */\n onNoteUpdateComplete?: () => void;\n /** A callback that is invoked when the process to update the buyer identity completes */\n onBuyerIdentityUpdateComplete?: () => void;\n /** A callback that is invoked when the process to update the cart attributes completes */\n onAttributesUpdateComplete?: () => void;\n /** A callback that is invoked when the process to update the cart discount codes completes */\n onDiscountCodesUpdateComplete?: () => void;\n /** An object with fields that correspond to the Storefront API's [Cart object](https://shopify.dev/api/storefront/latest/objects/cart). */\n data?: PartialDeep<CartType, {recurseIntoArrays: true}>;\n /** A fragment used to query the Storefront API's [Cart object](https://shopify.dev/api/storefront/latest/objects/cart) for all queries and mutations. A default value is used if no argument is provided. */\n cartFragment?: string;\n /** A customer access token that's accessible on the server if there's a customer login. */\n customerAccessToken?: CartBuyerIdentityInput['customerAccessToken'];\n /** The ISO country code for i18n. */\n countryCode?: CountryCode;\n}) {\n if (countryCode) countryCode = countryCode.toUpperCase() as CountryCode;\n const [prevCountryCode, setPrevCountryCode] = useState(countryCode);\n const [prevCustomerAccessToken, setPrevCustomerAccessToken] =\n useState(customerAccessToken);\n const customerOverridesCountryCode = useRef(false);\n\n if (\n prevCountryCode !== countryCode ||\n prevCustomerAccessToken !== customerAccessToken\n ) {\n setPrevCountryCode(countryCode);\n setPrevCustomerAccessToken(customerAccessToken);\n customerOverridesCountryCode.current = false;\n }\n\n const [cartState, cartSend] = useCartAPIStateMachine({\n numCartLines,\n data: cart,\n cartFragment,\n countryCode,\n onCartActionEntry(context, event) {\n try {\n switch (event.type) {\n case 'CART_CREATE':\n return onCreate?.();\n case 'CARTLINE_ADD':\n return onLineAdd?.();\n case 'CARTLINE_REMOVE':\n return onLineRemove?.();\n case 'CARTLINE_UPDATE':\n return onLineUpdate?.();\n case 'NOTE_UPDATE':\n return onNoteUpdate?.();\n case 'BUYER_IDENTITY_UPDATE':\n return onBuyerIdentityUpdate?.();\n case 'CART_ATTRIBUTES_UPDATE':\n return onAttributesUpdate?.();\n case 'DISCOUNT_CODES_UPDATE':\n return onDiscountCodesUpdate?.();\n }\n } catch (error) {\n console.error('Cart entry action failed', error);\n }\n },\n onCartActionOptimisticUI(context, event) {\n if (!context?.cart) return {cart: undefined};\n switch (event.type) {\n case 'CARTLINE_REMOVE':\n return {\n ...context,\n lastValidCart: context.cart,\n cart: {\n ...context.cart,\n lines: context?.cart?.lines?.filter(\n (line) => line?.id && !event.payload.lines.includes(line?.id)\n ),\n },\n };\n case 'CARTLINE_UPDATE':\n return {\n ...context,\n lastValidCart: context.cart,\n cart: {\n ...context.cart,\n lines: context?.cart?.lines?.map((line) => {\n const updatedLine = event.payload.lines.find(\n ({id}) => id === line?.id\n );\n\n if (updatedLine && updatedLine.quantity) {\n return {\n ...line,\n quantity: updatedLine.quantity,\n };\n }\n\n return line;\n }),\n },\n };\n }\n return {cart: context.cart ? {...context.cart} : undefined};\n },\n onCartActionComplete(context, event) {\n const cartActionEvent = event.payload.cartActionEvent;\n try {\n switch (event.type) {\n case 'RESOLVE':\n switch (cartActionEvent.type) {\n case 'CART_CREATE':\n return onCreateComplete?.();\n case 'CARTLINE_ADD':\n return onLineAddComplete?.();\n case 'CARTLINE_REMOVE':\n return onLineRemoveComplete?.();\n case 'CARTLINE_UPDATE':\n return onLineUpdateComplete?.();\n case 'NOTE_UPDATE':\n return onNoteUpdateComplete?.();\n case 'BUYER_IDENTITY_UPDATE':\n if (countryCodeNotUpdated(context, cartActionEvent)) {\n customerOverridesCountryCode.current = true;\n }\n return onBuyerIdentityUpdateComplete?.();\n case 'CART_ATTRIBUTES_UPDATE':\n return onAttributesUpdateComplete?.();\n case 'DISCOUNT_CODES_UPDATE':\n return onDiscountCodesUpdateComplete?.();\n }\n }\n } catch (error) {\n console.error('onCartActionComplete failed', error);\n }\n },\n });\n\n const cartReady = useRef(false);\n const cartCompleted = cartState.matches('cartCompleted');\n\n const countryChanged =\n (cartState.value === 'idle' ||\n cartState.value === 'error' ||\n cartState.value === 'cartCompleted') &&\n countryCode !== cartState?.context?.cart?.buyerIdentity?.countryCode &&\n !cartState.context.errors;\n\n const fetchingFromStorage = useRef(false);\n\n /**\n * Initializes cart with priority in this order:\n * 1. cart props\n * 2. localStorage cartId\n */\n useEffect(() => {\n if (!cartReady.current && !fetchingFromStorage.current) {\n if (!cart && storageAvailable('localStorage')) {\n fetchingFromStorage.current = true;\n try {\n const cartId = window.localStorage.getItem(CART_ID_STORAGE_KEY);\n if (cartId) {\n cartSend({type: 'CART_FETCH', payload: {cartId}});\n }\n } catch (error) {\n console.warn('error fetching cartId');\n console.warn(error);\n }\n }\n cartReady.current = true;\n }\n }, [cart, cartReady, cartSend]);\n\n // Update cart country code if cart and props countryCode's as different\n useEffect(() => {\n if (!countryChanged || customerOverridesCountryCode.current) return;\n cartSend({\n type: 'BUYER_IDENTITY_UPDATE',\n payload: {buyerIdentity: {countryCode, customerAccessToken}},\n });\n }, [\n countryCode,\n customerAccessToken,\n countryChanged,\n customerOverridesCountryCode,\n cartSend,\n ]);\n\n // send cart events when ready\n const onCartReadySend = useCallback(\n (cartEvent: CartMachineEvent) => {\n if (!cartReady.current) {\n return console.warn(\"Cart isn't ready yet\");\n }\n cartSend(cartEvent);\n },\n [cartSend]\n );\n\n // save cart id to local storage\n useEffect(() => {\n if (cartState?.context?.cart?.id && storageAvailable('localStorage')) {\n try {\n window.localStorage.setItem(\n CART_ID_STORAGE_KEY,\n cartState.context.cart?.id\n );\n } catch (error) {\n console.warn('Failed to save cartId to localStorage', error);\n }\n }\n }, [cartState?.context?.cart?.id]);\n\n // delete cart from local storage if cart fetched has been completed\n useEffect(() => {\n if (cartCompleted && storageAvailable('localStorage')) {\n try {\n window.localStorage.removeItem(CART_ID_STORAGE_KEY);\n } catch (error) {\n console.warn('Failed to delete cartId from localStorage', error);\n }\n }\n }, [cartCompleted]);\n\n const cartCreate = useCallback(\n (cartInput: CartInput) => {\n if (countryCode && !cartInput.buyerIdentity?.countryCode) {\n if (cartInput.buyerIdentity == null) {\n cartInput.buyerIdentity = {};\n }\n cartInput.buyerIdentity.countryCode = countryCode;\n }\n\n if (\n customerAccessToken &&\n !cartInput.buyerIdentity?.customerAccessToken\n ) {\n if (cartInput.buyerIdentity == null) {\n cartInput.buyerIdentity = {};\n }\n cartInput.buyerIdentity.customerAccessToken = customerAccessToken;\n }\n onCartReadySend({\n type: 'CART_CREATE',\n payload: cartInput,\n });\n },\n [countryCode, customerAccessToken, onCartReadySend]\n );\n\n // Delays the cart state in the context if the page is hydrating\n // preventing suspense boundary errors.\n const cartDisplayState = useDelayedStateUntilHydration(cartState);\n\n const cartContextValue = useMemo<CartWithActions>(() => {\n return {\n ...(cartDisplayState?.context?.cart ?? {lines: [], attributes: []}),\n status: transposeStatus(cartDisplayState.value),\n error: cartDisplayState?.context?.errors,\n totalQuantity: cartDisplayState?.context?.cart?.totalQuantity ?? 0,\n cartCreate,\n linesAdd(lines: CartLineInput[]) {\n if (cartDisplayState?.context?.cart?.id) {\n onCartReadySend({\n type: 'CARTLINE_ADD',\n payload: {lines},\n });\n } else {\n cartCreate({lines});\n }\n },\n linesRemove(lines: string[]) {\n onCartReadySend({\n type: 'CARTLINE_REMOVE',\n payload: {\n lines,\n },\n });\n },\n linesUpdate(lines: CartLineUpdateInput[]) {\n onCartReadySend({\n type: 'CARTLINE_UPDATE',\n payload: {\n lines,\n },\n });\n },\n noteUpdate(note: MutationCartNoteUpdateArgs['note']) {\n onCartReadySend({\n type: 'NOTE_UPDATE',\n payload: {\n note,\n },\n });\n },\n buyerIdentityUpdate(buyerIdentity: CartBuyerIdentityInput) {\n onCartReadySend({\n type: 'BUYER_IDENTITY_UPDATE',\n payload: {\n buyerIdentity,\n },\n });\n },\n cartAttributesUpdate(attributes: AttributeInput[]) {\n onCartReadySend({\n type: 'CART_ATTRIBUTES_UPDATE',\n payload: {\n attributes,\n },\n });\n },\n discountCodesUpdate(discountCodes: string[]) {\n onCartReadySend({\n type: 'DISCOUNT_CODES_UPDATE',\n payload: {\n discountCodes,\n },\n });\n },\n cartFragment,\n };\n }, [\n cartCreate,\n cartDisplayState?.context?.cart,\n cartDisplayState?.context?.errors,\n cartDisplayState.value,\n cartFragment,\n onCartReadySend,\n ]);\n\n return (\n <CartContext.Provider value={cartContextValue}>\n {children}\n </CartContext.Provider>\n );\n}\n\nfunction transposeStatus(\n status: CartMachineTypeState['value']\n): CartWithActions['status'] {\n switch (status) {\n case 'uninitialized':\n case 'initializationError':\n return 'uninitialized';\n case 'idle':\n case 'cartCompleted':\n case 'error':\n return 'idle';\n case 'cartFetching':\n return 'fetching';\n case 'cartCreating':\n return 'creating';\n case 'cartLineAdding':\n case 'cartLineRemoving':\n case 'cartLineUpdating':\n case 'noteUpdating':\n case 'buyerIdentityUpdating':\n case 'cartAttributesUpdating':\n case 'discountCodesUpdating':\n return 'updating';\n }\n}\n\n/**\n * Delays a state update until hydration finishes. Useful for preventing suspense boundaries errors when updating a context\n * @remarks this uses startTransition and waits for it to finish.\n */\nfunction useDelayedStateUntilHydration<T>(state: T) {\n const [isPending, startTransition] = useTransition();\n const [delayedState, setDelayedState] = useState(state);\n\n const firstTimePending = useRef(false);\n if (isPending) {\n firstTimePending.current = true;\n }\n\n const firstTimePendingFinished = useRef(false);\n if (!isPending && firstTimePending.current) {\n firstTimePendingFinished.current = true;\n }\n\n useEffect(() => {\n startTransition(() => {\n if (!firstTimePendingFinished.current) {\n setDelayedState(state);\n }\n });\n }, [state]);\n\n const displayState = firstTimePendingFinished.current ? state : delayedState;\n\n return displayState;\n}\n\n/** Check for storage availability funciton obtained from\n * https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API\n */\nexport function storageAvailable(type: 'localStorage' | 'sessionStorage') {\n let storage;\n try {\n storage = window[type];\n const x = '__storage_test__';\n storage.setItem(x, x);\n storage.removeItem(x);\n return true;\n } catch (e) {\n return (\n e instanceof DOMException &&\n // everything except Firefox\n (e.code === 22 ||\n // Firefox\n e.code === 1014 ||\n // test name field too, because code might not be present\n // everything except Firefox\n e.name === 'QuotaExceededError' ||\n // Firefox\n e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&\n // acknowledge QuotaExceededError only if there's something already stored\n storage &&\n storage.length !== 0\n );\n }\n}\n\nfunction countryCodeNotUpdated(\n context: CartMachineContext,\n event: BuyerIdentityUpdateEvent\n) {\n return (\n event.payload.buyerIdentity.countryCode &&\n context.cart?.buyerIdentity?.countryCode !==\n event.payload.buyerIdentity.countryCode\n );\n}\n\nexport const defaultCartFragment = `\nfragment CartFragment on Cart {\n id\n checkoutUrl\n totalQuantity\n buyerIdentity {\n countryCode\n customer {\n id\n email\n firstName\n lastName\n displayName\n }\n email\n phone\n }\n lines(first: $numCartLines) {\n edges {\n node {\n id\n quantity\n attributes {\n key\n value\n }\n cost {\n totalAmount {\n amount\n currencyCode\n }\n compareAtAmountPerQuantity {\n amount\n currencyCode\n }\n }\n merchandise {\n ... on ProductVariant {\n id\n availableForSale\n compareAtPriceV2 {\n ...MoneyFragment\n }\n priceV2 {\n ...MoneyFragment\n }\n requiresShipping\n title\n image {\n ...ImageFragment\n }\n product {\n handle\n title\n }\n selectedOptions {\n name\n value\n }\n }\n }\n }\n }\n }\n cost {\n subtotalAmount {\n ...MoneyFragment\n }\n totalAmount {\n ...MoneyFragment\n }\n totalDutyAmount {\n ...MoneyFragment\n }\n totalTaxAmount {\n ...MoneyFragment\n }\n }\n note\n attributes {\n key\n value\n }\n discountCodes {\n code\n }\n}\n\nfragment MoneyFragment on MoneyV2 {\n currencyCode\n amount\n}\nfragment ImageFragment on Image {\n id\n url\n altText\n width\n height\n}\n`;\n"],"names":["CartContext","createContext","useCart","context","useContext","Error","CartProvider","children","numCartLines","onCreate","onLineAdd","onLineRemove","onLineUpdate","onNoteUpdate","onBuyerIdentityUpdate","onAttributesUpdate","onDiscountCodesUpdate","onCreateComplete","onLineAddComplete","onLineRemoveComplete","onLineUpdateComplete","onNoteUpdateComplete","onBuyerIdentityUpdateComplete","onAttributesUpdateComplete","onDiscountCodesUpdateComplete","data","cart","cartFragment","defaultCartFragment","customerAccessToken","countryCode","toUpperCase","prevCountryCode","setPrevCountryCode","useState","prevCustomerAccessToken","setPrevCustomerAccessToken","customerOverridesCountryCode","useRef","current","cartState","cartSend","useCartAPIStateMachine","onCartActionEntry","event","type","error","onCartActionOptimisticUI","undefined","lastValidCart","lines","filter","line","id","payload","includes","map","updatedLine","find","quantity","onCartActionComplete","cartActionEvent","countryCodeNotUpdated","cartReady","cartCompleted","matches","countryChanged","value","buyerIdentity","errors","fetchingFromStorage","useEffect","storageAvailable","cartId","window","localStorage","getItem","CART_ID_STORAGE_KEY","console","warn","onCartReadySend","useCallback","cartEvent","setItem","removeItem","cartCreate","cartInput","cartDisplayState","useDelayedStateUntilHydration","cartContextValue","useMemo","attributes","status","transposeStatus","totalQuantity","linesAdd","linesRemove","linesUpdate","noteUpdate","note","buyerIdentityUpdate","cartAttributesUpdate","discountCodesUpdate","discountCodes","_jsx","state","isPending","startTransition","useTransition","delayedState","setDelayedState","firstTimePending","firstTimePendingFinished","displayState","storage","x","e","DOMException","code","name","length"],"mappings":"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"}
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"ExternalVideo.mjs","sources":["../../src/ExternalVideo.tsx"],"sourcesContent":["import type {ExternalVideo as ExternalVideoType} from './storefront-api-types.js';\nimport type {PartialDeep} from 'type-fest';\n\ninterface BaseProps {\n /**\n * An object with fields that correspond to the Storefront API's [ExternalVideo object](https://shopify.dev/api/storefront/reference/products/externalvideo).\n */\n data: PartialDeep<ExternalVideoType, {recurseIntoArrays: true}>;\n /** An object containing the options available for either\n * [YouTube](https://developers.google.com/youtube/player_parameters#Parameters) or\n * [Vimeo](https://vimeo.zendesk.com/hc/en-us/articles/360001494447-Using-Player-Parameters).\n */\n options?: YouTube | Vimeo;\n}\n\ntype PropsWeControl = 'src';\n\nexport type ExternalVideoProps = Omit<\n JSX.IntrinsicElements['iframe'],\n PropsWeControl\n> &\n BaseProps;\n\n/**\n * The `ExternalVideo` component renders an embedded video for the Storefront\n * API's [ExternalVideo object](https://shopify.dev/api/storefront/reference/products/externalvideo).\n */\nexport function ExternalVideo(props: ExternalVideoProps) {\n const {\n data,\n options,\n id = data.id,\n frameBorder = '0',\n allow = 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture',\n allowFullScreen = true,\n loading = 'lazy',\n ...passthroughProps\n } = props;\n\n if (!data.embedUrl) {\n throw new Error(`<ExternalVideo/> requires the 'embedUrl' property`);\n }\n\n let finalUrl: string = data.embedUrl;\n\n if (options) {\n const urlObject = new URL(data.embedUrl);\n for (const key of Object.keys(options)) {\n // @ts-expect-error https://github.com/microsoft/TypeScript/issues/32951\n urlObject.searchParams.set(key, options[key]);\n }\n finalUrl = urlObject.toString();\n }\n\n return (\n <iframe\n {...passthroughProps}\n id={id ?? data.embedUrl}\n title={data.alt ?? data.id ?? 'external video'}\n frameBorder={frameBorder}\n allow={allow}\n allowFullScreen={allowFullScreen}\n src={finalUrl}\n loading={loading}\n ></iframe>\n );\n}\n\ninterface YouTube {\n autoplay?: 0 | 1;\n cc_lang_pref?: string;\n cc_load_policy?: 1;\n color?: 'red' | 'white';\n controls?: 0 | 1;\n disablekb?: 0 | 1;\n enablejsapi?: 0 | 1;\n end?: number;\n fs?: 0 | 1;\n hl?: string;\n iv_load_policy?: 1 | 3;\n list?: string;\n list_type?: 'playlist' | 'user_uploads';\n loop?: 0 | 1;\n modest_branding?: 1;\n origin?: string;\n playlist?: string;\n plays_inline?: 0 | 1;\n rel?: 0 | 1;\n start?: number;\n widget_referrer?: string;\n}\n\ntype VimeoBoolean = 0 | 1 | boolean;\n\ninterface Vimeo {\n autopause?: VimeoBoolean;\n autoplay?: VimeoBoolean;\n background?: VimeoBoolean;\n byline?: VimeoBoolean;\n color?: string;\n controls?: VimeoBoolean;\n dnt?: VimeoBoolean;\n loop?: VimeoBoolean;\n muted?: VimeoBoolean;\n pip?: VimeoBoolean;\n playsinline?: VimeoBoolean;\n portrait?: VimeoBoolean;\n quality?: '240p' | '360p' | '540p' | '720p' | '1080p' | '2k' | '4k';\n speed?: VimeoBoolean;\n '#t'?: string;\n texttrack?: string;\n title?: VimeoBoolean;\n transparent?: VimeoBoolean;\n}\n"],"names":["ExternalVideo","props","data","options","id","frameBorder","allow","allowFullScreen","loading","passthroughProps","embedUrl","Error","finalUrl","urlObject","URL","key","Object","keys","searchParams","set","toString","alt"],"mappings":";AA2BO,SAASA,cAAcC,OAA2B;;AACjD,QAAA;AAAA,IACJC;AAAAA,IACAC;AAAAA,IACAC,KAAKF,KAAKE;AAAAA,IACVC,cAAc;AAAA,IACdC,QAAQ;AAAA,IACRC,kBAAkB;AAAA,IAClBC,UAAU;AAAA,OACPC;AAAAA,EACDR,IAAAA;AAEA,MAAA,CAACC,KAAKQ,UAAU;AACZ,UAAA,IAAIC,MAAO,mDAAX;AAAA,EACP;AAED,MAAIC,WAAmBV,KAAKQ;AAE5B,MAAIP,SAAS;AACX,UAAMU,YAAY,IAAIC,IAAIZ,KAAKQ,QAAb;AAClB,eAAWK,OAAOC,OAAOC,KAAKd,OAAZ,GAAsB;AAEtCU,gBAAUK,aAAaC,IAAIJ,KAAKZ,QAAQY,IAAxC;AAAA,IACD;AACDH,eAAWC,UAAUO;EACtB;AAED;OAEQX;AAAAA,IACJ,IAAIL,kBAAMF,KAAKQ;AAAAA,IACf,QAAOR,gBAAKmB,QAALnB,YAAYA,KAAKE,OAAjBF,YAAuB;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAKU;AAAAA,IACL;AAAA,EAAA,CATJ;AAYD;"}
1
+ {"version":3,"file":"ExternalVideo.mjs","sources":["../../src/ExternalVideo.tsx"],"sourcesContent":["import type {ExternalVideo as ExternalVideoType} from './storefront-api-types.js';\nimport type {PartialDeep} from 'type-fest';\n\ninterface BaseProps {\n /**\n * An object with fields that correspond to the Storefront API's [ExternalVideo object](https://shopify.dev/api/storefront/reference/products/externalvideo).\n */\n data: PartialDeep<ExternalVideoType, {recurseIntoArrays: true}>;\n /** An object containing the options available for either\n * [YouTube](https://developers.google.com/youtube/player_parameters#Parameters) or\n * [Vimeo](https://vimeo.zendesk.com/hc/en-us/articles/360001494447-Using-Player-Parameters).\n */\n options?: YouTube | Vimeo;\n}\n\ntype PropsWeControl = 'src';\n\nexport type ExternalVideoProps = Omit<\n JSX.IntrinsicElements['iframe'],\n PropsWeControl\n> &\n BaseProps;\n\n/**\n * The `ExternalVideo` component renders an embedded video for the Storefront\n * API's [ExternalVideo object](https://shopify.dev/api/storefront/reference/products/externalvideo).\n */\nexport function ExternalVideo(props: ExternalVideoProps) {\n const {\n data,\n options,\n id = data.id,\n frameBorder = '0',\n allow = 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture',\n allowFullScreen = true,\n loading = 'lazy',\n ...passthroughProps\n } = props;\n\n if (!data.embedUrl) {\n throw new Error(`<ExternalVideo/> requires the 'embedUrl' property`);\n }\n\n let finalUrl: string = data.embedUrl;\n\n if (options) {\n const urlObject = new URL(data.embedUrl);\n for (const key of Object.keys(options)) {\n // @ts-expect-error https://github.com/microsoft/TypeScript/issues/32951\n urlObject.searchParams.set(key, options[key]);\n }\n finalUrl = urlObject.toString();\n }\n\n return (\n <iframe\n {...passthroughProps}\n id={id ?? data.embedUrl}\n title={data.alt ?? data.id ?? 'external video'}\n frameBorder={frameBorder}\n allow={allow}\n allowFullScreen={allowFullScreen}\n src={finalUrl}\n loading={loading}\n ></iframe>\n );\n}\n\ninterface YouTube {\n autoplay?: 0 | 1;\n cc_lang_pref?: string;\n cc_load_policy?: 1;\n color?: 'red' | 'white';\n controls?: 0 | 1;\n disablekb?: 0 | 1;\n enablejsapi?: 0 | 1;\n end?: number;\n fs?: 0 | 1;\n hl?: string;\n iv_load_policy?: 1 | 3;\n list?: string;\n list_type?: 'playlist' | 'user_uploads';\n loop?: 0 | 1;\n modest_branding?: 1;\n origin?: string;\n playlist?: string;\n plays_inline?: 0 | 1;\n rel?: 0 | 1;\n start?: number;\n widget_referrer?: string;\n}\n\ntype VimeoBoolean = 0 | 1 | boolean;\n\ninterface Vimeo {\n autopause?: VimeoBoolean;\n autoplay?: VimeoBoolean;\n background?: VimeoBoolean;\n byline?: VimeoBoolean;\n color?: string;\n controls?: VimeoBoolean;\n dnt?: VimeoBoolean;\n loop?: VimeoBoolean;\n muted?: VimeoBoolean;\n pip?: VimeoBoolean;\n playsinline?: VimeoBoolean;\n portrait?: VimeoBoolean;\n quality?: '240p' | '360p' | '540p' | '720p' | '1080p' | '2k' | '4k';\n speed?: VimeoBoolean;\n '#t'?: string;\n texttrack?: string;\n title?: VimeoBoolean;\n transparent?: VimeoBoolean;\n}\n"],"names":["ExternalVideo","props","data","options","id","frameBorder","allow","allowFullScreen","loading","passthroughProps","embedUrl","Error","finalUrl","urlObject","URL","key","Object","keys","searchParams","set","toString","alt"],"mappings":";AA2BO,SAASA,cAAcC,OAA2B;;AACjD,QAAA;AAAA,IACJC;AAAAA,IACAC;AAAAA,IACAC,KAAKF,KAAKE;AAAAA,IACVC,cAAc;AAAA,IACdC,QAAQ;AAAA,IACRC,kBAAkB;AAAA,IAClBC,UAAU;AAAA,OACPC;AAAAA,EACDR,IAAAA;AAEA,MAAA,CAACC,KAAKQ,UAAU;AACZ,UAAA,IAAIC,MAAO,mDAAkD;AAAA,EACrE;AAEA,MAAIC,WAAmBV,KAAKQ;AAE5B,MAAIP,SAAS;AACX,UAAMU,YAAY,IAAIC,IAAIZ,KAAKQ,QAAQ;AACvC,eAAWK,OAAOC,OAAOC,KAAKd,OAAO,GAAG;AAEtCU,gBAAUK,aAAaC,IAAIJ,KAAKZ,QAAQY,IAAI;AAAA,IAC9C;AACAH,eAAWC,UAAUO;EACvB;AAEA,6BACE,UAAA;AAAA,IAAA,GACMX;AAAAA,IACJ,IAAIL,kBAAMF,KAAKQ;AAAAA,IACf,QAAOR,gBAAKmB,QAALnB,YAAYA,KAAKE,OAAjBF,YAAuB;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAKU;AAAAA,IACL;AAAA,EAAA,CACQ;AAEd;"}
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"Image.mjs","sources":["../../src/Image.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n getShopifyImageDimensions,\n shopifyImageLoader,\n addImageSizeParametersToUrl,\n IMG_SRC_SET_SIZES,\n} from './image-size.js';\nimport type {Image as ImageType} from './storefront-api-types.js';\nimport type {PartialDeep, Simplify} from 'type-fest';\n\ntype HtmlImageProps = React.ImgHTMLAttributes<HTMLImageElement>;\n\nexport type ShopifyLoaderOptions = {\n crop?: 'top' | 'bottom' | 'left' | 'right' | 'center';\n scale?: 2 | 3;\n width?: HtmlImageProps['width'] | ImageType['width'];\n height?: HtmlImageProps['height'] | ImageType['height'];\n};\nexport type ShopifyLoaderParams = Simplify<\n ShopifyLoaderOptions & {\n src: ImageType['url'];\n }\n>;\nexport type ShopifyImageProps = Omit<HtmlImageProps, 'src'> & {\n /** An object with fields that correspond to the Storefront API's\n * [Image object](https://shopify.dev/api/storefront/reference/common-objects/image).\n * The `data` prop is required.\n */\n data: PartialDeep<ImageType, {recurseIntoArrays: true}>;\n /** A custom function that generates the image URL. Parameters passed in\n * are `ShopifyLoaderParams`\n */\n loader?: (params: ShopifyLoaderParams) => string;\n /** An object of `loader` function options. For example, if the `loader` function\n * requires a `scale` option, then the value can be a property of the\n * `loaderOptions` object (for example, `{scale: 2}`). The object shape is `ShopifyLoaderOptions`.\n */\n loaderOptions?: ShopifyLoaderOptions;\n /**\n * `src` isn't used, and should instead be passed as part of the `data` object\n */\n src?: never;\n /**\n * An array of pixel widths to overwrite the default generated srcset. For example, `[300, 600, 800]`.\n */\n widths?: (HtmlImageProps['width'] | ImageType['width'])[];\n};\n\n/**\n * The `Image` component renders an image for the Storefront API's\n * [Image object](https://shopify.dev/api/storefront/reference/common-objects/image) by using the `data` prop. You can [customize this component](https://shopify.dev/api/hydrogen/components#customizing-hydrogen-components) using passthrough props.\n *\n * An image's width and height are determined using the following priority list:\n * 1. The width and height values for the `loaderOptions` prop\n * 2. The width and height values for bare props\n * 3. The width and height values for the `data` prop\n *\n * If only one of `width` or `height` are defined, then the other will attempt to be calculated based on the image's aspect ratio,\n * provided that both `data.width` and `data.height` are available. If `data.width` and `data.height` aren't available, then the aspect ratio cannot be determined and the missing\n * value will remain as `null`\n */\nexport function Image({\n data,\n width,\n height,\n loading,\n loader = shopifyImageLoader,\n loaderOptions,\n widths,\n decoding = 'async',\n ...rest\n}: ShopifyImageProps) {\n if (!data.url) {\n const missingUrlError = `<Image/>: the 'data' prop requires the 'url' property. Image: ${\n data.id ?? 'no ID provided'\n }`;\n\n if (__HYDROGEN_DEV__) {\n throw new Error(missingUrlError);\n } else {\n console.error(missingUrlError);\n }\n\n return null;\n }\n\n if (__HYDROGEN_DEV__ && !data.altText && !rest.alt) {\n console.warn(\n `<Image/>: the 'data' prop should have the 'altText' property, or the 'alt' prop, and one of them should not be empty. Image: ${\n data.id ?? data.url\n }`\n );\n }\n\n const {width: imgElementWidth, height: imgElementHeight} =\n getShopifyImageDimensions({\n data,\n loaderOptions,\n elementProps: {\n width,\n height,\n },\n });\n\n if (__HYDROGEN_DEV__ && (!imgElementWidth || !imgElementHeight)) {\n console.warn(\n `<Image/>: the 'data' prop requires either 'width' or 'data.width', and 'height' or 'data.height' properties. Image: ${\n data.id ?? data.url\n }`\n );\n }\n\n let finalSrc = data.url;\n\n if (loader) {\n finalSrc = loader({\n ...loaderOptions,\n src: data.url,\n width: imgElementWidth,\n height: imgElementHeight,\n });\n if (typeof finalSrc !== 'string' || !finalSrc) {\n throw new Error(\n `<Image/>: 'loader' did not return a valid string. Image: ${\n data.id ?? data.url\n }`\n );\n }\n }\n\n // determining what the intended width of the image is. For example, if the width is specified and lower than the image width, then that is the maximum image width\n // to prevent generating a srcset with widths bigger than needed or to generate images that would distort because of being larger than original\n const maxWidth =\n width && imgElementWidth && width < imgElementWidth\n ? width\n : imgElementWidth;\n const finalSrcset =\n rest.srcSet ??\n internalImageSrcSet({\n ...loaderOptions,\n widths,\n src: data.url,\n width: maxWidth,\n height: imgElementHeight,\n loader,\n });\n\n /* eslint-disable hydrogen/prefer-image-component */\n return (\n <img\n id={data.id ?? ''}\n alt={data.altText ?? rest.alt ?? ''}\n loading={loading ?? 'lazy'}\n {...rest}\n src={finalSrc}\n width={imgElementWidth ?? undefined}\n height={imgElementHeight ?? undefined}\n srcSet={finalSrcset}\n decoding={decoding}\n />\n );\n /* eslint-enable hydrogen/prefer-image-component */\n}\n\ntype InternalShopifySrcSetGeneratorsParams = Simplify<\n ShopifyLoaderOptions & {\n src: ImageType['url'];\n widths?: (HtmlImageProps['width'] | ImageType['width'])[];\n loader?: (params: ShopifyLoaderParams) => string;\n }\n>;\nfunction internalImageSrcSet({\n src,\n width,\n crop,\n scale,\n widths,\n loader,\n height,\n}: InternalShopifySrcSetGeneratorsParams) {\n const hasCustomWidths = widths && Array.isArray(widths);\n if (hasCustomWidths && widths.some((size) => isNaN(size as number))) {\n throw new Error(\n `<Image/>: the 'widths' must be an array of numbers. Image: ${src}`\n );\n }\n\n let aspectRatio = 1;\n if (width && height) {\n aspectRatio = Number(height) / Number(width);\n }\n\n let setSizes = hasCustomWidths ? widths : IMG_SRC_SET_SIZES;\n if (\n !hasCustomWidths &&\n width &&\n width < IMG_SRC_SET_SIZES[IMG_SRC_SET_SIZES.length - 1]\n ) {\n setSizes = IMG_SRC_SET_SIZES.filter((size) => size <= width);\n }\n const srcGenerator = loader ? loader : addImageSizeParametersToUrl;\n return setSizes\n .map(\n (size) =>\n `${srcGenerator({\n src,\n width: size,\n // height is not applied if there is no crop\n // if there is crop, then height is applied as a ratio of the original width + height aspect ratio * size\n height: crop ? Number(size) * aspectRatio : undefined,\n crop,\n scale,\n })} ${size}w`\n )\n .join(', ');\n}\n"],"names":["Image","data","width","height","loading","loader","shopifyImageLoader","loaderOptions","widths","decoding","rest","url","missingUrlError","id","Error","altText","alt","console","warn","imgElementWidth","imgElementHeight","getShopifyImageDimensions","elementProps","finalSrc","src","maxWidth","finalSrcset","srcSet","internalImageSrcSet","undefined","crop","scale","hasCustomWidths","Array","isArray","some","size","isNaN","aspectRatio","Number","setSizes","IMG_SRC_SET_SIZES","length","filter","srcGenerator","addImageSizeParametersToUrl","map","join"],"mappings":"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"}
1
+ {"version":3,"file":"Image.mjs","sources":["../../src/Image.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n getShopifyImageDimensions,\n shopifyImageLoader,\n addImageSizeParametersToUrl,\n IMG_SRC_SET_SIZES,\n} from './image-size.js';\nimport type {Image as ImageType} from './storefront-api-types.js';\nimport type {PartialDeep, Simplify} from 'type-fest';\n\ntype HtmlImageProps = React.ImgHTMLAttributes<HTMLImageElement>;\n\nexport type ShopifyLoaderOptions = {\n crop?: 'top' | 'bottom' | 'left' | 'right' | 'center';\n scale?: 2 | 3;\n width?: HtmlImageProps['width'] | ImageType['width'];\n height?: HtmlImageProps['height'] | ImageType['height'];\n};\nexport type ShopifyLoaderParams = Simplify<\n ShopifyLoaderOptions & {\n src: ImageType['url'];\n }\n>;\nexport type ShopifyImageProps = Omit<HtmlImageProps, 'src'> & {\n /** An object with fields that correspond to the Storefront API's\n * [Image object](https://shopify.dev/api/storefront/reference/common-objects/image).\n * The `data` prop is required.\n */\n data: PartialDeep<ImageType, {recurseIntoArrays: true}>;\n /** A custom function that generates the image URL. Parameters passed in\n * are `ShopifyLoaderParams`\n */\n loader?: (params: ShopifyLoaderParams) => string;\n /** An object of `loader` function options. For example, if the `loader` function\n * requires a `scale` option, then the value can be a property of the\n * `loaderOptions` object (for example, `{scale: 2}`). The object shape is `ShopifyLoaderOptions`.\n */\n loaderOptions?: ShopifyLoaderOptions;\n /**\n * `src` isn't used, and should instead be passed as part of the `data` object\n */\n src?: never;\n /**\n * An array of pixel widths to overwrite the default generated srcset. For example, `[300, 600, 800]`.\n */\n widths?: (HtmlImageProps['width'] | ImageType['width'])[];\n};\n\n/**\n * The `Image` component renders an image for the Storefront API's\n * [Image object](https://shopify.dev/api/storefront/reference/common-objects/image) by using the `data` prop. You can [customize this component](https://shopify.dev/api/hydrogen/components#customizing-hydrogen-components) using passthrough props.\n *\n * An image's width and height are determined using the following priority list:\n * 1. The width and height values for the `loaderOptions` prop\n * 2. The width and height values for bare props\n * 3. The width and height values for the `data` prop\n *\n * If only one of `width` or `height` are defined, then the other will attempt to be calculated based on the image's aspect ratio,\n * provided that both `data.width` and `data.height` are available. If `data.width` and `data.height` aren't available, then the aspect ratio cannot be determined and the missing\n * value will remain as `null`\n */\nexport function Image({\n data,\n width,\n height,\n loading,\n loader = shopifyImageLoader,\n loaderOptions,\n widths,\n decoding = 'async',\n ...rest\n}: ShopifyImageProps) {\n if (!data.url) {\n const missingUrlError = `<Image/>: the 'data' prop requires the 'url' property. Image: ${\n data.id ?? 'no ID provided'\n }`;\n\n if (__HYDROGEN_DEV__) {\n throw new Error(missingUrlError);\n } else {\n console.error(missingUrlError);\n }\n\n return null;\n }\n\n if (__HYDROGEN_DEV__ && !data.altText && !rest.alt) {\n console.warn(\n `<Image/>: the 'data' prop should have the 'altText' property, or the 'alt' prop, and one of them should not be empty. Image: ${\n data.id ?? data.url\n }`\n );\n }\n\n const {width: imgElementWidth, height: imgElementHeight} =\n getShopifyImageDimensions({\n data,\n loaderOptions,\n elementProps: {\n width,\n height,\n },\n });\n\n if (__HYDROGEN_DEV__ && (!imgElementWidth || !imgElementHeight)) {\n console.warn(\n `<Image/>: the 'data' prop requires either 'width' or 'data.width', and 'height' or 'data.height' properties. Image: ${\n data.id ?? data.url\n }`\n );\n }\n\n let finalSrc = data.url;\n\n if (loader) {\n finalSrc = loader({\n ...loaderOptions,\n src: data.url,\n width: imgElementWidth,\n height: imgElementHeight,\n });\n if (typeof finalSrc !== 'string' || !finalSrc) {\n throw new Error(\n `<Image/>: 'loader' did not return a valid string. Image: ${\n data.id ?? data.url\n }`\n );\n }\n }\n\n // determining what the intended width of the image is. For example, if the width is specified and lower than the image width, then that is the maximum image width\n // to prevent generating a srcset with widths bigger than needed or to generate images that would distort because of being larger than original\n const maxWidth =\n width && imgElementWidth && width < imgElementWidth\n ? width\n : imgElementWidth;\n const finalSrcset =\n rest.srcSet ??\n internalImageSrcSet({\n ...loaderOptions,\n widths,\n src: data.url,\n width: maxWidth,\n height: imgElementHeight,\n loader,\n });\n\n /* eslint-disable hydrogen/prefer-image-component */\n return (\n <img\n id={data.id ?? ''}\n alt={data.altText ?? rest.alt ?? ''}\n loading={loading ?? 'lazy'}\n {...rest}\n src={finalSrc}\n width={imgElementWidth ?? undefined}\n height={imgElementHeight ?? undefined}\n srcSet={finalSrcset}\n decoding={decoding}\n />\n );\n /* eslint-enable hydrogen/prefer-image-component */\n}\n\ntype InternalShopifySrcSetGeneratorsParams = Simplify<\n ShopifyLoaderOptions & {\n src: ImageType['url'];\n widths?: (HtmlImageProps['width'] | ImageType['width'])[];\n loader?: (params: ShopifyLoaderParams) => string;\n }\n>;\nfunction internalImageSrcSet({\n src,\n width,\n crop,\n scale,\n widths,\n loader,\n height,\n}: InternalShopifySrcSetGeneratorsParams) {\n const hasCustomWidths = widths && Array.isArray(widths);\n if (hasCustomWidths && widths.some((size) => isNaN(size as number))) {\n throw new Error(\n `<Image/>: the 'widths' must be an array of numbers. Image: ${src}`\n );\n }\n\n let aspectRatio = 1;\n if (width && height) {\n aspectRatio = Number(height) / Number(width);\n }\n\n let setSizes = hasCustomWidths ? widths : IMG_SRC_SET_SIZES;\n if (\n !hasCustomWidths &&\n width &&\n width < IMG_SRC_SET_SIZES[IMG_SRC_SET_SIZES.length - 1]\n ) {\n setSizes = IMG_SRC_SET_SIZES.filter((size) => size <= width);\n }\n const srcGenerator = loader ? loader : addImageSizeParametersToUrl;\n return setSizes\n .map(\n (size) =>\n `${srcGenerator({\n src,\n width: size,\n // height is not applied if there is no crop\n // if there is crop, then height is applied as a ratio of the original width + height aspect ratio * size\n height: crop ? Number(size) * aspectRatio : undefined,\n crop,\n scale,\n })} ${size}w`\n )\n .join(', ');\n}\n"],"names":["Image","data","width","height","loading","loader","shopifyImageLoader","loaderOptions","widths","decoding","rest","url","missingUrlError","id","Error","altText","alt","console","warn","imgElementWidth","imgElementHeight","getShopifyImageDimensions","elementProps","finalSrc","src","maxWidth","finalSrcset","srcSet","internalImageSrcSet","undefined","crop","scale","hasCustomWidths","Array","isArray","some","size","isNaN","aspectRatio","Number","setSizes","IMG_SRC_SET_SIZES","length","filter","srcGenerator","addImageSizeParametersToUrl","map","join"],"mappings":";;AA6DO,SAASA,MAAM;AAAA,EACpBC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC,SAASC;AAAAA,EACTC;AAAAA,EACAC;AAAAA,EACAC,WAAW;AAAA,KACRC;AACc,GAAG;;AAChB,MAAA,CAACT,KAAKU,KAAK;AACPC,UAAAA,kBAAmB,kEACvBX,UAAKY,OAALZ,YAAW;AAGS;AACd,YAAA,IAAIa,MAAMF,eAAe;AAAA,IAGjC;AAAA,EAGF;AAEA,MAAwB,CAACX,KAAKc,WAAW,CAACL,KAAKM,KAAK;AAClDC,YAAQC,KACL,iIACCjB,UAAKY,OAALZ,YAAWA,KAAKU,KAChB;AAAA,EAEN;AAEM,QAAA;AAAA,IAACT,OAAOiB;AAAAA,IAAiBhB,QAAQiB;AAAAA,MACrCC,0BAA0B;AAAA,IACxBpB;AAAAA,IACAM;AAAAA,IACAe,cAAc;AAAA,MACZpB;AAAAA,MACAC;AAAAA,IACF;AAAA,EAAA,CACD;AAEH,MAAyB,CAACgB,mBAAmB,CAACC,kBAAmB;AAC/DH,YAAQC,KACL,wHACCjB,UAAKY,OAALZ,YAAWA,KAAKU,KAChB;AAAA,EAEN;AAEA,MAAIY,WAAWtB,KAAKU;AAEpB,MAAIN,QAAQ;AACVkB,eAAWlB,OAAO;AAAA,MAChB,GAAGE;AAAAA,MACHiB,KAAKvB,KAAKU;AAAAA,MACVT,OAAOiB;AAAAA,MACPhB,QAAQiB;AAAAA,IAAAA,CACT;AACD,QAAI,OAAOG,aAAa,YAAY,CAACA,UAAU;AAC7C,YAAM,IAAIT,MACP,6DACCb,UAAKY,OAALZ,YAAWA,KAAKU,KAChB;AAAA,IAEN;AAAA,EACF;AAIA,QAAMc,WACJvB,SAASiB,mBAAmBjB,QAAQiB,kBAChCjB,QACAiB;AACAO,QAAAA,eACJhB,UAAKiB,WAALjB,YACAkB,oBAAoB;AAAA,IAClB,GAAGrB;AAAAA,IACHC;AAAAA,IACAgB,KAAKvB,KAAKU;AAAAA,IACVT,OAAOuB;AAAAA,IACPtB,QAAQiB;AAAAA,IACRf;AAAAA,EAAAA,CACD;AAGH,6BACE,OAAA;AAAA,IACE,KAAIJ,UAAKY,OAALZ,YAAW;AAAA,IACf,MAAKA,gBAAKc,YAALd,YAAgBS,KAAKM,QAArBf,YAA4B;AAAA,IACjC,SAASG,4BAAW;AAAA,IAAO,GACvBM;AAAAA,IACJ,KAAKa;AAAAA,IACL,OAAOJ,4CAAmBU;AAAAA,IAC1B,QAAQT,8CAAoBS;AAAAA,IAC5B,QAAQH;AAAAA,IACR;AAAA,EAAA,CACA;AAGN;AASA,SAASE,oBAAoB;AAAA,EAC3BJ;AAAAA,EACAtB;AAAAA,EACA4B;AAAAA,EACAC;AAAAA,EACAvB;AAAAA,EACAH;AAAAA,EACAF;AACqC,GAAG;AACxC,QAAM6B,kBAAkBxB,UAAUyB,MAAMC,QAAQ1B,MAAM;AACtD,MAAIwB,mBAAmBxB,OAAO2B,KAAMC,UAASC,MAAMD,IAAc,CAAC,GAAG;AAC7D,UAAA,IAAItB,MACP,8DAA6DU,KAAK;AAAA,EAEvE;AAEA,MAAIc,cAAc;AAClB,MAAIpC,SAASC,QAAQ;AACnBmC,kBAAcC,OAAOpC,MAAM,IAAIoC,OAAOrC,KAAK;AAAA,EAC7C;AAEIsC,MAAAA,WAAWR,kBAAkBxB,SAASiC;AAC1C,MACE,CAACT,mBACD9B,SACAA,QAAQuC,kBAAkBA,kBAAkBC,SAAS,IACrD;AACAF,eAAWC,kBAAkBE,OAAQP,CAASA,SAAAA,QAAQlC,KAAK;AAAA,EAC7D;AACM0C,QAAAA,eAAevC,SAASA,SAASwC;AACvC,SAAOL,SACJM,IACEV,CACE,SAAA,GAAEQ,aAAa;AAAA,IACdpB;AAAAA,IACAtB,OAAOkC;AAAAA,IAGPjC,QAAQ2B,OAAOS,OAAOH,IAAI,IAAIE,cAAcT;AAAAA,IAC5CC;AAAAA,IACAC;AAAAA,EAAAA,CACD,KAAKK,OAAO,EAEhBW,KAAK,IAAI;AACd;"}
@@ -44,7 +44,7 @@ function MediaFile({
44
44
  });
45
45
  }
46
46
  default: {
47
- const typenameMissingMessage = `<MediaFile /> requires the '__typename' property to exist on the 'data' prop in order to correctly render the correct component for this media. Rendering 'null' by default`;
47
+ const typenameMissingMessage = `<MediaFile /> requires the '__typename' property to exist on the 'data' prop in order to render the matching sub-component for this type of media.`;
48
48
  {
49
49
  throw new Error(typenameMissingMessage);
50
50
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaFile.mjs","sources":["../../src/MediaFile.tsx"],"sourcesContent":["import {Image, type ShopifyImageProps} from './Image.js';\nimport {Video} from './Video.js';\nimport {ExternalVideo} from './ExternalVideo.js';\nimport {ModelViewer} from './ModelViewer.js';\nimport type {MediaEdge as MediaEdgeType} from './storefront-api-types.js';\nimport type {PartialDeep} from 'type-fest';\nimport type {ModelViewerElement} from '@google/model-viewer/lib/model-viewer.js';\n\ntype BaseProps = React.HTMLAttributes<\n HTMLImageElement | HTMLVideoElement | HTMLIFrameElement | ModelViewerElement\n>;\nexport interface MediaFileProps extends BaseProps {\n /** An object with fields that correspond to the Storefront API's [Media object](https://shopify.dev/api/storefront/reference/products/media). */\n data: PartialDeep<MediaEdgeType['node'], {recurseIntoArrays: true}>;\n /** The options for the `Image`, `Video`, or `ExternalVideo` components. */\n mediaOptions?: {\n /** Props that will only apply when an `<Image />` is rendered */\n image?: Omit<ShopifyImageProps, 'data'>;\n /** Props that will only apply when a `<Video />` is rendered */\n video?: Omit<React.ComponentProps<typeof Video>, 'data'>;\n /** Props that will only apply when an `<ExternalVideo />` is rendered */\n externalVideo?: Omit<\n React.ComponentProps<typeof ExternalVideo>['options'],\n 'data'\n >;\n /** Props that will only apply when a `<ModelViewer />` is rendered */\n modelViewer?: Omit<typeof ModelViewer, 'data'>;\n };\n}\n\n/**\n * The `MediaFile` component renders the media for the Storefront API's\n * [Media object](https://shopify.dev/api/storefront/reference/products/media). It renders an `Image`, a\n * `Video`, an `ExternalVideo`, or a `ModelViewer` depending on the `__typename` of the `data` prop.\n */\nexport function MediaFile({\n data,\n mediaOptions,\n ...passthroughProps\n}: MediaFileProps) {\n switch (data.__typename) {\n case 'MediaImage': {\n if (!data.image) {\n const noDataImage = `<MediaFile/>: 'data.image' does not exist for __typename of 'MediaImage'; rendering 'null' by default.`;\n if (__HYDROGEN_DEV__) {\n throw new Error(noDataImage);\n } else {\n console.warn(noDataImage);\n return null;\n }\n }\n\n return (\n <Image\n {...passthroughProps}\n {...mediaOptions?.image}\n data={data.image}\n />\n );\n }\n case 'Video': {\n return (\n <Video {...passthroughProps} {...mediaOptions?.video} data={data} />\n );\n }\n case 'ExternalVideo': {\n return (\n <ExternalVideo\n {...passthroughProps}\n {...mediaOptions?.externalVideo}\n data={data}\n />\n );\n }\n case 'Model3d': {\n return (\n // @ts-expect-error There are issues with the inferred HTML attribute types here for ModelViewer (and contentEditable), but I think that's a little bit beyond me at the moment\n <ModelViewer\n {...passthroughProps}\n {...mediaOptions?.modelViewer}\n data={data}\n />\n );\n }\n default: {\n const typenameMissingMessage = `<MediaFile /> requires the '__typename' property to exist on the 'data' prop in order to render the matching sub-component for this type of media.`;\n if (__HYDROGEN_DEV__) {\n throw new Error(typenameMissingMessage);\n } else {\n console.error(`${typenameMissingMessage} Rendering 'null' by default`);\n return null;\n }\n }\n }\n}\n"],"names":["MediaFile","data","mediaOptions","passthroughProps","__typename","image","noDataImage","Error","video","externalVideo","modelViewer","typenameMissingMessage"],"mappings":";;;;;AAmCO,SAASA,UAAU;AAAA,EACxBC;AAAAA,EACAC;AAAAA,KACGC;AACW,GAAG;AACjB,UAAQF,KAAKG,YAAU;AAAA,IACrB,KAAK,cAAc;AACb,UAAA,CAACH,KAAKI,OAAO;AACf,cAAMC,cAAe;AACC;AACd,gBAAA,IAAIC,MAAMD,WAAW;AAAA,QAI7B;AAAA,MACF;AAEA,iCACG,OAAK;AAAA,QAAA,GACAH;AAAAA,QAAgB,GAChBD,6CAAcG;AAAAA,QAClB,MAAMJ,KAAKI;AAAAA,MAAAA,CACX;AAAA,IAEN;AAAA,IACA,KAAK,SAAS;AACZ,iCACG,OAAK;AAAA,QAAA,GAAKF;AAAAA,QAAgB,GAAMD,6CAAcM;AAAAA,QAAO;AAAA,MAAA,CAAc;AAAA,IAExE;AAAA,IACA,KAAK,iBAAiB;AACpB,iCACG,eAAa;AAAA,QAAA,GACRL;AAAAA,QAAgB,GAChBD,6CAAcO;AAAAA,QAClB;AAAA,MAAA,CACA;AAAA,IAEN;AAAA,IACA,KAAK,WAAW;AACd,iCAEG,aAAW;AAAA,QAAA,GACNN;AAAAA,QAAgB,GAChBD,6CAAcQ;AAAAA,QAClB;AAAA,MAAA,CAAW;AAAA,IAGjB;AAAA,IACA,SAAS;AACP,YAAMC,yBAA0B;AACV;AACd,cAAA,IAAIJ,MAAMI,sBAAsB;AAAA,MAIxC;AAAA,IACF;AAAA,EAAC;AAEL;"}
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"Metafield.mjs","sources":["../../src/Metafield.tsx"],"sourcesContent":["import {type ElementType, useMemo, type ComponentPropsWithoutRef} from 'react';\nimport {useShop} from './ShopifyProvider.js';\nimport {Image} from './Image.js';\nimport type {\n MediaImage,\n Page,\n ProductVariant,\n Product,\n GenericFile,\n Video as VideoType,\n Metafield as MetafieldType,\n} from './storefront-api-types.js';\nimport {Video} from './Video.js';\nimport {flattenConnection} from './flatten-connection.js';\nimport type {PartialDeep, JsonValue} from 'type-fest';\n\ninterface BaseProps<ComponentGeneric extends ElementType> {\n /** An object with fields that correspond to the Storefront API's [Metafield object](https://shopify.dev/api/storefront/reference/common-objects/metafield). */\n data: PartialDeep<MetafieldType, {recurseIntoArrays: true}> | null;\n /** An HTML tag or React component to be rendered as the base element wrapper. The default value varies depending on [metafield.type](https://shopify.dev/apps/metafields/types). */\n as?: ComponentGeneric;\n}\n\nexport type MetafieldProps<ComponentGeneric extends ElementType> =\n ComponentPropsWithoutRef<ComponentGeneric> & BaseProps<ComponentGeneric>;\n\n/**\n * The `Metafield` component renders the value of a Storefront\n * API's [Metafield object](https://shopify.dev/api/storefront/reference/common-objects/metafield).\n * Relies on the `locale` property of the `useShop()` hook, so it must be a desendent of `<ShopifyProvider/>`\n *\n * Renders a smart default of the Metafield's `value`. For more information, refer to the [Default output](#default-output) section.\n */\nexport function Metafield<ComponentGeneric extends ElementType>(\n props: MetafieldProps<ComponentGeneric>\n) {\n const {data, as, ...passthroughProps} = props;\n const {locale} = useShop();\n\n const parsedMetafield = useMemo(() => parseMetafield(data), [data]);\n\n if (!parsedMetafield) {\n const noDataPropWarning = `<Metafield/>: nothing was passed to the data prop 'data'. Rendering 'null'`;\n if (__HYDROGEN_DEV__) {\n throw new Error(noDataPropWarning);\n } else {\n console.warn(noDataPropWarning);\n }\n return null;\n }\n\n if (parsedMetafield.value === null || parsedMetafield.value === undefined) {\n const noValueWarning = `<Metafield/>: No metafield value for metafield ${\n parsedMetafield.id ?? parsedMetafield.key\n }. Rendering 'null'`;\n if (__HYDROGEN_DEV__) {\n throw new Error(noValueWarning);\n } else {\n console.warn(noValueWarning);\n }\n return null;\n }\n\n switch (parsedMetafield.type) {\n case 'date': {\n const Wrapper = as ?? 'time';\n return (\n <Wrapper {...passthroughProps}>\n {(parsedMetafield.value as Date).toLocaleDateString(locale)}\n </Wrapper>\n );\n }\n case 'date_time': {\n const Wrapper = as ?? 'time';\n return (\n <Wrapper {...passthroughProps}>\n {(parsedMetafield.value as Date).toLocaleString(locale)}\n </Wrapper>\n );\n }\n case 'weight':\n case 'dimension':\n case 'volume': {\n const Wrapper = as ?? 'span';\n return (\n <Wrapper {...passthroughProps}>\n {getMeasurementAsString(parsedMetafield.value as Measurement, locale)}\n </Wrapper>\n );\n }\n case 'rating': {\n const Wrapper = as ?? 'span';\n return (\n <Wrapper {...passthroughProps}>\n {(parsedMetafield.value as Rating).value}\n </Wrapper>\n );\n }\n case 'single_line_text_field': {\n const Wrapper = as ?? 'span';\n return (\n <Wrapper\n {...passthroughProps}\n dangerouslySetInnerHTML={{__html: parsedMetafield.value as string}}\n />\n );\n }\n case 'multi_line_text_field': {\n const Wrapper = as ?? 'div';\n return (\n <Wrapper\n {...passthroughProps}\n dangerouslySetInnerHTML={{\n __html: (parsedMetafield.value as string).split('\\n').join('<br/>'),\n }}\n />\n );\n }\n case 'url': {\n const protocolLessUrl = new URL(parsedMetafield.value as string);\n return (\n <a\n href={protocolLessUrl.href.replace(protocolLessUrl.protocol, '')}\n {...passthroughProps}\n >\n {parsedMetafield.value as string}\n </a>\n );\n }\n case 'json': {\n const Wrapper = as ?? 'span';\n return (\n <Wrapper {...passthroughProps}>\n {JSON.stringify(parsedMetafield.value)}\n </Wrapper>\n );\n }\n case 'product_reference':\n case 'variant_reference':\n case 'page_reference': {\n const Wrapper = as ?? 'span';\n const ref = parsedMetafield.reference as Page | ProductVariant | Product;\n return (\n <Wrapper {...passthroughProps}>{ref?.title ?? ref?.id ?? ''}</Wrapper>\n );\n }\n case 'list.single_line_text_field': {\n const Wrapper = as ?? 'ul';\n\n const refArray = parsedMetafield.references\n ? (flattenConnection(parsedMetafield.references) as string[])\n : [];\n return (\n <Wrapper {...passthroughProps}>\n {refArray.map((ref, index) => (\n // there's no unique way to identify these strings, so we do our best by combining the string with the index for the key\n // eslint-disable-next-line react/no-array-index-key\n <li key={`${ref ?? ''}-${index}`}>{ref}</li>\n ))}\n </Wrapper>\n );\n }\n case 'file_reference': {\n if (parsedMetafield.reference?.__typename === 'MediaImage') {\n const ref = parsedMetafield.reference as MediaImage;\n return ref.image ? (\n <Image data={ref.image} {...passthroughProps} />\n ) : null;\n } else if (parsedMetafield.reference?.__typename === 'GenericFile') {\n const ref = parsedMetafield.reference as GenericFile;\n return ref.previewImage ? (\n <a href={parsedMetafield.reference?.url ?? ''} {...passthroughProps}>\n <Image data={ref.previewImage} />\n </a>\n ) : null;\n } else if (parsedMetafield.reference?.__typename === 'Video') {\n const ref = parsedMetafield.reference as VideoType;\n return <Video {...passthroughProps} data={ref} />;\n }\n }\n }\n\n const Wrapper = as ?? 'span';\n return (\n <Wrapper {...passthroughProps}>{parsedMetafield.value?.toString()}</Wrapper>\n );\n}\n\n/**\n * The `parseMetafield` utility transforms a [Metafield](https://shopify.dev/api/storefront/reference/common-objects/Metafield)\n * into a new object whose `values` have been parsed according to the metafield `type`.\n * If the metafield is `null`, then it returns `null` back.\n *\n * Note that `parseMetafield()` will have a breaking change in a future version; it will change to behave like `metafieldParser()`.\n */\nexport function parseMetafield(\n /** A [Metafield](https://shopify.dev/api/storefront/reference/common-objects/Metafield) or null */\n metafield: PartialDeep<MetafieldType, {recurseIntoArrays: true}> | null\n): PartialDeep<ParsedMetafield, {recurseIntoArrays: true}> | null {\n if (__HYDROGEN_DEV__) {\n console.info(\n `'parseMetafield()' will have a breaking change in a future version; its behavior will match that of 'metafieldParser()'`\n );\n }\n\n if (!metafield) {\n if (__HYDROGEN_DEV__) {\n console.warn(\n `'parseMetafield' was not passed any value for the 'metafield' argument`\n );\n }\n return null;\n }\n if (\n __HYDROGEN_DEV__ &&\n (metafield.value === null || metafield.value === undefined)\n ) {\n console.warn(\n `'parseMetafield()' was passed ${metafield.value} for 'metafield.value'`\n );\n }\n\n return {\n ...metafield,\n value: parseMetafieldValue(metafield),\n };\n}\n\n/**\n * The `parseMetafieldValue` function parses a [Metafield](https://shopify.dev/api/storefront/reference/common-objects/metafield)'s `value` from a string into a sensible type corresponding to the [Metafield](https://shopify.dev/api/storefront/reference/common-objects/metafield)'s `type`.\n * @deprecated `parseMetafieldValue()` is unsupported and will be removed in a future version.\n */\nexport function parseMetafieldValue(\n metafield: PartialDeep<MetafieldType, {recurseIntoArrays: true}> | null\n): ParsedMetafield['value'] {\n if (__HYDROGEN_DEV__) {\n console.info(`'parseMetafieldValue()' will be removed in a future version`);\n }\n\n if (!metafield) {\n return null;\n }\n\n if (metafield.value === null || metafield.value === undefined) {\n if (__HYDROGEN_DEV__) {\n console.warn(\n `'parseMetafieldValue()' was passed ${metafield.value} for 'metafield.value'`\n );\n }\n return metafield.value;\n }\n\n switch (metafield.type) {\n case 'boolean':\n return metafield.value === 'true';\n case 'number_integer':\n return parseInt(metafield.value);\n case 'number_decimal':\n return parseFloat(metafield.value);\n case 'date':\n case 'date_time':\n return new Date(metafield.value);\n case 'json':\n case 'weight':\n case 'dimension':\n case 'volume':\n case 'rating':\n return parseJSON(metafield.value);\n case 'color':\n case 'single_line_text_field':\n case 'multi_line_text_field':\n case 'product_reference':\n case 'page_reference':\n case 'variant_reference':\n case 'file_reference':\n case 'url':\n default:\n return metafield.value;\n }\n}\n\n/**\n * Parses a JSON string while preventing prototype injection attacks.\n */\nexport function parseJSON(json: string) {\n if (String(json).includes('__proto__')) {\n return JSON.parse(json, (k, v) => {\n if (k !== '__proto__') return v;\n });\n }\n\n return JSON.parse(json);\n}\n\nconst UNIT_MAPPING: Record<string, string> = {\n // Dimension\n mm: 'millimeter',\n cm: 'centimeter',\n m: 'meter',\n in: 'inch',\n ft: 'foot',\n yd: 'yard',\n // Volume\n ml: 'milliliter',\n l: 'liter',\n us_fl_oz: 'fluid-ounce',\n us_gal: 'gallon',\n // Weight\n kg: 'kilogram',\n g: 'gram',\n lb: 'pound',\n oz: 'ounce',\n};\n\nexport function getMeasurementAsString(\n measurement: Measurement,\n locale = 'en-us',\n options: Intl.NumberFormatOptions = {}\n) {\n let measure: Measurement = {\n value: measurement.value,\n unit: UNIT_MAPPING[measurement.unit],\n };\n\n if (measure.unit == null) {\n measure = convertToSupportedUnit(measurement.value, measurement.unit);\n }\n\n return new Intl.NumberFormat(locale, {\n ...options,\n unit: measure.unit,\n style: 'unit',\n }).format(measure.value);\n}\n\nfunction convertToSupportedUnit(value: number, unit: string): Measurement {\n switch (unit) {\n case 'cl':\n return {\n value: value / 1000,\n unit: 'liter',\n };\n case 'm3':\n return {\n value: value * 1000,\n unit: 'liter',\n };\n case 'us_pt':\n return {\n value: value * 0.125,\n unit: 'gallon',\n };\n case 'us_qt':\n return {\n value: value * 0.5,\n unit: 'gallon',\n };\n case 'us_oz':\n return {\n value: value / 128,\n unit: 'gallon',\n };\n case 'imp_pt':\n return {\n value: value / 6.661, // approximate conversion\n unit: 'gallon',\n };\n case 'imp_qt':\n return {\n value: value / 3.331, // approximate conversion\n unit: 'gallon',\n };\n case 'imp_gal':\n return {\n value: value / 1.201, // approximate conversion\n unit: 'gallon',\n };\n case 'imp_fl_oz':\n return {\n value: value * 0.96076, // approximate conversion\n unit: 'fluid-ounce',\n };\n default:\n throw new Error(`Unit not supported: ${unit}`);\n }\n}\n\ntype ParsedMetafield = Omit<\n PartialDeep<MetafieldType, {recurseIntoArrays: true}>,\n 'value'\n> & {\n value?: string | number | boolean | JsonValue | Date | Rating | Measurement;\n};\n\nexport interface Rating {\n value: number;\n scale_min: number;\n scale_max: number;\n}\n\ninterface Measurement {\n unit: string;\n value: number;\n}\n"],"names":["Metafield","props","data","as","passthroughProps","locale","useShop","parsedMetafield","useMemo","parseMetafield","noDataPropWarning","Error","value","undefined","noValueWarning","id","key","type","Wrapper","toLocaleDateString","toLocaleString","getMeasurementAsString","__html","split","join","protocolLessUrl","URL","href","replace","protocol","JSON","stringify","ref","reference","title","refArray","references","flattenConnection","map","index","__typename","image","_jsx","previewImage","url","toString","metafield","console","info","warn","parseMetafieldValue","parseInt","parseFloat","Date","parseJSON","json","String","includes","parse","k","v","UNIT_MAPPING","mm","cm","m","in","ft","yd","ml","l","us_fl_oz","us_gal","kg","g","lb","oz","measurement","options","measure","unit","convertToSupportedUnit","Intl","NumberFormat","style","format"],"mappings":";;;;;;AAiCO,SAASA,UACdC,OACA;;AACM,QAAA;AAAA,IAACC;AAAAA,IAAMC;AAAAA,OAAOC;AAAAA,EAAoBH,IAAAA;AAClC,QAAA;AAAA,IAACI;AAAAA,MAAUC,QAAjB;AAEMC,QAAAA,kBAAkBC,QAAQ,MAAMC,eAAeP,IAAD,GAAQ,CAACA,IAAD,CAA7B;AAE/B,MAAI,CAACK,iBAAiB;AACpB,UAAMG,oBAAqB;AACL;AACd,YAAA,IAAIC,MAAMD,iBAAV;AAAA,IAGP;AAAA,EAEF;AAED,MAAIH,gBAAgBK,UAAU,QAAQL,gBAAgBK,UAAUC,QAAW;AACzE,UAAMC,iBAAkB,mDACtBP,qBAAgBQ,OAAhBR,YAAsBA,gBAAgBS;AAElB;AACd,YAAA,IAAIL,MAAMG,cAAV;AAAA,IAGP;AAAA,EAEF;AAED,UAAQP,gBAAgBU,MAAxB;AAAA,IACE,KAAK,QAAQ;AACX,YAAMC,WAAUf,kBAAM;AACtB,iCACGe,UAAD;AAAA,QAAA,GAAad;AAAAA,QAAb,UACIG,gBAAgBK,MAAeO,mBAAmBd,MAAnD;AAAA,MAAA,CAFL;AAAA,IAKD;AAAA,IACD,KAAK,aAAa;AAChB,YAAMa,WAAUf,kBAAM;AACtB,iCACGe,UAAD;AAAA,QAAA,GAAad;AAAAA,QAAb,UACIG,gBAAgBK,MAAeQ,eAAef,MAA/C;AAAA,MAAA,CAFL;AAAA,IAKD;AAAA,IACD,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,UAAU;AACb,YAAMa,WAAUf,kBAAM;AACtB,iCACGe,UAAD;AAAA,QAAA,GAAad;AAAAA,QAAb,UACGiB,uBAAuBd,gBAAgBK,OAAsBP,MAAvC;AAAA,MAAA,CAF3B;AAAA,IAKD;AAAA,IACD,KAAK,UAAU;AACb,YAAMa,WAAUf,kBAAM;AACtB,iCACGe,UAAD;AAAA,QAAA,GAAad;AAAAA,QAAb,UACIG,gBAAgBK,MAAiBA;AAAAA,MAAAA,CAFvC;AAAA,IAKD;AAAA,IACD,KAAK,0BAA0B;AAC7B,YAAMM,WAAUf,kBAAM;AACtB,iCACGe,UAAD;AAAA,QAAA,GACMd;AAAAA,QACJ,yBAAyB;AAAA,UAACkB,QAAQf,gBAAgBK;AAAAA,QAAzB;AAAA,MAAA,CAH7B;AAAA,IAMD;AAAA,IACD,KAAK,yBAAyB;AAC5B,YAAMM,WAAUf,kBAAM;AACtB,iCACGe,UAAD;AAAA,QAAA,GACMd;AAAAA,QACJ,yBAAyB;AAAA,UACvBkB,QAASf,gBAAgBK,MAAiBW,MAAM,IAAxC,EAA8CC,KAAK,OAAnD;AAAA,QADe;AAAA,MAAA,CAH7B;AAAA,IAQD;AAAA,IACD,KAAK,OAAO;AACV,YAAMC,kBAAkB,IAAIC,IAAInB,gBAAgBK,KAAhD;AACA,iCACE,KAAA;AAAA,QACE,MAAMa,gBAAgBE,KAAKC,QAAQH,gBAAgBI,UAAU,EAAvD;AAAA,QADR,GAEMzB;AAAAA,QAFN,UAIGG,gBAAgBK;AAAAA,MAAAA,CALrB;AAAA,IAQD;AAAA,IACD,KAAK,QAAQ;AACX,YAAMM,WAAUf,kBAAM;AACtB,iCACGe,UAAD;AAAA,QAAA,GAAad;AAAAA,QAAb,UACG0B,KAAKC,UAAUxB,gBAAgBK,KAA/B;AAAA,MAAA,CAFL;AAAA,IAKD;AAAA,IACD,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,kBAAkB;AACrB,YAAMM,WAAUf,kBAAM;AACtB,YAAM6B,MAAMzB,gBAAgB0B;AAC5B,iCACGf,UAAD;AAAA,QAAA,GAAad;AAAAA,QAAb,WAAgC4B,sCAAKE,UAALF,YAAcA,2BAAKjB,OAAnBiB,YAAyB;AAAA,MAAA,CAD3D;AAAA,IAGD;AAAA,IACD,KAAK,+BAA+B;AAClC,YAAMd,WAAUf,kBAAM;AAEtB,YAAMgC,WAAW5B,gBAAgB6B,aAC5BC,kBAAkB9B,gBAAgB6B,UAAjB,IAClB;AACJ,iCACGlB,UAAD;AAAA,QAAA,GAAad;AAAAA,QAAb,UACG+B,SAASG,IAAI,CAACN,KAAKO,8BAGlB,MAAA;AAAA,UAAA,UAAmCP;AAAAA,QAAAA,GAAzB,GAAEA,oBAAO,MAAMO,OAAzB,CAHD;AAAA,MAAA,CAFL;AAAA,IASD;AAAA,IACD,KAAK,kBAAkB;AACjBhC,YAAAA,qBAAgB0B,cAAhB1B,mBAA2BiC,gBAAe,cAAc;AAC1D,cAAMR,MAAMzB,gBAAgB0B;AACrBD,eAAAA,IAAIS,QACTC,oBAAC,OAAD;AAAA,UAAO,MAAMV,IAAIS;AAAAA,UAAjB,GAA4BrC;AAAAA,QAA5B,CAAA,IACE;AAAA,MACKG,aAAAA,qBAAgB0B,cAAhB1B,mBAA2BiC,gBAAe,eAAe;AAClE,cAAMR,MAAMzB,gBAAgB0B;AACrBD,eAAAA,IAAIW,eACTD,oBAAA,KAAA;AAAA,UAAG,OAAMnC,2BAAgB0B,cAAhB1B,mBAA2BqC,QAA3BrC,YAAkC;AAAA,UAA3C,GAAmDH;AAAAA,UAAnD,8BACG,OAAD;AAAA,YAAO,MAAM4B,IAAIW;AAAAA,UAAAA,CAAjB;AAAA,QADF,CAAA,IAGE;AAAA,MACKpC,aAAAA,qBAAgB0B,cAAhB1B,mBAA2BiC,gBAAe,SAAS;AAC5D,cAAMR,MAAMzB,gBAAgB0B;AAC5B,mCAAQ,OAAD;AAAA,UAAA,GAAW7B;AAAAA,UAAkB,MAAM4B;AAAAA,QAAAA,CAA1C;AAAA,MACD;AAAA,IACF;AAAA,EApHH;AAuHA,QAAMd,UAAUf,kBAAM;AACtB,6BACG,SAAD;AAAA,IAAA,GAAaC;AAAAA,IAAb,WAAgCG,qBAAgBK,UAAhBL,mBAAuBsC;AAAAA,EAAvB,CADlC;AAGD;AASM,SAASpC,eAEdqC,WACgE;AAC1C;AACpBC,YAAQC,KACL,yHADH;AAAA,EAGD;AAED,MAAI,CAACF,WAAW;AACQ;AACpBC,cAAQE,KACL,wEADH;AAAA,IAGD;AACM,WAAA;AAAA,EACR;AACD,MAEGH,UAAUlC,UAAU,QAAQkC,UAAUlC,UAAUC,QACjD;AACQoC,YAAAA,KACL,iCAAgCH,UAAUlC,6BAD7C;AAAA,EAGD;AAEM,SAAA;AAAA,IACL,GAAGkC;AAAAA,IACHlC,OAAOsC,oBAAoBJ,SAAD;AAAA,EAAA;AAE7B;AAMM,SAASI,oBACdJ,WAC0B;AACJ;AACpBC,YAAQC,KAAM,6DAAd;AAAA,EACD;AAED,MAAI,CAACF,WAAW;AACP,WAAA;AAAA,EACR;AAED,MAAIA,UAAUlC,UAAU,QAAQkC,UAAUlC,UAAUC,QAAW;AACvC;AACZoC,cAAAA,KACL,sCAAqCH,UAAUlC,6BADlD;AAAA,IAGD;AACD,WAAOkC,UAAUlC;AAAAA,EAClB;AAED,UAAQkC,UAAU7B,MAAlB;AAAA,IACE,KAAK;AACH,aAAO6B,UAAUlC,UAAU;AAAA,IAC7B,KAAK;AACIuC,aAAAA,SAASL,UAAUlC,KAAX;AAAA,IACjB,KAAK;AACIwC,aAAAA,WAAWN,UAAUlC,KAAX;AAAA,IACnB,KAAK;AAAA,IACL,KAAK;AACI,aAAA,IAAIyC,KAAKP,UAAUlC,KAAnB;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACI0C,aAAAA,UAAUR,UAAUlC,KAAX;AAAA,IAClB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AACE,aAAOkC,UAAUlC;AAAAA,EAzBrB;AA2BD;AAKM,SAAS0C,UAAUC,MAAc;AACtC,MAAIC,OAAOD,IAAD,EAAOE,SAAS,WAAtB,GAAoC;AACtC,WAAO3B,KAAK4B,MAAMH,MAAM,CAACI,GAAGC,MAAM;AAChC,UAAID,MAAM;AAAoBC,eAAAA;AAAAA,IAAAA,CADzB;AAAA,EAGR;AAEM9B,SAAAA,KAAK4B,MAAMH,IAAX;AACR;AAED,MAAMM,eAAuC;AAAA,EAE3CC,IAAI;AAAA,EACJC,IAAI;AAAA,EACJC,GAAG;AAAA,EACHC,IAAI;AAAA,EACJC,IAAI;AAAA,EACJC,IAAI;AAAA,EAEJC,IAAI;AAAA,EACJC,GAAG;AAAA,EACHC,UAAU;AAAA,EACVC,QAAQ;AAAA,EAERC,IAAI;AAAA,EACJC,GAAG;AAAA,EACHC,IAAI;AAAA,EACJC,IAAI;AAjBuC;AAoBtC,SAAStD,uBACduD,aACAvE,SAAS,SACTwE,UAAoC,CAAA,GACpC;AACA,MAAIC,UAAuB;AAAA,IACzBlE,OAAOgE,YAAYhE;AAAAA,IACnBmE,MAAMlB,aAAae,YAAYG;AAAAA,EAAAA;AAG7BD,MAAAA,QAAQC,QAAQ,MAAM;AACxBD,cAAUE,uBAAuBJ,YAAYhE,OAAOgE,YAAYG,IAAhC;AAAA,EACjC;AAEM,SAAA,IAAIE,KAAKC,aAAa7E,QAAQ;AAAA,IACnC,GAAGwE;AAAAA,IACHE,MAAMD,QAAQC;AAAAA,IACdI,OAAO;AAAA,EAHF,CAAA,EAIJC,OAAON,QAAQlE,KAJX;AAKR;AAED,SAASoE,uBAAuBpE,OAAemE,MAA2B;AACxE,UAAQA,MAAR;AAAA,IACE,KAAK;AACI,aAAA;AAAA,QACLnE,OAAOA,QAAQ;AAAA,QACfmE,MAAM;AAAA,MAAA;AAAA,IAEV,KAAK;AACI,aAAA;AAAA,QACLnE,OAAOA,QAAQ;AAAA,QACfmE,MAAM;AAAA,MAAA;AAAA,IAEV,KAAK;AACI,aAAA;AAAA,QACLnE,OAAOA,QAAQ;AAAA,QACfmE,MAAM;AAAA,MAAA;AAAA,IAEV,KAAK;AACI,aAAA;AAAA,QACLnE,OAAOA,QAAQ;AAAA,QACfmE,MAAM;AAAA,MAAA;AAAA,IAEV,KAAK;AACI,aAAA;AAAA,QACLnE,OAAOA,QAAQ;AAAA,QACfmE,MAAM;AAAA,MAAA;AAAA,IAEV,KAAK;AACI,aAAA;AAAA,QACLnE,OAAOA,QAAQ;AAAA,QACfmE,MAAM;AAAA,MAAA;AAAA,IAEV,KAAK;AACI,aAAA;AAAA,QACLnE,OAAOA,QAAQ;AAAA,QACfmE,MAAM;AAAA,MAAA;AAAA,IAEV,KAAK;AACI,aAAA;AAAA,QACLnE,OAAOA,QAAQ;AAAA,QACfmE,MAAM;AAAA,MAAA;AAAA,IAEV,KAAK;AACI,aAAA;AAAA,QACLnE,OAAOA,QAAQ;AAAA,QACfmE,MAAM;AAAA,MAAA;AAAA,IAEV;AACQ,YAAA,IAAIpE,MAAO,uBAAsBoE,MAAjC;AAAA,EA/CV;AAiDD;"}
1
+ {"version":3,"file":"Metafield.mjs","sources":["../../src/Metafield.tsx"],"sourcesContent":["import {type ElementType, useMemo, type ComponentPropsWithoutRef} from 'react';\nimport {useShop} from './ShopifyProvider.js';\nimport {Image} from './Image.js';\nimport type {\n MediaImage,\n Page,\n ProductVariant,\n Product,\n GenericFile,\n Video as VideoType,\n Metafield as MetafieldType,\n} from './storefront-api-types.js';\nimport {Video} from './Video.js';\nimport {flattenConnection} from './flatten-connection.js';\nimport type {PartialDeep, JsonValue} from 'type-fest';\n\ninterface BaseProps<ComponentGeneric extends ElementType> {\n /** An object with fields that correspond to the Storefront API's [Metafield object](https://shopify.dev/api/storefront/reference/common-objects/metafield). */\n data: PartialDeep<MetafieldType, {recurseIntoArrays: true}> | null;\n /** An HTML tag or React component to be rendered as the base element wrapper. The default value varies depending on [metafield.type](https://shopify.dev/apps/metafields/types). */\n as?: ComponentGeneric;\n}\n\nexport type MetafieldProps<ComponentGeneric extends ElementType> =\n ComponentPropsWithoutRef<ComponentGeneric> & BaseProps<ComponentGeneric>;\n\n/**\n * The `Metafield` component renders the value of a Storefront\n * API's [Metafield object](https://shopify.dev/api/storefront/reference/common-objects/metafield).\n * Relies on the `locale` property of the `useShop()` hook, so it must be a desendent of `<ShopifyProvider/>`\n *\n * Renders a smart default of the Metafield's `value`. For more information, refer to the [Default output](#default-output) section.\n */\nexport function Metafield<ComponentGeneric extends ElementType>(\n props: MetafieldProps<ComponentGeneric>\n) {\n const {data, as, ...passthroughProps} = props;\n const {locale} = useShop();\n\n const parsedMetafield = useMemo(() => parseMetafield(data), [data]);\n\n if (!parsedMetafield) {\n const noDataPropWarning = `<Metafield/>: nothing was passed to the data prop 'data'. Rendering 'null'`;\n if (__HYDROGEN_DEV__) {\n throw new Error(noDataPropWarning);\n } else {\n console.warn(noDataPropWarning);\n }\n return null;\n }\n\n if (parsedMetafield.value === null || parsedMetafield.value === undefined) {\n const noValueWarning = `<Metafield/>: No metafield value for metafield ${\n parsedMetafield.id ?? parsedMetafield.key\n }. Rendering 'null'`;\n if (__HYDROGEN_DEV__) {\n throw new Error(noValueWarning);\n } else {\n console.warn(noValueWarning);\n }\n return null;\n }\n\n switch (parsedMetafield.type) {\n case 'date': {\n const Wrapper = as ?? 'time';\n return (\n <Wrapper {...passthroughProps}>\n {(parsedMetafield.value as Date).toLocaleDateString(locale)}\n </Wrapper>\n );\n }\n case 'date_time': {\n const Wrapper = as ?? 'time';\n return (\n <Wrapper {...passthroughProps}>\n {(parsedMetafield.value as Date).toLocaleString(locale)}\n </Wrapper>\n );\n }\n case 'weight':\n case 'dimension':\n case 'volume': {\n const Wrapper = as ?? 'span';\n return (\n <Wrapper {...passthroughProps}>\n {getMeasurementAsString(parsedMetafield.value as Measurement, locale)}\n </Wrapper>\n );\n }\n case 'rating': {\n const Wrapper = as ?? 'span';\n return (\n <Wrapper {...passthroughProps}>\n {(parsedMetafield.value as Rating).value}\n </Wrapper>\n );\n }\n case 'single_line_text_field': {\n const Wrapper = as ?? 'span';\n return (\n <Wrapper\n {...passthroughProps}\n dangerouslySetInnerHTML={{__html: parsedMetafield.value as string}}\n />\n );\n }\n case 'multi_line_text_field': {\n const Wrapper = as ?? 'div';\n return (\n <Wrapper\n {...passthroughProps}\n dangerouslySetInnerHTML={{\n __html: (parsedMetafield.value as string).split('\\n').join('<br/>'),\n }}\n />\n );\n }\n case 'url': {\n const protocolLessUrl = new URL(parsedMetafield.value as string);\n return (\n <a\n href={protocolLessUrl.href.replace(protocolLessUrl.protocol, '')}\n {...passthroughProps}\n >\n {parsedMetafield.value as string}\n </a>\n );\n }\n case 'json': {\n const Wrapper = as ?? 'span';\n return (\n <Wrapper {...passthroughProps}>\n {JSON.stringify(parsedMetafield.value)}\n </Wrapper>\n );\n }\n case 'product_reference':\n case 'variant_reference':\n case 'page_reference': {\n const Wrapper = as ?? 'span';\n const ref = parsedMetafield.reference as Page | ProductVariant | Product;\n return (\n <Wrapper {...passthroughProps}>{ref?.title ?? ref?.id ?? ''}</Wrapper>\n );\n }\n case 'list.single_line_text_field': {\n const Wrapper = as ?? 'ul';\n\n const refArray = parsedMetafield.references\n ? (flattenConnection(parsedMetafield.references) as string[])\n : [];\n return (\n <Wrapper {...passthroughProps}>\n {refArray.map((ref, index) => (\n // there's no unique way to identify these strings, so we do our best by combining the string with the index for the key\n // eslint-disable-next-line react/no-array-index-key\n <li key={`${ref ?? ''}-${index}`}>{ref}</li>\n ))}\n </Wrapper>\n );\n }\n case 'file_reference': {\n if (parsedMetafield.reference?.__typename === 'MediaImage') {\n const ref = parsedMetafield.reference as MediaImage;\n return ref.image ? (\n <Image data={ref.image} {...passthroughProps} />\n ) : null;\n } else if (parsedMetafield.reference?.__typename === 'GenericFile') {\n const ref = parsedMetafield.reference as GenericFile;\n return ref.previewImage ? (\n <a href={parsedMetafield.reference?.url ?? ''} {...passthroughProps}>\n <Image data={ref.previewImage} />\n </a>\n ) : null;\n } else if (parsedMetafield.reference?.__typename === 'Video') {\n const ref = parsedMetafield.reference as VideoType;\n return <Video {...passthroughProps} data={ref} />;\n }\n }\n }\n\n const Wrapper = as ?? 'span';\n return (\n <Wrapper {...passthroughProps}>{parsedMetafield.value?.toString()}</Wrapper>\n );\n}\n\n/**\n * The `parseMetafield` utility transforms a [Metafield](https://shopify.dev/api/storefront/reference/common-objects/Metafield)\n * into a new object whose `values` have been parsed according to the metafield `type`.\n * If the metafield is `null`, then it returns `null` back.\n *\n * Note that `parseMetafield()` will have a breaking change in a future version; it will change to behave like `metafieldParser()`.\n */\nexport function parseMetafield(\n /** A [Metafield](https://shopify.dev/api/storefront/reference/common-objects/Metafield) or null */\n metafield: PartialDeep<MetafieldType, {recurseIntoArrays: true}> | null\n): PartialDeep<ParsedMetafield, {recurseIntoArrays: true}> | null {\n if (__HYDROGEN_DEV__) {\n console.info(\n `'parseMetafield()' will have a breaking change in a future version; its behavior will match that of 'metafieldParser()'`\n );\n }\n\n if (!metafield) {\n if (__HYDROGEN_DEV__) {\n console.warn(\n `'parseMetafield' was not passed any value for the 'metafield' argument`\n );\n }\n return null;\n }\n if (\n __HYDROGEN_DEV__ &&\n (metafield.value === null || metafield.value === undefined)\n ) {\n console.warn(\n `'parseMetafield()' was passed ${metafield.value} for 'metafield.value'`\n );\n }\n\n return {\n ...metafield,\n value: parseMetafieldValue(metafield),\n };\n}\n\n/**\n * The `parseMetafieldValue` function parses a [Metafield](https://shopify.dev/api/storefront/reference/common-objects/metafield)'s `value` from a string into a sensible type corresponding to the [Metafield](https://shopify.dev/api/storefront/reference/common-objects/metafield)'s `type`.\n * @deprecated `parseMetafieldValue()` is unsupported and will be removed in a future version.\n */\nexport function parseMetafieldValue(\n metafield: PartialDeep<MetafieldType, {recurseIntoArrays: true}> | null\n): ParsedMetafield['value'] {\n if (__HYDROGEN_DEV__) {\n console.info(`'parseMetafieldValue()' will be removed in a future version`);\n }\n\n if (!metafield) {\n return null;\n }\n\n if (metafield.value === null || metafield.value === undefined) {\n if (__HYDROGEN_DEV__) {\n console.warn(\n `'parseMetafieldValue()' was passed ${metafield.value} for 'metafield.value'`\n );\n }\n return metafield.value;\n }\n\n switch (metafield.type) {\n case 'boolean':\n return metafield.value === 'true';\n case 'number_integer':\n return parseInt(metafield.value);\n case 'number_decimal':\n return parseFloat(metafield.value);\n case 'date':\n case 'date_time':\n return new Date(metafield.value);\n case 'json':\n case 'weight':\n case 'dimension':\n case 'volume':\n case 'rating':\n return parseJSON(metafield.value);\n case 'color':\n case 'single_line_text_field':\n case 'multi_line_text_field':\n case 'product_reference':\n case 'page_reference':\n case 'variant_reference':\n case 'file_reference':\n case 'url':\n default:\n return metafield.value;\n }\n}\n\n/**\n * Parses a JSON string while preventing prototype injection attacks.\n */\nexport function parseJSON(json: string) {\n if (String(json).includes('__proto__')) {\n return JSON.parse(json, (k, v) => {\n if (k !== '__proto__') return v;\n });\n }\n\n return JSON.parse(json);\n}\n\nconst UNIT_MAPPING: Record<string, string> = {\n // Dimension\n mm: 'millimeter',\n cm: 'centimeter',\n m: 'meter',\n in: 'inch',\n ft: 'foot',\n yd: 'yard',\n // Volume\n ml: 'milliliter',\n l: 'liter',\n us_fl_oz: 'fluid-ounce',\n us_gal: 'gallon',\n // Weight\n kg: 'kilogram',\n g: 'gram',\n lb: 'pound',\n oz: 'ounce',\n};\n\nexport function getMeasurementAsString(\n measurement: Measurement,\n locale = 'en-us',\n options: Intl.NumberFormatOptions = {}\n) {\n let measure: Measurement = {\n value: measurement.value,\n unit: UNIT_MAPPING[measurement.unit],\n };\n\n if (measure.unit == null) {\n measure = convertToSupportedUnit(measurement.value, measurement.unit);\n }\n\n return new Intl.NumberFormat(locale, {\n ...options,\n unit: measure.unit,\n style: 'unit',\n }).format(measure.value);\n}\n\nfunction convertToSupportedUnit(value: number, unit: string): Measurement {\n switch (unit) {\n case 'cl':\n return {\n value: value / 1000,\n unit: 'liter',\n };\n case 'm3':\n return {\n value: value * 1000,\n unit: 'liter',\n };\n case 'us_pt':\n return {\n value: value * 0.125,\n unit: 'gallon',\n };\n case 'us_qt':\n return {\n value: value * 0.5,\n unit: 'gallon',\n };\n case 'us_oz':\n return {\n value: value / 128,\n unit: 'gallon',\n };\n case 'imp_pt':\n return {\n value: value / 6.661, // approximate conversion\n unit: 'gallon',\n };\n case 'imp_qt':\n return {\n value: value / 3.331, // approximate conversion\n unit: 'gallon',\n };\n case 'imp_gal':\n return {\n value: value / 1.201, // approximate conversion\n unit: 'gallon',\n };\n case 'imp_fl_oz':\n return {\n value: value * 0.96076, // approximate conversion\n unit: 'fluid-ounce',\n };\n default:\n throw new Error(`Unit not supported: ${unit}`);\n }\n}\n\ntype ParsedMetafield = Omit<\n PartialDeep<MetafieldType, {recurseIntoArrays: true}>,\n 'value'\n> & {\n value?: string | number | boolean | JsonValue | Date | Rating | Measurement;\n};\n\nexport interface Rating {\n value: number;\n scale_min: number;\n scale_max: number;\n}\n\ninterface Measurement {\n unit: string;\n value: number;\n}\n"],"names":["Metafield","props","data","as","passthroughProps","locale","useShop","parsedMetafield","useMemo","parseMetafield","noDataPropWarning","Error","value","undefined","noValueWarning","id","key","type","Wrapper","toLocaleDateString","toLocaleString","getMeasurementAsString","__html","split","join","protocolLessUrl","URL","href","replace","protocol","JSON","stringify","ref","reference","title","refArray","references","flattenConnection","map","index","__typename","image","_jsx","previewImage","url","toString","metafield","console","info","warn","parseMetafieldValue","parseInt","parseFloat","Date","parseJSON","json","String","includes","parse","k","v","UNIT_MAPPING","mm","cm","m","in","ft","yd","ml","l","us_fl_oz","us_gal","kg","g","lb","oz","measurement","options","measure","unit","convertToSupportedUnit","Intl","NumberFormat","style","format"],"mappings":"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"}
File without changes