@shopify/hydrogen-react 2026.4.1 → 2026.4.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 (595) hide show
  1. package/dist/browser-dev/AddToCartButton.mjs +60 -71
  2. package/dist/browser-dev/AddToCartButton.mjs.map +1 -1
  3. package/dist/browser-dev/BaseButton.mjs +20 -26
  4. package/dist/browser-dev/BaseButton.mjs.map +1 -1
  5. package/dist/browser-dev/BuyNowButton.mjs +40 -45
  6. package/dist/browser-dev/BuyNowButton.mjs.map +1 -1
  7. package/dist/browser-dev/CartCheckoutButton.mjs +28 -23
  8. package/dist/browser-dev/CartCheckoutButton.mjs.map +1 -1
  9. package/dist/browser-dev/CartCost.mjs +26 -22
  10. package/dist/browser-dev/CartCost.mjs.map +1 -1
  11. package/dist/browser-dev/CartLineProvider.mjs +23 -18
  12. package/dist/browser-dev/CartLineProvider.mjs.map +1 -1
  13. package/dist/browser-dev/CartLineQuantity.mjs +18 -9
  14. package/dist/browser-dev/CartLineQuantity.mjs.map +1 -1
  15. package/dist/browser-dev/CartLineQuantityAdjustButton.mjs +48 -45
  16. package/dist/browser-dev/CartLineQuantityAdjustButton.mjs.map +1 -1
  17. package/dist/browser-dev/CartProvider.mjs +315 -385
  18. package/dist/browser-dev/CartProvider.mjs.map +1 -1
  19. package/dist/browser-dev/ExternalVideo.mjs +35 -47
  20. package/dist/browser-dev/ExternalVideo.mjs.map +1 -1
  21. package/dist/browser-dev/Image.mjs +335 -340
  22. package/dist/browser-dev/Image.mjs.map +1 -1
  23. package/dist/browser-dev/MediaFile.mjs +39 -61
  24. package/dist/browser-dev/MediaFile.mjs.map +1 -1
  25. package/dist/browser-dev/ModelViewer.mjs +115 -139
  26. package/dist/browser-dev/ModelViewer.mjs.map +1 -1
  27. package/dist/browser-dev/Money.mjs +53 -39
  28. package/dist/browser-dev/Money.mjs.map +1 -1
  29. package/dist/browser-dev/ProductPrice.mjs +44 -61
  30. package/dist/browser-dev/ProductPrice.mjs.map +1 -1
  31. package/dist/browser-dev/ProductProvider.mjs +147 -179
  32. package/dist/browser-dev/ProductProvider.mjs.map +1 -1
  33. package/dist/browser-dev/RichText.components.mjs +36 -46
  34. package/dist/browser-dev/RichText.components.mjs.map +1 -1
  35. package/dist/browser-dev/RichText.mjs +111 -154
  36. package/dist/browser-dev/RichText.mjs.map +1 -1
  37. package/dist/browser-dev/ShopPayButton.mjs +53 -81
  38. package/dist/browser-dev/ShopPayButton.mjs.map +1 -1
  39. package/dist/browser-dev/ShopifyProvider.mjs +71 -84
  40. package/dist/browser-dev/ShopifyProvider.mjs.map +1 -1
  41. package/dist/browser-dev/Video.mjs +35 -52
  42. package/dist/browser-dev/Video.mjs.map +1 -1
  43. package/dist/browser-dev/analytics-constants.mjs +41 -43
  44. package/dist/browser-dev/analytics-constants.mjs.map +1 -1
  45. package/dist/browser-dev/analytics-schema-custom-storefront-customer-tracking.mjs +127 -214
  46. package/dist/browser-dev/analytics-schema-custom-storefront-customer-tracking.mjs.map +1 -1
  47. package/dist/browser-dev/analytics-schema-trekkie-storefront-page-view.mjs +39 -50
  48. package/dist/browser-dev/analytics-schema-trekkie-storefront-page-view.mjs.map +1 -1
  49. package/dist/browser-dev/analytics-utils.mjs +78 -56
  50. package/dist/browser-dev/analytics-utils.mjs.map +1 -1
  51. package/dist/browser-dev/analytics.mjs +112 -155
  52. package/dist/browser-dev/analytics.mjs.map +1 -1
  53. package/dist/browser-dev/cart-constants.mjs +11 -15
  54. package/dist/browser-dev/cart-constants.mjs.map +1 -1
  55. package/dist/browser-dev/cart-hooks.mjs +42 -57
  56. package/dist/browser-dev/cart-hooks.mjs.map +1 -1
  57. package/dist/browser-dev/cart-queries.mjs +28 -66
  58. package/dist/browser-dev/cart-queries.mjs.map +1 -1
  59. package/dist/browser-dev/codegen.helpers.mjs +31 -20
  60. package/dist/browser-dev/codegen.helpers.mjs.map +1 -1
  61. package/dist/browser-dev/cookies-utils.mjs +44 -42
  62. package/dist/browser-dev/cookies-utils.mjs.map +1 -1
  63. package/dist/browser-dev/flatten-connection.mjs +23 -29
  64. package/dist/browser-dev/flatten-connection.mjs.map +1 -1
  65. package/dist/browser-dev/getProductOptions.mjs +248 -226
  66. package/dist/browser-dev/getProductOptions.mjs.map +1 -1
  67. package/dist/browser-dev/index.mjs +15 -70
  68. package/dist/browser-dev/load-script.mjs +38 -49
  69. package/dist/browser-dev/load-script.mjs.map +1 -1
  70. package/dist/browser-dev/node_modules/.pnpm/@xstate_fsm@2.0.0/node_modules/@xstate/fsm/es/index.mjs +175 -123
  71. package/dist/browser-dev/node_modules/.pnpm/@xstate_fsm@2.0.0/node_modules/@xstate/fsm/es/index.mjs.map +1 -1
  72. package/dist/browser-dev/optionValueDecoder.mjs +104 -86
  73. package/dist/browser-dev/optionValueDecoder.mjs.map +1 -1
  74. package/dist/browser-dev/packages/hydrogen-react/package.mjs +6 -0
  75. package/dist/browser-dev/packages/hydrogen-react/package.mjs.map +1 -0
  76. package/dist/browser-dev/parse-metafield.mjs +122 -134
  77. package/dist/browser-dev/parse-metafield.mjs.map +1 -1
  78. package/dist/browser-dev/storefront-api-constants.mjs +6 -5
  79. package/dist/browser-dev/storefront-api-constants.mjs.map +1 -1
  80. package/dist/browser-dev/storefront-client.mjs +62 -102
  81. package/dist/browser-dev/storefront-client.mjs.map +1 -1
  82. package/dist/browser-dev/tracking-utils.mjs +68 -88
  83. package/dist/browser-dev/tracking-utils.mjs.map +1 -1
  84. package/dist/browser-dev/useCartAPIStateMachine.mjs +188 -346
  85. package/dist/browser-dev/useCartAPIStateMachine.mjs.map +1 -1
  86. package/dist/browser-dev/useCartActions.mjs +197 -172
  87. package/dist/browser-dev/useCartActions.mjs.map +1 -1
  88. package/dist/browser-dev/useMachine.mjs +50 -62
  89. package/dist/browser-dev/useMachine.mjs.map +1 -1
  90. package/dist/browser-dev/useMoney.mjs +176 -154
  91. package/dist/browser-dev/useMoney.mjs.map +1 -1
  92. package/dist/browser-dev/useSelectedOptionInUrlParam.mjs +17 -27
  93. package/dist/browser-dev/useSelectedOptionInUrlParam.mjs.map +1 -1
  94. package/dist/browser-dev/useShopifyCookies.mjs +123 -138
  95. package/dist/browser-dev/useShopifyCookies.mjs.map +1 -1
  96. package/dist/browser-prod/AddToCartButton.mjs +60 -71
  97. package/dist/browser-prod/AddToCartButton.mjs.map +1 -1
  98. package/dist/browser-prod/BaseButton.mjs +20 -26
  99. package/dist/browser-prod/BaseButton.mjs.map +1 -1
  100. package/dist/browser-prod/BuyNowButton.mjs +40 -45
  101. package/dist/browser-prod/BuyNowButton.mjs.map +1 -1
  102. package/dist/browser-prod/CartCheckoutButton.mjs +28 -23
  103. package/dist/browser-prod/CartCheckoutButton.mjs.map +1 -1
  104. package/dist/browser-prod/CartCost.mjs +26 -22
  105. package/dist/browser-prod/CartCost.mjs.map +1 -1
  106. package/dist/browser-prod/CartLineProvider.mjs +23 -18
  107. package/dist/browser-prod/CartLineProvider.mjs.map +1 -1
  108. package/dist/browser-prod/CartLineQuantity.mjs +18 -9
  109. package/dist/browser-prod/CartLineQuantity.mjs.map +1 -1
  110. package/dist/browser-prod/CartLineQuantityAdjustButton.mjs +48 -45
  111. package/dist/browser-prod/CartLineQuantityAdjustButton.mjs.map +1 -1
  112. package/dist/browser-prod/CartProvider.mjs +315 -385
  113. package/dist/browser-prod/CartProvider.mjs.map +1 -1
  114. package/dist/browser-prod/ExternalVideo.mjs +35 -47
  115. package/dist/browser-prod/ExternalVideo.mjs.map +1 -1
  116. package/dist/browser-prod/Image.mjs +326 -325
  117. package/dist/browser-prod/Image.mjs.map +1 -1
  118. package/dist/browser-prod/MediaFile.mjs +44 -63
  119. package/dist/browser-prod/MediaFile.mjs.map +1 -1
  120. package/dist/browser-prod/ModelViewer.mjs +117 -135
  121. package/dist/browser-prod/ModelViewer.mjs.map +1 -1
  122. package/dist/browser-prod/Money.mjs +53 -39
  123. package/dist/browser-prod/Money.mjs.map +1 -1
  124. package/dist/browser-prod/ProductPrice.mjs +44 -61
  125. package/dist/browser-prod/ProductPrice.mjs.map +1 -1
  126. package/dist/browser-prod/ProductProvider.mjs +147 -179
  127. package/dist/browser-prod/ProductProvider.mjs.map +1 -1
  128. package/dist/browser-prod/RichText.components.mjs +36 -46
  129. package/dist/browser-prod/RichText.components.mjs.map +1 -1
  130. package/dist/browser-prod/RichText.mjs +111 -154
  131. package/dist/browser-prod/RichText.mjs.map +1 -1
  132. package/dist/browser-prod/ShopPayButton.mjs +53 -81
  133. package/dist/browser-prod/ShopPayButton.mjs.map +1 -1
  134. package/dist/browser-prod/ShopifyProvider.mjs +71 -84
  135. package/dist/browser-prod/ShopifyProvider.mjs.map +1 -1
  136. package/dist/browser-prod/Video.mjs +35 -52
  137. package/dist/browser-prod/Video.mjs.map +1 -1
  138. package/dist/browser-prod/analytics-constants.mjs +41 -43
  139. package/dist/browser-prod/analytics-constants.mjs.map +1 -1
  140. package/dist/browser-prod/analytics-schema-custom-storefront-customer-tracking.mjs +127 -214
  141. package/dist/browser-prod/analytics-schema-custom-storefront-customer-tracking.mjs.map +1 -1
  142. package/dist/browser-prod/analytics-schema-trekkie-storefront-page-view.mjs +39 -50
  143. package/dist/browser-prod/analytics-schema-trekkie-storefront-page-view.mjs.map +1 -1
  144. package/dist/browser-prod/analytics-utils.mjs +78 -56
  145. package/dist/browser-prod/analytics-utils.mjs.map +1 -1
  146. package/dist/browser-prod/analytics.mjs +111 -153
  147. package/dist/browser-prod/analytics.mjs.map +1 -1
  148. package/dist/browser-prod/cart-constants.mjs +11 -15
  149. package/dist/browser-prod/cart-constants.mjs.map +1 -1
  150. package/dist/browser-prod/cart-hooks.mjs +42 -57
  151. package/dist/browser-prod/cart-hooks.mjs.map +1 -1
  152. package/dist/browser-prod/cart-queries.mjs +28 -66
  153. package/dist/browser-prod/cart-queries.mjs.map +1 -1
  154. package/dist/browser-prod/codegen.helpers.mjs +31 -20
  155. package/dist/browser-prod/codegen.helpers.mjs.map +1 -1
  156. package/dist/browser-prod/cookies-utils.mjs +44 -42
  157. package/dist/browser-prod/cookies-utils.mjs.map +1 -1
  158. package/dist/browser-prod/flatten-connection.mjs +23 -25
  159. package/dist/browser-prod/flatten-connection.mjs.map +1 -1
  160. package/dist/browser-prod/getProductOptions.mjs +248 -226
  161. package/dist/browser-prod/getProductOptions.mjs.map +1 -1
  162. package/dist/browser-prod/index.mjs +15 -70
  163. package/dist/browser-prod/load-script.mjs +38 -49
  164. package/dist/browser-prod/load-script.mjs.map +1 -1
  165. package/dist/browser-prod/node_modules/.pnpm/@xstate_fsm@2.0.0/node_modules/@xstate/fsm/es/index.mjs +175 -123
  166. package/dist/browser-prod/node_modules/.pnpm/@xstate_fsm@2.0.0/node_modules/@xstate/fsm/es/index.mjs.map +1 -1
  167. package/dist/browser-prod/optionValueDecoder.mjs +104 -86
  168. package/dist/browser-prod/optionValueDecoder.mjs.map +1 -1
  169. package/dist/browser-prod/packages/hydrogen-react/package.mjs +6 -0
  170. package/dist/browser-prod/packages/hydrogen-react/package.mjs.map +1 -0
  171. package/dist/browser-prod/parse-metafield.mjs +134 -146
  172. package/dist/browser-prod/parse-metafield.mjs.map +1 -1
  173. package/dist/browser-prod/storefront-api-constants.mjs +6 -5
  174. package/dist/browser-prod/storefront-api-constants.mjs.map +1 -1
  175. package/dist/browser-prod/storefront-client.mjs +56 -84
  176. package/dist/browser-prod/storefront-client.mjs.map +1 -1
  177. package/dist/browser-prod/tracking-utils.mjs +68 -88
  178. package/dist/browser-prod/tracking-utils.mjs.map +1 -1
  179. package/dist/browser-prod/useCartAPIStateMachine.mjs +188 -346
  180. package/dist/browser-prod/useCartAPIStateMachine.mjs.map +1 -1
  181. package/dist/browser-prod/useCartActions.mjs +197 -172
  182. package/dist/browser-prod/useCartActions.mjs.map +1 -1
  183. package/dist/browser-prod/useMachine.mjs +50 -62
  184. package/dist/browser-prod/useMachine.mjs.map +1 -1
  185. package/dist/browser-prod/useMoney.mjs +176 -154
  186. package/dist/browser-prod/useMoney.mjs.map +1 -1
  187. package/dist/browser-prod/useSelectedOptionInUrlParam.mjs +17 -27
  188. package/dist/browser-prod/useSelectedOptionInUrlParam.mjs.map +1 -1
  189. package/dist/browser-prod/useShopifyCookies.mjs +123 -138
  190. package/dist/browser-prod/useShopifyCookies.mjs.map +1 -1
  191. package/dist/node-dev/AddToCartButton.js +64 -73
  192. package/dist/node-dev/AddToCartButton.js.map +1 -1
  193. package/dist/node-dev/AddToCartButton.mjs +60 -71
  194. package/dist/node-dev/AddToCartButton.mjs.map +1 -1
  195. package/dist/node-dev/BaseButton.js +21 -26
  196. package/dist/node-dev/BaseButton.js.map +1 -1
  197. package/dist/node-dev/BaseButton.mjs +20 -26
  198. package/dist/node-dev/BaseButton.mjs.map +1 -1
  199. package/dist/node-dev/BuyNowButton.js +42 -46
  200. package/dist/node-dev/BuyNowButton.js.map +1 -1
  201. package/dist/node-dev/BuyNowButton.mjs +40 -45
  202. package/dist/node-dev/BuyNowButton.mjs.map +1 -1
  203. package/dist/node-dev/CartCheckoutButton.js +30 -24
  204. package/dist/node-dev/CartCheckoutButton.js.map +1 -1
  205. package/dist/node-dev/CartCheckoutButton.mjs +28 -23
  206. package/dist/node-dev/CartCheckoutButton.mjs.map +1 -1
  207. package/dist/node-dev/CartCost.js +27 -22
  208. package/dist/node-dev/CartCost.js.map +1 -1
  209. package/dist/node-dev/CartCost.mjs +26 -22
  210. package/dist/node-dev/CartCost.mjs.map +1 -1
  211. package/dist/node-dev/CartLineProvider.js +24 -17
  212. package/dist/node-dev/CartLineProvider.js.map +1 -1
  213. package/dist/node-dev/CartLineProvider.mjs +23 -18
  214. package/dist/node-dev/CartLineProvider.mjs.map +1 -1
  215. package/dist/node-dev/CartLineQuantity.js +19 -9
  216. package/dist/node-dev/CartLineQuantity.js.map +1 -1
  217. package/dist/node-dev/CartLineQuantity.mjs +18 -9
  218. package/dist/node-dev/CartLineQuantity.mjs.map +1 -1
  219. package/dist/node-dev/CartLineQuantityAdjustButton.js +50 -46
  220. package/dist/node-dev/CartLineQuantityAdjustButton.js.map +1 -1
  221. package/dist/node-dev/CartLineQuantityAdjustButton.mjs +48 -45
  222. package/dist/node-dev/CartLineQuantityAdjustButton.mjs.map +1 -1
  223. package/dist/node-dev/CartProvider.js +317 -385
  224. package/dist/node-dev/CartProvider.js.map +1 -1
  225. package/dist/node-dev/CartProvider.mjs +315 -385
  226. package/dist/node-dev/CartProvider.mjs.map +1 -1
  227. package/dist/node-dev/ExternalVideo.js +36 -47
  228. package/dist/node-dev/ExternalVideo.js.map +1 -1
  229. package/dist/node-dev/ExternalVideo.mjs +35 -47
  230. package/dist/node-dev/ExternalVideo.mjs.map +1 -1
  231. package/dist/node-dev/Image.js +337 -355
  232. package/dist/node-dev/Image.js.map +1 -1
  233. package/dist/node-dev/Image.mjs +335 -340
  234. package/dist/node-dev/Image.mjs.map +1 -1
  235. package/dist/node-dev/MediaFile.js +42 -63
  236. package/dist/node-dev/MediaFile.js.map +1 -1
  237. package/dist/node-dev/MediaFile.mjs +39 -61
  238. package/dist/node-dev/MediaFile.mjs.map +1 -1
  239. package/dist/node-dev/ModelViewer.js +116 -139
  240. package/dist/node-dev/ModelViewer.js.map +1 -1
  241. package/dist/node-dev/ModelViewer.mjs +115 -139
  242. package/dist/node-dev/ModelViewer.mjs.map +1 -1
  243. package/dist/node-dev/Money.js +54 -39
  244. package/dist/node-dev/Money.js.map +1 -1
  245. package/dist/node-dev/Money.mjs +53 -39
  246. package/dist/node-dev/Money.mjs.map +1 -1
  247. package/dist/node-dev/ProductPrice.js +45 -61
  248. package/dist/node-dev/ProductPrice.js.map +1 -1
  249. package/dist/node-dev/ProductPrice.mjs +44 -61
  250. package/dist/node-dev/ProductPrice.mjs.map +1 -1
  251. package/dist/node-dev/ProductProvider.js +148 -178
  252. package/dist/node-dev/ProductProvider.js.map +1 -1
  253. package/dist/node-dev/ProductProvider.mjs +147 -179
  254. package/dist/node-dev/ProductProvider.mjs.map +1 -1
  255. package/dist/node-dev/RichText.components.js +37 -46
  256. package/dist/node-dev/RichText.components.js.map +1 -1
  257. package/dist/node-dev/RichText.components.mjs +36 -46
  258. package/dist/node-dev/RichText.components.mjs.map +1 -1
  259. package/dist/node-dev/RichText.js +112 -154
  260. package/dist/node-dev/RichText.js.map +1 -1
  261. package/dist/node-dev/RichText.mjs +111 -154
  262. package/dist/node-dev/RichText.mjs.map +1 -1
  263. package/dist/node-dev/ShopPayButton.js +54 -81
  264. package/dist/node-dev/ShopPayButton.js.map +1 -1
  265. package/dist/node-dev/ShopPayButton.mjs +53 -81
  266. package/dist/node-dev/ShopPayButton.mjs.map +1 -1
  267. package/dist/node-dev/ShopifyProvider.js +73 -83
  268. package/dist/node-dev/ShopifyProvider.js.map +1 -1
  269. package/dist/node-dev/ShopifyProvider.mjs +71 -84
  270. package/dist/node-dev/ShopifyProvider.mjs.map +1 -1
  271. package/dist/node-dev/Video.js +36 -52
  272. package/dist/node-dev/Video.js.map +1 -1
  273. package/dist/node-dev/Video.mjs +35 -52
  274. package/dist/node-dev/Video.mjs.map +1 -1
  275. package/dist/node-dev/_virtual/_rolldown/runtime.js +23 -0
  276. package/dist/node-dev/analytics-constants.js +40 -39
  277. package/dist/node-dev/analytics-constants.js.map +1 -1
  278. package/dist/node-dev/analytics-constants.mjs +41 -43
  279. package/dist/node-dev/analytics-constants.mjs.map +1 -1
  280. package/dist/node-dev/analytics-schema-custom-storefront-customer-tracking.js +128 -210
  281. package/dist/node-dev/analytics-schema-custom-storefront-customer-tracking.js.map +1 -1
  282. package/dist/node-dev/analytics-schema-custom-storefront-customer-tracking.mjs +127 -214
  283. package/dist/node-dev/analytics-schema-custom-storefront-customer-tracking.mjs.map +1 -1
  284. package/dist/node-dev/analytics-schema-trekkie-storefront-page-view.js +40 -51
  285. package/dist/node-dev/analytics-schema-trekkie-storefront-page-view.js.map +1 -1
  286. package/dist/node-dev/analytics-schema-trekkie-storefront-page-view.mjs +39 -50
  287. package/dist/node-dev/analytics-schema-trekkie-storefront-page-view.mjs.map +1 -1
  288. package/dist/node-dev/analytics-utils.js +77 -52
  289. package/dist/node-dev/analytics-utils.js.map +1 -1
  290. package/dist/node-dev/analytics-utils.mjs +78 -56
  291. package/dist/node-dev/analytics-utils.mjs.map +1 -1
  292. package/dist/node-dev/analytics.js +114 -156
  293. package/dist/node-dev/analytics.js.map +1 -1
  294. package/dist/node-dev/analytics.mjs +112 -155
  295. package/dist/node-dev/analytics.mjs.map +1 -1
  296. package/dist/node-dev/cart-constants.js +10 -9
  297. package/dist/node-dev/cart-constants.js.map +1 -1
  298. package/dist/node-dev/cart-constants.mjs +11 -15
  299. package/dist/node-dev/cart-constants.mjs.map +1 -1
  300. package/dist/node-dev/cart-hooks.js +43 -57
  301. package/dist/node-dev/cart-hooks.js.map +1 -1
  302. package/dist/node-dev/cart-hooks.mjs +42 -57
  303. package/dist/node-dev/cart-hooks.mjs.map +1 -1
  304. package/dist/node-dev/cart-queries.js +27 -56
  305. package/dist/node-dev/cart-queries.js.map +1 -1
  306. package/dist/node-dev/cart-queries.mjs +28 -66
  307. package/dist/node-dev/cart-queries.mjs.map +1 -1
  308. package/dist/node-dev/codegen.helpers.js +30 -18
  309. package/dist/node-dev/codegen.helpers.js.map +1 -1
  310. package/dist/node-dev/codegen.helpers.mjs +31 -20
  311. package/dist/node-dev/codegen.helpers.mjs.map +1 -1
  312. package/dist/node-dev/cookies-utils.js +45 -42
  313. package/dist/node-dev/cookies-utils.js.map +1 -1
  314. package/dist/node-dev/cookies-utils.mjs +44 -42
  315. package/dist/node-dev/cookies-utils.mjs.map +1 -1
  316. package/dist/node-dev/flatten-connection.js +22 -28
  317. package/dist/node-dev/flatten-connection.js.map +1 -1
  318. package/dist/node-dev/flatten-connection.mjs +23 -29
  319. package/dist/node-dev/flatten-connection.mjs.map +1 -1
  320. package/dist/node-dev/getProductOptions.js +248 -224
  321. package/dist/node-dev/getProductOptions.js.map +1 -1
  322. package/dist/node-dev/getProductOptions.mjs +248 -226
  323. package/dist/node-dev/getProductOptions.mjs.map +1 -1
  324. package/dist/node-dev/index.js +88 -90
  325. package/dist/node-dev/index.mjs +15 -70
  326. package/dist/node-dev/load-script.js +38 -48
  327. package/dist/node-dev/load-script.js.map +1 -1
  328. package/dist/node-dev/load-script.mjs +38 -49
  329. package/dist/node-dev/load-script.mjs.map +1 -1
  330. package/dist/node-dev/node_modules/.pnpm/@xstate_fsm@2.0.0/node_modules/@xstate/fsm/es/index.js +185 -124
  331. package/dist/node-dev/node_modules/.pnpm/@xstate_fsm@2.0.0/node_modules/@xstate/fsm/es/index.js.map +1 -1
  332. package/dist/node-dev/node_modules/.pnpm/@xstate_fsm@2.0.0/node_modules/@xstate/fsm/es/index.mjs +175 -123
  333. package/dist/node-dev/node_modules/.pnpm/@xstate_fsm@2.0.0/node_modules/@xstate/fsm/es/index.mjs.map +1 -1
  334. package/dist/node-dev/optionValueDecoder.js +103 -84
  335. package/dist/node-dev/optionValueDecoder.js.map +1 -1
  336. package/dist/node-dev/optionValueDecoder.mjs +104 -86
  337. package/dist/node-dev/optionValueDecoder.mjs.map +1 -1
  338. package/dist/node-dev/packages/hydrogen-react/package.js +6 -0
  339. package/dist/node-dev/packages/hydrogen-react/package.js.map +1 -0
  340. package/dist/node-dev/packages/hydrogen-react/package.mjs +6 -0
  341. package/dist/node-dev/packages/hydrogen-react/package.mjs.map +1 -0
  342. package/dist/node-dev/parse-metafield.js +122 -134
  343. package/dist/node-dev/parse-metafield.js.map +1 -1
  344. package/dist/node-dev/parse-metafield.mjs +122 -134
  345. package/dist/node-dev/parse-metafield.mjs.map +1 -1
  346. package/dist/node-dev/storefront-api-constants.js +5 -4
  347. package/dist/node-dev/storefront-api-constants.js.map +1 -1
  348. package/dist/node-dev/storefront-api-constants.mjs +6 -5
  349. package/dist/node-dev/storefront-api-constants.mjs.map +1 -1
  350. package/dist/node-dev/storefront-client.js +62 -101
  351. package/dist/node-dev/storefront-client.js.map +1 -1
  352. package/dist/node-dev/storefront-client.mjs +62 -102
  353. package/dist/node-dev/storefront-client.mjs.map +1 -1
  354. package/dist/node-dev/tracking-utils.js +67 -85
  355. package/dist/node-dev/tracking-utils.js.map +1 -1
  356. package/dist/node-dev/tracking-utils.mjs +68 -88
  357. package/dist/node-dev/tracking-utils.mjs.map +1 -1
  358. package/dist/node-dev/useCartAPIStateMachine.js +192 -349
  359. package/dist/node-dev/useCartAPIStateMachine.js.map +1 -1
  360. package/dist/node-dev/useCartAPIStateMachine.mjs +188 -346
  361. package/dist/node-dev/useCartAPIStateMachine.mjs.map +1 -1
  362. package/dist/node-dev/useCartActions.js +198 -172
  363. package/dist/node-dev/useCartActions.js.map +1 -1
  364. package/dist/node-dev/useCartActions.mjs +197 -172
  365. package/dist/node-dev/useCartActions.mjs.map +1 -1
  366. package/dist/node-dev/useMachine.js +50 -61
  367. package/dist/node-dev/useMachine.js.map +1 -1
  368. package/dist/node-dev/useMachine.mjs +50 -62
  369. package/dist/node-dev/useMachine.mjs.map +1 -1
  370. package/dist/node-dev/useMoney.js +177 -154
  371. package/dist/node-dev/useMoney.js.map +1 -1
  372. package/dist/node-dev/useMoney.mjs +176 -154
  373. package/dist/node-dev/useMoney.mjs.map +1 -1
  374. package/dist/node-dev/useSelectedOptionInUrlParam.js +18 -27
  375. package/dist/node-dev/useSelectedOptionInUrlParam.js.map +1 -1
  376. package/dist/node-dev/useSelectedOptionInUrlParam.mjs +17 -27
  377. package/dist/node-dev/useSelectedOptionInUrlParam.mjs.map +1 -1
  378. package/dist/node-dev/useShopifyCookies.js +124 -138
  379. package/dist/node-dev/useShopifyCookies.js.map +1 -1
  380. package/dist/node-dev/useShopifyCookies.mjs +123 -138
  381. package/dist/node-dev/useShopifyCookies.mjs.map +1 -1
  382. package/dist/node-prod/AddToCartButton.js +64 -73
  383. package/dist/node-prod/AddToCartButton.js.map +1 -1
  384. package/dist/node-prod/AddToCartButton.mjs +60 -71
  385. package/dist/node-prod/AddToCartButton.mjs.map +1 -1
  386. package/dist/node-prod/BaseButton.js +21 -26
  387. package/dist/node-prod/BaseButton.js.map +1 -1
  388. package/dist/node-prod/BaseButton.mjs +20 -26
  389. package/dist/node-prod/BaseButton.mjs.map +1 -1
  390. package/dist/node-prod/BuyNowButton.js +42 -46
  391. package/dist/node-prod/BuyNowButton.js.map +1 -1
  392. package/dist/node-prod/BuyNowButton.mjs +40 -45
  393. package/dist/node-prod/BuyNowButton.mjs.map +1 -1
  394. package/dist/node-prod/CartCheckoutButton.js +30 -24
  395. package/dist/node-prod/CartCheckoutButton.js.map +1 -1
  396. package/dist/node-prod/CartCheckoutButton.mjs +28 -23
  397. package/dist/node-prod/CartCheckoutButton.mjs.map +1 -1
  398. package/dist/node-prod/CartCost.js +27 -22
  399. package/dist/node-prod/CartCost.js.map +1 -1
  400. package/dist/node-prod/CartCost.mjs +26 -22
  401. package/dist/node-prod/CartCost.mjs.map +1 -1
  402. package/dist/node-prod/CartLineProvider.js +24 -17
  403. package/dist/node-prod/CartLineProvider.js.map +1 -1
  404. package/dist/node-prod/CartLineProvider.mjs +23 -18
  405. package/dist/node-prod/CartLineProvider.mjs.map +1 -1
  406. package/dist/node-prod/CartLineQuantity.js +19 -9
  407. package/dist/node-prod/CartLineQuantity.js.map +1 -1
  408. package/dist/node-prod/CartLineQuantity.mjs +18 -9
  409. package/dist/node-prod/CartLineQuantity.mjs.map +1 -1
  410. package/dist/node-prod/CartLineQuantityAdjustButton.js +50 -46
  411. package/dist/node-prod/CartLineQuantityAdjustButton.js.map +1 -1
  412. package/dist/node-prod/CartLineQuantityAdjustButton.mjs +48 -45
  413. package/dist/node-prod/CartLineQuantityAdjustButton.mjs.map +1 -1
  414. package/dist/node-prod/CartProvider.js +317 -385
  415. package/dist/node-prod/CartProvider.js.map +1 -1
  416. package/dist/node-prod/CartProvider.mjs +315 -385
  417. package/dist/node-prod/CartProvider.mjs.map +1 -1
  418. package/dist/node-prod/ExternalVideo.js +36 -47
  419. package/dist/node-prod/ExternalVideo.js.map +1 -1
  420. package/dist/node-prod/ExternalVideo.mjs +35 -47
  421. package/dist/node-prod/ExternalVideo.mjs.map +1 -1
  422. package/dist/node-prod/Image.js +328 -340
  423. package/dist/node-prod/Image.js.map +1 -1
  424. package/dist/node-prod/Image.mjs +326 -325
  425. package/dist/node-prod/Image.mjs.map +1 -1
  426. package/dist/node-prod/MediaFile.js +47 -65
  427. package/dist/node-prod/MediaFile.js.map +1 -1
  428. package/dist/node-prod/MediaFile.mjs +44 -63
  429. package/dist/node-prod/MediaFile.mjs.map +1 -1
  430. package/dist/node-prod/ModelViewer.js +118 -135
  431. package/dist/node-prod/ModelViewer.js.map +1 -1
  432. package/dist/node-prod/ModelViewer.mjs +117 -135
  433. package/dist/node-prod/ModelViewer.mjs.map +1 -1
  434. package/dist/node-prod/Money.js +54 -39
  435. package/dist/node-prod/Money.js.map +1 -1
  436. package/dist/node-prod/Money.mjs +53 -39
  437. package/dist/node-prod/Money.mjs.map +1 -1
  438. package/dist/node-prod/ProductPrice.js +45 -61
  439. package/dist/node-prod/ProductPrice.js.map +1 -1
  440. package/dist/node-prod/ProductPrice.mjs +44 -61
  441. package/dist/node-prod/ProductPrice.mjs.map +1 -1
  442. package/dist/node-prod/ProductProvider.js +148 -178
  443. package/dist/node-prod/ProductProvider.js.map +1 -1
  444. package/dist/node-prod/ProductProvider.mjs +147 -179
  445. package/dist/node-prod/ProductProvider.mjs.map +1 -1
  446. package/dist/node-prod/RichText.components.js +37 -46
  447. package/dist/node-prod/RichText.components.js.map +1 -1
  448. package/dist/node-prod/RichText.components.mjs +36 -46
  449. package/dist/node-prod/RichText.components.mjs.map +1 -1
  450. package/dist/node-prod/RichText.js +112 -154
  451. package/dist/node-prod/RichText.js.map +1 -1
  452. package/dist/node-prod/RichText.mjs +111 -154
  453. package/dist/node-prod/RichText.mjs.map +1 -1
  454. package/dist/node-prod/ShopPayButton.js +54 -81
  455. package/dist/node-prod/ShopPayButton.js.map +1 -1
  456. package/dist/node-prod/ShopPayButton.mjs +53 -81
  457. package/dist/node-prod/ShopPayButton.mjs.map +1 -1
  458. package/dist/node-prod/ShopifyProvider.js +73 -83
  459. package/dist/node-prod/ShopifyProvider.js.map +1 -1
  460. package/dist/node-prod/ShopifyProvider.mjs +71 -84
  461. package/dist/node-prod/ShopifyProvider.mjs.map +1 -1
  462. package/dist/node-prod/Video.js +36 -52
  463. package/dist/node-prod/Video.js.map +1 -1
  464. package/dist/node-prod/Video.mjs +35 -52
  465. package/dist/node-prod/Video.mjs.map +1 -1
  466. package/dist/node-prod/_virtual/_rolldown/runtime.js +23 -0
  467. package/dist/node-prod/analytics-constants.js +40 -39
  468. package/dist/node-prod/analytics-constants.js.map +1 -1
  469. package/dist/node-prod/analytics-constants.mjs +41 -43
  470. package/dist/node-prod/analytics-constants.mjs.map +1 -1
  471. package/dist/node-prod/analytics-schema-custom-storefront-customer-tracking.js +128 -210
  472. package/dist/node-prod/analytics-schema-custom-storefront-customer-tracking.js.map +1 -1
  473. package/dist/node-prod/analytics-schema-custom-storefront-customer-tracking.mjs +127 -214
  474. package/dist/node-prod/analytics-schema-custom-storefront-customer-tracking.mjs.map +1 -1
  475. package/dist/node-prod/analytics-schema-trekkie-storefront-page-view.js +40 -51
  476. package/dist/node-prod/analytics-schema-trekkie-storefront-page-view.js.map +1 -1
  477. package/dist/node-prod/analytics-schema-trekkie-storefront-page-view.mjs +39 -50
  478. package/dist/node-prod/analytics-schema-trekkie-storefront-page-view.mjs.map +1 -1
  479. package/dist/node-prod/analytics-utils.js +77 -52
  480. package/dist/node-prod/analytics-utils.js.map +1 -1
  481. package/dist/node-prod/analytics-utils.mjs +78 -56
  482. package/dist/node-prod/analytics-utils.mjs.map +1 -1
  483. package/dist/node-prod/analytics.js +113 -154
  484. package/dist/node-prod/analytics.js.map +1 -1
  485. package/dist/node-prod/analytics.mjs +111 -153
  486. package/dist/node-prod/analytics.mjs.map +1 -1
  487. package/dist/node-prod/cart-constants.js +10 -9
  488. package/dist/node-prod/cart-constants.js.map +1 -1
  489. package/dist/node-prod/cart-constants.mjs +11 -15
  490. package/dist/node-prod/cart-constants.mjs.map +1 -1
  491. package/dist/node-prod/cart-hooks.js +43 -57
  492. package/dist/node-prod/cart-hooks.js.map +1 -1
  493. package/dist/node-prod/cart-hooks.mjs +42 -57
  494. package/dist/node-prod/cart-hooks.mjs.map +1 -1
  495. package/dist/node-prod/cart-queries.js +27 -56
  496. package/dist/node-prod/cart-queries.js.map +1 -1
  497. package/dist/node-prod/cart-queries.mjs +28 -66
  498. package/dist/node-prod/cart-queries.mjs.map +1 -1
  499. package/dist/node-prod/codegen.helpers.js +30 -18
  500. package/dist/node-prod/codegen.helpers.js.map +1 -1
  501. package/dist/node-prod/codegen.helpers.mjs +31 -20
  502. package/dist/node-prod/codegen.helpers.mjs.map +1 -1
  503. package/dist/node-prod/cookies-utils.js +45 -42
  504. package/dist/node-prod/cookies-utils.js.map +1 -1
  505. package/dist/node-prod/cookies-utils.mjs +44 -42
  506. package/dist/node-prod/cookies-utils.mjs.map +1 -1
  507. package/dist/node-prod/flatten-connection.js +22 -24
  508. package/dist/node-prod/flatten-connection.js.map +1 -1
  509. package/dist/node-prod/flatten-connection.mjs +23 -25
  510. package/dist/node-prod/flatten-connection.mjs.map +1 -1
  511. package/dist/node-prod/getProductOptions.js +248 -224
  512. package/dist/node-prod/getProductOptions.js.map +1 -1
  513. package/dist/node-prod/getProductOptions.mjs +248 -226
  514. package/dist/node-prod/getProductOptions.mjs.map +1 -1
  515. package/dist/node-prod/index.js +88 -90
  516. package/dist/node-prod/index.mjs +15 -70
  517. package/dist/node-prod/load-script.js +38 -48
  518. package/dist/node-prod/load-script.js.map +1 -1
  519. package/dist/node-prod/load-script.mjs +38 -49
  520. package/dist/node-prod/load-script.mjs.map +1 -1
  521. package/dist/node-prod/node_modules/.pnpm/@xstate_fsm@2.0.0/node_modules/@xstate/fsm/es/index.js +185 -124
  522. package/dist/node-prod/node_modules/.pnpm/@xstate_fsm@2.0.0/node_modules/@xstate/fsm/es/index.js.map +1 -1
  523. package/dist/node-prod/node_modules/.pnpm/@xstate_fsm@2.0.0/node_modules/@xstate/fsm/es/index.mjs +175 -123
  524. package/dist/node-prod/node_modules/.pnpm/@xstate_fsm@2.0.0/node_modules/@xstate/fsm/es/index.mjs.map +1 -1
  525. package/dist/node-prod/optionValueDecoder.js +103 -84
  526. package/dist/node-prod/optionValueDecoder.js.map +1 -1
  527. package/dist/node-prod/optionValueDecoder.mjs +104 -86
  528. package/dist/node-prod/optionValueDecoder.mjs.map +1 -1
  529. package/dist/node-prod/packages/hydrogen-react/package.js +6 -0
  530. package/dist/node-prod/packages/hydrogen-react/package.js.map +1 -0
  531. package/dist/node-prod/packages/hydrogen-react/package.mjs +6 -0
  532. package/dist/node-prod/packages/hydrogen-react/package.mjs.map +1 -0
  533. package/dist/node-prod/parse-metafield.js +134 -146
  534. package/dist/node-prod/parse-metafield.js.map +1 -1
  535. package/dist/node-prod/parse-metafield.mjs +134 -146
  536. package/dist/node-prod/parse-metafield.mjs.map +1 -1
  537. package/dist/node-prod/storefront-api-constants.js +5 -4
  538. package/dist/node-prod/storefront-api-constants.js.map +1 -1
  539. package/dist/node-prod/storefront-api-constants.mjs +6 -5
  540. package/dist/node-prod/storefront-api-constants.mjs.map +1 -1
  541. package/dist/node-prod/storefront-client.js +56 -83
  542. package/dist/node-prod/storefront-client.js.map +1 -1
  543. package/dist/node-prod/storefront-client.mjs +56 -84
  544. package/dist/node-prod/storefront-client.mjs.map +1 -1
  545. package/dist/node-prod/tracking-utils.js +67 -85
  546. package/dist/node-prod/tracking-utils.js.map +1 -1
  547. package/dist/node-prod/tracking-utils.mjs +68 -88
  548. package/dist/node-prod/tracking-utils.mjs.map +1 -1
  549. package/dist/node-prod/useCartAPIStateMachine.js +192 -349
  550. package/dist/node-prod/useCartAPIStateMachine.js.map +1 -1
  551. package/dist/node-prod/useCartAPIStateMachine.mjs +188 -346
  552. package/dist/node-prod/useCartAPIStateMachine.mjs.map +1 -1
  553. package/dist/node-prod/useCartActions.js +198 -172
  554. package/dist/node-prod/useCartActions.js.map +1 -1
  555. package/dist/node-prod/useCartActions.mjs +197 -172
  556. package/dist/node-prod/useCartActions.mjs.map +1 -1
  557. package/dist/node-prod/useMachine.js +50 -61
  558. package/dist/node-prod/useMachine.js.map +1 -1
  559. package/dist/node-prod/useMachine.mjs +50 -62
  560. package/dist/node-prod/useMachine.mjs.map +1 -1
  561. package/dist/node-prod/useMoney.js +177 -154
  562. package/dist/node-prod/useMoney.js.map +1 -1
  563. package/dist/node-prod/useMoney.mjs +176 -154
  564. package/dist/node-prod/useMoney.mjs.map +1 -1
  565. package/dist/node-prod/useSelectedOptionInUrlParam.js +18 -27
  566. package/dist/node-prod/useSelectedOptionInUrlParam.js.map +1 -1
  567. package/dist/node-prod/useSelectedOptionInUrlParam.mjs +17 -27
  568. package/dist/node-prod/useSelectedOptionInUrlParam.mjs.map +1 -1
  569. package/dist/node-prod/useShopifyCookies.js +124 -138
  570. package/dist/node-prod/useShopifyCookies.js.map +1 -1
  571. package/dist/node-prod/useShopifyCookies.mjs +123 -138
  572. package/dist/node-prod/useShopifyCookies.mjs.map +1 -1
  573. package/dist/umd/hydrogen-react.dev.js +3930 -4418
  574. package/dist/umd/hydrogen-react.dev.js.map +1 -1
  575. package/dist/umd/hydrogen-react.prod.js +35 -49
  576. package/dist/umd/hydrogen-react.prod.js.map +1 -1
  577. package/package.json +5 -5
  578. package/dist/browser-dev/index.mjs.map +0 -1
  579. package/dist/browser-dev/packages/hydrogen-react/package.json.mjs +0 -5
  580. package/dist/browser-dev/packages/hydrogen-react/package.json.mjs.map +0 -1
  581. package/dist/browser-prod/index.mjs.map +0 -1
  582. package/dist/browser-prod/packages/hydrogen-react/package.json.mjs +0 -5
  583. package/dist/browser-prod/packages/hydrogen-react/package.json.mjs.map +0 -1
  584. package/dist/node-dev/index.js.map +0 -1
  585. package/dist/node-dev/index.mjs.map +0 -1
  586. package/dist/node-dev/packages/hydrogen-react/package.json.js +0 -5
  587. package/dist/node-dev/packages/hydrogen-react/package.json.js.map +0 -1
  588. package/dist/node-dev/packages/hydrogen-react/package.json.mjs +0 -5
  589. package/dist/node-dev/packages/hydrogen-react/package.json.mjs.map +0 -1
  590. package/dist/node-prod/index.js.map +0 -1
  591. package/dist/node-prod/index.mjs.map +0 -1
  592. package/dist/node-prod/packages/hydrogen-react/package.json.js +0 -5
  593. package/dist/node-prod/packages/hydrogen-react/package.json.js.map +0 -1
  594. package/dist/node-prod/packages/hydrogen-react/package.json.mjs +0 -5
  595. package/dist/node-prod/packages/hydrogen-react/package.json.mjs.map +0 -1
