@shopify/hydrogen 0.1.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 (454) hide show
  1. package/README.md +29 -0
  2. package/client.d.ts +1 -0
  3. package/client.js +1 -0
  4. package/dist/esnext/client.d.ts +7 -0
  5. package/dist/esnext/client.js +7 -0
  6. package/dist/esnext/components/AddToCartButton/AddToCartButton.client.d.ts +15 -0
  7. package/dist/esnext/components/AddToCartButton/AddToCartButton.client.js +44 -0
  8. package/dist/esnext/components/AddToCartButton/index.d.ts +1 -0
  9. package/dist/esnext/components/AddToCartButton/index.js +1 -0
  10. package/dist/esnext/components/BuyNowButton/BuyNowButton.d.ts +12 -0
  11. package/dist/esnext/components/BuyNowButton/BuyNowButton.js +29 -0
  12. package/dist/esnext/components/BuyNowButton/index.d.ts +1 -0
  13. package/dist/esnext/components/BuyNowButton/index.js +1 -0
  14. package/dist/esnext/components/CartCheckoutButton/CartCheckoutButton.client.d.ts +7 -0
  15. package/dist/esnext/components/CartCheckoutButton/CartCheckoutButton.client.js +14 -0
  16. package/dist/esnext/components/CartCheckoutButton/index.d.ts +1 -0
  17. package/dist/esnext/components/CartCheckoutButton/index.js +1 -0
  18. package/dist/esnext/components/CartContainer/CartContainer.client.d.ts +9 -0
  19. package/dist/esnext/components/CartContainer/CartContainer.client.js +24 -0
  20. package/dist/esnext/components/CartContainer/index.d.ts +1 -0
  21. package/dist/esnext/components/CartContainer/index.js +1 -0
  22. package/dist/esnext/components/CartLineAttributes/CartLineAttributes.client.d.ts +10 -0
  23. package/dist/esnext/components/CartLineAttributes/CartLineAttributes.client.js +9 -0
  24. package/dist/esnext/components/CartLineAttributes/index.d.ts +1 -0
  25. package/dist/esnext/components/CartLineAttributes/index.js +1 -0
  26. package/dist/esnext/components/CartLineImage/CartLineImage.client.d.ts +6 -0
  27. package/dist/esnext/components/CartLineImage/CartLineImage.client.js +8 -0
  28. package/dist/esnext/components/CartLineImage/index.d.ts +1 -0
  29. package/dist/esnext/components/CartLineImage/index.js +1 -0
  30. package/dist/esnext/components/CartLinePrice/CartLinePrice.client.d.ts +6 -0
  31. package/dist/esnext/components/CartLinePrice/CartLinePrice.client.js +17 -0
  32. package/dist/esnext/components/CartLinePrice/index.d.ts +1 -0
  33. package/dist/esnext/components/CartLinePrice/index.js +1 -0
  34. package/dist/esnext/components/CartLineProductTitle/CartLineProductTitle.client.d.ts +3 -0
  35. package/dist/esnext/components/CartLineProductTitle/CartLineProductTitle.client.js +8 -0
  36. package/dist/esnext/components/CartLineProductTitle/index.d.ts +1 -0
  37. package/dist/esnext/components/CartLineProductTitle/index.js +1 -0
  38. package/dist/esnext/components/CartLineProvider/CartLineProvider.client.d.ts +6 -0
  39. package/dist/esnext/components/CartLineProvider/CartLineProvider.client.js +5 -0
  40. package/dist/esnext/components/CartLineProvider/context.d.ts +26 -0
  41. package/dist/esnext/components/CartLineProvider/context.js +2 -0
  42. package/dist/esnext/components/CartLineProvider/hooks.d.ts +26 -0
  43. package/dist/esnext/components/CartLineProvider/hooks.js +9 -0
  44. package/dist/esnext/components/CartLineProvider/index.d.ts +2 -0
  45. package/dist/esnext/components/CartLineProvider/index.js +2 -0
  46. package/dist/esnext/components/CartLineQuantity/CartLineQuantity.client.d.ts +3 -0
  47. package/dist/esnext/components/CartLineQuantity/CartLineQuantity.client.js +8 -0
  48. package/dist/esnext/components/CartLineQuantity/index.d.ts +1 -0
  49. package/dist/esnext/components/CartLineQuantity/index.js +1 -0
  50. package/dist/esnext/components/CartLineQuantityAdjustButton/CartLineQuantityAdjustButton.d.ts +8 -0
  51. package/dist/esnext/components/CartLineQuantityAdjustButton/CartLineQuantityAdjustButton.js +17 -0
  52. package/dist/esnext/components/CartLineQuantityAdjustButton/index.d.ts +1 -0
  53. package/dist/esnext/components/CartLineQuantityAdjustButton/index.js +1 -0
  54. package/dist/esnext/components/CartLineSelectedOptions/CartLineSelectedOptions.client.d.ts +10 -0
  55. package/dist/esnext/components/CartLineSelectedOptions/CartLineSelectedOptions.client.js +9 -0
  56. package/dist/esnext/components/CartLineSelectedOptions/index.d.ts +1 -0
  57. package/dist/esnext/components/CartLineSelectedOptions/index.js +1 -0
  58. package/dist/esnext/components/CartLines/CartLines.d.ts +7 -0
  59. package/dist/esnext/components/CartLines/CartLines.js +15 -0
  60. package/dist/esnext/components/CartLines/index.d.ts +1 -0
  61. package/dist/esnext/components/CartLines/index.js +1 -0
  62. package/dist/esnext/components/CartProvider/CartProvider.client.d.ts +7 -0
  63. package/dist/esnext/components/CartProvider/CartProvider.client.js +422 -0
  64. package/dist/esnext/components/CartProvider/CartServerProvider.server.d.ts +11 -0
  65. package/dist/esnext/components/CartProvider/CartServerProvider.server.js +20 -0
  66. package/dist/esnext/components/CartProvider/constants.d.ts +2 -0
  67. package/dist/esnext/components/CartProvider/constants.js +2 -0
  68. package/dist/esnext/components/CartProvider/context.d.ts +2 -0
  69. package/dist/esnext/components/CartProvider/context.js +2 -0
  70. package/dist/esnext/components/CartProvider/graphql/CartAttributesUpdateMutation.d.ts +18 -0
  71. package/dist/esnext/components/CartProvider/graphql/CartAttributesUpdateMutation.js +1 -0
  72. package/dist/esnext/components/CartProvider/graphql/CartBuyerIdentityUpdateMutation.d.ts +18 -0
  73. package/dist/esnext/components/CartProvider/graphql/CartBuyerIdentityUpdateMutation.js +1 -0
  74. package/dist/esnext/components/CartProvider/graphql/CartCreateMutation.d.ts +17 -0
  75. package/dist/esnext/components/CartProvider/graphql/CartCreateMutation.js +1 -0
  76. package/dist/esnext/components/CartProvider/graphql/CartDiscountCodesUpdateMutation.d.ts +18 -0
  77. package/dist/esnext/components/CartProvider/graphql/CartDiscountCodesUpdateMutation.js +1 -0
  78. package/dist/esnext/components/CartProvider/graphql/CartFragment.d.ts +68 -0
  79. package/dist/esnext/components/CartProvider/graphql/CartFragment.js +1 -0
  80. package/dist/esnext/components/CartProvider/graphql/CartLineAddMutation.d.ts +18 -0
  81. package/dist/esnext/components/CartProvider/graphql/CartLineAddMutation.js +1 -0
  82. package/dist/esnext/components/CartProvider/graphql/CartLineRemoveMutation.d.ts +18 -0
  83. package/dist/esnext/components/CartProvider/graphql/CartLineRemoveMutation.js +1 -0
  84. package/dist/esnext/components/CartProvider/graphql/CartLineUpdateMutation.d.ts +18 -0
  85. package/dist/esnext/components/CartProvider/graphql/CartLineUpdateMutation.js +1 -0
  86. package/dist/esnext/components/CartProvider/graphql/CartNoteUpdateMutation.d.ts +18 -0
  87. package/dist/esnext/components/CartProvider/graphql/CartNoteUpdateMutation.js +1 -0
  88. package/dist/esnext/components/CartProvider/graphql/CartQuery.d.ts +13 -0
  89. package/dist/esnext/components/CartProvider/graphql/CartQuery.js +1 -0
  90. package/dist/esnext/components/CartProvider/hooks.d.ts +18 -0
  91. package/dist/esnext/components/CartProvider/hooks.js +79 -0
  92. package/dist/esnext/components/CartProvider/index.d.ts +4 -0
  93. package/dist/esnext/components/CartProvider/index.js +4 -0
  94. package/dist/esnext/components/CartProvider/types.d.ts +105 -0
  95. package/dist/esnext/components/CartProvider/types.js +1 -0
  96. package/dist/esnext/components/CartShopPayButton/CartShopPayButton.client.d.ts +2 -0
  97. package/dist/esnext/components/CartShopPayButton/CartShopPayButton.client.js +10 -0
  98. package/dist/esnext/components/CartShopPayButton/index.d.ts +1 -0
  99. package/dist/esnext/components/CartShopPayButton/index.js +1 -0
  100. package/dist/esnext/components/CartToggle/CartToggle.client.d.ts +8 -0
  101. package/dist/esnext/components/CartToggle/CartToggle.client.js +11 -0
  102. package/dist/esnext/components/CartToggle/index.d.ts +1 -0
  103. package/dist/esnext/components/CartToggle/index.js +1 -0
  104. package/dist/esnext/components/CartTotal/CartTotal.client.d.ts +3 -0
  105. package/dist/esnext/components/CartTotal/CartTotal.client.js +8 -0
  106. package/dist/esnext/components/CartTotal/index.d.ts +1 -0
  107. package/dist/esnext/components/CartTotal/index.js +1 -0
  108. package/dist/esnext/components/CartUIProvider/CartUIProvider.client.d.ts +5 -0
  109. package/dist/esnext/components/CartUIProvider/CartUIProvider.client.js +26 -0
  110. package/dist/esnext/components/CartUIProvider/context.d.ts +9 -0
  111. package/dist/esnext/components/CartUIProvider/context.js +2 -0
  112. package/dist/esnext/components/CartUIProvider/hooks.d.ts +1 -0
  113. package/dist/esnext/components/CartUIProvider/hooks.js +9 -0
  114. package/dist/esnext/components/CartUIProvider/index.d.ts +2 -0
  115. package/dist/esnext/components/CartUIProvider/index.js +2 -0
  116. package/dist/esnext/components/ExternalVideo/ExternalVideo.d.ts +14 -0
  117. package/dist/esnext/components/ExternalVideo/ExternalVideo.js +9 -0
  118. package/dist/esnext/components/ExternalVideo/ExternalVideoFragment.d.ts +4 -0
  119. package/dist/esnext/components/ExternalVideo/ExternalVideoFragment.js +1 -0
  120. package/dist/esnext/components/ExternalVideo/index.d.ts +1 -0
  121. package/dist/esnext/components/ExternalVideo/index.js +1 -0
  122. package/dist/esnext/components/Image/Image.d.ts +14 -0
  123. package/dist/esnext/components/Image/Image.js +10 -0
  124. package/dist/esnext/components/Image/ImageFragment.d.ts +4 -0
  125. package/dist/esnext/components/Image/ImageFragment.js +1 -0
  126. package/dist/esnext/components/Image/index.d.ts +1 -0
  127. package/dist/esnext/components/Image/index.js +1 -0
  128. package/dist/esnext/components/LocalizationProvider/LocalizationClientProvider.client.d.ts +6 -0
  129. package/dist/esnext/components/LocalizationProvider/LocalizationClientProvider.client.js +14 -0
  130. package/dist/esnext/components/LocalizationProvider/LocalizationContext.client.d.ts +8 -0
  131. package/dist/esnext/components/LocalizationProvider/LocalizationContext.client.js +2 -0
  132. package/dist/esnext/components/LocalizationProvider/LocalizationProvider.server.d.ts +4 -0
  133. package/dist/esnext/components/LocalizationProvider/LocalizationProvider.server.js +8 -0
  134. package/dist/esnext/components/LocalizationProvider/LocalizationQuery.d.ts +18 -0
  135. package/dist/esnext/components/LocalizationProvider/LocalizationQuery.js +1 -0
  136. package/dist/esnext/components/LocalizationProvider/hooks.d.ts +8 -0
  137. package/dist/esnext/components/LocalizationProvider/hooks.js +17 -0
  138. package/dist/esnext/components/LocalizationProvider/index.d.ts +2 -0
  139. package/dist/esnext/components/LocalizationProvider/index.js +2 -0
  140. package/dist/esnext/components/MediaFile/MediaFile.d.ts +19 -0
  141. package/dist/esnext/components/MediaFile/MediaFile.js +22 -0
  142. package/dist/esnext/components/MediaFile/MediaFileFragment.d.ts +22 -0
  143. package/dist/esnext/components/MediaFile/MediaFileFragment.js +1 -0
  144. package/dist/esnext/components/MediaFile/index.d.ts +1 -0
  145. package/dist/esnext/components/MediaFile/index.js +1 -0
  146. package/dist/esnext/components/Metafield/Metafield.client.d.ts +8 -0
  147. package/dist/esnext/components/Metafield/Metafield.client.js +50 -0
  148. package/dist/esnext/components/Metafield/MetafieldFragment.d.ts +4 -0
  149. package/dist/esnext/components/Metafield/MetafieldFragment.js +1 -0
  150. package/dist/esnext/components/Metafield/components/StarRating/StarRating.d.ts +12 -0
  151. package/dist/esnext/components/Metafield/components/StarRating/StarRating.js +48 -0
  152. package/dist/esnext/components/Metafield/components/StarRating/index.d.ts +1 -0
  153. package/dist/esnext/components/Metafield/components/StarRating/index.js +1 -0
  154. package/dist/esnext/components/Metafield/components/index.d.ts +1 -0
  155. package/dist/esnext/components/Metafield/components/index.js +1 -0
  156. package/dist/esnext/components/Metafield/index.d.ts +3 -0
  157. package/dist/esnext/components/Metafield/index.js +1 -0
  158. package/dist/esnext/components/Metafield/types.d.ts +4 -0
  159. package/dist/esnext/components/Metafield/types.js +1 -0
  160. package/dist/esnext/components/Model3D/Model3D.client.d.ts +25 -0
  161. package/dist/esnext/components/Model3D/Model3D.client.js +30 -0
  162. package/dist/esnext/components/Model3D/Model3DFragment.d.ts +11 -0
  163. package/dist/esnext/components/Model3D/Model3DFragment.js +1 -0
  164. package/dist/esnext/components/Model3D/index.d.ts +1 -0
  165. package/dist/esnext/components/Model3D/index.js +1 -0
  166. package/dist/esnext/components/Money/Money.client.d.ts +7 -0
  167. package/dist/esnext/components/Money/Money.client.js +10 -0
  168. package/dist/esnext/components/Money/index.d.ts +1 -0
  169. package/dist/esnext/components/Money/index.js +1 -0
  170. package/dist/esnext/components/ProductDescription/ProductDescription.client.d.ts +3 -0
  171. package/dist/esnext/components/ProductDescription/ProductDescription.client.js +10 -0
  172. package/dist/esnext/components/ProductDescription/index.d.ts +1 -0
  173. package/dist/esnext/components/ProductDescription/index.js +1 -0
  174. package/dist/esnext/components/ProductMetafield/ProductMetafield.client.d.ts +7 -0
  175. package/dist/esnext/components/ProductMetafield/ProductMetafield.client.js +16 -0
  176. package/dist/esnext/components/ProductMetafield/index.d.ts +1 -0
  177. package/dist/esnext/components/ProductMetafield/index.js +1 -0
  178. package/dist/esnext/components/ProductPrice/ProductPrice.client.d.ts +7 -0
  179. package/dist/esnext/components/ProductPrice/ProductPrice.client.js +32 -0
  180. package/dist/esnext/components/ProductPrice/index.d.ts +1 -0
  181. package/dist/esnext/components/ProductPrice/index.js +1 -0
  182. package/dist/esnext/components/ProductProvider/ProductProvider.client.d.ts +7 -0
  183. package/dist/esnext/components/ProductProvider/ProductProvider.client.js +35 -0
  184. package/dist/esnext/components/ProductProvider/ProductProviderFragment.d.ts +96 -0
  185. package/dist/esnext/components/ProductProvider/ProductProviderFragment.js +1 -0
  186. package/dist/esnext/components/ProductProvider/context.d.ts +13 -0
  187. package/dist/esnext/components/ProductProvider/context.js +2 -0
  188. package/dist/esnext/components/ProductProvider/hooks.d.ts +1 -0
  189. package/dist/esnext/components/ProductProvider/hooks.js +6 -0
  190. package/dist/esnext/components/ProductProvider/index.d.ts +2 -0
  191. package/dist/esnext/components/ProductProvider/index.js +2 -0
  192. package/dist/esnext/components/ProductProvider/types.d.ts +5 -0
  193. package/dist/esnext/components/ProductProvider/types.js +1 -0
  194. package/dist/esnext/components/ProductTitle/ProductTitle.client.d.ts +3 -0
  195. package/dist/esnext/components/ProductTitle/ProductTitle.client.js +11 -0
  196. package/dist/esnext/components/ProductTitle/index.d.ts +1 -0
  197. package/dist/esnext/components/ProductTitle/index.js +1 -0
  198. package/dist/esnext/components/RawHtml/RawHtml.d.ts +7 -0
  199. package/dist/esnext/components/RawHtml/RawHtml.js +13 -0
  200. package/dist/esnext/components/RawHtml/index.d.ts +1 -0
  201. package/dist/esnext/components/RawHtml/index.js +1 -0
  202. package/dist/esnext/components/SelectedVariantAddToCartButton/SelectedVariantAddToCartButton.client.d.ts +6 -0
  203. package/dist/esnext/components/SelectedVariantAddToCartButton/SelectedVariantAddToCartButton.client.js +12 -0
  204. package/dist/esnext/components/SelectedVariantAddToCartButton/index.d.ts +1 -0
  205. package/dist/esnext/components/SelectedVariantAddToCartButton/index.js +1 -0
  206. package/dist/esnext/components/SelectedVariantBuyNowButton/SelectedVariantBuyNowButton.d.ts +4 -0
  207. package/dist/esnext/components/SelectedVariantBuyNowButton/SelectedVariantBuyNowButton.js +12 -0
  208. package/dist/esnext/components/SelectedVariantBuyNowButton/index.d.ts +1 -0
  209. package/dist/esnext/components/SelectedVariantBuyNowButton/index.js +1 -0
  210. package/dist/esnext/components/SelectedVariantImage/SelectedVariantImage.client.d.ts +6 -0
  211. package/dist/esnext/components/SelectedVariantImage/SelectedVariantImage.client.js +12 -0
  212. package/dist/esnext/components/SelectedVariantImage/index.d.ts +1 -0
  213. package/dist/esnext/components/SelectedVariantImage/index.js +1 -0
  214. package/dist/esnext/components/SelectedVariantMetafield/SelectedVariantMetafield.client.d.ts +7 -0
  215. package/dist/esnext/components/SelectedVariantMetafield/SelectedVariantMetafield.client.js +15 -0
  216. package/dist/esnext/components/SelectedVariantMetafield/index.d.ts +1 -0
  217. package/dist/esnext/components/SelectedVariantMetafield/index.js +1 -0
  218. package/dist/esnext/components/SelectedVariantPrice/SelectedVariantPrice.client.d.ts +6 -0
  219. package/dist/esnext/components/SelectedVariantPrice/SelectedVariantPrice.client.js +18 -0
  220. package/dist/esnext/components/SelectedVariantPrice/index.d.ts +1 -0
  221. package/dist/esnext/components/SelectedVariantPrice/index.js +1 -0
  222. package/dist/esnext/components/SelectedVariantShopPayButton/SelectedVariantShopPayButton.client.d.ts +2 -0
  223. package/dist/esnext/components/SelectedVariantShopPayButton/SelectedVariantShopPayButton.client.js +12 -0
  224. package/dist/esnext/components/SelectedVariantShopPayButton/index.d.ts +1 -0
  225. package/dist/esnext/components/SelectedVariantShopPayButton/index.js +1 -0
  226. package/dist/esnext/components/SelectedVariantUnitPrice/SelectedVariantUnitPrice.client.d.ts +3 -0
  227. package/dist/esnext/components/SelectedVariantUnitPrice/SelectedVariantUnitPrice.client.js +12 -0
  228. package/dist/esnext/components/SelectedVariantUnitPrice/index.d.ts +1 -0
  229. package/dist/esnext/components/SelectedVariantUnitPrice/index.js +1 -0
  230. package/dist/esnext/components/ShopPayButton/ShopPayButton.client.d.ts +15 -0
  231. package/dist/esnext/components/ShopPayButton/ShopPayButton.client.js +32 -0
  232. package/dist/esnext/components/ShopPayButton/index.d.ts +1 -0
  233. package/dist/esnext/components/ShopPayButton/index.js +1 -0
  234. package/dist/esnext/components/UnitPrice/UnitPrice.client.d.ts +8 -0
  235. package/dist/esnext/components/UnitPrice/UnitPrice.client.js +16 -0
  236. package/dist/esnext/components/UnitPrice/index.d.ts +1 -0
  237. package/dist/esnext/components/UnitPrice/index.js +1 -0
  238. package/dist/esnext/components/Video/Video.d.ts +13 -0
  239. package/dist/esnext/components/Video/Video.js +8 -0
  240. package/dist/esnext/components/Video/VideoFragment.d.ts +11 -0
  241. package/dist/esnext/components/Video/VideoFragment.js +1 -0
  242. package/dist/esnext/components/Video/index.d.ts +1 -0
  243. package/dist/esnext/components/Video/index.js +1 -0
  244. package/dist/esnext/components/index.d.ts +41 -0
  245. package/dist/esnext/components/index.js +87 -0
  246. package/dist/esnext/components/types.d.ts +73 -0
  247. package/dist/esnext/components/types.js +10 -0
  248. package/dist/esnext/entry-client.d.ts +3 -0
  249. package/dist/esnext/entry-client.js +36 -0
  250. package/dist/esnext/entry-server.d.ts +3 -0
  251. package/dist/esnext/entry-server.js +286 -0
  252. package/dist/esnext/foundation/ClientMarker/ClientMarker.d.ts +10 -0
  253. package/dist/esnext/foundation/ClientMarker/ClientMarker.js +25 -0
  254. package/dist/esnext/foundation/ClientMarker/index.d.ts +1 -0
  255. package/dist/esnext/foundation/ClientMarker/index.js +1 -0
  256. package/dist/esnext/foundation/Hydration/Cache.client.d.ts +9 -0
  257. package/dist/esnext/foundation/Hydration/Cache.client.js +131 -0
  258. package/dist/esnext/foundation/Hydration/ClientComponents.server.d.ts +13 -0
  259. package/dist/esnext/foundation/Hydration/ClientComponents.server.js +18 -0
  260. package/dist/esnext/foundation/Hydration/Html.d.ts +5 -0
  261. package/dist/esnext/foundation/Hydration/Html.js +9 -0
  262. package/dist/esnext/foundation/Hydration/HydrationContext.server.d.ts +1 -0
  263. package/dist/esnext/foundation/Hydration/HydrationContext.server.js +2 -0
  264. package/dist/esnext/foundation/Hydration/ServerComponentRequest.server.d.ts +13 -0
  265. package/dist/esnext/foundation/Hydration/ServerComponentRequest.server.js +39 -0
  266. package/dist/esnext/foundation/Hydration/ServerComponentResponse.server.d.ts +18 -0
  267. package/dist/esnext/foundation/Hydration/ServerComponentResponse.server.js +35 -0
  268. package/dist/esnext/foundation/Hydration/react-utils.d.ts +5 -0
  269. package/dist/esnext/foundation/Hydration/react-utils.js +55 -0
  270. package/dist/esnext/foundation/Hydration/wire.server.d.ts +4 -0
  271. package/dist/esnext/foundation/Hydration/wire.server.js +75 -0
  272. package/dist/esnext/foundation/Hydration/writer.server.d.ts +14 -0
  273. package/dist/esnext/foundation/Hydration/writer.server.js +29 -0
  274. package/dist/esnext/foundation/Router/DefaultRoutes.d.ts +20 -0
  275. package/dist/esnext/foundation/Router/DefaultRoutes.js +54 -0
  276. package/dist/esnext/foundation/Router/ServerStateRouter.client.d.ts +6 -0
  277. package/dist/esnext/foundation/Router/ServerStateRouter.client.js +27 -0
  278. package/dist/esnext/foundation/Router/index.d.ts +1 -0
  279. package/dist/esnext/foundation/Router/index.js +1 -0
  280. package/dist/esnext/foundation/ServerStateProvider/ServerStateProvider.client.d.ts +11 -0
  281. package/dist/esnext/foundation/ServerStateProvider/ServerStateProvider.client.js +48 -0
  282. package/dist/esnext/foundation/ServerStateProvider/index.d.ts +1 -0
  283. package/dist/esnext/foundation/ServerStateProvider/index.js +1 -0
  284. package/dist/esnext/foundation/ShopifyProvider/ShopifyContext.d.ts +1 -0
  285. package/dist/esnext/foundation/ShopifyProvider/ShopifyContext.js +2 -0
  286. package/dist/esnext/foundation/ShopifyProvider/ShopifyProvider.d.ts +3 -0
  287. package/dist/esnext/foundation/ShopifyProvider/ShopifyProvider.js +11 -0
  288. package/dist/esnext/foundation/ShopifyProvider/ShopifyServerProvider.server.d.ts +8 -0
  289. package/dist/esnext/foundation/ShopifyProvider/ShopifyServerProvider.server.js +7 -0
  290. package/dist/esnext/foundation/ShopifyProvider/hooks.d.ts +2 -0
  291. package/dist/esnext/foundation/ShopifyProvider/hooks.js +9 -0
  292. package/dist/esnext/foundation/ShopifyProvider/index.d.ts +2 -0
  293. package/dist/esnext/foundation/ShopifyProvider/index.js +2 -0
  294. package/dist/esnext/foundation/ShopifyProvider/types.d.ts +12 -0
  295. package/dist/esnext/foundation/ShopifyProvider/types.js +1 -0
  296. package/dist/esnext/foundation/index.d.ts +4 -0
  297. package/dist/esnext/foundation/index.js +4 -0
  298. package/dist/esnext/framework/graphiql.d.ts +1 -0
  299. package/dist/esnext/framework/graphiql.js +39 -0
  300. package/dist/esnext/framework/middleware.d.ts +17 -0
  301. package/dist/esnext/framework/middleware.js +116 -0
  302. package/dist/esnext/framework/plugin.d.ts +3 -0
  303. package/dist/esnext/framework/plugin.js +14 -0
  304. package/dist/esnext/framework/plugins/vite-plugin-hydrogen-config.d.ts +3 -0
  305. package/dist/esnext/framework/plugins/vite-plugin-hydrogen-config.js +43 -0
  306. package/dist/esnext/framework/plugins/vite-plugin-hydrogen-middleware.d.ts +4 -0
  307. package/dist/esnext/framework/plugins/vite-plugin-hydrogen-middleware.js +28 -0
  308. package/dist/esnext/framework/plugins/vite-plugin-react-server-components-shim.d.ts +3 -0
  309. package/dist/esnext/framework/plugins/vite-plugin-react-server-components-shim.js +123 -0
  310. package/dist/esnext/framework/server-components.d.ts +12 -0
  311. package/dist/esnext/framework/server-components.js +72 -0
  312. package/dist/esnext/graphql/graphql-constants.d.ts +1295 -0
  313. package/dist/esnext/graphql/graphql-constants.js +2482 -0
  314. package/dist/esnext/graphql/types/types.d.ts +5583 -0
  315. package/dist/esnext/graphql/types/types.js +1414 -0
  316. package/dist/esnext/handle-event.d.ts +20 -0
  317. package/dist/esnext/handle-event.js +140 -0
  318. package/dist/esnext/handle-worker-event.d.ts +11 -0
  319. package/dist/esnext/handle-worker-event.js +14 -0
  320. package/dist/esnext/hooks/index.d.ts +5 -0
  321. package/dist/esnext/hooks/index.js +5 -0
  322. package/dist/esnext/hooks/useMeasurement/hooks.d.ts +9 -0
  323. package/dist/esnext/hooks/useMeasurement/hooks.js +13 -0
  324. package/dist/esnext/hooks/useMeasurement/index.d.ts +1 -0
  325. package/dist/esnext/hooks/useMeasurement/index.js +1 -0
  326. package/dist/esnext/hooks/useMoney/hooks.d.ts +11 -0
  327. package/dist/esnext/hooks/useMoney/hooks.js +33 -0
  328. package/dist/esnext/hooks/useMoney/index.d.ts +1 -0
  329. package/dist/esnext/hooks/useMoney/index.js +1 -0
  330. package/dist/esnext/hooks/useParsedMetafields/hooks.d.ts +3 -0
  331. package/dist/esnext/hooks/useParsedMetafields/hooks.js +15 -0
  332. package/dist/esnext/hooks/useParsedMetafields/index.d.ts +1 -0
  333. package/dist/esnext/hooks/useParsedMetafields/index.js +1 -0
  334. package/dist/esnext/hooks/useProductOptions/helpers.d.ts +4 -0
  335. package/dist/esnext/hooks/useProductOptions/helpers.js +33 -0
  336. package/dist/esnext/hooks/useProductOptions/index.d.ts +2 -0
  337. package/dist/esnext/hooks/useProductOptions/index.js +2 -0
  338. package/dist/esnext/hooks/useProductOptions/types.d.ts +50 -0
  339. package/dist/esnext/hooks/useProductOptions/types.js +1 -0
  340. package/dist/esnext/hooks/useProductOptions/useProductOptions.d.ts +23 -0
  341. package/dist/esnext/hooks/useProductOptions/useProductOptions.js +84 -0
  342. package/dist/esnext/hooks/useQuery/QueryProvider.d.ts +6 -0
  343. package/dist/esnext/hooks/useQuery/QueryProvider.js +13 -0
  344. package/dist/esnext/hooks/useQuery/hooks.d.ts +12 -0
  345. package/dist/esnext/hooks/useQuery/hooks.js +28 -0
  346. package/dist/esnext/hooks/useQuery/index.d.ts +2 -0
  347. package/dist/esnext/hooks/useQuery/index.js +2 -0
  348. package/dist/esnext/hooks/useShopQuery/hooks.d.ts +9 -0
  349. package/dist/esnext/hooks/useShopQuery/hooks.js +34 -0
  350. package/dist/esnext/hooks/useShopQuery/index.d.ts +1 -0
  351. package/dist/esnext/hooks/useShopQuery/index.js +1 -0
  352. package/dist/esnext/index.d.ts +9 -0
  353. package/dist/esnext/index.js +11 -0
  354. package/dist/esnext/types.d.ts +62 -0
  355. package/dist/esnext/types.js +1 -0
  356. package/dist/esnext/utilities/connections.d.ts +2 -0
  357. package/dist/esnext/utilities/connections.js +4 -0
  358. package/dist/esnext/utilities/environment.d.ts +2 -0
  359. package/dist/esnext/utilities/environment.js +2 -0
  360. package/dist/esnext/utilities/image_size.d.ts +17 -0
  361. package/dist/esnext/utilities/image_size.js +45 -0
  362. package/dist/esnext/utilities/index.d.ts +8 -0
  363. package/dist/esnext/utilities/index.js +8 -0
  364. package/dist/esnext/utilities/meaurement.d.ts +3 -0
  365. package/dist/esnext/utilities/meaurement.js +98 -0
  366. package/dist/esnext/utilities/metafields.d.ts +2 -0
  367. package/dist/esnext/utilities/metafields.js +32 -0
  368. package/dist/esnext/utilities/script_loader.d.ts +3 -0
  369. package/dist/esnext/utilities/script_loader.js +23 -0
  370. package/dist/esnext/utilities/suspense.d.ts +7 -0
  371. package/dist/esnext/utilities/suspense.js +32 -0
  372. package/dist/esnext/utilities/video_parameters.d.ts +47 -0
  373. package/dist/esnext/utilities/video_parameters.js +22 -0
  374. package/dist/esnext/version.d.ts +1 -0
  375. package/dist/esnext/version.js +1 -0
  376. package/dist/node/foundation/ClientMarker/ClientMarker.d.ts +10 -0
  377. package/dist/node/foundation/ClientMarker/ClientMarker.js +48 -0
  378. package/dist/node/foundation/ClientMarker/index.d.ts +1 -0
  379. package/dist/node/foundation/ClientMarker/index.js +13 -0
  380. package/dist/node/foundation/Hydration/HydrationContext.server.d.ts +1 -0
  381. package/dist/node/foundation/Hydration/HydrationContext.server.js +5 -0
  382. package/dist/node/foundation/Hydration/ServerComponentRequest.server.d.ts +13 -0
  383. package/dist/node/foundation/Hydration/ServerComponentRequest.server.js +43 -0
  384. package/dist/node/foundation/Hydration/ServerComponentResponse.server.d.ts +18 -0
  385. package/dist/node/foundation/Hydration/ServerComponentResponse.server.js +39 -0
  386. package/dist/node/foundation/Hydration/react-utils.d.ts +5 -0
  387. package/dist/node/foundation/Hydration/react-utils.js +63 -0
  388. package/dist/node/foundation/Router/DefaultRoutes.d.ts +20 -0
  389. package/dist/node/foundation/Router/DefaultRoutes.js +78 -0
  390. package/dist/node/foundation/Router/index.d.ts +1 -0
  391. package/dist/node/foundation/Router/index.js +5 -0
  392. package/dist/node/foundation/ShopifyProvider/ShopifyContext.d.ts +1 -0
  393. package/dist/node/foundation/ShopifyProvider/ShopifyContext.js +5 -0
  394. package/dist/node/foundation/ShopifyProvider/ShopifyProvider.d.ts +3 -0
  395. package/dist/node/foundation/ShopifyProvider/ShopifyProvider.js +34 -0
  396. package/dist/node/foundation/ShopifyProvider/ShopifyServerProvider.server.d.ts +8 -0
  397. package/dist/node/foundation/ShopifyProvider/ShopifyServerProvider.server.js +14 -0
  398. package/dist/node/foundation/ShopifyProvider/hooks.d.ts +2 -0
  399. package/dist/node/foundation/ShopifyProvider/hooks.js +13 -0
  400. package/dist/node/foundation/ShopifyProvider/index.d.ts +2 -0
  401. package/dist/node/foundation/ShopifyProvider/index.js +8 -0
  402. package/dist/node/foundation/ShopifyProvider/types.d.ts +12 -0
  403. package/dist/node/foundation/ShopifyProvider/types.js +2 -0
  404. package/dist/node/foundation/index.d.ts +4 -0
  405. package/dist/node/foundation/index.js +13 -0
  406. package/dist/node/framework/graphiql.d.ts +1 -0
  407. package/dist/node/framework/graphiql.js +43 -0
  408. package/dist/node/framework/middleware.d.ts +17 -0
  409. package/dist/node/framework/middleware.js +141 -0
  410. package/dist/node/framework/plugin.d.ts +3 -0
  411. package/dist/node/framework/plugin.js +19 -0
  412. package/dist/node/framework/plugins/vite-plugin-hydrogen-config.d.ts +3 -0
  413. package/dist/node/framework/plugins/vite-plugin-hydrogen-config.js +45 -0
  414. package/dist/node/framework/plugins/vite-plugin-hydrogen-middleware.d.ts +4 -0
  415. package/dist/node/framework/plugins/vite-plugin-hydrogen-middleware.js +33 -0
  416. package/dist/node/framework/plugins/vite-plugin-react-server-components-shim.d.ts +3 -0
  417. package/dist/node/framework/plugins/vite-plugin-react-server-components-shim.js +128 -0
  418. package/dist/node/framework/server-components.d.ts +12 -0
  419. package/dist/node/framework/server-components.js +77 -0
  420. package/dist/node/graphql/types/types.d.ts +5583 -0
  421. package/dist/node/graphql/types/types.js +1417 -0
  422. package/dist/node/handle-event.d.ts +20 -0
  423. package/dist/node/handle-event.js +143 -0
  424. package/dist/node/hooks/useQuery/QueryProvider.d.ts +6 -0
  425. package/dist/node/hooks/useQuery/QueryProvider.js +20 -0
  426. package/dist/node/hooks/useQuery/hooks.d.ts +12 -0
  427. package/dist/node/hooks/useQuery/hooks.js +32 -0
  428. package/dist/node/hooks/useQuery/index.d.ts +2 -0
  429. package/dist/node/hooks/useQuery/index.js +14 -0
  430. package/dist/node/types.d.ts +62 -0
  431. package/dist/node/types.js +2 -0
  432. package/dist/worker/foundation/Hydration/ServerComponentRequest.server.d.ts +13 -0
  433. package/dist/worker/foundation/Hydration/ServerComponentRequest.server.js +39 -0
  434. package/dist/worker/foundation/Hydration/ServerComponentResponse.server.d.ts +18 -0
  435. package/dist/worker/foundation/Hydration/ServerComponentResponse.server.js +35 -0
  436. package/dist/worker/graphql/types/types.d.ts +5583 -0
  437. package/dist/worker/graphql/types/types.js +1414 -0
  438. package/dist/worker/handle-event.d.ts +20 -0
  439. package/dist/worker/handle-event.js +140 -0
  440. package/dist/worker/handle-worker-event.d.ts +11 -0
  441. package/dist/worker/handle-worker-event.js +14 -0
  442. package/dist/worker/types.d.ts +62 -0
  443. package/dist/worker/types.js +1 -0
  444. package/entry-client.d.ts +1 -0
  445. package/entry-client.js +1 -0
  446. package/entry-server.d.ts +1 -0
  447. package/entry-server.js +1 -0
  448. package/marker.js +1 -0
  449. package/middleware.d.ts +1 -0
  450. package/middleware.js +1 -0
  451. package/package.json +98 -0
  452. package/plugin.d.ts +1 -0
  453. package/plugin.js +1 -0
  454. package/worker.js +1 -0
