@shopify/hydrogen 2026.4.5 → 2026.10.0-preview.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (764) hide show
  1. package/README.md +73 -13
  2. package/bin/hydrogen.mjs +7 -0
  3. package/dist/cli/index.mjs +647 -0
  4. package/dist/client/client.d.mts +34 -0
  5. package/dist/client/client.mjs +206 -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 +37 -0
  50. package/dist/core/cart/cart.mjs +1707 -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 +71 -0
  87. package/dist/core/collection/url.mjs +376 -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 +43 -0
  93. package/dist/core/headers.mjs.map +1 -0
  94. package/dist/core/index.d.mts +56 -0
  95. package/dist/core/index.mjs +45 -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/accept-variant-id.mjs +98 -0
  133. package/dist/core/product/accept-variant-id.mjs.map +1 -0
  134. package/dist/core/product/form.d.mts +63 -0
  135. package/dist/core/product/form.mjs +44 -0
  136. package/dist/core/product/form.mjs.map +1 -0
  137. package/dist/core/product/index.d.mts +5 -0
  138. package/dist/core/product/options.d.mts +43 -0
  139. package/dist/core/product/options.mjs +296 -0
  140. package/dist/core/product/options.mjs.map +1 -0
  141. package/dist/core/product/product-form.d.mts +72 -0
  142. package/dist/core/product/product-form.mjs +158 -0
  143. package/dist/core/product/product-form.mjs.map +1 -0
  144. package/dist/core/product/state.d.mts +68 -0
  145. package/dist/core/product/url.d.mts +47 -0
  146. package/dist/core/product/url.mjs +69 -0
  147. package/dist/core/product/url.mjs.map +1 -0
  148. package/dist/core/request-context.d.mts +75 -0
  149. package/dist/core/request-context.mjs +141 -0
  150. package/dist/core/request-context.mjs.map +1 -0
  151. package/dist/core/request-routing/handle-shopify-redirects.d.mts +17 -0
  152. package/dist/core/request-routing/handle-shopify-redirects.mjs +31 -0
  153. package/dist/core/request-routing/handle-shopify-redirects.mjs.map +1 -0
  154. package/dist/core/request-routing/handle-shopify-routes.d.mts +14 -0
  155. package/dist/core/request-routing/handle-shopify-routes.mjs +42 -0
  156. package/dist/core/request-routing/handle-shopify-routes.mjs.map +1 -0
  157. package/dist/core/request-routing/interceptors/admin-redirect.mjs +12 -0
  158. package/dist/core/request-routing/interceptors/admin-redirect.mjs.map +1 -0
  159. package/dist/core/request-routing/interceptors/ajax-api.mjs +16 -0
  160. package/dist/core/request-routing/interceptors/ajax-api.mjs.map +1 -0
  161. package/dist/core/request-routing/interceptors/api-proxy.mjs +20 -0
  162. package/dist/core/request-routing/interceptors/api-proxy.mjs.map +1 -0
  163. package/dist/core/request-routing/interceptors/checkout.mjs +58 -0
  164. package/dist/core/request-routing/interceptors/checkout.mjs.map +1 -0
  165. package/dist/core/request-routing/interceptors/mcp-proxy.mjs +23 -0
  166. package/dist/core/request-routing/interceptors/mcp-proxy.mjs.map +1 -0
  167. package/dist/core/request-routing/interceptors/proxy.mjs +73 -0
  168. package/dist/core/request-routing/interceptors/proxy.mjs.map +1 -0
  169. package/dist/core/request-routing/interceptors/query-param-redirect.mjs +22 -0
  170. package/dist/core/request-routing/interceptors/query-param-redirect.mjs.map +1 -0
  171. package/dist/core/request-routing/interceptors/sfapi-proxy.mjs +27 -0
  172. package/dist/core/request-routing/interceptors/sfapi-proxy.mjs.map +1 -0
  173. package/dist/core/request-routing/interceptors/standard-routes.mjs +19 -0
  174. package/dist/core/request-routing/interceptors/standard-routes.mjs.map +1 -0
  175. package/dist/core/request-routing/interceptors/url-redirects.mjs +27 -0
  176. package/dist/core/request-routing/interceptors/url-redirects.mjs.map +1 -0
  177. package/dist/core/request-routing/interceptors/well-known.mjs +22 -0
  178. package/dist/core/request-routing/interceptors/well-known.mjs.map +1 -0
  179. package/dist/core/request-routing/registered-routes.d.mts +7 -0
  180. package/dist/core/request-routing/registered-routes.mjs +72 -0
  181. package/dist/core/request-routing/registered-routes.mjs.map +1 -0
  182. package/dist/core/request-routing/route-types.d.mts +56 -0
  183. package/dist/core/request-routing/safe-apply-response-headers.mjs +16 -0
  184. package/dist/core/request-routing/safe-apply-response-headers.mjs.map +1 -0
  185. package/dist/core/shop-pay/shop-pay.d.mts +102 -0
  186. package/dist/core/shop-pay/shop-pay.mjs +289 -0
  187. package/dist/core/shop-pay/shop-pay.mjs.map +1 -0
  188. package/dist/core/shopify-scripts/analytics.mjs +26 -0
  189. package/dist/core/shopify-scripts/analytics.mjs.map +1 -0
  190. package/dist/core/shopify-scripts/consent.mjs +17 -0
  191. package/dist/core/shopify-scripts/consent.mjs.map +1 -0
  192. package/dist/core/shopify-scripts/constants.mjs +19 -0
  193. package/dist/core/shopify-scripts/constants.mjs.map +1 -0
  194. package/dist/core/shopify-scripts/deprecated-cookies.mjs +97 -0
  195. package/dist/core/shopify-scripts/deprecated-cookies.mjs.map +1 -0
  196. package/dist/core/shopify-scripts/global.d.mts +1 -0
  197. package/dist/core/shopify-scripts/global.mjs +86 -0
  198. package/dist/core/shopify-scripts/global.mjs.map +1 -0
  199. package/dist/core/shopify-scripts/index.d.mts +27 -0
  200. package/dist/core/shopify-scripts/index.mjs +135 -0
  201. package/dist/core/shopify-scripts/index.mjs.map +1 -0
  202. package/dist/core/shopify-scripts/initialize.d.mts +18 -0
  203. package/dist/core/shopify-scripts/initialize.mjs +27 -0
  204. package/dist/core/shopify-scripts/initialize.mjs.map +1 -0
  205. package/dist/core/shopify-scripts/page-view.mjs +49 -0
  206. package/dist/core/shopify-scripts/page-view.mjs.map +1 -0
  207. package/dist/core/shopify-scripts/perfkit.mjs +33 -0
  208. package/dist/core/shopify-scripts/perfkit.mjs.map +1 -0
  209. package/dist/core/shopify-scripts/render.d.mts +1 -0
  210. package/dist/core/shopify-scripts/render.mjs +23 -0
  211. package/dist/core/shopify-scripts/render.mjs.map +1 -0
  212. package/dist/core/shopify-scripts/types.d.mts +76 -0
  213. package/dist/core/shopify-scripts/utils/cookie-domain.mjs +43 -0
  214. package/dist/core/shopify-scripts/utils/cookie-domain.mjs.map +1 -0
  215. package/dist/core/shopify-scripts/utils/inline-script.mjs +8 -0
  216. package/dist/core/shopify-scripts/utils/inline-script.mjs.map +1 -0
  217. package/dist/core/shopify-scripts/utils/navigation.mjs +46 -0
  218. package/dist/core/shopify-scripts/utils/navigation.mjs.map +1 -0
  219. package/dist/core/shopify-scripts/utils/tracking-values.mjs +65 -0
  220. package/dist/core/shopify-scripts/utils/tracking-values.mjs.map +1 -0
  221. package/dist/core/shopify-scripts/utils/uuid.mjs +17 -0
  222. package/dist/core/shopify-scripts/utils/uuid.mjs.map +1 -0
  223. package/dist/core/shopify-scripts/webmcp.mjs +22 -0
  224. package/dist/core/shopify-scripts/webmcp.mjs.map +1 -0
  225. package/dist/core/standard-routes/build.d.mts +34 -0
  226. package/dist/core/standard-routes/build.mjs +54 -0
  227. package/dist/core/standard-routes/build.mjs.map +1 -0
  228. package/dist/core/standard-routes/defaults.mjs +31 -0
  229. package/dist/core/standard-routes/defaults.mjs.map +1 -0
  230. package/dist/core/standard-routes/match.mjs +108 -0
  231. package/dist/core/standard-routes/match.mjs.map +1 -0
  232. package/dist/core/standard-routes/path.mjs +58 -0
  233. package/dist/core/standard-routes/path.mjs.map +1 -0
  234. package/dist/core/standard-routes/redirects.mjs +51 -0
  235. package/dist/core/standard-routes/redirects.mjs.map +1 -0
  236. package/dist/core/standard-routes/types.d.mts +95 -0
  237. package/dist/core/url.mjs +42 -0
  238. package/dist/core/url.mjs.map +1 -0
  239. package/dist/core/utils/load-script.mjs +34 -0
  240. package/dist/core/utils/load-script.mjs.map +1 -0
  241. package/dist/core/utils/parse-gid.mjs +33 -0
  242. package/dist/core/utils/parse-gid.mjs.map +1 -0
  243. package/dist/core/utils/record.mjs +8 -0
  244. package/dist/core/utils/record.mjs.map +1 -0
  245. package/dist/customer-account/client.d.mts +50 -0
  246. package/dist/customer-account/client.mjs +239 -0
  247. package/dist/customer-account/client.mjs.map +1 -0
  248. package/dist/customer-account/errors.d.mts +28 -0
  249. package/dist/customer-account/errors.mjs +39 -0
  250. package/dist/customer-account/errors.mjs.map +1 -0
  251. package/dist/customer-account/graphql.d.mts +29 -0
  252. package/dist/customer-account/graphql.mjs +39 -0
  253. package/dist/customer-account/graphql.mjs.map +1 -0
  254. package/dist/customer-account/index.d.mts +7 -0
  255. package/dist/customer-account/index.mjs +7 -0
  256. package/dist/customer-account/session.d.mts +117 -0
  257. package/dist/customer-account/session.mjs +733 -0
  258. package/dist/customer-account/session.mjs.map +1 -0
  259. package/dist/customer-account/type-resolver.d.mts +11 -0
  260. package/dist/customer-account-api-types.d.ts +3269 -3270
  261. package/dist/customer-account.schema.json +50753 -1
  262. package/dist/development/_virtual/_@oxc-project_runtime@0.127.0/helpers/taggedTemplateLiteral.mjs +7 -0
  263. package/dist/development/client/client.d.mts +34 -0
  264. package/dist/development/client/client.mjs +206 -0
  265. package/dist/development/client/client.mjs.map +1 -0
  266. package/dist/development/client/errors.d.mts +48 -0
  267. package/dist/development/client/errors.mjs +57 -0
  268. package/dist/development/client/errors.mjs.map +1 -0
  269. package/dist/development/client/index.d.mts +4 -0
  270. package/dist/development/client/types.d.mts +147 -0
  271. package/dist/development/core/analytics/cart-tracker.d.mts +8 -0
  272. package/dist/development/core/analytics/cart-tracker.mjs +144 -0
  273. package/dist/development/core/analytics/cart-tracker.mjs.map +1 -0
  274. package/dist/development/core/analytics/events.d.mts +15 -0
  275. package/dist/development/core/analytics/events.mjs +15 -0
  276. package/dist/development/core/analytics/events.mjs.map +1 -0
  277. package/dist/development/core/analytics/index.d.mts +3 -0
  278. package/dist/development/core/analytics/types.d.mts +143 -0
  279. package/dist/development/core/analytics/utils/flatten-connection.d.mts +19 -0
  280. package/dist/development/core/analytics/utils/flatten-connection.mjs +25 -0
  281. package/dist/development/core/analytics/utils/flatten-connection.mjs.map +1 -0
  282. package/dist/development/core/cache/cache-status.mjs +17 -0
  283. package/dist/development/core/cache/cache-status.mjs.map +1 -0
  284. package/dist/development/core/cache/fetch-with-cache.d.mts +43 -0
  285. package/dist/development/core/cache/fetch-with-cache.mjs +188 -0
  286. package/dist/development/core/cache/fetch-with-cache.mjs.map +1 -0
  287. package/dist/development/core/cache/key.d.mts +6 -0
  288. package/dist/development/core/cache/key.mjs +27 -0
  289. package/dist/development/core/cache/key.mjs.map +1 -0
  290. package/dist/development/core/cache/run-with-cache.d.mts +36 -0
  291. package/dist/development/core/cache/run-with-cache.mjs +114 -0
  292. package/dist/development/core/cache/run-with-cache.mjs.map +1 -0
  293. package/dist/development/core/cache/store.d.mts +19 -0
  294. package/dist/development/core/cache/store.mjs +62 -0
  295. package/dist/development/core/cache/store.mjs.map +1 -0
  296. package/dist/development/core/cache/strategies.d.mts +39 -0
  297. package/dist/development/core/cache/strategies.mjs +70 -0
  298. package/dist/development/core/cache/strategies.mjs.map +1 -0
  299. package/dist/development/core/cart/actions.d.mts +50 -0
  300. package/dist/development/core/cart/actions.mjs +240 -0
  301. package/dist/development/core/cart/actions.mjs.map +1 -0
  302. package/dist/development/core/cart/attach-quantity-input.d.mts +5 -0
  303. package/dist/development/core/cart/attach-quantity-input.mjs +17 -0
  304. package/dist/development/core/cart/attach-quantity-input.mjs.map +1 -0
  305. package/dist/development/core/cart/buyer-identity-sync.d.mts +19 -0
  306. package/dist/development/core/cart/buyer-identity-sync.mjs +6 -0
  307. package/dist/development/core/cart/buyer-identity-sync.mjs.map +1 -0
  308. package/dist/development/core/cart/cart.d.mts +37 -0
  309. package/dist/development/core/cart/cart.mjs +1707 -0
  310. package/dist/development/core/cart/cart.mjs.map +1 -0
  311. package/dist/development/core/cart/cookie.d.mts +5 -0
  312. package/dist/development/core/cart/cookie.mjs +28 -0
  313. package/dist/development/core/cart/cookie.mjs.map +1 -0
  314. package/dist/development/core/cart/form.d.mts +130 -0
  315. package/dist/development/core/cart/form.mjs +75 -0
  316. package/dist/development/core/cart/form.mjs.map +1 -0
  317. package/dist/development/core/cart/get-cart.d.mts +25 -0
  318. package/dist/development/core/cart/get-cart.mjs +32 -0
  319. package/dist/development/core/cart/get-cart.mjs.map +1 -0
  320. package/dist/development/core/cart/index.d.mts +10 -0
  321. package/dist/development/core/cart/quantity.d.mts +10 -0
  322. package/dist/development/core/cart/quantity.mjs +14 -0
  323. package/dist/development/core/cart/quantity.mjs.map +1 -0
  324. package/dist/development/core/cart/queries.d.mts +4296 -0
  325. package/dist/development/core/cart/queries.mjs +70 -0
  326. package/dist/development/core/cart/queries.mjs.map +1 -0
  327. package/dist/development/core/cart/server-handlers.d.mts +82 -0
  328. package/dist/development/core/cart/server-handlers.mjs +322 -0
  329. package/dist/development/core/cart/server-handlers.mjs.map +1 -0
  330. package/dist/development/core/cart/state.d.mts +137 -0
  331. package/dist/development/core/cart/state.mjs +76 -0
  332. package/dist/development/core/cart/state.mjs.map +1 -0
  333. package/dist/development/core/cart/sync-quantity-inputs.mjs +16 -0
  334. package/dist/development/core/cart/sync-quantity-inputs.mjs.map +1 -0
  335. package/dist/development/core/collection/collection.d.mts +134 -0
  336. package/dist/development/core/collection/collection.mjs +170 -0
  337. package/dist/development/core/collection/collection.mjs.map +1 -0
  338. package/dist/development/core/collection/index.d.mts +6 -0
  339. package/dist/development/core/collection/reconciler.d.mts +32 -0
  340. package/dist/development/core/collection/reconciler.mjs +89 -0
  341. package/dist/development/core/collection/reconciler.mjs.map +1 -0
  342. package/dist/development/core/collection/state.d.mts +66 -0
  343. package/dist/development/core/collection/state.mjs +20 -0
  344. package/dist/development/core/collection/state.mjs.map +1 -0
  345. package/dist/development/core/collection/url.d.mts +71 -0
  346. package/dist/development/core/collection/url.mjs +376 -0
  347. package/dist/development/core/collection/url.mjs.map +1 -0
  348. package/dist/development/core/constants.mjs +7 -0
  349. package/dist/development/core/constants.mjs.map +1 -0
  350. package/dist/development/core/development.d.mts +56 -0
  351. package/dist/development/core/development.mjs +45 -0
  352. package/dist/development/core/headers.mjs +43 -0
  353. package/dist/development/core/headers.mjs.map +1 -0
  354. package/dist/development/core/index.d.mts +54 -0
  355. package/dist/development/core/logging/logging.d.mts +21 -0
  356. package/dist/development/core/logging/logging.mjs +99 -0
  357. package/dist/development/core/logging/logging.mjs.map +1 -0
  358. package/dist/development/core/logging/types.d.mts +40 -0
  359. package/dist/development/core/logging/types.mjs +18 -0
  360. package/dist/development/core/logging/types.mjs.map +1 -0
  361. package/dist/development/core/money/cache.mjs +25 -0
  362. package/dist/development/core/money/cache.mjs.map +1 -0
  363. package/dist/development/core/money/format.d.mts +15 -0
  364. package/dist/development/core/money/format.mjs +243 -0
  365. package/dist/development/core/money/format.mjs.map +1 -0
  366. package/dist/development/core/money/types.d.mts +47 -0
  367. package/dist/development/core/observable.mjs +46 -0
  368. package/dist/development/core/observable.mjs.map +1 -0
  369. package/dist/development/core/predictive-search/constants.d.mts +5 -0
  370. package/dist/development/core/predictive-search/constants.mjs +6 -0
  371. package/dist/development/core/predictive-search/constants.mjs.map +1 -0
  372. package/dist/development/core/predictive-search/form.d.mts +31 -0
  373. package/dist/development/core/predictive-search/form.mjs +31 -0
  374. package/dist/development/core/predictive-search/form.mjs.map +1 -0
  375. package/dist/development/core/predictive-search/index.d.mts +6 -0
  376. package/dist/development/core/predictive-search/queries.d.mts +118 -0
  377. package/dist/development/core/predictive-search/queries.mjs +81 -0
  378. package/dist/development/core/predictive-search/queries.mjs.map +1 -0
  379. package/dist/development/core/predictive-search/search.d.mts +32 -0
  380. package/dist/development/core/predictive-search/search.mjs +74 -0
  381. package/dist/development/core/predictive-search/search.mjs.map +1 -0
  382. package/dist/development/core/predictive-search/server-handlers.d.mts +36 -0
  383. package/dist/development/core/predictive-search/server-handlers.mjs +113 -0
  384. package/dist/development/core/predictive-search/server-handlers.mjs.map +1 -0
  385. package/dist/development/core/predictive-search/store.d.mts +44 -0
  386. package/dist/development/core/predictive-search/store.mjs +224 -0
  387. package/dist/development/core/predictive-search/store.mjs.map +1 -0
  388. package/dist/development/core/predictive-search/url.d.mts +41 -0
  389. package/dist/development/core/predictive-search/url.mjs +71 -0
  390. package/dist/development/core/predictive-search/url.mjs.map +1 -0
  391. package/dist/development/core/product/accept-variant-id.mjs +98 -0
  392. package/dist/development/core/product/accept-variant-id.mjs.map +1 -0
  393. package/dist/development/core/product/form.d.mts +63 -0
  394. package/dist/development/core/product/form.mjs +44 -0
  395. package/dist/development/core/product/form.mjs.map +1 -0
  396. package/dist/development/core/product/index.d.mts +5 -0
  397. package/dist/development/core/product/options.d.mts +43 -0
  398. package/dist/development/core/product/options.mjs +296 -0
  399. package/dist/development/core/product/options.mjs.map +1 -0
  400. package/dist/development/core/product/product-form.d.mts +72 -0
  401. package/dist/development/core/product/product-form.mjs +158 -0
  402. package/dist/development/core/product/product-form.mjs.map +1 -0
  403. package/dist/development/core/product/state.d.mts +68 -0
  404. package/dist/development/core/product/url.d.mts +47 -0
  405. package/dist/development/core/product/url.mjs +69 -0
  406. package/dist/development/core/product/url.mjs.map +1 -0
  407. package/dist/development/core/request-context.d.mts +75 -0
  408. package/dist/development/core/request-context.mjs +141 -0
  409. package/dist/development/core/request-context.mjs.map +1 -0
  410. package/dist/development/core/request-routing/handle-shopify-redirects.d.mts +17 -0
  411. package/dist/development/core/request-routing/handle-shopify-redirects.mjs +31 -0
  412. package/dist/development/core/request-routing/handle-shopify-redirects.mjs.map +1 -0
  413. package/dist/development/core/request-routing/handle-shopify-routes.d.mts +1 -0
  414. package/dist/development/core/request-routing/handle-shopify-routes.development.d.mts +11 -0
  415. package/dist/development/core/request-routing/handle-shopify-routes.development.mjs +16 -0
  416. package/dist/development/core/request-routing/handle-shopify-routes.development.mjs.map +1 -0
  417. package/dist/development/core/request-routing/handle-shopify-routes.mjs +42 -0
  418. package/dist/development/core/request-routing/handle-shopify-routes.mjs.map +1 -0
  419. package/dist/development/core/request-routing/interceptors/admin-redirect.mjs +12 -0
  420. package/dist/development/core/request-routing/interceptors/admin-redirect.mjs.map +1 -0
  421. package/dist/development/core/request-routing/interceptors/ajax-api.mjs +16 -0
  422. package/dist/development/core/request-routing/interceptors/ajax-api.mjs.map +1 -0
  423. package/dist/development/core/request-routing/interceptors/api-proxy.mjs +20 -0
  424. package/dist/development/core/request-routing/interceptors/api-proxy.mjs.map +1 -0
  425. package/dist/development/core/request-routing/interceptors/checkout.mjs +58 -0
  426. package/dist/development/core/request-routing/interceptors/checkout.mjs.map +1 -0
  427. package/dist/development/core/request-routing/interceptors/graphiql.mjs +46 -0
  428. package/dist/development/core/request-routing/interceptors/graphiql.mjs.map +1 -0
  429. package/dist/development/core/request-routing/interceptors/mcp-proxy.mjs +23 -0
  430. package/dist/development/core/request-routing/interceptors/mcp-proxy.mjs.map +1 -0
  431. package/dist/development/core/request-routing/interceptors/proxy.mjs +73 -0
  432. package/dist/development/core/request-routing/interceptors/proxy.mjs.map +1 -0
  433. package/dist/development/core/request-routing/interceptors/query-param-redirect.mjs +22 -0
  434. package/dist/development/core/request-routing/interceptors/query-param-redirect.mjs.map +1 -0
  435. package/dist/development/core/request-routing/interceptors/sfapi-proxy.mjs +27 -0
  436. package/dist/development/core/request-routing/interceptors/sfapi-proxy.mjs.map +1 -0
  437. package/dist/development/core/request-routing/interceptors/standard-routes.mjs +19 -0
  438. package/dist/development/core/request-routing/interceptors/standard-routes.mjs.map +1 -0
  439. package/dist/development/core/request-routing/interceptors/url-redirects.mjs +27 -0
  440. package/dist/development/core/request-routing/interceptors/url-redirects.mjs.map +1 -0
  441. package/dist/development/core/request-routing/interceptors/well-known.mjs +22 -0
  442. package/dist/development/core/request-routing/interceptors/well-known.mjs.map +1 -0
  443. package/dist/development/core/request-routing/registered-routes.d.mts +7 -0
  444. package/dist/development/core/request-routing/registered-routes.mjs +72 -0
  445. package/dist/development/core/request-routing/registered-routes.mjs.map +1 -0
  446. package/dist/development/core/request-routing/route-types.d.mts +56 -0
  447. package/dist/development/core/request-routing/safe-apply-response-headers.mjs +16 -0
  448. package/dist/development/core/request-routing/safe-apply-response-headers.mjs.map +1 -0
  449. package/dist/development/core/shop-pay/shop-pay.d.mts +102 -0
  450. package/dist/development/core/shop-pay/shop-pay.mjs +289 -0
  451. package/dist/development/core/shop-pay/shop-pay.mjs.map +1 -0
  452. package/dist/development/core/shopify-scripts/analytics.mjs +26 -0
  453. package/dist/development/core/shopify-scripts/analytics.mjs.map +1 -0
  454. package/dist/development/core/shopify-scripts/consent.mjs +17 -0
  455. package/dist/development/core/shopify-scripts/consent.mjs.map +1 -0
  456. package/dist/development/core/shopify-scripts/constants.mjs +19 -0
  457. package/dist/development/core/shopify-scripts/constants.mjs.map +1 -0
  458. package/dist/development/core/shopify-scripts/deprecated-cookies.mjs +97 -0
  459. package/dist/development/core/shopify-scripts/deprecated-cookies.mjs.map +1 -0
  460. package/dist/development/core/shopify-scripts/global.d.mts +1 -0
  461. package/dist/development/core/shopify-scripts/global.mjs +86 -0
  462. package/dist/development/core/shopify-scripts/global.mjs.map +1 -0
  463. package/dist/development/core/shopify-scripts/index.d.mts +27 -0
  464. package/dist/development/core/shopify-scripts/index.mjs +145 -0
  465. package/dist/development/core/shopify-scripts/index.mjs.map +1 -0
  466. package/dist/development/core/shopify-scripts/initialize.d.mts +18 -0
  467. package/dist/development/core/shopify-scripts/initialize.mjs +27 -0
  468. package/dist/development/core/shopify-scripts/initialize.mjs.map +1 -0
  469. package/dist/development/core/shopify-scripts/page-view.mjs +49 -0
  470. package/dist/development/core/shopify-scripts/page-view.mjs.map +1 -0
  471. package/dist/development/core/shopify-scripts/perfkit.mjs +33 -0
  472. package/dist/development/core/shopify-scripts/perfkit.mjs.map +1 -0
  473. package/dist/development/core/shopify-scripts/render.d.mts +1 -0
  474. package/dist/development/core/shopify-scripts/render.mjs +23 -0
  475. package/dist/development/core/shopify-scripts/render.mjs.map +1 -0
  476. package/dist/development/core/shopify-scripts/types.d.mts +76 -0
  477. package/dist/development/core/shopify-scripts/utils/cookie-domain.mjs +43 -0
  478. package/dist/development/core/shopify-scripts/utils/cookie-domain.mjs.map +1 -0
  479. package/dist/development/core/shopify-scripts/utils/inline-script.mjs +8 -0
  480. package/dist/development/core/shopify-scripts/utils/inline-script.mjs.map +1 -0
  481. package/dist/development/core/shopify-scripts/utils/navigation.mjs +46 -0
  482. package/dist/development/core/shopify-scripts/utils/navigation.mjs.map +1 -0
  483. package/dist/development/core/shopify-scripts/utils/tracking-values.mjs +65 -0
  484. package/dist/development/core/shopify-scripts/utils/tracking-values.mjs.map +1 -0
  485. package/dist/development/core/shopify-scripts/utils/uuid.mjs +17 -0
  486. package/dist/development/core/shopify-scripts/utils/uuid.mjs.map +1 -0
  487. package/dist/development/core/shopify-scripts/webmcp.mjs +22 -0
  488. package/dist/development/core/shopify-scripts/webmcp.mjs.map +1 -0
  489. package/dist/development/core/standard-routes/build.d.mts +34 -0
  490. package/dist/development/core/standard-routes/build.mjs +54 -0
  491. package/dist/development/core/standard-routes/build.mjs.map +1 -0
  492. package/dist/development/core/standard-routes/defaults.mjs +31 -0
  493. package/dist/development/core/standard-routes/defaults.mjs.map +1 -0
  494. package/dist/development/core/standard-routes/match.mjs +108 -0
  495. package/dist/development/core/standard-routes/match.mjs.map +1 -0
  496. package/dist/development/core/standard-routes/path.mjs +58 -0
  497. package/dist/development/core/standard-routes/path.mjs.map +1 -0
  498. package/dist/development/core/standard-routes/redirects.mjs +51 -0
  499. package/dist/development/core/standard-routes/redirects.mjs.map +1 -0
  500. package/dist/development/core/standard-routes/types.d.mts +95 -0
  501. package/dist/development/core/types.d.mts +11 -0
  502. package/dist/development/core/url.mjs +42 -0
  503. package/dist/development/core/url.mjs.map +1 -0
  504. package/dist/development/core/utils/load-script.mjs +34 -0
  505. package/dist/development/core/utils/load-script.mjs.map +1 -0
  506. package/dist/development/core/utils/parse-gid.mjs +33 -0
  507. package/dist/development/core/utils/parse-gid.mjs.map +1 -0
  508. package/dist/development/customer-account/session.d.mts +46 -0
  509. package/dist/development/customer-account/session.mjs +21 -0
  510. package/dist/development/customer-account/session.mjs.map +1 -0
  511. package/dist/development/globals.d.mts +64 -0
  512. package/dist/development/graphql/generated/customer-account-api-types.d.mts +13 -0
  513. package/dist/development/graphql/generated/graphql-env.d.mts +19280 -0
  514. package/dist/development/graphql/generated/storefront-api-types.d.mts +47 -0
  515. package/dist/development/graphql/graphql.d.mts +40 -0
  516. package/dist/development/graphql/graphql.mjs +16 -0
  517. package/dist/development/graphql/graphql.mjs.map +1 -0
  518. package/dist/development/graphql/index.d.mts +2 -0
  519. package/dist/development/graphql/scalars.d.mts +15 -0
  520. package/dist/development/graphql/type-resolver.d.mts +229 -0
  521. package/dist/development/react/cart.d.mts +44 -0
  522. package/dist/development/react/cart.mjs +155 -0
  523. package/dist/development/react/cart.mjs.map +1 -0
  524. package/dist/development/react/collection.d.mts +91 -0
  525. package/dist/development/react/collection.mjs +129 -0
  526. package/dist/development/react/collection.mjs.map +1 -0
  527. package/dist/development/react/index.d.mts +13 -0
  528. package/dist/development/react/index.mjs +10 -0
  529. package/dist/development/react/predictive-search.d.mts +49 -0
  530. package/dist/development/react/predictive-search.mjs +133 -0
  531. package/dist/development/react/predictive-search.mjs.map +1 -0
  532. package/dist/development/react/product.d.mts +72 -0
  533. package/dist/development/react/product.mjs +127 -0
  534. package/dist/development/react/product.mjs.map +1 -0
  535. package/dist/development/react/shop-pay.d.mts +9 -0
  536. package/dist/development/react/shop-pay.mjs +16 -0
  537. package/dist/development/react/shop-pay.mjs.map +1 -0
  538. package/dist/development/react/shopify-scripts.d.mts +20 -0
  539. package/dist/development/react/shopify-scripts.mjs +39 -0
  540. package/dist/development/react/shopify-scripts.mjs.map +1 -0
  541. package/dist/development/vendor/standard-actions.d.mts +134 -0
  542. package/dist/development/vendor/standard-events.d.mts +1107 -0
  543. package/dist/development/vue/cart.d.mts +46 -0
  544. package/dist/development/vue/cart.mjs +122 -0
  545. package/dist/development/vue/cart.mjs.map +1 -0
  546. package/dist/development/vue/collection.d.mts +46 -0
  547. package/dist/development/vue/collection.mjs +108 -0
  548. package/dist/development/vue/collection.mjs.map +1 -0
  549. package/dist/development/vue/index.d.mts +11 -0
  550. package/dist/development/vue/index.mjs +8 -0
  551. package/dist/development/vue/predictive-search.d.mts +124 -0
  552. package/dist/development/vue/predictive-search.mjs +171 -0
  553. package/dist/development/vue/predictive-search.mjs.map +1 -0
  554. package/dist/development/vue/product.d.mts +57 -0
  555. package/dist/development/vue/product.mjs +167 -0
  556. package/dist/development/vue/product.mjs.map +1 -0
  557. package/dist/development/vue/shop-pay.d.mts +25 -0
  558. package/dist/development/vue/shop-pay.mjs +35 -0
  559. package/dist/development/vue/shop-pay.mjs.map +1 -0
  560. package/dist/development/vue/shopify-scripts.d.mts +127 -0
  561. package/dist/development/vue/shopify-scripts.mjs +79 -0
  562. package/dist/development/vue/shopify-scripts.mjs.map +1 -0
  563. package/dist/globals.d.mts +64 -0
  564. package/dist/graphql/generated/customer-account-api-types.d.mts +13 -0
  565. package/dist/graphql/generated/customer-account-graphql-env.d.mts +22170 -0
  566. package/dist/graphql/generated/graphql-env.d.mts +19280 -0
  567. package/dist/graphql/generated/storefront-api-types.d.mts +47 -0
  568. package/dist/graphql/graphql.d.mts +40 -0
  569. package/dist/graphql/graphql.mjs +16 -0
  570. package/dist/graphql/graphql.mjs.map +1 -0
  571. package/dist/graphql/index.d.mts +2 -0
  572. package/dist/graphql/scalars.d.mts +26 -0
  573. package/dist/graphql/type-resolver.d.mts +229 -0
  574. package/dist/react/cart.d.mts +44 -0
  575. package/dist/react/cart.mjs +155 -0
  576. package/dist/react/cart.mjs.map +1 -0
  577. package/dist/react/collection.d.mts +91 -0
  578. package/dist/react/collection.mjs +129 -0
  579. package/dist/react/collection.mjs.map +1 -0
  580. package/dist/react/index.d.mts +13 -0
  581. package/dist/react/index.mjs +10 -0
  582. package/dist/react/predictive-search.d.mts +49 -0
  583. package/dist/react/predictive-search.mjs +133 -0
  584. package/dist/react/predictive-search.mjs.map +1 -0
  585. package/dist/react/product.d.mts +72 -0
  586. package/dist/react/product.mjs +127 -0
  587. package/dist/react/product.mjs.map +1 -0
  588. package/dist/react/shop-pay.d.mts +9 -0
  589. package/dist/react/shop-pay.mjs +16 -0
  590. package/dist/react/shop-pay.mjs.map +1 -0
  591. package/dist/react/shopify-scripts.d.mts +20 -0
  592. package/dist/react/shopify-scripts.mjs +39 -0
  593. package/dist/react/shopify-scripts.mjs.map +1 -0
  594. package/dist/storefront-api-types.d.ts +2351 -2390
  595. package/dist/storefront.schema.json +41534 -1
  596. package/dist/ts-plugin/index.cjs +68 -0
  597. package/dist/ts-plugin/index.cjs.map +1 -0
  598. package/dist/ts-plugin/index.d.cts +4 -0
  599. package/dist/vendor/standard-actions.d.mts +134 -0
  600. package/dist/vendor/standard-events.d.mts +1107 -0
  601. package/dist/vite/certificate-prompt.mjs +24 -0
  602. package/dist/vite/certificate-prompt.mjs.map +1 -0
  603. package/dist/vite/index.d.mts +2 -0
  604. package/dist/vite/index.mjs +3 -0
  605. package/dist/vite/local-https.d.mts +47 -0
  606. package/dist/vite/local-https.mjs +276 -0
  607. package/dist/vite/local-https.mjs.map +1 -0
  608. package/dist/vite/mkcert.mjs +141 -0
  609. package/dist/vite/mkcert.mjs.map +1 -0
  610. package/dist/vue/cart.d.mts +46 -0
  611. package/dist/vue/cart.mjs +122 -0
  612. package/dist/vue/cart.mjs.map +1 -0
  613. package/dist/vue/collection.d.mts +46 -0
  614. package/dist/vue/collection.mjs +108 -0
  615. package/dist/vue/collection.mjs.map +1 -0
  616. package/dist/vue/index.d.mts +11 -0
  617. package/dist/vue/index.mjs +8 -0
  618. package/dist/vue/predictive-search.d.mts +124 -0
  619. package/dist/vue/predictive-search.mjs +171 -0
  620. package/dist/vue/predictive-search.mjs.map +1 -0
  621. package/dist/vue/product.d.mts +57 -0
  622. package/dist/vue/product.mjs +167 -0
  623. package/dist/vue/product.mjs.map +1 -0
  624. package/dist/vue/shop-pay.d.mts +25 -0
  625. package/dist/vue/shop-pay.mjs +35 -0
  626. package/dist/vue/shop-pay.mjs.map +1 -0
  627. package/dist/vue/shopify-scripts.d.mts +127 -0
  628. package/dist/vue/shopify-scripts.mjs +79 -0
  629. package/dist/vue/shopify-scripts.mjs.map +1 -0
  630. package/package.json +116 -86
  631. package/skills/hydrogen-analytics/SKILL.md +80 -0
  632. package/skills/hydrogen-analytics/references/react.md +160 -0
  633. package/skills/hydrogen-analytics/references/vue.md +80 -0
  634. package/skills/hydrogen-cart-drawer/SKILL.md +248 -0
  635. package/skills/hydrogen-cart-drawer/references/accessibility.md +109 -0
  636. package/skills/hydrogen-cart-drawer/references/css.md +67 -0
  637. package/skills/hydrogen-cart-ui/SKILL.md +224 -0
  638. package/skills/hydrogen-cart-ui/references/nextjs.md +89 -0
  639. package/skills/hydrogen-cart-ui/references/react.md +285 -0
  640. package/skills/hydrogen-cart-ui/references/vue.md +228 -0
  641. package/skills/hydrogen-collection-browser/SKILL.md +83 -0
  642. package/skills/hydrogen-collection-browser/references/nextjs.md +118 -0
  643. package/skills/hydrogen-collection-browser/references/nuxt.md +108 -0
  644. package/skills/hydrogen-collection-browser/references/react.md +301 -0
  645. package/skills/hydrogen-customer-account/SKILL.md +107 -0
  646. package/skills/hydrogen-image/SKILL.md +65 -0
  647. package/skills/hydrogen-local-https/SKILL.md +142 -0
  648. package/skills/hydrogen-markets/SKILL.md +221 -0
  649. package/skills/hydrogen-markets/references/nextjs.md +157 -0
  650. package/skills/hydrogen-money/SKILL.md +67 -0
  651. package/skills/hydrogen-oxygen/SKILL.md +245 -0
  652. package/skills/hydrogen-oxygen/references/react-router.md +230 -0
  653. package/skills/hydrogen-predictive-search/SKILL.md +130 -0
  654. package/skills/hydrogen-predictive-search/references/react.md +32 -0
  655. package/skills/hydrogen-predictive-search/references/vue.md +40 -0
  656. package/skills/hydrogen-request-handlers/SKILL.md +107 -0
  657. package/skills/hydrogen-request-handlers/references/frameworks.md +179 -0
  658. package/skills/hydrogen-request-handlers/references/nextjs.md +137 -0
  659. package/skills/hydrogen-request-handlers/references/nuxt.md +215 -0
  660. package/skills/hydrogen-routing/SKILL.md +171 -0
  661. package/skills/hydrogen-setup/SKILL.md +50 -0
  662. package/skills/hydrogen-setup/references/analytics.md +624 -0
  663. package/skills/hydrogen-setup/steps/1-inspect-app.md +62 -0
  664. package/skills/hydrogen-setup/steps/10-analytics.md +10 -0
  665. package/skills/hydrogen-setup/steps/11-verify.md +31 -0
  666. package/skills/hydrogen-setup/steps/2-scaffold.md +86 -0
  667. package/skills/hydrogen-setup/steps/3-build-home-page.md +37 -0
  668. package/skills/hydrogen-setup/steps/4-collection-and-search.md +14 -0
  669. package/skills/hydrogen-setup/steps/5-cart.md +10 -0
  670. package/skills/hydrogen-setup/steps/6-product-detail-page.md +416 -0
  671. package/skills/hydrogen-setup/steps/7-shopify-runtime-scripts.md +69 -0
  672. package/skills/hydrogen-setup/steps/8-cart-drawer-and-navbar.md +35 -0
  673. package/skills/hydrogen-setup/steps/9-account-page.md +54 -0
  674. package/skills/hydrogen-shop-pay/SKILL.md +79 -0
  675. package/skills/hydrogen-shop-pay/references/core.md +66 -0
  676. package/skills/hydrogen-shop-pay/references/react.md +50 -0
  677. package/skills/hydrogen-shop-pay/references/vue.md +39 -0
  678. package/skills/hydrogen-smoke-test/SKILL.md +205 -0
  679. package/skills/hydrogen-storefront-client/SKILL.md +322 -0
  680. package/skills/hydrogen-storefront-client/references/astro.md +125 -0
  681. package/skills/hydrogen-storefront-client/references/caching.md +25 -0
  682. package/skills/hydrogen-storefront-client/references/nextjs.md +121 -0
  683. package/skills/hydrogen-storefront-client/references/nuxt.md +121 -0
  684. package/skills/hydrogen-storefront-client/references/query-validation.md +95 -0
  685. package/skills/hydrogen-storefront-client/references/react-router.md +81 -0
  686. package/skills/hydrogen-storefront-client/references/solidstart.md +131 -0
  687. package/skills/hydrogen-storefront-client/references/sveltekit.md +169 -0
  688. package/skills/hydrogen-variant-form/SKILL.md +267 -0
  689. package/skills/hydrogen-variant-form/references/nextjs.md +207 -0
  690. package/skills/hydrogen-variant-form/references/nuxt.md +95 -0
  691. package/skills/hydrogen-variant-form/references/react.md +71 -0
  692. package/dist/dev/get-virtual-routes-H72465VB.js +0 -74
  693. package/dist/dev/hydrogen-routes.d.ts +0 -5
  694. package/dist/dev/hydrogen-routes.js +0 -25
  695. package/dist/development/get-virtual-routes-ACFZHU42.js +0 -71
  696. package/dist/development/get-virtual-routes-ACFZHU42.js.map +0 -1
  697. package/dist/development/index.cjs +0 -6978
  698. package/dist/development/index.cjs.map +0 -1
  699. package/dist/development/index.js +0 -6631
  700. package/dist/development/index.js.map +0 -1
  701. package/dist/development/log-seo-tags-IG37ONQ2.js +0 -74
  702. package/dist/development/log-seo-tags-IG37ONQ2.js.map +0 -1
  703. package/dist/development/react-router-preset.d.ts +0 -45
  704. package/dist/development/react-router-preset.js +0 -49
  705. package/dist/development/react-router-preset.js.map +0 -1
  706. package/dist/index.cjs +0 -1
  707. package/dist/oxygen/index.d.ts +0 -197
  708. package/dist/oxygen/index.js +0 -107
  709. package/dist/production/get-virtual-routes-ZZEGQQDV.js +0 -3
  710. package/dist/production/get-virtual-routes-ZZEGQQDV.js.map +0 -1
  711. package/dist/production/index.cjs +0 -1019
  712. package/dist/production/index.cjs.map +0 -1
  713. package/dist/production/index.d.cts +0 -3260
  714. package/dist/production/index.d.ts +0 -3260
  715. package/dist/production/index.js +0 -1019
  716. package/dist/production/index.js.map +0 -1
  717. package/dist/production/log-seo-tags-TY72EQWZ.js +0 -2
  718. package/dist/production/log-seo-tags-TY72EQWZ.js.map +0 -1
  719. package/dist/production/react-router-preset.d.ts +0 -45
  720. package/dist/production/react-router-preset.js +0 -11
  721. package/dist/react-router.d.ts +0 -75
  722. package/dist/vite/chunk-4O5OI3OO.js +0 -127
  723. package/dist/vite/chunk-FAQ7TVHC.js +0 -9
  724. package/dist/vite/chunk-QXBQVDMY.js +0 -68
  725. package/dist/vite/compat-date.d.ts +0 -3
  726. package/dist/vite/compat-date.js +0 -6
  727. package/dist/vite/get-virtual-routes.d.ts +0 -21
  728. package/dist/vite/get-virtual-routes.js +0 -74
  729. package/dist/vite/hydrogen-middleware.d.ts +0 -9
  730. package/dist/vite/hydrogen-middleware.js +0 -7
  731. package/dist/vite/plugin.d.ts +0 -22
  732. package/dist/vite/plugin.js +0 -171
  733. package/dist/vite/request-events.d.ts +0 -144
  734. package/dist/vite/request-events.js +0 -10
  735. package/dist/vite/types.d.ts +0 -5
  736. package/dist/vite/types.js +0 -0
  737. package/dist/vite/virtual-routes/assets/debug-network.css +0 -609
  738. package/dist/vite/virtual-routes/assets/favicon-dark.svg +0 -20
  739. package/dist/vite/virtual-routes/assets/favicon.svg +0 -28
  740. package/dist/vite/virtual-routes/assets/inter-variable-font.woff2 +0 -0
  741. package/dist/vite/virtual-routes/assets/jetbrainsmono-variable-font.woff2 +0 -0
  742. package/dist/vite/virtual-routes/assets/styles.css +0 -249
  743. package/dist/vite/virtual-routes/components/FlameChartWrapper.jsx +0 -123
  744. package/dist/vite/virtual-routes/components/HydrogenLogoBaseBW.jsx +0 -32
  745. package/dist/vite/virtual-routes/components/HydrogenLogoBaseColor.jsx +0 -47
  746. package/dist/vite/virtual-routes/components/IconBanner.jsx +0 -292
  747. package/dist/vite/virtual-routes/components/IconClose.jsx +0 -38
  748. package/dist/vite/virtual-routes/components/IconDiscard.jsx +0 -44
  749. package/dist/vite/virtual-routes/components/IconError.jsx +0 -61
  750. package/dist/vite/virtual-routes/components/IconGithub.jsx +0 -23
  751. package/dist/vite/virtual-routes/components/IconTwitter.jsx +0 -21
  752. package/dist/vite/virtual-routes/components/Layout.jsx +0 -7
  753. package/dist/vite/virtual-routes/components/RequestDetails.jsx +0 -171
  754. package/dist/vite/virtual-routes/components/RequestTable.jsx +0 -91
  755. package/dist/vite/virtual-routes/components/RequestWaterfall.jsx +0 -151
  756. package/dist/vite/virtual-routes/layout.jsx +0 -33
  757. package/dist/vite/virtual-routes/lib/useDebugNetworkServer.jsx +0 -178
  758. package/dist/vite/virtual-routes/routes/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.jsx +0 -37
  759. package/dist/vite/virtual-routes/routes/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.tsx +0 -79
  760. package/dist/vite/virtual-routes/routes/graphiql.jsx +0 -5
  761. package/dist/vite/virtual-routes/routes/index.jsx +0 -265
  762. package/dist/vite/virtual-routes/routes/subrequest-profiler.jsx +0 -243
  763. package/dist/vite/virtual-routes/virtual-root-with-layout.jsx +0 -63
  764. package/dist/vite/virtual-routes/virtual-root.jsx +0 -67
