@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 @@
1
+ {"version":3,"file":"session.mjs","names":[],"sources":["../../src/customer-account/session.ts"],"sourcesContent":["import type { StorefrontClient } from \"../client\";\nimport {\n getCartBuyerIdentitySync,\n type CartBuyerIdentitySync,\n type CartBuyerIdentitySyncSource,\n} from \"../core/cart/buyer-identity-sync\";\nimport { DEFAULT_TIMEOUT_IN_MS } from \"../core/constants\";\nimport { getLogger } from \"../core/logging\";\nimport type { ShopifyRequestContext } from \"../core/request-context\";\nimport {\n createCallableRouteHandler,\n type CallableRouteHandler,\n type ShopifyRouteErrorResult,\n type ShopifyRouteHandlerContext,\n type ShopifyRouteRedirectResult,\n type ShopifyRouteSessionManager,\n} from \"../core/request-routing/registered-routes\";\nimport { CUSTOMER_ACCOUNT_PATHS } from \"../core/url\";\nimport { CustomerAccountApiError, CustomerAccountOAuthError } from \"./errors\";\n\nconst log = getLogger(\"customer-account\");\n\nexport const CUSTOMER_ACCOUNT_AUTHORIZE_PATH = CUSTOMER_ACCOUNT_PATHS.authorize;\nexport const CUSTOMER_ACCOUNT_LOGIN_PATH = CUSTOMER_ACCOUNT_PATHS.login;\nexport const CUSTOMER_ACCOUNT_LOGOUT_PATH = CUSTOMER_ACCOUNT_PATHS.logout;\nexport const CUSTOMER_ACCOUNT_REFRESH_PATH = CUSTOMER_ACCOUNT_PATHS.refresh;\n\nconst CUSTOMER_ACCOUNT_SESSION_KEY = \"customerAccount\";\nconst DEFAULT_LOGIN_RETURN_TO_PATH = \"/account\";\nconst DEFAULT_POST_LOGIN_REDIRECT_PATHNAME = \"/\";\nconst DEFAULT_POST_LOGOUT_REDIRECT_URI = \"/\";\nconst FAILED_LOGIN_PATH = \"/account?login=failed\";\nconst FORBIDDEN_STATUS = 403;\nconst FORBIDDEN_ERROR_CODE = \"forbidden\";\nconst FORBIDDEN_ERROR_MESSAGE = \"Forbidden\";\nconst NO_STORE_CACHE_CONTROL = \"no-store\";\nconst AUTHORIZATION_CODE_GRANT_TYPE = \"authorization_code\";\nconst REFRESH_TOKEN_GRANT_TYPE = \"refresh_token\";\nconst CUSTOMER_ACCOUNT_SCOPE = \"openid email customer-account-api:full\";\nconst CODE_CHALLENGE_METHOD = \"S256\";\nconst USER_AGENT = `Hydrogen ${__HYDROGEN_VERSION__}`;\nconst EXPIRY_BUFFER_IN_SECONDS = 120;\nconst PENDING_LOGIN_TTL_IN_MINUTES = 10;\nconst SECONDS_PER_MINUTE = 60;\nconst MILLISECONDS_PER_SECOND = 1_000;\nconst PENDING_LOGIN_TTL_IN_MS =\n PENDING_LOGIN_TTL_IN_MINUTES * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND;\nconst RANDOM_BYTES_LENGTH = 32;\nconst MAX_RETURN_TO_LENGTH_IN_BYTES = 2_048;\nconst MAX_SET_TIMEOUT_IN_MS = 2_147_483_647;\nconst SHOP_ID_RE = /^\\d+$/;\nconst CUSTOMER_SESSION_ACCESS_TOKEN_PERSONALIZATION_REASON = \"customer-session-access-token\";\nconst CUSTOMER_SESSION_MUTATION_PERSONALIZATION_REASON = \"customer-session-mutation\";\nconst CUSTOMER_SESSION_INTERNAL_BRAND: unique symbol = Symbol(\"hydrogen.customerSessionInternal\");\n\nexport type Awaitable<T> = T | Promise<T>;\n\n/** Read-only Customer Account session storage for UI state and strict access-token reads. */\nexport type ReadonlyCustomerSessionManager = {\n getSessionItem(key: string): Awaitable<unknown>;\n};\n\n/** Writable Customer Account session storage for OAuth, refresh, and logout response boundaries. */\nexport type WritableCustomerSessionManager = ShopifyRouteSessionManager;\n\ntype CustomerAccountSessionData = {\n tokens?: {\n accessToken?: string;\n refreshToken?: string;\n idToken?: string;\n expiresAt?: number;\n };\n pendingLogin?: {\n state?: string;\n nonce?: string;\n codeVerifier?: string;\n returnTo?: string;\n origin?: string;\n createdAt?: number;\n };\n};\n\nexport type CreateCustomerSessionOptions = {\n shopId: string;\n customerAccountApiClientId: string;\n customerAccountApiUrl?: string;\n fetch?: typeof globalThis.fetch;\n defaultTimeoutInMs?: number;\n};\n\nexport type PrepareLoginUrlOptions = {\n origin?: string;\n returnTo?: string;\n locale?: string;\n countryCode?: string;\n loginHint?: string;\n loginHintMode?: string;\n acrValues?: string;\n};\n\nexport type RequestOriginOptions = {\n origin?: string;\n};\n\nexport type LogoutOptions = RequestOriginOptions & {\n postLogoutRedirectUri?: string;\n};\n\nexport type CustomerSession = {\n /**\n * Read-only signed-in check for UI state. Returns true for a usable access token\n * or a refresh token that can attempt to restore one later. Not an authorization\n * check for private Customer Account data.\n */\n isLoggedIn(\n sessionManager: ReadonlyCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n ): Promise<boolean>;\n /** Returns only a currently usable access token. Does not refresh or mutate session state. */\n getAccessToken(\n sessionManager: ReadonlyCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n ): Promise<string | undefined>;\n /**\n * Returns a usable access token, writing updated session state through the\n * supplied writable session manager when no usable access token is stored. Use\n * only where the eventual response commits the session manager.\n */\n getOrRefreshAccessToken(\n sessionManager: WritableCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n options?: RequestOriginOptions,\n ): Promise<string | undefined>;\n prepareLoginUrl(\n sessionManager: WritableCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n options: PrepareLoginUrlOptions,\n ): Promise<string>;\n handleOAuthCallback(\n sessionManager: WritableCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n request: Request,\n ): Promise<string>;\n logout(\n sessionManager: WritableCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n options?: LogoutOptions,\n ): Promise<string>;\n};\n\nexport type CustomerAccountServerHandlers<\n TContext extends CustomerAccountRouteHandlerContext = CustomerAccountRouteHandlerContext,\n> = {\n authorize: CallableRouteHandler<\n TContext,\n CustomerAccountRouteResult,\n typeof CUSTOMER_ACCOUNT_AUTHORIZE_PATH,\n \"GET\"\n >;\n login: CallableRouteHandler<\n TContext,\n CustomerAccountRouteResult,\n typeof CUSTOMER_ACCOUNT_LOGIN_PATH,\n \"GET\"\n >;\n logout: CallableRouteHandler<\n TContext,\n CustomerAccountRouteResult,\n typeof CUSTOMER_ACCOUNT_LOGOUT_PATH,\n \"POST\"\n >;\n refresh: CallableRouteHandler<\n TContext,\n CustomerAccountRouteResult,\n typeof CUSTOMER_ACCOUNT_REFRESH_PATH,\n \"GET\"\n >;\n};\n\n/** Customer Account handlers that also synchronize cart buyer identity, so their context requires `storefrontClient`. */\nexport type CustomerAccountServerHandlersWithCartSync =\n CustomerAccountServerHandlers<ShopifyRouteHandlerContext>;\n\ntype CustomerSessionWithInternals = CustomerSession & {\n readonly [CUSTOMER_SESSION_INTERNAL_BRAND]: true;\n};\n\ntype CreateCustomerAccountServerHandlersBaseOptions<\n TCustomerSession extends CustomerSession = CustomerSession,\n> = {\n customerSession: TCustomerSession;\n defaultPostLoginRedirectPathname?: string;\n loginFailedRedirectPath?: string;\n origin?: string | ((request: Request) => string);\n postLogoutRedirectUri?: string;\n};\n\nexport type CreateCustomerAccountServerHandlersOptions =\n | (CreateCustomerAccountServerHandlersBaseOptions & { cartServerHandlers?: undefined })\n | (CreateCustomerAccountServerHandlersBaseOptions<CustomerSessionWithInternals> & {\n /**\n * Cart server handlers created with `createCartServerHandlers({customerSession})`.\n * When provided, the authorize, refresh, and logout routes keep the browser\n * cart's buyer identity in step with the customer session: attach on login\n * and refresh, detach on logout. Sync is best-effort — failures are logged\n * and never block the route's redirect; a failed detach during logout\n * expires the cart cookie instead.\n */\n cartServerHandlers: CartBuyerIdentitySyncSource;\n });\n\ntype CustomerAccountTokens = NonNullable<CustomerAccountSessionData[\"tokens\"]>;\ntype PendingLogin = NonNullable<CustomerAccountSessionData[\"pendingLogin\"]>;\ntype TokenEndpointResponse = {\n access_token?: unknown;\n refresh_token?: unknown;\n id_token?: unknown;\n expires_in?: unknown;\n};\ntype ParsedTokenEndpointResponse = {\n access_token: string;\n refresh_token?: string;\n id_token?: string;\n expires_in: number;\n};\ntype RefreshResult =\n | { type: \"success\"; tokens: CustomerAccountTokens }\n | { type: \"invalid\" }\n | { type: \"transient\" };\ntype TokenRefreshResult =\n | {\n /** A usable access token is available. */\n status: \"authenticated\";\n accessToken: string;\n }\n | {\n /** Refresh failed transiently, but the refreshable session remains. */\n status: \"transient\";\n accessToken: undefined;\n }\n | {\n /** No usable or refreshable customer session remains. */\n status: \"unauthenticated\";\n accessToken: undefined;\n };\ntype OAuthCallbackResult = {\n location: string;\n accessToken: string;\n};\ntype CustomerSessionInternals = {\n getOrRefreshAccessToken(\n sessionManager: WritableCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n options?: RequestOriginOptions,\n ): Promise<TokenRefreshResult>;\n handleOAuthCallback(\n sessionManager: WritableCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n request: Request,\n ): Promise<OAuthCallbackResult>;\n};\nconst customerSessionInternals = new WeakMap<CustomerSession, CustomerSessionInternals>();\ntype CustomerAccountRouteResult = ShopifyRouteRedirectResult | ShopifyRouteErrorResult;\ntype CustomerAccountRouteHandlerContext = {\n request: Request;\n sessionManager: WritableCustomerSessionManager;\n requestContext: ShopifyRequestContext;\n};\ntype CustomerAccountRuntimeRouteHandlerContext = CustomerAccountRouteHandlerContext & {\n storefrontClient?: StorefrontClient;\n};\ntype CustomerAccountServerHandlersForOptions<TOptions> = TOptions extends {\n cartServerHandlers: CartBuyerIdentitySyncSource;\n}\n ? CustomerAccountServerHandlersWithCartSync\n : CustomerAccountServerHandlers;\ntype TokenRequestParams = {\n url: string;\n origin: string;\n body: URLSearchParams;\n fetch: typeof globalThis.fetch;\n signal: AbortSignal;\n};\n\nexport function createCustomerSession({\n shopId,\n customerAccountApiClientId,\n customerAccountApiUrl,\n fetch: customFetch,\n defaultTimeoutInMs = DEFAULT_TIMEOUT_IN_MS,\n}: CreateCustomerSessionOptions): CustomerSessionWithInternals {\n if (typeof document !== \"undefined\") {\n throw new Error(\n \"Customer Account OAuth sessions cannot be used in a browser context. Use this helper from server or edge routes only.\",\n );\n }\n\n validateShopId(shopId);\n validateCustomerAccountApiClientId(customerAccountApiClientId);\n validateTimeout(defaultTimeoutInMs);\n\n const fetch = customFetch ?? globalThis.fetch;\n if (typeof fetch !== \"function\") {\n throw new Error(\n \"No fetch function available. Pass a fetch option or ensure globalThis.fetch exists.\",\n );\n }\n\n const endpoints = createCustomerAccountEndpoints(shopId, customerAccountApiUrl);\n const refreshFlights = new Map<string, Promise<RefreshResult>>();\n\n async function getAccessToken(\n sessionManager: ReadonlyCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n ) {\n requestContext.markResponseAsPersonalized(CUSTOMER_SESSION_ACCESS_TOKEN_PERSONALIZATION_REASON);\n const accessToken = getUsableAccessToken(await readSessionData(sessionManager));\n return accessToken;\n }\n\n async function getOrRefreshAccessToken(\n sessionManager: WritableCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n options: RequestOriginOptions = {},\n ) {\n const result = await getOrRefreshAccessTokenResult(sessionManager, requestContext, options);\n return result.accessToken;\n }\n\n async function getOrRefreshAccessTokenResult(\n sessionManager: WritableCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n options: RequestOriginOptions = {},\n ): Promise<TokenRefreshResult> {\n requestContext.markResponseAsPersonalized(CUSTOMER_SESSION_ACCESS_TOKEN_PERSONALIZATION_REASON);\n const sessionData = await readSessionData(sessionManager);\n const accessToken = getUsableAccessToken(sessionData);\n if (accessToken) return { status: \"authenticated\", accessToken };\n\n const refreshToken = getRefreshToken(sessionData);\n if (!refreshToken) return { status: \"unauthenticated\", accessToken: undefined };\n\n const origin = await getResolvedOrigin(sessionManager, options.origin);\n const idToken = sessionData.tokens?.idToken;\n const refreshResult = await getRefreshResult({\n refreshFlights,\n refreshToken,\n idToken,\n origin,\n endpoints,\n customerAccountApiClientId,\n fetch,\n timeoutInMs: defaultTimeoutInMs,\n });\n\n if (refreshResult.type === \"success\") {\n const refreshedAccessToken = refreshResult.tokens.accessToken;\n if (!refreshedAccessToken) {\n return { status: \"transient\", accessToken: undefined };\n }\n await writeTokens(sessionManager, refreshResult.tokens);\n return {\n status: \"authenticated\",\n accessToken: refreshedAccessToken,\n };\n }\n\n if (refreshResult.type === \"invalid\") {\n await clearTokens(sessionManager);\n return { status: \"unauthenticated\", accessToken: undefined };\n }\n\n return { status: \"transient\", accessToken: undefined };\n }\n\n async function prepareLoginUrl(\n sessionManager: WritableCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n options: PrepareLoginUrlOptions,\n ) {\n requestContext.markResponseAsPersonalized(CUSTOMER_SESSION_MUTATION_PERSONALIZATION_REASON);\n const origin = await getResolvedOrigin(sessionManager, options.origin);\n const state = generateRandomBase64Url();\n const nonce = generateRandomBase64Url();\n const codeVerifier = generateRandomBase64Url();\n const codeChallenge = await createCodeChallenge(codeVerifier);\n const returnTo = sanitizeReturnTo(options.returnTo, origin);\n const createdAt = Date.now();\n\n const sessionData = await readSessionData(sessionManager);\n await writeSessionData(sessionManager, {\n ...sessionData,\n pendingLogin: { state, nonce, codeVerifier, returnTo, origin, createdAt },\n });\n\n const loginUrl = new URL(endpoints.authorizeUrl);\n loginUrl.searchParams.set(\"client_id\", customerAccountApiClientId);\n loginUrl.searchParams.set(\"scope\", CUSTOMER_ACCOUNT_SCOPE);\n loginUrl.searchParams.set(\"response_type\", \"code\");\n loginUrl.searchParams.set(\"redirect_uri\", `${origin}${CUSTOMER_ACCOUNT_AUTHORIZE_PATH}`);\n loginUrl.searchParams.set(\"state\", state);\n loginUrl.searchParams.set(\"nonce\", nonce);\n loginUrl.searchParams.set(\"code_challenge\", codeChallenge);\n loginUrl.searchParams.set(\"code_challenge_method\", CODE_CHALLENGE_METHOD);\n setOptionalLoginParams(loginUrl, options);\n\n return loginUrl.toString();\n }\n\n async function handleOAuthCallback(\n sessionManager: WritableCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n request: Request,\n ) {\n return (await handleOAuthCallbackResult(sessionManager, requestContext, request)).location;\n }\n\n async function handleOAuthCallbackResult(\n sessionManager: WritableCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n request: Request,\n ): Promise<OAuthCallbackResult> {\n requestContext.markResponseAsPersonalized(CUSTOMER_SESSION_MUTATION_PERSONALIZATION_REASON);\n try {\n return await completeOAuthCallback({\n sessionManager,\n request,\n endpoints,\n customerAccountApiClientId,\n fetch,\n timeoutInMs: defaultTimeoutInMs,\n });\n } catch (error) {\n await clearPendingLogin(sessionManager);\n throw error;\n }\n }\n\n async function logout(\n sessionManager: WritableCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n options: LogoutOptions = {},\n ) {\n requestContext.markResponseAsPersonalized(CUSTOMER_SESSION_MUTATION_PERSONALIZATION_REASON);\n const origin = await getResolvedOrigin(sessionManager, options.origin);\n const sessionData = await readSessionData(sessionManager);\n const idToken = sessionData.tokens?.idToken;\n const postLogoutRedirectUri = absoluteSameOriginUrl(\n options.postLogoutRedirectUri ?? origin,\n origin,\n );\n\n await sessionManager.removeSessionItem(CUSTOMER_ACCOUNT_SESSION_KEY);\n\n if (!idToken) return postLogoutRedirectUri;\n\n const logoutUrl = new URL(endpoints.logoutUrl);\n logoutUrl.searchParams.set(\"id_token_hint\", idToken);\n logoutUrl.searchParams.set(\"post_logout_redirect_uri\", postLogoutRedirectUri);\n return logoutUrl.toString();\n }\n\n const customerSession: CustomerSessionWithInternals = {\n [CUSTOMER_SESSION_INTERNAL_BRAND]: true,\n isLoggedIn: async (sessionManager, requestContext) => {\n requestContext.markResponseAsPersonalized(\n CUSTOMER_SESSION_ACCESS_TOKEN_PERSONALIZATION_REASON,\n );\n return hasCustomerSession(await readSessionData(sessionManager));\n },\n getAccessToken,\n getOrRefreshAccessToken,\n prepareLoginUrl,\n handleOAuthCallback,\n logout,\n };\n customerSessionInternals.set(customerSession, {\n getOrRefreshAccessToken: getOrRefreshAccessTokenResult,\n handleOAuthCallback: handleOAuthCallbackResult,\n });\n return customerSession;\n}\n\nexport async function getCustomerSessionRefreshResult(\n customerSession: CustomerSession,\n sessionManager: WritableCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n options: RequestOriginOptions = {},\n): Promise<TokenRefreshResult | undefined> {\n return customerSessionInternals\n .get(customerSession)\n ?.getOrRefreshAccessToken(sessionManager, requestContext, options);\n}\n\n/**\n * Creates Customer Account server handlers (`/account/login`, `/account/authorize`,\n * `/account/refresh`, `/account/logout`) for `handleShopifyRoutes`. The handlers\n * return redirect results: `login` redirects to Shopify's OAuth, `logout` redirects\n * to Shopify's logout endpoint when an `id_token` exists, and `authorize`/`refresh`\n * redirect back to the app (same-origin `return_to`). Invoke these paths via\n * full-page navigation (plain `<a>`/`<form>`), not a framework client-side\n * navigation component — client-nav cannot follow these raw redirects.\n */\nexport function createCustomerAccountServerHandlers<\n const TOptions extends CreateCustomerAccountServerHandlersOptions,\n>(options: TOptions): CustomerAccountServerHandlersForOptions<TOptions>;\nexport function createCustomerAccountServerHandlers(\n options: CreateCustomerAccountServerHandlersOptions,\n): CustomerAccountServerHandlers | CustomerAccountServerHandlersWithCartSync {\n const {\n customerSession,\n defaultPostLoginRedirectPathname = DEFAULT_POST_LOGIN_REDIRECT_PATHNAME,\n loginFailedRedirectPath = FAILED_LOGIN_PATH,\n postLogoutRedirectUri = DEFAULT_POST_LOGOUT_REDIRECT_URI,\n } = options;\n const { origin: originOption } = options;\n const cartSync = resolveCartBuyerIdentitySync(options);\n\n return {\n authorize: createCallableRouteHandler(\n CUSTOMER_ACCOUNT_AUTHORIZE_PATH,\n \"GET\",\n async (context: CustomerAccountRuntimeRouteHandlerContext) => {\n return handleAuthorizeRoute(\n customerSession,\n context,\n loginFailedRedirectPath,\n originOption,\n cartSync,\n );\n },\n ),\n login: createCallableRouteHandler(\n CUSTOMER_ACCOUNT_LOGIN_PATH,\n \"GET\",\n async (context: CustomerAccountRuntimeRouteHandlerContext) => {\n const { request, sessionManager, requestContext } = context;\n return handleLoginRoute(\n customerSession,\n sessionManager,\n requestContext,\n request,\n defaultPostLoginRedirectPathname,\n originOption,\n );\n },\n ),\n logout: createCallableRouteHandler(\n CUSTOMER_ACCOUNT_LOGOUT_PATH,\n \"POST\",\n async (context: CustomerAccountRuntimeRouteHandlerContext) => {\n return handleLogoutRoute(\n customerSession,\n context,\n postLogoutRedirectUri,\n originOption,\n cartSync,\n );\n },\n ),\n refresh: createCallableRouteHandler(\n CUSTOMER_ACCOUNT_REFRESH_PATH,\n \"GET\",\n async (context: CustomerAccountRuntimeRouteHandlerContext) => {\n return handleRefreshRoute(customerSession, context, originOption, cartSync);\n },\n ),\n };\n}\n\nfunction resolveCartBuyerIdentitySync(\n options: CreateCustomerAccountServerHandlersOptions,\n): CartBuyerIdentitySync | undefined {\n if (!options.cartServerHandlers) return undefined;\n\n const cartSync = getCartBuyerIdentitySync(options.cartServerHandlers);\n if (!cartSync) {\n throw new Error(\n \"cartServerHandlers must be created by createCartServerHandlers with the customerSession option.\",\n );\n }\n if (!customerSessionInternals.has(options.customerSession)) {\n throw new Error(\n \"Cart buyer identity sync requires the customerSession returned by createCustomerSession.\",\n );\n }\n return cartSync;\n}\n\nasync function handleLoginRoute(\n customerSession: CustomerSession,\n sessionManager: WritableCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n request: Request,\n defaultPostLoginRedirectPathname: string,\n originOption: string | ((request: Request) => string) | undefined,\n): Promise<CustomerAccountRouteResult> {\n const origin = await resolveRouteOrigin(sessionManager, request, originOption);\n const requestUrl = new URL(request.url);\n const defaultReturnTo = sanitizeReturnTo(\n defaultPostLoginRedirectPathname,\n origin,\n DEFAULT_POST_LOGIN_REDIRECT_PATHNAME,\n );\n const requestedReturnTo =\n requestUrl.searchParams.get(\"return_to\") ?? requestUrl.searchParams.get(\"returnTo\");\n const returnTo = sanitizeReturnTo(requestedReturnTo, origin, defaultReturnTo);\n const loginUrl = await customerSession.prepareLoginUrl(sessionManager, requestContext, {\n origin,\n returnTo,\n countryCode: requestContext.i18n.country,\n locale: getOptionalSearchParam(requestUrl, \"locale\"),\n acrValues: getOptionalSearchParam(requestUrl, \"acr_values\"),\n loginHint: getOptionalSearchParam(requestUrl, \"login_hint\"),\n loginHintMode: getOptionalSearchParam(requestUrl, \"login_hint_mode\"),\n });\n return redirectResult(loginUrl, await commitSession(sessionManager));\n}\n\nasync function handleLogoutRoute(\n customerSession: CustomerSession,\n context: CustomerAccountRuntimeRouteHandlerContext,\n postLogoutRedirectUri: string,\n originOption: string | ((request: Request) => string) | undefined,\n cartSync: CartBuyerIdentitySync | undefined,\n): Promise<CustomerAccountRouteResult> {\n const { request, sessionManager, requestContext } = context;\n const origin = await resolveRouteOrigin(sessionManager, request, originOption);\n if (!isSameOriginPost(request, origin)) return forbiddenResult();\n\n const requestUrl = new URL(request.url);\n const requestedReturnTo =\n requestUrl.searchParams.get(\"return_to\") ?? requestUrl.searchParams.get(\"returnTo\");\n const logoutUrl = await customerSession.logout(sessionManager, requestContext, {\n origin,\n postLogoutRedirectUri: sanitizeReturnTo(requestedReturnTo, origin, postLogoutRedirectUri),\n });\n\n // The redirect must complete even when detach fails: skipping it would leave\n // the Shopify IdP session alive after the app session is already destroyed.\n // Expiring the cart cookie is the fail-safe when the cart keeps the identity.\n let detachFailed = false;\n if (cartSync) {\n detachFailed = !(await syncCartBuyerIdentity(cartSync, context, null, \"logout\"));\n }\n const headers = new Headers(await commitSession(sessionManager));\n if (cartSync && detachFailed) headers.append(\"set-cookie\", cartSync.expiredCartCookie);\n return redirectResult(logoutUrl, headers);\n}\n\nasync function handleAuthorizeRoute(\n customerSession: CustomerSession,\n context: CustomerAccountRuntimeRouteHandlerContext,\n loginFailedRedirectPath: string,\n originOption: string | ((request: Request) => string) | undefined,\n cartSync: CartBuyerIdentitySync | undefined,\n): Promise<CustomerAccountRouteResult> {\n const { request, sessionManager, requestContext } = context;\n try {\n if (!cartSync) {\n const location = await customerSession.handleOAuthCallback(\n sessionManager,\n requestContext,\n request,\n );\n return redirectResult(location, await commitSession(sessionManager));\n }\n\n const { location, accessToken } = await handleOAuthCallbackWithAccessToken(\n customerSession,\n sessionManager,\n requestContext,\n request,\n );\n // Best-effort: the customer is authenticated at this point, so a failed\n // cart sync must not turn a successful login into an error response. The\n // next refresh retries the attach.\n await syncCartBuyerIdentity(cartSync, context, accessToken, \"authorize\");\n return redirectResult(location, await commitSession(sessionManager));\n } catch (error) {\n if (!(error instanceof CustomerAccountOAuthError)) throw error;\n const origin = await resolveRouteOrigin(sessionManager, request, originOption);\n return redirectResult(\n sanitizeReturnTo(loginFailedRedirectPath, origin),\n await commitSession(sessionManager),\n );\n }\n}\n\nasync function handleRefreshRoute(\n customerSession: CustomerSession,\n context: CustomerAccountRuntimeRouteHandlerContext,\n originOption: string | ((request: Request) => string) | undefined,\n cartSync: CartBuyerIdentitySync | undefined,\n): Promise<CustomerAccountRouteResult> {\n const { request, sessionManager, requestContext } = context;\n const origin = await resolveRouteOrigin(sessionManager, request, originOption);\n if (!cartSync) {\n await customerSession.getOrRefreshAccessToken(sessionManager, requestContext, { origin });\n return refreshRedirectResult(request, origin, await commitSession(sessionManager));\n }\n\n const refreshResult = await getOrRefreshAccessTokenWithStatus(\n customerSession,\n sessionManager,\n requestContext,\n { origin },\n );\n // Transient refresh failures keep the refreshable session, so the cart's\n // identity is left untouched; a definitive outcome attaches or detaches it.\n let detachFailed = false;\n if (refreshResult.status !== \"transient\") {\n const customerAccessToken = refreshResult.accessToken ?? null;\n const syncSucceeded = await syncCartBuyerIdentity(\n cartSync,\n context,\n customerAccessToken,\n \"refresh\",\n );\n detachFailed = customerAccessToken === null && !syncSucceeded;\n }\n\n const headers = new Headers(await commitSession(sessionManager));\n if (detachFailed) headers.append(\"set-cookie\", cartSync.expiredCartCookie);\n return refreshRedirectResult(request, origin, headers);\n}\n\nfunction refreshRedirectResult(\n request: Request,\n origin: string,\n headers?: HeadersInit,\n): ShopifyRouteRedirectResult {\n const requestUrl = new URL(request.url);\n const returnTo =\n requestUrl.searchParams.get(\"return_to\") ?? requestUrl.searchParams.get(\"returnTo\");\n return redirectResult(sanitizeReturnTo(returnTo, origin), headers);\n}\n\nasync function handleOAuthCallbackWithAccessToken(\n customerSession: CustomerSession,\n sessionManager: WritableCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n request: Request,\n): Promise<OAuthCallbackResult> {\n const internal = customerSessionInternals.get(customerSession);\n if (!internal) {\n throw new Error(\"Customer session was not created by createCustomerSession\");\n }\n return internal.handleOAuthCallback(sessionManager, requestContext, request);\n}\n\nasync function getOrRefreshAccessTokenWithStatus(\n customerSession: CustomerSession,\n sessionManager: WritableCustomerSessionManager,\n requestContext: ShopifyRequestContext,\n options: RequestOriginOptions,\n): Promise<TokenRefreshResult> {\n const internal = customerSessionInternals.get(customerSession);\n if (!internal) {\n throw new Error(\"Customer session was not created by createCustomerSession\");\n }\n return internal.getOrRefreshAccessToken(sessionManager, requestContext, options);\n}\n\nasync function syncCartBuyerIdentity(\n cartSync: CartBuyerIdentitySync,\n context: CustomerAccountRuntimeRouteHandlerContext,\n customerAccessToken: string | null,\n route: \"authorize\" | \"refresh\" | \"logout\",\n): Promise<boolean> {\n try {\n if (!context.storefrontClient) {\n throw new Error(\n \"Customer Account handlers configured with cartServerHandlers require storefrontClient.\",\n );\n }\n await cartSync.updateBuyerIdentity(\n { request: context.request, storefrontClient: context.storefrontClient },\n customerAccessToken,\n );\n return true;\n } catch (error) {\n log.error(\"cart buyer identity sync failed\", { route, error });\n return false;\n }\n}\n\nasync function resolveRouteOrigin(\n sessionManager: WritableCustomerSessionManager,\n request: Request,\n originOption: string | ((request: Request) => string) | undefined,\n) {\n if (typeof originOption === \"function\") return normalizeOrigin(originOption(request));\n return getResolvedOrigin(sessionManager, originOption);\n}\n\nasync function getResolvedOrigin(\n sessionManager: WritableCustomerSessionManager,\n originOverride: string | undefined,\n) {\n return normalizeOrigin(originOverride ?? (await sessionManager.getSessionOrigin()));\n}\n\nfunction getOptionalSearchParam(url: URL, name: string): string | undefined {\n return url.searchParams.get(name) ?? undefined;\n}\n\nfunction redirectResult(location: string, headers?: HeadersInit): ShopifyRouteRedirectResult {\n const redirectHeaders = new Headers(headers);\n redirectHeaders.set(\"cache-control\", NO_STORE_CACHE_CONTROL);\n return { type: \"redirect\", location, headers: redirectHeaders };\n}\n\nfunction forbiddenResult(): ShopifyRouteErrorResult {\n return {\n type: \"error\",\n status: FORBIDDEN_STATUS,\n error: { code: FORBIDDEN_ERROR_CODE, message: FORBIDDEN_ERROR_MESSAGE },\n headers: { \"cache-control\": NO_STORE_CACHE_CONTROL },\n };\n}\n\nasync function commitSession(\n sessionManager: WritableCustomerSessionManager,\n): Promise<HeadersInit | undefined> {\n return (await sessionManager.commit?.()) ?? undefined;\n}\n\nasync function completeOAuthCallback({\n sessionManager,\n request,\n endpoints,\n customerAccountApiClientId,\n fetch,\n timeoutInMs,\n}: {\n sessionManager: WritableCustomerSessionManager;\n request: Request;\n endpoints: CustomerAccountEndpoints;\n customerAccountApiClientId: string;\n fetch: typeof globalThis.fetch;\n timeoutInMs: number;\n}): Promise<OAuthCallbackResult> {\n const requestUrl = new URL(request.url);\n const code = requestUrl.searchParams.get(\"code\");\n const state = requestUrl.searchParams.get(\"state\");\n const sessionData = await readSessionData(sessionManager);\n const pendingLogin = getPendingLogin(sessionData);\n\n assertOAuthCallbackParams(code, state, pendingLogin);\n\n const origin = pendingLogin.origin ?? getOriginFromRequest(request);\n const tokenResponse = await exchangeAuthorizationCode({\n endpoints,\n customerAccountApiClientId,\n origin,\n code,\n codeVerifier: pendingLogin.codeVerifier,\n fetch,\n timeoutInMs,\n });\n validateIdTokenClaims(tokenResponse.id_token, {\n audience: customerAccountApiClientId,\n issuer: endpoints.issuer,\n nonce: pendingLogin.nonce,\n });\n\n await writeSessionData(sessionManager, {\n tokens: createTokensFromResponse(tokenResponse),\n });\n\n return {\n location: pendingLogin.returnTo ?? DEFAULT_LOGIN_RETURN_TO_PATH,\n accessToken: tokenResponse.access_token,\n };\n}\n\nfunction isSameOriginPost(request: Request, trustedOrigin: string): boolean {\n const origin = request.headers.get(\"origin\");\n if (origin) {\n try {\n return normalizeOrigin(origin) === trustedOrigin;\n } catch {\n return false;\n }\n }\n\n const referer = request.headers.get(\"referer\");\n if (!referer) return false;\n\n try {\n return normalizeOrigin(new URL(referer).origin) === trustedOrigin;\n } catch {\n return false;\n }\n}\n\nfunction assertOAuthCallbackParams(\n code: string | null,\n state: string | null,\n pendingLogin: Required<PendingLogin>,\n): asserts code is string {\n if (!code || !state) {\n throw new CustomerAccountOAuthError(\n \"missing_callback_params\",\n \"OAuth callback is missing code or state\",\n );\n }\n\n if (pendingLogin.state !== state) {\n throw new CustomerAccountOAuthError(\n \"state_mismatch\",\n \"OAuth callback state does not match session state\",\n );\n }\n}\n\nasync function exchangeAuthorizationCode({\n endpoints,\n customerAccountApiClientId,\n origin,\n code,\n codeVerifier,\n fetch,\n timeoutInMs,\n}: {\n endpoints: CustomerAccountEndpoints;\n customerAccountApiClientId: string;\n origin: string;\n code: string;\n codeVerifier: string;\n fetch: typeof globalThis.fetch;\n timeoutInMs: number;\n}): Promise<Required<ParsedTokenEndpointResponse>> {\n const body = new URLSearchParams({\n grant_type: AUTHORIZATION_CODE_GRANT_TYPE,\n client_id: customerAccountApiClientId,\n redirect_uri: `${origin}${CUSTOMER_ACCOUNT_AUTHORIZE_PATH}`,\n code,\n code_verifier: codeVerifier,\n });\n return withTokenRequestTimeout(timeoutInMs, async (signal) => {\n const response = await postTokenRequest({\n url: endpoints.tokenUrl,\n origin,\n body,\n fetch,\n signal,\n });\n\n if (!response.ok) {\n cancelResponseBody(response);\n const errorCode =\n response.status === 400 || response.status === 401\n ? \"token_exchange_rejected\"\n : \"token_exchange_failed\";\n throw new CustomerAccountOAuthError(\n errorCode,\n `Customer Account OAuth token exchange failed with ${response.status}`,\n );\n }\n\n return parseRequiredTokenResponse(await readTokenResponseJson(response, signal));\n });\n}\n\nasync function getRefreshResult({\n refreshFlights,\n refreshToken,\n idToken,\n origin,\n endpoints,\n customerAccountApiClientId,\n fetch,\n timeoutInMs,\n}: {\n refreshFlights: Map<string, Promise<RefreshResult>>;\n refreshToken: string;\n idToken: string | undefined;\n origin: string;\n endpoints: CustomerAccountEndpoints;\n customerAccountApiClientId: string;\n fetch: typeof globalThis.fetch;\n timeoutInMs: number;\n}) {\n const flightKey = `${origin}\\n${refreshToken}`;\n const existingFlight = refreshFlights.get(flightKey);\n if (existingFlight) return existingFlight;\n\n const flight = refreshAccessToken({\n endpoints,\n customerAccountApiClientId,\n refreshToken,\n idToken,\n origin,\n fetch,\n timeoutInMs,\n });\n refreshFlights.set(flightKey, flight);\n\n try {\n return await flight;\n } finally {\n refreshFlights.delete(flightKey);\n }\n}\n\nasync function refreshAccessToken({\n endpoints,\n customerAccountApiClientId,\n refreshToken,\n idToken,\n origin,\n fetch,\n timeoutInMs,\n}: {\n endpoints: CustomerAccountEndpoints;\n customerAccountApiClientId: string;\n refreshToken: string;\n idToken: string | undefined;\n origin: string;\n fetch: typeof globalThis.fetch;\n timeoutInMs: number;\n}): Promise<RefreshResult> {\n const body = new URLSearchParams({\n grant_type: REFRESH_TOKEN_GRANT_TYPE,\n client_id: customerAccountApiClientId,\n refresh_token: refreshToken,\n });\n\n try {\n return await withTokenRequestTimeout(timeoutInMs, async (signal) => {\n const response = await postTokenRequest({\n url: endpoints.tokenUrl,\n origin,\n body,\n fetch,\n signal,\n });\n return readRefreshResult(response, refreshToken, idToken, signal);\n });\n } catch {\n return { type: \"transient\" };\n }\n}\n\nasync function readRefreshResult(\n response: Response,\n currentRefreshToken: string,\n currentIdToken: string | undefined,\n signal: AbortSignal,\n): Promise<RefreshResult> {\n if (response.status === 400 || response.status === 401) {\n cancelResponseBody(response);\n return { type: \"invalid\" };\n }\n\n if (!response.ok) {\n cancelResponseBody(response);\n return { type: \"transient\" };\n }\n\n try {\n const tokenResponse = await readTokenResponseJson(response, signal);\n const parsedTokenResponse = parseRefreshTokenResponse(tokenResponse);\n return {\n type: \"success\",\n tokens: createTokensFromResponse({\n ...parsedTokenResponse,\n refresh_token: parsedTokenResponse.refresh_token ?? currentRefreshToken,\n id_token: parsedTokenResponse.id_token ?? currentIdToken,\n }),\n };\n } catch {\n return { type: \"transient\" };\n }\n}\n\nasync function postTokenRequest({\n url,\n origin,\n body,\n fetch,\n signal,\n}: TokenRequestParams): Promise<Response> {\n return await withAbort(\n fetch(url, {\n method: \"POST\",\n headers: new Headers({\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n \"User-Agent\": USER_AGENT,\n Origin: origin,\n }),\n body,\n cache: \"no-store\",\n redirect: \"manual\",\n signal,\n }),\n signal,\n );\n}\n\nasync function withTokenRequestTimeout<T>(\n timeoutInMs: number,\n operation: (signal: AbortSignal) => Promise<T>,\n): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n controller.abort(\n new CustomerAccountApiError(\n `Customer Account OAuth request timed out after ${timeoutInMs}ms`,\n ),\n );\n }, timeoutInMs);\n\n try {\n return await operation(controller.signal);\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\nfunction withAbort<T>(promise: T | Promise<T>, signal: AbortSignal): Promise<T> {\n if (signal.aborted) return Promise.reject(getAbortReason(signal));\n\n return new Promise<T>((resolve, reject) => {\n const abort = () => {\n signal.removeEventListener(\"abort\", abort);\n reject(getAbortReason(signal));\n };\n signal.addEventListener(\"abort\", abort, { once: true });\n Promise.resolve(promise).then(\n (value) => {\n signal.removeEventListener(\"abort\", abort);\n resolve(value);\n },\n (error) => {\n signal.removeEventListener(\"abort\", abort);\n reject(error);\n },\n );\n });\n}\n\nfunction getAbortReason(signal: AbortSignal): unknown {\n return signal.reason ?? new DOMException(\"signal is aborted without reason\", \"AbortError\");\n}\n\nasync function readTokenResponseJson(\n response: Response,\n signal: AbortSignal,\n): Promise<TokenEndpointResponse> {\n const json = await withAbort(response.json(), signal);\n if (!isObjectRecord(json)) {\n throw new CustomerAccountOAuthError(\n \"invalid_token_response\",\n \"Customer Account OAuth response must be an object\",\n );\n }\n return {\n access_token: json.access_token,\n refresh_token: json.refresh_token,\n id_token: json.id_token,\n expires_in: json.expires_in,\n };\n}\n\nfunction parseRequiredTokenResponse(\n response: TokenEndpointResponse,\n): Required<ParsedTokenEndpointResponse> {\n const parsed = parseRefreshTokenResponse(response);\n if (typeof response.refresh_token !== \"string\" || response.refresh_token === \"\") {\n throw new CustomerAccountOAuthError(\n \"invalid_token_response\",\n \"Customer Account OAuth response is missing refresh_token\",\n );\n }\n\n if (typeof response.id_token !== \"string\" || response.id_token === \"\") {\n throw new CustomerAccountOAuthError(\n \"invalid_token_response\",\n \"Customer Account OAuth response is missing id_token\",\n );\n }\n return { ...parsed, refresh_token: response.refresh_token, id_token: response.id_token };\n}\n\nfunction parseRefreshTokenResponse(response: TokenEndpointResponse): ParsedTokenEndpointResponse {\n if (typeof response.access_token !== \"string\" || response.access_token === \"\") {\n throw new CustomerAccountOAuthError(\n \"invalid_token_response\",\n \"Customer Account OAuth response is missing access_token\",\n );\n }\n\n if (\n typeof response.expires_in !== \"number\" ||\n !Number.isFinite(response.expires_in) ||\n response.expires_in <= 0\n ) {\n throw new CustomerAccountOAuthError(\n \"invalid_token_response\",\n \"Customer Account OAuth response is missing expires_in\",\n );\n }\n\n return {\n access_token: response.access_token,\n refresh_token:\n typeof response.refresh_token === \"string\" && response.refresh_token !== \"\"\n ? response.refresh_token\n : undefined,\n id_token:\n typeof response.id_token === \"string\" && response.id_token !== \"\"\n ? response.id_token\n : undefined,\n expires_in: response.expires_in,\n };\n}\n\nfunction createTokensFromResponse(response: ParsedTokenEndpointResponse): CustomerAccountTokens {\n return {\n accessToken: response.access_token,\n refreshToken: response.refresh_token,\n idToken: response.id_token,\n expiresAt:\n Date.now() + (response.expires_in - EXPIRY_BUFFER_IN_SECONDS) * MILLISECONDS_PER_SECOND,\n };\n}\n\nfunction validateIdTokenClaims(\n idToken: string,\n expected: { audience: string; issuer: string; nonce: string },\n): void {\n const claims = parseJwtPayload(idToken);\n if (claims.nonce !== expected.nonce) {\n throw new CustomerAccountOAuthError(\n \"nonce_mismatch\",\n \"OAuth id_token nonce does not match session nonce\",\n );\n }\n\n if (claims.iss !== expected.issuer) {\n throw new CustomerAccountOAuthError(\n \"issuer_mismatch\",\n \"OAuth id_token issuer does not match Customer Account issuer\",\n );\n }\n\n if (!hasAudienceClaim(claims.aud, expected.audience)) {\n throw new CustomerAccountOAuthError(\n \"audience_mismatch\",\n \"OAuth id_token audience does not match Customer Account client ID\",\n );\n }\n\n if (\n typeof claims.exp !== \"number\" ||\n claims.exp <= Math.floor(Date.now() / MILLISECONDS_PER_SECOND)\n ) {\n throw new CustomerAccountOAuthError(\"expired_id_token\", \"OAuth id_token is expired\");\n }\n}\n\nfunction parseJwtPayload(idToken: string): Record<string, unknown> {\n try {\n const [, payload] = idToken.split(\".\");\n if (!payload) throw new Error(\"Missing JWT payload\");\n\n const decodedPayload = JSON.parse(base64UrlDecode(payload));\n if (!isObjectRecord(decodedPayload)) throw new Error(\"JWT payload must be an object\");\n\n return decodedPayload;\n } catch (cause) {\n throw new CustomerAccountOAuthError(\n \"invalid_id_token\",\n \"Customer Account OAuth id_token is invalid\",\n { cause },\n );\n }\n}\n\nfunction hasAudienceClaim(audience: unknown, expectedAudience: string): boolean {\n if (audience === expectedAudience) return true;\n if (!Array.isArray(audience)) return false;\n return audience.includes(expectedAudience);\n}\n\nasync function readSessionData(\n sessionManager: ReadonlyCustomerSessionManager,\n): Promise<CustomerAccountSessionData> {\n const value = await sessionManager.getSessionItem(CUSTOMER_ACCOUNT_SESSION_KEY);\n return isCustomerAccountSessionData(value) ? value : {};\n}\n\nasync function writeSessionData(\n sessionManager: WritableCustomerSessionManager,\n sessionData: CustomerAccountSessionData,\n): Promise<void> {\n await sessionManager.setSessionItem(CUSTOMER_ACCOUNT_SESSION_KEY, sessionData);\n}\n\nasync function writeTokens(\n sessionManager: WritableCustomerSessionManager,\n tokens: CustomerAccountTokens,\n): Promise<void> {\n const sessionData = await readSessionData(sessionManager);\n await writeSessionData(sessionManager, { ...sessionData, tokens });\n}\n\nasync function clearTokens(sessionManager: WritableCustomerSessionManager): Promise<void> {\n const sessionData = await readSessionData(sessionManager);\n const { pendingLogin } = sessionData;\n if (pendingLogin) {\n await writeSessionData(sessionManager, { pendingLogin });\n return;\n }\n\n await sessionManager.removeSessionItem(CUSTOMER_ACCOUNT_SESSION_KEY);\n}\n\nasync function clearPendingLogin(sessionManager: WritableCustomerSessionManager): Promise<void> {\n const sessionData = await readSessionData(sessionManager);\n const { tokens } = sessionData;\n if (tokens) {\n await writeSessionData(sessionManager, { tokens });\n return;\n }\n\n await sessionManager.removeSessionItem(CUSTOMER_ACCOUNT_SESSION_KEY);\n}\n\nfunction getUsableAccessToken(sessionData: CustomerAccountSessionData): string | undefined {\n const tokens = sessionData.tokens;\n if (!isTokenUsable(tokens)) return undefined;\n return tokens.accessToken;\n}\n\nfunction hasCustomerSession(sessionData: CustomerAccountSessionData): boolean {\n return (\n getUsableAccessToken(sessionData) !== undefined || getRefreshToken(sessionData) !== undefined\n );\n}\n\nfunction getRefreshToken(sessionData: CustomerAccountSessionData): string | undefined {\n const refreshToken = sessionData.tokens?.refreshToken;\n return typeof refreshToken === \"string\" && refreshToken !== \"\" ? refreshToken : undefined;\n}\n\nfunction getPendingLogin(sessionData: CustomerAccountSessionData): Required<PendingLogin> {\n const pendingLogin = sessionData.pendingLogin;\n if (isPendingLoginReady(pendingLogin)) return pendingLogin;\n throw new CustomerAccountOAuthError(\n \"missing_pending_login\",\n \"OAuth callback has no pending login state\",\n );\n}\n\nfunction isTokenUsable(\n tokens: CustomerAccountSessionData[\"tokens\"],\n): tokens is Required<CustomerAccountTokens> {\n if (!tokens || typeof tokens.accessToken !== \"string\" || tokens.accessToken === \"\") return false;\n if (typeof tokens.expiresAt !== \"number\") return false;\n return tokens.expiresAt > Date.now();\n}\n\nfunction isPendingLoginReady(\n pendingLogin: PendingLogin | undefined,\n): pendingLogin is Required<PendingLogin> {\n if (!pendingLogin) return false;\n if (!isNonEmptyString(pendingLogin.state)) return false;\n if (!isNonEmptyString(pendingLogin.nonce)) return false;\n if (!isNonEmptyString(pendingLogin.codeVerifier)) return false;\n if (!isNonEmptyString(pendingLogin.returnTo)) return false;\n if (!isNonEmptyString(pendingLogin.origin)) return false;\n if (typeof pendingLogin.createdAt !== \"number\") return false;\n return Date.now() - pendingLogin.createdAt <= PENDING_LOGIN_TTL_IN_MS;\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value !== \"\";\n}\n\nfunction isCustomerAccountSessionData(value: unknown): value is CustomerAccountSessionData {\n if (!isObjectRecord(value) || Array.isArray(value)) return false;\n const tokens = value.tokens;\n const pendingLogin = value.pendingLogin;\n if (tokens !== undefined && (!isObjectRecord(tokens) || Array.isArray(tokens))) return false;\n return (\n pendingLogin === undefined || (isObjectRecord(pendingLogin) && !Array.isArray(pendingLogin))\n );\n}\n\nfunction setOptionalLoginParams(loginUrl: URL, options: PrepareLoginUrlOptions): void {\n if (options.locale) loginUrl.searchParams.set(\"locale\", options.locale);\n if (options.countryCode) loginUrl.searchParams.set(\"region_country\", options.countryCode);\n if (options.acrValues) loginUrl.searchParams.set(\"acr_values\", options.acrValues);\n if (!options.loginHint) return;\n\n loginUrl.searchParams.set(\"login_hint\", options.loginHint);\n if (options.loginHintMode) loginUrl.searchParams.set(\"login_hint_mode\", options.loginHintMode);\n}\n\nfunction sanitizeReturnTo(\n returnTo: string | null | undefined,\n origin: string,\n fallbackReturnTo = DEFAULT_LOGIN_RETURN_TO_PATH,\n): string {\n if (!returnTo) return fallbackReturnTo;\n\n try {\n const url = new URL(returnTo, origin);\n if (url.origin !== origin) return fallbackReturnTo;\n const sanitizedReturnTo = `${url.pathname}${url.search}${url.hash}`;\n if (new TextEncoder().encode(sanitizedReturnTo).byteLength > MAX_RETURN_TO_LENGTH_IN_BYTES) {\n return fallbackReturnTo;\n }\n return sanitizedReturnTo;\n } catch {\n return fallbackReturnTo;\n }\n}\n\nfunction absoluteSameOriginUrl(url: string, origin: string): string {\n const parsedUrl = new URL(url, origin);\n if (parsedUrl.origin !== origin) return origin;\n return parsedUrl.toString();\n}\n\nasync function createCodeChallenge(codeVerifier: string): Promise<string> {\n const digest = await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(codeVerifier));\n return base64UrlEncode(String.fromCharCode(...new Uint8Array(digest)));\n}\n\nfunction generateRandomBase64Url(): string {\n const bytes = new Uint8Array(RANDOM_BYTES_LENGTH);\n crypto.getRandomValues(bytes);\n return base64UrlEncode(String.fromCharCode(...bytes));\n}\n\nfunction base64UrlEncode(value: string): string {\n return btoa(value).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n}\n\nfunction base64UrlDecode(value: string): string {\n const base64 = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const paddingLength = (4 - (base64.length % 4)) % 4;\n return atob(base64.padEnd(base64.length + paddingLength, \"=\"));\n}\n\ntype CustomerAccountEndpoints = {\n authorizeUrl: string;\n tokenUrl: string;\n logoutUrl: string;\n issuer: string;\n};\n\nfunction createCustomerAccountEndpoints(\n shopId: string,\n customerAccountApiUrl: string | undefined,\n): CustomerAccountEndpoints {\n const authBaseUrl = normalizeAuthBaseUrl(\n customerAccountApiUrl ?? `https://shopify.com/authentication/${shopId}`,\n );\n return {\n authorizeUrl: `${authBaseUrl}/oauth/authorize`,\n tokenUrl: `${authBaseUrl}/oauth/token`,\n logoutUrl: `${authBaseUrl}/logout`,\n issuer: authBaseUrl,\n };\n}\n\nfunction normalizeAuthBaseUrl(customerAccountApiUrl: string): string {\n const url = new URL(customerAccountApiUrl);\n if (url.protocol !== \"https:\") {\n throw new Error(\"customerAccountApiUrl must use HTTPS\");\n }\n return url.toString().replace(/\\/$/, \"\");\n}\n\nfunction getOriginFromRequest(request: Request): string {\n return normalizeOrigin(new URL(request.url).origin);\n}\n\nfunction normalizeOrigin(origin: string): string {\n const url = new URL(origin);\n if (url.protocol === \"https:\") return url.origin;\n throw new Error(\n \"Customer Account OAuth origin must use HTTPS. Use a public HTTPS tunnel for local Customer Account login.\",\n );\n}\n\nfunction cancelResponseBody(response: Response): void {\n try {\n void response.body?.cancel().catch(() => undefined);\n } catch {}\n}\n\nfunction validateShopId(shopId: string): void {\n if (!SHOP_ID_RE.test(shopId)) {\n throw new Error(\"shopId must be a numeric Shopify shop ID string\");\n }\n}\n\nfunction validateCustomerAccountApiClientId(customerAccountApiClientId: string): void {\n if (typeof customerAccountApiClientId !== \"string\" || customerAccountApiClientId.trim() === \"\") {\n throw new Error(\"customerAccountApiClientId is required\");\n }\n}\n\nfunction validateTimeout(timeoutInMs: number): void {\n if (\n !Number.isSafeInteger(timeoutInMs) ||\n timeoutInMs <= 0 ||\n timeoutInMs > MAX_SET_TIMEOUT_IN_MS\n ) {\n throw new Error(\n `defaultTimeoutInMs must be a positive safe integer no greater than ${MAX_SET_TIMEOUT_IN_MS}`,\n );\n }\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { CustomerAccountScalars } from "../graphql/scalars.mjs";
2
+ import { GraphQLSchemaFor, InferResultForSchema, InferVariablesForSchema } from "../graphql/type-resolver.mjs";
3
+ import { introspection } from "../graphql/generated/customer-account-graphql-env.mjs";
4
+
5
+ //#region src/customer-account/type-resolver.d.ts
6
+ type CustomerAccountSchema = GraphQLSchemaFor<introspection, CustomerAccountScalars>;
7
+ type InferResult<T extends string> = InferResultForSchema<T, CustomerAccountSchema>;
8
+ type InferVariables<T extends string> = InferVariablesForSchema<T, CustomerAccountSchema>;
9
+ //#endregion
10
+ export { InferResult, InferVariables };
11
+ //# sourceMappingURL=type-resolver.d.mts.map