@@ -0,0 +1,3 @@
1
+ import type { ClientHandler } from './types';
2
+ declare const renderHydrogen: ClientHandler;
3
+ export default renderHydrogen;
@@ -0,0 +1,36 @@
1
+ import React, { Suspense, useState } from 'react';
2
+ // @ts-ignore
3
+ import { createRoot } from 'react-dom';
4
+ import { BrowserRouter } from 'react-router-dom';
5
+ import { ErrorBoundary } from 'react-error-boundary';
6
+ import { HelmetProvider } from 'react-helmet-async';
7
+ import { useServerResponse, ServerStateProvider, ServerStateRouter, } from './client';
8
+ import { QueryProvider } from './hooks';
9
+ const renderHydrogen = async (ClientWrapper) => {
10
+ const root = document.getElementById('root');
11
+ if (!root) {
12
+ console.error(`Could not find a root element <div id="root"></div> to render.`);
13
+ return;
14
+ }
15
+ createRoot(root, { hydrate: true }).render(React.createElement(ErrorBoundary, { FallbackComponent: Error },
16
+ React.createElement(Suspense, { fallback: null },
17
+ React.createElement(Content, { clientWrapper: ClientWrapper }))));
18
+ };
19
+ export default renderHydrogen;
20
+ function Content({ clientWrapper: ClientWrapper }) {
21
+ const [serverState, setServerState] = useState({
22
+ page: window.location.pathname,
23
+ });
24
+ const response = useServerResponse(serverState);
25
+ return (React.createElement(ServerStateProvider, { serverState: serverState, setServerState: setServerState },
26
+ React.createElement(QueryProvider, null,
27
+ React.createElement(HelmetProvider, null,
28
+ React.createElement(BrowserRouter, null,
29
+ React.createElement(ServerStateRouter, null),
30
+ React.createElement(ClientWrapper, null, response.read()))))));
31
+ }
32
+ function Error({ error }) {
33
+ return (React.createElement("div", { style: { padding: '1em' } },
34
+ React.createElement("h1", { style: { fontSize: '2em', marginBottom: '1em', fontWeight: 'bold' } }, "Error"),
35
+ React.createElement("pre", { style: { whiteSpace: 'pre-wrap' } }, error.stack)));
36
+ }
@@ -0,0 +1,3 @@
1
+ import type { ServerHandler } from './types';
2
+ declare const renderHydrogen: ServerHandler;
3
+ export default renderHydrogen;
@@ -0,0 +1,286 @@
1
+ import React from 'react';
2
+ import { renderToReadableStream, pipeToNodeWritable,
3
+ // @ts-ignore
4
+ } from 'react-dom/unstable-fizz';
5
+ import { renderToString } from 'react-dom/server';
6
+ import ssrPrepass from 'react-ssr-prepass';
7
+ import { StaticRouter } from 'react-router-dom';
8
+ import { HydrationContext } from './foundation/Hydration/HydrationContext.server';
9
+ import { generateWireSyntaxFromRenderedHtml } from './foundation/Hydration/wire.server';
10
+ import { HelmetProvider } from 'react-helmet-async';
11
+ import { Html } from './foundation/Hydration/Html';
12
+ import { HydrationWriter } from './foundation/Hydration/writer.server';
13
+ import { ServerComponentResponse } from './foundation/Hydration/ServerComponentResponse.server';
14
+ import { dehydrate } from 'react-query/hydration';
15
+ /**
16
+ * react-dom/unstable-fizz provides different entrypoints based on runtime:
17
+ * - `renderToReadableStream` for "browser" (aka worker)
18
+ * - `pipeToNodeWritable` for node.js
19
+ */
20
+ const isWorker = Boolean(renderToReadableStream);
21
+ /**
22
+ * If a query is taking too long, or something else went wrong,
23
+ * send back a response containing the Suspense fallback and rely
24
+ * on the client to hydrate and build the React tree.
25
+ */
26
+ const STREAM_ABORT_TIMEOUT_MS = 3000;
27
+ const renderHydrogen = (App, hook) => {
28
+ /**
29
+ * The render function is responsible for turning the provided `App` into an HTML string,
30
+ * and returning any initial state that needs to be hydrated into the client version of the app.
31
+ * NOTE: This is currently only used for SEO bots or Worker runtime (where Stream is not yet supported).
32
+ */
33
+ const render = async function (url, { context, request, isReactHydrationRequest }) {
34
+ var _a, _b;
35
+ const state = isReactHydrationRequest
36
+ ? JSON.parse((_b = (_a = url.searchParams) === null || _a === void 0 ? void 0 : _a.get('state')) !== null && _b !== void 0 ? _b : '{}')
37
+ : { page: url.pathname };
38
+ const { ReactApp, helmetContext, componentResponse } = buildReactApp({
39
+ App,
40
+ state,
41
+ context,
42
+ request,
43
+ });
44
+ const body = await renderApp(ReactApp, state, isReactHydrationRequest);
45
+ if (componentResponse.customBody) {
46
+ return { body: await componentResponse.customBody, url, componentResponse };
47
+ }
48
+ let params = { url, ...extractHeadElements(helmetContext) };
49
+ /**
50
+ * We allow the developer to "hook" into this process and mutate the params.
51
+ */
52
+ if (hook) {
53
+ params = hook(params) || params;
54
+ }
55
+ return { body, componentResponse, ...params };
56
+ };
57
+ /**
58
+ * Stream a response to the client. NOTE: This omits custom `<head>`
59
+ * information, so this method should not be used by crawlers.
60
+ */
61
+ const stream = function (url, { context, request, response, template }) {
62
+ const state = { page: url.pathname };
63
+ const { ReactApp, componentResponse } = buildReactApp({
64
+ App,
65
+ state,
66
+ context,
67
+ request,
68
+ });
69
+ response.socket.on('error', (error) => {
70
+ console.error('Fatal', error);
71
+ });
72
+ let didError = false;
73
+ const head = template.match(/<head>(.+?)<\/head>/s)[1];
74
+ const { startWriting, abort } = pipeToNodeWritable(React.createElement(Html, { head: head },
75
+ React.createElement(ReactApp, { ...state })), response, {
76
+ onReadyToStream() {
77
+ if (!componentResponse.canStream())
78
+ return;
79
+ response.statusCode = didError ? 500 : 200;
80
+ response.setHeader('Content-type', 'text/html');
81
+ response.write('<!DOCTYPE html>');
82
+ startWriting();
83
+ },
84
+ onCompleteAll() {
85
+ var _a;
86
+ if (componentResponse.canStream())
87
+ return;
88
+ response.statusCode =
89
+ (_a = componentResponse.status) !== null && _a !== void 0 ? _a : (didError ? 500 : 200);
90
+ componentResponse.headers.forEach((value, header) => {
91
+ response.setHeader(header, value);
92
+ });
93
+ if (componentResponse.customBody) {
94
+ if (componentResponse.customBody instanceof Promise) {
95
+ componentResponse.customBody.then((body) => response.end(body));
96
+ }
97
+ else {
98
+ response.end(componentResponse.customBody);
99
+ }
100
+ }
101
+ else {
102
+ response.setHeader('Content-type', 'text/html');
103
+ response.write('<!DOCTYPE html>');
104
+ startWriting();
105
+ }
106
+ },
107
+ onError(error) {
108
+ didError = true;
109
+ console.error(error);
110
+ },
111
+ });
112
+ setTimeout(abort, STREAM_ABORT_TIMEOUT_MS);
113
+ };
114
+ /**
115
+ * Stream a hydration response to the client.
116
+ */
117
+ const hydrate = function (url, { context, request, response }) {
118
+ const state = JSON.parse(url.searchParams.get('state') || '{}');
119
+ const { ReactApp } = buildReactApp({ App, state, context, request });
120
+ response.socket.on('error', (error) => {
121
+ console.error('Fatal', error);
122
+ });
123
+ let didError = false;
124
+ const writer = new HydrationWriter();
125
+ const { startWriting, abort } = pipeToNodeWritable(React.createElement(HydrationContext.Provider, { value: true },
126
+ React.createElement(ReactApp, { ...state })), writer, {
127
+ /**
128
+ * When hydrating, we have to wait until `onCompleteAll` to avoid having
129
+ * `template` and `script` tags inserted and rendered as part of the hydration response.
130
+ */
131
+ onCompleteAll() {
132
+ // Tell React to start writing to the writer
133
+ startWriting();
134
+ // Tell React that the writer is ready to drain, which sometimes results in a last "chunk" being written.
135
+ writer.drain();
136
+ response.statusCode = didError ? 500 : 200;
137
+ response.end(generateWireSyntaxFromRenderedHtml(writer.toString()));
138
+ },
139
+ onError(error) {
140
+ didError = true;
141
+ console.error(error);
142
+ },
143
+ });
144
+ setTimeout(abort, STREAM_ABORT_TIMEOUT_MS);
145
+ };
146
+ return {
147
+ render,
148
+ stream,
149
+ hydrate,
150
+ };
151
+ };
152
+ function buildReactApp({ App, state, context, request, }) {
153
+ const helmetContext = {};
154
+ const componentResponse = new ServerComponentResponse();
155
+ const ReactApp = (props) => (React.createElement(StaticRouter, { location: state.page, context: context },
156
+ React.createElement(HelmetProvider, { context: helmetContext },
157
+ React.createElement(App, { request: request, response: componentResponse, ...props }))));
158
+ return { helmetContext, ReactApp, componentResponse };
159
+ }
160
+ function extractHeadElements(helmetContext) {
161
+ const { helmet } = helmetContext;
162
+ return {
163
+ base: helmet.base.toString(),
164
+ bodyAttributes: helmet.bodyAttributes.toString(),
165
+ htmlAttributes: helmet.htmlAttributes.toString(),
166
+ link: helmet.link.toString(),
167
+ meta: helmet.meta.toString(),
168
+ noscript: helmet.noscript.toString(),
169
+ script: helmet.script.toString(),
170
+ style: helmet.style.toString(),
171
+ title: helmet.title.toString(),
172
+ };
173
+ }
174
+ function supportsReadableStream() {
175
+ try {
176
+ new ReadableStream();
177
+ return true;
178
+ }
179
+ catch (_e) {
180
+ return false;
181
+ }
182
+ }
183
+ async function renderApp(ReactApp, state, isReactHydrationRequest) {
184
+ /**
185
+ * Temporary workaround until all Worker runtimes support ReadableStream
186
+ */
187
+ if (isWorker && !supportsReadableStream()) {
188
+ return renderAppFromStringWithPrepass(ReactApp, state, isReactHydrationRequest);
189
+ }
190
+ const app = isReactHydrationRequest ? (React.createElement(HydrationContext.Provider, { value: true },
191
+ React.createElement(ReactApp, { ...state }))) : (React.createElement(ReactApp, { ...state }));
192
+ return renderAppFromBufferedStream(app, isReactHydrationRequest);
193
+ }
194
+ function renderAppFromBufferedStream(app, isReactHydrationRequest) {
195
+ return new Promise((resolve, reject) => {
196
+ if (isWorker) {
197
+ let isComplete = false;
198
+ const stream = renderToReadableStream(app, {
199
+ onCompleteAll() {
200
+ isComplete = true;
201
+ },
202
+ onError(error) {
203
+ console.error(error);
204
+ reject(error);
205
+ },
206
+ });
207
+ /**
208
+ * We want to wait until `onCompleteAll` has been called before fetching the
209
+ * stream body. Otherwise, React 18's streaming JS script/template tags
210
+ * will be included in the output and cause issues when loading
211
+ * the Client Components in the browser.
212
+ */
213
+ async function checkForResults() {
214
+ if (!isComplete) {
215
+ setTimeout(checkForResults, 100);
216
+ return;
217
+ }
218
+ /**
219
+ * Use the stream to build a `Response`, and fetch the body from the response
220
+ * to resolve and be processed by the rest of the pipeline.
221
+ */
222
+ const res = new Response(stream);
223
+ if (isReactHydrationRequest) {
224
+ resolve(generateWireSyntaxFromRenderedHtml(await res.text()));
225
+ }
226
+ else {
227
+ resolve(await res.text());
228
+ }
229
+ }
230
+ checkForResults();
231
+ }
232
+ else {
233
+ const writer = new HydrationWriter();
234
+ const { startWriting } = pipeToNodeWritable(app, writer, {
235
+ /**
236
+ * When hydrating, we have to wait until `onCompleteAll` to avoid having
237
+ * `template` and `script` tags inserted and rendered as part of the hydration response.
238
+ */
239
+ onCompleteAll() {
240
+ // Tell React to start writing to the writer
241
+ startWriting();
242
+ // Tell React that the writer is ready to drain, which sometimes results in a last "chunk" being written.
243
+ writer.drain();
244
+ if (isReactHydrationRequest) {
245
+ resolve(generateWireSyntaxFromRenderedHtml(writer.toString()));
246
+ }
247
+ else {
248
+ resolve(writer.toString());
249
+ }
250
+ },
251
+ onError(error) {
252
+ console.error(error);
253
+ reject(error);
254
+ },
255
+ });
256
+ }
257
+ });
258
+ }
259
+ /**
260
+ * If we can't render a "blocking" response by buffering React's SSR
261
+ * streaming functionality (likely due to lack of support for a primitive
262
+ * in the runtime), we fall back to using `renderToString`. By default,
263
+ * `renderToString` stops at Suspense boundaries and will not
264
+ * keep trying them until they resolve. This means have to
265
+ * use ssr-prepass to fetch all the queries once, store
266
+ * the results in a context object, and re-render.
267
+ */
268
+ async function renderAppFromStringWithPrepass(ReactApp, state, isReactHydrationRequest) {
269
+ const hydrationContext = {};
270
+ const app = isReactHydrationRequest ? (React.createElement(HydrationContext.Provider, { value: true },
271
+ React.createElement(ReactApp, { hydrationContext: hydrationContext, ...state }))) : (React.createElement(ReactApp, { hydrationContext: hydrationContext, ...state }));
272
+ await ssrPrepass(app);
273
+ /**
274
+ * Dehydrate all the queries made during the prepass above and store
275
+ * them in the context object to be used for the next render pass.
276
+ * This prevents rendering the Suspense fallback in `renderToString`.
277
+ */
278
+ if (hydrationContext.queryClient) {
279
+ hydrationContext.dehydratedState = dehydrate(hydrationContext.queryClient);
280
+ }
281
+ const body = renderToString(app);
282
+ return isReactHydrationRequest
283
+ ? generateWireSyntaxFromRenderedHtml(body)
284
+ : body;
285
+ }
286
+ export default renderHydrogen;
@@ -0,0 +1,10 @@
1
+ import { FunctionComponent } from 'react';
2
+ interface Props {
3
+ name: string;
4
+ id: string;
5
+ props: any;
6
+ component: FunctionComponent;
7
+ named: boolean;
8
+ }
9
+ export declare function ClientMarker({ name, id, props: allProps, component: Component, named, }: Props): JSX.Element;
10
+ export {};
@@ -0,0 +1,25 @@
1
+ import React, { useContext } from 'react';
2
+ import { HydrationContext } from '../Hydration/HydrationContext.server';
3
+ import { renderReactProps } from '../Hydration/react-utils';
4
+ export function ClientMarker({ name, id, props: allProps, component: Component, named, }) {
5
+ const isHydrating = useContext(HydrationContext);
6
+ if (!isHydrating)
7
+ return React.createElement(Component, { ...allProps });
8
+ let { children, ...props } = allProps;
9
+ /**
10
+ * Convert props that happen to be React components to actual
11
+ * objects representing DOM elements. This is because we
12
+ * serialize props to JSON below, and React element Functions
13
+ * cannot be serialized.
14
+ */
15
+ props = renderReactProps(props);
16
+ /**
17
+ * Components ending in *Provider are special components to
18
+ * Hydrogen's RSC implementation. They are rendered during
19
+ * the hydration process in the state tree even though they
20
+ * don't output any DOM. This is key to supporting crossing
21
+ * the server/client context boundary.
22
+ */
23
+ const shouldRenderDuringHydration = name.endsWith('Provider');
24
+ return (React.createElement("span", { "data-client-component": name, "data-id": id, "data-props": JSON.stringify(props), "data-named": named }, shouldRenderDuringHydration ? (React.createElement(Component, { ...allProps }, children)) : (children)));
25
+ }
@@ -0,0 +1 @@
1
+ export * from './ClientMarker';
@@ -0,0 +1 @@
1
+ export * from './ClientMarker';
@@ -0,0 +1,9 @@
1
+ import { ReactElement } from 'react';
2
+ /**
3
+ * Much of this is borrowed from React's demo implementation:
4
+ * @see https://github.com/reactjs/server-components-demo/blob/main/src/Cache.client.js
5
+ *
6
+ * Note that we'd want to add some other constraints and controls around caching here.
7
+ */
8
+ export declare function useServerResponse(state: any): any;
9
+ export declare function convertHydrationResponseToReactComponents(response: string): Promise<ReactElement>;
@@ -0,0 +1,131 @@
1
+ import { createElement, Fragment } from 'react';
2
+ import { wrapPromise } from '../../utilities';
3
+ const cache = new Map();
4
+ /**
5
+ * Much of this is borrowed from React's demo implementation:
6
+ * @see https://github.com/reactjs/server-components-demo/blob/main/src/Cache.client.js
7
+ *
8
+ * Note that we'd want to add some other constraints and controls around caching here.
9
+ */
10
+ export function useServerResponse(state) {
11
+ const key = JSON.stringify(state);
12
+ let response = cache.get(key);
13
+ if (response) {
14
+ return response;
15
+ }
16
+ response = createFromFetch(fetch('/react?state=' + encodeURIComponent(key)));
17
+ cache.set(key, response);
18
+ return response;
19
+ }
20
+ /**
21
+ * Similar to the RSC demo, `createFromFetch` wraps around a fetch call and throws
22
+ * promise events to the Suspense boundary until the content has loaded.
23
+ */
24
+ function createFromFetch(fetchPromise) {
25
+ return wrapPromise(fetchPromise
26
+ .then((response) => {
27
+ if (!response.ok) {
28
+ throw new Error(`Hydration request failed: ${response.statusText}`);
29
+ }
30
+ return response.text();
31
+ })
32
+ .then((payload) => {
33
+ return convertHydrationResponseToReactComponents(payload);
34
+ })
35
+ .catch((e) => {
36
+ console.error(e);
37
+ }));
38
+ }
39
+ export async function convertHydrationResponseToReactComponents(response) {
40
+ const manifest = createManifestFromWirePayload(response);
41
+ /**
42
+ * Eager-load all the modules referenced in the manifest. Otherwise,
43
+ * Hydration errors crop up and show in the console.
44
+ */
45
+ const modules = await eagerLoadModules(manifest);
46
+ function isReactTuple(item) {
47
+ return item instanceof Array && item.length === 4 && item[0] === '$';
48
+ }
49
+ function isReactTupleOrString(item) {
50
+ return typeof item === 'string' || isReactTuple(item);
51
+ }
52
+ function isReactTupleOrArrayOfTuples(item) {
53
+ return isReactTupleOrString(item) || isReactTupleOrString(item[0]);
54
+ }
55
+ function wireSyntaxToReactElement(item, key) {
56
+ if (typeof item === 'string')
57
+ return item;
58
+ if (typeof item !== 'object')
59
+ return null;
60
+ // Assume it's an array of tuples, defined in the component as a fragment.
61
+ if (!isReactTuple(item)) {
62
+ return createElement(Fragment, {
63
+ children: item.map(wireSyntaxToReactElement),
64
+ });
65
+ }
66
+ let [, type, , props] = item;
67
+ const allProps = { ...props };
68
+ /**
69
+ * Convert all props (including children) that may be serialized as tuples
70
+ * or arrays of tuples into React elements.
71
+ */
72
+ Object.entries(allProps).map(([key, prop]) => {
73
+ if (prop instanceof Array && isReactTupleOrArrayOfTuples(prop)) {
74
+ /**
75
+ * - Array of children tuples
76
+ * - ...or a list of children, combo of strings and tuples, produced by dangerouslySetInnerHtml
77
+ */
78
+ if (prop.every(isReactTupleOrString)) {
79
+ allProps[key] = prop.map(wireSyntaxToReactElement);
80
+ /**
81
+ * - Single tuple
82
+ */
83
+ }
84
+ else {
85
+ allProps[key] = wireSyntaxToReactElement(prop);
86
+ }
87
+ }
88
+ });
89
+ /**
90
+ * If the type is a module and not a React Symbol, reference the component
91
+ * listed in the manifest as `M<number>` and lazy-load it.
92
+ * `lazy()` throws Suspense promises until the component has loaded.
93
+ */
94
+ if (type.startsWith('@')) {
95
+ const module = manifest[type.replace('@', 'M')];
96
+ const mod = modules[type.replace('@', 'M')];
97
+ type = module.named ? mod[module.name] : mod.default;
98
+ }
99
+ return createElement(type, { ...allProps, key });
100
+ }
101
+ /**
102
+ * The manifest is listed as `J0` for some reason. This is how React does it.
103
+ * Maybe this is to support for additional model trees like `J1`?
104
+ *
105
+ * Regardless, this is guaranteed to exist from our server response.
106
+ */
107
+ return wireSyntaxToReactElement(manifest.J0);
108
+ }
109
+ function createManifestFromWirePayload(payload) {
110
+ return payload.split('\n').reduce((memo, row) => {
111
+ const [key, ...values] = row.split(':');
112
+ memo[key] = JSON.parse(values.join(':'));
113
+ return memo;
114
+ }, {});
115
+ }
116
+ async function eagerLoadModules(manifest) {
117
+ const modules = await Promise.all(Object.entries(manifest)
118
+ .map(([key, module]) => {
119
+ if (!key.startsWith('M'))
120
+ return;
121
+ return import(/* @vite-ignore */ module.id);
122
+ })
123
+ .filter(Boolean));
124
+ return Object.keys(manifest)
125
+ .filter((key) => key.startsWith('M'))
126
+ .map((key, idx) => [key, modules[idx]])
127
+ .reduce((memo, item) => {
128
+ memo[item[0]] = item[1];
129
+ return memo;
130
+ }, {});
131
+ }
@@ -0,0 +1,13 @@
1
+ export interface ClientModule {
2
+ name: string;
3
+ id: string;
4
+ }
5
+ /**
6
+ * Track the client components discovered while rendering SSR output to wire syntax.
7
+ */
8
+ export declare class ClientComponents {
9
+ modules: string[];
10
+ add(module: ClientModule): number;
11
+ indexOf(module: ClientModule): number;
12
+ all(): any[];
13
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Track the client components discovered while rendering SSR output to wire syntax.
3
+ */
4
+ export class ClientComponents {
5
+ constructor() {
6
+ this.modules = [];
7
+ }
8
+ add(module) {
9
+ this.modules.push(JSON.stringify(module));
10
+ return this.modules.length;
11
+ }
12
+ indexOf(module) {
13
+ return this.modules.indexOf(JSON.stringify(module)) + 1;
14
+ }
15
+ all() {
16
+ return this.modules.map((module) => JSON.parse(module));
17
+ }
18
+ }
@@ -0,0 +1,5 @@
1
+ import { ReactNode } from 'react';
2
+ export declare function Html({ children, head }: {
3
+ children: ReactNode;
4
+ head: string;
5
+ }): JSX.Element;
@@ -0,0 +1,9 @@
1
+ /// <reference types="vite/client" />
2
+ import React from 'react';
3
+ export function Html({ children, head }) {
4
+ return (React.createElement("html", { lang: "en" },
5
+ React.createElement("head", { dangerouslySetInnerHTML: { __html: head } }),
6
+ React.createElement("body", null,
7
+ React.createElement("div", { id: "root" }, children),
8
+ import.meta.env.DEV && (React.createElement("script", { type: "module", src: "/src/entry-client.jsx" })))));
9
+ }
@@ -0,0 +1 @@
1
+ export declare const HydrationContext: import("react").Context<boolean>;
@@ -0,0 +1,2 @@
1
+ import { createContext } from 'react';
2
+ export const HydrationContext = createContext(false);
@@ -0,0 +1,13 @@
1
+ /**
2
+ * This augments the `Request` object from the Fetch API:
3
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/Request
4
+ *
5
+ * - Adds a `cookies` map for easy access
6
+ * - Adds a static constructor to convert a Node.js `IncomingMessage` to a Request.
7
+ */
8
+ export declare class ServerComponentRequest extends Request {
9
+ cookies: Map<string, string>;
10
+ constructor(input: any);
11
+ constructor(input: RequestInfo, init?: RequestInit);
12
+ private parseCookies;
13
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * This augments the `Request` object from the Fetch API:
3
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/Request
4
+ *
5
+ * - Adds a `cookies` map for easy access
6
+ * - Adds a static constructor to convert a Node.js `IncomingMessage` to a Request.
7
+ */
8
+ export class ServerComponentRequest extends Request {
9
+ constructor(input, init) {
10
+ if (input instanceof Request) {
11
+ super(input, init);
12
+ }
13
+ else {
14
+ super(getUrlFromNodeRequest(input), {
15
+ headers: new Headers(input.headers),
16
+ method: input.method,
17
+ });
18
+ }
19
+ this.cookies = this.parseCookies();
20
+ }
21
+ parseCookies() {
22
+ const cookieString = this.headers.get('cookie') || '';
23
+ return new Map(cookieString
24
+ .split(';')
25
+ .map((chunk) => chunk.trim().split('=')));
26
+ }
27
+ }
28
+ /**
29
+ * @see https://github.com/frandiox/vitedge/blob/17f3cd943e86d7c0c71a862985ddd6caa2899425/src/node/utils.js#L19-L24
30
+ *
31
+ * Note: Request can sometimes be an instance of Express request, where `originalUrl` is the true source of what the
32
+ * URL pathname is. We want to use that if it's present, so we union type this to `any`.
33
+ */
34
+ function getUrlFromNodeRequest(request) {
35
+ var _a;
36
+ // TODO: Find out how to determine https from `request` object without forwarded proto
37
+ const secure = request.headers['x-forwarded-proto'] === 'https';
38
+ return new URL(`${secure ? 'https' : 'http'}://${request.headers.host + ((_a = request.originalUrl) !== null && _a !== void 0 ? _a : request.url)}`).toString();
39
+ }
@@ -0,0 +1,18 @@
1
+ export declare class ServerComponentResponse extends Response {
2
+ private wait;
3
+ /**
4
+ * Allow custom body to be a string or a Promise.
5
+ */
6
+ customBody: string | Promise<string>;
7
+ /**
8
+ * Buffer the current response until all queries have resolved,
9
+ * and prevent it from streaming back early.
10
+ */
11
+ doNotStream(): void;
12
+ canStream(): boolean;
13
+ /**
14
+ * Send the response from a Server Component. Renders React components to string,
15
+ * and returns `null` to make React happy.
16
+ */
17
+ send(body: any): null;
18
+ }