@@ -1,251 +1,273 @@
1
1
  import { isOptionValueCombinationInEncodedVariant } from "./optionValueDecoder.mjs";
2
+ //#region src/getProductOptions.ts
3
+ /**
4
+ * Creates a mapping of product options to their index for matching encoded values
5
+ * For example, a product option of
6
+ * [
7
+ * \{
8
+ * name: 'Color',
9
+ * optionValues: [\{name: 'Red'\}, \{name: 'Blue'\}]
10
+ * \},
11
+ * \{
12
+ * name: 'Size',
13
+ * optionValues: [\{name: 'Small'\}, \{name: 'Medium'\}, \{name: 'Large'\}]
14
+ * \}
15
+ * ]
16
+ * Would return
17
+ * \{
18
+ * 'Color': \{Red: 0, Blue: 1\},
19
+ * 'Size': \{Small: 0, Medium: 1, Large: 2\}
20
+ * \}
21
+ */
2
22
  function mapProductOptions(options) {
3
- return Object.assign(
4
- {},
5
- ...options.map((option) => {
6
- return {
7
- [option.name]: Object.assign(
8
- {},
9
- ...(option == null ? void 0 : option.optionValues) ? option.optionValues.map((value, index) => {
10
- return { [value.name]: index };
11
- }) : []
12
- )
13
- };
14
- })
15
- );
23
+ return Object.assign({}, ...options.map((option) => {
24
+ return { [option.name]: Object.assign({}, ...option?.optionValues ? option.optionValues.map((value, index) => {
25
+ return { [value.name]: index };
26
+ }) : []) };
27
+ }));
16
28
  }
