@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,70 @@
1
+ import { gql } from "../../graphql/graphql.mjs";
2
+
3
+ //#region src/core/cart/queries.ts
4
+ const CART_FRAGMENT_NAME = "CartFragment";
5
+ const CART_FRAGMENT_CONTRACT = {
6
+ name: CART_FRAGMENT_NAME,
7
+ typeName: "Cart"
8
+ };
9
+ const CART_FRAGMENT_PATTERN = createFragmentPattern(CART_FRAGMENT_CONTRACT);
10
+ const HYDROGEN_CART_FRAGMENT = gql(`fragment HydrogenCartFragment on Cart{id checkoutUrl totalQuantity note attributes{key value}cost{subtotalAmount{amount currencyCode}totalAmount{amount currencyCode}checkoutChargeAmount{amount currencyCode}}lines(first:250){nodes{id quantity attributes{key value}cost{totalAmount{amount currencyCode}subtotalAmount{amount currencyCode}amountPerQuantity{amount currencyCode}compareAtAmountPerQuantity{amount currencyCode}}merchandise{...on ProductVariant{id title sku image{id url altText width height}product{id title handle vendor productType}selectedOptions{name value}}}sellingPlanAllocation{sellingPlan{id}}...on CartLine{parentRelationship{parent{id}}}}}discountCodes{applicable code}}`);
11
+ const CART_QUERY = gql(`query Cart($id:ID!$country:CountryCode$language:LanguageCode)@inContext(country:$country language:$language){cart(id:$id){...HydrogenCartFragment}}`, [HYDROGEN_CART_FRAGMENT]);
12
+ const CART_CREATE_MUTATION = gql(`mutation CartCreate($input:CartInput!$country:CountryCode$language:LanguageCode)@inContext(country:$country language:$language){cartCreate(input:$input){cart{...HydrogenCartFragment}userErrors{code field message}warnings{code message target}}}`, [HYDROGEN_CART_FRAGMENT]);
13
+ const CART_LINES_ADD_MUTATION = gql(`mutation CartLinesAdd($cartId:ID!$lines:[CartLineInput!]!$country:CountryCode$language:LanguageCode)@inContext(country:$country language:$language){cartLinesAdd(cartId:$cartId lines:$lines){cart{...HydrogenCartFragment}userErrors{code field message}warnings{code message target}}}`, [HYDROGEN_CART_FRAGMENT]);
14
+ const CART_LINES_UPDATE_MUTATION = gql(`mutation CartLinesUpdate($cartId:ID!$lines:[CartLineUpdateInput!]!$country:CountryCode$language:LanguageCode)@inContext(country:$country language:$language){cartLinesUpdate(cartId:$cartId lines:$lines){cart{...HydrogenCartFragment}userErrors{code field message}warnings{code message target}}}`, [HYDROGEN_CART_FRAGMENT]);
15
+ const CART_LINES_REMOVE_MUTATION = gql(`mutation CartLinesRemove($cartId:ID!$lineIds:[ID!]!$country:CountryCode$language:LanguageCode)@inContext(country:$country language:$language){cartLinesRemove(cartId:$cartId lineIds:$lineIds){cart{...HydrogenCartFragment}userErrors{code field message}warnings{code message target}}}`, [HYDROGEN_CART_FRAGMENT]);
16
+ const CART_DISCOUNT_CODES_UPDATE_MUTATION = gql(`mutation CartDiscountCodesUpdate($cartId:ID!$discountCodes:[String!]!$country:CountryCode$language:LanguageCode)@inContext(country:$country language:$language){cartDiscountCodesUpdate(cartId:$cartId discountCodes:$discountCodes){cart{...HydrogenCartFragment}userErrors{code field message}warnings{code message target}}}`, [HYDROGEN_CART_FRAGMENT]);
17
+ const CART_NOTE_UPDATE_MUTATION = gql(`mutation CartNoteUpdate($cartId:ID!$note:String!$country:CountryCode$language:LanguageCode)@inContext(country:$country language:$language){cartNoteUpdate(cartId:$cartId note:$note){cart{...HydrogenCartFragment}userErrors{code field message}warnings{code message target}}}`, [HYDROGEN_CART_FRAGMENT]);
18
+ const CART_ATTRIBUTES_UPDATE_MUTATION = gql(`mutation CartAttributesUpdate($cartId:ID!$attributes:[AttributeInput!]!$country:CountryCode$language:LanguageCode)@inContext(country:$country language:$language){cartAttributesUpdate(cartId:$cartId attributes:$attributes){cart{...HydrogenCartFragment}userErrors{code field message}warnings{code message target}}}`, [HYDROGEN_CART_FRAGMENT]);
19
+ const CUSTOM_CART_QUERY = gql(`query Cart($id:ID!$country:CountryCode$language:LanguageCode)@inContext(country:$country language:$language){cart(id:$id){...HydrogenCartFragment ...${CART_FRAGMENT_NAME}}}`, [HYDROGEN_CART_FRAGMENT]);
20
+ const CUSTOM_CART_CREATE_MUTATION = gql(`mutation CartCreate($input:CartInput!$country:CountryCode$language:LanguageCode)@inContext(country:$country language:$language){cartCreate(input:$input){cart{...HydrogenCartFragment ...${CART_FRAGMENT_NAME}}userErrors{code field message}warnings{code message target}}}`, [HYDROGEN_CART_FRAGMENT]);
21
+ const CUSTOM_CART_LINES_ADD_MUTATION = gql(`mutation CartLinesAdd($cartId:ID!$lines:[CartLineInput!]!$country:CountryCode$language:LanguageCode)@inContext(country:$country language:$language){cartLinesAdd(cartId:$cartId lines:$lines){cart{...HydrogenCartFragment ...${CART_FRAGMENT_NAME}}userErrors{code field message}warnings{code message target}}}`, [HYDROGEN_CART_FRAGMENT]);
22
+ const CUSTOM_CART_LINES_UPDATE_MUTATION = gql(`mutation CartLinesUpdate($cartId:ID!$lines:[CartLineUpdateInput!]!$country:CountryCode$language:LanguageCode)@inContext(country:$country language:$language){cartLinesUpdate(cartId:$cartId lines:$lines){cart{...HydrogenCartFragment ...${CART_FRAGMENT_NAME}}userErrors{code field message}warnings{code message target}}}`, [HYDROGEN_CART_FRAGMENT]);
23
+ const CUSTOM_CART_LINES_REMOVE_MUTATION = gql(`mutation CartLinesRemove($cartId:ID!$lineIds:[ID!]!$country:CountryCode$language:LanguageCode)@inContext(country:$country language:$language){cartLinesRemove(cartId:$cartId lineIds:$lineIds){cart{...HydrogenCartFragment ...${CART_FRAGMENT_NAME}}userErrors{code field message}warnings{code message target}}}`, [HYDROGEN_CART_FRAGMENT]);
24
+ const CUSTOM_CART_DISCOUNT_CODES_UPDATE_MUTATION = gql(`mutation CartDiscountCodesUpdate($cartId:ID!$discountCodes:[String!]!$country:CountryCode$language:LanguageCode)@inContext(country:$country language:$language){cartDiscountCodesUpdate(cartId:$cartId discountCodes:$discountCodes){cart{...HydrogenCartFragment ...${CART_FRAGMENT_NAME}}userErrors{code field message}warnings{code message target}}}`, [HYDROGEN_CART_FRAGMENT]);
25
+ const CUSTOM_CART_NOTE_UPDATE_MUTATION = gql(`mutation CartNoteUpdate($cartId:ID!$note:String!$country:CountryCode$language:LanguageCode)@inContext(country:$country language:$language){cartNoteUpdate(cartId:$cartId note:$note){cart{...HydrogenCartFragment ...${CART_FRAGMENT_NAME}}userErrors{code field message}warnings{code message target}}}`, [HYDROGEN_CART_FRAGMENT]);
26
+ const CUSTOM_CART_ATTRIBUTES_UPDATE_MUTATION = gql(`mutation CartAttributesUpdate($cartId:ID!$attributes:[AttributeInput!]!$country:CountryCode$language:LanguageCode)@inContext(country:$country language:$language){cartAttributesUpdate(cartId:$cartId attributes:$attributes){cart{...HydrogenCartFragment ...${CART_FRAGMENT_NAME}}userErrors{code field message}warnings{code message target}}}`, [HYDROGEN_CART_FRAGMENT]);
27
+ const CART_BUYER_IDENTITY_UPDATE_MUTATION_SOURCE = `mutation CartBuyerIdentityUpdate($cartId:ID!$buyerIdentity:CartBuyerIdentityInput!){cartBuyerIdentityUpdate(cartId:$cartId buyerIdentity:$buyerIdentity){cart{id}userErrors{code field message}}}`;
28
+ const DEFAULT_CART_QUERIES = {
29
+ cart: CART_QUERY,
30
+ cartCreate: CART_CREATE_MUTATION,
31
+ cartLinesAdd: CART_LINES_ADD_MUTATION,
32
+ cartLinesUpdate: CART_LINES_UPDATE_MUTATION,
33
+ cartLinesRemove: CART_LINES_REMOVE_MUTATION,
34
+ cartDiscountCodesUpdate: CART_DISCOUNT_CODES_UPDATE_MUTATION,
35
+ cartNoteUpdate: CART_NOTE_UPDATE_MUTATION,
36
+ cartAttributesUpdate: CART_ATTRIBUTES_UPDATE_MUTATION
37
+ };
38
+ const cartBuyerIdentityUpdateMutation = gql(CART_BUYER_IDENTITY_UPDATE_MUTATION_SOURCE);
39
+ function assertCartFragmentName(fragment) {
40
+ if (CART_FRAGMENT_PATTERN.test(fragment)) return;
41
+ throw new Error(`Cart fragment must be named ${CART_FRAGMENT_NAME} and target ${CART_FRAGMENT_CONTRACT.typeName}`);
42
+ }
43
+ function createFragmentPattern({ name, typeName }) {
44
+ return new RegExp(`fragment\\s+${name}\\s+on\\s+${typeName}`);
45
+ }
46
+ function createCartQueries(cartFragment) {
47
+ const fragments = [cartFragment];
48
+ return {
49
+ cart: gql(CUSTOM_CART_QUERY, fragments),
50
+ cartCreate: gql(CUSTOM_CART_CREATE_MUTATION, fragments),
51
+ cartLinesAdd: gql(CUSTOM_CART_LINES_ADD_MUTATION, fragments),
52
+ cartLinesUpdate: gql(CUSTOM_CART_LINES_UPDATE_MUTATION, fragments),
53
+ cartLinesRemove: gql(CUSTOM_CART_LINES_REMOVE_MUTATION, fragments),
54
+ cartDiscountCodesUpdate: gql(CUSTOM_CART_DISCOUNT_CODES_UPDATE_MUTATION, fragments),
55
+ cartNoteUpdate: gql(CUSTOM_CART_NOTE_UPDATE_MUTATION, fragments),
56
+ cartAttributesUpdate: gql(CUSTOM_CART_ATTRIBUTES_UPDATE_MUTATION, fragments)
57
+ };
58
+ }
59
+ function makeCartQueries(options) {
60
+ if (options) {
61
+ assertCartFragmentName(options.fragment);
62
+ return createCartQueries(options.fragment);
63
+ }
64
+ return DEFAULT_CART_QUERIES;
65
+ }
66
+ const cartQueries = makeCartQueries();
67
+
68
+ //#endregion
69
+ export { cartBuyerIdentityUpdateMutation, cartQueries, makeCartQueries };
70
+ //# sourceMappingURL=queries.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.mjs","names":[],"sources":["../../../../src/core/cart/queries.ts"],"sourcesContent":["import {\n gql,\n type AnyStorefrontQueryString,\n type ComposedSource,\n type SourceOf,\n type StorefrontQueryString,\n} from \"../../graphql\";\nimport type { InferResult, InferVariables } from \"../../graphql\";\nimport type { CartData, CartLineConnection } from \"./state\";\n\nconst CART_FRAGMENT_NAME = \"CartFragment\";\nconst CART_FRAGMENT_TYPE = \"Cart\";\n\ntype FragmentContract = {\n readonly name: string;\n readonly typeName: string;\n};\n\nconst CART_FRAGMENT_CONTRACT = {\n name: CART_FRAGMENT_NAME,\n typeName: CART_FRAGMENT_TYPE,\n} as const satisfies FragmentContract;\n\nconst CART_FRAGMENT_PATTERN = createFragmentPattern(CART_FRAGMENT_CONTRACT);\n\nconst HYDROGEN_CART_FRAGMENT = gql(`\n fragment HydrogenCartFragment on Cart {\n id\n checkoutUrl\n totalQuantity\n note\n attributes {\n key\n value\n }\n cost {\n subtotalAmount {\n amount\n currencyCode\n }\n totalAmount {\n amount\n currencyCode\n }\n checkoutChargeAmount {\n amount\n currencyCode\n }\n }\n lines(first: 250) {\n nodes {\n id\n quantity\n attributes {\n key\n value\n }\n cost {\n totalAmount {\n amount\n currencyCode\n }\n subtotalAmount {\n amount\n currencyCode\n }\n amountPerQuantity {\n amount\n currencyCode\n }\n compareAtAmountPerQuantity {\n amount\n currencyCode\n }\n }\n merchandise {\n ... on ProductVariant {\n id\n title\n sku\n image {\n id\n url\n altText\n width\n height\n }\n product {\n id\n title\n handle\n vendor\n productType\n }\n selectedOptions {\n name\n value\n }\n }\n }\n sellingPlanAllocation {\n sellingPlan {\n id\n }\n }\n ... on CartLine {\n parentRelationship {\n parent {\n id\n }\n }\n }\n }\n }\n discountCodes {\n applicable\n code\n }\n }\n`);\n\nconst CART_QUERY = gql(\n `query Cart($id: ID!, $country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cart(id: $id) {\n ...HydrogenCartFragment\n }\n }`,\n [HYDROGEN_CART_FRAGMENT],\n);\n\nconst CART_CREATE_MUTATION = gql(\n `mutation CartCreate($input: CartInput!, $country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cartCreate(input: $input) {\n cart {\n ...HydrogenCartFragment\n }\n userErrors {\n code\n field\n message\n }\n warnings {\n code\n message\n target\n }\n }\n }`,\n [HYDROGEN_CART_FRAGMENT],\n);\n\nconst CART_LINES_ADD_MUTATION = gql(\n `mutation CartLinesAdd($cartId: ID!, $lines: [CartLineInput!]!, $country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cartLinesAdd(cartId: $cartId, lines: $lines) {\n cart {\n ...HydrogenCartFragment\n }\n userErrors {\n code\n field\n message\n }\n warnings {\n code\n message\n target\n }\n }\n }`,\n [HYDROGEN_CART_FRAGMENT],\n);\n\nconst CART_LINES_UPDATE_MUTATION = gql(\n `mutation CartLinesUpdate($cartId: ID!, $lines: [CartLineUpdateInput!]!, $country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cartLinesUpdate(cartId: $cartId, lines: $lines) {\n cart {\n ...HydrogenCartFragment\n }\n userErrors {\n code\n field\n message\n }\n warnings {\n code\n message\n target\n }\n }\n }`,\n [HYDROGEN_CART_FRAGMENT],\n);\n\nconst CART_LINES_REMOVE_MUTATION = gql(\n `mutation CartLinesRemove($cartId: ID!, $lineIds: [ID!]!, $country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cartLinesRemove(cartId: $cartId, lineIds: $lineIds) {\n cart {\n ...HydrogenCartFragment\n }\n userErrors {\n code\n field\n message\n }\n warnings {\n code\n message\n target\n }\n }\n }`,\n [HYDROGEN_CART_FRAGMENT],\n);\n\nconst CART_DISCOUNT_CODES_UPDATE_MUTATION = gql(\n `mutation CartDiscountCodesUpdate($cartId: ID!, $discountCodes: [String!]!, $country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cartDiscountCodesUpdate(cartId: $cartId, discountCodes: $discountCodes) {\n cart {\n ...HydrogenCartFragment\n }\n userErrors {\n code\n field\n message\n }\n warnings {\n code\n message\n target\n }\n }\n }`,\n [HYDROGEN_CART_FRAGMENT],\n);\n\nconst CART_NOTE_UPDATE_MUTATION = gql(\n `mutation CartNoteUpdate($cartId: ID!, $note: String!, $country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cartNoteUpdate(cartId: $cartId, note: $note) {\n cart {\n ...HydrogenCartFragment\n }\n userErrors {\n code\n field\n message\n }\n warnings {\n code\n message\n target\n }\n }\n }`,\n [HYDROGEN_CART_FRAGMENT],\n);\n\nconst CART_ATTRIBUTES_UPDATE_MUTATION = gql(\n `mutation CartAttributesUpdate($cartId: ID!, $attributes: [AttributeInput!]!, $country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cartAttributesUpdate(cartId: $cartId, attributes: $attributes) {\n cart {\n ...HydrogenCartFragment\n }\n userErrors {\n code\n field\n message\n }\n warnings {\n code\n message\n target\n }\n }\n }`,\n [HYDROGEN_CART_FRAGMENT],\n);\n\n// The custom variants spread the consumer's `CartFragment`, which only exists\n// at runtime. Its spread is interpolated on purpose: the gql.tada plugin skips\n// documents containing interpolations instead of flagging an unknown fragment,\n// while TypeScript still resolves the full literal source type. The consumer's\n// fragment is composed in at runtime by `createCartQueries`.\nconst CUSTOM_CART_QUERY = gql(\n `query Cart($id: ID!, $country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cart(id: $id) {\n ...HydrogenCartFragment\n ...${CART_FRAGMENT_NAME}\n }\n }`,\n [HYDROGEN_CART_FRAGMENT],\n);\n\nconst CUSTOM_CART_CREATE_MUTATION = gql(\n `mutation CartCreate($input: CartInput!, $country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cartCreate(input: $input) {\n cart {\n ...HydrogenCartFragment\n ...${CART_FRAGMENT_NAME}\n }\n userErrors {\n code\n field\n message\n }\n warnings {\n code\n message\n target\n }\n }\n }`,\n [HYDROGEN_CART_FRAGMENT],\n);\n\nconst CUSTOM_CART_LINES_ADD_MUTATION = gql(\n `mutation CartLinesAdd($cartId: ID!, $lines: [CartLineInput!]!, $country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cartLinesAdd(cartId: $cartId, lines: $lines) {\n cart {\n ...HydrogenCartFragment\n ...${CART_FRAGMENT_NAME}\n }\n userErrors {\n code\n field\n message\n }\n warnings {\n code\n message\n target\n }\n }\n }`,\n [HYDROGEN_CART_FRAGMENT],\n);\n\nconst CUSTOM_CART_LINES_UPDATE_MUTATION = gql(\n `mutation CartLinesUpdate($cartId: ID!, $lines: [CartLineUpdateInput!]!, $country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cartLinesUpdate(cartId: $cartId, lines: $lines) {\n cart {\n ...HydrogenCartFragment\n ...${CART_FRAGMENT_NAME}\n }\n userErrors {\n code\n field\n message\n }\n warnings {\n code\n message\n target\n }\n }\n }`,\n [HYDROGEN_CART_FRAGMENT],\n);\n\nconst CUSTOM_CART_LINES_REMOVE_MUTATION = gql(\n `mutation CartLinesRemove($cartId: ID!, $lineIds: [ID!]!, $country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cartLinesRemove(cartId: $cartId, lineIds: $lineIds) {\n cart {\n ...HydrogenCartFragment\n ...${CART_FRAGMENT_NAME}\n }\n userErrors {\n code\n field\n message\n }\n warnings {\n code\n message\n target\n }\n }\n }`,\n [HYDROGEN_CART_FRAGMENT],\n);\n\nconst CUSTOM_CART_DISCOUNT_CODES_UPDATE_MUTATION = gql(\n `mutation CartDiscountCodesUpdate($cartId: ID!, $discountCodes: [String!]!, $country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cartDiscountCodesUpdate(cartId: $cartId, discountCodes: $discountCodes) {\n cart {\n ...HydrogenCartFragment\n ...${CART_FRAGMENT_NAME}\n }\n userErrors {\n code\n field\n message\n }\n warnings {\n code\n message\n target\n }\n }\n }`,\n [HYDROGEN_CART_FRAGMENT],\n);\n\nconst CUSTOM_CART_NOTE_UPDATE_MUTATION = gql(\n `mutation CartNoteUpdate($cartId: ID!, $note: String!, $country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cartNoteUpdate(cartId: $cartId, note: $note) {\n cart {\n ...HydrogenCartFragment\n ...${CART_FRAGMENT_NAME}\n }\n userErrors {\n code\n field\n message\n }\n warnings {\n code\n message\n target\n }\n }\n }`,\n [HYDROGEN_CART_FRAGMENT],\n);\n\nconst CUSTOM_CART_ATTRIBUTES_UPDATE_MUTATION = gql(\n `mutation CartAttributesUpdate($cartId: ID!, $attributes: [AttributeInput!]!, $country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cartAttributesUpdate(cartId: $cartId, attributes: $attributes) {\n cart {\n ...HydrogenCartFragment\n ...${CART_FRAGMENT_NAME}\n }\n userErrors {\n code\n field\n message\n }\n warnings {\n code\n message\n target\n }\n }\n }`,\n [HYDROGEN_CART_FRAGMENT],\n);\n\n// Minimal payload on purpose: buyer identity sync callers only need success or\n// userErrors, never the cart body, so no custom-fragment variant exists.\nconst CART_BUYER_IDENTITY_UPDATE_MUTATION_SOURCE = /* GraphQL */ `\n mutation CartBuyerIdentityUpdate($cartId: ID!, $buyerIdentity: CartBuyerIdentityInput!) {\n cartBuyerIdentityUpdate(cartId: $cartId, buyerIdentity: $buyerIdentity) {\n cart {\n id\n }\n userErrors {\n code\n field\n message\n }\n }\n }\n`;\n\nconst DEFAULT_CART_QUERIES = {\n cart: CART_QUERY,\n cartCreate: CART_CREATE_MUTATION,\n cartLinesAdd: CART_LINES_ADD_MUTATION,\n cartLinesUpdate: CART_LINES_UPDATE_MUTATION,\n cartLinesRemove: CART_LINES_REMOVE_MUTATION,\n cartDiscountCodesUpdate: CART_DISCOUNT_CODES_UPDATE_MUTATION,\n cartNoteUpdate: CART_NOTE_UPDATE_MUTATION,\n cartAttributesUpdate: CART_ATTRIBUTES_UPDATE_MUTATION,\n} as const;\n\ntype DefaultCartQueries = typeof DEFAULT_CART_QUERIES;\n\nexport const cartBuyerIdentityUpdateMutation = gql(CART_BUYER_IDENTITY_UPDATE_MUTATION_SOURCE);\n\ntype QueryFor<\n Source extends string,\n Fragments extends readonly AnyStorefrontQueryString[],\n DocumentSource extends string = ComposedSource<Source, Fragments>,\n> = StorefrontQueryString<\n InferResult<DocumentSource>,\n InferVariables<DocumentSource>,\n DocumentSource\n>;\n\ntype CartFragmentDocument = AnyStorefrontQueryString;\n\ntype CustomQueryFor<\n Document extends AnyStorefrontQueryString,\n TCartFragment extends CartFragmentDocument,\n> = QueryFor<SourceOf<Document>, readonly [TCartFragment]>;\n\ntype CartQueriesForFragment<TCartFragment extends CartFragmentDocument> = {\n readonly cart: CustomQueryFor<typeof CUSTOM_CART_QUERY, TCartFragment>;\n readonly cartCreate: CustomQueryFor<typeof CUSTOM_CART_CREATE_MUTATION, TCartFragment>;\n readonly cartLinesAdd: CustomQueryFor<typeof CUSTOM_CART_LINES_ADD_MUTATION, TCartFragment>;\n readonly cartLinesUpdate: CustomQueryFor<typeof CUSTOM_CART_LINES_UPDATE_MUTATION, TCartFragment>;\n readonly cartLinesRemove: CustomQueryFor<typeof CUSTOM_CART_LINES_REMOVE_MUTATION, TCartFragment>;\n readonly cartDiscountCodesUpdate: CustomQueryFor<\n typeof CUSTOM_CART_DISCOUNT_CODES_UPDATE_MUTATION,\n TCartFragment\n >;\n readonly cartNoteUpdate: CustomQueryFor<typeof CUSTOM_CART_NOTE_UPDATE_MUTATION, TCartFragment>;\n readonly cartAttributesUpdate: CustomQueryFor<\n typeof CUSTOM_CART_ATTRIBUTES_UPDATE_MUTATION,\n TCartFragment\n >;\n};\n\ntype CartDataFromCartQuery<TQuery extends AnyStorefrontQueryString> =\n TQuery extends StorefrontQueryString<infer Result, infer _Variables, string>\n ? Result extends { cart?: (infer Cart) | null }\n ? MergeCartData<NormalizeCartData<NonNullable<Cart>>>\n : CartData\n : CartData;\n\ntype MergeCartData<TCart> = Omit<CartData, keyof TCart> & TCart;\n\ntype NormalizeCartData<TCart> = TCart extends { lines: infer TLines }\n ? Omit<TCart, \"lines\"> & { lines: NormalizeCartLines<TLines> }\n : TCart;\n\ntype NormalizeCartLines<TLines> = TLines extends { nodes: infer TNodes }\n ? Omit<TLines, \"nodes\"> & { nodes: Array<CartLineFromNodes<TNodes>> }\n : TLines;\n\ntype CartLineFromNodes<TNodes> = TNodes extends CartLineConnection[\"nodes\"]\n ? TNodes[number]\n : TNodes extends ReadonlyArray<infer TLine>\n ? TLine\n : never;\n\nexport type CartDataForOptions<TOptions> = CartDataFromCartQuery<\n CartQueriesForOptions<TOptions>[\"cart\"]\n>;\n\nexport type CreateCartQueriesOptions<\n TCartFragment extends AnyStorefrontQueryString = AnyStorefrontQueryString,\n> = {\n /**\n * Cart fragment spread into every cart query and mutation response.\n *\n * The fragment must be named `CartFragment` and target `Cart`.\n */\n readonly fragment: TCartFragment;\n};\n\nexport type CartQueriesForOptions<TOptions> = TOptions extends {\n readonly fragment: infer TCartFragment extends AnyStorefrontQueryString;\n}\n ? CartQueriesForFragment<TCartFragment>\n : DefaultCartQueries;\n\nfunction assertCartFragmentName(fragment: string): void {\n if (CART_FRAGMENT_PATTERN.test(fragment)) return;\n\n throw new Error(\n `Cart fragment must be named ${CART_FRAGMENT_NAME} and target ${CART_FRAGMENT_CONTRACT.typeName}`,\n );\n}\n\nfunction createFragmentPattern({ name, typeName }: FragmentContract): RegExp {\n return new RegExp(`fragment\\\\s+${name}\\\\s+on\\\\s+${typeName}`);\n}\n\nfunction createCartQueries<const TCartFragment extends CartFragmentDocument>(\n cartFragment: TCartFragment,\n): CartQueriesForFragment<TCartFragment> {\n const fragments = [cartFragment] as const;\n\n const cart = gql(CUSTOM_CART_QUERY, fragments);\n\n const cartCreate = gql(CUSTOM_CART_CREATE_MUTATION, fragments);\n\n const cartLinesAdd = gql(CUSTOM_CART_LINES_ADD_MUTATION, fragments);\n\n const cartLinesUpdate = gql(CUSTOM_CART_LINES_UPDATE_MUTATION, fragments);\n\n const cartLinesRemove = gql(CUSTOM_CART_LINES_REMOVE_MUTATION, fragments);\n\n const cartDiscountCodesUpdate = gql(CUSTOM_CART_DISCOUNT_CODES_UPDATE_MUTATION, fragments);\n\n const cartNoteUpdate = gql(CUSTOM_CART_NOTE_UPDATE_MUTATION, fragments);\n\n const cartAttributesUpdate = gql(CUSTOM_CART_ATTRIBUTES_UPDATE_MUTATION, fragments);\n\n return {\n cart,\n cartCreate,\n cartLinesAdd,\n cartLinesUpdate,\n cartLinesRemove,\n cartDiscountCodesUpdate,\n cartNoteUpdate,\n cartAttributesUpdate,\n } as const;\n}\n\nexport function makeCartQueries<const TOptions extends CreateCartQueriesOptions>(\n options: TOptions,\n): CartQueriesForOptions<TOptions>;\nexport function makeCartQueries(): DefaultCartQueries;\nexport function makeCartQueries(options?: CreateCartQueriesOptions) {\n if (options) {\n assertCartFragmentName(options.fragment);\n return createCartQueries(options.fragment);\n }\n\n return DEFAULT_CART_QUERIES;\n}\n\nexport const cartQueries = makeCartQueries();\n"],"mappings":";;;AAUA,MAAA,qBAAA;AAQA,MAAA,yBAAA;CACA,MAAA;CACA,UAAA;CACA;AAEA,MAAA,wBAAA,sBAAA,uBAAA;AAEA,MAAA,yBAAA,IAAA,qrBA8FA;AAEA,MAAA,aAAA,IACA,uJAMA,CAAA,uBAAA,CACA;AAEA,MAAA,uBAAA,IACA,uPAkBA,CAAA,uBAAA,CACA;AAEA,MAAA,0BAAA,IACA,4RAkBA,CAAA,uBAAA,CACA;AAEA,MAAA,6BAAA,IACA,wSAkBA,CAAA,uBAAA,CACA;AAEA,MAAA,6BAAA,IACA,6RAkBA,CAAA,uBAAA,CACA;AAEA,MAAA,sCAAA,IACA,mUAkBA,CAAA,uBAAA,CACA;AAEA,MAAA,4BAAA,IACA,mRAkBA,CAAA,uBAAA,CACA;AAEA,MAAA,kCAAA,IACA,4TAkBA,CAAA,uBAAA,CACA;AAOA,MAAA,oBAAA,IACA,wJAIS,mBAAqB,KAG9B,CAAA,uBAAA,CACA;AAEA,MAAA,8BAAA,IACA,4LAKW,mBAAqB,iEAchC,CAAA,uBAAA,CACA;AAEA,MAAA,iCAAA,IACA,iOAKW,mBAAqB,iEAchC,CAAA,uBAAA,CACA;AAEA,MAAA,oCAAA,IACA,6OAKW,mBAAqB,iEAchC,CAAA,uBAAA,CACA;AAEA,MAAA,oCAAA,IACA,kOAKW,mBAAqB,iEAchC,CAAA,uBAAA,CACA;AAEA,MAAA,6CAAA,IACA,wQAKW,mBAAqB,iEAchC,CAAA,uBAAA,CACA;AAEA,MAAA,mCAAA,IACA,wNAKW,mBAAqB,iEAchC,CAAA,uBAAA,CACA;AAEA,MAAA,yCAAA,IACA,iQAKW,mBAAqB,iEAchC,CAAA,uBAAA,CACA;AAIA,MAAA,6CAAA;AAeA,MAAA,uBAAA;CACA,MAAA;CACA,YAAA;CACA,cAAA;CACA,iBAAA;CACA,iBAAA;CACA,yBAAA;CACA,gBAAA;CACA,sBAAA;CACA;AAIA,MAAA,kCAAA,IAAA,2CAAA;AAgFA,SAAA,uBAAA,UAAA;AACA,KAAA,sBAAA,KAAA,SAAA,CAAA;AAEA,OAAA,IAAA,MACA,+BAAA,mBAAA,cAAA,uBAAA,WACA;;AAGA,SAAA,sBAAA,EAAA,MAAA,YAAA;AACA,QAAA,IAAA,OAAA,eAAA,KAAA,YAAA,WAAA;;AAGA,SAAA,kBACA,cACA;CACA,MAAA,YAAA,CAAA,aAAA;AAkBA,QAAA;EACA,MAjBA,IAAA,mBAAA,UAiBA;EACA,YAhBA,IAAA,6BAAA,UAgBA;EACA,cAfA,IAAA,gCAAA,UAeA;EACA,iBAdA,IAAA,mCAAA,UAcA;EACA,iBAbA,IAAA,mCAAA,UAaA;EACA,yBAZA,IAAA,4CAAA,UAYA;EACA,gBAXA,IAAA,kCAAA,UAWA;EACA,sBAVA,IAAA,wCAAA,UAUA;EACA;;AAOA,SAAA,gBAAA,SAAA;AACA,KAAA,SAAA;AACA,yBAAA,QAAA,SAAA;AACA,SAAA,kBAAA,QAAA,SAAA;;AAGA,QAAA;;AAGA,MAAA,cAAA,iBAAA"}
@@ -0,0 +1,82 @@
1
+ import { ShopifyRequestContext } from "../request-context.mjs";
2
+ import { AnyStorefrontQueryString } from "../../graphql/graphql.mjs";
3
+ import { StorefrontClient } from "../../client/types.mjs";
4
+ import { CallableRouteHandler, ShopifyRouteError, ShopifyRouteErrorResult, ShopifyRouteJsonResult, ShopifyRouteRedirectResult } from "../request-routing/route-types.mjs";
5
+ import { CartData } from "./state.mjs";
6
+ import { CartDataForOptions, CartQueriesForOptions, cartQueries } from "./queries.mjs";
7
+ import { CartDataFromQuery } from "./get-cart.mjs";
8
+ import { CartBuyerIdentitySync, cartBuyerIdentitySync } from "./buyer-identity-sync.mjs";
9
+ import { CustomerSession, ReadonlyCustomerSessionManager, WritableCustomerSessionManager } from "../../customer-account/session.mjs";
10
+
11
+ //#region src/core/cart/server-handlers.d.ts
12
+ declare const CART_API_PATH: "/api/cart";
13
+ declare const CART_GET_METHOD: "GET";
14
+ declare const CART_POST_METHOD: "POST";
15
+ declare const cartServerHandlersCartQuery: unique symbol;
16
+ type CartGetData<TCart = CartData> = {
17
+ cart: TCart | null;
18
+ errors?: Array<{
19
+ message: string;
20
+ }>;
21
+ };
22
+ type CartGetResult<TCart = CartData> = ShopifyRouteJsonResult<CartGetData<TCart>>;
23
+ type CartErrorCode = "invalid_cart_request" | "missing_cart" | "cart_mutation_failed";
24
+ type CartError = ShopifyRouteError & {
25
+ code: CartErrorCode;
26
+ };
27
+ type CartPostResult = ShopifyRouteJsonResult<Record<string, unknown>> | ShopifyRouteRedirectResult | ShopifyRouteErrorResult<CartError>;
28
+ type CartGetHandlerContext = {
29
+ storefrontClient: StorefrontClient;
30
+ request?: Request;
31
+ };
32
+ type CartPostHandlerContext = {
33
+ request: Request;
34
+ storefrontClient: StorefrontClient;
35
+ };
36
+ type CartCustomerSessionReadContext = {
37
+ sessionManager: ReadonlyCustomerSessionManager;
38
+ requestContext: ShopifyRequestContext;
39
+ };
40
+ type CartCustomerSessionWriteContext = {
41
+ sessionManager: WritableCustomerSessionManager;
42
+ requestContext: ShopifyRequestContext;
43
+ };
44
+ type CartCustomerSession = CustomerSession;
45
+ type CartGetHandler<TCart = CartData, TContext extends CartGetHandlerContext = CartGetHandlerContext> = CallableRouteHandler<TContext, CartGetResult<TCart>, typeof CART_API_PATH, typeof CART_GET_METHOD>;
46
+ type CartPostHandler<TContext extends CartPostHandlerContext = CartPostHandlerContext> = CallableRouteHandler<TContext, CartPostResult, typeof CART_API_PATH, typeof CART_POST_METHOD>;
47
+ type CartServerHandlers<TCartQuery extends AnyStorefrontQueryString = typeof cartQueries.cart, TCart extends CartData = CartDataFromQuery<TCartQuery>> = {
48
+ readonly [cartServerHandlersCartQuery]: TCartQuery | undefined;
49
+ get: CartGetHandler<TCart>;
50
+ post: CartPostHandler;
51
+ };
52
+ type CartServerHandlersWithCustomerSession<TCartQuery extends AnyStorefrontQueryString = typeof cartQueries.cart, TCart extends CartData = CartDataFromQuery<TCartQuery>> = {
53
+ readonly [cartServerHandlersCartQuery]: TCartQuery | undefined;
54
+ readonly [cartBuyerIdentitySync]: CartBuyerIdentitySync;
55
+ get: CartGetHandler<TCart, CartGetHandlerContext & CartCustomerSessionReadContext>;
56
+ post: CartPostHandler<CartPostHandlerContext & CartCustomerSessionWriteContext>;
57
+ };
58
+ type AsyncHandlerResult<THandler> = THandler extends ((...args: infer _Args) => Promise<infer TResult>) ? TResult : never;
59
+ type CartGetHandlerResult<THandlers> = THandlers extends {
60
+ get: infer THandler;
61
+ } ? AsyncHandlerResult<THandler> : never;
62
+ type CartDataFromHandlerResult<TResult> = [TResult] extends [never] ? never : TResult extends {
63
+ data: {
64
+ cart: infer TCart;
65
+ };
66
+ } ? NonNullable<TCart> extends CartData ? NonNullable<TCart> : CartData : CartData;
67
+ type CartDataFromHandlers<THandlers> = CartDataFromHandlerResult<CartGetHandlerResult<THandlers>>;
68
+ type CreateCartServerHandlersOptions<TCartFragment extends AnyStorefrontQueryString = AnyStorefrontQueryString> = {
69
+ readonly fragment?: TCartFragment;
70
+ } & ({
71
+ readonly customerSession: CartCustomerSession;
72
+ } | {
73
+ readonly customerSession?: undefined;
74
+ });
75
+ type CartServerHandlersForOptions<TOptions> = TOptions extends {
76
+ readonly customerSession: CartCustomerSession;
77
+ } ? CartServerHandlersWithCustomerSession<CartQueriesForOptions<TOptions>["cart"], CartDataForOptions<TOptions>> : CartServerHandlers<CartQueriesForOptions<TOptions>["cart"], CartDataForOptions<TOptions>>;
78
+ declare function createCartServerHandlers(): CartServerHandlers<typeof cartQueries.cart>;
79
+ declare function createCartServerHandlers<const TOptions extends CreateCartServerHandlersOptions>(options: TOptions): CartServerHandlersForOptions<TOptions>;
80
+ //#endregion
81
+ export { CartDataFromHandlers, CartError, CartErrorCode, CartGetData, CartGetHandler, CartGetResult, CartPostHandler, CartPostResult, CartServerHandlers, CartServerHandlersWithCustomerSession, CreateCartServerHandlersOptions, createCartServerHandlers };
82
+ //# sourceMappingURL=server-handlers.d.mts.map
@@ -0,0 +1,322 @@
1
+ import { getLogger } from "../logging/logging.mjs";
2
+ import { applyPrivateResponseCacheHeaders } from "../headers.mjs";
3
+ import { createProxyResponseHeaders } from "../request-routing/interceptors/proxy.mjs";
4
+ import { createCartCookie, createExpiredCartCookie, getCartIdFromCookie } from "./cookie.mjs";
5
+ import { cartBuyerIdentityUpdateMutation, cartQueries, makeCartQueries } from "./queries.mjs";
6
+ import { getCart, getCartId } from "./get-cart.mjs";
7
+ import { createCallableRouteHandler } from "../request-routing/registered-routes.mjs";
8
+ import { parseCartRequest } from "./actions.mjs";
9
+ import { cartBuyerIdentitySync } from "./buyer-identity-sync.mjs";
10
+ import { getCustomerSessionRefreshResult } from "../../customer-account/session.mjs";
11
+
12
+ //#region src/core/cart/server-handlers.ts
13
+ const log = getLogger("cart-api");
14
+ const CART_API_PATH = "/api/cart";
15
+ const CART_GET_METHOD = "GET";
16
+ const CART_POST_METHOD = "POST";
17
+ const CART_MUTATION_FAILED_STATUS = 500;
18
+ const CART_MUTATION_FAILED_MESSAGE = "Cart mutation failed. Please try again.";
19
+ const cartServerHandlersCartQuery = Symbol("hydrogen.cartQuery");
20
+ function createCartServerHandlers(options) {
21
+ const queries = options?.fragment ? makeCartQueries({ fragment: options.fragment }) : cartQueries;
22
+ const runtimeQueries = queries;
23
+ const customerSession = options?.customerSession;
24
+ const handlers = {
25
+ get: createCallableRouteHandler(CART_API_PATH, CART_GET_METHOD, (context) => handleGet(context, runtimeQueries, customerSession)),
26
+ post: createCallableRouteHandler(CART_API_PATH, CART_POST_METHOD, (context) => handlePost(context, runtimeQueries, customerSession))
27
+ };
28
+ Object.defineProperty(handlers, cartServerHandlersCartQuery, { value: queries.cart });
29
+ if (customerSession) Object.defineProperty(handlers, cartBuyerIdentitySync, { value: createCartBuyerIdentitySync() });
30
+ return handlers;
31
+ }
32
+ function createCartBuyerIdentitySync() {
33
+ return {
34
+ updateBuyerIdentity: updateCartBuyerIdentity,
35
+ expiredCartCookie: createExpiredCartCookie()
36
+ };
37
+ }
38
+ async function updateCartBuyerIdentity(context, customerAccessToken) {
39
+ const cartId = getCartIdFromCookie(context.request);
40
+ if (!cartId) return;
41
+ const { userErrors } = assertMutationData(await context.storefrontClient.graphql(cartBuyerIdentityUpdateMutation, { variables: {
42
+ cartId,
43
+ buyerIdentity: { customerAccessToken }
44
+ } }), "cartBuyerIdentityUpdate");
45
+ if (userErrors.length > 0) throw new Error(userErrors.map(({ message }) => message).join("\n"));
46
+ }
47
+ async function handleGet(context, queries, customerSession) {
48
+ const { request, storefrontClient } = context;
49
+ const result = await getCart(getCartId(request ?? storefrontClient.requestContext), storefrontClient, queries.cart);
50
+ logCartErrors(result.errors);
51
+ const data = {
52
+ cart: await addLoggedInCheckoutParam(result.cart, context, customerSession),
53
+ ...result.errors && { errors: result.errors }
54
+ };
55
+ const headers = createProxyResponseHeaders(result.headers);
56
+ applyPrivateResponseCacheHeaders(headers);
57
+ return {
58
+ type: "json",
59
+ data,
60
+ headers
61
+ };
62
+ }
63
+ function logCartErrors(errors) {
64
+ if (!errors?.length) return;
65
+ log.error(errors.map(({ message }) => message).join("\n"));
66
+ }
67
+ async function handlePost(context, queries, customerSession) {
68
+ const { request, storefrontClient } = context;
69
+ const isFormRequest = !request.headers.get("content-type")?.includes("application/json");
70
+ const redirectTarget = safeRedirectTarget(request);
71
+ const parsedCartRequest = await parseCartAction(request, isFormRequest, redirectTarget);
72
+ if (parsedCartRequest.type === "response") return parsedCartRequest.response;
73
+ const cookieCartId = getCartIdFromCookie(request);
74
+ const cartId = parsedCartRequest.bodyCartId ?? cookieCartId;
75
+ const missingCartResponse = getMissingCartResponse(parsedCartRequest.action, cartId, isFormRequest, redirectTarget);
76
+ if (missingCartResponse) return missingCartResponse;
77
+ const { action } = parsedCartRequest;
78
+ const customerAccess = await getCartCreateCustomerAccess(parsedCartRequest.action, cartId, context, customerSession);
79
+ const customerSessionHeaders = customerAccess.commitSession ? await getCustomerSessionHeaders(context) : void 0;
80
+ const result = await executeCartMutation(action, cartId, storefrontClient, queries, customerAccess.accessToken, customerSessionHeaders);
81
+ if (result.type !== "mutation") return result.response;
82
+ const headers = createProxyResponseHeaders(result.headers);
83
+ appendHeaders(headers, customerSessionHeaders);
84
+ if (cartId === cookieCartId && result.cartId !== null && result.cartId !== cookieCartId) headers.append("set-cookie", createCartCookie(result.cartId));
85
+ if (isFormRequest) return redirectResult(redirectTarget, headers);
86
+ return jsonResult(result.data, headers);
87
+ }
88
+ async function parseCartAction(request, isFormRequest, redirectTarget) {
89
+ try {
90
+ const { action, cartId: bodyCartId } = await parseCartRequest(request);
91
+ return {
92
+ type: "action",
93
+ action,
94
+ bodyCartId
95
+ };
96
+ } catch (error) {
97
+ if (isFormRequest) return {
98
+ type: "response",
99
+ response: redirectResult(redirectTarget)
100
+ };
101
+ return {
102
+ type: "response",
103
+ response: errorResult("invalid_cart_request", getErrorMessage(error, "Bad Request"))
104
+ };
105
+ }
106
+ }
107
+ function getMissingCartResponse(action, cartId, isFormRequest, redirectTarget) {
108
+ if (action.intent === "add" || cartId) return void 0;
109
+ if (isFormRequest) return redirectResult(redirectTarget);
110
+ return errorResult("missing_cart", "No cart exists. Add an item first.");
111
+ }
112
+ async function executeCartMutation(action, cartId, storefrontClient, queries, customerAccessToken, customerSessionHeaders) {
113
+ try {
114
+ return {
115
+ type: "mutation",
116
+ ...await executeMutation(action, cartId, storefrontClient, queries, customerAccessToken)
117
+ };
118
+ } catch (error) {
119
+ if (!customerSessionHeaders) throw error;
120
+ log.error("cart mutation failed", { error });
121
+ return {
122
+ type: "response",
123
+ response: errorResult("cart_mutation_failed", CART_MUTATION_FAILED_MESSAGE, customerSessionHeaders, CART_MUTATION_FAILED_STATUS)
124
+ };
125
+ }
126
+ }
127
+ async function getCustomerSessionHeaders(context) {
128
+ assertCustomerSessionWriteContext(context);
129
+ const sessionHeaders = await context.sessionManager.commit?.();
130
+ if (!sessionHeaders) return void 0;
131
+ return new Headers(sessionHeaders);
132
+ }
133
+ function appendHeaders(headers, headersToAppend) {
134
+ if (!headersToAppend) return;
135
+ for (const [key, value] of headersToAppend) if (key !== "set-cookie") headers.append(key, value);
136
+ for (const setCookie of headersToAppend.getSetCookie()) headers.append("set-cookie", setCookie);
137
+ }
138
+ function safeRedirectTarget(request) {
139
+ const referer = request.headers.get("referer");
140
+ if (!referer) return "/";
141
+ try {
142
+ const refererUrl = new URL(referer);
143
+ const requestUrl = new URL(request.url);
144
+ if (refererUrl.origin !== requestUrl.origin) return "/";
145
+ return refererUrl.toString().replace(refererUrl.origin, "");
146
+ } catch {
147
+ return "/";
148
+ }
149
+ }
150
+ function assertGraphQLData(result) {
151
+ if (result.errors || !result.data) {
152
+ const message = result.errors?.[0]?.message ?? "GraphQL error";
153
+ throw new Error(message);
154
+ }
155
+ return result.data;
156
+ }
157
+ function assertMutationData(result, key) {
158
+ const payload = assertGraphQLData(result)[key];
159
+ if (payload == null) throw new Error(`Missing ${String(key)} in mutation response`);
160
+ return payload;
161
+ }
162
+ function createMutationResult(cart, userErrors, warnings, headers) {
163
+ const storefrontCart = cart ?? null;
164
+ return {
165
+ data: {
166
+ cart: storefrontCart,
167
+ userErrors,
168
+ warnings
169
+ },
170
+ cartId: typeof storefrontCart?.id === "string" ? storefrontCart.id : null,
171
+ headers
172
+ };
173
+ }
174
+ async function executeMutation(action, cartId, storefront, queries, customerAccessToken) {
175
+ if (action.intent === "add") return executeAdd(action.lines, cartId, storefront, queries, customerAccessToken);
176
+ if (!cartId) throw new Error("cartId is required for non-add mutations");
177
+ switch (action.intent) {
178
+ case "update": {
179
+ const result = await storefront.graphql(queries.cartLinesUpdate, { variables: {
180
+ cartId,
181
+ lines: action.lines
182
+ } });
183
+ const { cart, userErrors, warnings } = assertMutationData(result, "cartLinesUpdate");
184
+ return createMutationResult(cart, userErrors, warnings, result.headers);
185
+ }
186
+ case "remove": {
187
+ const result = await storefront.graphql(queries.cartLinesRemove, { variables: {
188
+ cartId,
189
+ lineIds: action.lineIds
190
+ } });
191
+ const { cart, userErrors, warnings } = assertMutationData(result, "cartLinesRemove");
192
+ return createMutationResult(cart, userErrors, warnings, result.headers);
193
+ }
194
+ case "discount-update": {
195
+ const result = await storefront.graphql(queries.cartDiscountCodesUpdate, { variables: {
196
+ cartId,
197
+ discountCodes: action.discountCodes
198
+ } });
199
+ const { cart, userErrors, warnings } = assertMutationData(result, "cartDiscountCodesUpdate");
200
+ return createMutationResult(cart, userErrors, warnings, result.headers);
201
+ }
202
+ case "discount-apply": return executeDiscountModify(cartId, "apply", action.code, storefront, queries);
203
+ case "discount-remove": return executeDiscountModify(cartId, "remove", action.code, storefront, queries);
204
+ case "note-update": {
205
+ const result = await storefront.graphql(queries.cartNoteUpdate, { variables: {
206
+ cartId,
207
+ note: action.note
208
+ } });
209
+ const { cart, userErrors, warnings } = assertMutationData(result, "cartNoteUpdate");
210
+ return createMutationResult(cart, userErrors, warnings, result.headers);
211
+ }
212
+ case "attributes-update": {
213
+ const result = await storefront.graphql(queries.cartAttributesUpdate, { variables: {
214
+ cartId,
215
+ attributes: action.attributes
216
+ } });
217
+ const { cart, userErrors, warnings } = assertMutationData(result, "cartAttributesUpdate");
218
+ return createMutationResult(cart, userErrors, warnings, result.headers);
219
+ }
220
+ default: throw new Error(`Unhandled cart action intent: ${action.intent}`);
221
+ }
222
+ }
223
+ async function executeAdd(lines, cartId, storefront, queries, customerAccessToken) {
224
+ if (cartId) {
225
+ const result = await storefront.graphql(queries.cartLinesAdd, { variables: {
226
+ cartId,
227
+ lines
228
+ } });
229
+ const { cart, userErrors, warnings } = assertMutationData(result, "cartLinesAdd");
230
+ return createMutationResult(cart, userErrors, warnings, result.headers);
231
+ }
232
+ const result = await storefront.graphql(queries.cartCreate, { variables: { input: {
233
+ lines,
234
+ ...customerAccessToken && { buyerIdentity: { customerAccessToken } }
235
+ } } });
236
+ const { cart, userErrors, warnings } = assertMutationData(result, "cartCreate");
237
+ return createMutationResult(cart, userErrors, warnings, result.headers);
238
+ }
239
+ async function getCartCreateCustomerAccess(action, cartId, context, customerSession) {
240
+ if (action.intent !== "add" || cartId || !customerSession) return { commitSession: false };
241
+ assertCustomerSessionWriteContext(context);
242
+ const accessToken = await customerSession.getAccessToken(context.sessionManager, context.requestContext);
243
+ if (accessToken) return {
244
+ accessToken,
245
+ commitSession: false
246
+ };
247
+ if (!await customerSession.isLoggedIn(context.sessionManager, context.requestContext)) return { commitSession: false };
248
+ const refreshResult = await getCustomerSessionRefreshResult(customerSession, context.sessionManager, context.requestContext);
249
+ if (refreshResult) return {
250
+ accessToken: refreshResult.accessToken,
251
+ commitSession: refreshResult.status !== "transient"
252
+ };
253
+ return {
254
+ accessToken: await customerSession.getOrRefreshAccessToken(context.sessionManager, context.requestContext),
255
+ commitSession: true
256
+ };
257
+ }
258
+ async function addLoggedInCheckoutParam(cart, context, customerSession) {
259
+ if (!cart || !customerSession) return cart;
260
+ assertCustomerSessionReadContext(context);
261
+ if (!await customerSession.isLoggedIn(context.sessionManager, context.requestContext)) return cart;
262
+ if (!cart.checkoutUrl) return cart;
263
+ const checkoutUrl = new URL(cart.checkoutUrl);
264
+ checkoutUrl.searchParams.set("logged_in", "true");
265
+ return {
266
+ ...cart,
267
+ checkoutUrl: checkoutUrl.toString()
268
+ };
269
+ }
270
+ function assertCustomerSessionContext(context) {
271
+ if (context.sessionManager && context.requestContext) return;
272
+ throw new Error("Cart handlers configured with customerSession require sessionManager and requestContext.");
273
+ }
274
+ function assertCustomerSessionReadContext(context) {
275
+ assertCustomerSessionContext(context);
276
+ }
277
+ function assertCustomerSessionWriteContext(context) {
278
+ assertCustomerSessionContext(context);
279
+ }
280
+ async function executeDiscountModify(cartId, mode, code, storefront, queries) {
281
+ const currentCodes = (assertGraphQLData(await storefront.graphql(queries.cart, { variables: { id: cartId } })).cart?.discountCodes ?? []).map((dc) => dc.code);
282
+ const updatedCodes = mode === "apply" ? [...currentCodes, code] : currentCodes.filter((c) => c !== code);
283
+ const result = await storefront.graphql(queries.cartDiscountCodesUpdate, { variables: {
284
+ cartId,
285
+ discountCodes: updatedCodes
286
+ } });
287
+ const { cart, userErrors, warnings } = assertMutationData(result, "cartDiscountCodesUpdate");
288
+ return createMutationResult(cart, userErrors, warnings, result.headers);
289
+ }
290
+ function jsonResult(data, headers = {}) {
291
+ return {
292
+ type: "json",
293
+ data,
294
+ headers
295
+ };
296
+ }
297
+ function redirectResult(location, headers = {}) {
298
+ return {
299
+ type: "redirect",
300
+ location,
301
+ headers
302
+ };
303
+ }
304
+ function errorResult(code, message, headers, status) {
305
+ return {
306
+ type: "error",
307
+ error: {
308
+ code,
309
+ message
310
+ },
311
+ ...headers && { headers },
312
+ ...status !== void 0 && { status }
313
+ };
314
+ }
315
+ function getErrorMessage(error, fallback) {
316
+ if (error instanceof Error) return error.message;
317
+ return fallback;
318
+ }
319
+
320
+ //#endregion
321
+ export { createCartServerHandlers };
322
+ //# sourceMappingURL=server-handlers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-handlers.mjs","names":["_exhaustive"],"sources":["../../../../src/core/cart/server-handlers.ts"],"sourcesContent":["import type { GraphQLFormattedError, StorefrontClient } from \"../../client\";\nimport type {\n CustomerSession,\n ReadonlyCustomerSessionManager,\n WritableCustomerSessionManager,\n} from \"../../customer-account/session\";\nimport { getCustomerSessionRefreshResult } from \"../../customer-account/session\";\nimport type { AnyStorefrontQueryString } from \"../../graphql\";\nimport { applyPrivateResponseCacheHeaders } from \"../headers\";\nimport { getLogger } from \"../logging\";\nimport type { ShopifyRequestContext } from \"../request-context\";\nimport { createProxyResponseHeaders } from \"../request-routing/interceptors/proxy\";\nimport type {\n CallableRouteHandler,\n ShopifyRouteError,\n ShopifyRouteErrorResult,\n ShopifyRouteJsonResult,\n ShopifyRouteRedirectResult,\n} from \"../request-routing/registered-routes\";\nimport { createCallableRouteHandler } from \"../request-routing/registered-routes\";\nimport { parseCartRequest } from \"./actions\";\nimport type { CartAction, CartLineAddInput } from \"./actions\";\nimport {\n cartBuyerIdentitySync,\n type CartBuyerIdentitySync,\n type CartBuyerIdentitySyncContext,\n} from \"./buyer-identity-sync\";\nimport { getCartIdFromCookie, createCartCookie, createExpiredCartCookie } from \"./cookie\";\nimport { getCart, getCartId, type CartDataFromQuery } from \"./get-cart\";\nimport {\n cartBuyerIdentityUpdateMutation,\n cartQueries,\n makeCartQueries,\n type CartDataForOptions,\n type CartQueriesForOptions,\n type CreateCartQueriesOptions,\n} from \"./queries\";\nimport type { CartData } from \"./state\";\nconst log = getLogger(\"cart-api\");\n\nconst CART_API_PATH = \"/api/cart\" as const;\nconst CART_GET_METHOD = \"GET\" as const;\nconst CART_POST_METHOD = \"POST\" as const;\nconst CART_MUTATION_FAILED_STATUS = 500;\nconst CART_MUTATION_FAILED_MESSAGE = \"Cart mutation failed. Please try again.\";\nconst cartServerHandlersCartQuery: unique symbol = Symbol(\"hydrogen.cartQuery\");\n\nexport type CartGetData<TCart = CartData> = {\n cart: TCart | null;\n errors?: Array<{ message: string }>;\n};\n\nexport type CartGetResult<TCart = CartData> = ShopifyRouteJsonResult<CartGetData<TCart>>;\nexport type CartErrorCode = \"invalid_cart_request\" | \"missing_cart\" | \"cart_mutation_failed\";\nexport type CartError = ShopifyRouteError & {\n code: CartErrorCode;\n};\nexport type CartPostResult =\n | ShopifyRouteJsonResult<Record<string, unknown>>\n | ShopifyRouteRedirectResult\n | ShopifyRouteErrorResult<CartError>;\n\ntype CartCustomerAccessTokenResult = {\n accessToken?: string;\n commitSession: boolean;\n};\n\ntype ParsedCartRequestResult =\n | { type: \"action\"; action: CartAction; bodyCartId: string | null }\n | { type: \"response\"; response: CartPostResult };\n\ntype CartGetHandlerContext = {\n storefrontClient: StorefrontClient;\n request?: Request;\n};\n\ntype CartPostHandlerContext = {\n request: Request;\n storefrontClient: StorefrontClient;\n};\n\ntype CartCustomerSessionReadContext = {\n sessionManager: ReadonlyCustomerSessionManager;\n requestContext: ShopifyRequestContext;\n};\n\ntype CartCustomerSessionWriteContext = {\n sessionManager: WritableCustomerSessionManager;\n requestContext: ShopifyRequestContext;\n};\n\ntype CartCustomerSession = CustomerSession;\n\nexport type CartGetHandler<\n TCart = CartData,\n TContext extends CartGetHandlerContext = CartGetHandlerContext,\n> = CallableRouteHandler<\n TContext,\n CartGetResult<TCart>,\n typeof CART_API_PATH,\n typeof CART_GET_METHOD\n>;\n\nexport type CartPostHandler<TContext extends CartPostHandlerContext = CartPostHandlerContext> =\n CallableRouteHandler<TContext, CartPostResult, typeof CART_API_PATH, typeof CART_POST_METHOD>;\n\nexport type CartServerHandlers<\n TCartQuery extends AnyStorefrontQueryString = typeof cartQueries.cart,\n TCart extends CartData = CartDataFromQuery<TCartQuery>,\n> = {\n readonly [cartServerHandlersCartQuery]: TCartQuery | undefined;\n get: CartGetHandler<TCart>;\n post: CartPostHandler;\n};\n\nexport type CartServerHandlersWithCustomerSession<\n TCartQuery extends AnyStorefrontQueryString = typeof cartQueries.cart,\n TCart extends CartData = CartDataFromQuery<TCartQuery>,\n> = {\n readonly [cartServerHandlersCartQuery]: TCartQuery | undefined;\n readonly [cartBuyerIdentitySync]: CartBuyerIdentitySync;\n get: CartGetHandler<TCart, CartGetHandlerContext & CartCustomerSessionReadContext>;\n post: CartPostHandler<CartPostHandlerContext & CartCustomerSessionWriteContext>;\n};\n\ntype AsyncHandlerResult<THandler> = THandler extends (\n ...args: infer _Args\n) => Promise<infer TResult>\n ? TResult\n : never;\n\ntype CartGetHandlerResult<THandlers> = THandlers extends { get: infer THandler }\n ? AsyncHandlerResult<THandler>\n : never;\n\ntype CartDataFromHandlerResult<TResult> = [TResult] extends [never]\n ? never\n : TResult extends { data: { cart: infer TCart } }\n ? NonNullable<TCart> extends CartData\n ? NonNullable<TCart>\n : CartData\n : CartData;\n\nexport type CartDataFromHandlers<THandlers> = CartDataFromHandlerResult<\n CartGetHandlerResult<THandlers>\n>;\n\nexport type CreateCartServerHandlersOptions<\n TCartFragment extends AnyStorefrontQueryString = AnyStorefrontQueryString,\n> = {\n readonly fragment?: TCartFragment;\n} & ({ readonly customerSession: CartCustomerSession } | { readonly customerSession?: undefined });\n\ntype CartServerHandlersForOptions<TOptions> = TOptions extends {\n readonly customerSession: CartCustomerSession;\n}\n ? CartServerHandlersWithCustomerSession<\n CartQueriesForOptions<TOptions>[\"cart\"],\n CartDataForOptions<TOptions>\n >\n : CartServerHandlers<CartQueriesForOptions<TOptions>[\"cart\"], CartDataForOptions<TOptions>>;\n\nexport function createCartServerHandlers(): CartServerHandlers<typeof cartQueries.cart>;\nexport function createCartServerHandlers<const TOptions extends CreateCartServerHandlersOptions>(\n options: TOptions,\n): CartServerHandlersForOptions<TOptions>;\nexport function createCartServerHandlers(\n options?: CreateCartServerHandlersOptions,\n): CartServerHandlers | CartServerHandlersWithCustomerSession {\n const queries = options?.fragment\n ? makeCartQueries({ fragment: options.fragment } as CreateCartQueriesOptions)\n : cartQueries;\n const runtimeQueries = queries as RuntimeCartQueries;\n const customerSession = options?.customerSession;\n\n const handlers = {\n get: createCallableRouteHandler(\n CART_API_PATH,\n CART_GET_METHOD,\n (context: CartGetHandlerContext & Partial<CartCustomerSessionReadContext>) =>\n handleGet(context, runtimeQueries, customerSession),\n ),\n post: createCallableRouteHandler(\n CART_API_PATH,\n CART_POST_METHOD,\n (context: CartPostHandlerContext & Partial<CartCustomerSessionWriteContext>) =>\n handlePost(context, runtimeQueries, customerSession),\n ),\n };\n\n Object.defineProperty(handlers, cartServerHandlersCartQuery, { value: queries.cart });\n if (customerSession) {\n // Symbol-keyed and non-enumerable so the capability never registers as a\n // route in handleShopifyRoutes and stays uncallable outside Hydrogen wiring.\n Object.defineProperty(handlers, cartBuyerIdentitySync, {\n value: createCartBuyerIdentitySync(),\n });\n }\n return handlers as CartServerHandlers | CartServerHandlersWithCustomerSession;\n}\n\nfunction createCartBuyerIdentitySync(): CartBuyerIdentitySync {\n return {\n updateBuyerIdentity: updateCartBuyerIdentity,\n expiredCartCookie: createExpiredCartCookie(),\n };\n}\n\nasync function updateCartBuyerIdentity(\n context: CartBuyerIdentitySyncContext,\n customerAccessToken: string | null,\n): Promise<void> {\n const cartId = getCartIdFromCookie(context.request);\n if (!cartId) return;\n\n const result = await context.storefrontClient.graphql(cartBuyerIdentityUpdateMutation, {\n variables: { cartId, buyerIdentity: { customerAccessToken } },\n });\n const { userErrors } = assertMutationData(result, \"cartBuyerIdentityUpdate\");\n if (userErrors.length > 0) {\n throw new Error(userErrors.map(({ message }) => message).join(\"\\n\"));\n }\n}\n\ntype RuntimeCartQueries = typeof cartQueries;\n\nasync function handleGet(\n context: CartGetHandlerContext & Partial<CartCustomerSessionReadContext>,\n queries: RuntimeCartQueries,\n customerSession?: CartCustomerSession,\n): Promise<CartGetResult> {\n const { request, storefrontClient } = context;\n const cartIdSource = request ?? storefrontClient.requestContext;\n const result = await getCart(getCartId(cartIdSource), storefrontClient, queries.cart);\n logCartErrors(result.errors);\n const cart = await addLoggedInCheckoutParam(result.cart, context, customerSession);\n const data = { cart, ...(result.errors && { errors: result.errors }) };\n const headers = createProxyResponseHeaders(result.headers);\n applyPrivateResponseCacheHeaders(headers);\n\n return {\n type: \"json\",\n data,\n headers,\n };\n}\n\nfunction logCartErrors(errors: CartGetData[\"errors\"]): void {\n if (!errors?.length) return;\n log.error(errors.map(({ message }) => message).join(\"\\n\"));\n}\n\nasync function handlePost(\n context: CartPostHandlerContext & Partial<CartCustomerSessionWriteContext>,\n queries: RuntimeCartQueries,\n customerSession?: CartCustomerSession,\n): Promise<CartPostResult> {\n const { request, storefrontClient } = context;\n const isFormRequest = !request.headers.get(\"content-type\")?.includes(\"application/json\");\n const redirectTarget = safeRedirectTarget(request);\n\n const parsedCartRequest = await parseCartAction(request, isFormRequest, redirectTarget);\n if (parsedCartRequest.type === \"response\") return parsedCartRequest.response;\n\n const cookieCartId = getCartIdFromCookie(request);\n const cartId = parsedCartRequest.bodyCartId ?? cookieCartId;\n const missingCartResponse = getMissingCartResponse(\n parsedCartRequest.action,\n cartId,\n isFormRequest,\n redirectTarget,\n );\n if (missingCartResponse) return missingCartResponse;\n\n const { action } = parsedCartRequest;\n const customerAccess = await getCartCreateCustomerAccess(\n parsedCartRequest.action,\n cartId,\n context,\n customerSession,\n );\n const customerSessionHeaders = customerAccess.commitSession\n ? await getCustomerSessionHeaders(context)\n : undefined;\n const result = await executeCartMutation(\n action,\n cartId,\n storefrontClient,\n queries,\n customerAccess.accessToken,\n customerSessionHeaders,\n );\n if (result.type !== \"mutation\") return result.response;\n\n const headers = createProxyResponseHeaders(result.headers);\n appendHeaders(headers, customerSessionHeaders);\n\n // Only persist carts the browser already owns, including newly-created carts.\n if (cartId === cookieCartId && result.cartId !== null && result.cartId !== cookieCartId) {\n headers.append(\"set-cookie\", createCartCookie(result.cartId));\n }\n\n if (isFormRequest) return redirectResult(redirectTarget, headers);\n return jsonResult(result.data, headers);\n}\n\nasync function parseCartAction(\n request: Request,\n isFormRequest: boolean,\n redirectTarget: string,\n): Promise<ParsedCartRequestResult> {\n try {\n const { action, cartId: bodyCartId } = await parseCartRequest(request);\n return { type: \"action\", action, bodyCartId };\n } catch (error) {\n if (isFormRequest) return { type: \"response\", response: redirectResult(redirectTarget) };\n return {\n type: \"response\",\n response: errorResult(\"invalid_cart_request\", getErrorMessage(error, \"Bad Request\")),\n };\n }\n}\n\nfunction getMissingCartResponse(\n action: CartAction,\n cartId: string | null,\n isFormRequest: boolean,\n redirectTarget: string,\n): CartPostResult | undefined {\n if (action.intent === \"add\" || cartId) return undefined;\n if (isFormRequest) return redirectResult(redirectTarget);\n return errorResult(\"missing_cart\", \"No cart exists. Add an item first.\");\n}\n\nasync function executeCartMutation(\n action: CartAction,\n cartId: string | null,\n storefrontClient: StorefrontClient,\n queries: RuntimeCartQueries,\n customerAccessToken: string | undefined,\n customerSessionHeaders: Headers | undefined,\n): Promise<\n ({ type: \"mutation\" } & MutationResult) | { type: \"response\"; response: CartPostResult }\n> {\n try {\n return {\n type: \"mutation\",\n ...(await executeMutation(action, cartId, storefrontClient, queries, customerAccessToken)),\n };\n } catch (error) {\n if (!customerSessionHeaders) throw error;\n log.error(\"cart mutation failed\", { error });\n return {\n type: \"response\",\n response: errorResult(\n \"cart_mutation_failed\",\n CART_MUTATION_FAILED_MESSAGE,\n customerSessionHeaders,\n CART_MUTATION_FAILED_STATUS,\n ),\n };\n }\n}\n\nasync function getCustomerSessionHeaders(\n context: Partial<CartCustomerSessionWriteContext>,\n): Promise<Headers | undefined> {\n assertCustomerSessionWriteContext(context);\n const sessionHeaders = await context.sessionManager.commit?.();\n if (!sessionHeaders) return undefined;\n return new Headers(sessionHeaders);\n}\n\nfunction appendHeaders(headers: Headers, headersToAppend: Headers | undefined) {\n if (!headersToAppend) return;\n for (const [key, value] of headersToAppend) {\n if (key !== \"set-cookie\") headers.append(key, value);\n }\n for (const setCookie of headersToAppend.getSetCookie()) {\n headers.append(\"set-cookie\", setCookie);\n }\n}\n\nfunction safeRedirectTarget(request: Request): string {\n const referer = request.headers.get(\"referer\");\n if (!referer) return \"/\";\n try {\n const refererUrl = new URL(referer);\n const requestUrl = new URL(request.url);\n if (refererUrl.origin !== requestUrl.origin) return \"/\";\n return refererUrl.toString().replace(refererUrl.origin, \"\");\n } catch {\n return \"/\";\n }\n}\n\ntype MutationResult = {\n data: Record<string, unknown>;\n cartId: string | null;\n headers: Headers;\n};\n\ntype GraphQLResult<D> = {\n data: D | null;\n errors?: GraphQLFormattedError[];\n headers: Headers;\n};\n\nfunction assertGraphQLData<D>(result: GraphQLResult<D>): NonNullable<D> {\n if (result.errors || !result.data) {\n const message = result.errors?.[0]?.message ?? \"GraphQL error\";\n throw new Error(message);\n }\n return result.data as NonNullable<D>;\n}\n\nfunction assertMutationData<D, K extends keyof NonNullable<D>>(\n result: GraphQLResult<D>,\n key: K,\n): NonNullable<NonNullable<D>[K]> {\n const data = assertGraphQLData(result);\n const payload = data[key];\n if (payload == null) {\n throw new Error(`Missing ${String(key)} in mutation response`);\n }\n return payload as NonNullable<NonNullable<D>[K]>;\n}\n\nfunction createMutationResult(\n cart: unknown,\n userErrors: unknown,\n warnings: unknown,\n headers: Headers,\n): MutationResult {\n const storefrontCart = (cart ?? null) as Record<string, unknown> | null;\n\n return {\n data: { cart: storefrontCart, userErrors, warnings },\n cartId: typeof storefrontCart?.id === \"string\" ? storefrontCart.id : null,\n headers,\n };\n}\n\ntype CartMutationClient = Pick<StorefrontClient, \"graphql\">;\n\nasync function executeMutation(\n action: CartAction,\n cartId: string | null,\n storefront: CartMutationClient,\n queries: RuntimeCartQueries,\n customerAccessToken?: string,\n): Promise<MutationResult> {\n if (action.intent === \"add\") {\n return executeAdd(action.lines, cartId, storefront, queries, customerAccessToken);\n }\n\n if (!cartId) {\n throw new Error(\"cartId is required for non-add mutations\");\n }\n\n switch (action.intent) {\n case \"update\": {\n const result = await storefront.graphql(queries.cartLinesUpdate, {\n variables: { cartId, lines: action.lines },\n });\n const { cart, userErrors, warnings } = assertMutationData(result, \"cartLinesUpdate\");\n return createMutationResult(cart, userErrors, warnings, result.headers);\n }\n case \"remove\": {\n const result = await storefront.graphql(queries.cartLinesRemove, {\n variables: { cartId, lineIds: action.lineIds },\n });\n const { cart, userErrors, warnings } = assertMutationData(result, \"cartLinesRemove\");\n return createMutationResult(cart, userErrors, warnings, result.headers);\n }\n case \"discount-update\": {\n const result = await storefront.graphql(queries.cartDiscountCodesUpdate, {\n variables: { cartId, discountCodes: action.discountCodes },\n });\n const { cart, userErrors, warnings } = assertMutationData(result, \"cartDiscountCodesUpdate\");\n return createMutationResult(cart, userErrors, warnings, result.headers);\n }\n case \"discount-apply\":\n return executeDiscountModify(cartId, \"apply\", action.code, storefront, queries);\n case \"discount-remove\":\n return executeDiscountModify(cartId, \"remove\", action.code, storefront, queries);\n case \"note-update\": {\n const result = await storefront.graphql(queries.cartNoteUpdate, {\n variables: { cartId, note: action.note },\n });\n const { cart, userErrors, warnings } = assertMutationData(result, \"cartNoteUpdate\");\n return createMutationResult(cart, userErrors, warnings, result.headers);\n }\n case \"attributes-update\": {\n const result = await storefront.graphql(queries.cartAttributesUpdate, {\n variables: { cartId, attributes: action.attributes },\n });\n const { cart, userErrors, warnings } = assertMutationData(result, \"cartAttributesUpdate\");\n return createMutationResult(cart, userErrors, warnings, result.headers);\n }\n default: {\n const _exhaustive: never = action;\n throw new Error(`Unhandled cart action intent: ${(_exhaustive as CartAction).intent}`);\n }\n }\n}\n\nasync function executeAdd(\n lines: CartLineAddInput[],\n cartId: string | null,\n storefront: CartMutationClient,\n queries: RuntimeCartQueries,\n customerAccessToken?: string,\n): Promise<MutationResult> {\n if (cartId) {\n const result = await storefront.graphql(queries.cartLinesAdd, {\n variables: { cartId, lines },\n });\n const { cart, userErrors, warnings } = assertMutationData(result, \"cartLinesAdd\");\n return createMutationResult(cart, userErrors, warnings, result.headers);\n }\n\n const result = await storefront.graphql(queries.cartCreate, {\n variables: {\n input: {\n lines,\n ...(customerAccessToken && { buyerIdentity: { customerAccessToken } }),\n },\n },\n });\n const { cart, userErrors, warnings } = assertMutationData(result, \"cartCreate\");\n return createMutationResult(cart, userErrors, warnings, result.headers);\n}\n\nasync function getCartCreateCustomerAccess(\n action: CartAction,\n cartId: string | null,\n context: Partial<CartCustomerSessionWriteContext>,\n customerSession?: CartCustomerSession,\n): Promise<CartCustomerAccessTokenResult> {\n if (action.intent !== \"add\" || cartId || !customerSession) {\n return { commitSession: false };\n }\n\n assertCustomerSessionWriteContext(context);\n const accessToken = await customerSession.getAccessToken(\n context.sessionManager,\n context.requestContext,\n );\n if (accessToken) return { accessToken, commitSession: false };\n\n const isLoggedIn = await customerSession.isLoggedIn(\n context.sessionManager,\n context.requestContext,\n );\n if (!isLoggedIn) return { commitSession: false };\n\n const refreshResult = await getCustomerSessionRefreshResult(\n customerSession,\n context.sessionManager,\n context.requestContext,\n );\n if (refreshResult) {\n return {\n accessToken: refreshResult.accessToken,\n commitSession: refreshResult.status !== \"transient\",\n };\n }\n\n const refreshedAccessToken = await customerSession.getOrRefreshAccessToken(\n context.sessionManager,\n context.requestContext,\n );\n return {\n accessToken: refreshedAccessToken,\n commitSession: true,\n };\n}\n\nasync function addLoggedInCheckoutParam<TCart extends CartData>(\n cart: TCart | null,\n context: Partial<CartCustomerSessionReadContext>,\n customerSession?: CartCustomerSession,\n): Promise<TCart | null> {\n if (!cart || !customerSession) return cart;\n assertCustomerSessionReadContext(context);\n if (!(await customerSession.isLoggedIn(context.sessionManager, context.requestContext)))\n return cart;\n if (!cart.checkoutUrl) return cart;\n\n const checkoutUrl = new URL(cart.checkoutUrl);\n checkoutUrl.searchParams.set(\"logged_in\", \"true\");\n return { ...cart, checkoutUrl: checkoutUrl.toString() };\n}\n\nfunction assertCustomerSessionContext(\n context: Partial<CartCustomerSessionReadContext | CartCustomerSessionWriteContext>,\n): void {\n if (context.sessionManager && context.requestContext) return;\n throw new Error(\n \"Cart handlers configured with customerSession require sessionManager and requestContext.\",\n );\n}\n\nfunction assertCustomerSessionReadContext(\n context: Partial<CartCustomerSessionReadContext>,\n): asserts context is CartCustomerSessionReadContext {\n assertCustomerSessionContext(context);\n}\n\nfunction assertCustomerSessionWriteContext(\n context: Partial<CartCustomerSessionWriteContext>,\n): asserts context is CartCustomerSessionWriteContext {\n assertCustomerSessionContext(context);\n}\n\nasync function executeDiscountModify(\n cartId: string,\n mode: \"apply\" | \"remove\",\n code: string,\n storefront: CartMutationClient,\n queries: RuntimeCartQueries,\n): Promise<MutationResult> {\n // Read-then-write: SFAPI has no atomic discount modify endpoint, so concurrent\n // requests can overwrite each other's discount codes.\n const cartResult = await storefront.graphql(queries.cart, {\n variables: { id: cartId },\n });\n const cartData = assertGraphQLData(cartResult);\n\n const currentCodes: string[] = (cartData.cart?.discountCodes ?? []).map((dc) => dc.code);\n\n const updatedCodes =\n mode === \"apply\" ? [...currentCodes, code] : currentCodes.filter((c) => c !== code);\n\n const result = await storefront.graphql(queries.cartDiscountCodesUpdate, {\n variables: { cartId, discountCodes: updatedCodes },\n });\n const { cart, userErrors, warnings } = assertMutationData(result, \"cartDiscountCodesUpdate\");\n return createMutationResult(cart, userErrors, warnings, result.headers);\n}\n\nfunction jsonResult<TData>(data: TData, headers: HeadersInit = {}): ShopifyRouteJsonResult<TData> {\n return { type: \"json\", data, headers };\n}\n\nfunction redirectResult(location: string, headers: HeadersInit = {}): ShopifyRouteRedirectResult {\n return { type: \"redirect\", location, headers };\n}\n\nfunction errorResult(\n code: CartErrorCode,\n message: string,\n headers?: HeadersInit,\n status?: number,\n): ShopifyRouteErrorResult<CartError> {\n return {\n type: \"error\",\n error: { code, message },\n ...(headers && { headers }),\n ...(status !== undefined && { status }),\n };\n}\n\nfunction getErrorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) return error.message;\n return fallback;\n}\n"],"mappings":"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"}