@shopify/hydrogen 0.22.1 → 0.25.0

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 (445) hide show
  1. package/CHANGELOG.md +378 -0
  2. package/dist/esnext/components/AddToCartButton/AddToCartButton.client.d.ts +2 -5
  3. package/dist/esnext/components/AddToCartButton/AddToCartButton.client.js +18 -17
  4. package/dist/esnext/components/BaseButton/BaseButton.client.d.ts +14 -0
  5. package/dist/esnext/components/BaseButton/BaseButton.client.js +15 -0
  6. package/dist/esnext/components/BaseButton/index.d.ts +1 -0
  7. package/dist/esnext/components/BaseButton/index.js +1 -0
  8. package/dist/esnext/components/BuyNowButton/BuyNowButton.client.d.ts +2 -5
  9. package/dist/esnext/components/BuyNowButton/BuyNowButton.client.js +5 -4
  10. package/dist/esnext/components/CartEstimatedCost/CartEstimatedCost.client.js +4 -4
  11. package/dist/esnext/components/CartLinePrice/CartLinePrice.client.js +5 -8
  12. package/dist/esnext/components/CartLineProvider/context.d.ts +10 -0
  13. package/dist/esnext/components/CartLineQuantityAdjustButton/CartLineQuantityAdjustButton.d.ts +4 -5
  14. package/dist/esnext/components/CartLineQuantityAdjustButton/CartLineQuantityAdjustButton.js +16 -14
  15. package/dist/esnext/components/CartLines/{CartLines.d.ts → CartLines.client.d.ts} +0 -0
  16. package/dist/esnext/components/CartLines/{CartLines.js → CartLines.client.js} +1 -1
  17. package/dist/esnext/components/CartLines/index.d.ts +1 -1
  18. package/dist/esnext/components/CartLines/index.js +1 -1
  19. package/dist/esnext/components/CartProvider/CartProvider.client.js +31 -38
  20. package/dist/esnext/components/CartProvider/cart-queries.d.ts +1 -1
  21. package/dist/esnext/components/CartProvider/cart-queries.js +11 -0
  22. package/dist/esnext/components/CartProvider/graphql/CartAttributesUpdateMutation.d.ts +11 -1
  23. package/dist/esnext/components/CartProvider/graphql/CartBuyerIdentityUpdateMutation.d.ts +11 -1
  24. package/dist/esnext/components/CartProvider/graphql/CartCreateMutation.d.ts +11 -1
  25. package/dist/esnext/components/CartProvider/graphql/CartDiscountCodesUpdateMutation.d.ts +11 -1
  26. package/dist/esnext/components/CartProvider/graphql/CartFragment.d.ts +11 -1
  27. package/dist/esnext/components/CartProvider/graphql/CartLineAddMutation.d.ts +11 -1
  28. package/dist/esnext/components/CartProvider/graphql/CartLineRemoveMutation.d.ts +11 -1
  29. package/dist/esnext/components/CartProvider/graphql/CartLineUpdateMutation.d.ts +11 -1
  30. package/dist/esnext/components/CartProvider/graphql/CartNoteUpdateMutation.d.ts +11 -1
  31. package/dist/esnext/components/CartProvider/graphql/CartQuery.d.ts +11 -1
  32. package/dist/esnext/components/CartProvider/hooks.client.js +5 -8
  33. package/dist/esnext/components/CartProvider/types.d.ts +2 -0
  34. package/dist/esnext/components/ExternalVideo/ExternalVideo.js +1 -1
  35. package/dist/esnext/components/Image/Image.d.ts +21 -0
  36. package/dist/esnext/components/Image/Image.js +88 -14
  37. package/dist/esnext/components/Link/Link.client.d.ts +2 -0
  38. package/dist/esnext/components/Link/Link.client.js +8 -5
  39. package/dist/esnext/components/LocalizationProvider/LocalizationProvider.server.js +2 -2
  40. package/dist/esnext/components/Metafield/Metafield.client.d.ts +6 -10
  41. package/dist/esnext/components/Metafield/Metafield.client.js +67 -31
  42. package/dist/esnext/components/Metafield/components/StarRating/StarRating.js +1 -1
  43. package/dist/esnext/components/ModelViewer/ModelViewer.client.js +2 -3
  44. package/dist/esnext/components/Money/Money.client.js +1 -1
  45. package/dist/esnext/components/ProductOptionsProvider/ProductOptionsProvider.client.d.ts +21 -0
  46. package/dist/esnext/components/ProductOptionsProvider/ProductOptionsProvider.client.js +133 -0
  47. package/dist/esnext/components/ProductOptionsProvider/context.d.ts +2 -0
  48. package/dist/esnext/components/{ProductProvider → ProductOptionsProvider}/context.js +0 -1
  49. package/dist/esnext/components/ProductOptionsProvider/index.d.ts +2 -0
  50. package/dist/esnext/components/ProductOptionsProvider/index.js +2 -0
  51. package/dist/esnext/components/ProductPrice/ProductPrice.client.d.ts +5 -2
  52. package/dist/esnext/components/ProductPrice/ProductPrice.client.js +10 -12
  53. package/dist/esnext/components/Seo/CollectionSeo.client.js +2 -3
  54. package/dist/esnext/components/Seo/DefaultPageSeo.client.js +3 -3
  55. package/dist/esnext/components/Seo/NoIndexSeo.client.js +2 -2
  56. package/dist/esnext/components/Seo/PageSeo.client.js +2 -3
  57. package/dist/esnext/components/Seo/ProductSeo.client.js +9 -10
  58. package/dist/esnext/components/ShopPayButton/ShopPayButton.client.js +2 -3
  59. package/dist/esnext/components/Video/Video.js +2 -3
  60. package/dist/esnext/components/index.d.ts +1 -1
  61. package/dist/esnext/components/index.js +1 -1
  62. package/dist/esnext/config.d.ts +4 -0
  63. package/dist/esnext/config.js +4 -0
  64. package/dist/esnext/constants.d.ts +2 -0
  65. package/dist/esnext/constants.js +2 -0
  66. package/dist/esnext/entry-client.js +107 -21
  67. package/dist/esnext/entry-server.d.ts +2 -31
  68. package/dist/esnext/entry-server.js +400 -335
  69. package/dist/esnext/foundation/Analytics/Analytics.client.js +15 -13
  70. package/dist/esnext/foundation/Analytics/Analytics.server.js +27 -20
  71. package/dist/esnext/foundation/Analytics/ClientAnalytics.d.ts +4 -2
  72. package/dist/esnext/foundation/Analytics/ClientAnalytics.js +16 -14
  73. package/dist/esnext/foundation/Analytics/ServerAnalyticsRoute.d.ts +4 -0
  74. package/dist/esnext/foundation/Analytics/ServerAnalyticsRoute.js +36 -0
  75. package/dist/esnext/foundation/Analytics/connectors/PerformanceMetrics/ServerAnalyticsConnector.d.ts +3 -0
  76. package/dist/esnext/foundation/Analytics/connectors/PerformanceMetrics/ServerAnalyticsConnector.js +27 -0
  77. package/dist/esnext/foundation/Analytics/connectors/Shopify/ServerAnalyticsConnector.d.ts +3 -0
  78. package/dist/esnext/foundation/Analytics/connectors/Shopify/ServerAnalyticsConnector.js +21 -0
  79. package/dist/esnext/foundation/Analytics/connectors/Shopify/ShopifyAnalytics.client.d.ts +3 -0
  80. package/dist/esnext/foundation/Analytics/connectors/Shopify/ShopifyAnalytics.client.js +190 -0
  81. package/dist/esnext/foundation/Analytics/connectors/Shopify/ShopifyAnalytics.server.d.ts +3 -0
  82. package/dist/esnext/foundation/Analytics/connectors/Shopify/ShopifyAnalytics.server.js +23 -0
  83. package/dist/esnext/foundation/Analytics/connectors/Shopify/const.d.ts +28 -0
  84. package/dist/esnext/foundation/Analytics/connectors/Shopify/const.js +51 -0
  85. package/dist/esnext/foundation/Analytics/connectors/Shopify/utils.d.ts +3 -0
  86. package/dist/esnext/foundation/Analytics/connectors/Shopify/utils.js +56 -0
  87. package/dist/esnext/foundation/Analytics/hook.js +4 -2
  88. package/dist/esnext/foundation/Analytics/utils.d.ts +2 -0
  89. package/dist/esnext/foundation/Analytics/utils.js +21 -0
  90. package/dist/esnext/foundation/BuiltInRoutes/BuiltInRoutes.d.ts +2 -0
  91. package/dist/esnext/foundation/BuiltInRoutes/BuiltInRoutes.js +23 -0
  92. package/dist/esnext/foundation/BuiltInRoutes/healthCheck.d.ts +1 -0
  93. package/dist/esnext/foundation/BuiltInRoutes/healthCheck.js +3 -0
  94. package/dist/{node/framework → esnext/foundation/Cache}/cache-sub-request.d.ts +1 -1
  95. package/dist/esnext/{framework → foundation/Cache}/cache-sub-request.js +4 -4
  96. package/dist/esnext/{framework → foundation/Cache}/cache.d.ts +1 -1
  97. package/dist/esnext/{framework → foundation/Cache}/cache.js +4 -4
  98. package/dist/esnext/foundation/Cache/strategies/index.d.ts +7 -0
  99. package/dist/esnext/foundation/Cache/strategies/index.js +54 -0
  100. package/dist/esnext/foundation/Cookie/Cookie.d.ts +3 -3
  101. package/dist/esnext/foundation/Cookie/Cookie.js +5 -0
  102. package/dist/esnext/foundation/DevTools/DevTools.client.d.ts +3 -0
  103. package/dist/esnext/foundation/DevTools/DevTools.client.js +17 -0
  104. package/dist/esnext/foundation/DevTools/DevTools.server.d.ts +1 -0
  105. package/dist/esnext/foundation/DevTools/DevTools.server.js +14 -0
  106. package/dist/esnext/foundation/DevTools/components/GraphQL.client.d.ts +1 -0
  107. package/dist/esnext/foundation/DevTools/components/GraphQL.client.js +25 -0
  108. package/dist/esnext/foundation/DevTools/components/Heading.d.ts +5 -0
  109. package/dist/esnext/foundation/DevTools/components/Heading.js +12 -0
  110. package/dist/esnext/foundation/DevTools/components/Interface.client.d.ts +11 -0
  111. package/dist/esnext/foundation/DevTools/components/Interface.client.js +47 -0
  112. package/dist/esnext/foundation/DevTools/components/Panels.d.ts +8 -0
  113. package/dist/esnext/foundation/DevTools/components/Panels.js +60 -0
  114. package/dist/esnext/foundation/DevTools/components/Performance.client.d.ts +14 -0
  115. package/dist/esnext/foundation/DevTools/components/Performance.client.js +26 -0
  116. package/dist/esnext/foundation/DevTools/components/Settings.client.d.ts +7 -0
  117. package/dist/esnext/foundation/DevTools/components/Settings.client.js +20 -0
  118. package/dist/esnext/foundation/DevTools/components/Table.d.ts +9 -0
  119. package/dist/esnext/foundation/DevTools/components/Table.js +7 -0
  120. package/dist/esnext/foundation/DevTools/components/icons.d.ts +2 -0
  121. package/dist/esnext/foundation/DevTools/components/icons.js +13 -0
  122. package/dist/esnext/foundation/DevTools/components/index.d.ts +2 -0
  123. package/dist/esnext/foundation/DevTools/components/index.js +2 -0
  124. package/dist/esnext/foundation/FileRoutes/FileRoutes.server.js +4 -4
  125. package/dist/{node/framework/Hydration → esnext/foundation/Html}/Html.d.ts +3 -1
  126. package/dist/esnext/{framework/Hydration → foundation/Html}/Html.js +15 -5
  127. package/dist/esnext/{framework/Hydration/ServerComponentRequest.server.d.ts → foundation/HydrogenRequest/HydrogenRequest.server.d.ts} +14 -4
  128. package/dist/esnext/{framework/Hydration/ServerComponentRequest.server.js → foundation/HydrogenRequest/HydrogenRequest.server.js} +70 -12
  129. package/dist/esnext/{framework/Hydration/ServerComponentResponse.server.d.ts → foundation/HydrogenResponse/HydrogenResponse.server.d.ts} +6 -11
  130. package/dist/esnext/foundation/HydrogenResponse/HydrogenResponse.server.js +48 -0
  131. package/dist/esnext/foundation/Router/BrowserRouter.client.js +15 -9
  132. package/dist/esnext/foundation/ServerPropsProvider/ServerPropsProvider.d.ts +2 -1
  133. package/dist/esnext/foundation/ServerPropsProvider/ServerPropsProvider.js +1 -1
  134. package/dist/esnext/foundation/ServerRequestProvider/ServerRequestProvider.d.ts +5 -6
  135. package/dist/esnext/foundation/ServerRequestProvider/ServerRequestProvider.js +19 -24
  136. package/dist/esnext/foundation/ServerStateProvider/ServerStateProvider.d.ts +1 -1
  137. package/dist/esnext/foundation/ServerStateProvider/ServerStateProvider.js +1 -1
  138. package/dist/esnext/foundation/ShopifyProvider/ShopifyProvider.server.js +4 -5
  139. package/dist/esnext/foundation/fetchSync/server/fetchSync.js +1 -1
  140. package/dist/esnext/foundation/index.d.ts +1 -1
  141. package/dist/esnext/foundation/index.js +1 -1
  142. package/dist/esnext/foundation/runtime.d.ts +2 -0
  143. package/dist/esnext/foundation/runtime.js +6 -0
  144. package/dist/esnext/foundation/session/session.d.ts +3 -3
  145. package/dist/esnext/foundation/ssr-interop.d.ts +2 -2
  146. package/dist/esnext/foundation/useNavigate/useNavigate.d.ts +2 -0
  147. package/dist/esnext/foundation/useNavigate/useNavigate.js +10 -4
  148. package/dist/esnext/foundation/useQuery/hooks.d.ts +1 -0
  149. package/dist/esnext/foundation/useQuery/hooks.js +29 -18
  150. package/dist/esnext/foundation/useRequestContext/index.d.ts +15 -0
  151. package/dist/esnext/foundation/useRequestContext/index.js +23 -0
  152. package/dist/esnext/foundation/useServerProps/use-server-props.js +2 -2
  153. package/dist/esnext/foundation/useSession/useSession.js +1 -2
  154. package/dist/esnext/foundation/useUrl/useUrl.js +1 -2
  155. package/dist/esnext/framework/cache/in-memory.js +3 -3
  156. package/dist/esnext/framework/middleware.d.ts +1 -1
  157. package/dist/esnext/framework/middleware.js +3 -4
  158. package/dist/esnext/framework/plugin.d.ts +7 -3
  159. package/dist/esnext/framework/plugin.js +4 -1
  160. package/dist/esnext/framework/plugins/vite-plugin-client-imports.js +1 -1
  161. package/dist/esnext/framework/plugins/vite-plugin-hydrogen-config.js +70 -64
  162. package/dist/esnext/framework/plugins/vite-plugin-hydrogen-middleware.d.ts +1 -1
  163. package/dist/esnext/framework/plugins/vite-plugin-hydrogen-middleware.js +3 -4
  164. package/dist/esnext/framework/plugins/vite-plugin-hydrogen-rsc.js +5 -13
  165. package/dist/esnext/framework/plugins/vite-plugin-hydrogen-suppress-warnings.d.ts +3 -0
  166. package/dist/esnext/framework/plugins/vite-plugin-hydrogen-suppress-warnings.js +19 -0
  167. package/dist/esnext/framework/plugins/vite-plugin-hydrogen-virtual-files.d.ts +1 -1
  168. package/dist/esnext/framework/plugins/vite-plugin-hydrogen-virtual-files.js +6 -4
  169. package/dist/esnext/framework/types.d.ts +5 -0
  170. package/dist/esnext/framework/types.js +1 -0
  171. package/dist/esnext/hooks/index.d.ts +0 -1
  172. package/dist/esnext/hooks/index.js +0 -1
  173. package/dist/esnext/hooks/useCartLine/useCartLine.d.ts +10 -0
  174. package/dist/esnext/hooks/useMoney/hooks.js +53 -39
  175. package/dist/esnext/hooks/useProductOptions/helpers.js +6 -10
  176. package/dist/esnext/hooks/useProductOptions/types.d.ts +17 -15
  177. package/dist/esnext/hooks/useProductOptions/useProductOptions.client.d.ts +1 -15
  178. package/dist/esnext/hooks/useProductOptions/useProductOptions.client.js +8 -107
  179. package/dist/esnext/hooks/useShopQuery/hooks.js +30 -18
  180. package/dist/esnext/index.d.ts +7 -5
  181. package/dist/esnext/index.js +5 -5
  182. package/dist/esnext/shared-types.d.ts +26 -0
  183. package/dist/esnext/shared-types.js +4 -0
  184. package/dist/esnext/storefront-api-types.d.ts +37 -443
  185. package/dist/esnext/streaming.server.d.ts +9 -19
  186. package/dist/esnext/streaming.server.js +2 -11
  187. package/dist/esnext/types.d.ts +40 -40
  188. package/dist/esnext/types.js +1 -1
  189. package/dist/esnext/utilities/apiRoutes.d.ts +8 -4
  190. package/dist/esnext/utilities/apiRoutes.js +6 -4
  191. package/dist/esnext/utilities/devtools.d.ts +1 -1
  192. package/dist/esnext/utilities/devtools.js +3 -3
  193. package/dist/esnext/utilities/flattenConnection/flattenConnection.d.ts +1 -0
  194. package/dist/esnext/utilities/flattenConnection/flattenConnection.js +13 -6
  195. package/dist/esnext/utilities/graphql-tracker.js +7 -9
  196. package/dist/esnext/utilities/hash.d.ts +2 -2
  197. package/dist/esnext/utilities/hash.js +29 -6
  198. package/dist/esnext/utilities/image_size.d.ts +24 -3
  199. package/dist/esnext/utilities/image_size.js +53 -31
  200. package/dist/esnext/utilities/index.d.ts +2 -2
  201. package/dist/esnext/utilities/index.js +2 -2
  202. package/dist/esnext/utilities/isBrowser/index.d.ts +1 -0
  203. package/dist/esnext/utilities/isBrowser/index.js +1 -0
  204. package/dist/esnext/utilities/isBrowser/isBrowser.d.ts +4 -0
  205. package/dist/esnext/utilities/isBrowser/isBrowser.js +6 -0
  206. package/dist/esnext/utilities/isServer/isServer.js +2 -2
  207. package/dist/esnext/utilities/load_script.js +1 -1
  208. package/dist/esnext/utilities/log/index.d.ts +1 -1
  209. package/dist/esnext/utilities/log/index.js +1 -1
  210. package/dist/esnext/utilities/log/log-cache-api-status.js +3 -2
  211. package/dist/esnext/utilities/log/log-cache-header.d.ts +4 -4
  212. package/dist/esnext/utilities/log/log-query-timeline.d.ts +3 -3
  213. package/dist/esnext/utilities/log/log-query-timeline.js +29 -10
  214. package/dist/esnext/utilities/log/log.d.ts +17 -11
  215. package/dist/esnext/utilities/log/log.js +28 -20
  216. package/dist/esnext/utilities/log/utils.js +1 -6
  217. package/dist/esnext/utilities/parseMetafield/index.d.ts +1 -0
  218. package/dist/esnext/utilities/parseMetafield/index.js +1 -0
  219. package/dist/esnext/utilities/parseMetafield/parseMetafield.d.ts +15 -0
  220. package/dist/esnext/utilities/{parseMetafieldValue/parseMetafieldValue.js → parseMetafield/parseMetafield.js} +28 -2
  221. package/dist/esnext/utilities/storefrontApi.js +9 -5
  222. package/dist/esnext/utilities/template.js +1 -2
  223. package/dist/esnext/utilities/web-api-polyfill.js +6 -0
  224. package/dist/esnext/version.d.ts +1 -1
  225. package/dist/esnext/version.js +1 -1
  226. package/dist/node/framework/cache/in-memory.js +3 -3
  227. package/dist/node/framework/middleware.d.ts +1 -1
  228. package/dist/node/framework/middleware.js +3 -4
  229. package/dist/node/framework/plugin.d.ts +4 -3
  230. package/dist/node/framework/plugin.js +5 -2
  231. package/dist/node/framework/plugins/vite-plugin-client-imports.js +1 -1
  232. package/dist/node/framework/plugins/vite-plugin-hydrogen-config.js +70 -64
  233. package/dist/node/framework/plugins/vite-plugin-hydrogen-middleware.d.ts +1 -1
  234. package/dist/node/framework/plugins/vite-plugin-hydrogen-middleware.js +3 -4
  235. package/dist/node/framework/plugins/vite-plugin-hydrogen-rsc.js +6 -14
  236. package/dist/node/framework/plugins/vite-plugin-hydrogen-suppress-warnings.d.ts +3 -0
  237. package/dist/node/framework/plugins/vite-plugin-hydrogen-suppress-warnings.js +21 -0
  238. package/dist/node/framework/plugins/vite-plugin-hydrogen-virtual-files.d.ts +1 -1
  239. package/dist/node/framework/plugins/vite-plugin-hydrogen-virtual-files.js +6 -4
  240. package/dist/node/framework/types.d.ts +5 -0
  241. package/dist/node/{foundation/Analytics → framework}/types.js +0 -0
  242. package/dist/node/shared-types.d.ts +26 -0
  243. package/dist/node/shared-types.js +5 -0
  244. package/dist/node/utilities/web-api-polyfill.js +6 -0
  245. package/package.json +34 -26
  246. package/vendor/react-server-dom-vite/cjs/react-server-dom-vite-plugin.js +275 -60
  247. package/vendor/react-server-dom-vite/cjs/react-server-dom-vite-writer.browser.development.server.js +119 -64
  248. package/vendor/react-server-dom-vite/cjs/react-server-dom-vite-writer.browser.production.min.server.js +33 -32
  249. package/vendor/react-server-dom-vite/cjs/react-server-dom-vite-writer.node.development.server.js +241 -75
  250. package/vendor/react-server-dom-vite/cjs/react-server-dom-vite-writer.node.production.min.server.js +38 -35
  251. package/vendor/react-server-dom-vite/cjs/react-server-dom-vite.development.js +9 -8
  252. package/vendor/react-server-dom-vite/cjs/react-server-dom-vite.production.min.js +3 -3
  253. package/vendor/react-server-dom-vite/esm/react-server-dom-vite-client-proxy.js +3 -9
  254. package/vendor/react-server-dom-vite/esm/react-server-dom-vite-plugin.js +276 -61
  255. package/vendor/react-server-dom-vite/esm/react-server-dom-vite-writer.browser.server.js +119 -64
  256. package/vendor/react-server-dom-vite/esm/react-server-dom-vite-writer.node.server.js +241 -75
  257. package/vendor/react-server-dom-vite/esm/react-server-dom-vite.js +9 -8
  258. package/vendor/react-server-dom-vite/package.json +1 -1
  259. package/client.d.ts +0 -1
  260. package/client.js +0 -1
  261. package/config.d.ts +0 -1
  262. package/config.js +0 -1
  263. package/dist/esnext/components/DevTools.client.d.ts +0 -1
  264. package/dist/esnext/components/DevTools.client.js +0 -129
  265. package/dist/esnext/components/ProductProvider/ProductOptionsProvider.client.d.ts +0 -8
  266. package/dist/esnext/components/ProductProvider/ProductOptionsProvider.client.js +0 -12
  267. package/dist/esnext/components/ProductProvider/ProductProvider.client.d.ts +0 -24
  268. package/dist/esnext/components/ProductProvider/ProductProvider.client.js +0 -34
  269. package/dist/esnext/components/ProductProvider/context.d.ts +0 -29
  270. package/dist/esnext/components/ProductProvider/index.d.ts +0 -2
  271. package/dist/esnext/components/ProductProvider/index.js +0 -2
  272. package/dist/esnext/foundation/Analytics/ServerAnalyticsRoute.server.d.ts +0 -2
  273. package/dist/esnext/foundation/Analytics/ServerAnalyticsRoute.server.js +0 -33
  274. package/dist/esnext/foundation/Analytics/connectors/PerformanceMetrics/PerformanceMetrics.server.d.ts +0 -1
  275. package/dist/esnext/foundation/Analytics/connectors/PerformanceMetrics/PerformanceMetrics.server.js +0 -24
  276. package/dist/esnext/framework/CachingStrategy/index.d.ts +0 -10
  277. package/dist/esnext/framework/CachingStrategy/index.js +0 -96
  278. package/dist/esnext/framework/Hydration/Html.d.ts +0 -11
  279. package/dist/esnext/framework/Hydration/ServerComponentResponse.server.js +0 -42
  280. package/dist/esnext/framework/Hydration/rsc.d.ts +0 -8
  281. package/dist/esnext/framework/Hydration/rsc.js +0 -100
  282. package/dist/esnext/framework/cache-sub-request.d.ts +0 -17
  283. package/dist/esnext/framework/config.d.ts +0 -6
  284. package/dist/esnext/framework/config.js +0 -6
  285. package/dist/esnext/framework/runtime.d.ts +0 -13
  286. package/dist/esnext/framework/runtime.js +0 -27
  287. package/dist/esnext/hooks/useParsedMetafields/index.d.ts +0 -1
  288. package/dist/esnext/hooks/useParsedMetafields/index.js +0 -1
  289. package/dist/esnext/hooks/useParsedMetafields/useParsedMetafields.d.ts +0 -21
  290. package/dist/esnext/hooks/useParsedMetafields/useParsedMetafields.js +0 -21
  291. package/dist/esnext/hooks/useProduct/index.d.ts +0 -1
  292. package/dist/esnext/hooks/useProduct/index.js +0 -1
  293. package/dist/esnext/hooks/useProduct/useProduct.d.ts +0 -52
  294. package/dist/esnext/hooks/useProduct/useProduct.js +0 -43
  295. package/dist/esnext/utilities/isClient/index.d.ts +0 -1
  296. package/dist/esnext/utilities/isClient/index.js +0 -1
  297. package/dist/esnext/utilities/isClient/isClient.d.ts +0 -4
  298. package/dist/esnext/utilities/isClient/isClient.js +0 -6
  299. package/dist/esnext/utilities/parseMetafieldValue/index.d.ts +0 -1
  300. package/dist/esnext/utilities/parseMetafieldValue/index.js +0 -1
  301. package/dist/esnext/utilities/parseMetafieldValue/parseMetafieldValue.d.ts +0 -6
  302. package/dist/node/components/Image/Image.d.ts +0 -84
  303. package/dist/node/components/Image/Image.js +0 -89
  304. package/dist/node/components/Image/index.d.ts +0 -2
  305. package/dist/node/components/Image/index.js +0 -5
  306. package/dist/node/constants.d.ts +0 -7
  307. package/dist/node/constants.js +0 -10
  308. package/dist/node/entry-server.d.ts +0 -35
  309. package/dist/node/entry-server.js +0 -571
  310. package/dist/node/foundation/Analytics/Analytics.client.d.ts +0 -3
  311. package/dist/node/foundation/Analytics/Analytics.client.js +0 -32
  312. package/dist/node/foundation/Analytics/Analytics.server.d.ts +0 -1
  313. package/dist/node/foundation/Analytics/Analytics.server.js +0 -70
  314. package/dist/node/foundation/Analytics/ClientAnalytics.d.ts +0 -25
  315. package/dist/node/foundation/Analytics/ClientAnalytics.js +0 -100
  316. package/dist/node/foundation/Analytics/ServerAnalyticsRoute.server.d.ts +0 -2
  317. package/dist/node/foundation/Analytics/ServerAnalyticsRoute.server.js +0 -37
  318. package/dist/node/foundation/Analytics/const.d.ts +0 -9
  319. package/dist/node/foundation/Analytics/const.js +0 -12
  320. package/dist/node/foundation/Analytics/hook.d.ts +0 -1
  321. package/dist/node/foundation/Analytics/hook.js +0 -11
  322. package/dist/node/foundation/Analytics/types.d.ts +0 -5
  323. package/dist/node/foundation/Analytics/utils.d.ts +0 -1
  324. package/dist/node/foundation/Analytics/utils.js +0 -12
  325. package/dist/node/foundation/AnalyticsErrorBoundary.client.d.ts +0 -4
  326. package/dist/node/foundation/AnalyticsErrorBoundary.client.js +0 -14
  327. package/dist/node/foundation/Redirect/Redirect.client.d.ts +0 -5
  328. package/dist/node/foundation/Redirect/Redirect.client.js +0 -18
  329. package/dist/node/foundation/Router/BrowserRouter.client.d.ts +0 -14
  330. package/dist/node/foundation/Router/BrowserRouter.client.js +0 -159
  331. package/dist/node/foundation/ServerPropsProvider/ServerPropsProvider.d.ts +0 -40
  332. package/dist/node/foundation/ServerPropsProvider/ServerPropsProvider.js +0 -90
  333. package/dist/node/foundation/ServerPropsProvider/index.d.ts +0 -2
  334. package/dist/node/foundation/ServerPropsProvider/index.js +0 -6
  335. package/dist/node/foundation/ServerRequestProvider/ServerRequestProvider.d.ts +0 -23
  336. package/dist/node/foundation/ServerRequestProvider/ServerRequestProvider.js +0 -158
  337. package/dist/node/foundation/ServerRequestProvider/index.d.ts +0 -1
  338. package/dist/node/foundation/ServerRequestProvider/index.js +0 -17
  339. package/dist/node/foundation/ShopifyProvider/types.d.ts +0 -13
  340. package/dist/node/foundation/ShopifyProvider/types.js +0 -2
  341. package/dist/node/foundation/session/session.d.ts +0 -27
  342. package/dist/node/foundation/session/session.js +0 -43
  343. package/dist/node/foundation/ssr-interop.d.ts +0 -29
  344. package/dist/node/foundation/ssr-interop.js +0 -39
  345. package/dist/node/foundation/useNavigate/useNavigate.d.ts +0 -13
  346. package/dist/node/foundation/useNavigate/useNavigate.js +0 -18
  347. package/dist/node/foundation/useServerProps/use-server-props.d.ts +0 -21
  348. package/dist/node/foundation/useServerProps/use-server-props.js +0 -40
  349. package/dist/node/framework/CachingStrategy/index.d.ts +0 -10
  350. package/dist/node/framework/CachingStrategy/index.js +0 -108
  351. package/dist/node/framework/Hydration/Html.js +0 -94
  352. package/dist/node/framework/Hydration/ServerComponentRequest.server.d.ts +0 -58
  353. package/dist/node/framework/Hydration/ServerComponentRequest.server.js +0 -150
  354. package/dist/node/framework/Hydration/ServerComponentResponse.server.d.ts +0 -26
  355. package/dist/node/framework/Hydration/ServerComponentResponse.server.js +0 -49
  356. package/dist/node/framework/Hydration/rsc.d.ts +0 -8
  357. package/dist/node/framework/Hydration/rsc.js +0 -103
  358. package/dist/node/framework/cache-sub-request.js +0 -95
  359. package/dist/node/framework/cache.d.ts +0 -17
  360. package/dist/node/framework/cache.js +0 -135
  361. package/dist/node/framework/config.d.ts +0 -6
  362. package/dist/node/framework/config.js +0 -11
  363. package/dist/node/framework/runtime.d.ts +0 -13
  364. package/dist/node/framework/runtime.js +0 -35
  365. package/dist/node/storefront-api-types.d.ts +0 -6405
  366. package/dist/node/storefront-api-types.js +0 -1766
  367. package/dist/node/streaming.server.d.ts +0 -26
  368. package/dist/node/streaming.server.js +0 -33
  369. package/dist/node/types.d.ts +0 -105
  370. package/dist/node/types.js +0 -2
  371. package/dist/node/utilities/apiRoutes.d.ts +0 -37
  372. package/dist/node/utilities/apiRoutes.js +0 -157
  373. package/dist/node/utilities/bot-ua.d.ts +0 -4
  374. package/dist/node/utilities/bot-ua.js +0 -65
  375. package/dist/node/utilities/defer.d.ts +0 -6
  376. package/dist/node/utilities/defer.js +0 -18
  377. package/dist/node/utilities/error.d.ts +0 -1
  378. package/dist/node/utilities/error.js +0 -10
  379. package/dist/node/utilities/fetch.d.ts +0 -9
  380. package/dist/node/utilities/fetch.js +0 -37
  381. package/dist/node/utilities/flattenConnection/flattenConnection.d.ts +0 -6
  382. package/dist/node/utilities/flattenConnection/flattenConnection.js +0 -15
  383. package/dist/node/utilities/flattenConnection/index.d.ts +0 -1
  384. package/dist/node/utilities/flattenConnection/index.js +0 -5
  385. package/dist/node/utilities/hash.d.ts +0 -2
  386. package/dist/node/utilities/hash.js +0 -11
  387. package/dist/node/utilities/html-encoding.d.ts +0 -1
  388. package/dist/node/utilities/html-encoding.js +0 -12
  389. package/dist/node/utilities/image_size.d.ts +0 -12
  390. package/dist/node/utilities/image_size.js +0 -68
  391. package/dist/node/utilities/index.d.ts +0 -12
  392. package/dist/node/utilities/index.js +0 -33
  393. package/dist/node/utilities/isClient/index.d.ts +0 -1
  394. package/dist/node/utilities/isClient/index.js +0 -5
  395. package/dist/node/utilities/isClient/isClient.d.ts +0 -4
  396. package/dist/node/utilities/isClient/isClient.js +0 -10
  397. package/dist/node/utilities/isServer/index.d.ts +0 -1
  398. package/dist/node/utilities/isServer/index.js +0 -5
  399. package/dist/node/utilities/isServer/isServer.d.ts +0 -4
  400. package/dist/node/utilities/isServer/isServer.js +0 -11
  401. package/dist/node/utilities/load_script.d.ts +0 -3
  402. package/dist/node/utilities/load_script.js +0 -27
  403. package/dist/node/utilities/log/index.d.ts +0 -4
  404. package/dist/node/utilities/log/index.js +0 -18
  405. package/dist/node/utilities/log/log-cache-api-status.d.ts +0 -1
  406. package/dist/node/utilities/log/log-cache-api-status.js +0 -17
  407. package/dist/node/utilities/log/log-cache-header.d.ts +0 -10
  408. package/dist/node/utilities/log/log-cache-header.js +0 -35
  409. package/dist/node/utilities/log/log-query-timeline.d.ts +0 -12
  410. package/dist/node/utilities/log/log-query-timeline.js +0 -88
  411. package/dist/node/utilities/log/log.d.ts +0 -22
  412. package/dist/node/utilities/log/log.js +0 -74
  413. package/dist/node/utilities/log/utils.d.ts +0 -3
  414. package/dist/node/utilities/log/utils.js +0 -21
  415. package/dist/node/utilities/matchPath.d.ts +0 -10
  416. package/dist/node/utilities/matchPath.js +0 -58
  417. package/dist/node/utilities/measurement.d.ts +0 -3
  418. package/dist/node/utilities/measurement.js +0 -103
  419. package/dist/node/utilities/parse.d.ts +0 -1
  420. package/dist/node/utilities/parse.js +0 -13
  421. package/dist/node/utilities/parseMetafieldValue/index.d.ts +0 -1
  422. package/dist/node/utilities/parseMetafieldValue/index.js +0 -5
  423. package/dist/node/utilities/parseMetafieldValue/parseMetafieldValue.d.ts +0 -6
  424. package/dist/node/utilities/parseMetafieldValue/parseMetafieldValue.js +0 -40
  425. package/dist/node/utilities/storefrontApi.d.ts +0 -4
  426. package/dist/node/utilities/storefrontApi.js +0 -26
  427. package/dist/node/utilities/suspense.d.ts +0 -12
  428. package/dist/node/utilities/suspense.js +0 -64
  429. package/dist/node/utilities/template.d.ts +0 -9
  430. package/dist/node/utilities/template.js +0 -27
  431. package/dist/node/utilities/timing.d.ts +0 -7
  432. package/dist/node/utilities/timing.js +0 -18
  433. package/dist/node/utilities/video_parameters.d.ts +0 -47
  434. package/dist/node/utilities/video_parameters.js +0 -27
  435. package/dist/node/version.d.ts +0 -1
  436. package/dist/node/version.js +0 -4
  437. package/entry-client.d.ts +0 -1
  438. package/entry-client.js +0 -1
  439. package/entry-server.d.ts +0 -1
  440. package/entry-server.js +0 -1
  441. package/middleware.d.ts +0 -1
  442. package/middleware.js +0 -1
  443. package/plugin.d.ts +0 -1
  444. package/plugin.js +0 -1
  445. package/web-polyfills.js +0 -1