29
+ /**
30
+ * Converts the product option into an Object\<key, value\> for building query params
31
+ * For example, a selected product option of
32
+ * [
33
+ * \{
34
+ * name: 'Color',
35
+ * value: 'Red',
36
+ * \},
37
+ * \{
38
+ * name: 'Size',
39
+ * value: 'Medium',
40
+ * \}
41
+ * ]
42
+ * Would return
43
+ * \{
44
+ * Color: 'Red',
45
+ * Size: 'Medium',
46
+ * \}
47
+ * @publicDocs
48
+ */
17
49
  function mapSelectedProductOptionToObject(options) {
18
- return Object.assign(
19
- {},
20
- ...options.map((key) => {
21
- return { [key.name]: key.value };
22
- })
23
- );
50
+ return Object.assign({}, ...options.map((key) => {
51
+ return { [key.name]: key.value };
52
+ }));
24
53
  }
54
+ /**
55
+ * Returns the JSON stringify result of mapSelectedProductOptionToObject
56
+ */
25
57
  function mapSelectedProductOptionToObjectAsString(options) {
26
- return JSON.stringify(mapSelectedProductOptionToObject(options));
58
+ return JSON.stringify(mapSelectedProductOptionToObject(options));
27
59
  }
60
+ /**
61
+ * Encode the selected product option as a key for mapping to the encoded variants
62
+ * For example, a selected product option of
63
+ * [
64
+ * \{
65
+ * name: 'Color',
66
+ * value: 'Red',
67
+ * \},
68
+ * \{
69
+ * name: 'Size',
70
+ * value: 'Medium',
71
+ * \}
72
+ * ]
73
+ * Would return
74
+ * JSON.stringify(\{
75
+ * Color: 'Red',
76
+ * Size: 'Medium',
77
+ * \})
78
+ */
28
79
  function encodeSelectedProductOptionAsKey(selectedOption) {
29
- if (Array.isArray(selectedOption)) {
30
- return JSON.stringify(
31
- Object.assign(
32
- {},
33
- ...selectedOption.map((option) => ({ [option.name]: option.value }))
34
- )
35
- );
36
- } else {
37
- return JSON.stringify(selectedOption);
38
- }
80
+ if (Array.isArray(selectedOption)) return JSON.stringify(Object.assign({}, ...selectedOption.map((option) => ({ [option.name]: option.value }))));
81
+ else return JSON.stringify(selectedOption);
39
82
  }
