@shopify/hydrogen 2026.4.4 → 2026.10.0-preview.1

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 (754) hide show
  1. package/README.md +73 -13
  2. package/bin/hydrogen.mjs +7 -0
  3. package/dist/cli/index.mjs +330 -0
  4. package/dist/client/client.d.mts +34 -0
  5. package/dist/client/client.mjs +193 -0
  6. package/dist/client/client.mjs.map +1 -0
  7. package/dist/client/errors.d.mts +48 -0
  8. package/dist/client/errors.mjs +52 -0
  9. package/dist/client/errors.mjs.map +1 -0
  10. package/dist/client/index.d.mts +4 -0
  11. package/dist/client/types.d.mts +147 -0
  12. package/dist/core/analytics/cart-tracker.d.mts +8 -0
  13. package/dist/core/analytics/cart-tracker.mjs +144 -0
  14. package/dist/core/analytics/cart-tracker.mjs.map +1 -0
  15. package/dist/core/analytics/events.d.mts +15 -0
  16. package/dist/core/analytics/events.mjs +15 -0
  17. package/dist/core/analytics/events.mjs.map +1 -0
  18. package/dist/core/analytics/index.d.mts +3 -0
  19. package/dist/core/analytics/types.d.mts +143 -0
  20. package/dist/core/analytics/utils/flatten-connection.d.mts +19 -0
  21. package/dist/core/analytics/utils/flatten-connection.mjs +25 -0
  22. package/dist/core/analytics/utils/flatten-connection.mjs.map +1 -0
  23. package/dist/core/cache/cache-status.mjs +17 -0
  24. package/dist/core/cache/cache-status.mjs.map +1 -0
  25. package/dist/core/cache/fetch-with-cache.d.mts +43 -0
  26. package/dist/core/cache/fetch-with-cache.mjs +188 -0
  27. package/dist/core/cache/fetch-with-cache.mjs.map +1 -0
  28. package/dist/core/cache/key.d.mts +6 -0
  29. package/dist/core/cache/key.mjs +27 -0
  30. package/dist/core/cache/key.mjs.map +1 -0
  31. package/dist/core/cache/run-with-cache.d.mts +36 -0
  32. package/dist/core/cache/run-with-cache.mjs +114 -0
  33. package/dist/core/cache/run-with-cache.mjs.map +1 -0
  34. package/dist/core/cache/store.d.mts +19 -0
  35. package/dist/core/cache/store.mjs +62 -0
  36. package/dist/core/cache/store.mjs.map +1 -0
  37. package/dist/core/cache/strategies.d.mts +39 -0
  38. package/dist/core/cache/strategies.mjs +70 -0
  39. package/dist/core/cache/strategies.mjs.map +1 -0
  40. package/dist/core/cart/actions.d.mts +50 -0
  41. package/dist/core/cart/actions.mjs +240 -0
  42. package/dist/core/cart/actions.mjs.map +1 -0
  43. package/dist/core/cart/attach-quantity-input.d.mts +5 -0
  44. package/dist/core/cart/attach-quantity-input.mjs +17 -0
  45. package/dist/core/cart/attach-quantity-input.mjs.map +1 -0
  46. package/dist/core/cart/buyer-identity-sync.d.mts +23 -0
  47. package/dist/core/cart/buyer-identity-sync.mjs +9 -0
  48. package/dist/core/cart/buyer-identity-sync.mjs.map +1 -0
  49. package/dist/core/cart/cart.d.mts +32 -0
  50. package/dist/core/cart/cart.mjs +1687 -0
  51. package/dist/core/cart/cart.mjs.map +1 -0
  52. package/dist/core/cart/cookie.d.mts +5 -0
  53. package/dist/core/cart/cookie.mjs +28 -0
  54. package/dist/core/cart/cookie.mjs.map +1 -0
  55. package/dist/core/cart/form.d.mts +130 -0
  56. package/dist/core/cart/form.mjs +75 -0
  57. package/dist/core/cart/form.mjs.map +1 -0
  58. package/dist/core/cart/get-cart.d.mts +25 -0
  59. package/dist/core/cart/get-cart.mjs +32 -0
  60. package/dist/core/cart/get-cart.mjs.map +1 -0
  61. package/dist/core/cart/index.d.mts +10 -0
  62. package/dist/core/cart/quantity.d.mts +10 -0
  63. package/dist/core/cart/quantity.mjs +14 -0
  64. package/dist/core/cart/quantity.mjs.map +1 -0
  65. package/dist/core/cart/queries.d.mts +4296 -0
  66. package/dist/core/cart/queries.mjs +70 -0
  67. package/dist/core/cart/queries.mjs.map +1 -0
  68. package/dist/core/cart/server-handlers.d.mts +82 -0
  69. package/dist/core/cart/server-handlers.mjs +322 -0
  70. package/dist/core/cart/server-handlers.mjs.map +1 -0
  71. package/dist/core/cart/state.d.mts +137 -0
  72. package/dist/core/cart/state.mjs +76 -0
  73. package/dist/core/cart/state.mjs.map +1 -0
  74. package/dist/core/cart/sync-quantity-inputs.mjs +16 -0
  75. package/dist/core/cart/sync-quantity-inputs.mjs.map +1 -0
  76. package/dist/core/collection/collection.d.mts +134 -0
  77. package/dist/core/collection/collection.mjs +170 -0
  78. package/dist/core/collection/collection.mjs.map +1 -0
  79. package/dist/core/collection/index.d.mts +6 -0
  80. package/dist/core/collection/reconciler.d.mts +32 -0
  81. package/dist/core/collection/reconciler.mjs +89 -0
  82. package/dist/core/collection/reconciler.mjs.map +1 -0
  83. package/dist/core/collection/state.d.mts +66 -0
  84. package/dist/core/collection/state.mjs +20 -0
  85. package/dist/core/collection/state.mjs.map +1 -0
  86. package/dist/core/collection/url.d.mts +70 -0
  87. package/dist/core/collection/url.mjs +367 -0
  88. package/dist/core/collection/url.mjs.map +1 -0
  89. package/dist/core/constants.d.mts +5 -0
  90. package/dist/core/constants.mjs +8 -0
  91. package/dist/core/constants.mjs.map +1 -0
  92. package/dist/core/headers.mjs +44 -0
  93. package/dist/core/headers.mjs.map +1 -0
  94. package/dist/core/index.d.mts +55 -0
  95. package/dist/core/index.mjs +44 -0
  96. package/dist/core/logging/logging.d.mts +21 -0
  97. package/dist/core/logging/logging.mjs +99 -0
  98. package/dist/core/logging/logging.mjs.map +1 -0
  99. package/dist/core/logging/types.d.mts +40 -0
  100. package/dist/core/logging/types.mjs +18 -0
  101. package/dist/core/logging/types.mjs.map +1 -0
  102. package/dist/core/money/cache.mjs +25 -0
  103. package/dist/core/money/cache.mjs.map +1 -0
  104. package/dist/core/money/format.d.mts +15 -0
  105. package/dist/core/money/format.mjs +243 -0
  106. package/dist/core/money/format.mjs.map +1 -0
  107. package/dist/core/money/types.d.mts +47 -0
  108. package/dist/core/observable.mjs +46 -0
  109. package/dist/core/observable.mjs.map +1 -0
  110. package/dist/core/predictive-search/constants.d.mts +5 -0
  111. package/dist/core/predictive-search/constants.mjs +6 -0
  112. package/dist/core/predictive-search/constants.mjs.map +1 -0
  113. package/dist/core/predictive-search/form.d.mts +31 -0
  114. package/dist/core/predictive-search/form.mjs +31 -0
  115. package/dist/core/predictive-search/form.mjs.map +1 -0
  116. package/dist/core/predictive-search/index.d.mts +6 -0
  117. package/dist/core/predictive-search/queries.d.mts +118 -0
  118. package/dist/core/predictive-search/queries.mjs +81 -0
  119. package/dist/core/predictive-search/queries.mjs.map +1 -0
  120. package/dist/core/predictive-search/search.d.mts +32 -0
  121. package/dist/core/predictive-search/search.mjs +74 -0
  122. package/dist/core/predictive-search/search.mjs.map +1 -0
  123. package/dist/core/predictive-search/server-handlers.d.mts +36 -0
  124. package/dist/core/predictive-search/server-handlers.mjs +113 -0
  125. package/dist/core/predictive-search/server-handlers.mjs.map +1 -0
  126. package/dist/core/predictive-search/store.d.mts +44 -0
  127. package/dist/core/predictive-search/store.mjs +224 -0
  128. package/dist/core/predictive-search/store.mjs.map +1 -0
  129. package/dist/core/predictive-search/url.d.mts +41 -0
  130. package/dist/core/predictive-search/url.mjs +71 -0
  131. package/dist/core/predictive-search/url.mjs.map +1 -0
  132. package/dist/core/product/form.d.mts +63 -0
  133. package/dist/core/product/form.mjs +44 -0
  134. package/dist/core/product/form.mjs.map +1 -0
  135. package/dist/core/product/index.d.mts +4 -0
  136. package/dist/core/product/options.d.mts +40 -0
  137. package/dist/core/product/options.mjs +291 -0
  138. package/dist/core/product/options.mjs.map +1 -0
  139. package/dist/core/product/product-form.d.mts +72 -0
  140. package/dist/core/product/product-form.mjs +158 -0
  141. package/dist/core/product/product-form.mjs.map +1 -0
  142. package/dist/core/product/state.d.mts +68 -0
  143. package/dist/core/request-context.d.mts +70 -0
  144. package/dist/core/request-context.mjs +120 -0
  145. package/dist/core/request-context.mjs.map +1 -0
  146. package/dist/core/request-routing/handle-shopify-redirects.d.mts +17 -0
  147. package/dist/core/request-routing/handle-shopify-redirects.mjs +31 -0
  148. package/dist/core/request-routing/handle-shopify-redirects.mjs.map +1 -0
  149. package/dist/core/request-routing/handle-shopify-routes.d.mts +14 -0
  150. package/dist/core/request-routing/handle-shopify-routes.mjs +42 -0
  151. package/dist/core/request-routing/handle-shopify-routes.mjs.map +1 -0
  152. package/dist/core/request-routing/interceptors/admin-redirect.mjs +12 -0
  153. package/dist/core/request-routing/interceptors/admin-redirect.mjs.map +1 -0
  154. package/dist/core/request-routing/interceptors/agent-proxy.mjs +19 -0
  155. package/dist/core/request-routing/interceptors/agent-proxy.mjs.map +1 -0
  156. package/dist/core/request-routing/interceptors/ajax-api.mjs +16 -0
  157. package/dist/core/request-routing/interceptors/ajax-api.mjs.map +1 -0
  158. package/dist/core/request-routing/interceptors/api-proxy.mjs +20 -0
  159. package/dist/core/request-routing/interceptors/api-proxy.mjs.map +1 -0
  160. package/dist/core/request-routing/interceptors/checkout.mjs +58 -0
  161. package/dist/core/request-routing/interceptors/checkout.mjs.map +1 -0
  162. package/dist/core/request-routing/interceptors/mcp-proxy.mjs +23 -0
  163. package/dist/core/request-routing/interceptors/mcp-proxy.mjs.map +1 -0
  164. package/dist/core/request-routing/interceptors/proxy.mjs +68 -0
  165. package/dist/core/request-routing/interceptors/proxy.mjs.map +1 -0
  166. package/dist/core/request-routing/interceptors/query-param-redirect.mjs +22 -0
  167. package/dist/core/request-routing/interceptors/query-param-redirect.mjs.map +1 -0
  168. package/dist/core/request-routing/interceptors/sfapi-proxy.mjs +27 -0
  169. package/dist/core/request-routing/interceptors/sfapi-proxy.mjs.map +1 -0
  170. package/dist/core/request-routing/interceptors/standard-routes.mjs +19 -0
  171. package/dist/core/request-routing/interceptors/standard-routes.mjs.map +1 -0
  172. package/dist/core/request-routing/interceptors/url-redirects.mjs +27 -0
  173. package/dist/core/request-routing/interceptors/url-redirects.mjs.map +1 -0
  174. package/dist/core/request-routing/interceptors/well-known.mjs +19 -0
  175. package/dist/core/request-routing/interceptors/well-known.mjs.map +1 -0
  176. package/dist/core/request-routing/registered-routes.d.mts +7 -0
  177. package/dist/core/request-routing/registered-routes.mjs +59 -0
  178. package/dist/core/request-routing/registered-routes.mjs.map +1 -0
  179. package/dist/core/request-routing/route-types.d.mts +51 -0
  180. package/dist/core/request-routing/safe-apply-response-headers.mjs +16 -0
  181. package/dist/core/request-routing/safe-apply-response-headers.mjs.map +1 -0
  182. package/dist/core/shop-pay/shop-pay.d.mts +102 -0
  183. package/dist/core/shop-pay/shop-pay.mjs +289 -0
  184. package/dist/core/shop-pay/shop-pay.mjs.map +1 -0
  185. package/dist/core/shopify-scripts/analytics.mjs +26 -0
  186. package/dist/core/shopify-scripts/analytics.mjs.map +1 -0
  187. package/dist/core/shopify-scripts/consent.mjs +17 -0
  188. package/dist/core/shopify-scripts/consent.mjs.map +1 -0
  189. package/dist/core/shopify-scripts/constants.mjs +19 -0
  190. package/dist/core/shopify-scripts/constants.mjs.map +1 -0
  191. package/dist/core/shopify-scripts/deprecated-cookies.mjs +97 -0
  192. package/dist/core/shopify-scripts/deprecated-cookies.mjs.map +1 -0
  193. package/dist/core/shopify-scripts/global.d.mts +1 -0
  194. package/dist/core/shopify-scripts/global.mjs +86 -0
  195. package/dist/core/shopify-scripts/global.mjs.map +1 -0
  196. package/dist/core/shopify-scripts/index.d.mts +27 -0
  197. package/dist/core/shopify-scripts/index.mjs +135 -0
  198. package/dist/core/shopify-scripts/index.mjs.map +1 -0
  199. package/dist/core/shopify-scripts/initialize.d.mts +18 -0
  200. package/dist/core/shopify-scripts/initialize.mjs +27 -0
  201. package/dist/core/shopify-scripts/initialize.mjs.map +1 -0
  202. package/dist/core/shopify-scripts/page-view.mjs +49 -0
  203. package/dist/core/shopify-scripts/page-view.mjs.map +1 -0
  204. package/dist/core/shopify-scripts/perfkit.mjs +33 -0
  205. package/dist/core/shopify-scripts/perfkit.mjs.map +1 -0
  206. package/dist/core/shopify-scripts/render.d.mts +1 -0
  207. package/dist/core/shopify-scripts/render.mjs +23 -0
  208. package/dist/core/shopify-scripts/render.mjs.map +1 -0
  209. package/dist/core/shopify-scripts/types.d.mts +76 -0
  210. package/dist/core/shopify-scripts/utils/cookie-domain.mjs +43 -0
  211. package/dist/core/shopify-scripts/utils/cookie-domain.mjs.map +1 -0
  212. package/dist/core/shopify-scripts/utils/inline-script.mjs +8 -0
  213. package/dist/core/shopify-scripts/utils/inline-script.mjs.map +1 -0
  214. package/dist/core/shopify-scripts/utils/navigation.mjs +46 -0
  215. package/dist/core/shopify-scripts/utils/navigation.mjs.map +1 -0
  216. package/dist/core/shopify-scripts/utils/tracking-values.mjs +65 -0
  217. package/dist/core/shopify-scripts/utils/tracking-values.mjs.map +1 -0
  218. package/dist/core/shopify-scripts/utils/uuid.mjs +17 -0
  219. package/dist/core/shopify-scripts/utils/uuid.mjs.map +1 -0
  220. package/dist/core/shopify-scripts/webmcp.mjs +22 -0
  221. package/dist/core/shopify-scripts/webmcp.mjs.map +1 -0
  222. package/dist/core/standard-routes/build.d.mts +34 -0
  223. package/dist/core/standard-routes/build.mjs +54 -0
  224. package/dist/core/standard-routes/build.mjs.map +1 -0
  225. package/dist/core/standard-routes/defaults.mjs +31 -0
  226. package/dist/core/standard-routes/defaults.mjs.map +1 -0
  227. package/dist/core/standard-routes/match.mjs +108 -0
  228. package/dist/core/standard-routes/match.mjs.map +1 -0
  229. package/dist/core/standard-routes/path.mjs +58 -0
  230. package/dist/core/standard-routes/path.mjs.map +1 -0
  231. package/dist/core/standard-routes/redirects.mjs +51 -0
  232. package/dist/core/standard-routes/redirects.mjs.map +1 -0
  233. package/dist/core/standard-routes/types.d.mts +95 -0
  234. package/dist/core/url.mjs +35 -0
  235. package/dist/core/url.mjs.map +1 -0
  236. package/dist/core/utils/load-script.mjs +34 -0
  237. package/dist/core/utils/load-script.mjs.map +1 -0
  238. package/dist/core/utils/parse-gid.mjs +33 -0
  239. package/dist/core/utils/parse-gid.mjs.map +1 -0
  240. package/dist/core/utils/record.mjs +8 -0
  241. package/dist/core/utils/record.mjs.map +1 -0
  242. package/dist/customer-account/client.d.mts +50 -0
  243. package/dist/customer-account/client.mjs +239 -0
  244. package/dist/customer-account/client.mjs.map +1 -0
  245. package/dist/customer-account/errors.d.mts +28 -0
  246. package/dist/customer-account/errors.mjs +39 -0
  247. package/dist/customer-account/errors.mjs.map +1 -0
  248. package/dist/customer-account/graphql.d.mts +29 -0
  249. package/dist/customer-account/graphql.mjs +39 -0
  250. package/dist/customer-account/graphql.mjs.map +1 -0
  251. package/dist/customer-account/index.d.mts +7 -0
  252. package/dist/customer-account/index.mjs +7 -0
  253. package/dist/customer-account/session.d.mts +117 -0
  254. package/dist/customer-account/session.mjs +733 -0
  255. package/dist/customer-account/session.mjs.map +1 -0
  256. package/dist/customer-account/type-resolver.d.mts +11 -0
  257. package/dist/customer-account-api-types.d.ts +3269 -3270
  258. package/dist/customer-account.schema.json +50753 -1
  259. package/dist/development/_virtual/_@oxc-project_runtime@0.127.0/helpers/taggedTemplateLiteral.mjs +7 -0
  260. package/dist/development/client/client.d.mts +34 -0
  261. package/dist/development/client/client.mjs +193 -0
  262. package/dist/development/client/client.mjs.map +1 -0
  263. package/dist/development/client/errors.d.mts +48 -0
  264. package/dist/development/client/errors.mjs +57 -0
  265. package/dist/development/client/errors.mjs.map +1 -0
  266. package/dist/development/client/index.d.mts +4 -0
  267. package/dist/development/client/types.d.mts +147 -0
  268. package/dist/development/core/analytics/cart-tracker.d.mts +8 -0
  269. package/dist/development/core/analytics/cart-tracker.mjs +144 -0
  270. package/dist/development/core/analytics/cart-tracker.mjs.map +1 -0
  271. package/dist/development/core/analytics/events.d.mts +15 -0
  272. package/dist/development/core/analytics/events.mjs +15 -0
  273. package/dist/development/core/analytics/events.mjs.map +1 -0
  274. package/dist/development/core/analytics/index.d.mts +3 -0
  275. package/dist/development/core/analytics/types.d.mts +143 -0
  276. package/dist/development/core/analytics/utils/flatten-connection.d.mts +19 -0
  277. package/dist/development/core/analytics/utils/flatten-connection.mjs +25 -0
  278. package/dist/development/core/analytics/utils/flatten-connection.mjs.map +1 -0
  279. package/dist/development/core/cache/cache-status.mjs +17 -0
  280. package/dist/development/core/cache/cache-status.mjs.map +1 -0
  281. package/dist/development/core/cache/fetch-with-cache.d.mts +43 -0
  282. package/dist/development/core/cache/fetch-with-cache.mjs +188 -0
  283. package/dist/development/core/cache/fetch-with-cache.mjs.map +1 -0
  284. package/dist/development/core/cache/key.d.mts +6 -0
  285. package/dist/development/core/cache/key.mjs +27 -0
  286. package/dist/development/core/cache/key.mjs.map +1 -0
  287. package/dist/development/core/cache/run-with-cache.d.mts +36 -0
  288. package/dist/development/core/cache/run-with-cache.mjs +114 -0
  289. package/dist/development/core/cache/run-with-cache.mjs.map +1 -0
  290. package/dist/development/core/cache/store.d.mts +19 -0
  291. package/dist/development/core/cache/store.mjs +62 -0
  292. package/dist/development/core/cache/store.mjs.map +1 -0
  293. package/dist/development/core/cache/strategies.d.mts +39 -0
  294. package/dist/development/core/cache/strategies.mjs +70 -0
  295. package/dist/development/core/cache/strategies.mjs.map +1 -0
  296. package/dist/development/core/cart/actions.d.mts +50 -0
  297. package/dist/development/core/cart/actions.mjs +240 -0
  298. package/dist/development/core/cart/actions.mjs.map +1 -0
  299. package/dist/development/core/cart/attach-quantity-input.d.mts +5 -0
  300. package/dist/development/core/cart/attach-quantity-input.mjs +17 -0
  301. package/dist/development/core/cart/attach-quantity-input.mjs.map +1 -0
  302. package/dist/development/core/cart/buyer-identity-sync.d.mts +19 -0
  303. package/dist/development/core/cart/buyer-identity-sync.mjs +6 -0
  304. package/dist/development/core/cart/buyer-identity-sync.mjs.map +1 -0
  305. package/dist/development/core/cart/cart.d.mts +32 -0
  306. package/dist/development/core/cart/cart.mjs +1687 -0
  307. package/dist/development/core/cart/cart.mjs.map +1 -0
  308. package/dist/development/core/cart/cookie.d.mts +5 -0
  309. package/dist/development/core/cart/cookie.mjs +28 -0
  310. package/dist/development/core/cart/cookie.mjs.map +1 -0
  311. package/dist/development/core/cart/form.d.mts +130 -0
  312. package/dist/development/core/cart/form.mjs +75 -0
  313. package/dist/development/core/cart/form.mjs.map +1 -0
  314. package/dist/development/core/cart/get-cart.d.mts +25 -0
  315. package/dist/development/core/cart/get-cart.mjs +32 -0
  316. package/dist/development/core/cart/get-cart.mjs.map +1 -0
  317. package/dist/development/core/cart/index.d.mts +10 -0
  318. package/dist/development/core/cart/quantity.d.mts +10 -0
  319. package/dist/development/core/cart/quantity.mjs +14 -0
  320. package/dist/development/core/cart/quantity.mjs.map +1 -0
  321. package/dist/development/core/cart/queries.d.mts +4296 -0
  322. package/dist/development/core/cart/queries.mjs +70 -0
  323. package/dist/development/core/cart/queries.mjs.map +1 -0
  324. package/dist/development/core/cart/server-handlers.d.mts +82 -0
  325. package/dist/development/core/cart/server-handlers.mjs +322 -0
  326. package/dist/development/core/cart/server-handlers.mjs.map +1 -0
  327. package/dist/development/core/cart/state.d.mts +137 -0
  328. package/dist/development/core/cart/state.mjs +76 -0
  329. package/dist/development/core/cart/state.mjs.map +1 -0
  330. package/dist/development/core/cart/sync-quantity-inputs.mjs +16 -0
  331. package/dist/development/core/cart/sync-quantity-inputs.mjs.map +1 -0
  332. package/dist/development/core/collection/collection.d.mts +134 -0
  333. package/dist/development/core/collection/collection.mjs +170 -0
  334. package/dist/development/core/collection/collection.mjs.map +1 -0
  335. package/dist/development/core/collection/index.d.mts +6 -0
  336. package/dist/development/core/collection/reconciler.d.mts +32 -0
  337. package/dist/development/core/collection/reconciler.mjs +89 -0
  338. package/dist/development/core/collection/reconciler.mjs.map +1 -0
  339. package/dist/development/core/collection/state.d.mts +66 -0
  340. package/dist/development/core/collection/state.mjs +20 -0
  341. package/dist/development/core/collection/state.mjs.map +1 -0
  342. package/dist/development/core/collection/url.d.mts +70 -0
  343. package/dist/development/core/collection/url.mjs +367 -0
  344. package/dist/development/core/collection/url.mjs.map +1 -0
  345. package/dist/development/core/constants.mjs +7 -0
  346. package/dist/development/core/constants.mjs.map +1 -0
  347. package/dist/development/core/development.d.mts +55 -0
  348. package/dist/development/core/development.mjs +44 -0
  349. package/dist/development/core/headers.mjs +44 -0
  350. package/dist/development/core/headers.mjs.map +1 -0
  351. package/dist/development/core/index.d.mts +53 -0
  352. package/dist/development/core/logging/logging.d.mts +21 -0
  353. package/dist/development/core/logging/logging.mjs +99 -0
  354. package/dist/development/core/logging/logging.mjs.map +1 -0
  355. package/dist/development/core/logging/types.d.mts +40 -0
  356. package/dist/development/core/logging/types.mjs +18 -0
  357. package/dist/development/core/logging/types.mjs.map +1 -0
  358. package/dist/development/core/money/cache.mjs +25 -0
  359. package/dist/development/core/money/cache.mjs.map +1 -0
  360. package/dist/development/core/money/format.d.mts +15 -0
  361. package/dist/development/core/money/format.mjs +243 -0
  362. package/dist/development/core/money/format.mjs.map +1 -0
  363. package/dist/development/core/money/types.d.mts +47 -0
  364. package/dist/development/core/observable.mjs +46 -0
  365. package/dist/development/core/observable.mjs.map +1 -0
  366. package/dist/development/core/predictive-search/constants.d.mts +5 -0
  367. package/dist/development/core/predictive-search/constants.mjs +6 -0
  368. package/dist/development/core/predictive-search/constants.mjs.map +1 -0
  369. package/dist/development/core/predictive-search/form.d.mts +31 -0
  370. package/dist/development/core/predictive-search/form.mjs +31 -0
  371. package/dist/development/core/predictive-search/form.mjs.map +1 -0
  372. package/dist/development/core/predictive-search/index.d.mts +6 -0
  373. package/dist/development/core/predictive-search/queries.d.mts +118 -0
  374. package/dist/development/core/predictive-search/queries.mjs +81 -0
  375. package/dist/development/core/predictive-search/queries.mjs.map +1 -0
  376. package/dist/development/core/predictive-search/search.d.mts +32 -0
  377. package/dist/development/core/predictive-search/search.mjs +74 -0
  378. package/dist/development/core/predictive-search/search.mjs.map +1 -0
  379. package/dist/development/core/predictive-search/server-handlers.d.mts +36 -0
  380. package/dist/development/core/predictive-search/server-handlers.mjs +113 -0
  381. package/dist/development/core/predictive-search/server-handlers.mjs.map +1 -0
  382. package/dist/development/core/predictive-search/store.d.mts +44 -0
  383. package/dist/development/core/predictive-search/store.mjs +224 -0
  384. package/dist/development/core/predictive-search/store.mjs.map +1 -0
  385. package/dist/development/core/predictive-search/url.d.mts +41 -0
  386. package/dist/development/core/predictive-search/url.mjs +71 -0
  387. package/dist/development/core/predictive-search/url.mjs.map +1 -0
  388. package/dist/development/core/product/form.d.mts +63 -0
  389. package/dist/development/core/product/form.mjs +44 -0
  390. package/dist/development/core/product/form.mjs.map +1 -0
  391. package/dist/development/core/product/index.d.mts +4 -0
  392. package/dist/development/core/product/options.d.mts +40 -0
  393. package/dist/development/core/product/options.mjs +291 -0
  394. package/dist/development/core/product/options.mjs.map +1 -0
  395. package/dist/development/core/product/product-form.d.mts +72 -0
  396. package/dist/development/core/product/product-form.mjs +158 -0
  397. package/dist/development/core/product/product-form.mjs.map +1 -0
  398. package/dist/development/core/product/state.d.mts +68 -0
  399. package/dist/development/core/request-context.d.mts +70 -0
  400. package/dist/development/core/request-context.mjs +120 -0
  401. package/dist/development/core/request-context.mjs.map +1 -0
  402. package/dist/development/core/request-routing/handle-shopify-redirects.d.mts +17 -0
  403. package/dist/development/core/request-routing/handle-shopify-redirects.mjs +31 -0
  404. package/dist/development/core/request-routing/handle-shopify-redirects.mjs.map +1 -0
  405. package/dist/development/core/request-routing/handle-shopify-routes.d.mts +1 -0
  406. package/dist/development/core/request-routing/handle-shopify-routes.development.d.mts +11 -0
  407. package/dist/development/core/request-routing/handle-shopify-routes.development.mjs +16 -0
  408. package/dist/development/core/request-routing/handle-shopify-routes.development.mjs.map +1 -0
  409. package/dist/development/core/request-routing/handle-shopify-routes.mjs +42 -0
  410. package/dist/development/core/request-routing/handle-shopify-routes.mjs.map +1 -0
  411. package/dist/development/core/request-routing/interceptors/admin-redirect.mjs +12 -0
  412. package/dist/development/core/request-routing/interceptors/admin-redirect.mjs.map +1 -0
  413. package/dist/development/core/request-routing/interceptors/agent-proxy.mjs +19 -0
  414. package/dist/development/core/request-routing/interceptors/agent-proxy.mjs.map +1 -0
  415. package/dist/development/core/request-routing/interceptors/ajax-api.mjs +16 -0
  416. package/dist/development/core/request-routing/interceptors/ajax-api.mjs.map +1 -0
  417. package/dist/development/core/request-routing/interceptors/api-proxy.mjs +20 -0
  418. package/dist/development/core/request-routing/interceptors/api-proxy.mjs.map +1 -0
  419. package/dist/development/core/request-routing/interceptors/checkout.mjs +58 -0
  420. package/dist/development/core/request-routing/interceptors/checkout.mjs.map +1 -0
  421. package/dist/development/core/request-routing/interceptors/graphiql.mjs +46 -0
  422. package/dist/development/core/request-routing/interceptors/graphiql.mjs.map +1 -0
  423. package/dist/development/core/request-routing/interceptors/mcp-proxy.mjs +23 -0
  424. package/dist/development/core/request-routing/interceptors/mcp-proxy.mjs.map +1 -0
  425. package/dist/development/core/request-routing/interceptors/proxy.mjs +68 -0
  426. package/dist/development/core/request-routing/interceptors/proxy.mjs.map +1 -0
  427. package/dist/development/core/request-routing/interceptors/query-param-redirect.mjs +22 -0
  428. package/dist/development/core/request-routing/interceptors/query-param-redirect.mjs.map +1 -0
  429. package/dist/development/core/request-routing/interceptors/sfapi-proxy.mjs +27 -0
  430. package/dist/development/core/request-routing/interceptors/sfapi-proxy.mjs.map +1 -0
  431. package/dist/development/core/request-routing/interceptors/standard-routes.mjs +19 -0
  432. package/dist/development/core/request-routing/interceptors/standard-routes.mjs.map +1 -0
  433. package/dist/development/core/request-routing/interceptors/url-redirects.mjs +27 -0
  434. package/dist/development/core/request-routing/interceptors/url-redirects.mjs.map +1 -0
  435. package/dist/development/core/request-routing/interceptors/well-known.mjs +19 -0
  436. package/dist/development/core/request-routing/interceptors/well-known.mjs.map +1 -0
  437. package/dist/development/core/request-routing/registered-routes.d.mts +7 -0
  438. package/dist/development/core/request-routing/registered-routes.mjs +59 -0
  439. package/dist/development/core/request-routing/registered-routes.mjs.map +1 -0
  440. package/dist/development/core/request-routing/route-types.d.mts +51 -0
  441. package/dist/development/core/request-routing/safe-apply-response-headers.mjs +16 -0
  442. package/dist/development/core/request-routing/safe-apply-response-headers.mjs.map +1 -0
  443. package/dist/development/core/shop-pay/shop-pay.d.mts +102 -0
  444. package/dist/development/core/shop-pay/shop-pay.mjs +289 -0
  445. package/dist/development/core/shop-pay/shop-pay.mjs.map +1 -0
  446. package/dist/development/core/shopify-scripts/analytics.mjs +26 -0
  447. package/dist/development/core/shopify-scripts/analytics.mjs.map +1 -0
  448. package/dist/development/core/shopify-scripts/consent.mjs +17 -0
  449. package/dist/development/core/shopify-scripts/consent.mjs.map +1 -0
  450. package/dist/development/core/shopify-scripts/constants.mjs +19 -0
  451. package/dist/development/core/shopify-scripts/constants.mjs.map +1 -0
  452. package/dist/development/core/shopify-scripts/deprecated-cookies.mjs +97 -0
  453. package/dist/development/core/shopify-scripts/deprecated-cookies.mjs.map +1 -0
  454. package/dist/development/core/shopify-scripts/global.d.mts +1 -0
  455. package/dist/development/core/shopify-scripts/global.mjs +86 -0
  456. package/dist/development/core/shopify-scripts/global.mjs.map +1 -0
  457. package/dist/development/core/shopify-scripts/index.d.mts +27 -0
  458. package/dist/development/core/shopify-scripts/index.mjs +145 -0
  459. package/dist/development/core/shopify-scripts/index.mjs.map +1 -0
  460. package/dist/development/core/shopify-scripts/initialize.d.mts +18 -0
  461. package/dist/development/core/shopify-scripts/initialize.mjs +27 -0
  462. package/dist/development/core/shopify-scripts/initialize.mjs.map +1 -0
  463. package/dist/development/core/shopify-scripts/page-view.mjs +49 -0
  464. package/dist/development/core/shopify-scripts/page-view.mjs.map +1 -0
  465. package/dist/development/core/shopify-scripts/perfkit.mjs +33 -0
  466. package/dist/development/core/shopify-scripts/perfkit.mjs.map +1 -0
  467. package/dist/development/core/shopify-scripts/render.d.mts +1 -0
  468. package/dist/development/core/shopify-scripts/render.mjs +23 -0
  469. package/dist/development/core/shopify-scripts/render.mjs.map +1 -0
  470. package/dist/development/core/shopify-scripts/types.d.mts +76 -0
  471. package/dist/development/core/shopify-scripts/utils/cookie-domain.mjs +43 -0
  472. package/dist/development/core/shopify-scripts/utils/cookie-domain.mjs.map +1 -0
  473. package/dist/development/core/shopify-scripts/utils/inline-script.mjs +8 -0
  474. package/dist/development/core/shopify-scripts/utils/inline-script.mjs.map +1 -0
  475. package/dist/development/core/shopify-scripts/utils/navigation.mjs +46 -0
  476. package/dist/development/core/shopify-scripts/utils/navigation.mjs.map +1 -0
  477. package/dist/development/core/shopify-scripts/utils/tracking-values.mjs +65 -0
  478. package/dist/development/core/shopify-scripts/utils/tracking-values.mjs.map +1 -0
  479. package/dist/development/core/shopify-scripts/utils/uuid.mjs +17 -0
  480. package/dist/development/core/shopify-scripts/utils/uuid.mjs.map +1 -0
  481. package/dist/development/core/shopify-scripts/webmcp.mjs +22 -0
  482. package/dist/development/core/shopify-scripts/webmcp.mjs.map +1 -0
  483. package/dist/development/core/standard-routes/build.d.mts +34 -0
  484. package/dist/development/core/standard-routes/build.mjs +54 -0
  485. package/dist/development/core/standard-routes/build.mjs.map +1 -0
  486. package/dist/development/core/standard-routes/defaults.mjs +31 -0
  487. package/dist/development/core/standard-routes/defaults.mjs.map +1 -0
  488. package/dist/development/core/standard-routes/match.mjs +108 -0
  489. package/dist/development/core/standard-routes/match.mjs.map +1 -0
  490. package/dist/development/core/standard-routes/path.mjs +58 -0
  491. package/dist/development/core/standard-routes/path.mjs.map +1 -0
  492. package/dist/development/core/standard-routes/redirects.mjs +51 -0
  493. package/dist/development/core/standard-routes/redirects.mjs.map +1 -0
  494. package/dist/development/core/standard-routes/types.d.mts +95 -0
  495. package/dist/development/core/types.d.mts +11 -0
  496. package/dist/development/core/url.mjs +35 -0
  497. package/dist/development/core/url.mjs.map +1 -0
  498. package/dist/development/core/utils/load-script.mjs +34 -0
  499. package/dist/development/core/utils/load-script.mjs.map +1 -0
  500. package/dist/development/core/utils/parse-gid.mjs +33 -0
  501. package/dist/development/core/utils/parse-gid.mjs.map +1 -0
  502. package/dist/development/customer-account/session.d.mts +46 -0
  503. package/dist/development/customer-account/session.mjs +21 -0
  504. package/dist/development/customer-account/session.mjs.map +1 -0
  505. package/dist/development/globals.d.mts +64 -0
  506. package/dist/development/graphql/generated/customer-account-api-types.d.mts +13 -0
  507. package/dist/development/graphql/generated/graphql-env.d.mts +19280 -0
  508. package/dist/development/graphql/generated/storefront-api-types.d.mts +47 -0
  509. package/dist/development/graphql/graphql.d.mts +40 -0
  510. package/dist/development/graphql/graphql.mjs +16 -0
  511. package/dist/development/graphql/graphql.mjs.map +1 -0
  512. package/dist/development/graphql/index.d.mts +2 -0
  513. package/dist/development/graphql/scalars.d.mts +15 -0
  514. package/dist/development/graphql/type-resolver.d.mts +229 -0
  515. package/dist/development/react/cart.d.mts +40 -0
  516. package/dist/development/react/cart.mjs +150 -0
  517. package/dist/development/react/cart.mjs.map +1 -0
  518. package/dist/development/react/collection.d.mts +91 -0
  519. package/dist/development/react/collection.mjs +129 -0
  520. package/dist/development/react/collection.mjs.map +1 -0
  521. package/dist/development/react/index.d.mts +13 -0
  522. package/dist/development/react/index.mjs +10 -0
  523. package/dist/development/react/predictive-search.d.mts +49 -0
  524. package/dist/development/react/predictive-search.mjs +133 -0
  525. package/dist/development/react/predictive-search.mjs.map +1 -0
  526. package/dist/development/react/product.d.mts +72 -0
  527. package/dist/development/react/product.mjs +127 -0
  528. package/dist/development/react/product.mjs.map +1 -0
  529. package/dist/development/react/shop-pay.d.mts +9 -0
  530. package/dist/development/react/shop-pay.mjs +16 -0
  531. package/dist/development/react/shop-pay.mjs.map +1 -0
  532. package/dist/development/react/shopify-scripts.d.mts +20 -0
  533. package/dist/development/react/shopify-scripts.mjs +39 -0
  534. package/dist/development/react/shopify-scripts.mjs.map +1 -0
  535. package/dist/development/vendor/standard-actions.d.mts +134 -0
  536. package/dist/development/vendor/standard-events.d.mts +1107 -0
  537. package/dist/development/vue/cart.d.mts +42 -0
  538. package/dist/development/vue/cart.mjs +118 -0
  539. package/dist/development/vue/cart.mjs.map +1 -0
  540. package/dist/development/vue/collection.d.mts +46 -0
  541. package/dist/development/vue/collection.mjs +108 -0
  542. package/dist/development/vue/collection.mjs.map +1 -0
  543. package/dist/development/vue/index.d.mts +11 -0
  544. package/dist/development/vue/index.mjs +8 -0
  545. package/dist/development/vue/predictive-search.d.mts +124 -0
  546. package/dist/development/vue/predictive-search.mjs +171 -0
  547. package/dist/development/vue/predictive-search.mjs.map +1 -0
  548. package/dist/development/vue/product.d.mts +57 -0
  549. package/dist/development/vue/product.mjs +167 -0
  550. package/dist/development/vue/product.mjs.map +1 -0
  551. package/dist/development/vue/shop-pay.d.mts +25 -0
  552. package/dist/development/vue/shop-pay.mjs +35 -0
  553. package/dist/development/vue/shop-pay.mjs.map +1 -0
  554. package/dist/development/vue/shopify-scripts.d.mts +127 -0
  555. package/dist/development/vue/shopify-scripts.mjs +79 -0
  556. package/dist/development/vue/shopify-scripts.mjs.map +1 -0
  557. package/dist/globals.d.mts +64 -0
  558. package/dist/graphql/generated/customer-account-api-types.d.mts +13 -0
  559. package/dist/graphql/generated/customer-account-graphql-env.d.mts +22170 -0
  560. package/dist/graphql/generated/graphql-env.d.mts +19280 -0
  561. package/dist/graphql/generated/storefront-api-types.d.mts +47 -0
  562. package/dist/graphql/graphql.d.mts +40 -0
  563. package/dist/graphql/graphql.mjs +16 -0
  564. package/dist/graphql/graphql.mjs.map +1 -0
  565. package/dist/graphql/index.d.mts +2 -0
  566. package/dist/graphql/scalars.d.mts +26 -0
  567. package/dist/graphql/type-resolver.d.mts +229 -0
  568. package/dist/react/cart.d.mts +40 -0
  569. package/dist/react/cart.mjs +150 -0
  570. package/dist/react/cart.mjs.map +1 -0
  571. package/dist/react/collection.d.mts +91 -0
  572. package/dist/react/collection.mjs +129 -0
  573. package/dist/react/collection.mjs.map +1 -0
  574. package/dist/react/index.d.mts +13 -0
  575. package/dist/react/index.mjs +10 -0
  576. package/dist/react/predictive-search.d.mts +49 -0
  577. package/dist/react/predictive-search.mjs +133 -0
  578. package/dist/react/predictive-search.mjs.map +1 -0
  579. package/dist/react/product.d.mts +72 -0
  580. package/dist/react/product.mjs +127 -0
  581. package/dist/react/product.mjs.map +1 -0
  582. package/dist/react/shop-pay.d.mts +9 -0
  583. package/dist/react/shop-pay.mjs +16 -0
  584. package/dist/react/shop-pay.mjs.map +1 -0
  585. package/dist/react/shopify-scripts.d.mts +20 -0
  586. package/dist/react/shopify-scripts.mjs +39 -0
  587. package/dist/react/shopify-scripts.mjs.map +1 -0
  588. package/dist/storefront-api-types.d.ts +2351 -2390
  589. package/dist/storefront.schema.json +41534 -1
  590. package/dist/ts-plugin/index.cjs +68 -0
  591. package/dist/ts-plugin/index.cjs.map +1 -0
  592. package/dist/ts-plugin/index.d.cts +4 -0
  593. package/dist/vendor/standard-actions.d.mts +134 -0
  594. package/dist/vendor/standard-events.d.mts +1107 -0
  595. package/dist/vite/index.d.mts +2 -0
  596. package/dist/vite/index.mjs +3 -0
  597. package/dist/vite/local-https.d.mts +35 -0
  598. package/dist/vite/local-https.mjs +202 -0
  599. package/dist/vite/local-https.mjs.map +1 -0
  600. package/dist/vue/cart.d.mts +42 -0
  601. package/dist/vue/cart.mjs +118 -0
  602. package/dist/vue/cart.mjs.map +1 -0
  603. package/dist/vue/collection.d.mts +46 -0
  604. package/dist/vue/collection.mjs +108 -0
  605. package/dist/vue/collection.mjs.map +1 -0
  606. package/dist/vue/index.d.mts +11 -0
  607. package/dist/vue/index.mjs +8 -0
  608. package/dist/vue/predictive-search.d.mts +124 -0
  609. package/dist/vue/predictive-search.mjs +171 -0
  610. package/dist/vue/predictive-search.mjs.map +1 -0
  611. package/dist/vue/product.d.mts +57 -0
  612. package/dist/vue/product.mjs +167 -0
  613. package/dist/vue/product.mjs.map +1 -0
  614. package/dist/vue/shop-pay.d.mts +25 -0
  615. package/dist/vue/shop-pay.mjs +35 -0
  616. package/dist/vue/shop-pay.mjs.map +1 -0
  617. package/dist/vue/shopify-scripts.d.mts +127 -0
  618. package/dist/vue/shopify-scripts.mjs +79 -0
  619. package/dist/vue/shopify-scripts.mjs.map +1 -0
  620. package/package.json +116 -86
  621. package/skills/hydrogen-analytics/SKILL.md +80 -0
  622. package/skills/hydrogen-analytics/references/react.md +160 -0
  623. package/skills/hydrogen-analytics/references/vue.md +80 -0
  624. package/skills/hydrogen-cart-drawer/SKILL.md +248 -0
  625. package/skills/hydrogen-cart-drawer/references/accessibility.md +109 -0
  626. package/skills/hydrogen-cart-drawer/references/css.md +67 -0
  627. package/skills/hydrogen-cart-ui/SKILL.md +218 -0
  628. package/skills/hydrogen-cart-ui/references/nextjs.md +89 -0
  629. package/skills/hydrogen-cart-ui/references/react.md +263 -0
  630. package/skills/hydrogen-cart-ui/references/vue.md +204 -0
  631. package/skills/hydrogen-collection-browser/SKILL.md +80 -0
  632. package/skills/hydrogen-collection-browser/references/nextjs.md +118 -0
  633. package/skills/hydrogen-collection-browser/references/nuxt.md +108 -0
  634. package/skills/hydrogen-collection-browser/references/react.md +237 -0
  635. package/skills/hydrogen-customer-account/SKILL.md +107 -0
  636. package/skills/hydrogen-image/SKILL.md +65 -0
  637. package/skills/hydrogen-local-https/SKILL.md +144 -0
  638. package/skills/hydrogen-markets/SKILL.md +221 -0
  639. package/skills/hydrogen-markets/references/nextjs.md +157 -0
  640. package/skills/hydrogen-money/SKILL.md +67 -0
  641. package/skills/hydrogen-oxygen/SKILL.md +245 -0
  642. package/skills/hydrogen-oxygen/references/react-router.md +230 -0
  643. package/skills/hydrogen-predictive-search/SKILL.md +130 -0
  644. package/skills/hydrogen-predictive-search/references/react.md +32 -0
  645. package/skills/hydrogen-predictive-search/references/vue.md +40 -0
  646. package/skills/hydrogen-request-handlers/SKILL.md +90 -0
  647. package/skills/hydrogen-request-handlers/references/frameworks.md +174 -0
  648. package/skills/hydrogen-request-handlers/references/nextjs.md +136 -0
  649. package/skills/hydrogen-request-handlers/references/nuxt.md +214 -0
  650. package/skills/hydrogen-routing/SKILL.md +154 -0
  651. package/skills/hydrogen-setup/SKILL.md +50 -0
  652. package/skills/hydrogen-setup/references/analytics.md +624 -0
  653. package/skills/hydrogen-setup/steps/1-inspect-app.md +62 -0
  654. package/skills/hydrogen-setup/steps/10-analytics.md +10 -0
  655. package/skills/hydrogen-setup/steps/11-verify.md +31 -0
  656. package/skills/hydrogen-setup/steps/2-scaffold.md +86 -0
  657. package/skills/hydrogen-setup/steps/3-build-home-page.md +37 -0
  658. package/skills/hydrogen-setup/steps/4-collection-and-search.md +13 -0
  659. package/skills/hydrogen-setup/steps/5-cart.md +10 -0
  660. package/skills/hydrogen-setup/steps/6-product-detail-page.md +390 -0
  661. package/skills/hydrogen-setup/steps/7-shopify-runtime-scripts.md +69 -0
  662. package/skills/hydrogen-setup/steps/8-cart-drawer-and-navbar.md +35 -0
  663. package/skills/hydrogen-setup/steps/9-account-page.md +54 -0
  664. package/skills/hydrogen-shop-pay/SKILL.md +79 -0
  665. package/skills/hydrogen-shop-pay/references/core.md +66 -0
  666. package/skills/hydrogen-shop-pay/references/react.md +50 -0
  667. package/skills/hydrogen-shop-pay/references/vue.md +39 -0
  668. package/skills/hydrogen-smoke-test/SKILL.md +203 -0
  669. package/skills/hydrogen-storefront-client/SKILL.md +322 -0
  670. package/skills/hydrogen-storefront-client/references/astro.md +125 -0
  671. package/skills/hydrogen-storefront-client/references/caching.md +25 -0
  672. package/skills/hydrogen-storefront-client/references/nextjs.md +121 -0
  673. package/skills/hydrogen-storefront-client/references/nuxt.md +121 -0
  674. package/skills/hydrogen-storefront-client/references/query-validation.md +95 -0
  675. package/skills/hydrogen-storefront-client/references/react-router.md +81 -0
  676. package/skills/hydrogen-storefront-client/references/solidstart.md +131 -0
  677. package/skills/hydrogen-storefront-client/references/sveltekit.md +169 -0
  678. package/skills/hydrogen-variant-form/SKILL.md +250 -0
  679. package/skills/hydrogen-variant-form/references/nextjs.md +203 -0
  680. package/skills/hydrogen-variant-form/references/nuxt.md +95 -0
  681. package/skills/hydrogen-variant-form/references/react.md +71 -0
  682. package/dist/dev/get-virtual-routes-H72465VB.js +0 -74
  683. package/dist/dev/hydrogen-routes.d.ts +0 -5
  684. package/dist/dev/hydrogen-routes.js +0 -25
  685. package/dist/development/get-virtual-routes-ACFZHU42.js +0 -71
  686. package/dist/development/get-virtual-routes-ACFZHU42.js.map +0 -1
  687. package/dist/development/index.cjs +0 -6948
  688. package/dist/development/index.cjs.map +0 -1
  689. package/dist/development/index.js +0 -6601
  690. package/dist/development/index.js.map +0 -1
  691. package/dist/development/log-seo-tags-IG37ONQ2.js +0 -74
  692. package/dist/development/log-seo-tags-IG37ONQ2.js.map +0 -1
  693. package/dist/development/react-router-preset.d.ts +0 -45
  694. package/dist/development/react-router-preset.js +0 -49
  695. package/dist/development/react-router-preset.js.map +0 -1
  696. package/dist/index.cjs +0 -1
  697. package/dist/oxygen/index.d.ts +0 -197
  698. package/dist/oxygen/index.js +0 -107
  699. package/dist/production/get-virtual-routes-ZZEGQQDV.js +0 -3
  700. package/dist/production/get-virtual-routes-ZZEGQQDV.js.map +0 -1
  701. package/dist/production/index.cjs +0 -1019
  702. package/dist/production/index.cjs.map +0 -1
  703. package/dist/production/index.d.cts +0 -3260
  704. package/dist/production/index.d.ts +0 -3260
  705. package/dist/production/index.js +0 -1019
  706. package/dist/production/index.js.map +0 -1
  707. package/dist/production/log-seo-tags-TY72EQWZ.js +0 -2
  708. package/dist/production/log-seo-tags-TY72EQWZ.js.map +0 -1
  709. package/dist/production/react-router-preset.d.ts +0 -45
  710. package/dist/production/react-router-preset.js +0 -11
  711. package/dist/react-router.d.ts +0 -75
  712. package/dist/vite/chunk-4O5OI3OO.js +0 -127
  713. package/dist/vite/chunk-FAQ7TVHC.js +0 -9
  714. package/dist/vite/chunk-QXBQVDMY.js +0 -68
  715. package/dist/vite/compat-date.d.ts +0 -3
  716. package/dist/vite/compat-date.js +0 -6
  717. package/dist/vite/get-virtual-routes.d.ts +0 -21
  718. package/dist/vite/get-virtual-routes.js +0 -74
  719. package/dist/vite/hydrogen-middleware.d.ts +0 -9
  720. package/dist/vite/hydrogen-middleware.js +0 -7
  721. package/dist/vite/plugin.d.ts +0 -22
  722. package/dist/vite/plugin.js +0 -171
  723. package/dist/vite/request-events.d.ts +0 -144
  724. package/dist/vite/request-events.js +0 -10
  725. package/dist/vite/types.d.ts +0 -5
  726. package/dist/vite/types.js +0 -0
  727. package/dist/vite/virtual-routes/assets/debug-network.css +0 -609
  728. package/dist/vite/virtual-routes/assets/favicon-dark.svg +0 -20
  729. package/dist/vite/virtual-routes/assets/favicon.svg +0 -28
  730. package/dist/vite/virtual-routes/assets/inter-variable-font.woff2 +0 -0
  731. package/dist/vite/virtual-routes/assets/jetbrainsmono-variable-font.woff2 +0 -0
  732. package/dist/vite/virtual-routes/assets/styles.css +0 -249
  733. package/dist/vite/virtual-routes/components/FlameChartWrapper.jsx +0 -123
  734. package/dist/vite/virtual-routes/components/HydrogenLogoBaseBW.jsx +0 -32
  735. package/dist/vite/virtual-routes/components/HydrogenLogoBaseColor.jsx +0 -47
  736. package/dist/vite/virtual-routes/components/IconBanner.jsx +0 -292
  737. package/dist/vite/virtual-routes/components/IconClose.jsx +0 -38
  738. package/dist/vite/virtual-routes/components/IconDiscard.jsx +0 -44
  739. package/dist/vite/virtual-routes/components/IconError.jsx +0 -61
  740. package/dist/vite/virtual-routes/components/IconGithub.jsx +0 -23
  741. package/dist/vite/virtual-routes/components/IconTwitter.jsx +0 -21
  742. package/dist/vite/virtual-routes/components/Layout.jsx +0 -7
  743. package/dist/vite/virtual-routes/components/RequestDetails.jsx +0 -171
  744. package/dist/vite/virtual-routes/components/RequestTable.jsx +0 -91
  745. package/dist/vite/virtual-routes/components/RequestWaterfall.jsx +0 -151
  746. package/dist/vite/virtual-routes/layout.jsx +0 -33
  747. package/dist/vite/virtual-routes/lib/useDebugNetworkServer.jsx +0 -178
  748. package/dist/vite/virtual-routes/routes/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.jsx +0 -37
  749. package/dist/vite/virtual-routes/routes/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.tsx +0 -79
  750. package/dist/vite/virtual-routes/routes/graphiql.jsx +0 -5
  751. package/dist/vite/virtual-routes/routes/index.jsx +0 -265
  752. package/dist/vite/virtual-routes/routes/subrequest-profiler.jsx +0 -243
  753. package/dist/vite/virtual-routes/virtual-root-with-layout.jsx +0 -63
  754. package/dist/vite/virtual-routes/virtual-root.jsx +0 -67