@@ -0,0 +1,133 @@
1
+ import React, { useMemo, useState, useEffect, useCallback } from 'react';
2
+ import { ProductOptionsContext } from './context';
3
+ import { getSelectedVariant, getOptions, } from '../../hooks/useProductOptions/helpers';
4
+ import { flattenConnection } from '../../utilities/flattenConnection';
5
+ export function ProductOptionsProvider({ children, data: product, initialVariantId: explicitVariantId, }) {
6
+ // The flattened variants
7
+ const variants = useMemo(() => flattenConnection(product.variants ?? {}), [product.variants]);
8
+ if (!isProductVariantArray(variants)) {
9
+ throw new Error(`<ProductOptionsProvider/> requires 'product.variants.nodes' or 'product.variants.edges'`);
10
+ }
11
+ // All the options available for a product, based on all the variants
12
+ const options = useMemo(() => getOptions(variants), [variants]);
13
+ /**
14
+ * Track the selectedVariant within the provider.
15
+ */
16
+ const [selectedVariant, setSelectedVariant] = useState(() => getVariantBasedOnIdProp(explicitVariantId, variants));
17
+ /**
18
+ * Track the selectedOptions within the provider. If a `initialVariantId`
19
+ * is passed, use that to select initial options.
20
+ */
21
+ const [selectedOptions, setSelectedOptions] = useState(() => getSelectedOptions(selectedVariant));
22
+ /**
23
+ * When the initialVariantId changes, we need to make sure we
24
+ * update the selected variant and selected options. If not,
25
+ * then the selected variant and options will reference incorrect
26
+ * values.
27
+ */
28
+ useEffect(() => {
29
+ const newSelectedVariant = getVariantBasedOnIdProp(explicitVariantId, variants);
30
+ setSelectedVariant(newSelectedVariant);
31
+ setSelectedOptions(getSelectedOptions(newSelectedVariant));
32
+ }, [explicitVariantId, variants]);
33
+ /**
34
+ * Allow the developer to select an option.
35
+ */
36
+ const setSelectedOption = useCallback((name, value) => {
37
+ setSelectedOptions((selectedOptions) => {
38
+ const opts = { ...selectedOptions, [name]: value };
39
+ setSelectedVariant(getSelectedVariant(variants, opts));
40
+ return opts;
41
+ });
42
+ }, [setSelectedOptions, variants]);
43
+ const isOptionInStock = useCallback((option, value) => {
44
+ const proposedVariant = getSelectedVariant(variants, {
45
+ ...selectedOptions,
46
+ ...{ [option]: value },
47
+ });
48
+ return proposedVariant?.availableForSale ?? true;
49
+ }, [selectedOptions, variants]);
50
+ const sellingPlanGroups = useMemo(() => flattenConnection(product.sellingPlanGroups ?? {}).map((sellingPlanGroup) => ({
51
+ ...sellingPlanGroup,
52
+ sellingPlans: flattenConnection(sellingPlanGroup?.sellingPlans ?? {}),
53
+ })), [product.sellingPlanGroups]);
54
+ /**
55
+ * Track the selectedSellingPlan within the hook. If `initialSellingPlanId`
56
+ * is passed, use that as an initial value. Look it up from the `selectedVariant`, since
57
+ * that is also a requirement.
58
+ */
59
+ const [selectedSellingPlan, setSelectedSellingPlan] = useState(undefined);
60
+ const selectedSellingPlanAllocation = useMemo(() => {
61
+ if (!selectedVariant || !selectedSellingPlan) {
62
+ return;
63
+ }
64
+ if (!selectedVariant.sellingPlanAllocations?.nodes &&
65
+ !selectedVariant.sellingPlanAllocations?.edges) {
66
+ throw new Error(`<ProductOptionsProvider/>: You must include 'sellingPlanAllocations.nodes' or 'sellingPlanAllocations.edges' in your variants in order to calculate selectedSellingPlanAllocation`);
67
+ }
68
+ return flattenConnection(selectedVariant.sellingPlanAllocations).find((allocation) => allocation?.sellingPlan?.id === selectedSellingPlan.id);
69
+ }, [selectedVariant, selectedSellingPlan]);
70
+ const value = useMemo(() => ({
71
+ variants,
72
+ variantsConnection: product.variants,
73
+ options,
74
+ selectedVariant,
75
+ setSelectedVariant,
76
+ selectedOptions,
77
+ setSelectedOption,
78
+ setSelectedOptions,
79
+ isOptionInStock,
80
+ selectedSellingPlan,
81
+ setSelectedSellingPlan,
82
+ selectedSellingPlanAllocation,
83
+ sellingPlanGroups,
84
+ sellingPlanGroupsConnection: product.sellingPlanGroups,
85
+ }), [
86
+ isOptionInStock,
87
+ options,
88
+ product.sellingPlanGroups,
89
+ product.variants,
90
+ selectedOptions,
91
+ selectedSellingPlan,
92
+ selectedSellingPlanAllocation,
93
+ selectedVariant,
94
+ sellingPlanGroups,
95
+ setSelectedOption,
96
+ variants,
97
+ ]);
98
+ return (React.createElement(ProductOptionsContext.Provider, { value: value }, children));
99
+ }
100
+ function getVariantBasedOnIdProp(explicitVariantId, variants) {
101
+ // get the initial variant based on the logic outlined in the comments for 'initialVariantId' above
102
+ // * 1. If `initialVariantId` is provided, then it's used even if it's out of stock.
103
+ if (explicitVariantId) {
104
+ const foundVariant = variants.find((variant) => variant?.id === explicitVariantId);
105
+ if (!foundVariant) {
106
+ console.warn(`<ProductOptionsProvider/> received a 'initialVariantId' prop, but could not actually find a variant with that ID`);
107
+ }
108
+ return foundVariant;
109
+ }
110
+ // * 2. If `initialVariantId` is provided but is `null`, then no variant is used.
111
+ if (explicitVariantId === null) {
112
+ return null;
113
+ }
114
+ // * 3. If nothing is passed to `initialVariantId` then the first available / in-stock variant is used.
115
+ // * 4. If nothing is passed to `initialVariantId` and no variants are in stock, then the first variant is used.
116
+ if (explicitVariantId === undefined) {
117
+ return variants.find((variant) => variant?.availableForSale) || variants[0];
118
+ }
119
+ }
120
+ function getSelectedOptions(selectedVariant) {
121
+ return selectedVariant?.selectedOptions
122
+ ? selectedVariant.selectedOptions.reduce((memo, optionSet) => {
123
+ memo[optionSet?.name ?? ''] = optionSet?.value ?? '';
124
+ return memo;
125
+ }, {})
126
+ : {};
127
+ }
128
+ function isProductVariantArray(maybeVariantArray) {
129
+ if (!maybeVariantArray || !Array.isArray(maybeVariantArray)) {
130
+ return false;
131
+ }
132
+ return true;
133
+ }
@@ -0,0 +1,2 @@
1
+ import { ProductOptionsHookValue } from '../../hooks';
2
+ export declare const ProductOptionsContext: import("react").Context<ProductOptionsHookValue | null>;
@@ -1,3 +1,2 @@
1
1
  import { createContext } from 'react';