83
+ /**
84
+ * Build the encoding array for the given selected options. For example, if we have
85
+ * the following productOptionMappings:
86
+ *
87
+ * \{
88
+ * 'Color': \{Red: 0, Blue: 1\},
89
+ * 'Size': \{Small: 0, Medium: 1, Large: 2\}
90
+ * \}
91
+ *
92
+ * A selectedOption of
93
+ *
94
+ * \{
95
+ * Color: 'Red',
96
+ * Size: 'Medium',
97
+ * \}
98
+ *
99
+ * `buildEncodingArrayFromSelectedOptions` will produce
100
+ *
101
+ * [0,1]
102
+ *
103
+ * If in the case where a selected option doesn't exists in the mapping array, for example:
104
+ *
105
+ * \{
106
+ * Color: 'Red',
107
+ * Fabric: 'Cotton',
108
+ * Size: 'Medium',
109
+ * \}
110
+ *
111
+ * `buildEncodingArrayFromSelectedOptions` will still produce
112
+ *
113
+ * [0,1]
114
+ *
115
+ * This can be caused by when we do not have all the product
116
+ * option information for the loading optimistic variant
117
+ */
40
118
  function buildEncodingArrayFromSelectedOptions(selectedOption, productOptionMappings) {
41
- const encoding = Object.keys(selectedOption).map((key) => {
42
- return productOptionMappings[key] ? productOptionMappings[key][selectedOption[key]] : null;
43
- });
44
- return encoding.filter((code) => code !== null);
119
+ return Object.keys(selectedOption).map((key) => {
120
+ return productOptionMappings[key] ? productOptionMappings[key][selectedOption[key]] : null;
121
+ }).filter((code) => code !== null);
45
122
  }