@@ -0,0 +1,733 @@
1
+ import { getLogger } from "../core/logging/logging.mjs";
2
+ import { DEFAULT_TIMEOUT_IN_MS } from "../core/constants.mjs";
3
+ import { CUSTOMER_ACCOUNT_PATHS } from "../core/url.mjs";
4
+ import { createCallableRouteHandler } from "../core/request-routing/registered-routes.mjs";
5
+ import { getCartBuyerIdentitySync } from "../core/cart/buyer-identity-sync.mjs";
6
+ import { CustomerAccountApiError, CustomerAccountOAuthError } from "./errors.mjs";
7
+
8
+ //#region src/customer-account/session.ts
9
+ const log = getLogger("customer-account");
10
+ const CUSTOMER_ACCOUNT_AUTHORIZE_PATH = CUSTOMER_ACCOUNT_PATHS.authorize;
11
+ const CUSTOMER_ACCOUNT_LOGIN_PATH = CUSTOMER_ACCOUNT_PATHS.login;
12
+ const CUSTOMER_ACCOUNT_LOGOUT_PATH = CUSTOMER_ACCOUNT_PATHS.logout;
13
+ const CUSTOMER_ACCOUNT_REFRESH_PATH = CUSTOMER_ACCOUNT_PATHS.refresh;
14
+ const CUSTOMER_ACCOUNT_SESSION_KEY = "customerAccount";
15
+ const DEFAULT_LOGIN_RETURN_TO_PATH = "/account";
16
+ const DEFAULT_POST_LOGIN_REDIRECT_PATHNAME = "/";
17
+ const DEFAULT_POST_LOGOUT_REDIRECT_URI = "/";
18
+ const FAILED_LOGIN_PATH = "/account?login=failed";
19
+ const FORBIDDEN_STATUS = 403;
20
+ const FORBIDDEN_ERROR_CODE = "forbidden";
21
+ const FORBIDDEN_ERROR_MESSAGE = "Forbidden";
22
+ const NO_STORE_CACHE_CONTROL = "no-store";
23
+ const AUTHORIZATION_CODE_GRANT_TYPE = "authorization_code";
24
+ const REFRESH_TOKEN_GRANT_TYPE = "refresh_token";
25
+ const CUSTOMER_ACCOUNT_SCOPE = "openid email customer-account-api:full";
26
+ const CODE_CHALLENGE_METHOD = "S256";
27
+ const USER_AGENT = `Hydrogen 2026.10.0-preview.2`;
28
+ const EXPIRY_BUFFER_IN_SECONDS = 120;
29
+ const PENDING_LOGIN_TTL_IN_MINUTES = 10;
30
+ const SECONDS_PER_MINUTE = 60;
31
+ const MILLISECONDS_PER_SECOND = 1e3;
32
+ const PENDING_LOGIN_TTL_IN_MS = PENDING_LOGIN_TTL_IN_MINUTES * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND;
33
+ const RANDOM_BYTES_LENGTH = 32;
34
+ const MAX_RETURN_TO_LENGTH_IN_BYTES = 2048;
35
+ const MAX_SET_TIMEOUT_IN_MS = 2147483647;
36
+ const SHOP_ID_RE = /^\d+$/;
37
+ const CUSTOMER_SESSION_ACCESS_TOKEN_PERSONALIZATION_REASON = "customer-session-access-token";
38
+ const CUSTOMER_SESSION_MUTATION_PERSONALIZATION_REASON = "customer-session-mutation";
39
+ const CUSTOMER_SESSION_INTERNAL_BRAND = Symbol("hydrogen.customerSessionInternal");
40
+ const customerSessionInternals = /* @__PURE__ */ new WeakMap();
41
+ function createCustomerSession({ shopId, customerAccountApiClientId, customerAccountApiUrl, fetch: customFetch, defaultTimeoutInMs = DEFAULT_TIMEOUT_IN_MS }) {
42
+ if (typeof document !== "undefined") throw new Error("Customer Account OAuth sessions cannot be used in a browser context. Use this helper from server or edge routes only.");
43
+ validateShopId(shopId);
44
+ validateCustomerAccountApiClientId(customerAccountApiClientId);
45
+ validateTimeout(defaultTimeoutInMs);
46
+ const fetch = customFetch ?? globalThis.fetch;
47
+ if (typeof fetch !== "function") throw new Error("No fetch function available. Pass a fetch option or ensure globalThis.fetch exists.");
48
+ const endpoints = createCustomerAccountEndpoints(shopId, customerAccountApiUrl);
49
+ const refreshFlights = /* @__PURE__ */ new Map();
50
+ async function getAccessToken(sessionManager, requestContext) {
51
+ requestContext.markResponseAsPersonalized(CUSTOMER_SESSION_ACCESS_TOKEN_PERSONALIZATION_REASON);
52
+ return getUsableAccessToken(await readSessionData(sessionManager));
53
+ }
54
+ async function getOrRefreshAccessToken(sessionManager, requestContext, options = {}) {
55
+ return (await getOrRefreshAccessTokenResult(sessionManager, requestContext, options)).accessToken;
56
+ }
57
+ async function getOrRefreshAccessTokenResult(sessionManager, requestContext, options = {}) {
58
+ requestContext.markResponseAsPersonalized(CUSTOMER_SESSION_ACCESS_TOKEN_PERSONALIZATION_REASON);
59
+ const sessionData = await readSessionData(sessionManager);
60
+ const accessToken = getUsableAccessToken(sessionData);
61
+ if (accessToken) return {
62
+ status: "authenticated",
63
+ accessToken
64
+ };
65
+ const refreshToken = getRefreshToken(sessionData);
66
+ if (!refreshToken) return {
67
+ status: "unauthenticated",
68
+ accessToken: void 0
69
+ };
70
+ const origin = await getResolvedOrigin(sessionManager, options.origin);
71
+ const idToken = sessionData.tokens?.idToken;
72
+ const refreshResult = await getRefreshResult({
73
+ refreshFlights,
74
+ refreshToken,
75
+ idToken,
76
+ origin,
77
+ endpoints,
78
+ customerAccountApiClientId,
79
+ fetch,
80
+ timeoutInMs: defaultTimeoutInMs
81
+ });
82
+ if (refreshResult.type === "success") {
83
+ const refreshedAccessToken = refreshResult.tokens.accessToken;
84
+ if (!refreshedAccessToken) return {
85
+ status: "transient",
86
+ accessToken: void 0
87
+ };
88
+ await writeTokens(sessionManager, refreshResult.tokens);
89
+ return {
90
+ status: "authenticated",
91
+ accessToken: refreshedAccessToken
92
+ };
93
+ }
94
+ if (refreshResult.type === "invalid") {
95
+ await clearTokens(sessionManager);
96
+ return {
97
+ status: "unauthenticated",
98
+ accessToken: void 0
99
+ };
100
+ }
101
+ return {
102
+ status: "transient",
103
+ accessToken: void 0
104
+ };
105
+ }
106
+ async function prepareLoginUrl(sessionManager, requestContext, options) {
107
+ requestContext.markResponseAsPersonalized(CUSTOMER_SESSION_MUTATION_PERSONALIZATION_REASON);
108
+ const origin = await getResolvedOrigin(sessionManager, options.origin);
109
+ const state = generateRandomBase64Url();
110
+ const nonce = generateRandomBase64Url();
111
+ const codeVerifier = generateRandomBase64Url();
112
+ const codeChallenge = await createCodeChallenge(codeVerifier);
113
+ const returnTo = sanitizeReturnTo(options.returnTo, origin);
114
+ const createdAt = Date.now();
115
+ await writeSessionData(sessionManager, {
116
+ ...await readSessionData(sessionManager),
117
+ pendingLogin: {
118
+ state,
119
+ nonce,
120
+ codeVerifier,
121
+ returnTo,
122
+ origin,
123
+ createdAt
124
+ }
125
+ });
126
+ const loginUrl = new URL(endpoints.authorizeUrl);
127
+ loginUrl.searchParams.set("client_id", customerAccountApiClientId);
128
+ loginUrl.searchParams.set("scope", CUSTOMER_ACCOUNT_SCOPE);
129
+ loginUrl.searchParams.set("response_type", "code");
130
+ loginUrl.searchParams.set("redirect_uri", `${origin}${CUSTOMER_ACCOUNT_AUTHORIZE_PATH}`);
131
+ loginUrl.searchParams.set("state", state);
132
+ loginUrl.searchParams.set("nonce", nonce);
133
+ loginUrl.searchParams.set("code_challenge", codeChallenge);
134
+ loginUrl.searchParams.set("code_challenge_method", CODE_CHALLENGE_METHOD);
135
+ setOptionalLoginParams(loginUrl, options);
136
+ return loginUrl.toString();
137
+ }
138
+ async function handleOAuthCallback(sessionManager, requestContext, request) {
139
+ return (await handleOAuthCallbackResult(sessionManager, requestContext, request)).location;
140
+ }
141
+ async function handleOAuthCallbackResult(sessionManager, requestContext, request) {
142
+ requestContext.markResponseAsPersonalized(CUSTOMER_SESSION_MUTATION_PERSONALIZATION_REASON);
143
+ try {
144
+ return await completeOAuthCallback({
145
+ sessionManager,
146
+ request,
147
+ endpoints,
148
+ customerAccountApiClientId,
149
+ fetch,
150
+ timeoutInMs: defaultTimeoutInMs
151
+ });
152
+ } catch (error) {
153
+ await clearPendingLogin(sessionManager);
154
+ throw error;
155
+ }
156
+ }
157
+ async function logout(sessionManager, requestContext, options = {}) {
158
+ requestContext.markResponseAsPersonalized(CUSTOMER_SESSION_MUTATION_PERSONALIZATION_REASON);
159
+ const origin = await getResolvedOrigin(sessionManager, options.origin);
160
+ const idToken = (await readSessionData(sessionManager)).tokens?.idToken;
161
+ const postLogoutRedirectUri = absoluteSameOriginUrl(options.postLogoutRedirectUri ?? origin, origin);
162
+ await sessionManager.removeSessionItem(CUSTOMER_ACCOUNT_SESSION_KEY);
163
+ if (!idToken) return postLogoutRedirectUri;
164
+ const logoutUrl = new URL(endpoints.logoutUrl);
165
+ logoutUrl.searchParams.set("id_token_hint", idToken);
166
+ logoutUrl.searchParams.set("post_logout_redirect_uri", postLogoutRedirectUri);
167
+ return logoutUrl.toString();
168
+ }
169
+ const customerSession = {
170
+ [CUSTOMER_SESSION_INTERNAL_BRAND]: true,
171
+ isLoggedIn: async (sessionManager, requestContext) => {
172
+ requestContext.markResponseAsPersonalized(CUSTOMER_SESSION_ACCESS_TOKEN_PERSONALIZATION_REASON);
173
+ return hasCustomerSession(await readSessionData(sessionManager));
174
+ },
175
+ getAccessToken,
176
+ getOrRefreshAccessToken,
177
+ prepareLoginUrl,
178
+ handleOAuthCallback,
179
+ logout
180
+ };
181
+ customerSessionInternals.set(customerSession, {
182
+ getOrRefreshAccessToken: getOrRefreshAccessTokenResult,
183
+ handleOAuthCallback: handleOAuthCallbackResult
184
+ });
185
+ return customerSession;
186
+ }
187
+ async function getCustomerSessionRefreshResult(customerSession, sessionManager, requestContext, options = {}) {
188
+ return customerSessionInternals.get(customerSession)?.getOrRefreshAccessToken(sessionManager, requestContext, options);
189
+ }
190
+ function createCustomerAccountServerHandlers(options) {
191
+ const { customerSession, defaultPostLoginRedirectPathname = DEFAULT_POST_LOGIN_REDIRECT_PATHNAME, loginFailedRedirectPath = FAILED_LOGIN_PATH, postLogoutRedirectUri = DEFAULT_POST_LOGOUT_REDIRECT_URI } = options;
192
+ const { origin: originOption } = options;
193
+ const cartSync = resolveCartBuyerIdentitySync(options);
194
+ return {
195
+ authorize: createCallableRouteHandler(CUSTOMER_ACCOUNT_AUTHORIZE_PATH, "GET", async (context) => {
196
+ return handleAuthorizeRoute(customerSession, context, loginFailedRedirectPath, originOption, cartSync);
197
+ }),
198
+ login: createCallableRouteHandler(CUSTOMER_ACCOUNT_LOGIN_PATH, "GET", async (context) => {
199
+ const { request, sessionManager, requestContext } = context;
200
+ return handleLoginRoute(customerSession, sessionManager, requestContext, request, defaultPostLoginRedirectPathname, originOption);
201
+ }),
202
+ logout: createCallableRouteHandler(CUSTOMER_ACCOUNT_LOGOUT_PATH, "POST", async (context) => {
203
+ return handleLogoutRoute(customerSession, context, postLogoutRedirectUri, originOption, cartSync);
204
+ }),
205
+ refresh: createCallableRouteHandler(CUSTOMER_ACCOUNT_REFRESH_PATH, "GET", async (context) => {
206
+ return handleRefreshRoute(customerSession, context, originOption, cartSync);
207
+ })
208
+ };
209
+ }
210
+ function resolveCartBuyerIdentitySync(options) {
211
+ if (!options.cartServerHandlers) return void 0;
212
+ const cartSync = getCartBuyerIdentitySync(options.cartServerHandlers);
213
+ if (!cartSync) throw new Error("cartServerHandlers must be created by createCartServerHandlers with the customerSession option.");
214
+ if (!customerSessionInternals.has(options.customerSession)) throw new Error("Cart buyer identity sync requires the customerSession returned by createCustomerSession.");
215
+ return cartSync;
216
+ }
217
+ async function handleLoginRoute(customerSession, sessionManager, requestContext, request, defaultPostLoginRedirectPathname, originOption) {
218
+ const origin = await resolveRouteOrigin(sessionManager, request, originOption);
219
+ const requestUrl = new URL(request.url);
220
+ const defaultReturnTo = sanitizeReturnTo(defaultPostLoginRedirectPathname, origin, DEFAULT_POST_LOGIN_REDIRECT_PATHNAME);
221
+ const returnTo = sanitizeReturnTo(requestUrl.searchParams.get("return_to") ?? requestUrl.searchParams.get("returnTo"), origin, defaultReturnTo);
222
+ return redirectResult(await customerSession.prepareLoginUrl(sessionManager, requestContext, {
223
+ origin,
224
+ returnTo,
225
+ countryCode: requestContext.i18n.country,
226
+ locale: getOptionalSearchParam(requestUrl, "locale"),
227
+ acrValues: getOptionalSearchParam(requestUrl, "acr_values"),
228
+ loginHint: getOptionalSearchParam(requestUrl, "login_hint"),
229
+ loginHintMode: getOptionalSearchParam(requestUrl, "login_hint_mode")
230
+ }), await commitSession(sessionManager));
231
+ }
232
+ async function handleLogoutRoute(customerSession, context, postLogoutRedirectUri, originOption, cartSync) {
233
+ const { request, sessionManager, requestContext } = context;
234
+ const origin = await resolveRouteOrigin(sessionManager, request, originOption);
235
+ if (!isSameOriginPost(request, origin)) return forbiddenResult();
236
+ const requestUrl = new URL(request.url);
237
+ const requestedReturnTo = requestUrl.searchParams.get("return_to") ?? requestUrl.searchParams.get("returnTo");
238
+ const logoutUrl = await customerSession.logout(sessionManager, requestContext, {
239
+ origin,
240
+ postLogoutRedirectUri: sanitizeReturnTo(requestedReturnTo, origin, postLogoutRedirectUri)
241
+ });
242
+ let detachFailed = false;
243
+ if (cartSync) detachFailed = !await syncCartBuyerIdentity(cartSync, context, null, "logout");
244
+ const headers = new Headers(await commitSession(sessionManager));
245
+ if (cartSync && detachFailed) headers.append("set-cookie", cartSync.expiredCartCookie);
246
+ return redirectResult(logoutUrl, headers);
247
+ }
248
+ async function handleAuthorizeRoute(customerSession, context, loginFailedRedirectPath, originOption, cartSync) {
249
+ const { request, sessionManager, requestContext } = context;
250
+ try {
251
+ if (!cartSync) return redirectResult(await customerSession.handleOAuthCallback(sessionManager, requestContext, request), await commitSession(sessionManager));
252
+ const { location, accessToken } = await handleOAuthCallbackWithAccessToken(customerSession, sessionManager, requestContext, request);
253
+ await syncCartBuyerIdentity(cartSync, context, accessToken, "authorize");
254
+ return redirectResult(location, await commitSession(sessionManager));
255
+ } catch (error) {
256
+ if (!(error instanceof CustomerAccountOAuthError)) throw error;
257
+ return redirectResult(sanitizeReturnTo(loginFailedRedirectPath, await resolveRouteOrigin(sessionManager, request, originOption)), await commitSession(sessionManager));
258
+ }
259
+ }
260
+ async function handleRefreshRoute(customerSession, context, originOption, cartSync) {
261
+ const { request, sessionManager, requestContext } = context;
262
+ const origin = await resolveRouteOrigin(sessionManager, request, originOption);
263
+ if (!cartSync) {
264
+ await customerSession.getOrRefreshAccessToken(sessionManager, requestContext, { origin });
265
+ return refreshRedirectResult(request, origin, await commitSession(sessionManager));
266
+ }
267
+ const refreshResult = await getOrRefreshAccessTokenWithStatus(customerSession, sessionManager, requestContext, { origin });
268
+ let detachFailed = false;
269
+ if (refreshResult.status !== "transient") {
270
+ const customerAccessToken = refreshResult.accessToken ?? null;
271
+ const syncSucceeded = await syncCartBuyerIdentity(cartSync, context, customerAccessToken, "refresh");
272
+ detachFailed = customerAccessToken === null && !syncSucceeded;
273
+ }
274
+ const headers = new Headers(await commitSession(sessionManager));
275
+ if (detachFailed) headers.append("set-cookie", cartSync.expiredCartCookie);
276
+ return refreshRedirectResult(request, origin, headers);
277
+ }
278
+ function refreshRedirectResult(request, origin, headers) {
279
+ const requestUrl = new URL(request.url);
280
+ return redirectResult(sanitizeReturnTo(requestUrl.searchParams.get("return_to") ?? requestUrl.searchParams.get("returnTo"), origin), headers);
281
+ }
282
+ async function handleOAuthCallbackWithAccessToken(customerSession, sessionManager, requestContext, request) {
283
+ const internal = customerSessionInternals.get(customerSession);
284
+ if (!internal) throw new Error("Customer session was not created by createCustomerSession");
285
+ return internal.handleOAuthCallback(sessionManager, requestContext, request);
286
+ }
287
+ async function getOrRefreshAccessTokenWithStatus(customerSession, sessionManager, requestContext, options) {
288
+ const internal = customerSessionInternals.get(customerSession);
289
+ if (!internal) throw new Error("Customer session was not created by createCustomerSession");
290
+ return internal.getOrRefreshAccessToken(sessionManager, requestContext, options);
291
+ }
292
+ async function syncCartBuyerIdentity(cartSync, context, customerAccessToken, route) {
293
+ try {
294
+ if (!context.storefrontClient) throw new Error("Customer Account handlers configured with cartServerHandlers require storefrontClient.");
295
+ await cartSync.updateBuyerIdentity({
296
+ request: context.request,
297
+ storefrontClient: context.storefrontClient
298
+ }, customerAccessToken);
299
+ return true;
300
+ } catch (error) {
301
+ log.error("cart buyer identity sync failed", {
302
+ route,
303
+ error
304
+ });
305
+ return false;
306
+ }
307
+ }
308
+ async function resolveRouteOrigin(sessionManager, request, originOption) {
309
+ if (typeof originOption === "function") return normalizeOrigin(originOption(request));
310
+ return getResolvedOrigin(sessionManager, originOption);
311
+ }
312
+ async function getResolvedOrigin(sessionManager, originOverride) {
313
+ return normalizeOrigin(originOverride ?? await sessionManager.getSessionOrigin());
314
+ }
315
+ function getOptionalSearchParam(url, name) {
316
+ return url.searchParams.get(name) ?? void 0;
317
+ }
318
+ function redirectResult(location, headers) {
319
+ const redirectHeaders = new Headers(headers);
320
+ redirectHeaders.set("cache-control", NO_STORE_CACHE_CONTROL);
321
+ return {
322
+ type: "redirect",
323
+ location,
324
+ headers: redirectHeaders
325
+ };
326
+ }
327
+ function forbiddenResult() {
328
+ return {
329
+ type: "error",
330
+ status: FORBIDDEN_STATUS,
331
+ error: {
332
+ code: FORBIDDEN_ERROR_CODE,
333
+ message: FORBIDDEN_ERROR_MESSAGE
334
+ },
335
+ headers: { "cache-control": NO_STORE_CACHE_CONTROL }
336
+ };
337
+ }
338
+ async function commitSession(sessionManager) {
339
+ return await sessionManager.commit?.() ?? void 0;
340
+ }
341
+ async function completeOAuthCallback({ sessionManager, request, endpoints, customerAccountApiClientId, fetch, timeoutInMs }) {
342
+ const requestUrl = new URL(request.url);
343
+ const code = requestUrl.searchParams.get("code");
344
+ const state = requestUrl.searchParams.get("state");
345
+ const pendingLogin = getPendingLogin(await readSessionData(sessionManager));
346
+ assertOAuthCallbackParams(code, state, pendingLogin);
347
+ const tokenResponse = await exchangeAuthorizationCode({
348
+ endpoints,
349
+ customerAccountApiClientId,
350
+ origin: pendingLogin.origin ?? getOriginFromRequest(request),
351
+ code,
352
+ codeVerifier: pendingLogin.codeVerifier,
353
+ fetch,
354
+ timeoutInMs
355
+ });
356
+ validateIdTokenClaims(tokenResponse.id_token, {
357
+ audience: customerAccountApiClientId,
358
+ issuer: endpoints.issuer,
359
+ nonce: pendingLogin.nonce
360
+ });
361
+ await writeSessionData(sessionManager, { tokens: createTokensFromResponse(tokenResponse) });
362
+ return {
363
+ location: pendingLogin.returnTo ?? DEFAULT_LOGIN_RETURN_TO_PATH,
364
+ accessToken: tokenResponse.access_token
365
+ };
366
+ }
367
+ function isSameOriginPost(request, trustedOrigin) {
368
+ const origin = request.headers.get("origin");
369
+ if (origin) try {
370
+ return normalizeOrigin(origin) === trustedOrigin;
371
+ } catch {
372
+ return false;
373
+ }
374
+ const referer = request.headers.get("referer");
375
+ if (!referer) return false;
376
+ try {
377
+ return normalizeOrigin(new URL(referer).origin) === trustedOrigin;
378
+ } catch {
379
+ return false;
380
+ }
381
+ }
382
+ function assertOAuthCallbackParams(code, state, pendingLogin) {
383
+ if (!code || !state) throw new CustomerAccountOAuthError("missing_callback_params", "OAuth callback is missing code or state");
384
+ if (pendingLogin.state !== state) throw new CustomerAccountOAuthError("state_mismatch", "OAuth callback state does not match session state");
385
+ }
386
+ async function exchangeAuthorizationCode({ endpoints, customerAccountApiClientId, origin, code, codeVerifier, fetch, timeoutInMs }) {
387
+ const body = new URLSearchParams({
388
+ grant_type: AUTHORIZATION_CODE_GRANT_TYPE,
389
+ client_id: customerAccountApiClientId,
390
+ redirect_uri: `${origin}${CUSTOMER_ACCOUNT_AUTHORIZE_PATH}`,
391
+ code,
392
+ code_verifier: codeVerifier
393
+ });
394
+ return withTokenRequestTimeout(timeoutInMs, async (signal) => {
395
+ const response = await postTokenRequest({
396
+ url: endpoints.tokenUrl,
397
+ origin,
398
+ body,
399
+ fetch,
400
+ signal
401
+ });
402
+ if (!response.ok) {
403
+ cancelResponseBody(response);
404
+ throw new CustomerAccountOAuthError(response.status === 400 || response.status === 401 ? "token_exchange_rejected" : "token_exchange_failed", `Customer Account OAuth token exchange failed with ${response.status}`);
405
+ }
406
+ return parseRequiredTokenResponse(await readTokenResponseJson(response, signal));
407
+ });
408
+ }
409
+ async function getRefreshResult({ refreshFlights, refreshToken, idToken, origin, endpoints, customerAccountApiClientId, fetch, timeoutInMs }) {
410
+ const flightKey = `${origin}\n${refreshToken}`;
411
+ const existingFlight = refreshFlights.get(flightKey);
412
+ if (existingFlight) return existingFlight;
413
+ const flight = refreshAccessToken({
414
+ endpoints,
415
+ customerAccountApiClientId,
416
+ refreshToken,
417
+ idToken,
418
+ origin,
419
+ fetch,
420
+ timeoutInMs
421
+ });
422
+ refreshFlights.set(flightKey, flight);
423
+ try {
424
+ return await flight;
425
+ } finally {
426
+ refreshFlights.delete(flightKey);
427
+ }
428
+ }
429
+ async function refreshAccessToken({ endpoints, customerAccountApiClientId, refreshToken, idToken, origin, fetch, timeoutInMs }) {
430
+ const body = new URLSearchParams({
431
+ grant_type: REFRESH_TOKEN_GRANT_TYPE,
432
+ client_id: customerAccountApiClientId,
433
+ refresh_token: refreshToken
434
+ });
435
+ try {
436
+ return await withTokenRequestTimeout(timeoutInMs, async (signal) => {
437
+ return readRefreshResult(await postTokenRequest({
438
+ url: endpoints.tokenUrl,
439
+ origin,
440
+ body,
441
+ fetch,
442
+ signal
443
+ }), refreshToken, idToken, signal);
444
+ });
445
+ } catch {
446
+ return { type: "transient" };
447
+ }
448
+ }
449
+ async function readRefreshResult(response, currentRefreshToken, currentIdToken, signal) {
450
+ if (response.status === 400 || response.status === 401) {
451
+ cancelResponseBody(response);
452
+ return { type: "invalid" };
453
+ }
454
+ if (!response.ok) {
455
+ cancelResponseBody(response);
456
+ return { type: "transient" };
457
+ }
458
+ try {
459
+ const parsedTokenResponse = parseRefreshTokenResponse(await readTokenResponseJson(response, signal));
460
+ return {
461
+ type: "success",
462
+ tokens: createTokensFromResponse({
463
+ ...parsedTokenResponse,
464
+ refresh_token: parsedTokenResponse.refresh_token ?? currentRefreshToken,
465
+ id_token: parsedTokenResponse.id_token ?? currentIdToken
466
+ })
467
+ };
468
+ } catch {
469
+ return { type: "transient" };
470
+ }
471
+ }
472
+ async function postTokenRequest({ url, origin, body, fetch, signal }) {
473
+ return await withAbort(fetch(url, {
474
+ method: "POST",
475
+ headers: new Headers({
476
+ "Content-Type": "application/x-www-form-urlencoded",
477
+ "User-Agent": USER_AGENT,
478
+ Origin: origin
479
+ }),
480
+ body,
481
+ cache: "no-store",
482
+ redirect: "manual",
483
+ signal
484
+ }), signal);
485
+ }
486
+ async function withTokenRequestTimeout(timeoutInMs, operation) {
487
+ const controller = new AbortController();
488
+ const timeoutId = setTimeout(() => {
489
+ controller.abort(new CustomerAccountApiError(`Customer Account OAuth request timed out after ${timeoutInMs}ms`));
490
+ }, timeoutInMs);
491
+ try {
492
+ return await operation(controller.signal);
493
+ } finally {
494
+ clearTimeout(timeoutId);
495
+ }
496
+ }
497
+ function withAbort(promise, signal) {
498
+ if (signal.aborted) return Promise.reject(getAbortReason(signal));
499
+ return new Promise((resolve, reject) => {
500
+ const abort = () => {
501
+ signal.removeEventListener("abort", abort);
502
+ reject(getAbortReason(signal));
503
+ };
504
+ signal.addEventListener("abort", abort, { once: true });
505
+ Promise.resolve(promise).then((value) => {
506
+ signal.removeEventListener("abort", abort);
507
+ resolve(value);
508
+ }, (error) => {
509
+ signal.removeEventListener("abort", abort);
510
+ reject(error);
511
+ });
512
+ });
513
+ }
514
+ function getAbortReason(signal) {
515
+ return signal.reason ?? new DOMException("signal is aborted without reason", "AbortError");
516
+ }
517
+ async function readTokenResponseJson(response, signal) {
518
+ const json = await withAbort(response.json(), signal);
519
+ if (!isObjectRecord(json)) throw new CustomerAccountOAuthError("invalid_token_response", "Customer Account OAuth response must be an object");
520
+ return {
521
+ access_token: json.access_token,
522
+ refresh_token: json.refresh_token,
523
+ id_token: json.id_token,
524
+ expires_in: json.expires_in
525
+ };
526
+ }
527
+ function parseRequiredTokenResponse(response) {
528
+ const parsed = parseRefreshTokenResponse(response);
529
+ if (typeof response.refresh_token !== "string" || response.refresh_token === "") throw new CustomerAccountOAuthError("invalid_token_response", "Customer Account OAuth response is missing refresh_token");
530
+ if (typeof response.id_token !== "string" || response.id_token === "") throw new CustomerAccountOAuthError("invalid_token_response", "Customer Account OAuth response is missing id_token");
531
+ return {
532
+ ...parsed,
533
+ refresh_token: response.refresh_token,
534
+ id_token: response.id_token
535
+ };
536
+ }
537
+ function parseRefreshTokenResponse(response) {
538
+ if (typeof response.access_token !== "string" || response.access_token === "") throw new CustomerAccountOAuthError("invalid_token_response", "Customer Account OAuth response is missing access_token");
539
+ if (typeof response.expires_in !== "number" || !Number.isFinite(response.expires_in) || response.expires_in <= 0) throw new CustomerAccountOAuthError("invalid_token_response", "Customer Account OAuth response is missing expires_in");
540
+ return {
541
+ access_token: response.access_token,
542
+ refresh_token: typeof response.refresh_token === "string" && response.refresh_token !== "" ? response.refresh_token : void 0,
543
+ id_token: typeof response.id_token === "string" && response.id_token !== "" ? response.id_token : void 0,
544
+ expires_in: response.expires_in
545
+ };
546
+ }
547
+ function createTokensFromResponse(response) {
548
+ return {
549
+ accessToken: response.access_token,
550
+ refreshToken: response.refresh_token,
551
+ idToken: response.id_token,
552
+ expiresAt: Date.now() + (response.expires_in - EXPIRY_BUFFER_IN_SECONDS) * MILLISECONDS_PER_SECOND
553
+ };
554
+ }
555
+ function validateIdTokenClaims(idToken, expected) {
556
+ const claims = parseJwtPayload(idToken);
557
+ if (claims.nonce !== expected.nonce) throw new CustomerAccountOAuthError("nonce_mismatch", "OAuth id_token nonce does not match session nonce");
558
+ if (claims.iss !== expected.issuer) throw new CustomerAccountOAuthError("issuer_mismatch", "OAuth id_token issuer does not match Customer Account issuer");
559
+ if (!hasAudienceClaim(claims.aud, expected.audience)) throw new CustomerAccountOAuthError("audience_mismatch", "OAuth id_token audience does not match Customer Account client ID");
560
+ if (typeof claims.exp !== "number" || claims.exp <= Math.floor(Date.now() / MILLISECONDS_PER_SECOND)) throw new CustomerAccountOAuthError("expired_id_token", "OAuth id_token is expired");
561
+ }
562
+ function parseJwtPayload(idToken) {
563
+ try {
564
+ const [, payload] = idToken.split(".");
565
+ if (!payload) throw new Error("Missing JWT payload");
566
+ const decodedPayload = JSON.parse(base64UrlDecode(payload));
567
+ if (!isObjectRecord(decodedPayload)) throw new Error("JWT payload must be an object");
568
+ return decodedPayload;
569
+ } catch (cause) {
570
+ throw new CustomerAccountOAuthError("invalid_id_token", "Customer Account OAuth id_token is invalid", { cause });
571
+ }
572
+ }
573
+ function hasAudienceClaim(audience, expectedAudience) {
574
+ if (audience === expectedAudience) return true;
575
+ if (!Array.isArray(audience)) return false;
576
+ return audience.includes(expectedAudience);
577
+ }
578
+ async function readSessionData(sessionManager) {
579
+ const value = await sessionManager.getSessionItem(CUSTOMER_ACCOUNT_SESSION_KEY);
580
+ return isCustomerAccountSessionData(value) ? value : {};
581
+ }
582
+ async function writeSessionData(sessionManager, sessionData) {
583
+ await sessionManager.setSessionItem(CUSTOMER_ACCOUNT_SESSION_KEY, sessionData);
584
+ }
585
+ async function writeTokens(sessionManager, tokens) {
586
+ await writeSessionData(sessionManager, {
587
+ ...await readSessionData(sessionManager),
588
+ tokens
589
+ });
590
+ }
591
+ async function clearTokens(sessionManager) {
592
+ const { pendingLogin } = await readSessionData(sessionManager);
593
+ if (pendingLogin) {
594
+ await writeSessionData(sessionManager, { pendingLogin });
595
+ return;
596
+ }
597
+ await sessionManager.removeSessionItem(CUSTOMER_ACCOUNT_SESSION_KEY);
598
+ }
599
+ async function clearPendingLogin(sessionManager) {
600
+ const { tokens } = await readSessionData(sessionManager);
601
+ if (tokens) {
602
+ await writeSessionData(sessionManager, { tokens });
603
+ return;
604
+ }
605
+ await sessionManager.removeSessionItem(CUSTOMER_ACCOUNT_SESSION_KEY);
606
+ }
607
+ function getUsableAccessToken(sessionData) {
608
+ const tokens = sessionData.tokens;
609
+ if (!isTokenUsable(tokens)) return void 0;
610
+ return tokens.accessToken;
611
+ }
612
+ function hasCustomerSession(sessionData) {
613
+ return getUsableAccessToken(sessionData) !== void 0 || getRefreshToken(sessionData) !== void 0;
614
+ }
615
+ function getRefreshToken(sessionData) {
616
+ const refreshToken = sessionData.tokens?.refreshToken;
617
+ return typeof refreshToken === "string" && refreshToken !== "" ? refreshToken : void 0;
618
+ }
619
+ function getPendingLogin(sessionData) {
620
+ const pendingLogin = sessionData.pendingLogin;
621
+ if (isPendingLoginReady(pendingLogin)) return pendingLogin;
622
+ throw new CustomerAccountOAuthError("missing_pending_login", "OAuth callback has no pending login state");
623
+ }
624
+ function isTokenUsable(tokens) {
625
+ if (!tokens || typeof tokens.accessToken !== "string" || tokens.accessToken === "") return false;
626
+ if (typeof tokens.expiresAt !== "number") return false;
627
+ return tokens.expiresAt > Date.now();
628
+ }
629
+ function isPendingLoginReady(pendingLogin) {
630
+ if (!pendingLogin) return false;
631
+ if (!isNonEmptyString(pendingLogin.state)) return false;
632
+ if (!isNonEmptyString(pendingLogin.nonce)) return false;
633
+ if (!isNonEmptyString(pendingLogin.codeVerifier)) return false;
634
+ if (!isNonEmptyString(pendingLogin.returnTo)) return false;
635
+ if (!isNonEmptyString(pendingLogin.origin)) return false;
636
+ if (typeof pendingLogin.createdAt !== "number") return false;
637
+ return Date.now() - pendingLogin.createdAt <= PENDING_LOGIN_TTL_IN_MS;
638
+ }
639
+ function isNonEmptyString(value) {
640
+ return typeof value === "string" && value !== "";
641
+ }
642
+ function isCustomerAccountSessionData(value) {
643
+ if (!isObjectRecord(value) || Array.isArray(value)) return false;
644
+ const tokens = value.tokens;
645
+ const pendingLogin = value.pendingLogin;
646
+ if (tokens !== void 0 && (!isObjectRecord(tokens) || Array.isArray(tokens))) return false;
647
+ return pendingLogin === void 0 || isObjectRecord(pendingLogin) && !Array.isArray(pendingLogin);
648
+ }
649
+ function setOptionalLoginParams(loginUrl, options) {
650
+ if (options.locale) loginUrl.searchParams.set("locale", options.locale);
651
+ if (options.countryCode) loginUrl.searchParams.set("region_country", options.countryCode);
652
+ if (options.acrValues) loginUrl.searchParams.set("acr_values", options.acrValues);
653
+ if (!options.loginHint) return;
654
+ loginUrl.searchParams.set("login_hint", options.loginHint);
655
+ if (options.loginHintMode) loginUrl.searchParams.set("login_hint_mode", options.loginHintMode);
656
+ }
657
+ function sanitizeReturnTo(returnTo, origin, fallbackReturnTo = DEFAULT_LOGIN_RETURN_TO_PATH) {
658
+ if (!returnTo) return fallbackReturnTo;
659
+ try {
660
+ const url = new URL(returnTo, origin);
661
+ if (url.origin !== origin) return fallbackReturnTo;
662
+ const sanitizedReturnTo = `${url.pathname}${url.search}${url.hash}`;
663
+ if (new TextEncoder().encode(sanitizedReturnTo).byteLength > MAX_RETURN_TO_LENGTH_IN_BYTES) return fallbackReturnTo;
664
+ return sanitizedReturnTo;
665
+ } catch {
666
+ return fallbackReturnTo;
667
+ }
668
+ }
669
+ function absoluteSameOriginUrl(url, origin) {
670
+ const parsedUrl = new URL(url, origin);
671
+ if (parsedUrl.origin !== origin) return origin;
672
+ return parsedUrl.toString();
673
+ }
674
+ async function createCodeChallenge(codeVerifier) {
675
+ const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(codeVerifier));
676
+ return base64UrlEncode(String.fromCharCode(...new Uint8Array(digest)));
677
+ }
678
+ function generateRandomBase64Url() {
679
+ const bytes = new Uint8Array(RANDOM_BYTES_LENGTH);
680
+ crypto.getRandomValues(bytes);
681
+ return base64UrlEncode(String.fromCharCode(...bytes));
682
+ }
683
+ function base64UrlEncode(value) {
684
+ return btoa(value).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
685
+ }
686
+ function base64UrlDecode(value) {
687
+ const base64 = value.replace(/-/g, "+").replace(/_/g, "/");
688
+ const paddingLength = (4 - base64.length % 4) % 4;
689
+ return atob(base64.padEnd(base64.length + paddingLength, "="));
690
+ }
691
+ function createCustomerAccountEndpoints(shopId, customerAccountApiUrl) {
692
+ const authBaseUrl = normalizeAuthBaseUrl(customerAccountApiUrl ?? `https://shopify.com/authentication/${shopId}`);
693
+ return {
694
+ authorizeUrl: `${authBaseUrl}/oauth/authorize`,
695
+ tokenUrl: `${authBaseUrl}/oauth/token`,
696
+ logoutUrl: `${authBaseUrl}/logout`,
697
+ issuer: authBaseUrl
698
+ };
699
+ }
700
+ function normalizeAuthBaseUrl(customerAccountApiUrl) {
701
+ const url = new URL(customerAccountApiUrl);
702
+ if (url.protocol !== "https:") throw new Error("customerAccountApiUrl must use HTTPS");
703
+ return url.toString().replace(/\/$/, "");
704
+ }
705
+ function getOriginFromRequest(request) {
706
+ return normalizeOrigin(new URL(request.url).origin);
707
+ }
708
+ function normalizeOrigin(origin) {
709
+ const url = new URL(origin);
710
+ if (url.protocol === "https:") return url.origin;
711
+ throw new Error("Customer Account OAuth origin must use HTTPS. Use a public HTTPS tunnel for local Customer Account login.");
712
+ }
713
+ function cancelResponseBody(response) {
714
+ try {
715
+ response.body?.cancel().catch(() => void 0);
716
+ } catch {}
717
+ }
718
+ function validateShopId(shopId) {
719
+ if (!SHOP_ID_RE.test(shopId)) throw new Error("shopId must be a numeric Shopify shop ID string");
720
+ }
721
+ function validateCustomerAccountApiClientId(customerAccountApiClientId) {
722
+ if (typeof customerAccountApiClientId !== "string" || customerAccountApiClientId.trim() === "") throw new Error("customerAccountApiClientId is required");
723
+ }
724
+ function validateTimeout(timeoutInMs) {
725
+ if (!Number.isSafeInteger(timeoutInMs) || timeoutInMs <= 0 || timeoutInMs > MAX_SET_TIMEOUT_IN_MS) throw new Error(`defaultTimeoutInMs must be a positive safe integer no greater than ${MAX_SET_TIMEOUT_IN_MS}`);
726
+ }
727
+ function isObjectRecord(value) {
728
+ return typeof value === "object" && value !== null;
729
+ }
730
+
731
+ //#endregion
732
+ export { CUSTOMER_ACCOUNT_AUTHORIZE_PATH, CUSTOMER_ACCOUNT_LOGIN_PATH, CUSTOMER_ACCOUNT_LOGOUT_PATH, CUSTOMER_ACCOUNT_REFRESH_PATH, createCustomerAccountServerHandlers, createCustomerSession, getCustomerSessionRefreshResult };
733
+ //# sourceMappingURL=session.mjs.map