2
- export const ProductContext = createContext(null);
3
2
  export const ProductOptionsContext = createContext(null);
@@ -0,0 +1,2 @@
1
+ export { ProductOptionsProvider } from './ProductOptionsProvider.client';
2
+ export { useProductOptions } from '../../hooks/useProductOptions/useProductOptions.client';
@@ -0,0 +1,2 @@
1
+ export { ProductOptionsProvider } from './ProductOptionsProvider.client';
2
+ export { useProductOptions } from '../../hooks/useProductOptions/useProductOptions.client';
@@ -1,6 +1,9 @@
1
1
  import React from 'react';
2
+ import type { Product } from '../../storefront-api-types';
2
3
  import { Money } from '../Money';
4
+ import type { PartialDeep } from 'type-fest';
3
5
  export interface ProductPriceProps {
6
+ data: PartialDeep<Product>;
4
7
  /** The type of price. Valid values: `regular` (default) or `compareAt`. */
5
8
  priceType?: 'regular' | 'compareAt';
6
9
  /** The type of value. Valid values: `min` (default), `max` or `unit`. */
@@ -10,6 +13,6 @@ export interface ProductPriceProps {
10
13
  }
11
14
  /**
12
15
  * The `ProductPrice` component renders a `Money` component with the product
13
- * [`priceRange`](https://shopify.dev/api/storefront/reference/products/productpricerange)'s `maxVariantPrice` or `minVariantPrice`, for either the regular price or compare at price range. It must be a descendent of the `ProductProvider` component.
16
+ * [`priceRange`](https://shopify.dev/api/storefront/reference/products/productpricerange)'s `maxVariantPrice` or `minVariantPrice`, for either the regular price or compare at price range.
14
17
  */
15
- export declare function ProductPrice<TTag extends keyof JSX.IntrinsicElements>(props: Omit<React.ComponentProps<typeof Money>, 'data' | 'measurement'> & ProductPriceProps): JSX.Element | null;
18
+ export declare function ProductPrice(props: Omit<React.ComponentProps<typeof Money>, 'data' | 'measurement'> & ProductPriceProps): JSX.Element | null;
@@ -1,34 +1,32 @@
1
1
  import React from 'react';
2
2
  import { Money } from '../Money';
3
- import { useProduct } from '../ProductProvider';
3
+ import { flattenConnection } from '../../utilities/flattenConnection';
4
4
  /**
5
5
  * The `ProductPrice` component renders a `Money` component with the product
6
- * [`priceRange`](https://shopify.dev/api/storefront/reference/products/productpricerange)'s `maxVariantPrice` or `minVariantPrice`, for either the regular price or compare at price range. It must be a descendent of the `ProductProvider` component.
6
+ * [`priceRange`](https://shopify.dev/api/storefront/reference/products/productpricerange)'s `maxVariantPrice` or `minVariantPrice`, for either the regular price or compare at price range.
7
7
  */
8
8
  export function ProductPrice(props) {
9
- var _a, _b, _c, _d, _e, _f, _g;
10
- const product = useProduct();
11
- const { priceType = 'regular', variantId, valueType = 'min', ...passthroughProps } = props;
9
+ const { priceType = 'regular', variantId, valueType = 'min', data: product, ...passthroughProps } = props;
12
10
  if (product == null) {
13
- throw new Error('Expected a ProductProvider context, but none was found');
11
+ throw new Error(`<ProductPrice/> requires a product as the 'data' prop`);
14
12
  }
15
13
  let price;
16
14
  let measurement;
17
15
  const variant = variantId
18
- ? (_a = product === null || product === void 0 ? void 0 : product.variants) === null || _a === void 0 ? void 0 : _a.find((variant) => (variant === null || variant === void 0 ? void 0 : variant.id) === variantId)
16
+ ? flattenConnection(product?.variants ?? {}).find((variant) => variant?.id === variantId) ?? null
19
17
  : null;
20
18
  if (priceType === 'compareAt') {
21
19
  if (variantId && variant) {
22
- if (((_b = variant.compareAtPriceV2) === null || _b === void 0 ? void 0 : _b.amount) === ((_c = variant.priceV2) === null || _c === void 0 ? void 0 : _c.amount)) {
20
+ if (variant.compareAtPriceV2?.amount === variant.priceV2?.amount) {
23
21
  return null;
24
22
  }
25
23
  price = variant.compareAtPriceV2;
26
24
  }
27
25
  else if (valueType === 'max') {
28
- price = (_d = product === null || product === void 0 ? void 0 : product.compareAtPriceRange) === null || _d === void 0 ? void 0 : _d.maxVariantPrice;
26
+ price = product?.compareAtPriceRange?.maxVariantPrice;
29
27
  }
30
28
  else {
31
- price = (_e = product === null || product === void 0 ? void 0 : product.compareAtPriceRange) === null || _e === void 0 ? void 0 : _e.minVariantPrice;
29
+ price = product?.compareAtPriceRange?.minVariantPrice;
32
30
  }
33
31
  }
34
32
  else {
@@ -40,10 +38,10 @@ export function ProductPrice(props) {
40
38
  }
41
39
  }
42
40
  else if (valueType === 'max') {
43
- price = (_f = product.priceRange) === null || _f === void 0 ? void 0 : _f.maxVariantPrice;
41
+ price = product.priceRange?.maxVariantPrice;
44
42
  }
45
43
  else {
46
- price = (_g = product.priceRange) === null || _g === void 0 ? void 0 : _g.minVariantPrice;
44
+ price = product.priceRange?.minVariantPrice;
47
45
  }
48
46
  }
49
47
  if (!price) {
@@ -4,9 +4,8 @@ import { DescriptionSeo } from './DescriptionSeo.client';
4
4
  import { TwitterSeo } from './TwitterSeo.client';
5
5
  import { ImageSeo } from './ImageSeo.client';
6
6
  export function CollectionSeo({ title, description, seo, image, }) {
7
- var _a, _b;
8
- const seoTitle = (_a = seo === null || seo === void 0 ? void 0 : seo.title) !== null && _a !== void 0 ? _a : title;
9
- const seoDescription = (_b = seo === null || seo === void 0 ? void 0 : seo.description) !== null && _b !== void 0 ? _b : description;
7
+ const seoTitle = seo?.title ?? title;
8
+ const seoDescription = seo?.description ?? description;
10
9
  return (React.createElement(React.Fragment, null,
11
10
  React.createElement(TitleSeo, { title: seoTitle }),
12
11
  React.createElement(DescriptionSeo, { description: seoDescription }),
@@ -7,10 +7,10 @@ import { TwitterSeo } from './TwitterSeo.client';
7
7
  export function DefaultPageSeo({ title, description, url, titleTemplate, lang, }) {
8
8
  const { languageCode: fallBacklang } = useShop();
9
9
  return (React.createElement(React.Fragment, null,
10
- React.createElement(Head, { defaultTitle: title !== null && title !== void 0 ? title : '', titleTemplate: titleTemplate !== null && titleTemplate !== void 0 ? titleTemplate : `%s - ${title}` },
11
- React.createElement("html", { lang: lang !== null && lang !== void 0 ? lang : fallBacklang }),
10
+ React.createElement(Head, { defaultTitle: title ?? '', titleTemplate: titleTemplate ?? `%s - ${title}` },
11
+ React.createElement("html", { lang: lang ?? fallBacklang }),
12
12
  React.createElement("meta", { property: "og:type", content: "website" }),
13
- React.createElement("meta", { property: "og:site_name", content: title !== null && title !== void 0 ? title : '' }),
13
+ React.createElement("meta", { property: "og:site_name", content: title ?? '' }),
14
14
  React.createElement("meta", { property: "og:url", content: url })),
15
15
  React.createElement(TitleSeo, { title: title }),
16
16
  React.createElement(DescriptionSeo, { description: description }),
@@ -4,7 +4,7 @@ import { Head } from '../../client';
4
4
  export function NoIndexPageSeo({ title, titleTemplate, lang, }) {
5
5
  const { languageCode: fallBacklang } = useShop();
6
6
  return (React.createElement(React.Fragment, null,
7
- React.createElement(Head, { defaultTitle: title !== null && title !== void 0 ? title : '', titleTemplate: titleTemplate !== null && titleTemplate !== void 0 ? titleTemplate : `%s - ${title}` },
8
- React.createElement("html", { lang: lang !== null && lang !== void 0 ? lang : fallBacklang }),
7
+ React.createElement(Head, { defaultTitle: title ?? '', titleTemplate: titleTemplate ?? `%s - ${title}` },
8
+ React.createElement("html", { lang: lang ?? fallBacklang }),
9
9
  React.createElement("meta", { name: "robots", content: "noindex" }))));
10
10
  }
@@ -3,9 +3,8 @@ import { TitleSeo } from './TitleSeo.client';
3
3
  import { DescriptionSeo } from './DescriptionSeo.client';
4
4
  import { TwitterSeo } from './TwitterSeo.client';
5
5
  export function PageSeo({ title, seo }) {
6
- var _a;
7
- const seoTitle = (_a = seo === null || seo === void 0 ? void 0 : seo.title) !== null && _a !== void 0 ? _a : title;
8
- const seoDescription = seo === null || seo === void 0 ? void 0 : seo.description;
6
+ const seoTitle = seo?.title ?? title;
7
+ const seoDescription = seo?.description;
9
8
  return (React.createElement(React.Fragment, null,
10
9
  React.createElement(TitleSeo, { title: seoTitle }),
11
10
  React.createElement(DescriptionSeo, { description: seoDescription }),
@@ -4,10 +4,10 @@ import { TitleSeo } from './TitleSeo.client';
4
4
  import { DescriptionSeo } from './DescriptionSeo.client';
5
5
  import { TwitterSeo } from './TwitterSeo.client';
6
6
  import { ImageSeo } from './ImageSeo.client';
7
+ import { flattenConnection } from '../../utilities';
7
8
  export function ProductSeo({ url, title, description, seo, vendor, featuredImage, variants, }) {
8
- var _a, _b, _c;
9
- const seoTitle = (_a = seo === null || seo === void 0 ? void 0 : seo.title) !== null && _a !== void 0 ? _a : title;
10
- const seoDescription = (_b = seo === null || seo === void 0 ? void 0 : seo.description) !== null && _b !== void 0 ? _b : description;
9
+ const seoTitle = seo?.title ?? title;
10
+ const seoDescription = seo?.description ?? description;
11
11
  let firstVariantPrice;
12
12
  const productSchema = {
13
13
  '@context': 'http://schema.org/',
@@ -23,16 +23,15 @@ export function ProductSeo({ url, title, description, seo, vendor, featuredImage
23
23
  if (featuredImage) {
24
24
  productSchema.image = featuredImage.url;
25
25
  }
26
- if ((variants === null || variants === void 0 ? void 0 : variants.edges) && variants.edges.length > 0) {
27
- const firstVariant = (_c = variants.edges[0]) === null || _c === void 0 ? void 0 : _c.node;
28
- firstVariantPrice = firstVariant === null || firstVariant === void 0 ? void 0 : firstVariant.priceV2;
26
+ const flattenedVariants = flattenConnection(variants ?? {});
27
+ if (flattenedVariants.length) {
28
+ const firstVariant = flattenedVariants[0];
29
+ firstVariantPrice = firstVariant?.priceV2;
29
30
  if (firstVariant && firstVariant.sku) {
30
31
  productSchema.sku = firstVariant.sku;
31
32
  }
32
- productSchema.offers = variants.edges.map((edge) => {
33
- var _a;
34
- const node = edge === null || edge === void 0 ? void 0 : edge.node;
35
- if (!node || !((_a = node.priceV2) === null || _a === void 0 ? void 0 : _a.amount) || !node.priceV2.currencyCode) {
33
+ productSchema.offers = flattenedVariants.map((node) => {
34
+ if (!node || !node.priceV2?.amount || !node.priceV2.currencyCode) {
36
35
  throw new Error(`<ProductSeo/> requires variant.PriceV2 'amount' and 'currency`);
37
36
  }
38
37
  const offerSchema = {
@@ -23,10 +23,9 @@ export function ShopPayButton({ variantIds, className, variantIdsAndQuantities,
23
23
  }
24
24
  else if (variantIdsAndQuantities) {
25
25
  ids = variantIdsAndQuantities.reduce((prev, curr) => {
26
- var _a;
27
- const bareId = getIdFromGid(curr === null || curr === void 0 ? void 0 : curr.id);
26
+ const bareId = getIdFromGid(curr?.id);
28
27
  if (bareId) {
29
- prev.push(`${bareId}:${(_a = curr === null || curr === void 0 ? void 0 : curr.quantity) !== null && _a !== void 0 ? _a : 1}`);
28
+ prev.push(`${bareId}:${curr?.quantity ?? 1}`);
30
29
  }
31
30
  return prev;
32
31
  }, []);
@@ -4,10 +4,9 @@ import { shopifyImageLoader } from '../../utilities';
4
4
  * The `Video` component renders a `video` for the Storefront API's [Video object](https://shopify.dev/api/storefront/reference/products/video).
5
5
  */
6
6
  export function Video(props) {
7
- var _a, _b;
8
7
  const { data, previewImageOptions, id = data.id, playsInline = true, controls = true, ...passthroughProps } = props;
9
8
  const posterUrl = shopifyImageLoader({
10
- src: (_b = (_a = data.previewImage) === null || _a === void 0 ? void 0 : _a.url) !== null && _b !== void 0 ? _b : '',
9
+ src: data.previewImage?.url ?? '',
11
10
  ...previewImageOptions,
12
11
  });
13
12
  if (!data.sources) {
@@ -16,7 +15,7 @@ export function Video(props) {
16
15
  return (
17
16
  // eslint-disable-next-line jsx-a11y/media-has-caption
18
17
  React.createElement("video", { ...passthroughProps, id: id, playsInline: playsInline, controls: controls, poster: posterUrl }, data.sources.map((source) => {
19
- if (!((source === null || source === void 0 ? void 0 : source.url) && (source === null || source === void 0 ? void 0 : source.mimeType))) {
18
+ if (!(source?.url && source?.mimeType)) {
20
19
  throw new Error(`<Video/> needs 'source.url' and 'source.mimeType'`);
21
20
  }
22
21
  return (React.createElement("source", { key: source.url, src: source.url, type: source.mimeType }));
@@ -20,7 +20,7 @@ export { CartShopPayButton } from './CartShopPayButton';
20
20
  export { CartEstimatedCost } from './CartEstimatedCost';
21
21
  export { CartProvider, useCart, useInstantCheckout } from './CartProvider';
22
22
  export type { State, Status, Cart, CartWithActions, CartAction, } from './CartProvider';
23
- export { ProductProvider, useProduct } from './ProductProvider';
23
+ export { ProductOptionsProvider, useProductOptions, } from './ProductOptionsProvider';
24
24
  export { ProductPrice } from './ProductPrice';
25
25
  export { BuyNowButton } from './BuyNowButton';
26
26
  export { ShopPayButton } from './ShopPayButton';
@@ -18,7 +18,7 @@ export { CartCheckoutButton } from './CartCheckoutButton';
18
18
  export { CartShopPayButton } from './CartShopPayButton';
19
19
  export { CartEstimatedCost } from './CartEstimatedCost';
20
20
  export { CartProvider, useCart, useInstantCheckout } from './CartProvider';
21
- export { ProductProvider, useProduct } from './ProductProvider';
21
+ export { ProductOptionsProvider, useProductOptions, } from './ProductOptionsProvider';
22
22
  export { ProductPrice } from './ProductPrice';
23
23
  export { BuyNowButton } from './BuyNowButton';
24
24
  export { ShopPayButton } from './ShopPayButton';
@@ -1,3 +1,7 @@
1
1
  import type { InlineHydrogenConfig } from './types';
2
2
  export declare const defineConfig: (params: InlineHydrogenConfig) => InlineHydrogenConfig;
3
3
  export type { InlineHydrogenConfig as HydrogenConfig };
4
+ export { ShopifyServerAnalyticsConnector } from './foundation/Analytics/connectors/Shopify/ServerAnalyticsConnector';
5
+ export { PerformanceMetricsServerAnalyticsConnector } from './foundation/Analytics/connectors/PerformanceMetrics/ServerAnalyticsConnector';
6
+ export { CookieSessionStorage } from './foundation/CookieSessionStorage/CookieSessionStorage';
7
+ export { MemorySessionStorage } from './foundation/MemorySessionStorage/MemorySessionStorage';
@@ -1 +1,5 @@
1
1
  export const defineConfig = (params) => params;
2
+ export { ShopifyServerAnalyticsConnector } from './foundation/Analytics/connectors/Shopify/ServerAnalyticsConnector';
3
+ export { PerformanceMetricsServerAnalyticsConnector } from './foundation/Analytics/connectors/PerformanceMetrics/ServerAnalyticsConnector';
4
+ export { CookieSessionStorage } from './foundation/CookieSessionStorage/CookieSessionStorage';
5
+ export { MemorySessionStorage } from './foundation/MemorySessionStorage/MemorySessionStorage';
@@ -5,3 +5,5 @@ export declare const OXYGEN_SECRET_TOKEN_ENVIRONMENT_VARIABLE = "SHOPIFY_STOREFR
5
5
  export declare const STOREFRONT_API_SECRET_TOKEN_HEADER = "Shopify-Storefront-Private-Token";
6
6
  export declare const STOREFRONT_API_PUBLIC_TOKEN_HEADER = "X-Shopify-Storefront-Access-Token";
7
7
  export declare const STOREFRONT_API_BUYER_IP_HEADER = "Shopify-Storefront-Buyer-IP";
8
+ export declare const SHOPIFY_STOREFRONT_ID_VARIABLE = "SHOPIFY_STOREFRONT_ID";
9
+ export declare const SHOPIFY_STOREFRONT_ID_HEADER = "X-Shopify-Storefront-Id";
@@ -5,3 +5,5 @@ export const OXYGEN_SECRET_TOKEN_ENVIRONMENT_VARIABLE = 'SHOPIFY_STOREFRONT_API_
5
5
  export const STOREFRONT_API_SECRET_TOKEN_HEADER = 'Shopify-Storefront-Private-Token';
6
6
  export const STOREFRONT_API_PUBLIC_TOKEN_HEADER = 'X-Shopify-Storefront-Access-Token';
7
7
  export const STOREFRONT_API_BUYER_IP_HEADER = 'Shopify-Storefront-Buyer-IP';
8
+ export const SHOPIFY_STOREFRONT_ID_VARIABLE = 'SHOPIFY_STOREFRONT_ID';
9
+ export const SHOPIFY_STOREFRONT_ID_HEADER = 'X-Shopify-Storefront-Id';
@@ -1,43 +1,99 @@
1
1
  import React, { Suspense, useState, StrictMode, Fragment, } from 'react';
2
2
  import { hydrateRoot } from 'react-dom/client';
3
3
  import { ErrorBoundary } from 'react-error-boundary';
4
- import { useServerResponse } from './framework/Hydration/rsc';
4
+ import { createFromFetch, createFromReadableStream,
5
+ // @ts-ignore
6
+ } from '@shopify/hydrogen/vendor/react-server-dom-vite';
7
+ import { RSC_PATHNAME } from './constants';
5
8
  import { ServerPropsProvider } from './foundation/ServerPropsProvider';
6
- const DevTools = React.lazy(() => import('./components/DevTools.client'));
7
- const renderHydrogen = async (ClientWrapper, config) => {
9
+ import { ClientAnalytics } from './foundation/Analytics/';
10
+ let rscReader;
11
+ const cache = new Map();
12
+ // Hydrate an SSR response from <meta> tags placed in the DOM.
13
+ const flightChunks = [];
14
+ const FLIGHT_ATTRIBUTE = 'data-flight';
15
+ function addElementToFlightChunks(el) {
16
+ // We don't need to decode, because `.getAttribute` already decodes
17
+ const chunk = el.getAttribute(FLIGHT_ATTRIBUTE);
18
+ if (chunk) {
19
+ flightChunks.push(chunk);
20
+ }
21
+ }
22
+ // Get initial payload
23
+ document
24
+ .querySelectorAll('[' + FLIGHT_ATTRIBUTE + ']')
25
+ .forEach(addElementToFlightChunks);
26
+ // Create a mutation observer on the document to detect when new
27
+ // <meta data-flight> tags are added, and add them to the array.
28
+ const observer = new MutationObserver((mutations) => {
29
+ mutations.forEach((mutation) => {
30
+ mutation.addedNodes.forEach((node) => {
31
+ if (node instanceof HTMLElement &&
32
+ node.tagName === 'META' &&
33
+ node.hasAttribute(FLIGHT_ATTRIBUTE)) {
34
+ addElementToFlightChunks(node);
35
+ }
36
+ });
37
+ });
38
+ });
39
+ observer.observe(document.documentElement, {
40
+ childList: true,
41
+ subtree: true,
42
+ });
43
+ if (flightChunks.length > 0) {
44
+ const contentLoaded = new Promise((resolve) => document.addEventListener('DOMContentLoaded', resolve));
45
+ try {
46
+ rscReader = new ReadableStream({
47
+ start(controller) {
48
+ const encoder = new TextEncoder();
49
+ const write = (chunk) => {
50
+ controller.enqueue(encoder.encode(chunk));
51
+ return 0;
52
+ };
53
+ flightChunks.forEach(write);
54
+ flightChunks.push = write;
55
+ contentLoaded.then(() => {
56
+ controller.close();
57
+ observer.disconnect();
58
+ });
59
+ },
60
+ });
61
+ }
62
+ catch (_) {
63
+ // Old browser, will try a new hydration request later
64
+ }
65
+ }
66
+ const renderHydrogen = async (ClientWrapper) => {
8
67
  const root = document.getElementById('root');
9
68
  if (!root) {
10
69
  console.error(`Could not find a root element <div id="root"></div> to render.`);
11
70
  return;
12
71
  }
13
72
  if (import.meta.hot) {
14
- import.meta.hot.on('hydrogen', ({ type, data }) => {
73
+ import.meta.hot.on('hydrogen-browser-console', ({ type, data }) => {
15
74
  if (type === 'warn') {
16
75
  console.warn(data);
17
76
  }
18
77
  });
19
78
  }
20
- // default to StrictMode on, unless explicitly turned off
21
- const RootComponent = (config === null || config === void 0 ? void 0 : config.strictMode) !== false ? StrictMode : Fragment;
22
- let hasCaughtError = false;
79
+ let config;
80
+ try {
81
+ config = JSON.parse(root.dataset.clientConfig ?? '{}');
82
+ }
83
+ catch (error) {
84
+ config = {};
85
+ if (__HYDROGEN_DEV__) {
86
+ console.warn('Could not parse client configuration in browser', error.message);
87
+ }
88
+ }
89
+ const RootComponent =
90
+ // Default to StrictMode on, unless explicitly turned off
91
+ config.strictMode !== false ? StrictMode : Fragment;
23
92
  hydrateRoot(root, React.createElement(React.Fragment, null,
24
93
  React.createElement(RootComponent, null,
25
94
  React.createElement(ErrorBoundary, { FallbackComponent: Error },
26
95
  React.createElement(Suspense, { fallback: null },
27
- React.createElement(Content, { clientWrapper: ClientWrapper })))),
28
- typeof DevTools !== 'undefined' && (config === null || config === void 0 ? void 0 : config.showDevTools) ? (React.createElement(DevTools, null)) : null), {
29
- onRecoverableError(e) {
30
- if (__DEV__ && !hasCaughtError) {
31
- hasCaughtError = true;
32
- console.log(`React encountered an error while attempting to hydrate the application. ` +
33
- `This is likely due to a bug in React's Suspense behavior related to experimental server components, ` +
34
- `and it is safe to ignore this error.\n` +
35
- `Visit this issue to learn more: https://github.com/Shopify/hydrogen/issues/920.\n\n` +
36
- `The original error is printed below:`);
37
- console.log(e);
38
- }
39
- },
40
- });
96
+ React.createElement(Content, { clientWrapper: ClientWrapper }))))));
41
97
  };
42
98
  export default renderHydrogen;
43
99
  function Content({ clientWrapper: ClientWrapper = ({ children }) => children, }) {
@@ -68,3 +124,33 @@ function Error({ error }) {
68
124
  React.createElement("a", { href: "/", style: { textDecoration: 'underline' } }, "home page"),
69
125
  "."))));
70
126
  }
127
+ function useServerResponse(state) {
128
+ const key = JSON.stringify(state);
129
+ let response = cache.get(key);
130
+ if (response) {
131
+ return response;
132
+ }
133
+ if (rscReader) {
134
+ // The flight response was inlined during SSR, use it directly.
135
+ response = createFromReadableStream(rscReader);
136
+ rscReader = null;
137
+ }
138
+ else {
139
+ if (
140
+ /* @ts-ignore */
141
+ window.BOOMR &&
142
+ /* @ts-ignore */
143
+ window.BOOMR.plugins &&
144
+ /* @ts-ignore */
145
+ window.BOOMR.plugins.Hydrogen) {
146
+ /* @ts-ignore */
147
+ window.BOOMR.plugins.Hydrogen.trackSubPageLoadPerformance();
148
+ }
149
+ ClientAnalytics.resetPageAnalyticsData();
150
+ // Request a new flight response.
151
+ response = createFromFetch(fetch(`${RSC_PATHNAME}?state=` + encodeURIComponent(key)));
152
+ }
153
+ cache.clear();
154
+ cache.set(key, response);
155
+ return response;
156
+ }
@@ -1,35 +1,6 @@
1
- /// <reference types="node" />
2
- import { Logger } from './utilities/log';
3
- import type { ImportGlobEagerOutput } from './types';
4
- import { ServerComponentResponse } from './framework/Hydration/ServerComponentResponse.server';
5
- import { ServerComponentRequest } from './framework/Hydration/ServerComponentRequest.server';
6
- import type { ServerResponse, IncomingMessage } from 'http';
7
- import { RuntimeContext } from './framework/runtime';
1
+ import type { RequestHandler } from './types';
8
2
  declare global {
9
- var __WORKER__: boolean;
10
- }
11
- interface RequestHandlerOptions {
12
- indexTemplate: string | ((url: string) => Promise<string | {
13
- default: string;
14
- }>);
15
- cache?: Cache;
16
- streamableResponse?: ServerResponse;
17
- dev?: boolean;
18
- context?: RuntimeContext;
19
- nonce?: string;
20
- buyerIpHeader?: string;
21
- }
22
- export interface RequestHandler {
23
- (request: Request | IncomingMessage, options: RequestHandlerOptions): Promise<Response | undefined>;
3
+ var __HYDROGEN_WORKER__: boolean;
24
4
  }
25
5
  export declare const renderHydrogen: (App: any) => RequestHandler;
26
- declare type SharedServerProps = {
27
- state?: object | null;
28
- request: ServerComponentRequest;
29
- response: ServerComponentResponse;
30
- log: Logger;
31
- };
32
- export declare type AppProps = SharedServerProps & {
33
- routes?: ImportGlobEagerOutput;
34
- };
35
6
  export default renderHydrogen;