123
+ /**
124
+ * Takes an array of product variants and maps them to an object with the encoded selected option values as the key.
125
+ * For example, a product variant of
126
+ * [
127
+ * \{
128
+ * id: 1,
129
+ * selectedOptions: [
130
+ * \{name: 'Color', value: 'Red'\},
131
+ * \{name: 'Size', value: 'Small'\},
132
+ * ],
133
+ * \},
134
+ * \{
135
+ * id: 2,
136
+ * selectedOptions: [
137
+ * \{name: 'Color', value: 'Red'\},
138
+ * \{name: 'Size', value: 'Medium'\},
139
+ * ],
140
+ * \}
141
+ * ]
142
+ * Would return
143
+ * \{
144
+ * '[0,0]': \{id: 1, selectedOptions: [\{name: 'Color', value: 'Red'\}, \{name: 'Size', value: 'Small'\}]\},
145
+ * '[0,1]': \{id: 2, selectedOptions: [\{name: 'Color', value: 'Red'\}, \{name: 'Size', value: 'Medium'\}]\},
146
+ * \}
147
+ */
46
148
  function mapVariants(variants) {
47
- return Object.assign(
48
- {},
49
- ...variants.map((variant) => {
50
- const variantKey = encodeSelectedProductOptionAsKey(
51
- variant.selectedOptions || []
52
- );
53
- return { [variantKey]: variant };
54
- })
55
- );
149
+ return Object.assign({}, ...variants.map((variant) => {
150
+ return { [encodeSelectedProductOptionAsKey(variant.selectedOptions || [])]: variant };
151
+ }));
56
152
  }
