@shopify/hydrogen-react 2022.10.0 → 2022.10.2

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 (446) hide show
  1. package/dist/dev/AddToCartButton.js +70 -0
  2. package/dist/dev/AddToCartButton.js.map +1 -0
  3. package/dist/dev/AddToCartButton.mjs +70 -0
  4. package/dist/dev/AddToCartButton.mjs.map +1 -0
  5. package/dist/dev/BaseButton.js +31 -0
  6. package/dist/dev/BaseButton.js.map +1 -0
  7. package/dist/dev/BaseButton.mjs +31 -0
  8. package/dist/dev/BaseButton.mjs.map +1 -0
  9. package/dist/dev/BuyNowButton.js +45 -0
  10. package/dist/dev/BuyNowButton.js.map +1 -0
  11. package/dist/dev/BuyNowButton.mjs +45 -0
  12. package/dist/dev/BuyNowButton.mjs.map +1 -0
  13. package/dist/dev/CartCheckoutButton.js +30 -0
  14. package/dist/dev/CartCheckoutButton.js.map +1 -0
  15. package/dist/dev/CartCheckoutButton.mjs +30 -0
  16. package/dist/dev/CartCheckoutButton.mjs.map +1 -0
  17. package/dist/dev/CartProvider.js +35 -35
  18. package/dist/dev/CartProvider.js.map +1 -1
  19. package/dist/dev/{CartProvider.cjs → CartProvider.mjs} +36 -36
  20. package/dist/dev/{CartProvider.cjs.map → CartProvider.mjs.map} +1 -1
  21. package/dist/dev/ExternalVideo.js +5 -5
  22. package/dist/dev/ExternalVideo.js.map +1 -1
  23. package/dist/dev/{ExternalVideo.cjs → ExternalVideo.mjs} +6 -6
  24. package/dist/{prod/ExternalVideo.cjs.map → dev/ExternalVideo.mjs.map} +1 -1
  25. package/dist/dev/Image.js +12 -12
  26. package/dist/dev/Image.js.map +1 -1
  27. package/dist/dev/{Image.cjs → Image.mjs} +13 -13
  28. package/dist/dev/{Image.cjs.map → Image.mjs.map} +1 -1
  29. package/dist/dev/MediaFile.js +12 -12
  30. package/dist/dev/MediaFile.js.map +1 -1
  31. package/dist/dev/{MediaFile.cjs → MediaFile.mjs} +13 -13
  32. package/dist/dev/MediaFile.mjs.map +1 -0
  33. package/dist/dev/Metafield.js +38 -32
  34. package/dist/dev/Metafield.js.map +1 -1
  35. package/dist/dev/{Metafield.cjs → Metafield.mjs} +39 -33
  36. package/dist/dev/Metafield.mjs.map +1 -0
  37. package/dist/dev/ModelViewer.js +11 -11
  38. package/dist/dev/ModelViewer.js.map +1 -1
  39. package/dist/dev/{ModelViewer.cjs → ModelViewer.mjs} +12 -12
  40. package/dist/dev/{ModelViewer.cjs.map → ModelViewer.mjs.map} +1 -1
  41. package/dist/dev/Money.js +8 -8
  42. package/dist/dev/Money.js.map +1 -1
  43. package/dist/{prod/Money.cjs → dev/Money.mjs} +9 -9
  44. package/dist/dev/{Money.cjs.map → Money.mjs.map} +1 -1
  45. package/dist/dev/ProductPrice.js +9 -9
  46. package/dist/dev/ProductPrice.js.map +1 -1
  47. package/dist/{prod/ProductPrice.cjs → dev/ProductPrice.mjs} +10 -10
  48. package/dist/dev/ProductPrice.mjs.map +1 -0
  49. package/dist/dev/ProductProvider.js +25 -25
  50. package/dist/dev/ProductProvider.js.map +1 -1
  51. package/dist/{prod/ProductProvider.cjs → dev/ProductProvider.mjs} +26 -26
  52. package/dist/dev/{ProductProvider.cjs.map → ProductProvider.mjs.map} +1 -1
  53. package/dist/dev/ShopPayButton.js +13 -13
  54. package/dist/dev/ShopPayButton.js.map +1 -1
  55. package/dist/{prod/ShopPayButton.cjs → dev/ShopPayButton.mjs} +14 -14
  56. package/dist/{prod/ShopPayButton.cjs.map → dev/ShopPayButton.mjs.map} +1 -1
  57. package/dist/dev/ShopifyProvider.js +14 -14
  58. package/dist/dev/ShopifyProvider.js.map +1 -1
  59. package/dist/dev/ShopifyProvider.mjs +46 -0
  60. package/dist/dev/{ShopifyProvider.cjs.map → ShopifyProvider.mjs.map} +1 -1
  61. package/dist/dev/Video.js +9 -9
  62. package/dist/dev/Video.js.map +1 -1
  63. package/dist/dev/{Video.cjs → Video.mjs} +10 -10
  64. package/dist/dev/{Video.cjs.map → Video.mjs.map} +1 -1
  65. package/dist/dev/_virtual/index.js +3 -3
  66. package/dist/dev/_virtual/index.js.map +1 -1
  67. package/dist/dev/_virtual/index.mjs +5 -0
  68. package/dist/dev/_virtual/index.mjs.map +1 -0
  69. package/dist/dev/_virtual/use-sync-external-store-shim.development.js +3 -3
  70. package/dist/dev/_virtual/use-sync-external-store-shim.development.js.map +1 -1
  71. package/dist/dev/_virtual/use-sync-external-store-shim.development.mjs +5 -0
  72. package/dist/dev/_virtual/use-sync-external-store-shim.development.mjs.map +1 -0
  73. package/dist/dev/_virtual/use-sync-external-store-shim.production.min.js +3 -3
  74. package/dist/dev/_virtual/use-sync-external-store-shim.production.min.js.map +1 -1
  75. package/dist/dev/_virtual/use-sync-external-store-shim.production.min.mjs +5 -0
  76. package/dist/dev/_virtual/use-sync-external-store-shim.production.min.mjs.map +1 -0
  77. package/dist/dev/_virtual/with-selector.development.js +3 -3
  78. package/dist/dev/_virtual/with-selector.development.js.map +1 -1
  79. package/dist/dev/_virtual/with-selector.development.mjs +5 -0
  80. package/dist/dev/_virtual/with-selector.development.mjs.map +1 -0
  81. package/dist/dev/_virtual/with-selector.js +3 -3
  82. package/dist/dev/_virtual/with-selector.js.map +1 -1
  83. package/dist/dev/_virtual/with-selector.mjs +5 -0
  84. package/dist/dev/_virtual/with-selector.mjs.map +1 -0
  85. package/dist/dev/_virtual/with-selector.production.min.js +3 -3
  86. package/dist/dev/_virtual/with-selector.production.min.js.map +1 -1
  87. package/dist/dev/_virtual/with-selector.production.min.mjs +5 -0
  88. package/dist/dev/_virtual/with-selector.production.min.mjs.map +1 -0
  89. package/dist/dev/cart-constants.js +9 -9
  90. package/dist/dev/cart-constants.js.map +1 -1
  91. package/dist/dev/cart-constants.mjs +17 -0
  92. package/dist/dev/{cart-constants.cjs.map → cart-constants.mjs.map} +1 -1
  93. package/dist/dev/cart-hooks.js +15 -15
  94. package/dist/dev/cart-hooks.js.map +1 -1
  95. package/dist/dev/cart-hooks.mjs +48 -0
  96. package/dist/dev/{cart-hooks.cjs.map → cart-hooks.mjs.map} +1 -1
  97. package/dist/dev/cart-queries.js +11 -11
  98. package/dist/dev/cart-queries.js.map +1 -1
  99. package/dist/{prod/cart-queries.cjs → dev/cart-queries.mjs} +12 -12
  100. package/dist/dev/{cart-queries.cjs.map → cart-queries.mjs.map} +1 -1
  101. package/dist/dev/flatten-connection.js +3 -3
  102. package/dist/dev/flatten-connection.js.map +1 -1
  103. package/dist/dev/{flatten-connection.cjs → flatten-connection.mjs} +4 -4
  104. package/dist/dev/{flatten-connection.cjs.map → flatten-connection.mjs.map} +1 -1
  105. package/dist/dev/image-size.js +6 -6
  106. package/dist/dev/image-size.js.map +1 -1
  107. package/dist/dev/{image-size.cjs → image-size.mjs} +7 -7
  108. package/dist/{prod/image-size.cjs.map → dev/image-size.mjs.map} +1 -1
  109. package/dist/dev/index.js +45 -37
  110. package/dist/dev/index.js.map +1 -1
  111. package/dist/dev/index.mjs +46 -0
  112. package/dist/dev/index.mjs.map +1 -0
  113. package/dist/dev/load-script.js +7 -7
  114. package/dist/dev/load-script.js.map +1 -1
  115. package/dist/{prod/load-script.cjs → dev/load-script.mjs} +8 -8
  116. package/dist/dev/{load-script.cjs.map → load-script.mjs.map} +1 -1
  117. package/dist/dev/metafield-parser.js +103 -0
  118. package/dist/dev/metafield-parser.js.map +1 -0
  119. package/dist/dev/metafield-parser.mjs +103 -0
  120. package/dist/dev/metafield-parser.mjs.map +1 -0
  121. package/dist/dev/node_modules/@xstate/fsm/es/index.js +34 -35
  122. package/dist/dev/node_modules/@xstate/fsm/es/index.js.map +1 -1
  123. package/dist/{prod/node_modules/@xstate/fsm/es/index.cjs → dev/node_modules/@xstate/fsm/es/index.mjs} +36 -35
  124. package/dist/dev/node_modules/@xstate/fsm/es/index.mjs.map +1 -0
  125. package/dist/dev/node_modules/@xstate/react/es/fsm.js +21 -21
  126. package/dist/dev/node_modules/@xstate/react/es/fsm.js.map +1 -1
  127. package/dist/{prod/node_modules/@xstate/react/es/fsm.cjs → dev/node_modules/@xstate/react/es/fsm.mjs} +22 -22
  128. package/dist/dev/node_modules/@xstate/react/es/{fsm.cjs.map → fsm.mjs.map} +1 -1
  129. package/dist/dev/node_modules/@xstate/react/es/useConstant.js +23 -5
  130. package/dist/dev/node_modules/@xstate/react/es/useConstant.js.map +1 -1
  131. package/dist/dev/node_modules/@xstate/react/es/useConstant.mjs +12 -0
  132. package/dist/dev/node_modules/@xstate/react/es/useConstant.mjs.map +1 -0
  133. package/dist/dev/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js +4 -5
  134. package/dist/dev/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js.map +1 -1
  135. package/dist/dev/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.mjs +6 -0
  136. package/dist/dev/node_modules/use-isomorphic-layout-effect/dist/{use-isomorphic-layout-effect.browser.esm.cjs.map → use-isomorphic-layout-effect.browser.esm.mjs.map} +1 -1
  137. package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +13 -11
  138. package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js.map +1 -1
  139. package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/{with-selector.development.cjs → with-selector.development.mjs} +12 -14
  140. package/dist/{prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.cjs.map → dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs.map} +1 -1
  141. package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js +12 -10
  142. package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js.map +1 -1
  143. package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/{with-selector.production.min.cjs → with-selector.production.min.mjs} +11 -13
  144. package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.mjs.map +1 -0
  145. package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +11 -9
  146. package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +1 -1
  147. package/dist/dev/node_modules/use-sync-external-store/cjs/{use-sync-external-store-shim.development.cjs → use-sync-external-store-shim.development.mjs} +10 -12
  148. package/dist/{prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.cjs.map → dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs.map} +1 -1
  149. package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js +11 -9
  150. package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js.map +1 -1
  151. package/dist/{prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.cjs → dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.mjs} +10 -12
  152. package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.mjs.map +1 -0
  153. package/dist/dev/node_modules/use-sync-external-store/shim/index.js +12 -12
  154. package/dist/dev/node_modules/use-sync-external-store/shim/index.js.map +1 -1
  155. package/dist/dev/node_modules/use-sync-external-store/shim/index.mjs +21 -0
  156. package/dist/dev/node_modules/use-sync-external-store/shim/{index.cjs.map → index.mjs.map} +1 -1
  157. package/dist/dev/node_modules/use-sync-external-store/shim/with-selector.js +7 -6
  158. package/dist/dev/node_modules/use-sync-external-store/shim/with-selector.js.map +1 -1
  159. package/dist/dev/node_modules/use-sync-external-store/shim/with-selector.mjs +11 -0
  160. package/dist/dev/node_modules/use-sync-external-store/shim/{with-selector.cjs.map → with-selector.mjs.map} +1 -1
  161. package/dist/dev/storefront-api-constants.js +3 -3
  162. package/dist/dev/storefront-api-constants.js.map +1 -1
  163. package/dist/dev/storefront-api-constants.mjs +5 -0
  164. package/dist/dev/storefront-api-constants.mjs.map +1 -0
  165. package/dist/dev/storefront-client.js +6 -6
  166. package/dist/dev/storefront-client.js.map +1 -1
  167. package/dist/dev/{storefront-client.cjs → storefront-client.mjs} +7 -7
  168. package/dist/dev/storefront-client.mjs.map +1 -0
  169. package/dist/dev/useCartAPIStateMachine.js +20 -20
  170. package/dist/dev/useCartAPIStateMachine.js.map +1 -1
  171. package/dist/{prod/useCartAPIStateMachine.cjs → dev/useCartAPIStateMachine.mjs} +21 -21
  172. package/dist/dev/{useCartAPIStateMachine.cjs.map → useCartAPIStateMachine.mjs.map} +1 -1
  173. package/dist/dev/useCartActions.js +26 -26
  174. package/dist/dev/useCartActions.js.map +1 -1
  175. package/dist/{prod/useCartActions.cjs → dev/useCartActions.mjs} +27 -27
  176. package/dist/dev/{useCartActions.cjs.map → useCartActions.mjs.map} +1 -1
  177. package/dist/dev/useMoney.js +10 -10
  178. package/dist/dev/useMoney.js.map +1 -1
  179. package/dist/{prod/useMoney.cjs → dev/useMoney.mjs} +11 -11
  180. package/dist/dev/{useMoney.cjs.map → useMoney.mjs.map} +1 -1
  181. package/dist/prod/AddToCartButton.js +70 -0
  182. package/dist/prod/AddToCartButton.js.map +1 -0
  183. package/dist/prod/AddToCartButton.mjs +70 -0
  184. package/dist/prod/AddToCartButton.mjs.map +1 -0
  185. package/dist/prod/BaseButton.js +31 -0
  186. package/dist/prod/BaseButton.js.map +1 -0
  187. package/dist/prod/BaseButton.mjs +31 -0
  188. package/dist/prod/BaseButton.mjs.map +1 -0
  189. package/dist/prod/BuyNowButton.js +45 -0
  190. package/dist/prod/BuyNowButton.js.map +1 -0
  191. package/dist/prod/BuyNowButton.mjs +45 -0
  192. package/dist/prod/BuyNowButton.mjs.map +1 -0
  193. package/dist/prod/CartCheckoutButton.js +30 -0
  194. package/dist/prod/CartCheckoutButton.js.map +1 -0
  195. package/dist/prod/CartCheckoutButton.mjs +30 -0
  196. package/dist/prod/CartCheckoutButton.mjs.map +1 -0
  197. package/dist/prod/CartProvider.js +35 -35
  198. package/dist/prod/CartProvider.js.map +1 -1
  199. package/dist/prod/{CartProvider.cjs → CartProvider.mjs} +36 -36
  200. package/dist/prod/{CartProvider.cjs.map → CartProvider.mjs.map} +1 -1
  201. package/dist/prod/ExternalVideo.js +5 -5
  202. package/dist/prod/ExternalVideo.js.map +1 -1
  203. package/dist/prod/{ExternalVideo.cjs → ExternalVideo.mjs} +6 -6
  204. package/dist/{dev/ExternalVideo.cjs.map → prod/ExternalVideo.mjs.map} +1 -1
  205. package/dist/prod/Image.js +12 -12
  206. package/dist/prod/Image.js.map +1 -1
  207. package/dist/prod/{Image.cjs → Image.mjs} +13 -13
  208. package/dist/prod/{Image.cjs.map → Image.mjs.map} +1 -1
  209. package/dist/prod/MediaFile.js +12 -12
  210. package/dist/prod/MediaFile.js.map +1 -1
  211. package/dist/prod/{MediaFile.cjs → MediaFile.mjs} +13 -13
  212. package/dist/prod/MediaFile.mjs.map +1 -0
  213. package/dist/prod/Metafield.js +32 -32
  214. package/dist/prod/Metafield.js.map +1 -1
  215. package/dist/prod/{Metafield.cjs → Metafield.mjs} +33 -33
  216. package/dist/prod/Metafield.mjs.map +1 -0
  217. package/dist/prod/ModelViewer.js +11 -11
  218. package/dist/prod/ModelViewer.js.map +1 -1
  219. package/dist/prod/{ModelViewer.cjs → ModelViewer.mjs} +12 -12
  220. package/dist/prod/{ModelViewer.cjs.map → ModelViewer.mjs.map} +1 -1
  221. package/dist/prod/Money.js +8 -8
  222. package/dist/prod/Money.js.map +1 -1
  223. package/dist/{dev/Money.cjs → prod/Money.mjs} +9 -9
  224. package/dist/prod/{Money.cjs.map → Money.mjs.map} +1 -1
  225. package/dist/prod/ProductPrice.js +9 -9
  226. package/dist/prod/ProductPrice.js.map +1 -1
  227. package/dist/{dev/ProductPrice.cjs → prod/ProductPrice.mjs} +10 -10
  228. package/dist/prod/ProductPrice.mjs.map +1 -0
  229. package/dist/prod/ProductProvider.js +25 -25
  230. package/dist/prod/ProductProvider.js.map +1 -1
  231. package/dist/{dev/ProductProvider.cjs → prod/ProductProvider.mjs} +26 -26
  232. package/dist/prod/{ProductProvider.cjs.map → ProductProvider.mjs.map} +1 -1
  233. package/dist/prod/ShopPayButton.js +13 -13
  234. package/dist/prod/ShopPayButton.js.map +1 -1
  235. package/dist/{dev/ShopPayButton.cjs → prod/ShopPayButton.mjs} +14 -14
  236. package/dist/{dev/ShopPayButton.cjs.map → prod/ShopPayButton.mjs.map} +1 -1
  237. package/dist/prod/ShopifyProvider.js +14 -14
  238. package/dist/prod/ShopifyProvider.js.map +1 -1
  239. package/dist/prod/ShopifyProvider.mjs +46 -0
  240. package/dist/prod/{ShopifyProvider.cjs.map → ShopifyProvider.mjs.map} +1 -1
  241. package/dist/prod/Video.js +9 -9
  242. package/dist/prod/Video.js.map +1 -1
  243. package/dist/prod/{Video.cjs → Video.mjs} +10 -10
  244. package/dist/prod/{Video.cjs.map → Video.mjs.map} +1 -1
  245. package/dist/prod/_virtual/index.js +3 -3
  246. package/dist/prod/_virtual/index.js.map +1 -1
  247. package/dist/prod/_virtual/index.mjs +5 -0
  248. package/dist/prod/_virtual/index.mjs.map +1 -0
  249. package/dist/prod/_virtual/use-sync-external-store-shim.development.js +3 -3
  250. package/dist/prod/_virtual/use-sync-external-store-shim.development.js.map +1 -1
  251. package/dist/prod/_virtual/use-sync-external-store-shim.development.mjs +5 -0
  252. package/dist/prod/_virtual/use-sync-external-store-shim.development.mjs.map +1 -0
  253. package/dist/prod/_virtual/use-sync-external-store-shim.production.min.js +3 -3
  254. package/dist/prod/_virtual/use-sync-external-store-shim.production.min.js.map +1 -1
  255. package/dist/prod/_virtual/use-sync-external-store-shim.production.min.mjs +5 -0
  256. package/dist/prod/_virtual/use-sync-external-store-shim.production.min.mjs.map +1 -0
  257. package/dist/prod/_virtual/with-selector.development.js +3 -3
  258. package/dist/prod/_virtual/with-selector.development.js.map +1 -1
  259. package/dist/prod/_virtual/with-selector.development.mjs +5 -0
  260. package/dist/prod/_virtual/with-selector.development.mjs.map +1 -0
  261. package/dist/prod/_virtual/with-selector.js +3 -3
  262. package/dist/prod/_virtual/with-selector.js.map +1 -1
  263. package/dist/prod/_virtual/with-selector.mjs +5 -0
  264. package/dist/prod/_virtual/with-selector.mjs.map +1 -0
  265. package/dist/prod/_virtual/with-selector.production.min.js +3 -3
  266. package/dist/prod/_virtual/with-selector.production.min.js.map +1 -1
  267. package/dist/prod/_virtual/with-selector.production.min.mjs +5 -0
  268. package/dist/prod/_virtual/with-selector.production.min.mjs.map +1 -0
  269. package/dist/prod/cart-constants.js +9 -9
  270. package/dist/prod/cart-constants.js.map +1 -1
  271. package/dist/prod/cart-constants.mjs +17 -0
  272. package/dist/prod/{cart-constants.cjs.map → cart-constants.mjs.map} +1 -1
  273. package/dist/prod/cart-hooks.js +15 -15
  274. package/dist/prod/cart-hooks.js.map +1 -1
  275. package/dist/prod/cart-hooks.mjs +48 -0
  276. package/dist/prod/{cart-hooks.cjs.map → cart-hooks.mjs.map} +1 -1
  277. package/dist/prod/cart-queries.js +11 -11
  278. package/dist/prod/cart-queries.js.map +1 -1
  279. package/dist/{dev/cart-queries.cjs → prod/cart-queries.mjs} +12 -12
  280. package/dist/prod/{cart-queries.cjs.map → cart-queries.mjs.map} +1 -1
  281. package/dist/prod/flatten-connection.js +3 -3
  282. package/dist/prod/flatten-connection.js.map +1 -1
  283. package/dist/prod/{flatten-connection.cjs → flatten-connection.mjs} +4 -4
  284. package/dist/prod/{flatten-connection.cjs.map → flatten-connection.mjs.map} +1 -1
  285. package/dist/prod/image-size.js +6 -6
  286. package/dist/prod/image-size.js.map +1 -1
  287. package/dist/prod/{image-size.cjs → image-size.mjs} +7 -7
  288. package/dist/{dev/image-size.cjs.map → prod/image-size.mjs.map} +1 -1
  289. package/dist/prod/index.js +45 -37
  290. package/dist/prod/index.js.map +1 -1
  291. package/dist/prod/index.mjs +46 -0
  292. package/dist/prod/index.mjs.map +1 -0
  293. package/dist/prod/load-script.js +7 -7
  294. package/dist/prod/load-script.js.map +1 -1
  295. package/dist/{dev/load-script.cjs → prod/load-script.mjs} +8 -8
  296. package/dist/prod/{load-script.cjs.map → load-script.mjs.map} +1 -1
  297. package/dist/prod/metafield-parser.js +114 -0
  298. package/dist/prod/metafield-parser.js.map +1 -0
  299. package/dist/prod/metafield-parser.mjs +114 -0
  300. package/dist/prod/metafield-parser.mjs.map +1 -0
  301. package/dist/prod/node_modules/@xstate/fsm/es/index.js +34 -35
  302. package/dist/prod/node_modules/@xstate/fsm/es/index.js.map +1 -1
  303. package/dist/{dev/node_modules/@xstate/fsm/es/index.cjs → prod/node_modules/@xstate/fsm/es/index.mjs} +36 -35
  304. package/dist/prod/node_modules/@xstate/fsm/es/index.mjs.map +1 -0
  305. package/dist/prod/node_modules/@xstate/react/es/fsm.js +21 -21
  306. package/dist/prod/node_modules/@xstate/react/es/fsm.js.map +1 -1
  307. package/dist/{dev/node_modules/@xstate/react/es/fsm.cjs → prod/node_modules/@xstate/react/es/fsm.mjs} +22 -22
  308. package/dist/prod/node_modules/@xstate/react/es/{fsm.cjs.map → fsm.mjs.map} +1 -1
  309. package/dist/prod/node_modules/@xstate/react/es/useConstant.js +23 -5
  310. package/dist/prod/node_modules/@xstate/react/es/useConstant.js.map +1 -1
  311. package/dist/prod/node_modules/@xstate/react/es/useConstant.mjs +12 -0
  312. package/dist/prod/node_modules/@xstate/react/es/useConstant.mjs.map +1 -0
  313. package/dist/prod/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js +4 -5
  314. package/dist/prod/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js.map +1 -1
  315. package/dist/prod/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.mjs +6 -0
  316. package/dist/prod/node_modules/use-isomorphic-layout-effect/dist/{use-isomorphic-layout-effect.browser.esm.cjs.map → use-isomorphic-layout-effect.browser.esm.mjs.map} +1 -1
  317. package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +13 -11
  318. package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js.map +1 -1
  319. package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/{with-selector.development.cjs → with-selector.development.mjs} +12 -14
  320. package/dist/{dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.cjs.map → prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs.map} +1 -1
  321. package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js +12 -10
  322. package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js.map +1 -1
  323. package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/{with-selector.production.min.cjs → with-selector.production.min.mjs} +11 -13
  324. package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.mjs.map +1 -0
  325. package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +11 -9
  326. package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +1 -1
  327. package/dist/prod/node_modules/use-sync-external-store/cjs/{use-sync-external-store-shim.development.cjs → use-sync-external-store-shim.development.mjs} +10 -12
  328. package/dist/{dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.cjs.map → prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs.map} +1 -1
  329. package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js +11 -9
  330. package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js.map +1 -1
  331. package/dist/{dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.cjs → prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.mjs} +10 -12
  332. package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.mjs.map +1 -0
  333. package/dist/prod/node_modules/use-sync-external-store/shim/index.js +12 -12
  334. package/dist/prod/node_modules/use-sync-external-store/shim/index.js.map +1 -1
  335. package/dist/prod/node_modules/use-sync-external-store/shim/index.mjs +21 -0
  336. package/dist/prod/node_modules/use-sync-external-store/shim/{index.cjs.map → index.mjs.map} +1 -1
  337. package/dist/prod/node_modules/use-sync-external-store/shim/with-selector.js +7 -6
  338. package/dist/prod/node_modules/use-sync-external-store/shim/with-selector.js.map +1 -1
  339. package/dist/prod/node_modules/use-sync-external-store/shim/with-selector.mjs +11 -0
  340. package/dist/prod/node_modules/use-sync-external-store/shim/{with-selector.cjs.map → with-selector.mjs.map} +1 -1
  341. package/dist/prod/storefront-api-constants.js +3 -3
  342. package/dist/prod/storefront-api-constants.js.map +1 -1
  343. package/dist/prod/storefront-api-constants.mjs +5 -0
  344. package/dist/prod/storefront-api-constants.mjs.map +1 -0
  345. package/dist/prod/storefront-client.js +6 -6
  346. package/dist/prod/storefront-client.js.map +1 -1
  347. package/dist/prod/{storefront-client.cjs → storefront-client.mjs} +7 -7
  348. package/dist/prod/storefront-client.mjs.map +1 -0
  349. package/dist/prod/useCartAPIStateMachine.js +20 -20
  350. package/dist/prod/useCartAPIStateMachine.js.map +1 -1
  351. package/dist/{dev/useCartAPIStateMachine.cjs → prod/useCartAPIStateMachine.mjs} +21 -21
  352. package/dist/prod/{useCartAPIStateMachine.cjs.map → useCartAPIStateMachine.mjs.map} +1 -1
  353. package/dist/prod/useCartActions.js +26 -26
  354. package/dist/prod/useCartActions.js.map +1 -1
  355. package/dist/{dev/useCartActions.cjs → prod/useCartActions.mjs} +27 -27
  356. package/dist/prod/{useCartActions.cjs.map → useCartActions.mjs.map} +1 -1
  357. package/dist/prod/useMoney.js +10 -10
  358. package/dist/prod/useMoney.js.map +1 -1
  359. package/dist/{dev/useMoney.cjs → prod/useMoney.mjs} +11 -11
  360. package/dist/prod/{useMoney.cjs.map → useMoney.mjs.map} +1 -1
  361. package/dist/types/AddToCartButton.d.ts +22 -0
  362. package/dist/types/BaseButton.d.ts +15 -0
  363. package/dist/types/BuyNowButton.d.ts +15 -0
  364. package/dist/types/CartCheckoutButton.d.ts +12 -0
  365. package/dist/types/CartCost.d.ts +13 -0
  366. package/dist/types/MediaFile.d.ts +3 -1
  367. package/dist/types/Metafield.d.ts +3 -0
  368. package/dist/types/ProductPrice.d.ts +1 -2
  369. package/dist/types/index.d.cts +4 -0
  370. package/dist/types/index.d.ts +4 -0
  371. package/dist/types/metafield-parser.d.ts +222 -0
  372. package/dist/umd/hydrogen-react.dev.js +483 -204
  373. package/dist/umd/hydrogen-react.dev.js.map +1 -1
  374. package/dist/umd/hydrogen-react.prod.js +17 -17
  375. package/dist/umd/hydrogen-react.prod.js.map +1 -1
  376. package/package.json +25 -17
  377. package/dist/dev/MediaFile.cjs.map +0 -1
  378. package/dist/dev/Metafield.cjs.map +0 -1
  379. package/dist/dev/ProductPrice.cjs.map +0 -1
  380. package/dist/dev/ShopifyProvider.cjs +0 -46
  381. package/dist/dev/_virtual/index.cjs +0 -5
  382. package/dist/dev/_virtual/index.cjs.map +0 -1
  383. package/dist/dev/_virtual/use-sync-external-store-shim.development.cjs +0 -5
  384. package/dist/dev/_virtual/use-sync-external-store-shim.development.cjs.map +0 -1
  385. package/dist/dev/_virtual/use-sync-external-store-shim.production.min.cjs +0 -5
  386. package/dist/dev/_virtual/use-sync-external-store-shim.production.min.cjs.map +0 -1
  387. package/dist/dev/_virtual/with-selector.cjs +0 -5
  388. package/dist/dev/_virtual/with-selector.cjs.map +0 -1
  389. package/dist/dev/_virtual/with-selector.development.cjs +0 -5
  390. package/dist/dev/_virtual/with-selector.development.cjs.map +0 -1
  391. package/dist/dev/_virtual/with-selector.production.min.cjs +0 -5
  392. package/dist/dev/_virtual/with-selector.production.min.cjs.map +0 -1
  393. package/dist/dev/cart-constants.cjs +0 -17
  394. package/dist/dev/cart-hooks.cjs +0 -48
  395. package/dist/dev/index.cjs +0 -38
  396. package/dist/dev/index.cjs.map +0 -1
  397. package/dist/dev/node_modules/@xstate/fsm/es/index.cjs.map +0 -1
  398. package/dist/dev/node_modules/@xstate/react/es/useConstant.cjs +0 -30
  399. package/dist/dev/node_modules/@xstate/react/es/useConstant.cjs.map +0 -1
  400. package/dist/dev/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.cjs +0 -5
  401. package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.cjs.map +0 -1
  402. package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.cjs.map +0 -1
  403. package/dist/dev/node_modules/use-sync-external-store/shim/index.cjs +0 -21
  404. package/dist/dev/node_modules/use-sync-external-store/shim/with-selector.cjs +0 -12
  405. package/dist/dev/node_modules/worktop/cookie/index.cjs +0 -27
  406. package/dist/dev/node_modules/worktop/cookie/index.cjs.map +0 -1
  407. package/dist/dev/node_modules/worktop/cookie/index.js +0 -27
  408. package/dist/dev/node_modules/worktop/cookie/index.js.map +0 -1
  409. package/dist/dev/storefront-api-constants.cjs +0 -5
  410. package/dist/dev/storefront-api-constants.cjs.map +0 -1
  411. package/dist/dev/storefront-client.cjs.map +0 -1
  412. package/dist/prod/MediaFile.cjs.map +0 -1
  413. package/dist/prod/Metafield.cjs.map +0 -1
  414. package/dist/prod/ProductPrice.cjs.map +0 -1
  415. package/dist/prod/ShopifyProvider.cjs +0 -46
  416. package/dist/prod/_virtual/index.cjs +0 -5
  417. package/dist/prod/_virtual/index.cjs.map +0 -1
  418. package/dist/prod/_virtual/use-sync-external-store-shim.development.cjs +0 -5
  419. package/dist/prod/_virtual/use-sync-external-store-shim.development.cjs.map +0 -1
  420. package/dist/prod/_virtual/use-sync-external-store-shim.production.min.cjs +0 -5
  421. package/dist/prod/_virtual/use-sync-external-store-shim.production.min.cjs.map +0 -1
  422. package/dist/prod/_virtual/with-selector.cjs +0 -5
  423. package/dist/prod/_virtual/with-selector.cjs.map +0 -1
  424. package/dist/prod/_virtual/with-selector.development.cjs +0 -5
  425. package/dist/prod/_virtual/with-selector.development.cjs.map +0 -1
  426. package/dist/prod/_virtual/with-selector.production.min.cjs +0 -5
  427. package/dist/prod/_virtual/with-selector.production.min.cjs.map +0 -1
  428. package/dist/prod/cart-constants.cjs +0 -17
  429. package/dist/prod/cart-hooks.cjs +0 -48
  430. package/dist/prod/index.cjs +0 -38
  431. package/dist/prod/index.cjs.map +0 -1
  432. package/dist/prod/node_modules/@xstate/fsm/es/index.cjs.map +0 -1
  433. package/dist/prod/node_modules/@xstate/react/es/useConstant.cjs +0 -30
  434. package/dist/prod/node_modules/@xstate/react/es/useConstant.cjs.map +0 -1
  435. package/dist/prod/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.cjs +0 -5
  436. package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.cjs.map +0 -1
  437. package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.cjs.map +0 -1
  438. package/dist/prod/node_modules/use-sync-external-store/shim/index.cjs +0 -21
  439. package/dist/prod/node_modules/use-sync-external-store/shim/with-selector.cjs +0 -12
  440. package/dist/prod/node_modules/worktop/cookie/index.cjs +0 -27
  441. package/dist/prod/node_modules/worktop/cookie/index.cjs.map +0 -1
  442. package/dist/prod/node_modules/worktop/cookie/index.js +0 -27
  443. package/dist/prod/node_modules/worktop/cookie/index.js.map +0 -1
  444. package/dist/prod/storefront-api-constants.cjs +0 -5
  445. package/dist/prod/storefront-api-constants.cjs.map +0 -1
  446. package/dist/prod/storefront-client.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"flatten-connection.cjs","sources":["../../src/flatten-connection.ts"],"sourcesContent":["import type {PartialDeep} from 'type-fest';\n\n/**\n * The `flattenConnection` utility transforms a connection object from the Storefront API (for example, [Product-related connections](https://shopify.dev/api/storefront/reference/products/product)) into a flat array of nodes.\n * The utility works with either `nodes` or `edges.node`.\n *\n * If `connection` is null or undefined, will return an empty array instead in production. In development, an error will be thrown.\n */\nexport function flattenConnection<T>(\n connection?: PartialDeep<GraphQLConnection<T>, {recurseIntoArrays: true}>\n): PartialDeep<T, {recurseIntoArrays: true}>[] {\n if (!connection) {\n const noConnectionErr = `flattenConnection(): needs a 'connection' to flatten, but received '${connection}' instead`;\n if (__HYDROGEN_DEV__) {\n throw new Error(noConnectionErr);\n } else {\n console.error(noConnectionErr);\n return [];\n }\n }\n\n if (connection.nodes) {\n return connection.nodes as PartialDeep<T, {recurseIntoArrays: true}>[];\n }\n\n if (connection.edges) {\n return connection.edges.map((edge) => {\n if (!edge?.node) {\n throw new Error('Connection edges must contain nodes');\n }\n return edge.node;\n });\n }\n\n if (__HYDROGEN_DEV__) {\n console.warn(\n `The connection did not contain either \"nodes\" or \"edges.node\". A empty array will be returned in its place.`\n );\n }\n\n return [];\n}\n\ninterface GraphQLConnection<T> {\n edges?: {node: T}[];\n nodes?: T[];\n}\n"],"names":[],"mappings":";;AAQO,SAAS,kBACd,YAC6C;AAC7C,MAAI,CAAC,YAAY;AACf,UAAM,kBAAkB,uEAAuE;AACzE;AACd,YAAA,IAAI,MAAM,eAAe;AAAA,IAIjC;AAAA,EACF;AAEA,MAAI,WAAW,OAAO;AACpB,WAAO,WAAW;AAAA,EACpB;AAEA,MAAI,WAAW,OAAO;AACpB,WAAO,WAAW,MAAM,IAAI,CAAC,SAAS;AAChC,UAAA,EAAC,6BAAM,OAAM;AACT,cAAA,IAAI,MAAM,qCAAqC;AAAA,MACvD;AACA,aAAO,KAAK;AAAA,IAAA,CACb;AAAA,EACH;AAEsB;AACZ,YAAA;AAAA,MACN;AAAA,IAAA;AAAA,EAEJ;AAEA,SAAO;AACT;;"}
