@shopify/hydrogen 2026.4.5 → 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 -6978
  688. package/dist/development/index.cjs.map +0 -1
  689. package/dist/development/index.js +0 -6631
  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
package/README.md CHANGED
@@ -1,22 +1,82 @@
1
- <div align="center">
2
-
3
1
  # Hydrogen
4
2
 
5
- [![MIT License](https://img.shields.io/github/license/shopify/hydrogen)](LICENSE.md)
6
- [![npm downloads](https://img.shields.io/npm/dm/@shopify/hydrogen.svg?sanitize=true)](https://npmcharts.com/compare/@shopify/hydrogen?minimal=true)
3
+ Framework agnostic Shopify storefront SDK and packaged agent skills.
7
4
 
8
- Hydrogen is Shopify’s stack for headless commerce. It provides a set of tools, utilities, and best-in-class examples for building dynamic and performant commerce applications. Hydrogen is designed to dovetail with [Remix](https://remix.run/), Shopify’s full stack web framework, but it also provides a React library portable to other supporting frameworks.
5
+ ## Setup
9
6
 
10
- **Create a Hydrogen app**
7
+ Run the setup CLI in a storefront project.
11
8
 
12
9
  ```bash
13
- npm create @shopify/hydrogen@latest
10
+ npx @shopify/hydrogen setup
11
+ ```
12
+
13
+ The setup command installs `@shopify/hydrogen` into the local project using the detected package manager, then copies the packaged skills into local agent skill directories.
14
+
15
+ ## GraphQL Tooling
16
+
17
+ Enable Storefront and Customer Account API editor diagnostics with Hydrogen's packed TypeScript plugin:
18
+
19
+ ```json
20
+ {
21
+ "compilerOptions": {
22
+ "plugins": [{"name": "@shopify/hydrogen/ts-plugin"}]
23
+ }
24
+ }
25
+ ```
26
+
27
+ Run the same GraphQL validation headlessly with `npx @shopify/hydrogen gql check --fail-on-warn`, or use `hydrogen gql check --fail-on-warn` in a package script. Both commands use the Shopify schemas packaged with Hydrogen.
28
+
29
+ The editor plugin generates `storefront-graphql-env.d.ts` and `customer-account-graphql-env.d.ts` at the project root. Add both files to `.gitignore`.
30
+
31
+ ## Customer Account API
32
+
33
+ Use `@shopify/hydrogen/customer-account` for type-safe Customer Account API requests from server code:
34
+
35
+ ```ts
36
+ import { createShopifyRequestContext } from "@shopify/hydrogen";
37
+ import * as CAAPI from "@shopify/hydrogen/customer-account";
38
+
39
+ const CUSTOMER_QUERY = CAAPI.gql(`query { customer { firstName emailAddress { emailAddress } } }`);
40
+ const requestContext = createShopifyRequestContext({
41
+ request,
42
+ i18n: { country: "US", language: "EN" },
43
+ });
44
+
45
+ const customerAccount = CAAPI.createCustomerAccountClient({
46
+ shopId: env.SHOP_ID,
47
+ requestContext,
48
+ });
49
+
50
+ const accessToken = await getAccessTokenFromYourServerSession(request);
51
+ const customerResult = await customerAccount.graphql(CUSTOMER_QUERY, {
52
+ accessToken,
53
+ });
54
+ ```
55
+
56
+ Use a numeric Shopify shop ID string from `SHOP_ID`, not a Shop GID or domain. The GraphQL client intentionally receives only the access token that your server-side auth flow has already obtained.
57
+
58
+ Hydrogen also ships framework-neutral Customer Account OAuth/session helpers. Construct `createCustomerSession()` at module scope with `SHOP_ID` and `PUBLIC_CUSTOMER_ACCOUNT_API_CLIENT_ID`, then pass request-scoped session managers into its methods:
59
+
60
+ ```ts
61
+ const customerSession = CAAPI.createCustomerSession({
62
+ shopId: env.SHOP_ID,
63
+ customerAccountApiClientId: env.PUBLIC_CUSTOMER_ACCOUNT_API_CLIENT_ID,
64
+ });
65
+
66
+ const isLoggedIn = await customerSession.isLoggedIn(
67
+ sessionManager,
68
+ requestContext,
69
+ );
14
70
  ```
15
71
 
16
- </div>
72
+ Customer Account OAuth methods require a public HTTPS origin. The writable session manager should expose the request origin; explicit `origin` options are only needed as overrides. For local development, use a tunnel or trusted local HTTPS through `localHttps` from `@shopify/hydrogen/vite`, and pass the framework's canonical request URL rather than an untrusted forwarded host.
73
+
74
+ Pass `customerSession` to `createCartServerHandlers({customerSession})` to associate newly created carts with the current customer when the session has a usable access token or successfully refreshed access token, and mark checkout URLs in authenticated cart GET responses with `logged_in=true`.
75
+
76
+ Use `createCustomerAccountServerHandlers({customerSession})` with `handleShopifyRoutes` to install the default `GET /account/login`, `GET /account/authorize`, `GET /account/refresh`, and `POST /account/logout` handlers. Pass those cart server handlers as `cartServerHandlers` to also keep the browser cart's buyer identity in step with the customer session: authorization and refresh attach the customer to the cart, a definitive refresh rejection and logout detach it. Sync is best-effort — a failed cart mutation never blocks the route's redirect; a failed detach during logout or definitive refresh rejection expires the cart cookie instead. `cartServerHandlers` requires the `customerSession` returned by `createCustomerSession` shared by both handler groups. Pass the same request-scoped `requestContext` and `sessionManager` into `handleShopifyRoutes` once alongside the `storefrontClient`. Session managers can be read-only for `isLoggedIn()` / `getAccessToken()` and writable for cart POST handlers configured with `customerSession`, `getOrRefreshAccessToken()`, `prepareLoginUrl()`, `handleOAuthCallback()`, `logout()`, and registered account handlers. `isLoggedIn()` is a read-only UI/session-presence check: it returns true for a usable access token or a refresh token that can attempt to restore one later. `getAccessToken()` still returns only a currently usable access token and never refreshes.
77
+
78
+ The login handler respects a sanitized `return_to` search parameter and otherwise redirects back to `defaultPostLoginRedirectPathname` (default `/`). The logout handler redirects through Shopify using `postLogoutRedirectUri` (default `/`) when an ID token is present; otherwise, it redirects directly to `postLogoutRedirectUri`. Apps can still implement their own framework routes when they need custom behavior.
79
+
80
+ When a writable method can update cookie-backed session state, commit once while finalizing the response and append headers from `await sessionManager.commit?.()` there. After committing session headers, call `requestContext.applyResponseHeaders(response.headers)`. Customer Account session reads and GraphQL calls mark the request context private so the finalizer can prevent public/CDN caching of personalized responses.
17
81
 
18
- - Interested in contributing to Hydrogen? [Read our contributing guide](../../CONTRIBUTING.md)
19
- - Want to learn more? [Check out the Hydrogen docs on Shopify.dev](https://shopify.dev/custom-storefronts/hydrogen)
20
- - Questions? Feedback? Feature requests? [Discussions](https://github.com/Shopify/hydrogen/discussions)
21
- - Upgrading from a previous version? [View the Changelog](./packages/hydrogen/CHANGELOG.md)
22
- - Looking for Hydrogen v1? [The source code has been moved](https://github.com/Shopify/hydrogen-v1)
82
+ Use the GraphQL client from server or edge routes only. Keep Customer Account tokens in protected server session storage or encrypted HttpOnly cookies, not browser-readable storage. Pass the same Shopify request context used by the Storefront client so the Customer Account client can derive the `Origin` header, default language, and final response cache policy from request-scoped data. Keep GraphQL documents static and pass user input through variables. Do not retry Customer Account mutations after a timeout unless the operation is externally idempotent.
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Keep this wrapper checked in: pnpm links the `hydrogen` command before `dist`
4
+ // exists in a clean workspace. `.mjs` keeps its ESM format independent of package settings.
5
+ import { runCli } from "../dist/cli/index.mjs";
6
+
7
+ runCli();
@@ -0,0 +1,330 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from "node:module";
3
+ import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, rmSync, statSync, writeFileSync } from "node:fs";
4
+ import { fileURLToPath } from "node:url";
5
+ import { spawn } from "node:child_process";
6
+ import { randomUUID } from "node:crypto";
7
+ import { dirname, join, parse, resolve } from "node:path";
8
+ import { parseArgs } from "node:util";
9
+
10
+ //#region src/graphql/plugin-config.ts
11
+ const STOREFRONT_SCHEMA_FILE_NAME = "storefront.schema.json";
12
+ const CUSTOMER_ACCOUNT_SCHEMA_FILE_NAME = "customer-account.schema.json";
13
+ const STOREFRONT_OUTPUT_FILE_NAME = "storefront-graphql-env.d.ts";
14
+ const CUSTOMER_ACCOUNT_OUTPUT_FILE_NAME = "customer-account-graphql-env.d.ts";
15
+ function createGraphQLPluginConfig(schemaDirectory) {
16
+ return {
17
+ name: "gql.tada/ts-plugin",
18
+ schemas: [{
19
+ name: "storefront",
20
+ schema: join(schemaDirectory, STOREFRONT_SCHEMA_FILE_NAME),
21
+ tadaOutputLocation: STOREFRONT_OUTPUT_FILE_NAME
22
+ }, {
23
+ name: "customer-account",
24
+ schema: join(schemaDirectory, CUSTOMER_ACCOUNT_SCHEMA_FILE_NAME),
25
+ tadaOutputLocation: CUSTOMER_ACCOUNT_OUTPUT_FILE_NAME
26
+ }],
27
+ trackFieldUsage: false
28
+ };
29
+ }
30
+
31
+ //#endregion
32
+ //#region src/cli/gql.ts
33
+ const GQL_TADA_CLI_PATH_FROM_PACKAGE_ROOT = "bin/cli.js";
34
+ const PACKAGE_ROOT_FROM_CLI_MODULE$1 = "../../";
35
+ const SUCCESS_EXIT_CODE$1 = 0;
36
+ const TSCONFIG_FILE_NAME = "tsconfig.json";
37
+ const TEMPORARY_TSCONFIG_PREFIX = ".hydrogen-gql-";
38
+ const CHECK_LEVELS = new Set([
39
+ "info",
40
+ "warn",
41
+ "error"
42
+ ]);
43
+ function findTsconfig(cwd, configuredPath) {
44
+ if (configuredPath) return resolve(cwd, configuredPath);
45
+ let directory = cwd;
46
+ const root = parse(directory).root;
47
+ while (directory !== root) {
48
+ const candidate = join(directory, TSCONFIG_FILE_NAME);
49
+ if (existsSync(candidate)) return candidate;
50
+ directory = dirname(directory);
51
+ }
52
+ const rootCandidate = join(root, TSCONFIG_FILE_NAME);
53
+ if (existsSync(rootCandidate)) return rootCandidate;
54
+ throw new Error(`Could not find ${TSCONFIG_FILE_NAME}.`);
55
+ }
56
+ function spawnRunCommand$1(command, args, options) {
57
+ return new Promise((resolvePromise, reject) => {
58
+ const child = spawn(command, args, {
59
+ cwd: options.cwd,
60
+ stdio: "inherit"
61
+ });
62
+ child.on("error", reject);
63
+ child.on("close", (code) => {
64
+ if (code === SUCCESS_EXIT_CODE$1) {
65
+ resolvePromise();
66
+ return;
67
+ }
68
+ reject(/* @__PURE__ */ new Error(`Command failed with exit code ${code}: ${command} ${args.join(" ")}`));
69
+ });
70
+ });
71
+ }
72
+ function getPackageRoot$1() {
73
+ return resolve(import.meta.dirname, PACKAGE_ROOT_FROM_CLI_MODULE$1);
74
+ }
75
+ function getGqlTadaCliPath() {
76
+ return join(dirname(createRequire(import.meta.url).resolve("gql.tada/package.json")), GQL_TADA_CLI_PATH_FROM_PACKAGE_ROOT);
77
+ }
78
+ function parseCheckArgs(args) {
79
+ const { values } = parseArgs({
80
+ args,
81
+ options: {
82
+ "fail-on-warn": {
83
+ type: "boolean",
84
+ short: "w",
85
+ default: false
86
+ },
87
+ level: {
88
+ type: "string",
89
+ short: "l",
90
+ default: "info"
91
+ },
92
+ tsconfig: {
93
+ type: "string",
94
+ short: "c"
95
+ }
96
+ },
97
+ strict: true
98
+ });
99
+ if (!CHECK_LEVELS.has(values.level)) throw new Error(`Invalid diagnostic level: ${values.level}`);
100
+ return values;
101
+ }
102
+ async function checkGraphQL(options = {}) {
103
+ const cwd = options.cwd ?? process.cwd();
104
+ const packageRoot = options.packageRoot ?? getPackageRoot$1();
105
+ const gqlTadaCliPath = options.gqlTadaCliPath ?? getGqlTadaCliPath();
106
+ const runCommand = options.runCommand ?? spawnRunCommand$1;
107
+ const values = parseCheckArgs(options.args ?? []);
108
+ const tsconfigPath = findTsconfig(cwd, values.tsconfig);
109
+ const temporaryTsconfigPath = join(dirname(tsconfigPath), `${TEMPORARY_TSCONFIG_PREFIX}${randomUUID()}.json`);
110
+ const pluginConfig = createGraphQLPluginConfig(join(packageRoot, "dist"));
111
+ writeFileSync(temporaryTsconfigPath, JSON.stringify({
112
+ extends: tsconfigPath,
113
+ compilerOptions: { plugins: [pluginConfig] }
114
+ }), { flag: "wx" });
115
+ const cliArgs = [
116
+ gqlTadaCliPath,
117
+ "check",
118
+ "--tsconfig",
119
+ temporaryTsconfigPath,
120
+ "--level",
121
+ values.level
122
+ ];
123
+ if (values["fail-on-warn"]) cliArgs.push("--fail-on-warn");
124
+ const cleanup = () => rmSync(temporaryTsconfigPath, { force: true });
125
+ process.once("exit", cleanup);
126
+ try {
127
+ await runCommand(process.execPath, cliArgs, { cwd });
128
+ } finally {
129
+ process.off("exit", cleanup);
130
+ cleanup();
131
+ }
132
+ }
133
+
134
+ //#endregion
135
+ //#region src/core/utils/record.ts
136
+ function isObjectRecord(value) {
137
+ return typeof value === "object" && value !== null && !Array.isArray(value);
138
+ }
139
+
140
+ //#endregion
141
+ //#region src/cli/setup.ts
142
+ const PACKAGE_NAME = "@shopify/hydrogen";
143
+ const PACKAGE_INSTALL_SPEC = `${PACKAGE_NAME}@preview`;
144
+ const PACKAGE_ROOT_FROM_CLI_MODULE = "../../";
145
+ const SKILLS_DIRECTORY_NAME = "skills";
146
+ const CLAUDE_DIRECTORY_NAME = ".claude";
147
+ const AGENTS_DIRECTORY_NAME = ".agents";
148
+ const NODE_MODULES_DIRECTORY_NAME = "node_modules";
149
+ const PACKAGE_JSON_FILE_NAME = "package.json";
150
+ const SUCCESS_EXIT_CODE = 0;
151
+ const PACKAGE_MANAGER_LOCKFILES = [
152
+ ["pnpm", "pnpm-lock.yaml"],
153
+ ["yarn", "yarn.lock"],
154
+ ["npm", "package-lock.json"],
155
+ ["bun", "bun.lockb"],
156
+ ["bun", "bun.lock"]
157
+ ];
158
+ const INSTALL_ARGS = {
159
+ pnpm: ["add", PACKAGE_INSTALL_SPEC],
160
+ npm: ["install", PACKAGE_INSTALL_SPEC],
161
+ yarn: ["add", PACKAGE_INSTALL_SPEC],
162
+ bun: ["add", PACKAGE_INSTALL_SPEC]
163
+ };
164
+ function getStringRecord(value) {
165
+ if (!isObjectRecord(value)) return void 0;
166
+ const entries = Object.entries(value);
167
+ if (entries.some(([, entryValue]) => typeof entryValue !== "string")) return void 0;
168
+ return Object.fromEntries(entries);
169
+ }
170
+ function readPackageJson(appRoot) {
171
+ const packageJsonPath = join(appRoot, PACKAGE_JSON_FILE_NAME);
172
+ if (!existsSync(packageJsonPath)) throw new Error(`No ${PACKAGE_JSON_FILE_NAME} found. Run this command from the app root.`);
173
+ const parsed = JSON.parse(readFileSync(packageJsonPath, "utf8"));
174
+ if (!isObjectRecord(parsed)) throw new Error(`${PACKAGE_JSON_FILE_NAME} must contain a JSON object.`);
175
+ return {
176
+ packageManager: typeof parsed.packageManager === "string" ? parsed.packageManager : void 0,
177
+ dependencies: getStringRecord(parsed.dependencies),
178
+ devDependencies: getStringRecord(parsed.devDependencies)
179
+ };
180
+ }
181
+ function parsePackageManager(value) {
182
+ if (!value) return void 0;
183
+ for (const packageManager of Object.keys(INSTALL_ARGS)) {
184
+ if (value === packageManager) return packageManager;
185
+ if (value.startsWith(`${packageManager}@`)) return packageManager;
186
+ if (value.startsWith(`${packageManager}/`)) return packageManager;
187
+ }
188
+ }
189
+ function detectPackageManager(appRoot, packageJson, env) {
190
+ const packageJsonManager = parsePackageManager(packageJson.packageManager);
191
+ if (packageJsonManager) return packageJsonManager;
192
+ for (const [packageManager, lockfile] of PACKAGE_MANAGER_LOCKFILES) if (existsSync(join(appRoot, lockfile))) return packageManager;
193
+ const userAgentManager = parsePackageManager(env.npm_config_user_agent);
194
+ if (userAgentManager) return userAgentManager;
195
+ throw new Error("Could not detect a package manager. Add a packageManager field or a lockfile before running setup.");
196
+ }
197
+ function hasHydrogenDependency(packageJson) {
198
+ return Boolean(packageJson.dependencies?.[PACKAGE_NAME] ?? packageJson.devDependencies?.[PACKAGE_NAME]);
199
+ }
200
+ async function installHydrogen(appRoot, packageManager, runCommand) {
201
+ await runCommand(packageManager, [...INSTALL_ARGS[packageManager]], { cwd: appRoot });
202
+ }
203
+ function assertDirectory(directoryPath, message) {
204
+ if (!existsSync(directoryPath) || !statSync(directoryPath).isDirectory()) throw new Error(message);
205
+ }
206
+ function getSkillsDestinationRoots(appRoot) {
207
+ const destinationRoots = [];
208
+ const claudeDirectory = join(appRoot, CLAUDE_DIRECTORY_NAME);
209
+ if (existsSync(claudeDirectory)) {
210
+ assertDirectory(claudeDirectory, `${CLAUDE_DIRECTORY_NAME} exists but is not a directory.`);
211
+ destinationRoots.push(join(claudeDirectory, SKILLS_DIRECTORY_NAME));
212
+ }
213
+ const agentsDirectory = join(appRoot, AGENTS_DIRECTORY_NAME);
214
+ if (existsSync(agentsDirectory)) {
215
+ assertDirectory(agentsDirectory, `${AGENTS_DIRECTORY_NAME} exists but is not a directory.`);
216
+ destinationRoots.push(join(agentsDirectory, SKILLS_DIRECTORY_NAME));
217
+ }
218
+ return destinationRoots.length > 0 ? destinationRoots : [join(appRoot, AGENTS_DIRECTORY_NAME, SKILLS_DIRECTORY_NAME)];
219
+ }
220
+ function getSkillNames(sourceSkillsRoot) {
221
+ assertDirectory(sourceSkillsRoot, `No packaged skills found at ${sourceSkillsRoot}.`);
222
+ return readdirSync(sourceSkillsRoot, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => entry.name);
223
+ }
224
+ function findConflictingSkills(destinationRoot, skillNames) {
225
+ return skillNames.filter((skillName) => existsSync(join(destinationRoot, skillName, "SKILL.md")));
226
+ }
227
+ function removeIncompleteSkills(destinationRoot, skillNames) {
228
+ for (const skillName of skillNames) {
229
+ const destinationPath = join(destinationRoot, skillName);
230
+ if (!existsSync(destinationPath)) continue;
231
+ if (existsSync(join(destinationPath, "SKILL.md"))) continue;
232
+ rmSync(destinationPath, {
233
+ recursive: true,
234
+ force: true
235
+ });
236
+ }
237
+ }
238
+ function copySkills(packageRoot, appRoot) {
239
+ const sourceSkillsRoot = join(packageRoot, SKILLS_DIRECTORY_NAME);
240
+ const destinationRoots = getSkillsDestinationRoots(appRoot);
241
+ const skillNames = getSkillNames(sourceSkillsRoot);
242
+ const conflictingSkills = destinationRoots.flatMap((destinationRoot) => findConflictingSkills(destinationRoot, skillNames).map((skillName) => join(destinationRoot, skillName)));
243
+ if (conflictingSkills.length > 0) throw new Error(`Skill directories already exist: ${conflictingSkills.join(", ")}. Remove them and rerun setup.`);
244
+ for (const destinationRoot of destinationRoots) {
245
+ removeIncompleteSkills(destinationRoot, skillNames);
246
+ mkdirSync(destinationRoot, { recursive: true });
247
+ for (const skillName of skillNames) cpSync(join(sourceSkillsRoot, skillName), join(destinationRoot, skillName), {
248
+ recursive: true,
249
+ errorOnExist: true,
250
+ force: false
251
+ });
252
+ }
253
+ return {
254
+ destinationRoots,
255
+ copiedCount: skillNames.length * destinationRoots.length
256
+ };
257
+ }
258
+ function getPackageRoot() {
259
+ return fileURLToPath(new URL(PACKAGE_ROOT_FROM_CLI_MODULE, import.meta.url));
260
+ }
261
+ function getLocalPackageRoot(appRoot) {
262
+ const localPackageRoot = join(appRoot, NODE_MODULES_DIRECTORY_NAME, PACKAGE_NAME);
263
+ if (!existsSync(localPackageRoot)) return void 0;
264
+ assertDirectory(localPackageRoot, `${localPackageRoot} exists but is not a directory.`);
265
+ return realpathSync(localPackageRoot);
266
+ }
267
+ function spawnRunCommand(command, args, options) {
268
+ return new Promise((resolve, reject) => {
269
+ const child = spawn(command, args, {
270
+ cwd: options.cwd,
271
+ stdio: "inherit"
272
+ });
273
+ child.on("error", reject);
274
+ child.on("close", (code) => {
275
+ if (code === SUCCESS_EXIT_CODE) {
276
+ resolve();
277
+ return;
278
+ }
279
+ reject(/* @__PURE__ */ new Error(`Command failed with exit code ${code}: ${command} ${args.join(" ")}`));
280
+ });
281
+ });
282
+ }
283
+ async function setupHydrogen(options = {}) {
284
+ const appRoot = options.cwd ?? process.cwd();
285
+ const env = options.env ?? process.env;
286
+ const runCommand = options.runCommand ?? spawnRunCommand;
287
+ const log = options.log ?? console.log;
288
+ const packageJson = readPackageJson(appRoot);
289
+ if (!hasHydrogenDependency(packageJson)) {
290
+ const packageManager = detectPackageManager(appRoot, packageJson, env);
291
+ log(`Installing ${PACKAGE_NAME} with ${packageManager}...`);
292
+ await installHydrogen(appRoot, packageManager, runCommand);
293
+ }
294
+ const result = copySkills(options.packageRoot ?? getLocalPackageRoot(appRoot) ?? getPackageRoot(), appRoot);
295
+ log(`Copied ${result.copiedCount} Hydrogen skills to ${result.destinationRoots.join(", ")}.`);
296
+ }
297
+
298
+ //#endregion
299
+ //#region src/cli/index.ts
300
+ const CLI_ARGUMENTS_INDEX = 2;
301
+ const FAILURE_EXIT_CODE = 1;
302
+ const COMMANDS = [{
303
+ path: ["setup"],
304
+ run: async (_args) => setupHydrogen()
305
+ }, {
306
+ path: ["gql", "check"],
307
+ run: async (args) => checkGraphQL({ args })
308
+ }];
309
+ function commandMatches(path, args) {
310
+ return path.every((segment, index) => args[index] === segment);
311
+ }
312
+ function runCli() {
313
+ const args = process.argv.slice(CLI_ARGUMENTS_INDEX);
314
+ const command = COMMANDS.find(({ path }) => commandMatches(path, args));
315
+ if (!command) {
316
+ const commandName = args.join(" ");
317
+ const availableCommands = COMMANDS.map(({ path }) => path.join(" ")).join(", ");
318
+ console.error(commandName ? `Unknown command: ${commandName}` : "No command specified.");
319
+ console.error(`Available commands: ${availableCommands}`);
320
+ process.exit(FAILURE_EXIT_CODE);
321
+ }
322
+ command.run(args.slice(command.path.length)).catch((error) => {
323
+ console.error(error instanceof Error ? error.message : "An unexpected error occurred");
324
+ process.exit(FAILURE_EXIT_CODE);
325
+ });
326
+ }
327
+ if (process.argv[1] !== void 0 && fileURLToPath(import.meta.url) === realpathSync(process.argv[1])) runCli();
328
+
329
+ //#endregion
330
+ export { runCli };
@@ -0,0 +1,34 @@
1
+ import { CachingStrategy } from "../core/cache/strategies.mjs";
2
+ import { CacheInstance } from "../core/cache/run-with-cache.mjs";
3
+ import { ShopifyRequestContext } from "../core/request-context.mjs";
4
+ import { ClientType, CreateStorefrontClientArgs, StorefrontClient } from "./types.mjs";
5
+
6
+ //#region src/client/client.d.ts
7
+ /**
8
+ * Creates a type-safe Storefront API client.
9
+ *
10
+ * Pick a `type` based on where your code runs and whether buyer context is available:
11
+ *
12
+ * | | public | private | private_no_buyer_context |
13
+ * |-----------------|--------------------------------|-------------------------------|--------------------------|
14
+ * | Runs in | Browser or mobile | Server (SSR) | Server (background) |
15
+ * | Token | Public access token, or none | Private access token | Private access token |
16
+ * | Buyer context | Browser request context | You forward trusted `buyerIp` | None |
17
+ * | Best for | Client-side fetches | SSR with buyer context | Webhooks, background jobs |
18
+ *
19
+ * Pass `requestContext` so the client's SFAPI requests carry request-scoped
20
+ * headers, follow the incoming request's abort signal, and read the resolved
21
+ * `i18n` used for Storefront API variable injection and localized routes.
22
+ *
23
+ * Token-based access is required for some Storefront API fields, including
24
+ * product tags, metaobjects, metafields, menus, and customers. Use a private
25
+ * client only in trusted server code where the token cannot leak to browsers.
26
+ *
27
+ * @see {@link https://shopify.dev/docs/api/storefront#authentication | Storefront API authentication}
28
+ */
29
+ declare function createStorefrontClient<const Type extends ClientType, const RequestContext extends ShopifyRequestContext, const CacheConfig extends CacheInstance | undefined = undefined>(args: CreateStorefrontClientArgs<RequestContext, Type, CacheConfig>): StorefrontClient<[CacheConfig] extends [CacheInstance] ? {
30
+ cache?: CachingStrategy;
31
+ } : {}, Type, RequestContext>;
32
+ //#endregion
33
+ export { createStorefrontClient };
34
+ //# sourceMappingURL=client.d.mts.map
@@ -0,0 +1,193 @@
1
+ import { HYDROGEN_VERSION_HEADER, REQUEST_GROUP_ID_HEADER, SDK_VARIANT_HEADER, SDK_VARIANT_SOURCE_HEADER, SDK_VERSION_HEADER, SHOPIFY_STOREFRONT_S_HEADER, SHOPIFY_STOREFRONT_Y_HEADER, SHOPIFY_UNIQUE_TOKEN_HEADER, SHOPIFY_VISIT_TOKEN_HEADER, STOREFRONT_ACCESS_TOKEN_HEADER, STOREFRONT_BUYER_IP_HEADER, STOREFRONT_ID_HEADER, STOREFRONT_PRIVATE_TOKEN_HEADER } from "../core/headers.mjs";
2
+ import { normalizeStoreDomain } from "../core/url.mjs";
3
+ import { getHydrogenCacheStatus } from "../core/cache/cache-status.mjs";
4
+ import { createFetchWithCache } from "../core/cache/fetch-with-cache.mjs";
5
+ import { DEFAULT_TIMEOUT_IN_MS, STOREFRONT_API_VERSION } from "../core/constants.mjs";
6
+ import { StorefrontApiError, StorefrontTimeoutError } from "./errors.mjs";
7
+
8
+ //#region src/client/client.ts
9
+ const COUNTRY_VAR_RE = /\$country\s*:/;
10
+ const LANGUAGE_VAR_RE = /\$language\s*:/;
11
+ const REQUEST_CACHE_KEY_HEADERS = new Set([
12
+ "content-type",
13
+ "user-agent",
14
+ SDK_VARIANT_HEADER.toLowerCase(),
15
+ SDK_VARIANT_SOURCE_HEADER.toLowerCase(),
16
+ SDK_VERSION_HEADER.toLowerCase(),
17
+ HYDROGEN_VERSION_HEADER.toLowerCase(),
18
+ STOREFRONT_ACCESS_TOKEN_HEADER.toLowerCase(),
19
+ STOREFRONT_PRIVATE_TOKEN_HEADER.toLowerCase()
20
+ ]);
21
+ const REQUEST_IDENTITY_HEADERS = new Set([
22
+ "cookie",
23
+ REQUEST_GROUP_ID_HEADER.toLowerCase(),
24
+ STOREFRONT_BUYER_IP_HEADER.toLowerCase(),
25
+ SHOPIFY_UNIQUE_TOKEN_HEADER.toLowerCase(),
26
+ SHOPIFY_VISIT_TOKEN_HEADER.toLowerCase(),
27
+ SHOPIFY_STOREFRONT_Y_HEADER.toLowerCase(),
28
+ SHOPIFY_STOREFRONT_S_HEADER.toLowerCase()
29
+ ]);
30
+ var StorefrontCacheConfigError = class extends Error {};
31
+ function createStorefrontClient(args) {
32
+ const { config, requestContext, type: clientType } = args;
33
+ if (!config.storeDomain) throw new Error("storeDomain is required and must be non-empty");
34
+ const storeUrl = normalizeStoreDomain(config.storeDomain);
35
+ const apiUrl = `${storeUrl}/api/${config.apiVersion ?? "2026-04"}/graphql.json`;
36
+ const originFetch = config.fetch ?? globalThis.fetch;
37
+ if (typeof originFetch !== "function") throw new Error("No fetch function available. Pass a fetch option or ensure globalThis.fetch exists.");
38
+ const resolvedFetch = config.cache ? createFetchWithCache({
39
+ cache: config.cache,
40
+ waitUntil: config.waitUntil,
41
+ fetch: originFetch
42
+ }) : originFetch;
43
+ const timeoutInMs = config.defaultTimeoutInMs ?? 3e4;
44
+ if (timeoutInMs < 0 || Number.isNaN(timeoutInMs)) throw new Error("defaultTimeoutInMs must be a non-negative number");
45
+ const staticHeaders = { "content-type": "application/json" };
46
+ if (config.storefrontId) staticHeaders[STOREFRONT_ID_HEADER] = config.storefrontId;
47
+ switch (clientType) {
48
+ case "private":
49
+ case "private_no_buyer_context":
50
+ if (typeof document !== "undefined") throw new Error("private storefront tokens cannot be used in a browser context. Use a publicStorefrontToken instead.");
51
+ if (!config.privateStorefrontToken) throw new Error("privateStorefrontToken is required");
52
+ staticHeaders[STOREFRONT_PRIVATE_TOKEN_HEADER] = config.privateStorefrontToken;
53
+ break;
54
+ case "public":
55
+ if (config.publicStorefrontToken !== void 0 && !config.publicStorefrontToken) throw new Error("publicStorefrontToken must be non-empty when provided");
56
+ if (config.publicStorefrontToken) staticHeaders[STOREFRONT_ACCESS_TOKEN_HEADER] = config.publicStorefrontToken;
57
+ break;
58
+ default: throw new Error(`Unsupported client type: ${clientType}`);
59
+ }
60
+ const i18n = requestContext.i18n;
61
+ const requestHeaders = new Headers(staticHeaders);
62
+ requestContext.applyStorefrontRequestHeaders(requestHeaders);
63
+ if (clientType === "private") {
64
+ const { buyerIp } = requestContext;
65
+ if (!buyerIp) throw new TypeError("requestContext.buyerIp is required for private Storefront API clients");
66
+ requestHeaders.set(STOREFRONT_BUYER_IP_HEADER, buyerIp);
67
+ }
68
+ async function graphql(doc, ...rest) {
69
+ const opts = rest[0] ?? {};
70
+ const queryText = typeof doc === "string" ? doc : doc;
71
+ if (typeof queryText !== "string") throw new StorefrontApiError("Expected gql() to return a string at runtime. Check gql.tada version compatibility.");
72
+ if (opts.cache && !config.cache) throw new StorefrontCacheConfigError("Storefront API cache options require a cache configured in createStorefrontClient().");
73
+ if (opts.cache?.mode === "private") throw new StorefrontCacheConfigError("Storefront API cache mode 'private' is not supported yet. Use Cache() without private mode, or cache buyer-specific work with createRunWithCache() and an explicit private key.");
74
+ const variables = buildVariables(queryText, opts.variables, i18n);
75
+ const externalSignals = [requestContext.signal, opts.signal].filter((signal) => Boolean(signal));
76
+ const earlyAbortSignal = externalSignals.find((signal) => signal.aborted);
77
+ if (earlyAbortSignal) throw earlyAbortSignal.reason ?? new DOMException("signal is aborted without reason", "AbortError");
78
+ let requestId;
79
+ let responseHeaders;
80
+ let responseText;
81
+ let status;
82
+ let timeoutSignal;
83
+ if (timeoutInMs > 0) {
84
+ timeoutSignal = AbortSignal.timeout(timeoutInMs);
85
+ externalSignals.push(timeoutSignal);
86
+ }
87
+ try {
88
+ const init = {
89
+ method: "POST",
90
+ headers: new Headers(requestHeaders),
91
+ body: JSON.stringify({
92
+ query: queryText,
93
+ variables
94
+ }),
95
+ signal: externalSignals.length > 0 ? AbortSignal.any(externalSignals) : void 0
96
+ };
97
+ const response = await resolvedFetch(apiUrl, init, createStorefrontCacheOptions(apiUrl, init, queryText, opts.cache));
98
+ responseHeaders = response.headers;
99
+ if (getHydrogenCacheStatus(responseHeaders) !== "hit") requestContext.captureSubrequestHeaders(responseHeaders);
100
+ requestId = responseHeaders.get("x-request-id") ?? void 0;
101
+ status = response.status;
102
+ if (!response.ok) {
103
+ const bodyHint = await response.text().catch(() => "");
104
+ throw new StorefrontApiError(`SFAPI responded with ${status}${bodyHint ? `: ${bodyHint.slice(0, 200)}` : ""}`, {
105
+ status,
106
+ requestId,
107
+ queryText,
108
+ variables
109
+ });
110
+ }
111
+ responseText = await response.text();
112
+ } catch (error) {
113
+ if (error instanceof StorefrontApiError) throw error;
114
+ if (error instanceof StorefrontTimeoutError) throw error;
115
+ if (error instanceof StorefrontCacheConfigError) throw error;
116
+ if (error instanceof DOMException && error.name === "TimeoutError" && timeoutSignal?.aborted) throw new StorefrontTimeoutError(timeoutInMs);
117
+ if (error instanceof DOMException && error.name === "AbortError") throw error;
118
+ throw new StorefrontApiError("SFAPI request failed", { cause: error });
119
+ }
120
+ let json;
121
+ try {
122
+ json = JSON.parse(responseText);
123
+ } catch (cause) {
124
+ throw new StorefrontApiError(`Failed to parse SFAPI response as JSON (${apiUrl}, status ${status})` + (responseText ? `: ${responseText.slice(0, 200)}` : ""), {
125
+ status,
126
+ requestId,
127
+ cause,
128
+ queryText,
129
+ variables
130
+ });
131
+ }
132
+ if (typeof json !== "object" || json === null || Array.isArray(json)) throw new StorefrontApiError(`SFAPI returned unexpected JSON type: ${Array.isArray(json) ? "array" : typeof json}`, {
133
+ status,
134
+ requestId,
135
+ queryText,
136
+ variables
137
+ });
138
+ const body = json;
139
+ if (body.errors) return {
140
+ data: body.data ?? null,
141
+ errors: body.errors,
142
+ headers: responseHeaders
143
+ };
144
+ return {
145
+ data: body.data,
146
+ headers: responseHeaders
147
+ };
148
+ }
149
+ return {
150
+ type: clientType,
151
+ i18n,
152
+ graphql,
153
+ apiUrl,
154
+ storeUrl,
155
+ storefrontId: config.storefrontId,
156
+ requestContext
157
+ };
158
+ }
159
+ function buildVariables(queryText, userVariables, resolvedI18n) {
160
+ const variables = { ...userVariables };
161
+ if (COUNTRY_VAR_RE.test(queryText)) variables.country = resolvedI18n.country;
162
+ if (LANGUAGE_VAR_RE.test(queryText)) variables.language = resolvedI18n.language;
163
+ return variables;
164
+ }
165
+ function createStorefrontCacheOptions(apiUrl, init, queryText, strategy) {
166
+ if (!strategy) return void 0;
167
+ if (/\bmutation\b/.test(queryText)) return void 0;
168
+ return {
169
+ key: createStorefrontCacheKey(apiUrl, init),
170
+ strategy,
171
+ shouldCacheResponse: async ({ json }) => {
172
+ if (!json) return false;
173
+ const body = await json().catch(() => void 0);
174
+ return typeof body === "object" && body != null && !Array.isArray(body) && !("errors" in body);
175
+ }
176
+ };
177
+ }
178
+ function createStorefrontCacheKey(apiUrl, init) {
179
+ return [
180
+ "storefront-api",
181
+ apiUrl,
182
+ init.method,
183
+ init.body,
184
+ [...init.headers].filter(([name]) => {
185
+ const normalized = name.toLowerCase();
186
+ return REQUEST_CACHE_KEY_HEADERS.has(normalized) && !REQUEST_IDENTITY_HEADERS.has(normalized);
187
+ }).toSorted(([left], [right]) => left.localeCompare(right)).map(([name, value]) => `${name}:${value}`).join("\n")
188
+ ];
189
+ }
190
+
191
+ //#endregion
192
+ export { createStorefrontClient };
193
+ //# sourceMappingURL=client.mjs.map