57
- const PRODUCT_INPUTS = [
58
- "options",
59
- "selectedOrFirstAvailableVariant",
60
- "adjacentVariants"
153
+ var PRODUCT_INPUTS = [
154
+ "options",
155
+ "selectedOrFirstAvailableVariant",
156
+ "adjacentVariants"
61
157
  ];
62
- const PRODUCT_INPUTS_EXTRA = [
63
- "handle",
64
- "encodedVariantExistence",
65
- "encodedVariantAvailability"
158
+ var PRODUCT_INPUTS_EXTRA = [
159
+ "handle",
160
+ "encodedVariantExistence",
161
+ "encodedVariantAvailability"
66
162
  ];
67
163
  function logErrorAndReturnFalse(key) {
68
- console.error(
69
- `[h2:error:getProductOptions] product.${key} is missing. Make sure you query for this field from the Storefront API.`
70
- );
71
- return false;
164
+ console.error(`[h2:error:getProductOptions] product.${key} is missing. Make sure you query for this field from the Storefront API.`);
165
+ return false;
72
166
  }
73
167
  function checkProductParam(product, checkAll = false) {
74
- var _a;
75
- let validParam = true;
76
- const productKeys = Object.keys(product);
77
- (checkAll ? [...PRODUCT_INPUTS, ...PRODUCT_INPUTS_EXTRA] : PRODUCT_INPUTS).forEach((key) => {
78
- if (!productKeys.includes(key)) {
79
- validParam = logErrorAndReturnFalse(key);
80
- }
81
- });
82
- if (product.options) {
83
- const firstOption = product == null ? void 0 : product.options[0];
84
- if (checkAll && !(firstOption == null ? void 0 : firstOption.name)) {
85
- validParam = logErrorAndReturnFalse("options.name");
86
- }
87
- if ((_a = product == null ? void 0 : product.options[0]) == null ? void 0 : _a.optionValues) {
88
- let firstOptionValues = product.options[0].optionValues[0];
89
- if (checkAll && !(firstOptionValues == null ? void 0 : firstOptionValues.name)) {
90
- validParam = logErrorAndReturnFalse("options.optionValues.name");
91
- }
92
- firstOptionValues = product.options[0].optionValues.filter(
93
- (value) => !!(value == null ? void 0 : value.firstSelectableVariant)
94
- )[0];
95
- if (firstOptionValues == null ? void 0 : firstOptionValues.firstSelectableVariant) {
96
- validParam = checkProductVariantParam(
97
- firstOptionValues.firstSelectableVariant,
98
- "options.optionValues.firstSelectableVariant",
99
- validParam,
100
- checkAll
101
- );
102
- }
103
- } else {
104
- validParam = logErrorAndReturnFalse("options.optionValues");
105
- }
106
- }
107
- if (product.selectedOrFirstAvailableVariant) {
108
- validParam = checkProductVariantParam(
109
- product.selectedOrFirstAvailableVariant,
110
- "selectedOrFirstAvailableVariant",
111
- validParam,
112
- checkAll
113
- );
114
- }
115
- if (!!product.adjacentVariants && product.adjacentVariants[0]) {
116
- validParam = checkProductVariantParam(
117
- product.adjacentVariants[0],
118
- "adjacentVariants",
119
- validParam,
120
- checkAll
121
- );
122
- }
123
- return validParam ? product : {};
168
+ let validParam = true;
169
+ const productKeys = Object.keys(product);
170
+ (checkAll ? [...PRODUCT_INPUTS, ...PRODUCT_INPUTS_EXTRA] : PRODUCT_INPUTS).forEach((key) => {
171
+ if (!productKeys.includes(key)) validParam = logErrorAndReturnFalse(key);
172
+ });
173
+ if (product.options) {
174
+ const firstOption = product?.options[0];
175
+ if (checkAll && !firstOption?.name) validParam = logErrorAndReturnFalse("options.name");
176
+ if (product?.options[0]?.optionValues) {
177
+ let firstOptionValues = product.options[0].optionValues[0];
178
+ if (checkAll && !firstOptionValues?.name) validParam = logErrorAndReturnFalse("options.optionValues.name");
179
+ firstOptionValues = product.options[0].optionValues.filter((value) => !!value?.firstSelectableVariant)[0];
180
+ if (firstOptionValues?.firstSelectableVariant) validParam = checkProductVariantParam(firstOptionValues.firstSelectableVariant, "options.optionValues.firstSelectableVariant", validParam, checkAll);
181
+ } else validParam = logErrorAndReturnFalse("options.optionValues");
182
+ }
183
+ if (product.selectedOrFirstAvailableVariant) validParam = checkProductVariantParam(product.selectedOrFirstAvailableVariant, "selectedOrFirstAvailableVariant", validParam, checkAll);
184
+ if (!!product.adjacentVariants && product.adjacentVariants[0]) validParam = checkProductVariantParam(product.adjacentVariants[0], "adjacentVariants", validParam, checkAll);
185
+ return validParam ? product : {};
124
186
  }
125
187
  function checkProductVariantParam(variant, key, currentValidParamState, checkAll) {
126
- var _a;
127
- let validParam = currentValidParamState;
128
- if (checkAll && !((_a = variant.product) == null ? void 0 : _a.handle)) {
129
- validParam = logErrorAndReturnFalse(`${key}.product.handle`);
130
- }
131
- if (variant.selectedOptions) {
132
- const firstSelectedOption = variant.selectedOptions[0];
133
- if (!(firstSelectedOption == null ? void 0 : firstSelectedOption.name)) {
134
- validParam = logErrorAndReturnFalse(`${key}.selectedOptions.name`);
135
- }
136
- if (!(firstSelectedOption == null ? void 0 : firstSelectedOption.value)) {
137
- validParam = logErrorAndReturnFalse(`${key}.selectedOptions.value`);
138
- }
139
- } else {
140
- validParam = logErrorAndReturnFalse(`${key}.selectedOptions`);
141
- }
142
- return validParam;
188
+ let validParam = currentValidParamState;
189
+ if (checkAll && !variant.product?.handle) validParam = logErrorAndReturnFalse(`${key}.product.handle`);
190
+ if (variant.selectedOptions) {
191
+ const firstSelectedOption = variant.selectedOptions[0];
192
+ if (!firstSelectedOption?.name) validParam = logErrorAndReturnFalse(`${key}.selectedOptions.name`);
193
+ if (!firstSelectedOption?.value) validParam = logErrorAndReturnFalse(`${key}.selectedOptions.value`);
194
+ } else validParam = logErrorAndReturnFalse(`${key}.selectedOptions`);
195
+ return validParam;
143
196
  }
197
+ /**
198
+ * Finds all the variants provided by adjacentVariants, options.optionValues.firstAvailableVariant,
199
+ * and selectedOrFirstAvailableVariant and return them in a single array
200
+ * @publicDocs
201
+ */
144
202
  function getAdjacentAndFirstAvailableVariants(product) {
145
- const checkedProduct = checkProductParam(product);
146
- if (!checkedProduct.options) return [];
147
- const availableVariants = {};
148
- checkedProduct.options.map((option) => {
149
- var _a;
150
- (_a = option.optionValues) == null ? void 0 : _a.map((value) => {
151
- if (value.firstSelectableVariant) {
152
- const variantKey = mapSelectedProductOptionToObjectAsString(
153
- value.firstSelectableVariant.selectedOptions
154
- );
155
- availableVariants[variantKey] = value.firstSelectableVariant;
156
- }
157
- });
158
- });
159
- checkedProduct.adjacentVariants.map((variant) => {
160
- const variantKey = mapSelectedProductOptionToObjectAsString(
161
- variant.selectedOptions
162
- );
163
- availableVariants[variantKey] = variant;
164
- });
165
- const selectedVariant = checkedProduct.selectedOrFirstAvailableVariant;
166
- if (selectedVariant) {
167
- const variantKey = mapSelectedProductOptionToObjectAsString(
168
- selectedVariant.selectedOptions
169
- );
170
- availableVariants[variantKey] = selectedVariant;
171
- }
172
- return Object.values(availableVariants);
203
+ const checkedProduct = checkProductParam(product);
204
+ if (!checkedProduct.options) return [];
205
+ const availableVariants = {};
206
+ checkedProduct.options.map((option) => {
207
+ option.optionValues?.map((value) => {
208
+ if (value.firstSelectableVariant) {
209
+ const variantKey = mapSelectedProductOptionToObjectAsString(value.firstSelectableVariant.selectedOptions);
210
+ availableVariants[variantKey] = value.firstSelectableVariant;
211
+ }
212
+ });
213
+ });
214
+ checkedProduct.adjacentVariants.map((variant) => {
215
+ const variantKey = mapSelectedProductOptionToObjectAsString(variant.selectedOptions);
216
+ availableVariants[variantKey] = variant;
217
+ });
218
+ const selectedVariant = checkedProduct.selectedOrFirstAvailableVariant;
219
+ if (selectedVariant) {
220
+ const variantKey = mapSelectedProductOptionToObjectAsString(selectedVariant.selectedOptions);
221
+ availableVariants[variantKey] = selectedVariant;
222
+ }
223
+ return Object.values(availableVariants);
173
224
  }
225
+ /**
226
+ * Returns a product options array with its relevant information
227
+ * about the variant
228
+ * @publicDocs
229
+ */
174
230
  function getProductOptions(product) {
175
- const checkedProduct = checkProductParam(product, true);
176
- if (!checkedProduct.options) return [];
177
- const {
178
- options,
179
- selectedOrFirstAvailableVariant: selectedVariant,
180
- adjacentVariants,
181
- encodedVariantExistence,
182
- encodedVariantAvailability,
183
- handle: productHandle
184
- } = checkedProduct;
185
- const selectedOptionKeys = selectedVariant == null ? void 0 : selectedVariant.selectedOptions.map(
186
- (option) => option.name
187
- );
188
- const filteredOptions = options.filter((option) => {
189
- return selectedOptionKeys && selectedOptionKeys.indexOf(option.name) >= 0;
190
- });
191
- const productOptionMappings = mapProductOptions(options);
192
- const variants = mapVariants(
193
- selectedVariant ? [selectedVariant, ...adjacentVariants] : adjacentVariants
194
- );
195
- const selectedOptions = mapSelectedProductOptionToObject(
196
- selectedVariant ? selectedVariant.selectedOptions : []
197
- );
198
- const productOptions = filteredOptions.map((option, optionIndex) => {
199
- return {
200
- ...option,
201
- optionValues: option.optionValues.map((value) => {
202
- var _a;
203
- const targetOptionParams = { ...selectedOptions };
204
- targetOptionParams[option.name] = value.name;
205
- const targetKey = encodeSelectedProductOptionAsKey(
206
- targetOptionParams || []
207
- );
208
- const encodingKey = buildEncodingArrayFromSelectedOptions(
209
- targetOptionParams || [],
210
- productOptionMappings
211
- );
212
- const topDownKey = encodingKey.slice(0, optionIndex + 1);
213
- const exists = isOptionValueCombinationInEncodedVariant(
214
- topDownKey,
215
- encodedVariantExistence || ""
216
- );
217
- const available = isOptionValueCombinationInEncodedVariant(
218
- topDownKey,
219
- encodedVariantAvailability || ""
220
- );
221
- const variant = variants[targetKey] || value.firstSelectableVariant;
222
- let variantOptionParam = {};
223
- if (variant) {
224
- variantOptionParam = mapSelectedProductOptionToObject(
225
- variant.selectedOptions || []
226
- );
227
- }
228
- const searchParams = new URLSearchParams(variantOptionParam);
229
- const handle = ((_a = variant == null ? void 0 : variant.product) == null ? void 0 : _a.handle) || productHandle;
230
- return {
231
- ...value,
232
- variant,
233
- handle,
234
- variantUriQuery: searchParams.toString(),
235
- selected: selectedOptions[option.name] === value.name,
236
- exists,
237
- available,
238
- isDifferentProduct: handle !== productHandle
239
- };
240
- })
241
- };
242
- });
243
- return productOptions;
231
+ const checkedProduct = checkProductParam(product, true);
232
+ if (!checkedProduct.options) return [];
233
+ const { options, selectedOrFirstAvailableVariant: selectedVariant, adjacentVariants, encodedVariantExistence, encodedVariantAvailability, handle: productHandle } = checkedProduct;
234
+ const selectedOptionKeys = selectedVariant?.selectedOptions.map((option) => option.name);
235
+ const filteredOptions = options.filter((option) => {
236
+ return selectedOptionKeys && selectedOptionKeys.indexOf(option.name) >= 0;
237
+ });
238
+ const productOptionMappings = mapProductOptions(options);
239
+ const variants = mapVariants(selectedVariant ? [selectedVariant, ...adjacentVariants] : adjacentVariants);
240
+ const selectedOptions = mapSelectedProductOptionToObject(selectedVariant ? selectedVariant.selectedOptions : []);
241
+ return filteredOptions.map((option, optionIndex) => {
242
+ return {
243
+ ...option,
244
+ optionValues: option.optionValues.map((value) => {
245
+ const targetOptionParams = { ...selectedOptions };
246
+ targetOptionParams[option.name] = value.name;
247
+ const targetKey = encodeSelectedProductOptionAsKey(targetOptionParams || []);
248
+ const topDownKey = buildEncodingArrayFromSelectedOptions(targetOptionParams || [], productOptionMappings).slice(0, optionIndex + 1);
249
+ const exists = isOptionValueCombinationInEncodedVariant(topDownKey, encodedVariantExistence || "");
250
+ const available = isOptionValueCombinationInEncodedVariant(topDownKey, encodedVariantAvailability || "");
251
+ const variant = variants[targetKey] || value.firstSelectableVariant;
252
+ let variantOptionParam = {};
253
+ if (variant) variantOptionParam = mapSelectedProductOptionToObject(variant.selectedOptions || []);
254
+ const searchParams = new URLSearchParams(variantOptionParam);
255
+ const handle = variant?.product?.handle || productHandle;
256
+ return {
257
+ ...value,
258
+ variant,
259
+ handle,
260
+ variantUriQuery: searchParams.toString(),
261
+ selected: selectedOptions[option.name] === value.name,
262
+ exists,
263
+ available,
264
+ isDifferentProduct: handle !== productHandle
265
+ };
266
+ })
267
+ };
268
+ });
244
269
  }
245
- export {
246
- checkProductParam,
247
- getAdjacentAndFirstAvailableVariants,
248
- getProductOptions,
249
- mapSelectedProductOptionToObject
250
- };
251
- //# sourceMappingURL=getProductOptions.mjs.map
270
+ //#endregion
271
+ export { getAdjacentAndFirstAvailableVariants, getProductOptions, mapSelectedProductOptionToObject };
272
+
273
+ //# sourceMappingURL=getProductOptions.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"getProductOptions.mjs","sources":["../../src/getProductOptions.ts"],"sourcesContent":["import {isOptionValueCombinationInEncodedVariant} from './optionValueDecoder.js';\nimport type {\n Product,\n ProductOption,\n ProductOptionValue,\n ProductVariant,\n SelectedOption,\n} from './storefront-api-types';\n\nexport type RecursivePartial<T> = {\n [P in keyof T]?: RecursivePartial<T[P]>;\n};\ntype ProductOptionsMapping = Record<string, Record<string, number>>;\ntype ProductOptionValueState = {\n variant: ProductVariant;\n handle: string;\n variantUriQuery: string;\n selected: boolean;\n exists: boolean;\n available: boolean;\n isDifferentProduct: boolean;\n};\ntype MappedProductOptionValue = ProductOptionValue & ProductOptionValueState;\n\n/**\n * Creates a mapping of product options to their index for matching encoded values\n * For example, a product option of\n * [\n * \\{\n * name: 'Color',\n * optionValues: [\\{name: 'Red'\\}, \\{name: 'Blue'\\}]\n * \\},\n * \\{\n * name: 'Size',\n * optionValues: [\\{name: 'Small'\\}, \\{name: 'Medium'\\}, \\{name: 'Large'\\}]\n * \\}\n * ]\n * Would return\n * \\{\n * 'Color': \\{Red: 0, Blue: 1\\},\n * 'Size': \\{Small: 0, Medium: 1, Large: 2\\}\n * \\}\n */\nfunction mapProductOptions(options: ProductOption[]): ProductOptionsMapping {\n return Object.assign(\n {},\n ...options.map((option: ProductOption) => {\n return {\n [option.name]: Object.assign(\n {},\n ...(option?.optionValues\n ? option.optionValues.map((value, index) => {\n return {[value.name]: index};\n })\n : []),\n ),\n } as Record<string, number>;\n }),\n );\n}\n\n/**\n * Converts the product option into an Object\\<key, value\\> for building query params\n * For example, a selected product option of\n * [\n * \\{\n * name: 'Color',\n * value: 'Red',\n * \\},\n * \\{\n * name: 'Size',\n * value: 'Medium',\n * \\}\n * ]\n * Would return\n * \\{\n * Color: 'Red',\n * Size: 'Medium',\n * \\}\n * @publicDocs\n */\nexport function mapSelectedProductOptionToObject(\n options: Pick<SelectedOption, 'name' | 'value'>[],\n): Record<string, string> {\n return Object.assign(\n {},\n ...options.map((key) => {\n return {[key.name]: key.value};\n }),\n ) as Record<string, string>;\n}\n\n/**\n * Returns the JSON stringify result of mapSelectedProductOptionToObject\n */\nfunction mapSelectedProductOptionToObjectAsString(\n options: Pick<SelectedOption, 'name' | 'value'>[],\n): string {\n return JSON.stringify(mapSelectedProductOptionToObject(options));\n}\n\n/**\n * Encode the selected product option as a key for mapping to the encoded variants\n * For example, a selected product option of\n * [\n * \\{\n * name: 'Color',\n * value: 'Red',\n * \\},\n * \\{\n * name: 'Size',\n * value: 'Medium',\n * \\}\n * ]\n * Would return\n * JSON.stringify(\\{\n * Color: 'Red',\n * Size: 'Medium',\n * \\})\n */\nfunction encodeSelectedProductOptionAsKey(\n selectedOption:\n | Pick<SelectedOption, 'name' | 'value'>[]\n | Record<string, string>,\n): string {\n if (Array.isArray(selectedOption)) {\n return JSON.stringify(\n Object.assign(\n {},\n ...selectedOption.map((option) => ({[option.name]: option.value})),\n ),\n );\n } else {\n return JSON.stringify(selectedOption);\n }\n}\n\n/**\n * Build the encoding array for the given selected options. For example, if we have\n * the following productOptionMappings:\n *\n * \\{\n * 'Color': \\{Red: 0, Blue: 1\\},\n * 'Size': \\{Small: 0, Medium: 1, Large: 2\\}\n * \\}\n *\n * A selectedOption of\n *\n * \\{\n * Color: 'Red',\n * Size: 'Medium',\n * \\}\n *\n * `buildEncodingArrayFromSelectedOptions` will produce\n *\n * [0,1]\n *\n * If in the case where a selected option doesn't exists in the mapping array, for example:\n *\n * \\{\n * Color: 'Red',\n * Fabric: 'Cotton',\n * Size: 'Medium',\n * \\}\n *\n * `buildEncodingArrayFromSelectedOptions` will still produce\n *\n * [0,1]\n *\n * This can be caused by when we do not have all the product\n * option information for the loading optimistic variant\n */\nfunction buildEncodingArrayFromSelectedOptions(\n selectedOption: Record<string, string>,\n productOptionMappings: ProductOptionsMapping,\n): Array<number> {\n const encoding = Object.keys(selectedOption).map((key) => {\n return productOptionMappings[key]\n ? productOptionMappings[key][selectedOption[key]]\n : null;\n });\n return encoding.filter((code) => code !== null);\n}\n\n/**\n * Takes an array of product variants and maps them to an object with the encoded selected option values as the key.\n * For example, a product variant of\n * [\n * \\{\n * id: 1,\n * selectedOptions: [\n * \\{name: 'Color', value: 'Red'\\},\n * \\{name: 'Size', value: 'Small'\\},\n * ],\n * \\},\n * \\{\n * id: 2,\n * selectedOptions: [\n * \\{name: 'Color', value: 'Red'\\},\n * \\{name: 'Size', value: 'Medium'\\},\n * ],\n * \\}\n * ]\n * Would return\n * \\{\n * '[0,0]': \\{id: 1, selectedOptions: [\\{name: 'Color', value: 'Red'\\}, \\{name: 'Size', value: 'Small'\\}]\\},\n * '[0,1]': \\{id: 2, selectedOptions: [\\{name: 'Color', value: 'Red'\\}, \\{name: 'Size', value: 'Medium'\\}]\\},\n * \\}\n */\nfunction mapVariants(\n variants: ProductVariant[],\n): Record<string, ProductVariant> {\n return Object.assign(\n {},\n ...variants.map((variant) => {\n const variantKey = encodeSelectedProductOptionAsKey(\n variant.selectedOptions || [],\n );\n return {[variantKey]: variant};\n }),\n ) as Record<string, ProductVariant>;\n}\n\nexport type MappedProductOptions = Omit<ProductOption, 'optionValues'> & {\n optionValues: MappedProductOptionValue[];\n};\n\nconst PRODUCT_INPUTS = [\n 'options',\n 'selectedOrFirstAvailableVariant',\n 'adjacentVariants',\n];\n\nconst PRODUCT_INPUTS_EXTRA = [\n 'handle',\n 'encodedVariantExistence',\n 'encodedVariantAvailability',\n];\n\nfunction logErrorAndReturnFalse(key: string): boolean {\n console.error(\n `[h2:error:getProductOptions] product.${key} is missing. Make sure you query for this field from the Storefront API.`,\n );\n return false;\n}\n\nexport function checkProductParam(\n product: RecursivePartial<Product>,\n checkAll = false,\n): Product {\n let validParam = true;\n const productKeys = Object.keys(product);\n\n // Check product input\n (checkAll\n ? [...PRODUCT_INPUTS, ...PRODUCT_INPUTS_EXTRA]\n : PRODUCT_INPUTS\n ).forEach((key) => {\n if (!productKeys.includes(key)) {\n validParam = logErrorAndReturnFalse(key);\n }\n });\n\n // Check for nested options requirements\n if (product.options) {\n const firstOption = product?.options[0];\n\n if (checkAll && !firstOption?.name) {\n validParam = logErrorAndReturnFalse('options.name');\n }\n\n // Check for options.optionValues\n if (product?.options[0]?.optionValues) {\n let firstOptionValues = product.options[0].optionValues[0];\n\n // Check for options.optionValues.name\n if (checkAll && !firstOptionValues?.name) {\n validParam = logErrorAndReturnFalse('options.optionValues.name');\n }\n\n // It is possible for firstSelectableVariant to be null\n firstOptionValues = product.options[0].optionValues.filter(\n (value) => !!value?.firstSelectableVariant,\n )[0];\n\n // Check for options.optionValues.firstSelectableVariant\n if (firstOptionValues?.firstSelectableVariant) {\n // check product variant\n validParam = checkProductVariantParam(\n firstOptionValues.firstSelectableVariant,\n 'options.optionValues.firstSelectableVariant',\n validParam,\n checkAll,\n );\n }\n } else {\n validParam = logErrorAndReturnFalse('options.optionValues');\n }\n }\n\n // Check for nested selectedOrFirstAvailableVariant requirements\n if (product.selectedOrFirstAvailableVariant) {\n validParam = checkProductVariantParam(\n product.selectedOrFirstAvailableVariant,\n 'selectedOrFirstAvailableVariant',\n validParam,\n checkAll,\n );\n }\n\n // Check for nested adjacentVariants requirements\n if (!!product.adjacentVariants && product.adjacentVariants[0]) {\n validParam = checkProductVariantParam(\n product.adjacentVariants[0],\n 'adjacentVariants',\n validParam,\n checkAll,\n );\n }\n\n return (validParam ? product : {}) as Product;\n}\n\nfunction checkProductVariantParam(\n variant: RecursivePartial<ProductVariant>,\n key: string,\n currentValidParamState: boolean,\n checkAll: boolean,\n): boolean {\n let validParam = currentValidParamState;\n\n if (checkAll && !variant.product?.handle) {\n validParam = logErrorAndReturnFalse(`${key}.product.handle`);\n }\n if (variant.selectedOptions) {\n const firstSelectedOption = variant.selectedOptions[0];\n if (!firstSelectedOption?.name) {\n validParam = logErrorAndReturnFalse(`${key}.selectedOptions.name`);\n }\n if (!firstSelectedOption?.value) {\n validParam = logErrorAndReturnFalse(`${key}.selectedOptions.value`);\n }\n } else {\n validParam = logErrorAndReturnFalse(`${key}.selectedOptions`);\n }\n\n return validParam;\n}\n\n/**\n * Finds all the variants provided by adjacentVariants, options.optionValues.firstAvailableVariant,\n * and selectedOrFirstAvailableVariant and return them in a single array\n * @publicDocs\n */\nexport function getAdjacentAndFirstAvailableVariants(\n product: RecursivePartial<Product>,\n): ProductVariant[] {\n // Checks for valid product input\n const checkedProduct = checkProductParam(product);\n\n if (!checkedProduct.options) return [];\n\n const availableVariants: Record<string, ProductVariant> = {};\n checkedProduct.options.map((option) => {\n option.optionValues?.map((value) => {\n if (value.firstSelectableVariant) {\n const variantKey = mapSelectedProductOptionToObjectAsString(\n value.firstSelectableVariant.selectedOptions,\n );\n availableVariants[variantKey] = value.firstSelectableVariant;\n }\n });\n });\n\n checkedProduct.adjacentVariants.map((variant) => {\n const variantKey = mapSelectedProductOptionToObjectAsString(\n variant.selectedOptions,\n );\n availableVariants[variantKey] = variant;\n });\n\n const selectedVariant = checkedProduct.selectedOrFirstAvailableVariant;\n if (selectedVariant) {\n const variantKey = mapSelectedProductOptionToObjectAsString(\n selectedVariant.selectedOptions,\n );\n availableVariants[variantKey] = selectedVariant;\n }\n\n return Object.values(availableVariants);\n}\n\n/**\n * Returns a product options array with its relevant information\n * about the variant\n * @publicDocs\n */\nexport function getProductOptions(\n product: RecursivePartial<Product>,\n): MappedProductOptions[] {\n // Checks for valid product input\n const checkedProduct = checkProductParam(product, true);\n\n if (!checkedProduct.options) return [];\n\n const {\n options,\n selectedOrFirstAvailableVariant: selectedVariant,\n adjacentVariants,\n encodedVariantExistence,\n encodedVariantAvailability,\n handle: productHandle,\n } = checkedProduct;\n\n // The available product options is dictated by the selected options of the current variant:\n // Filter out un-used options (Happens on parent combined listing product)\n const selectedOptionKeys = selectedVariant?.selectedOptions.map(\n (option) => option.name,\n );\n const filteredOptions = options.filter((option) => {\n return selectedOptionKeys && selectedOptionKeys.indexOf(option.name) >= 0;\n });\n\n // Get a mapping of product option names to their index for matching encoded values\n const productOptionMappings = mapProductOptions(options);\n\n // Get the adjacent variants mapped to the encoded selected option values\n const variants = mapVariants(\n selectedVariant ? [selectedVariant, ...adjacentVariants] : adjacentVariants,\n );\n\n // Get the key:value version of selected options for building url query params\n const selectedOptions = mapSelectedProductOptionToObject(\n selectedVariant ? selectedVariant.selectedOptions : [],\n );\n\n const productOptions = filteredOptions.map((option, optionIndex) => {\n return {\n ...option,\n optionValues: option.optionValues.map((value) => {\n const targetOptionParams = {...selectedOptions}; // Clones the selected options\n\n // Modify the selected option value to the current option value\n targetOptionParams[option.name] = value.name;\n\n // Encode the new selected option values as a key for mapping to the product variants\n const targetKey = encodeSelectedProductOptionAsKey(\n targetOptionParams || [],\n );\n const encodingKey = buildEncodingArrayFromSelectedOptions(\n targetOptionParams || [],\n productOptionMappings,\n );\n\n // Top-down option check for existence and availability\n const topDownKey = encodingKey.slice(0, optionIndex + 1);\n const exists = isOptionValueCombinationInEncodedVariant(\n topDownKey,\n encodedVariantExistence || '',\n );\n const available = isOptionValueCombinationInEncodedVariant(\n topDownKey,\n encodedVariantAvailability || '',\n );\n\n // Get the variant for the current option value if exists, else use the first selectable variant\n const variant: ProductVariant =\n variants[targetKey] || value.firstSelectableVariant;\n\n // Build the query params for this option value\n let variantOptionParam = {};\n if (variant) {\n variantOptionParam = mapSelectedProductOptionToObject(\n variant.selectedOptions || [],\n );\n }\n const searchParams = new URLSearchParams(variantOptionParam);\n const handle = variant?.product?.handle || productHandle;\n\n return {\n ...value,\n variant,\n handle,\n variantUriQuery: searchParams.toString(),\n selected: selectedOptions[option.name] === value.name,\n exists,\n available,\n isDifferentProduct: handle !== productHandle,\n };\n }),\n };\n });\n\n return productOptions;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getProductOptions.mjs","names":[],"sources":["../../src/getProductOptions.ts"],"sourcesContent":["import {isOptionValueCombinationInEncodedVariant} from './optionValueDecoder.js';\nimport type {\n Product,\n ProductOption,\n ProductOptionValue,\n ProductVariant,\n SelectedOption,\n} from './storefront-api-types';\n\nexport type RecursivePartial<T> = {\n [P in keyof T]?: RecursivePartial<T[P]>;\n};\ntype ProductOptionsMapping = Record<string, Record<string, number>>;\ntype ProductOptionValueState = {\n variant: ProductVariant;\n handle: string;\n variantUriQuery: string;\n selected: boolean;\n exists: boolean;\n available: boolean;\n isDifferentProduct: boolean;\n};\ntype MappedProductOptionValue = ProductOptionValue & ProductOptionValueState;\n\n/**\n * Creates a mapping of product options to their index for matching encoded values\n * For example, a product option of\n * [\n * \\{\n * name: 'Color',\n * optionValues: [\\{name: 'Red'\\}, \\{name: 'Blue'\\}]\n * \\},\n * \\{\n * name: 'Size',\n * optionValues: [\\{name: 'Small'\\}, \\{name: 'Medium'\\}, \\{name: 'Large'\\}]\n * \\}\n * ]\n * Would return\n * \\{\n * 'Color': \\{Red: 0, Blue: 1\\},\n * 'Size': \\{Small: 0, Medium: 1, Large: 2\\}\n * \\}\n */\nfunction mapProductOptions(options: ProductOption[]): ProductOptionsMapping {\n return Object.assign(\n {},\n ...options.map((option: ProductOption) => {\n return {\n [option.name]: Object.assign(\n {},\n ...(option?.optionValues\n ? option.optionValues.map((value, index) => {\n return {[value.name]: index};\n })\n : []),\n ),\n } as Record<string, number>;\n }),\n );\n}\n\n/**\n * Converts the product option into an Object\\<key, value\\> for building query params\n * For example, a selected product option of\n * [\n * \\{\n * name: 'Color',\n * value: 'Red',\n * \\},\n * \\{\n * name: 'Size',\n * value: 'Medium',\n * \\}\n * ]\n * Would return\n * \\{\n * Color: 'Red',\n * Size: 'Medium',\n * \\}\n * @publicDocs\n */\nexport function mapSelectedProductOptionToObject(\n options: Pick<SelectedOption, 'name' | 'value'>[],\n): Record<string, string> {\n return Object.assign(\n {},\n ...options.map((key) => {\n return {[key.name]: key.value};\n }),\n ) as Record<string, string>;\n}\n\n/**\n * Returns the JSON stringify result of mapSelectedProductOptionToObject\n */\nfunction mapSelectedProductOptionToObjectAsString(\n options: Pick<SelectedOption, 'name' | 'value'>[],\n): string {\n return JSON.stringify(mapSelectedProductOptionToObject(options));\n}\n\n/**\n * Encode the selected product option as a key for mapping to the encoded variants\n * For example, a selected product option of\n * [\n * \\{\n * name: 'Color',\n * value: 'Red',\n * \\},\n * \\{\n * name: 'Size',\n * value: 'Medium',\n * \\}\n * ]\n * Would return\n * JSON.stringify(\\{\n * Color: 'Red',\n * Size: 'Medium',\n * \\})\n */\nfunction encodeSelectedProductOptionAsKey(\n selectedOption:\n | Pick<SelectedOption, 'name' | 'value'>[]\n | Record<string, string>,\n): string {\n if (Array.isArray(selectedOption)) {\n return JSON.stringify(\n Object.assign(\n {},\n ...selectedOption.map((option) => ({[option.name]: option.value})),\n ),\n );\n } else {\n return JSON.stringify(selectedOption);\n }\n}\n\n/**\n * Build the encoding array for the given selected options. For example, if we have\n * the following productOptionMappings:\n *\n * \\{\n * 'Color': \\{Red: 0, Blue: 1\\},\n * 'Size': \\{Small: 0, Medium: 1, Large: 2\\}\n * \\}\n *\n * A selectedOption of\n *\n * \\{\n * Color: 'Red',\n * Size: 'Medium',\n * \\}\n *\n * `buildEncodingArrayFromSelectedOptions` will produce\n *\n * [0,1]\n *\n * If in the case where a selected option doesn't exists in the mapping array, for example:\n *\n * \\{\n * Color: 'Red',\n * Fabric: 'Cotton',\n * Size: 'Medium',\n * \\}\n *\n * `buildEncodingArrayFromSelectedOptions` will still produce\n *\n * [0,1]\n *\n * This can be caused by when we do not have all the product\n * option information for the loading optimistic variant\n */\nfunction buildEncodingArrayFromSelectedOptions(\n selectedOption: Record<string, string>,\n productOptionMappings: ProductOptionsMapping,\n): Array<number> {\n const encoding = Object.keys(selectedOption).map((key) => {\n return productOptionMappings[key]\n ? productOptionMappings[key][selectedOption[key]]\n : null;\n });\n return encoding.filter((code) => code !== null);\n}\n\n/**\n * Takes an array of product variants and maps them to an object with the encoded selected option values as the key.\n * For example, a product variant of\n * [\n * \\{\n * id: 1,\n * selectedOptions: [\n * \\{name: 'Color', value: 'Red'\\},\n * \\{name: 'Size', value: 'Small'\\},\n * ],\n * \\},\n * \\{\n * id: 2,\n * selectedOptions: [\n * \\{name: 'Color', value: 'Red'\\},\n * \\{name: 'Size', value: 'Medium'\\},\n * ],\n * \\}\n * ]\n * Would return\n * \\{\n * '[0,0]': \\{id: 1, selectedOptions: [\\{name: 'Color', value: 'Red'\\}, \\{name: 'Size', value: 'Small'\\}]\\},\n * '[0,1]': \\{id: 2, selectedOptions: [\\{name: 'Color', value: 'Red'\\}, \\{name: 'Size', value: 'Medium'\\}]\\},\n * \\}\n */\nfunction mapVariants(\n variants: ProductVariant[],\n): Record<string, ProductVariant> {\n return Object.assign(\n {},\n ...variants.map((variant) => {\n const variantKey = encodeSelectedProductOptionAsKey(\n variant.selectedOptions || [],\n );\n return {[variantKey]: variant};\n }),\n ) as Record<string, ProductVariant>;\n}\n\nexport type MappedProductOptions = Omit<ProductOption, 'optionValues'> & {\n optionValues: MappedProductOptionValue[];\n};\n\nconst PRODUCT_INPUTS = [\n 'options',\n 'selectedOrFirstAvailableVariant',\n 'adjacentVariants',\n];\n\nconst PRODUCT_INPUTS_EXTRA = [\n 'handle',\n 'encodedVariantExistence',\n 'encodedVariantAvailability',\n];\n\nfunction logErrorAndReturnFalse(key: string): boolean {\n console.error(\n `[h2:error:getProductOptions] product.${key} is missing. Make sure you query for this field from the Storefront API.`,\n );\n return false;\n}\n\nexport function checkProductParam(\n product: RecursivePartial<Product>,\n checkAll = false,\n): Product {\n let validParam = true;\n const productKeys = Object.keys(product);\n\n // Check product input\n (checkAll\n ? [...PRODUCT_INPUTS, ...PRODUCT_INPUTS_EXTRA]\n : PRODUCT_INPUTS\n ).forEach((key) => {\n if (!productKeys.includes(key)) {\n validParam = logErrorAndReturnFalse(key);\n }\n });\n\n // Check for nested options requirements\n if (product.options) {\n const firstOption = product?.options[0];\n\n if (checkAll && !firstOption?.name) {\n validParam = logErrorAndReturnFalse('options.name');\n }\n\n // Check for options.optionValues\n if (product?.options[0]?.optionValues) {\n let firstOptionValues = product.options[0].optionValues[0];\n\n // Check for options.optionValues.name\n if (checkAll && !firstOptionValues?.name) {\n validParam = logErrorAndReturnFalse('options.optionValues.name');\n }\n\n // It is possible for firstSelectableVariant to be null\n firstOptionValues = product.options[0].optionValues.filter(\n (value) => !!value?.firstSelectableVariant,\n )[0];\n\n // Check for options.optionValues.firstSelectableVariant\n if (firstOptionValues?.firstSelectableVariant) {\n // check product variant\n validParam = checkProductVariantParam(\n firstOptionValues.firstSelectableVariant,\n 'options.optionValues.firstSelectableVariant',\n validParam,\n checkAll,\n );\n }\n } else {\n validParam = logErrorAndReturnFalse('options.optionValues');\n }\n }\n\n // Check for nested selectedOrFirstAvailableVariant requirements\n if (product.selectedOrFirstAvailableVariant) {\n validParam = checkProductVariantParam(\n product.selectedOrFirstAvailableVariant,\n 'selectedOrFirstAvailableVariant',\n validParam,\n checkAll,\n );\n }\n\n // Check for nested adjacentVariants requirements\n if (!!product.adjacentVariants && product.adjacentVariants[0]) {\n validParam = checkProductVariantParam(\n product.adjacentVariants[0],\n 'adjacentVariants',\n validParam,\n checkAll,\n );\n }\n\n return (validParam ? product : {}) as Product;\n}\n\nfunction checkProductVariantParam(\n variant: RecursivePartial<ProductVariant>,\n key: string,\n currentValidParamState: boolean,\n checkAll: boolean,\n): boolean {\n let validParam = currentValidParamState;\n\n if (checkAll && !variant.product?.handle) {\n validParam = logErrorAndReturnFalse(`${key}.product.handle`);\n }\n if (variant.selectedOptions) {\n const firstSelectedOption = variant.selectedOptions[0];\n if (!firstSelectedOption?.name) {\n validParam = logErrorAndReturnFalse(`${key}.selectedOptions.name`);\n }\n if (!firstSelectedOption?.value) {\n validParam = logErrorAndReturnFalse(`${key}.selectedOptions.value`);\n }\n } else {\n validParam = logErrorAndReturnFalse(`${key}.selectedOptions`);\n }\n\n return validParam;\n}\n\n/**\n * Finds all the variants provided by adjacentVariants, options.optionValues.firstAvailableVariant,\n * and selectedOrFirstAvailableVariant and return them in a single array\n * @publicDocs\n */\nexport function getAdjacentAndFirstAvailableVariants(\n product: RecursivePartial<Product>,\n): ProductVariant[] {\n // Checks for valid product input\n const checkedProduct = checkProductParam(product);\n\n if (!checkedProduct.options) return [];\n\n const availableVariants: Record<string, ProductVariant> = {};\n checkedProduct.options.map((option) => {\n option.optionValues?.map((value) => {\n if (value.firstSelectableVariant) {\n const variantKey = mapSelectedProductOptionToObjectAsString(\n value.firstSelectableVariant.selectedOptions,\n );\n availableVariants[variantKey] = value.firstSelectableVariant;\n }\n });\n });\n\n checkedProduct.adjacentVariants.map((variant) => {\n const variantKey = mapSelectedProductOptionToObjectAsString(\n variant.selectedOptions,\n );\n availableVariants[variantKey] = variant;\n });\n\n const selectedVariant = checkedProduct.selectedOrFirstAvailableVariant;\n if (selectedVariant) {\n const variantKey = mapSelectedProductOptionToObjectAsString(\n selectedVariant.selectedOptions,\n );\n availableVariants[variantKey] = selectedVariant;\n }\n\n return Object.values(availableVariants);\n}\n\n/**\n * Returns a product options array with its relevant information\n * about the variant\n * @publicDocs\n */\nexport function getProductOptions(\n product: RecursivePartial<Product>,\n): MappedProductOptions[] {\n // Checks for valid product input\n const checkedProduct = checkProductParam(product, true);\n\n if (!checkedProduct.options) return [];\n\n const {\n options,\n selectedOrFirstAvailableVariant: selectedVariant,\n adjacentVariants,\n encodedVariantExistence,\n encodedVariantAvailability,\n handle: productHandle,\n } = checkedProduct;\n\n // The available product options is dictated by the selected options of the current variant:\n // Filter out un-used options (Happens on parent combined listing product)\n const selectedOptionKeys = selectedVariant?.selectedOptions.map(\n (option) => option.name,\n );\n const filteredOptions = options.filter((option) => {\n return selectedOptionKeys && selectedOptionKeys.indexOf(option.name) >= 0;\n });\n\n // Get a mapping of product option names to their index for matching encoded values\n const productOptionMappings = mapProductOptions(options);\n\n // Get the adjacent variants mapped to the encoded selected option values\n const variants = mapVariants(\n selectedVariant ? [selectedVariant, ...adjacentVariants] : adjacentVariants,\n );\n\n // Get the key:value version of selected options for building url query params\n const selectedOptions = mapSelectedProductOptionToObject(\n selectedVariant ? selectedVariant.selectedOptions : [],\n );\n\n const productOptions = filteredOptions.map((option, optionIndex) => {\n return {\n ...option,\n optionValues: option.optionValues.map((value) => {\n const targetOptionParams = {...selectedOptions}; // Clones the selected options\n\n // Modify the selected option value to the current option value\n targetOptionParams[option.name] = value.name;\n\n // Encode the new selected option values as a key for mapping to the product variants\n const targetKey = encodeSelectedProductOptionAsKey(\n targetOptionParams || [],\n );\n const encodingKey = buildEncodingArrayFromSelectedOptions(\n targetOptionParams || [],\n productOptionMappings,\n );\n\n // Top-down option check for existence and availability\n const topDownKey = encodingKey.slice(0, optionIndex + 1);\n const exists = isOptionValueCombinationInEncodedVariant(\n topDownKey,\n encodedVariantExistence || '',\n );\n const available = isOptionValueCombinationInEncodedVariant(\n topDownKey,\n encodedVariantAvailability || '',\n );\n\n // Get the variant for the current option value if exists, else use the first selectable variant\n const variant: ProductVariant =\n variants[targetKey] || value.firstSelectableVariant;\n\n // Build the query params for this option value\n let variantOptionParam = {};\n if (variant) {\n variantOptionParam = mapSelectedProductOptionToObject(\n variant.selectedOptions || [],\n );\n }\n const searchParams = new URLSearchParams(variantOptionParam);\n const handle = variant?.product?.handle || productHandle;\n\n return {\n ...value,\n variant,\n handle,\n variantUriQuery: searchParams.toString(),\n selected: selectedOptions[option.name] === value.name,\n exists,\n available,\n isDifferentProduct: handle !== productHandle,\n };\n }),\n };\n });\n\n return productOptions;\n}\n"],"mappings":"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"}