1
+ {"version":3,"file":"flatten-connection.mjs","sources":["../../src/flatten-connection.ts"],"sourcesContent":["import type {PartialDeep} from 'type-fest';\n\n/**\n * The `flattenConnection` utility transforms a connection object from the Storefront API (for example, [Product-related connections](https://shopify.dev/api/storefront/reference/products/product)) into a flat array of nodes.\n * The utility works with either `nodes` or `edges.node`.\n *\n * If `connection` is null or undefined, will return an empty array instead in production. In development, an error will be thrown.\n */\nexport function flattenConnection<T>(\n connection?: PartialDeep<GraphQLConnection<T>, {recurseIntoArrays: true}>\n): PartialDeep<T, {recurseIntoArrays: true}>[] {\n if (!connection) {\n const noConnectionErr = `flattenConnection(): needs a 'connection' to flatten, but received '${connection}' instead`;\n if (__HYDROGEN_DEV__) {\n throw new Error(noConnectionErr);\n } else {\n console.error(noConnectionErr);\n return [];\n }\n }\n\n if (connection.nodes) {\n return connection.nodes as PartialDeep<T, {recurseIntoArrays: true}>[];\n }\n\n if (connection.edges) {\n return connection.edges.map((edge) => {\n if (!edge?.node) {\n throw new Error('Connection edges must contain nodes');\n }\n return edge.node;\n });\n }\n\n if (__HYDROGEN_DEV__) {\n console.warn(\n `The connection did not contain either \"nodes\" or \"edges.node\". A empty array will be returned in its place.`\n );\n }\n\n return [];\n}\n\ninterface GraphQLConnection<T> {\n edges?: {node: T}[];\n nodes?: T[];\n}\n"],"names":[],"mappings":"AAQO,SAAS,kBACd,YAC6C;AAC7C,MAAI,CAAC,YAAY;AACf,UAAM,kBAAkB,uEAAuE;AACzE;AACd,YAAA,IAAI,MAAM,eAAe;AAAA,IAIjC;AAAA,EACF;AAEA,MAAI,WAAW,OAAO;AACpB,WAAO,WAAW;AAAA,EACpB;AAEA,MAAI,WAAW,OAAO;AACpB,WAAO,WAAW,MAAM,IAAI,CAAC,SAAS;AAChC,UAAA,EAAC,6BAAM,OAAM;AACT,cAAA,IAAI,MAAM,qCAAqC;AAAA,MACvD;AACA,aAAO,KAAK;AAAA,IAAA,CACb;AAAA,EACH;AAEsB;AACZ,YAAA;AAAA,MACN;AAAA,IAAA;AAAA,EAEJ;AAEA,SAAO;AACT;"}
@@ -1,3 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
1
3
  const PRODUCTION_CDN_HOSTNAMES = [
2
4
  "cdn.shopify.com",
3
5
  "cdn.shopifycdn.net",
@@ -71,10 +73,8 @@ function getShopifyImageDimensions({
71
73
  }
72
74
  return { width: null, height: null };
73
75
  }
74
- export {
75
- IMG_SRC_SET_SIZES,
76
- addImageSizeParametersToUrl,
77
- getShopifyImageDimensions,
78
- shopifyImageLoader
79
- };
76
+ exports.IMG_SRC_SET_SIZES = IMG_SRC_SET_SIZES;
77
+ exports.addImageSizeParametersToUrl = addImageSizeParametersToUrl;
78
+ exports.getShopifyImageDimensions = getShopifyImageDimensions;
79
+ exports.shopifyImageLoader = shopifyImageLoader;
80
80
  //# sourceMappingURL=image-size.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"image-size.js","sources":["../../src/image-size.ts"],"sourcesContent":["import type {Image as ImageType} from './storefront-api-types.js';\nimport type {PartialDeep} from 'type-fest';\nimport type {ShopifyLoaderOptions, ShopifyLoaderParams} from './Image.js';\n\n// TODO: Are there other CDNs missing from here?\nconst PRODUCTION_CDN_HOSTNAMES = [\n 'cdn.shopify.com',\n 'cdn.shopifycdn.net',\n 'shopify-assets.shopifycdn.com',\n 'shopify-assets.shopifycdn.net',\n];\nconst LOCAL_CDN_HOSTNAMES = ['spin.dev'];\nconst ALL_CDN_HOSTNAMES = [...PRODUCTION_CDN_HOSTNAMES, ...LOCAL_CDN_HOSTNAMES];\n\n// based on the default width sizes used by the Shopify liquid HTML tag img_tag plus a 2560 width to account for 2k resolutions\n// reference: https://shopify.dev/api/liquid/filters/html-filters#image_tag\nexport const IMG_SRC_SET_SIZES = [352, 832, 1200, 1920, 2560];\n\n/**\n * Adds image size parameters to an image URL hosted by Shopify's CDN\n */\nexport function addImageSizeParametersToUrl({\n src,\n width,\n height,\n crop,\n scale,\n}: ShopifyLoaderParams) {\n const newUrl = new URL(src);\n\n const multipliedScale = scale ?? 1;\n\n if (width) {\n let finalWidth: string;\n\n if (typeof width === 'string') {\n finalWidth = (IMG_SRC_SET_SIZES[0] * multipliedScale).toString();\n } else {\n finalWidth = (Number(width) * multipliedScale).toString();\n }\n\n newUrl.searchParams.append('width', finalWidth);\n }\n\n if (height && typeof height === 'number') {\n newUrl.searchParams.append('height', (height * multipliedScale).toString());\n }\n\n crop && newUrl.searchParams.append('crop', crop);\n\n // for now we intentionally leave off the scale param, and instead multiple width & height by scale instead\n // scale && newUrl.searchParams.append('scale', scale.toString());\n\n return newUrl.toString();\n}\n\nexport function shopifyImageLoader(params: ShopifyLoaderParams) {\n const newSrc = new URL(params.src);\n const isShopifyServedImage = ALL_CDN_HOSTNAMES.some((allowedHostname) =>\n newSrc.hostname.endsWith(allowedHostname)\n );\n\n if (\n !isShopifyServedImage ||\n (!params.width && !params.height && !params.crop && !params.scale)\n ) {\n return params.src;\n }\n\n return addImageSizeParametersToUrl(params);\n}\n\ntype HtmlImageProps = React.ImgHTMLAttributes<HTMLImageElement>;\n\nexport type GetShopifyImageDimensionsProps = {\n data: Pick<\n PartialDeep<ImageType, {recurseIntoArrays: true}>,\n 'altText' | 'url' | 'id' | 'width' | 'height'\n >;\n loaderOptions?: ShopifyLoaderOptions;\n elementProps?: {\n width?: HtmlImageProps['width'];\n height?: HtmlImageProps['height'];\n };\n};\n\ntype GetShopifyImageDimensionsPropsReturn = {\n width: number | string | null;\n height: number | string | null;\n};\n\n/**\n * Width and height are determined using the followiing priority list:\n * 1. `loaderOptions`'s width/height\n * 2. `elementProps`'s width/height\n * 3. `data`'s width/height\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 not, then the aspect ratio cannot be determined and the missing\n * value will reamin as `null`\n */\nexport function getShopifyImageDimensions({\n data: sfapiImage,\n loaderOptions,\n elementProps,\n}: GetShopifyImageDimensionsProps): GetShopifyImageDimensionsPropsReturn {\n let aspectRatio: number | null = null;\n\n if (sfapiImage?.width && sfapiImage?.height) {\n aspectRatio = sfapiImage?.width / sfapiImage?.height;\n }\n\n // * 1. `loaderOptions`'s width/height\n if (loaderOptions?.width || loaderOptions?.height) {\n return {\n width:\n loaderOptions?.width ??\n (aspectRatio && typeof loaderOptions.height === 'number'\n ? Math.round(aspectRatio * loaderOptions.height)\n : null),\n height:\n loaderOptions?.height ??\n (aspectRatio && typeof loaderOptions.width === 'number'\n ? Math.round(aspectRatio * loaderOptions.width)\n : null),\n };\n }\n\n // * 2. `elementProps`'s width/height\n if (elementProps?.width || elementProps?.height) {\n return {\n width:\n elementProps?.width ??\n (aspectRatio && typeof elementProps.height === 'number'\n ? Math.round(aspectRatio * elementProps.height)\n : null),\n height:\n elementProps?.height ??\n (aspectRatio && typeof elementProps.width === 'number'\n ? Math.round(aspectRatio * elementProps.width)\n : null),\n };\n }\n\n // * 3. `data`'s width/height\n if (sfapiImage?.width || sfapiImage?.height) {\n return {\n // can't calculate the aspect ratio here\n width: sfapiImage?.width ?? null,\n height: sfapiImage?.height ?? null,\n };\n }\n\n return {width: null, height: null};\n}\n"],"names":[],"mappings":"AAKA,MAAM,2BAA2B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,MAAM,sBAAsB,CAAC,UAAU;AACvC,MAAM,oBAAoB,CAAC,GAAG,0BAA0B,GAAG,mBAAmB;AAIvE,MAAM,oBAAoB,CAAC,KAAK,KAAK,MAAM,MAAM,IAAI;AAKrD,SAAS,4BAA4B;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AAChB,QAAA,SAAS,IAAI,IAAI,GAAG;AAE1B,QAAM,kBAAkB,wBAAS;AAEjC,MAAI,OAAO;AACL,QAAA;AAEA,QAAA,OAAO,UAAU,UAAU;AACf,oBAAA,kBAAkB,KAAK,iBAAiB,SAAS;AAAA,IAAA,OAC1D;AACL,oBAAc,OAAO,KAAK,IAAI,iBAAiB,SAAS;AAAA,IAC1D;AAEO,WAAA,aAAa,OAAO,SAAS,UAAU;AAAA,EAChD;AAEI,MAAA,UAAU,OAAO,WAAW,UAAU;AACxC,WAAO,aAAa,OAAO,WAAW,SAAS,iBAAiB,UAAU;AAAA,EAC5E;AAEA,UAAQ,OAAO,aAAa,OAAO,QAAQ,IAAI;AAK/C,SAAO,OAAO;AAChB;AAEO,SAAS,mBAAmB,QAA6B;AAC9D,QAAM,SAAS,IAAI,IAAI,OAAO,GAAG;AACjC,QAAM,uBAAuB,kBAAkB;AAAA,IAAK,CAAC,oBACnD,OAAO,SAAS,SAAS,eAAe;AAAA,EAAA;AAG1C,MACE,CAAC,wBACA,CAAC,OAAO,SAAS,CAAC,OAAO,UAAU,CAAC,OAAO,QAAQ,CAAC,OAAO,OAC5D;AACA,WAAO,OAAO;AAAA,EAChB;AAEA,SAAO,4BAA4B,MAAM;AAC3C;AA+BO,SAAS,0BAA0B;AAAA,EACxC,MAAM;AAAA,EACN;AAAA,EACA;AACF,GAAyE;AApGzE;AAqGE,MAAI,cAA6B;AAE7B,OAAA,yCAAY,WAAS,yCAAY,SAAQ;AAC7B,mBAAA,yCAAY,UAAQ,yCAAY;AAAA,EAChD;AAGI,OAAA,+CAAe,WAAS,+CAAe,SAAQ;AAC1C,WAAA;AAAA,MACL,QACE,oDAAe,UAAf,YACC,eAAe,OAAO,cAAc,WAAW,WAC5C,KAAK,MAAM,cAAc,cAAc,MAAM,IAC7C;AAAA,MACN,SACE,oDAAe,WAAf,YACC,eAAe,OAAO,cAAc,UAAU,WAC3C,KAAK,MAAM,cAAc,cAAc,KAAK,IAC5C;AAAA,IAAA;AAAA,EAEV;AAGI,OAAA,6CAAc,WAAS,6CAAc,SAAQ;AACxC,WAAA;AAAA,MACL,QACE,kDAAc,UAAd,YACC,eAAe,OAAO,aAAa,WAAW,WAC3C,KAAK,MAAM,cAAc,aAAa,MAAM,IAC5C;AAAA,MACN,SACE,kDAAc,WAAd,YACC,eAAe,OAAO,aAAa,UAAU,WAC1C,KAAK,MAAM,cAAc,aAAa,KAAK,IAC3C;AAAA,IAAA;AAAA,EAEV;AAGI,OAAA,yCAAY,WAAS,yCAAY,SAAQ;AACpC,WAAA;AAAA,MAEL,QAAO,8CAAY,UAAZ,YAAqB;AAAA,MAC5B,SAAQ,8CAAY,WAAZ,YAAsB;AAAA,IAAA;AAAA,EAElC;AAEA,SAAO,EAAC,OAAO,MAAM,QAAQ,KAAI;AACnC;"}
1
+ {"version":3,"file":"image-size.js","sources":["../../src/image-size.ts"],"sourcesContent":["import type {Image as ImageType} from './storefront-api-types.js';\nimport type {PartialDeep} from 'type-fest';\nimport type {ShopifyLoaderOptions, ShopifyLoaderParams} from './Image.js';\n\n// TODO: Are there other CDNs missing from here?\nconst PRODUCTION_CDN_HOSTNAMES = [\n 'cdn.shopify.com',\n 'cdn.shopifycdn.net',\n 'shopify-assets.shopifycdn.com',\n 'shopify-assets.shopifycdn.net',\n];\nconst LOCAL_CDN_HOSTNAMES = ['spin.dev'];\nconst ALL_CDN_HOSTNAMES = [...PRODUCTION_CDN_HOSTNAMES, ...LOCAL_CDN_HOSTNAMES];\n\n// based on the default width sizes used by the Shopify liquid HTML tag img_tag plus a 2560 width to account for 2k resolutions\n// reference: https://shopify.dev/api/liquid/filters/html-filters#image_tag\nexport const IMG_SRC_SET_SIZES = [352, 832, 1200, 1920, 2560];\n\n/**\n * Adds image size parameters to an image URL hosted by Shopify's CDN\n */\nexport function addImageSizeParametersToUrl({\n src,\n width,\n height,\n crop,\n scale,\n}: ShopifyLoaderParams) {\n const newUrl = new URL(src);\n\n const multipliedScale = scale ?? 1;\n\n if (width) {\n let finalWidth: string;\n\n if (typeof width === 'string') {\n finalWidth = (IMG_SRC_SET_SIZES[0] * multipliedScale).toString();\n } else {\n finalWidth = (Number(width) * multipliedScale).toString();\n }\n\n newUrl.searchParams.append('width', finalWidth);\n }\n\n if (height && typeof height === 'number') {\n newUrl.searchParams.append('height', (height * multipliedScale).toString());\n }\n\n crop && newUrl.searchParams.append('crop', crop);\n\n // for now we intentionally leave off the scale param, and instead multiple width & height by scale instead\n // scale && newUrl.searchParams.append('scale', scale.toString());\n\n return newUrl.toString();\n}\n\nexport function shopifyImageLoader(params: ShopifyLoaderParams) {\n const newSrc = new URL(params.src);\n const isShopifyServedImage = ALL_CDN_HOSTNAMES.some((allowedHostname) =>\n newSrc.hostname.endsWith(allowedHostname)\n );\n\n if (\n !isShopifyServedImage ||\n (!params.width && !params.height && !params.crop && !params.scale)\n ) {\n return params.src;\n }\n\n return addImageSizeParametersToUrl(params);\n}\n\ntype HtmlImageProps = React.ImgHTMLAttributes<HTMLImageElement>;\n\nexport type GetShopifyImageDimensionsProps = {\n data: Pick<\n PartialDeep<ImageType, {recurseIntoArrays: true}>,\n 'altText' | 'url' | 'id' | 'width' | 'height'\n >;\n loaderOptions?: ShopifyLoaderOptions;\n elementProps?: {\n width?: HtmlImageProps['width'];\n height?: HtmlImageProps['height'];\n };\n};\n\ntype GetShopifyImageDimensionsPropsReturn = {\n width: number | string | null;\n height: number | string | null;\n};\n\n/**\n * Width and height are determined using the followiing priority list:\n * 1. `loaderOptions`'s width/height\n * 2. `elementProps`'s width/height\n * 3. `data`'s width/height\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 not, then the aspect ratio cannot be determined and the missing\n * value will reamin as `null`\n */\nexport function getShopifyImageDimensions({\n data: sfapiImage,\n loaderOptions,\n elementProps,\n}: GetShopifyImageDimensionsProps): GetShopifyImageDimensionsPropsReturn {\n let aspectRatio: number | null = null;\n\n if (sfapiImage?.width && sfapiImage?.height) {\n aspectRatio = sfapiImage?.width / sfapiImage?.height;\n }\n\n // * 1. `loaderOptions`'s width/height\n if (loaderOptions?.width || loaderOptions?.height) {\n return {\n width:\n loaderOptions?.width ??\n (aspectRatio && typeof loaderOptions.height === 'number'\n ? Math.round(aspectRatio * loaderOptions.height)\n : null),\n height:\n loaderOptions?.height ??\n (aspectRatio && typeof loaderOptions.width === 'number'\n ? Math.round(aspectRatio * loaderOptions.width)\n : null),\n };\n }\n\n // * 2. `elementProps`'s width/height\n if (elementProps?.width || elementProps?.height) {\n return {\n width:\n elementProps?.width ??\n (aspectRatio && typeof elementProps.height === 'number'\n ? Math.round(aspectRatio * elementProps.height)\n : null),\n height:\n elementProps?.height ??\n (aspectRatio && typeof elementProps.width === 'number'\n ? Math.round(aspectRatio * elementProps.width)\n : null),\n };\n }\n\n // * 3. `data`'s width/height\n if (sfapiImage?.width || sfapiImage?.height) {\n return {\n // can't calculate the aspect ratio here\n width: sfapiImage?.width ?? null,\n height: sfapiImage?.height ?? null,\n };\n }\n\n return {width: null, height: null};\n}\n"],"names":[],"mappings":";;AAKA,MAAM,2BAA2B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,MAAM,sBAAsB,CAAC,UAAU;AACvC,MAAM,oBAAoB,CAAC,GAAG,0BAA0B,GAAG,mBAAmB;AAIvE,MAAM,oBAAoB,CAAC,KAAK,KAAK,MAAM,MAAM,IAAI;AAKrD,SAAS,4BAA4B;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AAChB,QAAA,SAAS,IAAI,IAAI,GAAG;AAE1B,QAAM,kBAAkB,wBAAS;AAEjC,MAAI,OAAO;AACL,QAAA;AAEA,QAAA,OAAO,UAAU,UAAU;AACf,oBAAA,kBAAkB,KAAK,iBAAiB,SAAS;AAAA,IAAA,OAC1D;AACL,oBAAc,OAAO,KAAK,IAAI,iBAAiB,SAAS;AAAA,IAC1D;AAEO,WAAA,aAAa,OAAO,SAAS,UAAU;AAAA,EAChD;AAEI,MAAA,UAAU,OAAO,WAAW,UAAU;AACxC,WAAO,aAAa,OAAO,WAAW,SAAS,iBAAiB,UAAU;AAAA,EAC5E;AAEA,UAAQ,OAAO,aAAa,OAAO,QAAQ,IAAI;AAK/C,SAAO,OAAO;AAChB;AAEO,SAAS,mBAAmB,QAA6B;AAC9D,QAAM,SAAS,IAAI,IAAI,OAAO,GAAG;AACjC,QAAM,uBAAuB,kBAAkB;AAAA,IAAK,CAAC,oBACnD,OAAO,SAAS,SAAS,eAAe;AAAA,EAAA;AAG1C,MACE,CAAC,wBACA,CAAC,OAAO,SAAS,CAAC,OAAO,UAAU,CAAC,OAAO,QAAQ,CAAC,OAAO,OAC5D;AACA,WAAO,OAAO;AAAA,EAChB;AAEA,SAAO,4BAA4B,MAAM;AAC3C;AA+BO,SAAS,0BAA0B;AAAA,EACxC,MAAM;AAAA,EACN;AAAA,EACA;AACF,GAAyE;;AACvE,MAAI,cAA6B;AAE7B,OAAA,yCAAY,WAAS,yCAAY,SAAQ;AAC7B,mBAAA,yCAAY,UAAQ,yCAAY;AAAA,EAChD;AAGI,OAAA,+CAAe,WAAS,+CAAe,SAAQ;AAC1C,WAAA;AAAA,MACL,QACE,oDAAe,UAAf,YACC,eAAe,OAAO,cAAc,WAAW,WAC5C,KAAK,MAAM,cAAc,cAAc,MAAM,IAC7C;AAAA,MACN,SACE,oDAAe,WAAf,YACC,eAAe,OAAO,cAAc,UAAU,WAC3C,KAAK,MAAM,cAAc,cAAc,KAAK,IAC5C;AAAA,IAAA;AAAA,EAEV;AAGI,OAAA,6CAAc,WAAS,6CAAc,SAAQ;AACxC,WAAA;AAAA,MACL,QACE,kDAAc,UAAd,YACC,eAAe,OAAO,aAAa,WAAW,WAC3C,KAAK,MAAM,cAAc,aAAa,MAAM,IAC5C;AAAA,MACN,SACE,kDAAc,WAAd,YACC,eAAe,OAAO,aAAa,UAAU,WAC1C,KAAK,MAAM,cAAc,aAAa,KAAK,IAC3C;AAAA,IAAA;AAAA,EAEV;AAGI,OAAA,yCAAY,WAAS,yCAAY,SAAQ;AACpC,WAAA;AAAA,MAEL,QAAO,8CAAY,UAAZ,YAAqB;AAAA,MAC5B,SAAQ,8CAAY,WAAZ,YAAsB;AAAA,IAAA;AAAA,EAElC;AAEA,SAAO,EAAC,OAAO,MAAM,QAAQ,KAAI;AACnC;;;;;"}
@@ -1,5 +1,3 @@
1
- "use strict";
2
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
1
  const PRODUCTION_CDN_HOSTNAMES = [
4
2
  "cdn.shopify.com",
5
3
  "cdn.shopifycdn.net",
@@ -73,8 +71,10 @@ function getShopifyImageDimensions({
73
71
  }
74
72
  return { width: null, height: null };
75
73
  }
76
- exports.IMG_SRC_SET_SIZES = IMG_SRC_SET_SIZES;
77
- exports.addImageSizeParametersToUrl = addImageSizeParametersToUrl;
78
- exports.getShopifyImageDimensions = getShopifyImageDimensions;
79
- exports.shopifyImageLoader = shopifyImageLoader;
80
- //# sourceMappingURL=image-size.cjs.map
74
+ export {
75
+ IMG_SRC_SET_SIZES,
76
+ addImageSizeParametersToUrl,
77
+ getShopifyImageDimensions,
78
+ shopifyImageLoader
79
+ };
80
+ //# sourceMappingURL=image-size.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"image-size.cjs","sources":["../../src/image-size.ts"],"sourcesContent":["import type {Image as ImageType} from './storefront-api-types.js';\nimport type {PartialDeep} from 'type-fest';\nimport type {ShopifyLoaderOptions, ShopifyLoaderParams} from './Image.js';\n\n// TODO: Are there other CDNs missing from here?\nconst PRODUCTION_CDN_HOSTNAMES = [\n 'cdn.shopify.com',\n 'cdn.shopifycdn.net',\n 'shopify-assets.shopifycdn.com',\n 'shopify-assets.shopifycdn.net',\n];\nconst LOCAL_CDN_HOSTNAMES = ['spin.dev'];\nconst ALL_CDN_HOSTNAMES = [...PRODUCTION_CDN_HOSTNAMES, ...LOCAL_CDN_HOSTNAMES];\n\n// based on the default width sizes used by the Shopify liquid HTML tag img_tag plus a 2560 width to account for 2k resolutions\n// reference: https://shopify.dev/api/liquid/filters/html-filters#image_tag\nexport const IMG_SRC_SET_SIZES = [352, 832, 1200, 1920, 2560];\n\n/**\n * Adds image size parameters to an image URL hosted by Shopify's CDN\n */\nexport function addImageSizeParametersToUrl({\n src,\n width,\n height,\n crop,\n scale,\n}: ShopifyLoaderParams) {\n const newUrl = new URL(src);\n\n const multipliedScale = scale ?? 1;\n\n if (width) {\n let finalWidth: string;\n\n if (typeof width === 'string') {\n finalWidth = (IMG_SRC_SET_SIZES[0] * multipliedScale).toString();\n } else {\n finalWidth = (Number(width) * multipliedScale).toString();\n }\n\n newUrl.searchParams.append('width', finalWidth);\n }\n\n if (height && typeof height === 'number') {\n newUrl.searchParams.append('height', (height * multipliedScale).toString());\n }\n\n crop && newUrl.searchParams.append('crop', crop);\n\n // for now we intentionally leave off the scale param, and instead multiple width & height by scale instead\n // scale && newUrl.searchParams.append('scale', scale.toString());\n\n return newUrl.toString();\n}\n\nexport function shopifyImageLoader(params: ShopifyLoaderParams) {\n const newSrc = new URL(params.src);\n const isShopifyServedImage = ALL_CDN_HOSTNAMES.some((allowedHostname) =>\n newSrc.hostname.endsWith(allowedHostname)\n );\n\n if (\n !isShopifyServedImage ||\n (!params.width && !params.height && !params.crop && !params.scale)\n ) {\n return params.src;\n }\n\n return addImageSizeParametersToUrl(params);\n}\n\ntype HtmlImageProps = React.ImgHTMLAttributes<HTMLImageElement>;\n\nexport type GetShopifyImageDimensionsProps = {\n data: Pick<\n PartialDeep<ImageType, {recurseIntoArrays: true}>,\n 'altText' | 'url' | 'id' | 'width' | 'height'\n >;\n loaderOptions?: ShopifyLoaderOptions;\n elementProps?: {\n width?: HtmlImageProps['width'];\n height?: HtmlImageProps['height'];\n };\n};\n\ntype GetShopifyImageDimensionsPropsReturn = {\n width: number | string | null;\n height: number | string | null;\n};\n\n/**\n * Width and height are determined using the followiing priority list:\n * 1. `loaderOptions`'s width/height\n * 2. `elementProps`'s width/height\n * 3. `data`'s width/height\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 not, then the aspect ratio cannot be determined and the missing\n * value will reamin as `null`\n */\nexport function getShopifyImageDimensions({\n data: sfapiImage,\n loaderOptions,\n elementProps,\n}: GetShopifyImageDimensionsProps): GetShopifyImageDimensionsPropsReturn {\n let aspectRatio: number | null = null;\n\n if (sfapiImage?.width && sfapiImage?.height) {\n aspectRatio = sfapiImage?.width / sfapiImage?.height;\n }\n\n // * 1. `loaderOptions`'s width/height\n if (loaderOptions?.width || loaderOptions?.height) {\n return {\n width:\n loaderOptions?.width ??\n (aspectRatio && typeof loaderOptions.height === 'number'\n ? Math.round(aspectRatio * loaderOptions.height)\n : null),\n height:\n loaderOptions?.height ??\n (aspectRatio && typeof loaderOptions.width === 'number'\n ? Math.round(aspectRatio * loaderOptions.width)\n : null),\n };\n }\n\n // * 2. `elementProps`'s width/height\n if (elementProps?.width || elementProps?.height) {\n return {\n width:\n elementProps?.width ??\n (aspectRatio && typeof elementProps.height === 'number'\n ? Math.round(aspectRatio * elementProps.height)\n : null),\n height:\n elementProps?.height ??\n (aspectRatio && typeof elementProps.width === 'number'\n ? Math.round(aspectRatio * elementProps.width)\n : null),\n };\n }\n\n // * 3. `data`'s width/height\n if (sfapiImage?.width || sfapiImage?.height) {\n return {\n // can't calculate the aspect ratio here\n width: sfapiImage?.width ?? null,\n height: sfapiImage?.height ?? null,\n };\n }\n\n return {width: null, height: null};\n}\n"],"names":[],"mappings":";;AAKA,MAAM,2BAA2B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,MAAM,sBAAsB,CAAC,UAAU;AACvC,MAAM,oBAAoB,CAAC,GAAG,0BAA0B,GAAG,mBAAmB;AAIvE,MAAM,oBAAoB,CAAC,KAAK,KAAK,MAAM,MAAM,IAAI;AAKrD,SAAS,4BAA4B;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AAChB,QAAA,SAAS,IAAI,IAAI,GAAG;AAE1B,QAAM,kBAAkB,wBAAS;AAEjC,MAAI,OAAO;AACL,QAAA;AAEA,QAAA,OAAO,UAAU,UAAU;AACf,oBAAA,kBAAkB,KAAK,iBAAiB,SAAS;AAAA,IAAA,OAC1D;AACL,oBAAc,OAAO,KAAK,IAAI,iBAAiB,SAAS;AAAA,IAC1D;AAEO,WAAA,aAAa,OAAO,SAAS,UAAU;AAAA,EAChD;AAEI,MAAA,UAAU,OAAO,WAAW,UAAU;AACxC,WAAO,aAAa,OAAO,WAAW,SAAS,iBAAiB,UAAU;AAAA,EAC5E;AAEA,UAAQ,OAAO,aAAa,OAAO,QAAQ,IAAI;AAK/C,SAAO,OAAO;AAChB;AAEO,SAAS,mBAAmB,QAA6B;AAC9D,QAAM,SAAS,IAAI,IAAI,OAAO,GAAG;AACjC,QAAM,uBAAuB,kBAAkB;AAAA,IAAK,CAAC,oBACnD,OAAO,SAAS,SAAS,eAAe;AAAA,EAAA;AAG1C,MACE,CAAC,wBACA,CAAC,OAAO,SAAS,CAAC,OAAO,UAAU,CAAC,OAAO,QAAQ,CAAC,OAAO,OAC5D;AACA,WAAO,OAAO;AAAA,EAChB;AAEA,SAAO,4BAA4B,MAAM;AAC3C;AA+BO,SAAS,0BAA0B;AAAA,EACxC,MAAM;AAAA,EACN;AAAA,EACA;AACF,GAAyE;;AACvE,MAAI,cAA6B;AAE7B,OAAA,yCAAY,WAAS,yCAAY,SAAQ;AAC7B,mBAAA,yCAAY,UAAQ,yCAAY;AAAA,EAChD;AAGI,OAAA,+CAAe,WAAS,+CAAe,SAAQ;AAC1C,WAAA;AAAA,MACL,QACE,oDAAe,UAAf,YACC,eAAe,OAAO,cAAc,WAAW,WAC5C,KAAK,MAAM,cAAc,cAAc,MAAM,IAC7C;AAAA,MACN,SACE,oDAAe,WAAf,YACC,eAAe,OAAO,cAAc,UAAU,WAC3C,KAAK,MAAM,cAAc,cAAc,KAAK,IAC5C;AAAA,IAAA;AAAA,EAEV;AAGI,OAAA,6CAAc,WAAS,6CAAc,SAAQ;AACxC,WAAA;AAAA,MACL,QACE,kDAAc,UAAd,YACC,eAAe,OAAO,aAAa,WAAW,WAC3C,KAAK,MAAM,cAAc,aAAa,MAAM,IAC5C;AAAA,MACN,SACE,kDAAc,WAAd,YACC,eAAe,OAAO,aAAa,UAAU,WAC1C,KAAK,MAAM,cAAc,aAAa,KAAK,IAC3C;AAAA,IAAA;AAAA,EAEV;AAGI,OAAA,yCAAY,WAAS,yCAAY,SAAQ;AACpC,WAAA;AAAA,MAEL,QAAO,8CAAY,UAAZ,YAAqB;AAAA,MAC5B,SAAQ,8CAAY,WAAZ,YAAsB;AAAA,IAAA;AAAA,EAElC;AAEA,SAAO,EAAC,OAAO,MAAM,QAAQ,KAAI;AACnC;;;;;"}
1
+ {"version":3,"file":"image-size.mjs","sources":["../../src/image-size.ts"],"sourcesContent":["import type {Image as ImageType} from './storefront-api-types.js';\nimport type {PartialDeep} from 'type-fest';\nimport type {ShopifyLoaderOptions, ShopifyLoaderParams} from './Image.js';\n\n// TODO: Are there other CDNs missing from here?\nconst PRODUCTION_CDN_HOSTNAMES = [\n 'cdn.shopify.com',\n 'cdn.shopifycdn.net',\n 'shopify-assets.shopifycdn.com',\n 'shopify-assets.shopifycdn.net',\n];\nconst LOCAL_CDN_HOSTNAMES = ['spin.dev'];\nconst ALL_CDN_HOSTNAMES = [...PRODUCTION_CDN_HOSTNAMES, ...LOCAL_CDN_HOSTNAMES];\n\n// based on the default width sizes used by the Shopify liquid HTML tag img_tag plus a 2560 width to account for 2k resolutions\n// reference: https://shopify.dev/api/liquid/filters/html-filters#image_tag\nexport const IMG_SRC_SET_SIZES = [352, 832, 1200, 1920, 2560];\n\n/**\n * Adds image size parameters to an image URL hosted by Shopify's CDN\n */\nexport function addImageSizeParametersToUrl({\n src,\n width,\n height,\n crop,\n scale,\n}: ShopifyLoaderParams) {\n const newUrl = new URL(src);\n\n const multipliedScale = scale ?? 1;\n\n if (width) {\n let finalWidth: string;\n\n if (typeof width === 'string') {\n finalWidth = (IMG_SRC_SET_SIZES[0] * multipliedScale).toString();\n } else {\n finalWidth = (Number(width) * multipliedScale).toString();\n }\n\n newUrl.searchParams.append('width', finalWidth);\n }\n\n if (height && typeof height === 'number') {\n newUrl.searchParams.append('height', (height * multipliedScale).toString());\n }\n\n crop && newUrl.searchParams.append('crop', crop);\n\n // for now we intentionally leave off the scale param, and instead multiple width & height by scale instead\n // scale && newUrl.searchParams.append('scale', scale.toString());\n\n return newUrl.toString();\n}\n\nexport function shopifyImageLoader(params: ShopifyLoaderParams) {\n const newSrc = new URL(params.src);\n const isShopifyServedImage = ALL_CDN_HOSTNAMES.some((allowedHostname) =>\n newSrc.hostname.endsWith(allowedHostname)\n );\n\n if (\n !isShopifyServedImage ||\n (!params.width && !params.height && !params.crop && !params.scale)\n ) {\n return params.src;\n }\n\n return addImageSizeParametersToUrl(params);\n}\n\ntype HtmlImageProps = React.ImgHTMLAttributes<HTMLImageElement>;\n\nexport type GetShopifyImageDimensionsProps = {\n data: Pick<\n PartialDeep<ImageType, {recurseIntoArrays: true}>,\n 'altText' | 'url' | 'id' | 'width' | 'height'\n >;\n loaderOptions?: ShopifyLoaderOptions;\n elementProps?: {\n width?: HtmlImageProps['width'];\n height?: HtmlImageProps['height'];\n };\n};\n\ntype GetShopifyImageDimensionsPropsReturn = {\n width: number | string | null;\n height: number | string | null;\n};\n\n/**\n * Width and height are determined using the followiing priority list:\n * 1. `loaderOptions`'s width/height\n * 2. `elementProps`'s width/height\n * 3. `data`'s width/height\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 not, then the aspect ratio cannot be determined and the missing\n * value will reamin as `null`\n */\nexport function getShopifyImageDimensions({\n data: sfapiImage,\n loaderOptions,\n elementProps,\n}: GetShopifyImageDimensionsProps): GetShopifyImageDimensionsPropsReturn {\n let aspectRatio: number | null = null;\n\n if (sfapiImage?.width && sfapiImage?.height) {\n aspectRatio = sfapiImage?.width / sfapiImage?.height;\n }\n\n // * 1. `loaderOptions`'s width/height\n if (loaderOptions?.width || loaderOptions?.height) {\n return {\n width:\n loaderOptions?.width ??\n (aspectRatio && typeof loaderOptions.height === 'number'\n ? Math.round(aspectRatio * loaderOptions.height)\n : null),\n height:\n loaderOptions?.height ??\n (aspectRatio && typeof loaderOptions.width === 'number'\n ? Math.round(aspectRatio * loaderOptions.width)\n : null),\n };\n }\n\n // * 2. `elementProps`'s width/height\n if (elementProps?.width || elementProps?.height) {\n return {\n width:\n elementProps?.width ??\n (aspectRatio && typeof elementProps.height === 'number'\n ? Math.round(aspectRatio * elementProps.height)\n : null),\n height:\n elementProps?.height ??\n (aspectRatio && typeof elementProps.width === 'number'\n ? Math.round(aspectRatio * elementProps.width)\n : null),\n };\n }\n\n // * 3. `data`'s width/height\n if (sfapiImage?.width || sfapiImage?.height) {\n return {\n // can't calculate the aspect ratio here\n width: sfapiImage?.width ?? null,\n height: sfapiImage?.height ?? null,\n };\n }\n\n return {width: null, height: null};\n}\n"],"names":[],"mappings":"AAKA,MAAM,2BAA2B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,MAAM,sBAAsB,CAAC,UAAU;AACvC,MAAM,oBAAoB,CAAC,GAAG,0BAA0B,GAAG,mBAAmB;AAIvE,MAAM,oBAAoB,CAAC,KAAK,KAAK,MAAM,MAAM,IAAI;AAKrD,SAAS,4BAA4B;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AAChB,QAAA,SAAS,IAAI,IAAI,GAAG;AAE1B,QAAM,kBAAkB,wBAAS;AAEjC,MAAI,OAAO;AACL,QAAA;AAEA,QAAA,OAAO,UAAU,UAAU;AACf,oBAAA,kBAAkB,KAAK,iBAAiB,SAAS;AAAA,IAAA,OAC1D;AACL,oBAAc,OAAO,KAAK,IAAI,iBAAiB,SAAS;AAAA,IAC1D;AAEO,WAAA,aAAa,OAAO,SAAS,UAAU;AAAA,EAChD;AAEI,MAAA,UAAU,OAAO,WAAW,UAAU;AACxC,WAAO,aAAa,OAAO,WAAW,SAAS,iBAAiB,UAAU;AAAA,EAC5E;AAEA,UAAQ,OAAO,aAAa,OAAO,QAAQ,IAAI;AAK/C,SAAO,OAAO;AAChB;AAEO,SAAS,mBAAmB,QAA6B;AAC9D,QAAM,SAAS,IAAI,IAAI,OAAO,GAAG;AACjC,QAAM,uBAAuB,kBAAkB;AAAA,IAAK,CAAC,oBACnD,OAAO,SAAS,SAAS,eAAe;AAAA,EAAA;AAG1C,MACE,CAAC,wBACA,CAAC,OAAO,SAAS,CAAC,OAAO,UAAU,CAAC,OAAO,QAAQ,CAAC,OAAO,OAC5D;AACA,WAAO,OAAO;AAAA,EAChB;AAEA,SAAO,4BAA4B,MAAM;AAC3C;AA+BO,SAAS,0BAA0B;AAAA,EACxC,MAAM;AAAA,EACN;AAAA,EACA;AACF,GAAyE;AApGzE;AAqGE,MAAI,cAA6B;AAE7B,OAAA,yCAAY,WAAS,yCAAY,SAAQ;AAC7B,mBAAA,yCAAY,UAAQ,yCAAY;AAAA,EAChD;AAGI,OAAA,+CAAe,WAAS,+CAAe,SAAQ;AAC1C,WAAA;AAAA,MACL,QACE,oDAAe,UAAf,YACC,eAAe,OAAO,cAAc,WAAW,WAC5C,KAAK,MAAM,cAAc,cAAc,MAAM,IAC7C;AAAA,MACN,SACE,oDAAe,WAAf,YACC,eAAe,OAAO,cAAc,UAAU,WAC3C,KAAK,MAAM,cAAc,cAAc,KAAK,IAC5C;AAAA,IAAA;AAAA,EAEV;AAGI,OAAA,6CAAc,WAAS,6CAAc,SAAQ;AACxC,WAAA;AAAA,MACL,QACE,kDAAc,UAAd,YACC,eAAe,OAAO,aAAa,WAAW,WAC3C,KAAK,MAAM,cAAc,aAAa,MAAM,IAC5C;AAAA,MACN,SACE,kDAAc,WAAd,YACC,eAAe,OAAO,aAAa,UAAU,WAC1C,KAAK,MAAM,cAAc,aAAa,KAAK,IAC3C;AAAA,IAAA;AAAA,EAEV;AAGI,OAAA,yCAAY,WAAS,yCAAY,SAAQ;AACpC,WAAA;AAAA,MAEL,QAAO,8CAAY,UAAZ,YAAqB;AAAA,MAC5B,SAAQ,8CAAY,WAAZ,YAAsB;AAAA,IAAA;AAAA,EAElC;AAEA,SAAO,EAAC,OAAO,MAAM,QAAQ,KAAI;AACnC;"}
package/dist/dev/index.js CHANGED
@@ -1,38 +1,46 @@
1
- import { CartProvider, useCart } from "./CartProvider.js";
2
- import { ExternalVideo } from "./ExternalVideo.js";
3
- import { flattenConnection } from "./flatten-connection.js";
4
- import { Image } from "./Image.js";
5
- import { MediaFile } from "./MediaFile.js";
6
- import { Metafield, parseMetafield, parseMetafieldValue } from "./Metafield.js";
7
- import { ModelViewer } from "./ModelViewer.js";
8
- import { Money } from "./Money.js";
9
- import { ProductPrice } from "./ProductPrice.js";
10
- import { ProductProvider, useProduct } from "./ProductProvider.js";
11
- import { ShopifyProvider, useShop } from "./ShopifyProvider.js";
12
- import { ShopPayButton } from "./ShopPayButton.js";
13
- import { createStorefrontClient } from "./storefront-client.js";
14
- import { useMoney } from "./useMoney.js";
15
- import { Video } from "./Video.js";
16
- export {
17
- CartProvider,
18
- ExternalVideo,
19
- Image,
20
- MediaFile,
21
- Metafield,
22
- ModelViewer,
23
- Money,
24
- ProductPrice,
25
- ProductProvider,
26
- ShopPayButton,
27
- ShopifyProvider,
28
- Video,
29
- createStorefrontClient,
30
- flattenConnection,
31
- parseMetafield,
32
- parseMetafieldValue,
33
- useCart,
34
- useMoney,
35
- useProduct,
36
- useShop
37
- };
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const AddToCartButton = require("./AddToCartButton.js");
4
+ const BuyNowButton = require("./BuyNowButton.js");
5
+ const CartCheckoutButton = require("./CartCheckoutButton.js");
6
+ const CartProvider = require("./CartProvider.js");
7
+ const ExternalVideo = require("./ExternalVideo.js");
8
+ const flattenConnection = require("./flatten-connection.js");
9
+ const Image = require("./Image.js");
10
+ const MediaFile = require("./MediaFile.js");
11
+ const metafieldParser = require("./metafield-parser.js");
12
+ const Metafield = require("./Metafield.js");
13
+ const ModelViewer = require("./ModelViewer.js");
14
+ const Money = require("./Money.js");
15
+ const ProductPrice = require("./ProductPrice.js");
16
+ const ProductProvider = require("./ProductProvider.js");
17
+ const ShopifyProvider = require("./ShopifyProvider.js");
18
+ const ShopPayButton = require("./ShopPayButton.js");
19
+ const storefrontClient = require("./storefront-client.js");
20
+ const useMoney = require("./useMoney.js");
21
+ const Video = require("./Video.js");
22
+ exports.AddToCartButton = AddToCartButton.AddToCartButton;
23
+ exports.BuyNowButton = BuyNowButton.BuyNowButton;
24
+ exports.CartCheckoutButton = CartCheckoutButton.CartCheckoutButton;
25
+ exports.CartProvider = CartProvider.CartProvider;
26
+ exports.useCart = CartProvider.useCart;
27
+ exports.ExternalVideo = ExternalVideo.ExternalVideo;
28
+ exports.flattenConnection = flattenConnection.flattenConnection;
29
+ exports.Image = Image.Image;
30
+ exports.MediaFile = MediaFile.MediaFile;
31
+ exports.metafieldParser = metafieldParser.metafieldParser;
32
+ exports.Metafield = Metafield.Metafield;
33
+ exports.parseMetafield = Metafield.parseMetafield;
34
+ exports.parseMetafieldValue = Metafield.parseMetafieldValue;
35
+ exports.ModelViewer = ModelViewer.ModelViewer;
36
+ exports.Money = Money.Money;
37
+ exports.ProductPrice = ProductPrice.ProductPrice;
38
+ exports.ProductProvider = ProductProvider.ProductProvider;
39
+ exports.useProduct = ProductProvider.useProduct;
40
+ exports.ShopifyProvider = ShopifyProvider.ShopifyProvider;
41
+ exports.useShop = ShopifyProvider.useShop;
42
+ exports.ShopPayButton = ShopPayButton.ShopPayButton;
43
+ exports.createStorefrontClient = storefrontClient.createStorefrontClient;
44
+ exports.useMoney = useMoney.useMoney;
45
+ exports.Video = Video.Video;
38
46
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,46 @@
1
+ import { AddToCartButton } from "./AddToCartButton.mjs";
2
+ import { BuyNowButton } from "./BuyNowButton.mjs";
3
+ import { CartCheckoutButton } from "./CartCheckoutButton.mjs";
4
+ import { CartProvider, useCart } from "./CartProvider.mjs";
5
+ import { ExternalVideo } from "./ExternalVideo.mjs";
6
+ import { flattenConnection } from "./flatten-connection.mjs";
7
+ import { Image } from "./Image.mjs";
8
+ import { MediaFile } from "./MediaFile.mjs";
9
+ import { metafieldParser } from "./metafield-parser.mjs";
10
+ import { Metafield, parseMetafield, parseMetafieldValue } from "./Metafield.mjs";
11
+ import { ModelViewer } from "./ModelViewer.mjs";
12
+ import { Money } from "./Money.mjs";
13
+ import { ProductPrice } from "./ProductPrice.mjs";
14
+ import { ProductProvider, useProduct } from "./ProductProvider.mjs";
15
+ import { ShopifyProvider, useShop } from "./ShopifyProvider.mjs";
16
+ import { ShopPayButton } from "./ShopPayButton.mjs";
17
+ import { createStorefrontClient } from "./storefront-client.mjs";
18
+ import { useMoney } from "./useMoney.mjs";
19
+ import { Video } from "./Video.mjs";
20
+ export {
21
+ AddToCartButton,
22
+ BuyNowButton,
23
+ CartCheckoutButton,
24
+ CartProvider,
25
+ ExternalVideo,
26
+ Image,
27
+ MediaFile,
28
+ Metafield,
29
+ ModelViewer,
30
+ Money,
31
+ ProductPrice,
32
+ ProductProvider,
33
+ ShopPayButton,
34
+ ShopifyProvider,
35
+ Video,
36
+ createStorefrontClient,
37
+ flattenConnection,
38
+ metafieldParser,
39
+ parseMetafield,
40
+ parseMetafieldValue,
41
+ useCart,
42
+ useMoney,
43
+ useProduct,
44
+ useShop
45
+ };
46
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;"}
@@ -1,4 +1,6 @@
1
- import { useState, useEffect } from "react";
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const require$$0 = require("react");
2
4
  const SCRIPTS_LOADED = {};
3
5
  function loadScript(src, options) {
4
6
  const isScriptLoaded = SCRIPTS_LOADED[src];
@@ -29,9 +31,9 @@ function loadScript(src, options) {
29
31
  return promise;
30
32
  }
31
33
  function useLoadScript(url, options) {
32
- const [status, setStatus] = useState("loading");
34
+ const [status, setStatus] = require$$0.useState("loading");
33
35
  const stringifiedOptions = JSON.stringify(options);
34
- useEffect(() => {
36
+ require$$0.useEffect(() => {
35
37
  async function loadScriptWrapper() {
36
38
  try {
37
39
  setStatus("loading");
@@ -45,8 +47,6 @@ function useLoadScript(url, options) {
45
47
  }, [url, stringifiedOptions, options]);
46
48
  return status;
47
49
  }
48
- export {
49
- loadScript,
50
- useLoadScript
51
- };
50
+ exports.loadScript = loadScript;
51
+ exports.useLoadScript = useLoadScript;
52
52
  //# sourceMappingURL=load-script.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"load-script.js","sources":["../../src/load-script.tsx"],"sourcesContent":["import {useState, useEffect} from 'react';\n\nconst SCRIPTS_LOADED: Record<string, Promise<boolean>> = {};\n\nexport function loadScript(\n src: string,\n options?: {module?: boolean; in?: 'head' | 'body'}\n): Promise<boolean> {\n const isScriptLoaded: Promise<boolean> = SCRIPTS_LOADED[src];\n\n if (isScriptLoaded) {\n return isScriptLoaded;\n }\n\n const promise = new Promise<boolean>((resolve, reject) => {\n const script = document.createElement('script');\n if (options?.module) {\n script.type = 'module';\n } else {\n script.type = 'text/javascript';\n }\n script.src = src;\n script.onload = () => {\n resolve(true);\n };\n script.onerror = () => {\n reject(false);\n };\n if (options?.in === 'head') {\n document.head.appendChild(script);\n } else {\n document.body.appendChild(script);\n }\n });\n\n SCRIPTS_LOADED[src] = promise;\n\n return promise;\n}\n\ntype LoadScriptParams = Parameters<typeof loadScript>;\n\n/**\n * The `useLoadScript` hook loads an external script tag in the browser. It allows React components to lazy-load large third-party dependencies.\n */\nexport function useLoadScript(\n url: LoadScriptParams[0],\n options?: LoadScriptParams[1]\n): ScriptState {\n const [status, setStatus] = useState<ScriptState>('loading');\n const stringifiedOptions = JSON.stringify(options);\n\n useEffect(() => {\n async function loadScriptWrapper() {\n try {\n setStatus('loading');\n await loadScript(url, options);\n setStatus('done');\n } catch (error) {\n setStatus('error');\n }\n }\n\n loadScriptWrapper();\n }, [url, stringifiedOptions, options]);\n\n return status;\n}\n\ntype ScriptState = 'loading' | 'done' | 'error';\n"],"names":["SCRIPTS_LOADED","loadScript","src","options","isScriptLoaded","promise","Promise","resolve","reject","script","document","createElement","module","type","onload","onerror","in","head","appendChild","body","useLoadScript","url","status","setStatus","useState","stringifiedOptions","JSON","stringify","useEffect","loadScriptWrapper","error"],"mappings":";AAEA,MAAMA,iBAAmD,CAAA;AAEzCC,SAAAA,WACdC,KACAC,SACkB;AAClB,QAAMC,iBAAmCJ,eAAeE;AAExD,MAAIE,gBAAgB;AACXA,WAAAA;AAAAA,EACR;AAED,QAAMC,UAAU,IAAIC,QAAiB,CAACC,SAASC,WAAW;AAClDC,UAAAA,SAASC,SAASC,cAAc,QAAvB;AACf,QAAIR,mCAASS,QAAQ;AACnBH,aAAOI,OAAO;AAAA,IAAA,OACT;AACLJ,aAAOI,OAAO;AAAA,IACf;AACDJ,WAAOP,MAAMA;AACbO,WAAOK,SAAS,MAAM;AACpBP,cAAQ,IAAD;AAAA,IAAA;AAETE,WAAOM,UAAU,MAAM;AACrBP,aAAO,KAAD;AAAA,IAAA;AAEJL,SAAAA,mCAASa,QAAO,QAAQ;AACjBC,eAAAA,KAAKC,YAAYT,MAA1B;AAAA,IAAA,OACK;AACIU,eAAAA,KAAKD,YAAYT,MAA1B;AAAA,IACD;AAAA,EAAA,CAlBa;AAqBhBT,iBAAeE,OAAOG;AAEfA,SAAAA;AACR;AAOee,SAAAA,cACdC,KACAlB,SACa;AACb,QAAM,CAACmB,QAAQC,SAAT,IAAsBC,SAAsB,SAAd;AAC9BC,QAAAA,qBAAqBC,KAAKC,UAAUxB,OAAf;AAE3ByB,YAAU,MAAM;AACd,mBAAeC,oBAAoB;AAC7B,UAAA;AACFN,kBAAU,SAAD;AACHtB,cAAAA,WAAWoB,KAAKlB,OAAN;AAChBoB,kBAAU,MAAD;AAAA,eACFO;AACPP,kBAAU,OAAD;AAAA,MACV;AAAA,IACF;AAEgB;EAChB,GAAA,CAACF,KAAKI,oBAAoBtB,OAA1B,CAZM;AAcFmB,SAAAA;AACR;"}
1
+ {"version":3,"file":"load-script.js","sources":["../../src/load-script.tsx"],"sourcesContent":["import {useState, useEffect} from 'react';\n\nconst SCRIPTS_LOADED: Record<string, Promise<boolean>> = {};\n\nexport function loadScript(\n src: string,\n options?: {module?: boolean; in?: 'head' | 'body'}\n): Promise<boolean> {\n const isScriptLoaded: Promise<boolean> = SCRIPTS_LOADED[src];\n\n if (isScriptLoaded) {\n return isScriptLoaded;\n }\n\n const promise = new Promise<boolean>((resolve, reject) => {\n const script = document.createElement('script');\n if (options?.module) {\n script.type = 'module';\n } else {\n script.type = 'text/javascript';\n }\n script.src = src;\n script.onload = () => {\n resolve(true);\n };\n script.onerror = () => {\n reject(false);\n };\n if (options?.in === 'head') {\n document.head.appendChild(script);\n } else {\n document.body.appendChild(script);\n }\n });\n\n SCRIPTS_LOADED[src] = promise;\n\n return promise;\n}\n\ntype LoadScriptParams = Parameters<typeof loadScript>;\n\n/**\n * The `useLoadScript` hook loads an external script tag in the browser. It allows React components to lazy-load large third-party dependencies.\n */\nexport function useLoadScript(\n url: LoadScriptParams[0],\n options?: LoadScriptParams[1]\n): ScriptState {\n const [status, setStatus] = useState<ScriptState>('loading');\n const stringifiedOptions = JSON.stringify(options);\n\n useEffect(() => {\n async function loadScriptWrapper() {\n try {\n setStatus('loading');\n await loadScript(url, options);\n setStatus('done');\n } catch (error) {\n setStatus('error');\n }\n }\n\n loadScriptWrapper();\n }, [url, stringifiedOptions, options]);\n\n return status;\n}\n\ntype ScriptState = 'loading' | 'done' | 'error';\n"],"names":["SCRIPTS_LOADED","loadScript","src","options","isScriptLoaded","promise","Promise","resolve","reject","script","document","createElement","module","type","onload","onerror","in","head","appendChild","body","useLoadScript","url","status","setStatus","useState","stringifiedOptions","JSON","stringify","useEffect","loadScriptWrapper","error"],"mappings":";;;AAEA,MAAMA,iBAAmD,CAAA;AAEzCC,SAAAA,WACdC,KACAC,SACkB;AAClB,QAAMC,iBAAmCJ,eAAeE;AAExD,MAAIE,gBAAgB;AACXA,WAAAA;AAAAA,EACR;AAED,QAAMC,UAAU,IAAIC,QAAiB,CAACC,SAASC,WAAW;AAClDC,UAAAA,SAASC,SAASC,cAAc,QAAvB;AACf,QAAIR,mCAASS,QAAQ;AACnBH,aAAOI,OAAO;AAAA,IAAA,OACT;AACLJ,aAAOI,OAAO;AAAA,IACf;AACDJ,WAAOP,MAAMA;AACbO,WAAOK,SAAS,MAAM;AACpBP,cAAQ,IAAD;AAAA,IAAA;AAETE,WAAOM,UAAU,MAAM;AACrBP,aAAO,KAAD;AAAA,IAAA;AAEJL,SAAAA,mCAASa,QAAO,QAAQ;AACjBC,eAAAA,KAAKC,YAAYT,MAA1B;AAAA,IAAA,OACK;AACIU,eAAAA,KAAKD,YAAYT,MAA1B;AAAA,IACD;AAAA,EAAA,CAlBa;AAqBhBT,iBAAeE,OAAOG;AAEfA,SAAAA;AACR;AAOee,SAAAA,cACdC,KACAlB,SACa;AACb,QAAM,CAACmB,QAAQC,SAAT,IAAsBC,oBAAsB,SAAd;AAC9BC,QAAAA,qBAAqBC,KAAKC,UAAUxB,OAAf;AAE3ByB,aAAAA,UAAU,MAAM;AACd,mBAAeC,oBAAoB;AAC7B,UAAA;AACFN,kBAAU,SAAD;AACHtB,cAAAA,WAAWoB,KAAKlB,OAAN;AAChBoB,kBAAU,MAAD;AAAA,eACFO;AACPP,kBAAU,OAAD;AAAA,MACV;AAAA,IACF;AAEgB;EAChB,GAAA,CAACF,KAAKI,oBAAoBtB,OAA1B,CAZM;AAcFmB,SAAAA;AACR;;;"}
@@ -1,6 +1,4 @@
1
- "use strict";
2
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
- const require$$0 = require("react");
1
+ import { useState, useEffect } from "react";
4
2
  const SCRIPTS_LOADED = {};
5
3
  function loadScript(src, options) {
6
4
  const isScriptLoaded = SCRIPTS_LOADED[src];
@@ -31,9 +29,9 @@ function loadScript(src, options) {
31
29
  return promise;
32
30
  }
33
31
  function useLoadScript(url, options) {
34
- const [status, setStatus] = require$$0.useState("loading");
32
+ const [status, setStatus] = useState("loading");
35
33
  const stringifiedOptions = JSON.stringify(options);
36
- require$$0.useEffect(() => {
34
+ useEffect(() => {
37
35
  async function loadScriptWrapper() {
38
36
  try {
39
37
  setStatus("loading");
@@ -47,6 +45,8 @@ function useLoadScript(url, options) {
47
45
  }, [url, stringifiedOptions, options]);
48
46
  return status;
49
47
  }
50
- exports.loadScript = loadScript;
51
- exports.useLoadScript = useLoadScript;
52
- //# sourceMappingURL=load-script.cjs.map
48
+ export {
49
+ loadScript,
50
+ useLoadScript
51
+ };
52
+ //# sourceMappingURL=load-script.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"load-script.cjs","sources":["../../src/load-script.tsx"],"sourcesContent":["import {useState, useEffect} from 'react';\n\nconst SCRIPTS_LOADED: Record<string, Promise<boolean>> = {};\n\nexport function loadScript(\n src: string,\n options?: {module?: boolean; in?: 'head' | 'body'}\n): Promise<boolean> {\n const isScriptLoaded: Promise<boolean> = SCRIPTS_LOADED[src];\n\n if (isScriptLoaded) {\n return isScriptLoaded;\n }\n\n const promise = new Promise<boolean>((resolve, reject) => {\n const script = document.createElement('script');\n if (options?.module) {\n script.type = 'module';\n } else {\n script.type = 'text/javascript';\n }\n script.src = src;\n script.onload = () => {\n resolve(true);\n };\n script.onerror = () => {\n reject(false);\n };\n if (options?.in === 'head') {\n document.head.appendChild(script);\n } else {\n document.body.appendChild(script);\n }\n });\n\n SCRIPTS_LOADED[src] = promise;\n\n return promise;\n}\n\ntype LoadScriptParams = Parameters<typeof loadScript>;\n\n/**\n * The `useLoadScript` hook loads an external script tag in the browser. It allows React components to lazy-load large third-party dependencies.\n */\nexport function useLoadScript(\n url: LoadScriptParams[0],\n options?: LoadScriptParams[1]\n): ScriptState {\n const [status, setStatus] = useState<ScriptState>('loading');\n const stringifiedOptions = JSON.stringify(options);\n\n useEffect(() => {\n async function loadScriptWrapper() {\n try {\n setStatus('loading');\n await loadScript(url, options);\n setStatus('done');\n } catch (error) {\n setStatus('error');\n }\n }\n\n loadScriptWrapper();\n }, [url, stringifiedOptions, options]);\n\n return status;\n}\n\ntype ScriptState = 'loading' | 'done' | 'error';\n"],"names":["SCRIPTS_LOADED","loadScript","src","options","isScriptLoaded","promise","Promise","resolve","reject","script","document","createElement","module","type","onload","onerror","in","head","appendChild","body","useLoadScript","url","status","setStatus","useState","stringifiedOptions","JSON","stringify","useEffect","loadScriptWrapper","error"],"mappings":";;;AAEA,MAAMA,iBAAmD,CAAA;AAEzCC,SAAAA,WACdC,KACAC,SACkB;AAClB,QAAMC,iBAAmCJ,eAAeE;AAExD,MAAIE,gBAAgB;AACXA,WAAAA;AAAAA,EACR;AAED,QAAMC,UAAU,IAAIC,QAAiB,CAACC,SAASC,WAAW;AAClDC,UAAAA,SAASC,SAASC,cAAc,QAAvB;AACf,QAAIR,mCAASS,QAAQ;AACnBH,aAAOI,OAAO;AAAA,IAAA,OACT;AACLJ,aAAOI,OAAO;AAAA,IACf;AACDJ,WAAOP,MAAMA;AACbO,WAAOK,SAAS,MAAM;AACpBP,cAAQ,IAAD;AAAA,IAAA;AAETE,WAAOM,UAAU,MAAM;AACrBP,aAAO,KAAD;AAAA,IAAA;AAEJL,SAAAA,mCAASa,QAAO,QAAQ;AACjBC,eAAAA,KAAKC,YAAYT,MAA1B;AAAA,IAAA,OACK;AACIU,eAAAA,KAAKD,YAAYT,MAA1B;AAAA,IACD;AAAA,EAAA,CAlBa;AAqBhBT,iBAAeE,OAAOG;AAEfA,SAAAA;AACR;AAOee,SAAAA,cACdC,KACAlB,SACa;AACb,QAAM,CAACmB,QAAQC,SAAT,IAAsBC,oBAAsB,SAAd;AAC9BC,QAAAA,qBAAqBC,KAAKC,UAAUxB,OAAf;AAE3ByB,aAAAA,UAAU,MAAM;AACd,mBAAeC,oBAAoB;AAC7B,UAAA;AACFN,kBAAU,SAAD;AACHtB,cAAAA,WAAWoB,KAAKlB,OAAN;AAChBoB,kBAAU,MAAD;AAAA,eACFO;AACPP,kBAAU,OAAD;AAAA,MACV;AAAA,IACF;AAEgB;EAChB,GAAA,CAACF,KAAKI,oBAAoBtB,OAA1B,CAZM;AAcFmB,SAAAA;AACR;;;"}
1
+ {"version":3,"file":"load-script.mjs","sources":["../../src/load-script.tsx"],"sourcesContent":["import {useState, useEffect} from 'react';\n\nconst SCRIPTS_LOADED: Record<string, Promise<boolean>> = {};\n\nexport function loadScript(\n src: string,\n options?: {module?: boolean; in?: 'head' | 'body'}\n): Promise<boolean> {\n const isScriptLoaded: Promise<boolean> = SCRIPTS_LOADED[src];\n\n if (isScriptLoaded) {\n return isScriptLoaded;\n }\n\n const promise = new Promise<boolean>((resolve, reject) => {\n const script = document.createElement('script');\n if (options?.module) {\n script.type = 'module';\n } else {\n script.type = 'text/javascript';\n }\n script.src = src;\n script.onload = () => {\n resolve(true);\n };\n script.onerror = () => {\n reject(false);\n };\n if (options?.in === 'head') {\n document.head.appendChild(script);\n } else {\n document.body.appendChild(script);\n }\n });\n\n SCRIPTS_LOADED[src] = promise;\n\n return promise;\n}\n\ntype LoadScriptParams = Parameters<typeof loadScript>;\n\n/**\n * The `useLoadScript` hook loads an external script tag in the browser. It allows React components to lazy-load large third-party dependencies.\n */\nexport function useLoadScript(\n url: LoadScriptParams[0],\n options?: LoadScriptParams[1]\n): ScriptState {\n const [status, setStatus] = useState<ScriptState>('loading');\n const stringifiedOptions = JSON.stringify(options);\n\n useEffect(() => {\n async function loadScriptWrapper() {\n try {\n setStatus('loading');\n await loadScript(url, options);\n setStatus('done');\n } catch (error) {\n setStatus('error');\n }\n }\n\n loadScriptWrapper();\n }, [url, stringifiedOptions, options]);\n\n return status;\n}\n\ntype ScriptState = 'loading' | 'done' | 'error';\n"],"names":["SCRIPTS_LOADED","loadScript","src","options","isScriptLoaded","promise","Promise","resolve","reject","script","document","createElement","module","type","onload","onerror","in","head","appendChild","body","useLoadScript","url","status","setStatus","useState","stringifiedOptions","JSON","stringify","useEffect","loadScriptWrapper","error"],"mappings":";AAEA,MAAMA,iBAAmD,CAAA;AAEzCC,SAAAA,WACdC,KACAC,SACkB;AAClB,QAAMC,iBAAmCJ,eAAeE;AAExD,MAAIE,gBAAgB;AACXA,WAAAA;AAAAA,EACR;AAED,QAAMC,UAAU,IAAIC,QAAiB,CAACC,SAASC,WAAW;AAClDC,UAAAA,SAASC,SAASC,cAAc,QAAvB;AACf,QAAIR,mCAASS,QAAQ;AACnBH,aAAOI,OAAO;AAAA,IAAA,OACT;AACLJ,aAAOI,OAAO;AAAA,IACf;AACDJ,WAAOP,MAAMA;AACbO,WAAOK,SAAS,MAAM;AACpBP,cAAQ,IAAD;AAAA,IAAA;AAETE,WAAOM,UAAU,MAAM;AACrBP,aAAO,KAAD;AAAA,IAAA;AAEJL,SAAAA,mCAASa,QAAO,QAAQ;AACjBC,eAAAA,KAAKC,YAAYT,MAA1B;AAAA,IAAA,OACK;AACIU,eAAAA,KAAKD,YAAYT,MAA1B;AAAA,IACD;AAAA,EAAA,CAlBa;AAqBhBT,iBAAeE,OAAOG;AAEfA,SAAAA;AACR;AAOee,SAAAA,cACdC,KACAlB,SACa;AACb,QAAM,CAACmB,QAAQC,SAAT,IAAsBC,SAAsB,SAAd;AAC9BC,QAAAA,qBAAqBC,KAAKC,UAAUxB,OAAf;AAE3ByB,YAAU,MAAM;AACd,mBAAeC,oBAAoB;AAC7B,UAAA;AACFN,kBAAU,SAAD;AACHtB,cAAAA,WAAWoB,KAAKlB,OAAN;AAChBoB,kBAAU,MAAD;AAAA,eACFO;AACPP,kBAAU,OAAD;AAAA,MACV;AAAA,IACF;AAEgB;EAChB,GAAA,CAACF,KAAKI,oBAAoBtB,OAA1B,CAZM;AAcFmB,SAAAA;AACR;"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const Metafield = require("./Metafield.js");
4
+ const flattenConnection = require("./flatten-connection.js");
5
+ function metafieldParser(metafield) {
6
+ var _a, _b, _c, _d;
7
+ if (!metafield.type) {
8
+ const noTypeError = `metafieldParser(): The 'type' field is required in order to parse the Metafield.`;
9
+ {
10
+ throw new Error(noTypeError);
11
+ }
12
+ }
13
+ switch (metafield.type) {
14
+ case "boolean":
15
+ return {
16
+ ...metafield,
17
+ parsedValue: metafield.value === "true"
18
+ };
19
+ case "collection_reference":
20
+ case "file_reference":
21
+ case "page_reference":
22
+ case "product_reference":
23
+ case "variant_reference":
24
+ return {
25
+ ...metafield,
26
+ parsedValue: metafield.reference
27
+ };
28
+ case "color":
29
+ case "multi_line_text_field":
30
+ case "single_line_text_field":
31
+ case "url":
32
+ return {
33
+ ...metafield,
34
+ parsedValue: metafield.value
35
+ };
36
+ case "dimension":
37
+ case "money":
38
+ case "json":
39
+ case "rating":
40
+ case "volume":
41
+ case "weight":
42
+ case "list.color":
43
+ case "list.dimension":
44
+ case "list.number_integer":
45
+ case "list.number_decimal":
46
+ case "list.rating":
47
+ case "list.single_line_text_field":
48
+ case "list.url":
49
+ case "list.volume":
50
+ case "list.weight": {
51
+ let parsedValue = null;
52
+ try {
53
+ parsedValue = Metafield.parseJSON((_a = metafield.value) != null ? _a : "");
54
+ } catch (err) {
55
+ const parseError = `metafieldParser(): attempted to JSON.parse the 'metafield.value' property, but failed.`;
56
+ {
57
+ throw new Error(parseError);
58
+ }
59
+ }
60
+ return {
61
+ ...metafield,
62
+ parsedValue
63
+ };
64
+ }
65
+ case "date":
66
+ case "date_time":
67
+ return {
68
+ ...metafield,
69
+ parsedValue: new Date((_b = metafield.value) != null ? _b : "")
70
+ };
71
+ case "list.date":
72
+ case "list.date_time": {
73
+ const jsonParseValue = Metafield.parseJSON((_c = metafield == null ? void 0 : metafield.value) != null ? _c : "");
74
+ return {
75
+ ...metafield,
76
+ parsedValue: jsonParseValue.map((dateString) => new Date(dateString))
77
+ };
78
+ }
79
+ case "number_decimal":
80
+ case "number_integer":
81
+ return {
82
+ ...metafield,
83
+ parsedValue: Number(metafield.value)
84
+ };
85
+ case "list.collection_reference":
86
+ case "list.file_reference":
87
+ case "list.page_reference":
88
+ case "list.product_reference":
89
+ case "list.variant_reference":
90
+ return {
91
+ ...metafield,
92
+ parsedValue: flattenConnection.flattenConnection((_d = metafield.references) != null ? _d : void 0)
93
+ };
94
+ default: {
95
+ const typeNotFoundError = `metafieldParser(): the 'metafield.type' you passed in is not supported. Your type: "${metafield.type}". If you believe this is an error, please open an issue on GitHub.`;
96
+ {
97
+ throw new Error(typeNotFoundError);
98
+ }
99
+ }
100
+ }
101
+ }
102
+ exports.metafieldParser = metafieldParser;
103
+ //# sourceMappingURL=metafield-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metafield-parser.js","sources":["../../src/metafield-parser.ts"],"sourcesContent":["import type {\n Collection,\n GenericFile,\n Metafield as MetafieldBaseType,\n MoneyV2,\n Page,\n Product,\n ProductVariant,\n} from './storefront-api-types.js';\nimport type {PartialDeep, Simplify} from 'type-fest';\nimport {parseJSON} from './Metafield.js';\nimport {flattenConnection} from './flatten-connection.js';\n\n/**\n * A temporary function that will be renamed to `parseMetafield()` in a future release.\n *\n * A function that uses `metafield.type` to parse the Metafield's `value` or `reference` or `references` (depending on the `type`) and put it in `metafield.parsedValue`\n *\n * TypeScript developers can use the type `ParsedMetafields` from this package to get the returned object's type correct. For example:\n *\n * ```\n * metafieldParser<ParsedMetafields['boolean']>({type: 'boolean', value: 'false'}\n * ```\n */\nexport function metafieldParser<ReturnGeneric>(\n metafield: PartialDeep<MetafieldBaseType, {recurseIntoArrays: true}>\n): ReturnGeneric {\n if (!metafield.type) {\n const noTypeError = `metafieldParser(): The 'type' field is required in order to parse the Metafield.`;\n if (__HYDROGEN_DEV__) {\n throw new Error(noTypeError);\n } else {\n console.error(`${noTypeError} Returning 'parsedValue' of 'null'`);\n return {\n ...metafield,\n parsedValue: null,\n } as ReturnGeneric;\n }\n }\n\n switch (metafield.type) {\n case 'boolean':\n return {\n ...metafield,\n parsedValue: metafield.value === 'true',\n } as ReturnGeneric;\n\n case 'collection_reference':\n case 'file_reference':\n case 'page_reference':\n case 'product_reference':\n case 'variant_reference':\n return {\n ...metafield,\n parsedValue: metafield.reference,\n } as ReturnGeneric;\n\n case 'color':\n case 'multi_line_text_field':\n case 'single_line_text_field':\n case 'url':\n return {\n ...metafield,\n parsedValue: metafield.value,\n } as ReturnGeneric;\n\n // TODO: 'money' should probably be parsed even further to like `useMoney()`, but that logic needs to be extracted first so it's not a hook\n case 'dimension':\n case 'money':\n case 'json':\n case 'rating':\n case 'volume':\n case 'weight':\n case 'list.color':\n case 'list.dimension':\n case 'list.number_integer':\n case 'list.number_decimal':\n case 'list.rating':\n case 'list.single_line_text_field':\n case 'list.url':\n case 'list.volume':\n case 'list.weight': {\n let parsedValue = null;\n try {\n parsedValue = parseJSON(metafield.value ?? '');\n } catch (err) {\n const parseError = `metafieldParser(): attempted to JSON.parse the 'metafield.value' property, but failed.`;\n if (__HYDROGEN_DEV__) {\n throw new Error(parseError);\n } else {\n console.error(`${parseError} Returning 'null' for 'parsedValue'`);\n }\n parsedValue = null;\n }\n return {\n ...metafield,\n parsedValue,\n } as ReturnGeneric;\n }\n\n case 'date':\n case 'date_time':\n return {\n ...metafield,\n parsedValue: new Date(metafield.value ?? ''),\n } as ReturnGeneric;\n\n case 'list.date':\n case 'list.date_time': {\n const jsonParseValue = parseJSON(metafield?.value ?? '') as string[];\n return {\n ...metafield,\n parsedValue: jsonParseValue.map((dateString) => new Date(dateString)),\n } as ReturnGeneric;\n }\n\n case 'number_decimal':\n case 'number_integer':\n return {\n ...metafield,\n parsedValue: Number(metafield.value),\n } as ReturnGeneric;\n\n case 'list.collection_reference':\n case 'list.file_reference':\n case 'list.page_reference':\n case 'list.product_reference':\n case 'list.variant_reference':\n return {\n ...metafield,\n parsedValue: flattenConnection(metafield.references ?? undefined),\n } as ReturnGeneric;\n\n default: {\n const typeNotFoundError = `metafieldParser(): the 'metafield.type' you passed in is not supported. Your type: \"${metafield.type}\". If you believe this is an error, please open an issue on GitHub.`;\n if (__HYDROGEN_DEV__) {\n throw new Error(typeNotFoundError);\n } else {\n console.error(\n `${typeNotFoundError} Returning 'parsedValue' of 'null'`\n );\n return {\n ...metafield,\n parsedValue: null,\n } as ReturnGeneric;\n }\n }\n }\n}\n\n// taken from https://shopify.dev/apps/metafields/types\nexport const allMetafieldTypesArray = [\n 'boolean',\n 'collection_reference',\n 'color',\n 'date',\n 'date_time',\n 'dimension',\n 'file_reference',\n 'json',\n 'money',\n 'multi_line_text_field',\n 'number_decimal',\n 'number_integer',\n 'page_reference',\n 'product_reference',\n 'rating',\n 'single_line_text_field',\n 'url',\n 'variant_reference',\n 'volume',\n 'weight',\n // list metafields\n 'list.collection_reference',\n 'list.color',\n 'list.date',\n 'list.date_time',\n 'list.dimension',\n 'list.file_reference',\n 'list.number_integer',\n 'list.number_decimal',\n 'list.page_reference',\n 'list.product_reference',\n 'list.rating',\n 'list.single_line_text_field',\n 'list.url',\n 'list.variant_reference',\n 'list.volume',\n 'list.weight',\n] as const;\n\n/** A union of all the supported `metafield.type`s */\nexport type MetafieldTypeTypes = typeof allMetafieldTypesArray[number];\n\n/**\n * A mapping of a Metafield's `type` to the TypeScript type that is returned from `metafieldParser()`\n * For example, when using `metafieldParser()`, the type will be correctly returned when used like the following:\n *\n * ```\n * const parsedMetafield = metafieldParser<ParsedMetafields['boolean']>(metafield);`\n * ```\n * `parsedMetafield.parsedValue`'s type is now `boolean`\n */\nexport type ParsedMetafields<ExtraTypeGeneric = void> = {\n /** A Metafield that's been parsed, with a `parsedValue` of `boolean` */\n boolean: Simplify<BooleanParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of a `Collection` object (as defined by the Storefront API) */\n collection_reference: Simplify<CollectionParsedRefMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of type `string` */\n color: Simplify<ColorParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of type `Date` */\n date: Simplify<DatesParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of type `Date` */\n date_time: Simplify<DatesParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of type `Measurement` */\n dimension: Simplify<MeasurementParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of a `GenericFile` object (as defined by the Storefront API) */\n file_reference: Simplify<FileRefParsedMetafield>;\n /**\n * A Metafield that's been parsed, with a `parsedValue` of type `unknown`, unless you pass in the type as a generic. For example:\n *\n * ```\n * ParsedMetafields<MyJsonType>['json']\n * ```\n */\n json: Simplify<JsonParsedMetafield<ExtraTypeGeneric>>;\n /** A Metafield that's been parsed, with a `parsedValue` of type `Money` */\n money: Simplify<MoneyParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of type `string` */\n multi_line_text_field: Simplify<TextParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of type `number` */\n number_decimal: Simplify<NumberParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of type `number` */\n number_integer: Simplify<NumberParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of a `Page` object (as defined by the Storefront API) */\n page_reference: Simplify<PageParsedRefMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of a `Product` object (as defined by the Storefront API) */\n product_reference: Simplify<ProductParsedRefMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of type `Rating` */\n rating: Simplify<RatingParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of type `string` */\n single_line_text_field: Simplify<TextParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of type `string` */\n url: Simplify<TextParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of a `ProductVariant` object (as defined by the Storefront API) */\n variant_reference: Simplify<VariantParsedRefMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of type `Measurement` */\n volume: Simplify<MeasurementParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of type `Measurement` */\n weight: Simplify<MeasurementParsedMetafield>;\n // list metafields\n /** A Metafield that's been parsed, with a `parsedValue` of an array of `Collection` objects (as defined by the Storefront API) */\n 'list.collection_reference': Simplify<CollectionListParsedRefMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of an array of strings */\n 'list.color': Simplify<ColorListParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of an array of Date objects */\n 'list.date': Simplify<DatesListParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of an array of Date objects */\n 'list.date_time': Simplify<DatesListParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of an array of `Measurement` objects */\n 'list.dimension': Simplify<MeasurementListParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of an array of `GenericFile` objects (as defined by the Storefront API) */\n 'list.file_reference': Simplify<FileListParsedRefMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of an array of numbers */\n 'list.number_integer': Simplify<NumberListParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of an array of numbers */\n 'list.number_decimal': Simplify<NumberListParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of an array of `Page` objects (as defined by the Storefront API) */\n 'list.page_reference': Simplify<PageListParsedRefMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of an array of `Product` objects (as defined by the Storefront API) */\n 'list.product_reference': Simplify<ProductListParsedRefMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of an array of `Rating`s */\n 'list.rating': Simplify<RatingListParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of an array of strings */\n 'list.single_line_text_field': Simplify<TextListParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of an array of strings */\n 'list.url': Simplify<TextListParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of an array of `ProductVariant` objects (as defined by the Storefront API) */\n 'list.variant_reference': Simplify<VariantListParsedRefMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of an array of `Measurement`s */\n 'list.volume': Simplify<MeasurementListParsedMetafield>;\n /** A Metafield that's been parsed, with a `parsedValue` of an array of `Measurement`s */\n 'list.weight': Simplify<MeasurementListParsedMetafield>;\n};\n\ninterface ParsedBase extends MetafieldBaseType {\n type: MetafieldTypeTypes;\n parsedValue: unknown;\n}\n\ninterface BooleanParsedMetafield extends ParsedBase {\n type: 'boolean';\n parsedValue: boolean | null;\n}\ntype CollectionParsedRefMetafield = MetafieldBaseType & {\n type: 'collection_reference';\n parsedValue: Collection | null;\n};\ntype ColorParsedMetafield = MetafieldBaseType & {\n type: 'color';\n parsedValue: string | null;\n};\ntype DatesParsedMetafield = MetafieldBaseType & {\n type: 'date' | 'date_time';\n parsedValue: Date | null;\n};\n\ntype MeasurementParsedMetafield = MetafieldBaseType & {\n type: 'dimension' | 'weight' | 'volume';\n parsedValue: Measurement | null;\n};\n\ntype FileRefParsedMetafield = MetafieldBaseType & {\n type: 'file_reference';\n parsedValue: GenericFile | null;\n};\n\ntype JsonParsedMetafield<JsonTypeGeneric = void> = MetafieldBaseType & {\n type: 'json';\n parsedValue: JsonTypeGeneric extends void ? unknown : JsonTypeGeneric | null;\n};\n\ntype MoneyParsedMetafield = MetafieldBaseType & {\n type: 'money';\n parsedValue: MoneyV2 | null;\n};\n\ntype TextParsedMetafield = MetafieldBaseType & {\n type: 'single_line_text_field' | 'multi_line_text_field' | 'url';\n parsedValue: string | null;\n};\n\ntype NumberParsedMetafield = MetafieldBaseType & {\n type: 'number_decimal' | 'number_integer';\n parsedValue: number | null;\n};\n\ntype PageParsedRefMetafield = MetafieldBaseType & {\n type: 'page_reference';\n parsedValue: Page | null;\n};\n\ntype ProductParsedRefMetafield = MetafieldBaseType & {\n type: 'product_reference';\n parsedValue: Product | null;\n};\n\ntype RatingParsedMetafield = MetafieldBaseType & {\n type: 'rating';\n parsedValue: Rating | null;\n};\n\ntype VariantParsedRefMetafield = MetafieldBaseType & {\n type: 'variant_reference';\n parsedValue: ProductVariant | null;\n};\n\ntype CollectionListParsedRefMetafield = MetafieldBaseType & {\n type: 'list.collection_reference';\n parsedValue: Array<Collection> | null;\n};\n\ntype ColorListParsedMetafield = MetafieldBaseType & {\n type: 'list.color';\n parsedValue: Array<string> | null;\n};\n\ntype DatesListParsedMetafield = MetafieldBaseType & {\n type: 'list.date' | 'list.date_time';\n parsedValue: Array<Date> | null;\n};\n\ntype MeasurementListParsedMetafield = MetafieldBaseType & {\n type: 'list.dimension' | 'list.weight' | 'list.volume';\n parsedValue: Array<Measurement> | null;\n};\n\ntype FileListParsedRefMetafield = MetafieldBaseType & {\n type: 'list.file_reference';\n parsedValue: Array<GenericFile> | null;\n};\n\ntype TextListParsedMetafield = MetafieldBaseType & {\n type: 'list.single_line_text_field' | 'list.url';\n parsedValue: Array<string> | null;\n};\n\ntype NumberListParsedMetafield = MetafieldBaseType & {\n type: 'list.number_decimal' | 'list.number_integer';\n parsedValue: Array<number> | null;\n};\n\ntype PageListParsedRefMetafield = MetafieldBaseType & {\n type: 'list.page_reference';\n parsedValue: Array<Page> | null;\n};\n\ntype ProductListParsedRefMetafield = MetafieldBaseType & {\n type: 'list.product_reference';\n parsedValue: Array<Product> | null;\n};\n\ntype RatingListParsedMetafield = MetafieldBaseType & {\n type: 'list.rating';\n parsedValue: Array<Rating> | null;\n};\n\ntype VariantListParsedRefMetafield = MetafieldBaseType & {\n type: 'list.variant_reference';\n parsedValue: Array<ProductVariant> | null;\n};\n\nexport type Measurement = {\n unit: string;\n value: number;\n};\n\nexport interface Rating {\n value: number;\n scale_min: number;\n scale_max: number;\n}\n"],"names":["parseJSON","flattenConnection"],"mappings":";;;;AAwBO,SAAS,gBACd,WACe;;AACX,MAAA,CAAC,UAAU,MAAM;AACnB,UAAM,cAAc;AACE;AACd,YAAA,IAAI,MAAM,WAAW;AAAA,IAO7B;AAAA,EACF;AAEA,UAAQ,UAAU,MAAM;AAAA,IACtB,KAAK;AACI,aAAA;AAAA,QACL,GAAG;AAAA,QACH,aAAa,UAAU,UAAU;AAAA,MAAA;AAAA,IAGrC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACI,aAAA;AAAA,QACL,GAAG;AAAA,QACH,aAAa,UAAU;AAAA,MAAA;AAAA,IAG3B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACI,aAAA;AAAA,QACL,GAAG;AAAA,QACH,aAAa,UAAU;AAAA,MAAA;AAAA,IAI3B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,eAAe;AAClB,UAAI,cAAc;AACd,UAAA;AACY,sBAAAA,UAAAA,WAAU,eAAU,UAAV,YAAmB,EAAE;AAAA,eACtC;AACP,cAAM,aAAa;AACG;AACd,gBAAA,IAAI,MAAM,UAAU;AAAA,QAG5B;AAAA,MAEF;AACO,aAAA;AAAA,QACL,GAAG;AAAA,QACH;AAAA,MAAA;AAAA,IAEJ;AAAA,IAEA,KAAK;AAAA,IACL,KAAK;AACI,aAAA;AAAA,QACL,GAAG;AAAA,QACH,aAAa,IAAI,MAAK,eAAU,UAAV,YAAmB,EAAE;AAAA,MAAA;AAAA,IAG/C,KAAK;AAAA,IACL,KAAK,kBAAkB;AACrB,YAAM,iBAAiBA,UAAA,WAAU,4CAAW,UAAX,YAAoB,EAAE;AAChD,aAAA;AAAA,QACL,GAAG;AAAA,QACH,aAAa,eAAe,IAAI,CAAC,eAAe,IAAI,KAAK,UAAU,CAAC;AAAA,MAAA;AAAA,IAExE;AAAA,IAEA,KAAK;AAAA,IACL,KAAK;AACI,aAAA;AAAA,QACL,GAAG;AAAA,QACH,aAAa,OAAO,UAAU,KAAK;AAAA,MAAA;AAAA,IAGvC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACI,aAAA;AAAA,QACL,GAAG;AAAA,QACH,aAAaC,kBAAAA,mBAAkB,eAAU,eAAV,YAAwB,MAAS;AAAA,MAAA;AAAA,IAGpE,SAAS;AACD,YAAA,oBAAoB,uFAAuF,UAAU;AACrG;AACd,cAAA,IAAI,MAAM,iBAAiB;AAAA,MASnC;AAAA,IACF;AAAA,EACF;AACF;;"}
@@ -0,0 +1,103 @@
1
+ import { parseJSON } from "./Metafield.mjs";
2
+ import { flattenConnection } from "./flatten-connection.mjs";
3
+ function metafieldParser(metafield) {
4
+ var _a, _b, _c, _d;
5
+ if (!metafield.type) {
6
+ const noTypeError = `metafieldParser(): The 'type' field is required in order to parse the Metafield.`;
7
+ {
8
+ throw new Error(noTypeError);
9
+ }
10
+ }
11
+ switch (metafield.type) {
12
+ case "boolean":
13
+ return {
14
+ ...metafield,
15
+ parsedValue: metafield.value === "true"
16
+ };
17
+ case "collection_reference":
18
+ case "file_reference":
19
+ case "page_reference":
20
+ case "product_reference":
21
+ case "variant_reference":
22
+ return {
23
+ ...metafield,
24
+ parsedValue: metafield.reference
25
+ };
26
+ case "color":
27
+ case "multi_line_text_field":
28
+ case "single_line_text_field":
29
+ case "url":
30
+ return {
31
+ ...metafield,
32
+ parsedValue: metafield.value
33
+ };
34
+ case "dimension":
35
+ case "money":
36
+ case "json":
37
+ case "rating":
38
+ case "volume":
39
+ case "weight":
40
+ case "list.color":
41
+ case "list.dimension":
42
+ case "list.number_integer":
43
+ case "list.number_decimal":
44
+ case "list.rating":
45
+ case "list.single_line_text_field":
46
+ case "list.url":
47
+ case "list.volume":
48
+ case "list.weight": {
49
+ let parsedValue = null;
50
+ try {
51
+ parsedValue = parseJSON((_a = metafield.value) != null ? _a : "");
52
+ } catch (err) {
53
+ const parseError = `metafieldParser(): attempted to JSON.parse the 'metafield.value' property, but failed.`;
54
+ {
55
+ throw new Error(parseError);
56
+ }
57
+ }
58
+ return {
59
+ ...metafield,
60
+ parsedValue
61
+ };
62
+ }
63
+ case "date":
64
+ case "date_time":
65
+ return {
66
+ ...metafield,
67
+ parsedValue: new Date((_b = metafield.value) != null ? _b : "")
68
+ };
69
+ case "list.date":
70
+ case "list.date_time": {
71
+ const jsonParseValue = parseJSON((_c = metafield == null ? void 0 : metafield.value) != null ? _c : "");
72
+ return {
73
+ ...metafield,
74
+ parsedValue: jsonParseValue.map((dateString) => new Date(dateString))
75
+ };
76
+ }
77
+ case "number_decimal":
78
+ case "number_integer":
79
+ return {
80
+ ...metafield,
81
+ parsedValue: Number(metafield.value)
82
+ };
83
+ case "list.collection_reference":
84
+ case "list.file_reference":
85
+ case "list.page_reference":
86
+ case "list.product_reference":
87
+ case "list.variant_reference":
88
+ return {
89
+ ...metafield,
90
+ parsedValue: flattenConnection((_d = metafield.references) != null ? _d : void 0)
91
+ };
92
+ default: {
93
+ const typeNotFoundError = `metafieldParser(): the 'metafield.type' you passed in is not supported. Your type: "${metafield.type}". If you believe this is an error, please open an issue on GitHub.`;
94
+ {
95
+ throw new Error(typeNotFoundError);
96
+ }
97
+ }
98
+ }
99
+ }
100
+ export {
101
+ metafieldParser
102
+ };
103
+ //# sourceMappingURL=metafield-parser.mjs.map