@@ -0,0 +1,62 @@
1
+ # 1. Inspect App
2
+
3
+ ## Basic Compatibility
4
+
5
+ Read `package.json` in the current directory.
6
+
7
+ If it does not exist, stop and tell the user this skill must run in a javascript application with a `package.json` at its root.
8
+
9
+ If it does not contain `@shopify/hydrogen@preview` (or a more specific hash) in its dependencies, ask the user to install it. Do not assume package managers or install for the user.
10
+
11
+ ### Continue when
12
+
13
+ - [ ] Current directrory has `package.json`
14
+ - [ ] Current project includes `@shopify/hydrogen@preview` or similar in its dependencies
15
+
16
+ ## Styling
17
+
18
+ Identify how the app handles styling. You must follow an already established design system or library if present. Do not introduce a new styling approach when one already exists.
19
+
20
+ Common fingerprints:
21
+
22
+ | Library | Look for |
23
+ | --- | --- |
24
+ | Tailwind CSS | `tailwind.config.*` at root; `@tailwindcss/vite` / `@tailwindcss/postcss` / `tailwindcss` in dependencies; `@import "tailwindcss"` or `@tailwind` directives in CSS; utility-heavy `className` / `class` usage |
25
+ | StyleX | `@stylexjs/stylex` in dependencies; `stylex.config.*` or StyleX Babel/SWC plugin config; `stylex.create(...)` / `stylex.props(...)` in components |
26
+ | CSS Modules | `*.module.css` / `*.module.scss` co-located with components; `import styles from '...module.css'` |
27
+ | Sass / SCSS | `sass` / `sass-embedded` in dependencies; `*.scss` / `*.sass` stylesheets |
28
+ | Panda CSS | `@pandacss/dev` / styled-system output; `panda.config.*` at root |
29
+ | UnoCSS | `unocss` in dependencies; `uno.config.*` / `unocss.config.*` at root |
30
+ | styled-components | `styled-components` in dependencies; `styled.*` / `createGlobalStyle` usage |
31
+ | Plain CSS | Global `*.css` imports with no module/utility/runtime styling library detected |
32
+
33
+ If multiple signals appear, prefer the one the app already uses for layout and components (config + component usage), not a transitive dependency alone. If none of the above match, treat the app as plain CSS / unstyled and keep new UI minimal semantic HTML.
34
+
35
+ ### Continue when
36
+
37
+ - [ ] Styling approach identified (or confirmed absent)
38
+
39
+
40
+ ## Framework specific references
41
+
42
+ Every skill prefixed with `hydrogen-` *may* ship a framework-specific instruction file under its own `references/`. After detecting the framework, check that skill's `references/` for the matching file and read it before making framework-specific choices. If no matching reference exists, continue from the generic instructions and follow the app's existing conventions.
43
+
44
+ Inspect dependencies, configuration files, server entry points, route directories, and existing request lifecycle code. Identify whether the app has a framework that can run server code and expose request handlers, middleware, loaders, server functions, or route handlers.
45
+
46
+ Common root-level fingerprints:
47
+
48
+ | Framework | Look for | Reference file to look for |
49
+ | --- | --- | --- |
50
+ | Astro | `astro.config.ts` / `astro.config.mjs` at root | `astro.md` |
51
+ | Next.js | `next.config.ts` / `next.config.js` / `next.config.mjs` at root | `nextjs.md` |
52
+ | React Router | `react-router.config.ts` at root | `react-router.md` |
53
+ | Nuxt | `nuxt.config.ts` / `nuxt.config.js` at root | `nuxt.md` |
54
+ | SvelteKit | `svelte.config.js` / `svelte.config.ts` at root | `sveltekit.md` |
55
+ | SolidStart | `app.config.ts` at root with `@solidjs/start` | `solidstart.md` |
56
+ | Marko | `marko.config.js` / `marko.config.ts` at root, or `@marko/run` | `marko.md` |
57
+
58
+ Do not hard block just because no reference file exists. Continue when the app has a real server request lifecycle where Hydrogen can run before routing and handle 404 redirects after routing. Stop only when the app is clearly browser-only, static-only, or has no way to run server code.
59
+
60
+ ### Continue when
61
+
62
+ - [ ] Able to determine that the application serves HTTP requests
@@ -0,0 +1,10 @@
1
+ # Analytics
2
+
3
+ Invoke the `hydrogen-analytics` skill to wire storefront analytics. This depends on the request handlers (scaffold step) and Shopify runtime scripts being in place. Read `../references/analytics.md` for the full consent and setup details when needed.
4
+
5
+ ## Continue when
6
+
7
+ - [ ] Page view analytics events publish on route navigation, including client-side navigations
8
+ - [ ] Product, collection, search, and cart view events publish on their routes
9
+ - [ ] Cart update tracking publishes deltas when line items change
10
+ - [ ] Analytics events respect consent: no destination receives events before consent is granted where consent is required
@@ -0,0 +1,31 @@
1
+ # Final Verification
2
+
3
+ Run this step only after every previous step's criteria pass. If any command fails, fix the app and rerun the failed command before moving on.
4
+
5
+ This step is mandatory and executable: every command below must actually run in this session, and its output must show it passed. Do not mark a check passed from memory, from an earlier run before subsequent code changes, or from reading the code. Do not report the setup as complete while any command is failing or unrun — a summary written before verification is a failed setup.
6
+
7
+ ## Run The App's Own Checks
8
+
9
+ Inspect `package.json` scripts and run the applicable commands in this order:
10
+
11
+ 1. Formatting fixer when present: `format`.
12
+ 2. Static checks when present: `lint`, `typecheck`, or `check`. These must include `hydrogen gql check` — the `hydrogen-storefront-client` and `hydrogen-customer-account` skills chain it into `typecheck`; verify the chain is still in place before trusting a green run.
13
+ 3. Build when present: `build`.
14
+ 4. Tests when present: `test`.
15
+ 5. Formatting check when present and distinct from `format`: `format:check`.
16
+
17
+ If Playwright is present, run it headless.
18
+
19
+ ### Continue when
20
+
21
+ - [ ] Every applicable script was executed in this session, after the last code change, and passed
22
+ - [ ] `hydrogen gql check` ran as part of static checks (not skipped)
23
+
24
+ ## Run Runtime Smoke Tests
25
+
26
+ Invoke the `hydrogen-smoke-test` skill for runtime verification of request handlers, navigation links, cart, product, collection/search, account, analytics, markets, money, and production-mode behavior. Run the request-handler curl checks against both dev and production builds when the framework supports both.
27
+
28
+ ### Continue when
29
+
30
+ - [ ] Smoke checks pass against the dev server
31
+ - [ ] Smoke checks pass against the production build when the framework supports running one locally
@@ -0,0 +1,86 @@
1
+ # Scaffold
2
+
3
+ ## Use Storefront Route Conventions
4
+
5
+ Preserve the app's existing route shape when present. When there is no established convention, use the standard paths:
6
+
7
+ - `/collections` for collection listing.
8
+ - `/collections/{handle}` for collection detail.
9
+ - `/search` for search results.
10
+ - `/products/{handle}` for product detail. Use plural `products`, not `/product`.
11
+ - `/cart` for the full cart page.
12
+
13
+ Hydrogen-owned handlers are not page routes: `/api/cart`, `/api/{api-version}/graphql.json`, `/checkout`, cart permalinks like `/cart/{variantId}:{quantity}`, AJAX cart URLs like `/cart.js` and `/cart/add.js`, `/api/mcp`, `/agent/*`, `/graphiql` in development, `/admin` redirects, and Storefront URL redirects belong in the `hydrogen-request-handlers` wiring.
14
+
15
+ Invoke the `hydrogen-routing` skill and create the shared route template manifest for Shopify resources such as products, collections, pages, blogs, or articles.
16
+
17
+ ### Continue when
18
+
19
+ - [ ] Route templates are set up
20
+
21
+ ## Use Standard Environment Names
22
+
23
+ Use these canonical environment variable names throughout the app (kept in sync with `hydrogen-storefront-client`):
24
+
25
+ - `PUBLIC_STORE_DOMAIN` for the Shopify store domain.
26
+ - `PUBLIC_STOREFRONT_API_TOKEN` for the public Storefront API token.
27
+ - `PRIVATE_STOREFRONT_API_TOKEN` for the private Storefront API token.
28
+ - `PUBLIC_STOREFRONT_ID` for analytics `storefrontId`; use `"0"` when the app does not have a storefront ID.
29
+ - `PUBLIC_CHECKOUT_DOMAIN` for app-level checkout-domain configuration such as CSP setup. Checkout links should come from cart data, usually `cart.checkoutUrl`.
30
+ - `SHOP_ID` for the numeric Shopify shop ID string. Required by Shopify runtime scripts (`ShopifyScripts`) for every storefront, and by Customer Account API.
31
+ - `PUBLIC_CUSTOMER_ACCOUNT_API_CLIENT_ID` for Customer Account OAuth.
32
+ - `CUSTOMER_ACCOUNT_SESSION_SECRET` for encrypted cookie examples. Prefer opaque server-side sessions in production apps.
33
+
34
+ If the framework requires a prefix to expose client-side variables, preserve the canonical suffix and add only the required framework prefix. Never expose `PRIVATE_STOREFRONT_API_TOKEN` to the client.
35
+
36
+ List `PUBLIC_STOREFRONT_API_TOKEN` in the app's env example file as a commented-out entry (`# PUBLIC_STOREFRONT_API_TOKEN=`). The Storefront client accepts `undefined` as tokenless access, which is all mock.shop supports, so the scaffold works before the user has tokens and upgrades in place when they add one. Do not write an uncommented empty assignment (`PUBLIC_STOREFRONT_API_TOKEN=`): env loaders parse that as an empty string, and the client rejects empty tokens. Recommend filling it in (or switching to a private client) once the app targets a real store.
37
+
38
+ ### Continue when
39
+
40
+ - [ ] Env vars follow the canonical names (plus any required framework prefix)
41
+ - [ ] `PUBLIC_STOREFRONT_API_TOKEN` is listed commented-out in the env example until the user provides a token
42
+ - [ ] `PRIVATE_STOREFRONT_API_TOKEN` is not exposed to the client
43
+
44
+ ## Keep Environment Access Server-Side
45
+
46
+ Never read `process.env`, `import.meta.env`, or framework environment modules from client components, browser singletons, or modules imported by client components. Environment access belongs in server-only modules, route loaders, route handlers, middleware, server functions, or the framework's server environment API.
47
+
48
+ Prefer resolving and formatting values on the server and passing them to client UI as serialized data. Any object or property derived from env or server config — such as the `shop` object passed to `ShopifyScripts` — should be assembled in the framework's server boundary (RSC, route loaders, server functions, worker request handlers) and flow down as props or loader data, never assembled in client code.
49
+
50
+ Client code should use same-origin Hydrogen endpoints/handlers for Shopify work. Private tokens and server-only config must never cross the server boundary.
51
+
52
+ ### Continue when
53
+
54
+ - [ ] No client component or browser-imported module reads `process.env`, `import.meta.env`, or framework env modules
55
+ - [ ] Values derived from env are resolved in server boundaries and reach client UI only as serialized props or loader data
56
+
57
+ ## Set Up The Storefront API Client
58
+
59
+ Invoke the `hydrogen-storefront-client` skill to wire the Storefront API client or client factory for the detected framework.
60
+
61
+ ### Continue when
62
+
63
+ - [ ] Storefront client is initialised with a shopify request context
64
+ - [ ] A test graphql query can be ran on the home page and returns the correct type
65
+ - [ ] `hydrogen gql check` is chained into the `typecheck` script (per the `hydrogen-storefront-client` skill) and passes
66
+
67
+
68
+ ## Install API Route Handlers
69
+
70
+ Invoke the `hydrogen-request-handlers` skill to wire `handleShopifyRoutes` before routing, `handleShopifyRedirects` after a 404 or in the framework's catch-all route, and request-context response-header propagation for custom and framework responses.
71
+
72
+ ### Continue when
73
+
74
+ - [ ] `/api/graphiql` returns 200 in development mode
75
+ - [ ] `/admin` redirects to the Shopify Admin in development mode
76
+
77
+ ## Set Up The Customer Account API
78
+
79
+ Invoke the `hydrogen-customer-account` skill to create the `customerSession` module and register the account route handlers through the `handleShopifyRoutes` setup from the previous section.
80
+
81
+ ### Continue when
82
+
83
+ - [ ] `customerSession` is created at module scope
84
+ - [ ] customer account handlers (result of calling `createCustomerAccountServerHandlers`) is registered through `handleShopifyRoutes`
85
+ - [ ] `/account/login` does not 404
86
+ - [ ] `hydrogen gql check` passes when any page renders Customer Account API data
@@ -0,0 +1,37 @@
1
+ # Build home page
2
+
3
+ Create a simple server-rendered home page that proves Hydrogen is wired correctly.
4
+
5
+ ## Data Requirements
6
+
7
+ Use the shared Storefront API client to fetch both collections and products in the page's server data-loading boundary.
8
+
9
+ The home query should include:
10
+
11
+ - Collection `id`, `title`, `handle`, and optional `image { url altText }`.
12
+ - Product `id`, `title`, `handle`, optional `featuredImage { url altText }`, and `priceRange { minVariantPrice { amount currencyCode } }`.
13
+
14
+ Do not fetch cart data for the home page. Cart belongs to the cart route and navbar link state, not to the home page sample.
15
+
16
+ ## Rendering Requirements
17
+
18
+ - Render collections and products as separate sections.
19
+ - Link collection cards using the app's routing template (`hydrogen-routing` skill).
20
+ - Link product cards using the app's existing product route templates (`hydrogen-routing` skill).
21
+ - Format money with the local `hydrogen-money` skill; never do client-side currency arithmetic.
22
+ - Use empty states when collections or products are missing.
23
+ - Keep styles local to the app's existing styling approach. If there is no styling system, use minimal semantic HTML.
24
+
25
+ ## Framework Notes
26
+
27
+ - Next.js App Router: fetch in `app/page.tsx` or a server helper it imports.
28
+ - React Router framework mode: fetch in the index route `loader` and render from loader data.
29
+ - SvelteKit: fetch in `+page.server.ts` and render in `+page.svelte`.
30
+ - Astro: fetch in `src/pages/index.astro` frontmatter.
31
+ - SolidStart: fetch through a server query or route data API used by `src/routes/index.tsx`.
32
+
33
+ ## Continue when
34
+
35
+ - [ ] The home page renders products and collections
36
+ - [ ] Product and collection links point to the app's actual route shape
37
+ - [ ] Prices display with digits and units (e.g.: $20.95)
@@ -0,0 +1,13 @@
1
+ # Build Collection And Search Browsing
2
+
3
+ Invoke the `hydrogen-collection-browser` skill when adding collection routes, search routes, filter sidebars, sort controls, active filter chips, or URL-synced product grids.
4
+
5
+ ## Continue when
6
+
7
+ - [ ] Filtering and sorting update the URL without scroll reset when hydrated.
8
+ - [ ] Reloading the filtered URL server-renders the same filtered state.
9
+ - [ ] With JavaScript disabled, checking filters and submitting the form loads the filtered URL.
10
+ - [ ] With JavaScript disabled, the load-more / pagination link loads the next page server-side.
11
+ - [ ] Active filter chips remove only one filter and preserve unrelated params.
12
+ - [ ] Searching with a search term does not erase the search term (preserves `q` search param).
13
+ - [ ] Back/forward navigation settles loading state.
@@ -0,0 +1,10 @@
1
+ # Cart
2
+
3
+ ## Add The Cart Route
4
+
5
+ Use the local `hydrogen-cart-ui` skill to create the cart route at the framework's idiomatic `/cart` path.
6
+
7
+ ### Continue when
8
+
9
+ - [ ] The `/cart` route (or its custom route template) loads the cart and shows the empty state UI
10
+ - [ ] With javascript disabled, the `/cart` route still shows the empty state UI (progressive enhancement)
@@ -0,0 +1,390 @@
1
+ # Product Detail Page
2
+
3
+ Create a server-rendered product detail route with a variant picker and image.
4
+
5
+ ## Route And Data
6
+
7
+ - Use the app's existing product route convention when present; otherwise create `/products/{handle}`.
8
+ - Fetch the product by handle in the framework's server data-loading boundary.
9
+ - Derive URL-selected options with `getSelectedProductOptions` and pass them as `$selectedOptions` to the product query.
10
+ - Start from the sample query below. Extend it for UI needs (extra media, SEO fields, related products). Keep one reusable `VariantFields` fragment shared by `firstSelectableVariant`, `selectedOrFirstAvailableVariant`, and `adjacentVariants` so `selectedVariant` always has the fields the UI needs after option selection.
11
+ - After writing or changing the product query, run the `hydrogen-storefront-client` skill's headless query validation check. Do not rely on TypeScript alone to catch invalid Storefront API fields.
12
+ - Check GraphQL `errors` before checking `data.product`. If the query returns errors, log them in the server console and return a 500 response. Return a 404 only when the query has no GraphQL errors and `data.product` is missing.
13
+
14
+ ### `getSelectedProductOptions`
15
+
16
+ Treat each search param as an option name/value pair (`?Color=Red&Size=M` → `[{name:"Color",value:"Red"},{name:"Size",value:"M"}]`). Pass the result into the Storefront API query.
17
+
18
+ ```ts
19
+ import { getSelectedProductOptions } from "@shopify/hydrogen";
20
+
21
+ const selectedOptions = getSelectedProductOptions({
22
+ searchParams: new URL(request.url).searchParams,
23
+ });
24
+
25
+ // Optional: ignore non-option params (utm, ref, etc.) once option names are known
26
+ const selectedOptions = getSelectedProductOptions({
27
+ searchParams,
28
+ allowedOptionNames: product.options.map((option) => option.name),
29
+ });
30
+ ```
31
+
32
+ Passing `allowedOptionNames: []` filters out every option.
33
+
34
+ ### Minimum product query
35
+
36
+ Extend and adjust fields as the UI needs them.
37
+
38
+ ```ts
39
+ import { gql, type StorefrontApi } from "@shopify/hydrogen";
40
+
41
+ export const VARIANT_FIELDS_FRAGMENT = gql(`
42
+ fragment VariantFields on ProductVariant {
43
+ id
44
+ title
45
+ availableForSale
46
+ selectedOptions {
47
+ name
48
+ value
49
+ }
50
+ price {
51
+ amount
52
+ currencyCode
53
+ }
54
+ compareAtPrice {
55
+ amount
56
+ currencyCode
57
+ }
58
+ image {
59
+ url
60
+ altText
61
+ width
62
+ height
63
+ }
64
+ product {
65
+ title
66
+ handle
67
+ }
68
+ sku
69
+ }
70
+ `);
71
+
72
+ export const PRODUCT_QUERY = gql(
73
+ `
74
+ query Product(
75
+ $handle: String!
76
+ $selectedOptions: [SelectedOptionInput!]!
77
+ $country: CountryCode
78
+ $language: LanguageCode
79
+ ) @inContext(country: $country, language: $language) {
80
+ product(handle: $handle) {
81
+ id
82
+ handle
83
+ title
84
+ vendor
85
+ description
86
+ descriptionHtml
87
+ requiresSellingPlan
88
+ options {
89
+ name
90
+ optionValues {
91
+ name
92
+ firstSelectableVariant {
93
+ ...VariantFields
94
+ }
95
+ swatch {
96
+ color
97
+ image {
98
+ ... on MediaImage {
99
+ image {
100
+ url
101
+ altText
102
+ }
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ encodedVariantExistence
109
+ encodedVariantAvailability
110
+ selectedOrFirstAvailableVariant(
111
+ selectedOptions: $selectedOptions
112
+ ignoreUnknownOptions: true
113
+ caseInsensitiveMatch: true
114
+ ) {
115
+ ...VariantFields
116
+ }
117
+ adjacentVariants(
118
+ selectedOptions: $selectedOptions
119
+ ignoreUnknownOptions: true
120
+ caseInsensitiveMatch: true
121
+ ) {
122
+ ...VariantFields
123
+ }
124
+ media(first: 8) {
125
+ nodes {
126
+ __typename
127
+ id
128
+ mediaContentType
129
+ alt
130
+ ... on MediaImage {
131
+ image {
132
+ url
133
+ altText
134
+ width
135
+ height
136
+ }
137
+ }
138
+ previewImage {
139
+ url
140
+ altText
141
+ width
142
+ height
143
+ }
144
+ }
145
+ }
146
+ priceRange {
147
+ minVariantPrice {
148
+ amount
149
+ currencyCode
150
+ }
151
+ maxVariantPrice {
152
+ amount
153
+ currencyCode
154
+ }
155
+ }
156
+ }
157
+ }
158
+ `,
159
+ [VARIANT_FIELDS_FRAGMENT],
160
+ );
161
+
162
+ export type ProductData = NonNullable<StorefrontApi.ResultOf<typeof PRODUCT_QUERY>["product"]>;
163
+ ```
164
+
165
+ ### Example data fetching
166
+
167
+ ```ts
168
+ const selectedOptions = getSelectedProductOptions({
169
+ searchParams: new URL(request.url).searchParams,
170
+ });
171
+
172
+ const { data, errors } = await storefrontClient.graphql(PRODUCT_QUERY, {
173
+ variables: { handle, selectedOptions },
174
+ });
175
+
176
+ if (errors) {
177
+ console.error("[hydrogen] Product query failed", errors);
178
+ throw new Response("Product query failed", { status: 500 });
179
+ }
180
+
181
+ if (!data?.product) {
182
+ throw new Response("Product not found", { status: 404 });
183
+ }
184
+ ```
185
+
186
+ ## UI
187
+
188
+ - You must invoke the `hydrogen-variant-form` skill for option controls, add-to-cart form structure, URL selection, combined listings, price display, disabled states, sold-out states, cart error display, and user acceptance tests. Do not duplicate its rules or invent separate variant matrix logic.
189
+ - When the cart drawer is configured with the canonical anchor trigger, follow the `hydrogen-cart-drawer` skill's guidance and open optimistic state via `formProps({ beforeSubmit: openCartDrawer })`; the samples below use `beforeSubmit`.
190
+ - Product route loaders and server helpers may read env indirectly through server-only client/config modules. Product client components must not read `process.env`, `import.meta.env`, or framework env modules.
191
+
192
+ ### React
193
+
194
+ Create typed bindings once from `@shopify/hydrogen/react`:
195
+
196
+ ```ts
197
+ // lib/product.ts
198
+ import { createProductComponents } from "@shopify/hydrogen/react";
199
+ import type { ProductData } from "./product-query";
200
+
201
+ export const { ProductProvider, useProduct, useProductForm } =
202
+ createProductComponents<ProductData>();
203
+ ```
204
+
205
+ Wrap the purchase UI in `ProductProvider`. Put same-product URL navigation in `onSelect`, not inside each option control:
206
+
207
+ ```tsx
208
+ import { ProductProvider, useProductForm } from "~/lib/product";
209
+
210
+ export function ProductDetails({ product }: { product: ProductData }) {
211
+ const navigate = useNavigate(); // or Next.js router.replace
212
+
213
+ return (
214
+ <ProductProvider
215
+ product={product}
216
+ onSelect={(result) => {
217
+ const targetHandle =
218
+ result.selectedVariant?.product?.handle ?? product.handle;
219
+ void navigate(variantUrl(targetHandle, result.selectedOptions), {
220
+ replace: true,
221
+ preventScrollReset: true,
222
+ });
223
+ }}
224
+ >
225
+ <ProductPurchasePanel product={product} />
226
+ </ProductProvider>
227
+ );
228
+ }
229
+ ```
230
+
231
+ `useProduct` is for read-only selection state (price, gallery, analytics). `useProductForm` adds form bindings (`register`, `formProps`, `pending`):
232
+
233
+ ```tsx
234
+ function ProductPrice({ product }: { product: ProductData }) {
235
+ const { selectedVariant } = useProduct();
236
+ const price = selectedVariant?.price ?? product.priceRange.minVariantPrice;
237
+ return <p>{formatPrice(price)}</p>;
238
+ }
239
+
240
+ function ProductPurchasePanel({ product }: { product: ProductData }) {
241
+ const { options, selectedVariant, formProps, register, errors } =
242
+ useProductForm();
243
+ const addable = canAddToCart(product, options);
244
+
245
+ return (
246
+ <>
247
+ {/* Option controls: see hydrogen-variant-form + its React reference */}
248
+ <form {...formProps({ beforeSubmit: openCartDrawer })}>
249
+ <input type="hidden" {...register("merchandiseId", {})} />
250
+ <input {...register("quantity", { defaultValue: 1 })} />
251
+ <button {...register("addToCart", {})} disabled={!addable}>
252
+ {addable
253
+ ? "Add to cart"
254
+ : selectedVariant
255
+ ? "Sold out"
256
+ : "Select options"}
257
+ </button>
258
+ </form>
259
+ {errors.userErrors.length > 0 ? (
260
+ <ul role="alert">
261
+ {errors.userErrors.map((error, index) => (
262
+ <li key={index}>{error.message}</li>
263
+ ))}
264
+ </ul>
265
+ ) : null}
266
+ </>
267
+ );
268
+ }
269
+ ```
270
+
271
+ Framework notes:
272
+
273
+ - Next.js App Router: fetch in the server page; put `ProductProvider` and the form in a `"use client"` component. Use `router.replace(url, { scroll: false })` in `onSelect`.
274
+ - React Router: put URL sync in provider `onSelect`. Same-product option values are GET `<Link>`s that spread `register("optionValue", ...)` (no-JS fallback). Cross-product values use `<Link preventScrollReset>`. See the `hydrogen-variant-form` React reference.
275
+
276
+ ### Vue
277
+
278
+ Create typed bindings once from `@shopify/hydrogen/vue`:
279
+
280
+ ```ts
281
+ // storefront/product.ts
282
+ import { createProductComponents } from "@shopify/hydrogen/vue";
283
+ import type { ProductData } from "./product-types";
284
+
285
+ export const { ProductProvider, useProduct, useProductForm } =
286
+ createProductComponents<ProductData>();
287
+ ```
288
+
289
+ Wrap the page (or purchase panel) in `ProductProvider`. Sync the URL from `onSelect`:
290
+
291
+ ```vue
292
+ <script setup lang="ts">
293
+ import { ProductProvider, type ProductData } from "~/storefront/product";
294
+
295
+ const props = defineProps<{ product: ProductData }>();
296
+ const router = useRouter();
297
+ const route = useRoute();
298
+
299
+ function handleSelect(result: {
300
+ selectedOptions: { name: string; value: string }[];
301
+ selectedVariant: { product?: { handle: string } | null } | null;
302
+ }) {
303
+ const targetHandle =
304
+ result.selectedVariant?.product?.handle ?? props.product.handle;
305
+ const query = { ...route.query };
306
+ for (const option of props.product.options) delete query[option.name];
307
+ for (const option of result.selectedOptions) {
308
+ query[option.name] = option.value;
309
+ }
310
+ router.replace({ path: `/products/${targetHandle}`, query });
311
+ }
312
+ </script>
313
+
314
+ <template>
315
+ <ProductProvider :product="product" :on-select="handleSelect">
316
+ <ProductPurchasePanel :product="product" />
317
+ </ProductProvider>
318
+ </template>
319
+ ```
320
+
321
+ `useProduct` for read-only state; `useProductForm` for form bindings. Do not destructure the Vue composable return values — keep the object so getters stay reactive:
322
+
323
+ ```vue
324
+ <script setup lang="ts">
325
+ import { canAddToCart } from "@shopify/hydrogen";
326
+ import {
327
+ useProduct,
328
+ useProductForm,
329
+ type ProductData,
330
+ } from "~/storefront/product";
331
+ import { openCartDrawer } from "~/storefront/cart-drawer";
332
+
333
+ const props = defineProps<{ product: ProductData }>();
334
+
335
+ const productState = useProduct();
336
+ const form = useProductForm();
337
+ const addable = computed(() => canAddToCart(props.product, form.options));
338
+ </script>
339
+
340
+ <template>
341
+ <p>
342
+ {{
343
+ formatMoney(
344
+ productState.selectedVariant?.price ??
345
+ product.priceRange.minVariantPrice,
346
+ )
347
+ }}
348
+ </p>
349
+
350
+ <!-- Option controls: see hydrogen-variant-form + its Nuxt/Vue reference -->
351
+
352
+ <form v-bind="form.formProps({ beforeSubmit: openCartDrawer })">
353
+ <input type="hidden" v-bind="form.register('merchandiseId', {})" />
354
+ <input v-bind="form.register('quantity', { defaultValue: 1 })" />
355
+ <button
356
+ v-bind="form.register('addToCart', {})"
357
+ :disabled="!addable || form.pending.value"
358
+ >
359
+ {{
360
+ addable
361
+ ? "Add to cart"
362
+ : form.selectedVariant
363
+ ? "Sold out"
364
+ : "Select options"
365
+ }}
366
+ </button>
367
+ </form>
368
+ </template>
369
+ ```
370
+
371
+ Same-product option values should be `NuxtLink` (or the app's link component) GET links that `v-bind` `form.register('optionValue', ...)`. Cross-product combined-listing values navigate to the other product. See the `hydrogen-variant-form` Nuxt reference.
372
+
373
+ ### Other Framework Gotchas
374
+
375
+ - SvelteKit: if using the core store directly, create it once, hydrate on product identity changes, and destroy it on unmount.
376
+ - Astro: only build this route when the app has server output or a server adapter. Put the interactive product form in a hydrated island or client script that owns the store lifecycle.
377
+ - SolidStart: manage the core store lifecycle inside the client component unless a local binding already exists.
378
+
379
+ ## Continue when
380
+
381
+ - [ ] Directly loading `/products/{handle}` renders product data and a selected or first available variant when one exists
382
+ - [ ] Option values render as interactive elements (links/buttons)
383
+ - [ ] Clicking an option value in the browser changes the selected variant and the URL
384
+ - [ ] Adding a product to cart opens the cart drawer and shows the product in the cart
385
+ - [ ] An invalid or failing product query (e.g.: invalid field) logs the GraphQL error server-side and returns 500, not 404
386
+ - [ ] A valid query for a missing product returns 404
387
+ - [ ] Selecting a variant and refreshing the page persists the same variant selected
388
+ - [ ] With javascript disabled, clicking on a variant option navigates to the selected variant
389
+ - [ ] Cross-product option values use the framework's client-side link component when the app has one.
390
+ - [ ] The product variants form passes the `hydrogen-variant-form` skill's user acceptance tests.