@shopify/hydrogen 2026.4.5 → 2026.10.0-preview.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (764) hide show
  1. package/README.md +73 -13
  2. package/bin/hydrogen.mjs +7 -0
  3. package/dist/cli/index.mjs +647 -0
  4. package/dist/client/client.d.mts +34 -0
  5. package/dist/client/client.mjs +206 -0
  6. package/dist/client/client.mjs.map +1 -0
  7. package/dist/client/errors.d.mts +48 -0
  8. package/dist/client/errors.mjs +52 -0
  9. package/dist/client/errors.mjs.map +1 -0
  10. package/dist/client/index.d.mts +4 -0
  11. package/dist/client/types.d.mts +147 -0
  12. package/dist/core/analytics/cart-tracker.d.mts +8 -0
  13. package/dist/core/analytics/cart-tracker.mjs +144 -0
  14. package/dist/core/analytics/cart-tracker.mjs.map +1 -0
  15. package/dist/core/analytics/events.d.mts +15 -0
  16. package/dist/core/analytics/events.mjs +15 -0
  17. package/dist/core/analytics/events.mjs.map +1 -0
  18. package/dist/core/analytics/index.d.mts +3 -0
  19. package/dist/core/analytics/types.d.mts +143 -0
  20. package/dist/core/analytics/utils/flatten-connection.d.mts +19 -0
  21. package/dist/core/analytics/utils/flatten-connection.mjs +25 -0
  22. package/dist/core/analytics/utils/flatten-connection.mjs.map +1 -0
  23. package/dist/core/cache/cache-status.mjs +17 -0
  24. package/dist/core/cache/cache-status.mjs.map +1 -0
  25. package/dist/core/cache/fetch-with-cache.d.mts +43 -0
  26. package/dist/core/cache/fetch-with-cache.mjs +188 -0
  27. package/dist/core/cache/fetch-with-cache.mjs.map +1 -0
  28. package/dist/core/cache/key.d.mts +6 -0
  29. package/dist/core/cache/key.mjs +27 -0
  30. package/dist/core/cache/key.mjs.map +1 -0
  31. package/dist/core/cache/run-with-cache.d.mts +36 -0
  32. package/dist/core/cache/run-with-cache.mjs +114 -0
  33. package/dist/core/cache/run-with-cache.mjs.map +1 -0
  34. package/dist/core/cache/store.d.mts +19 -0
  35. package/dist/core/cache/store.mjs +62 -0
  36. package/dist/core/cache/store.mjs.map +1 -0
  37. package/dist/core/cache/strategies.d.mts +39 -0
  38. package/dist/core/cache/strategies.mjs +70 -0
  39. package/dist/core/cache/strategies.mjs.map +1 -0
  40. package/dist/core/cart/actions.d.mts +50 -0
  41. package/dist/core/cart/actions.mjs +240 -0
  42. package/dist/core/cart/actions.mjs.map +1 -0
  43. package/dist/core/cart/attach-quantity-input.d.mts +5 -0
  44. package/dist/core/cart/attach-quantity-input.mjs +17 -0
  45. package/dist/core/cart/attach-quantity-input.mjs.map +1 -0
  46. package/dist/core/cart/buyer-identity-sync.d.mts +23 -0
  47. package/dist/core/cart/buyer-identity-sync.mjs +9 -0
  48. package/dist/core/cart/buyer-identity-sync.mjs.map +1 -0
  49. package/dist/core/cart/cart.d.mts +37 -0
  50. package/dist/core/cart/cart.mjs +1707 -0
  51. package/dist/core/cart/cart.mjs.map +1 -0
  52. package/dist/core/cart/cookie.d.mts +5 -0
  53. package/dist/core/cart/cookie.mjs +28 -0
  54. package/dist/core/cart/cookie.mjs.map +1 -0
  55. package/dist/core/cart/form.d.mts +130 -0
  56. package/dist/core/cart/form.mjs +75 -0
  57. package/dist/core/cart/form.mjs.map +1 -0
  58. package/dist/core/cart/get-cart.d.mts +25 -0
  59. package/dist/core/cart/get-cart.mjs +32 -0
  60. package/dist/core/cart/get-cart.mjs.map +1 -0
  61. package/dist/core/cart/index.d.mts +10 -0
  62. package/dist/core/cart/quantity.d.mts +10 -0
  63. package/dist/core/cart/quantity.mjs +14 -0
  64. package/dist/core/cart/quantity.mjs.map +1 -0
  65. package/dist/core/cart/queries.d.mts +4296 -0
  66. package/dist/core/cart/queries.mjs +70 -0
  67. package/dist/core/cart/queries.mjs.map +1 -0
  68. package/dist/core/cart/server-handlers.d.mts +82 -0
  69. package/dist/core/cart/server-handlers.mjs +322 -0
  70. package/dist/core/cart/server-handlers.mjs.map +1 -0
  71. package/dist/core/cart/state.d.mts +137 -0
  72. package/dist/core/cart/state.mjs +76 -0
  73. package/dist/core/cart/state.mjs.map +1 -0
  74. package/dist/core/cart/sync-quantity-inputs.mjs +16 -0
  75. package/dist/core/cart/sync-quantity-inputs.mjs.map +1 -0
  76. package/dist/core/collection/collection.d.mts +134 -0
  77. package/dist/core/collection/collection.mjs +170 -0
  78. package/dist/core/collection/collection.mjs.map +1 -0
  79. package/dist/core/collection/index.d.mts +6 -0
  80. package/dist/core/collection/reconciler.d.mts +32 -0
  81. package/dist/core/collection/reconciler.mjs +89 -0
  82. package/dist/core/collection/reconciler.mjs.map +1 -0
  83. package/dist/core/collection/state.d.mts +66 -0
  84. package/dist/core/collection/state.mjs +20 -0
  85. package/dist/core/collection/state.mjs.map +1 -0
  86. package/dist/core/collection/url.d.mts +71 -0
  87. package/dist/core/collection/url.mjs +376 -0
  88. package/dist/core/collection/url.mjs.map +1 -0
  89. package/dist/core/constants.d.mts +5 -0
  90. package/dist/core/constants.mjs +8 -0
  91. package/dist/core/constants.mjs.map +1 -0
  92. package/dist/core/headers.mjs +43 -0
  93. package/dist/core/headers.mjs.map +1 -0
  94. package/dist/core/index.d.mts +56 -0
  95. package/dist/core/index.mjs +45 -0
  96. package/dist/core/logging/logging.d.mts +21 -0
  97. package/dist/core/logging/logging.mjs +99 -0
  98. package/dist/core/logging/logging.mjs.map +1 -0
  99. package/dist/core/logging/types.d.mts +40 -0
  100. package/dist/core/logging/types.mjs +18 -0
  101. package/dist/core/logging/types.mjs.map +1 -0
  102. package/dist/core/money/cache.mjs +25 -0
  103. package/dist/core/money/cache.mjs.map +1 -0
  104. package/dist/core/money/format.d.mts +15 -0
  105. package/dist/core/money/format.mjs +243 -0
  106. package/dist/core/money/format.mjs.map +1 -0
  107. package/dist/core/money/types.d.mts +47 -0
  108. package/dist/core/observable.mjs +46 -0
  109. package/dist/core/observable.mjs.map +1 -0
  110. package/dist/core/predictive-search/constants.d.mts +5 -0
  111. package/dist/core/predictive-search/constants.mjs +6 -0
  112. package/dist/core/predictive-search/constants.mjs.map +1 -0
  113. package/dist/core/predictive-search/form.d.mts +31 -0
  114. package/dist/core/predictive-search/form.mjs +31 -0
  115. package/dist/core/predictive-search/form.mjs.map +1 -0
  116. package/dist/core/predictive-search/index.d.mts +6 -0
  117. package/dist/core/predictive-search/queries.d.mts +118 -0
  118. package/dist/core/predictive-search/queries.mjs +81 -0
  119. package/dist/core/predictive-search/queries.mjs.map +1 -0
  120. package/dist/core/predictive-search/search.d.mts +32 -0
  121. package/dist/core/predictive-search/search.mjs +74 -0
  122. package/dist/core/predictive-search/search.mjs.map +1 -0
  123. package/dist/core/predictive-search/server-handlers.d.mts +36 -0
  124. package/dist/core/predictive-search/server-handlers.mjs +113 -0
  125. package/dist/core/predictive-search/server-handlers.mjs.map +1 -0
  126. package/dist/core/predictive-search/store.d.mts +44 -0
  127. package/dist/core/predictive-search/store.mjs +224 -0
  128. package/dist/core/predictive-search/store.mjs.map +1 -0
  129. package/dist/core/predictive-search/url.d.mts +41 -0
  130. package/dist/core/predictive-search/url.mjs +71 -0
  131. package/dist/core/predictive-search/url.mjs.map +1 -0
  132. package/dist/core/product/accept-variant-id.mjs +98 -0
  133. package/dist/core/product/accept-variant-id.mjs.map +1 -0
  134. package/dist/core/product/form.d.mts +63 -0
  135. package/dist/core/product/form.mjs +44 -0
  136. package/dist/core/product/form.mjs.map +1 -0
  137. package/dist/core/product/index.d.mts +5 -0
  138. package/dist/core/product/options.d.mts +43 -0
  139. package/dist/core/product/options.mjs +296 -0
  140. package/dist/core/product/options.mjs.map +1 -0
  141. package/dist/core/product/product-form.d.mts +72 -0
  142. package/dist/core/product/product-form.mjs +158 -0
  143. package/dist/core/product/product-form.mjs.map +1 -0
  144. package/dist/core/product/state.d.mts +68 -0
  145. package/dist/core/product/url.d.mts +47 -0
  146. package/dist/core/product/url.mjs +69 -0
  147. package/dist/core/product/url.mjs.map +1 -0
  148. package/dist/core/request-context.d.mts +75 -0
  149. package/dist/core/request-context.mjs +141 -0
  150. package/dist/core/request-context.mjs.map +1 -0
  151. package/dist/core/request-routing/handle-shopify-redirects.d.mts +17 -0
  152. package/dist/core/request-routing/handle-shopify-redirects.mjs +31 -0
  153. package/dist/core/request-routing/handle-shopify-redirects.mjs.map +1 -0
  154. package/dist/core/request-routing/handle-shopify-routes.d.mts +14 -0
  155. package/dist/core/request-routing/handle-shopify-routes.mjs +42 -0
  156. package/dist/core/request-routing/handle-shopify-routes.mjs.map +1 -0
  157. package/dist/core/request-routing/interceptors/admin-redirect.mjs +12 -0
  158. package/dist/core/request-routing/interceptors/admin-redirect.mjs.map +1 -0
  159. package/dist/core/request-routing/interceptors/ajax-api.mjs +16 -0
  160. package/dist/core/request-routing/interceptors/ajax-api.mjs.map +1 -0
  161. package/dist/core/request-routing/interceptors/api-proxy.mjs +20 -0
  162. package/dist/core/request-routing/interceptors/api-proxy.mjs.map +1 -0
  163. package/dist/core/request-routing/interceptors/checkout.mjs +58 -0
  164. package/dist/core/request-routing/interceptors/checkout.mjs.map +1 -0
  165. package/dist/core/request-routing/interceptors/mcp-proxy.mjs +23 -0
  166. package/dist/core/request-routing/interceptors/mcp-proxy.mjs.map +1 -0
  167. package/dist/core/request-routing/interceptors/proxy.mjs +73 -0
  168. package/dist/core/request-routing/interceptors/proxy.mjs.map +1 -0
  169. package/dist/core/request-routing/interceptors/query-param-redirect.mjs +22 -0
  170. package/dist/core/request-routing/interceptors/query-param-redirect.mjs.map +1 -0
  171. package/dist/core/request-routing/interceptors/sfapi-proxy.mjs +27 -0
  172. package/dist/core/request-routing/interceptors/sfapi-proxy.mjs.map +1 -0
  173. package/dist/core/request-routing/interceptors/standard-routes.mjs +19 -0
  174. package/dist/core/request-routing/interceptors/standard-routes.mjs.map +1 -0
  175. package/dist/core/request-routing/interceptors/url-redirects.mjs +27 -0
  176. package/dist/core/request-routing/interceptors/url-redirects.mjs.map +1 -0
  177. package/dist/core/request-routing/interceptors/well-known.mjs +22 -0
  178. package/dist/core/request-routing/interceptors/well-known.mjs.map +1 -0
  179. package/dist/core/request-routing/registered-routes.d.mts +7 -0
  180. package/dist/core/request-routing/registered-routes.mjs +72 -0
  181. package/dist/core/request-routing/registered-routes.mjs.map +1 -0
  182. package/dist/core/request-routing/route-types.d.mts +56 -0
  183. package/dist/core/request-routing/safe-apply-response-headers.mjs +16 -0
  184. package/dist/core/request-routing/safe-apply-response-headers.mjs.map +1 -0
  185. package/dist/core/shop-pay/shop-pay.d.mts +102 -0
  186. package/dist/core/shop-pay/shop-pay.mjs +289 -0
  187. package/dist/core/shop-pay/shop-pay.mjs.map +1 -0
  188. package/dist/core/shopify-scripts/analytics.mjs +26 -0
  189. package/dist/core/shopify-scripts/analytics.mjs.map +1 -0
  190. package/dist/core/shopify-scripts/consent.mjs +17 -0
  191. package/dist/core/shopify-scripts/consent.mjs.map +1 -0
  192. package/dist/core/shopify-scripts/constants.mjs +19 -0
  193. package/dist/core/shopify-scripts/constants.mjs.map +1 -0
  194. package/dist/core/shopify-scripts/deprecated-cookies.mjs +97 -0
  195. package/dist/core/shopify-scripts/deprecated-cookies.mjs.map +1 -0
  196. package/dist/core/shopify-scripts/global.d.mts +1 -0
  197. package/dist/core/shopify-scripts/global.mjs +86 -0
  198. package/dist/core/shopify-scripts/global.mjs.map +1 -0
  199. package/dist/core/shopify-scripts/index.d.mts +27 -0
  200. package/dist/core/shopify-scripts/index.mjs +135 -0
  201. package/dist/core/shopify-scripts/index.mjs.map +1 -0
  202. package/dist/core/shopify-scripts/initialize.d.mts +18 -0
  203. package/dist/core/shopify-scripts/initialize.mjs +27 -0
  204. package/dist/core/shopify-scripts/initialize.mjs.map +1 -0
  205. package/dist/core/shopify-scripts/page-view.mjs +49 -0
  206. package/dist/core/shopify-scripts/page-view.mjs.map +1 -0
  207. package/dist/core/shopify-scripts/perfkit.mjs +33 -0
  208. package/dist/core/shopify-scripts/perfkit.mjs.map +1 -0
  209. package/dist/core/shopify-scripts/render.d.mts +1 -0
  210. package/dist/core/shopify-scripts/render.mjs +23 -0
  211. package/dist/core/shopify-scripts/render.mjs.map +1 -0
  212. package/dist/core/shopify-scripts/types.d.mts +76 -0
  213. package/dist/core/shopify-scripts/utils/cookie-domain.mjs +43 -0
  214. package/dist/core/shopify-scripts/utils/cookie-domain.mjs.map +1 -0
  215. package/dist/core/shopify-scripts/utils/inline-script.mjs +8 -0
  216. package/dist/core/shopify-scripts/utils/inline-script.mjs.map +1 -0
  217. package/dist/core/shopify-scripts/utils/navigation.mjs +46 -0
  218. package/dist/core/shopify-scripts/utils/navigation.mjs.map +1 -0
  219. package/dist/core/shopify-scripts/utils/tracking-values.mjs +65 -0
  220. package/dist/core/shopify-scripts/utils/tracking-values.mjs.map +1 -0
  221. package/dist/core/shopify-scripts/utils/uuid.mjs +17 -0
  222. package/dist/core/shopify-scripts/utils/uuid.mjs.map +1 -0
  223. package/dist/core/shopify-scripts/webmcp.mjs +22 -0
  224. package/dist/core/shopify-scripts/webmcp.mjs.map +1 -0
  225. package/dist/core/standard-routes/build.d.mts +34 -0
  226. package/dist/core/standard-routes/build.mjs +54 -0
  227. package/dist/core/standard-routes/build.mjs.map +1 -0
  228. package/dist/core/standard-routes/defaults.mjs +31 -0
  229. package/dist/core/standard-routes/defaults.mjs.map +1 -0
  230. package/dist/core/standard-routes/match.mjs +108 -0
  231. package/dist/core/standard-routes/match.mjs.map +1 -0
  232. package/dist/core/standard-routes/path.mjs +58 -0
  233. package/dist/core/standard-routes/path.mjs.map +1 -0
  234. package/dist/core/standard-routes/redirects.mjs +51 -0
  235. package/dist/core/standard-routes/redirects.mjs.map +1 -0
  236. package/dist/core/standard-routes/types.d.mts +95 -0
  237. package/dist/core/url.mjs +42 -0
  238. package/dist/core/url.mjs.map +1 -0
  239. package/dist/core/utils/load-script.mjs +34 -0
  240. package/dist/core/utils/load-script.mjs.map +1 -0
  241. package/dist/core/utils/parse-gid.mjs +33 -0
  242. package/dist/core/utils/parse-gid.mjs.map +1 -0
  243. package/dist/core/utils/record.mjs +8 -0
  244. package/dist/core/utils/record.mjs.map +1 -0
  245. package/dist/customer-account/client.d.mts +50 -0
  246. package/dist/customer-account/client.mjs +239 -0
  247. package/dist/customer-account/client.mjs.map +1 -0
  248. package/dist/customer-account/errors.d.mts +28 -0
  249. package/dist/customer-account/errors.mjs +39 -0
  250. package/dist/customer-account/errors.mjs.map +1 -0
  251. package/dist/customer-account/graphql.d.mts +29 -0
  252. package/dist/customer-account/graphql.mjs +39 -0
  253. package/dist/customer-account/graphql.mjs.map +1 -0
  254. package/dist/customer-account/index.d.mts +7 -0
  255. package/dist/customer-account/index.mjs +7 -0
  256. package/dist/customer-account/session.d.mts +117 -0
  257. package/dist/customer-account/session.mjs +733 -0
  258. package/dist/customer-account/session.mjs.map +1 -0
  259. package/dist/customer-account/type-resolver.d.mts +11 -0
  260. package/dist/customer-account-api-types.d.ts +3269 -3270
  261. package/dist/customer-account.schema.json +50753 -1
  262. package/dist/development/_virtual/_@oxc-project_runtime@0.127.0/helpers/taggedTemplateLiteral.mjs +7 -0
  263. package/dist/development/client/client.d.mts +34 -0
  264. package/dist/development/client/client.mjs +206 -0
  265. package/dist/development/client/client.mjs.map +1 -0
  266. package/dist/development/client/errors.d.mts +48 -0
  267. package/dist/development/client/errors.mjs +57 -0
  268. package/dist/development/client/errors.mjs.map +1 -0
  269. package/dist/development/client/index.d.mts +4 -0
  270. package/dist/development/client/types.d.mts +147 -0
  271. package/dist/development/core/analytics/cart-tracker.d.mts +8 -0
  272. package/dist/development/core/analytics/cart-tracker.mjs +144 -0
  273. package/dist/development/core/analytics/cart-tracker.mjs.map +1 -0
  274. package/dist/development/core/analytics/events.d.mts +15 -0
  275. package/dist/development/core/analytics/events.mjs +15 -0
  276. package/dist/development/core/analytics/events.mjs.map +1 -0
  277. package/dist/development/core/analytics/index.d.mts +3 -0
  278. package/dist/development/core/analytics/types.d.mts +143 -0
  279. package/dist/development/core/analytics/utils/flatten-connection.d.mts +19 -0
  280. package/dist/development/core/analytics/utils/flatten-connection.mjs +25 -0
  281. package/dist/development/core/analytics/utils/flatten-connection.mjs.map +1 -0
  282. package/dist/development/core/cache/cache-status.mjs +17 -0
  283. package/dist/development/core/cache/cache-status.mjs.map +1 -0
  284. package/dist/development/core/cache/fetch-with-cache.d.mts +43 -0
  285. package/dist/development/core/cache/fetch-with-cache.mjs +188 -0
  286. package/dist/development/core/cache/fetch-with-cache.mjs.map +1 -0
  287. package/dist/development/core/cache/key.d.mts +6 -0
  288. package/dist/development/core/cache/key.mjs +27 -0
  289. package/dist/development/core/cache/key.mjs.map +1 -0
  290. package/dist/development/core/cache/run-with-cache.d.mts +36 -0
  291. package/dist/development/core/cache/run-with-cache.mjs +114 -0
  292. package/dist/development/core/cache/run-with-cache.mjs.map +1 -0
  293. package/dist/development/core/cache/store.d.mts +19 -0
  294. package/dist/development/core/cache/store.mjs +62 -0
  295. package/dist/development/core/cache/store.mjs.map +1 -0
  296. package/dist/development/core/cache/strategies.d.mts +39 -0
  297. package/dist/development/core/cache/strategies.mjs +70 -0
  298. package/dist/development/core/cache/strategies.mjs.map +1 -0
  299. package/dist/development/core/cart/actions.d.mts +50 -0
  300. package/dist/development/core/cart/actions.mjs +240 -0
  301. package/dist/development/core/cart/actions.mjs.map +1 -0
  302. package/dist/development/core/cart/attach-quantity-input.d.mts +5 -0
  303. package/dist/development/core/cart/attach-quantity-input.mjs +17 -0
  304. package/dist/development/core/cart/attach-quantity-input.mjs.map +1 -0
  305. package/dist/development/core/cart/buyer-identity-sync.d.mts +19 -0
  306. package/dist/development/core/cart/buyer-identity-sync.mjs +6 -0
  307. package/dist/development/core/cart/buyer-identity-sync.mjs.map +1 -0
  308. package/dist/development/core/cart/cart.d.mts +37 -0
  309. package/dist/development/core/cart/cart.mjs +1707 -0
  310. package/dist/development/core/cart/cart.mjs.map +1 -0
  311. package/dist/development/core/cart/cookie.d.mts +5 -0
  312. package/dist/development/core/cart/cookie.mjs +28 -0
  313. package/dist/development/core/cart/cookie.mjs.map +1 -0
  314. package/dist/development/core/cart/form.d.mts +130 -0
  315. package/dist/development/core/cart/form.mjs +75 -0
  316. package/dist/development/core/cart/form.mjs.map +1 -0
  317. package/dist/development/core/cart/get-cart.d.mts +25 -0
  318. package/dist/development/core/cart/get-cart.mjs +32 -0
  319. package/dist/development/core/cart/get-cart.mjs.map +1 -0
  320. package/dist/development/core/cart/index.d.mts +10 -0
  321. package/dist/development/core/cart/quantity.d.mts +10 -0
  322. package/dist/development/core/cart/quantity.mjs +14 -0
  323. package/dist/development/core/cart/quantity.mjs.map +1 -0
  324. package/dist/development/core/cart/queries.d.mts +4296 -0
  325. package/dist/development/core/cart/queries.mjs +70 -0
  326. package/dist/development/core/cart/queries.mjs.map +1 -0
  327. package/dist/development/core/cart/server-handlers.d.mts +82 -0
  328. package/dist/development/core/cart/server-handlers.mjs +322 -0
  329. package/dist/development/core/cart/server-handlers.mjs.map +1 -0
  330. package/dist/development/core/cart/state.d.mts +137 -0
  331. package/dist/development/core/cart/state.mjs +76 -0
  332. package/dist/development/core/cart/state.mjs.map +1 -0
  333. package/dist/development/core/cart/sync-quantity-inputs.mjs +16 -0
  334. package/dist/development/core/cart/sync-quantity-inputs.mjs.map +1 -0
  335. package/dist/development/core/collection/collection.d.mts +134 -0
  336. package/dist/development/core/collection/collection.mjs +170 -0
  337. package/dist/development/core/collection/collection.mjs.map +1 -0
  338. package/dist/development/core/collection/index.d.mts +6 -0
  339. package/dist/development/core/collection/reconciler.d.mts +32 -0
  340. package/dist/development/core/collection/reconciler.mjs +89 -0
  341. package/dist/development/core/collection/reconciler.mjs.map +1 -0
  342. package/dist/development/core/collection/state.d.mts +66 -0
  343. package/dist/development/core/collection/state.mjs +20 -0
  344. package/dist/development/core/collection/state.mjs.map +1 -0
  345. package/dist/development/core/collection/url.d.mts +71 -0
  346. package/dist/development/core/collection/url.mjs +376 -0
  347. package/dist/development/core/collection/url.mjs.map +1 -0
  348. package/dist/development/core/constants.mjs +7 -0
  349. package/dist/development/core/constants.mjs.map +1 -0
  350. package/dist/development/core/development.d.mts +56 -0
  351. package/dist/development/core/development.mjs +45 -0
  352. package/dist/development/core/headers.mjs +43 -0
  353. package/dist/development/core/headers.mjs.map +1 -0
  354. package/dist/development/core/index.d.mts +54 -0
  355. package/dist/development/core/logging/logging.d.mts +21 -0
  356. package/dist/development/core/logging/logging.mjs +99 -0
  357. package/dist/development/core/logging/logging.mjs.map +1 -0
  358. package/dist/development/core/logging/types.d.mts +40 -0
  359. package/dist/development/core/logging/types.mjs +18 -0
  360. package/dist/development/core/logging/types.mjs.map +1 -0
  361. package/dist/development/core/money/cache.mjs +25 -0
  362. package/dist/development/core/money/cache.mjs.map +1 -0
  363. package/dist/development/core/money/format.d.mts +15 -0
  364. package/dist/development/core/money/format.mjs +243 -0
  365. package/dist/development/core/money/format.mjs.map +1 -0
  366. package/dist/development/core/money/types.d.mts +47 -0
  367. package/dist/development/core/observable.mjs +46 -0
  368. package/dist/development/core/observable.mjs.map +1 -0
  369. package/dist/development/core/predictive-search/constants.d.mts +5 -0
  370. package/dist/development/core/predictive-search/constants.mjs +6 -0
  371. package/dist/development/core/predictive-search/constants.mjs.map +1 -0
  372. package/dist/development/core/predictive-search/form.d.mts +31 -0
  373. package/dist/development/core/predictive-search/form.mjs +31 -0
  374. package/dist/development/core/predictive-search/form.mjs.map +1 -0
  375. package/dist/development/core/predictive-search/index.d.mts +6 -0
  376. package/dist/development/core/predictive-search/queries.d.mts +118 -0
  377. package/dist/development/core/predictive-search/queries.mjs +81 -0
  378. package/dist/development/core/predictive-search/queries.mjs.map +1 -0
  379. package/dist/development/core/predictive-search/search.d.mts +32 -0
  380. package/dist/development/core/predictive-search/search.mjs +74 -0
  381. package/dist/development/core/predictive-search/search.mjs.map +1 -0
  382. package/dist/development/core/predictive-search/server-handlers.d.mts +36 -0
  383. package/dist/development/core/predictive-search/server-handlers.mjs +113 -0
  384. package/dist/development/core/predictive-search/server-handlers.mjs.map +1 -0
  385. package/dist/development/core/predictive-search/store.d.mts +44 -0
  386. package/dist/development/core/predictive-search/store.mjs +224 -0
  387. package/dist/development/core/predictive-search/store.mjs.map +1 -0
  388. package/dist/development/core/predictive-search/url.d.mts +41 -0
  389. package/dist/development/core/predictive-search/url.mjs +71 -0
  390. package/dist/development/core/predictive-search/url.mjs.map +1 -0
  391. package/dist/development/core/product/accept-variant-id.mjs +98 -0
  392. package/dist/development/core/product/accept-variant-id.mjs.map +1 -0
  393. package/dist/development/core/product/form.d.mts +63 -0
  394. package/dist/development/core/product/form.mjs +44 -0
  395. package/dist/development/core/product/form.mjs.map +1 -0
  396. package/dist/development/core/product/index.d.mts +5 -0
  397. package/dist/development/core/product/options.d.mts +43 -0
  398. package/dist/development/core/product/options.mjs +296 -0
  399. package/dist/development/core/product/options.mjs.map +1 -0
  400. package/dist/development/core/product/product-form.d.mts +72 -0
  401. package/dist/development/core/product/product-form.mjs +158 -0
  402. package/dist/development/core/product/product-form.mjs.map +1 -0
  403. package/dist/development/core/product/state.d.mts +68 -0
  404. package/dist/development/core/product/url.d.mts +47 -0
  405. package/dist/development/core/product/url.mjs +69 -0
  406. package/dist/development/core/product/url.mjs.map +1 -0
  407. package/dist/development/core/request-context.d.mts +75 -0
  408. package/dist/development/core/request-context.mjs +141 -0
  409. package/dist/development/core/request-context.mjs.map +1 -0
  410. package/dist/development/core/request-routing/handle-shopify-redirects.d.mts +17 -0
  411. package/dist/development/core/request-routing/handle-shopify-redirects.mjs +31 -0
  412. package/dist/development/core/request-routing/handle-shopify-redirects.mjs.map +1 -0
  413. package/dist/development/core/request-routing/handle-shopify-routes.d.mts +1 -0
  414. package/dist/development/core/request-routing/handle-shopify-routes.development.d.mts +11 -0
  415. package/dist/development/core/request-routing/handle-shopify-routes.development.mjs +16 -0
  416. package/dist/development/core/request-routing/handle-shopify-routes.development.mjs.map +1 -0
  417. package/dist/development/core/request-routing/handle-shopify-routes.mjs +42 -0
  418. package/dist/development/core/request-routing/handle-shopify-routes.mjs.map +1 -0
  419. package/dist/development/core/request-routing/interceptors/admin-redirect.mjs +12 -0
  420. package/dist/development/core/request-routing/interceptors/admin-redirect.mjs.map +1 -0
  421. package/dist/development/core/request-routing/interceptors/ajax-api.mjs +16 -0
  422. package/dist/development/core/request-routing/interceptors/ajax-api.mjs.map +1 -0
  423. package/dist/development/core/request-routing/interceptors/api-proxy.mjs +20 -0
  424. package/dist/development/core/request-routing/interceptors/api-proxy.mjs.map +1 -0
  425. package/dist/development/core/request-routing/interceptors/checkout.mjs +58 -0
  426. package/dist/development/core/request-routing/interceptors/checkout.mjs.map +1 -0
  427. package/dist/development/core/request-routing/interceptors/graphiql.mjs +46 -0
  428. package/dist/development/core/request-routing/interceptors/graphiql.mjs.map +1 -0
  429. package/dist/development/core/request-routing/interceptors/mcp-proxy.mjs +23 -0
  430. package/dist/development/core/request-routing/interceptors/mcp-proxy.mjs.map +1 -0
  431. package/dist/development/core/request-routing/interceptors/proxy.mjs +73 -0
  432. package/dist/development/core/request-routing/interceptors/proxy.mjs.map +1 -0
  433. package/dist/development/core/request-routing/interceptors/query-param-redirect.mjs +22 -0
  434. package/dist/development/core/request-routing/interceptors/query-param-redirect.mjs.map +1 -0
  435. package/dist/development/core/request-routing/interceptors/sfapi-proxy.mjs +27 -0
  436. package/dist/development/core/request-routing/interceptors/sfapi-proxy.mjs.map +1 -0
  437. package/dist/development/core/request-routing/interceptors/standard-routes.mjs +19 -0
  438. package/dist/development/core/request-routing/interceptors/standard-routes.mjs.map +1 -0
  439. package/dist/development/core/request-routing/interceptors/url-redirects.mjs +27 -0
  440. package/dist/development/core/request-routing/interceptors/url-redirects.mjs.map +1 -0
  441. package/dist/development/core/request-routing/interceptors/well-known.mjs +22 -0
  442. package/dist/development/core/request-routing/interceptors/well-known.mjs.map +1 -0
  443. package/dist/development/core/request-routing/registered-routes.d.mts +7 -0
  444. package/dist/development/core/request-routing/registered-routes.mjs +72 -0
  445. package/dist/development/core/request-routing/registered-routes.mjs.map +1 -0
  446. package/dist/development/core/request-routing/route-types.d.mts +56 -0
  447. package/dist/development/core/request-routing/safe-apply-response-headers.mjs +16 -0
  448. package/dist/development/core/request-routing/safe-apply-response-headers.mjs.map +1 -0
  449. package/dist/development/core/shop-pay/shop-pay.d.mts +102 -0
  450. package/dist/development/core/shop-pay/shop-pay.mjs +289 -0
  451. package/dist/development/core/shop-pay/shop-pay.mjs.map +1 -0
  452. package/dist/development/core/shopify-scripts/analytics.mjs +26 -0
  453. package/dist/development/core/shopify-scripts/analytics.mjs.map +1 -0
  454. package/dist/development/core/shopify-scripts/consent.mjs +17 -0
  455. package/dist/development/core/shopify-scripts/consent.mjs.map +1 -0
  456. package/dist/development/core/shopify-scripts/constants.mjs +19 -0
  457. package/dist/development/core/shopify-scripts/constants.mjs.map +1 -0
  458. package/dist/development/core/shopify-scripts/deprecated-cookies.mjs +97 -0
  459. package/dist/development/core/shopify-scripts/deprecated-cookies.mjs.map +1 -0
  460. package/dist/development/core/shopify-scripts/global.d.mts +1 -0
  461. package/dist/development/core/shopify-scripts/global.mjs +86 -0
  462. package/dist/development/core/shopify-scripts/global.mjs.map +1 -0
  463. package/dist/development/core/shopify-scripts/index.d.mts +27 -0
  464. package/dist/development/core/shopify-scripts/index.mjs +145 -0
  465. package/dist/development/core/shopify-scripts/index.mjs.map +1 -0
  466. package/dist/development/core/shopify-scripts/initialize.d.mts +18 -0
  467. package/dist/development/core/shopify-scripts/initialize.mjs +27 -0
  468. package/dist/development/core/shopify-scripts/initialize.mjs.map +1 -0
  469. package/dist/development/core/shopify-scripts/page-view.mjs +49 -0
  470. package/dist/development/core/shopify-scripts/page-view.mjs.map +1 -0
  471. package/dist/development/core/shopify-scripts/perfkit.mjs +33 -0
  472. package/dist/development/core/shopify-scripts/perfkit.mjs.map +1 -0
  473. package/dist/development/core/shopify-scripts/render.d.mts +1 -0
  474. package/dist/development/core/shopify-scripts/render.mjs +23 -0
  475. package/dist/development/core/shopify-scripts/render.mjs.map +1 -0
  476. package/dist/development/core/shopify-scripts/types.d.mts +76 -0
  477. package/dist/development/core/shopify-scripts/utils/cookie-domain.mjs +43 -0
  478. package/dist/development/core/shopify-scripts/utils/cookie-domain.mjs.map +1 -0
  479. package/dist/development/core/shopify-scripts/utils/inline-script.mjs +8 -0
  480. package/dist/development/core/shopify-scripts/utils/inline-script.mjs.map +1 -0
  481. package/dist/development/core/shopify-scripts/utils/navigation.mjs +46 -0
  482. package/dist/development/core/shopify-scripts/utils/navigation.mjs.map +1 -0
  483. package/dist/development/core/shopify-scripts/utils/tracking-values.mjs +65 -0
  484. package/dist/development/core/shopify-scripts/utils/tracking-values.mjs.map +1 -0
  485. package/dist/development/core/shopify-scripts/utils/uuid.mjs +17 -0
  486. package/dist/development/core/shopify-scripts/utils/uuid.mjs.map +1 -0
  487. package/dist/development/core/shopify-scripts/webmcp.mjs +22 -0
  488. package/dist/development/core/shopify-scripts/webmcp.mjs.map +1 -0
  489. package/dist/development/core/standard-routes/build.d.mts +34 -0
  490. package/dist/development/core/standard-routes/build.mjs +54 -0
  491. package/dist/development/core/standard-routes/build.mjs.map +1 -0
  492. package/dist/development/core/standard-routes/defaults.mjs +31 -0
  493. package/dist/development/core/standard-routes/defaults.mjs.map +1 -0
  494. package/dist/development/core/standard-routes/match.mjs +108 -0
  495. package/dist/development/core/standard-routes/match.mjs.map +1 -0
  496. package/dist/development/core/standard-routes/path.mjs +58 -0
  497. package/dist/development/core/standard-routes/path.mjs.map +1 -0
  498. package/dist/development/core/standard-routes/redirects.mjs +51 -0
  499. package/dist/development/core/standard-routes/redirects.mjs.map +1 -0
  500. package/dist/development/core/standard-routes/types.d.mts +95 -0
  501. package/dist/development/core/types.d.mts +11 -0
  502. package/dist/development/core/url.mjs +42 -0
  503. package/dist/development/core/url.mjs.map +1 -0
  504. package/dist/development/core/utils/load-script.mjs +34 -0
  505. package/dist/development/core/utils/load-script.mjs.map +1 -0
  506. package/dist/development/core/utils/parse-gid.mjs +33 -0
  507. package/dist/development/core/utils/parse-gid.mjs.map +1 -0
  508. package/dist/development/customer-account/session.d.mts +46 -0
  509. package/dist/development/customer-account/session.mjs +21 -0
  510. package/dist/development/customer-account/session.mjs.map +1 -0
  511. package/dist/development/globals.d.mts +64 -0
  512. package/dist/development/graphql/generated/customer-account-api-types.d.mts +13 -0
  513. package/dist/development/graphql/generated/graphql-env.d.mts +19280 -0
  514. package/dist/development/graphql/generated/storefront-api-types.d.mts +47 -0
  515. package/dist/development/graphql/graphql.d.mts +40 -0
  516. package/dist/development/graphql/graphql.mjs +16 -0
  517. package/dist/development/graphql/graphql.mjs.map +1 -0
  518. package/dist/development/graphql/index.d.mts +2 -0
  519. package/dist/development/graphql/scalars.d.mts +15 -0
  520. package/dist/development/graphql/type-resolver.d.mts +229 -0
  521. package/dist/development/react/cart.d.mts +44 -0
  522. package/dist/development/react/cart.mjs +155 -0
  523. package/dist/development/react/cart.mjs.map +1 -0
  524. package/dist/development/react/collection.d.mts +91 -0
  525. package/dist/development/react/collection.mjs +129 -0
  526. package/dist/development/react/collection.mjs.map +1 -0
  527. package/dist/development/react/index.d.mts +13 -0
  528. package/dist/development/react/index.mjs +10 -0
  529. package/dist/development/react/predictive-search.d.mts +49 -0
  530. package/dist/development/react/predictive-search.mjs +133 -0
  531. package/dist/development/react/predictive-search.mjs.map +1 -0
  532. package/dist/development/react/product.d.mts +72 -0
  533. package/dist/development/react/product.mjs +127 -0
  534. package/dist/development/react/product.mjs.map +1 -0
  535. package/dist/development/react/shop-pay.d.mts +9 -0
  536. package/dist/development/react/shop-pay.mjs +16 -0
  537. package/dist/development/react/shop-pay.mjs.map +1 -0
  538. package/dist/development/react/shopify-scripts.d.mts +20 -0
  539. package/dist/development/react/shopify-scripts.mjs +39 -0
  540. package/dist/development/react/shopify-scripts.mjs.map +1 -0
  541. package/dist/development/vendor/standard-actions.d.mts +134 -0
  542. package/dist/development/vendor/standard-events.d.mts +1107 -0
  543. package/dist/development/vue/cart.d.mts +46 -0
  544. package/dist/development/vue/cart.mjs +122 -0
  545. package/dist/development/vue/cart.mjs.map +1 -0
  546. package/dist/development/vue/collection.d.mts +46 -0
  547. package/dist/development/vue/collection.mjs +108 -0
  548. package/dist/development/vue/collection.mjs.map +1 -0
  549. package/dist/development/vue/index.d.mts +11 -0
  550. package/dist/development/vue/index.mjs +8 -0
  551. package/dist/development/vue/predictive-search.d.mts +124 -0
  552. package/dist/development/vue/predictive-search.mjs +171 -0
  553. package/dist/development/vue/predictive-search.mjs.map +1 -0
  554. package/dist/development/vue/product.d.mts +57 -0
  555. package/dist/development/vue/product.mjs +167 -0
  556. package/dist/development/vue/product.mjs.map +1 -0
  557. package/dist/development/vue/shop-pay.d.mts +25 -0
  558. package/dist/development/vue/shop-pay.mjs +35 -0
  559. package/dist/development/vue/shop-pay.mjs.map +1 -0
  560. package/dist/development/vue/shopify-scripts.d.mts +127 -0
  561. package/dist/development/vue/shopify-scripts.mjs +79 -0
  562. package/dist/development/vue/shopify-scripts.mjs.map +1 -0
  563. package/dist/globals.d.mts +64 -0
  564. package/dist/graphql/generated/customer-account-api-types.d.mts +13 -0
  565. package/dist/graphql/generated/customer-account-graphql-env.d.mts +22170 -0
  566. package/dist/graphql/generated/graphql-env.d.mts +19280 -0
  567. package/dist/graphql/generated/storefront-api-types.d.mts +47 -0
  568. package/dist/graphql/graphql.d.mts +40 -0
  569. package/dist/graphql/graphql.mjs +16 -0
  570. package/dist/graphql/graphql.mjs.map +1 -0
  571. package/dist/graphql/index.d.mts +2 -0
  572. package/dist/graphql/scalars.d.mts +26 -0
  573. package/dist/graphql/type-resolver.d.mts +229 -0
  574. package/dist/react/cart.d.mts +44 -0
  575. package/dist/react/cart.mjs +155 -0
  576. package/dist/react/cart.mjs.map +1 -0
  577. package/dist/react/collection.d.mts +91 -0
  578. package/dist/react/collection.mjs +129 -0
  579. package/dist/react/collection.mjs.map +1 -0
  580. package/dist/react/index.d.mts +13 -0
  581. package/dist/react/index.mjs +10 -0
  582. package/dist/react/predictive-search.d.mts +49 -0
  583. package/dist/react/predictive-search.mjs +133 -0
  584. package/dist/react/predictive-search.mjs.map +1 -0
  585. package/dist/react/product.d.mts +72 -0
  586. package/dist/react/product.mjs +127 -0
  587. package/dist/react/product.mjs.map +1 -0
  588. package/dist/react/shop-pay.d.mts +9 -0
  589. package/dist/react/shop-pay.mjs +16 -0
  590. package/dist/react/shop-pay.mjs.map +1 -0
  591. package/dist/react/shopify-scripts.d.mts +20 -0
  592. package/dist/react/shopify-scripts.mjs +39 -0
  593. package/dist/react/shopify-scripts.mjs.map +1 -0
  594. package/dist/storefront-api-types.d.ts +2351 -2390
  595. package/dist/storefront.schema.json +41534 -1
  596. package/dist/ts-plugin/index.cjs +68 -0
  597. package/dist/ts-plugin/index.cjs.map +1 -0
  598. package/dist/ts-plugin/index.d.cts +4 -0
  599. package/dist/vendor/standard-actions.d.mts +134 -0
  600. package/dist/vendor/standard-events.d.mts +1107 -0
  601. package/dist/vite/certificate-prompt.mjs +24 -0
  602. package/dist/vite/certificate-prompt.mjs.map +1 -0
  603. package/dist/vite/index.d.mts +2 -0
  604. package/dist/vite/index.mjs +3 -0
  605. package/dist/vite/local-https.d.mts +47 -0
  606. package/dist/vite/local-https.mjs +276 -0
  607. package/dist/vite/local-https.mjs.map +1 -0
  608. package/dist/vite/mkcert.mjs +141 -0
  609. package/dist/vite/mkcert.mjs.map +1 -0
  610. package/dist/vue/cart.d.mts +46 -0
  611. package/dist/vue/cart.mjs +122 -0
  612. package/dist/vue/cart.mjs.map +1 -0
  613. package/dist/vue/collection.d.mts +46 -0
  614. package/dist/vue/collection.mjs +108 -0
  615. package/dist/vue/collection.mjs.map +1 -0
  616. package/dist/vue/index.d.mts +11 -0
  617. package/dist/vue/index.mjs +8 -0
  618. package/dist/vue/predictive-search.d.mts +124 -0
  619. package/dist/vue/predictive-search.mjs +171 -0
  620. package/dist/vue/predictive-search.mjs.map +1 -0
  621. package/dist/vue/product.d.mts +57 -0
  622. package/dist/vue/product.mjs +167 -0
  623. package/dist/vue/product.mjs.map +1 -0
  624. package/dist/vue/shop-pay.d.mts +25 -0
  625. package/dist/vue/shop-pay.mjs +35 -0
  626. package/dist/vue/shop-pay.mjs.map +1 -0
  627. package/dist/vue/shopify-scripts.d.mts +127 -0
  628. package/dist/vue/shopify-scripts.mjs +79 -0
  629. package/dist/vue/shopify-scripts.mjs.map +1 -0
  630. package/package.json +116 -86
  631. package/skills/hydrogen-analytics/SKILL.md +80 -0
  632. package/skills/hydrogen-analytics/references/react.md +160 -0
  633. package/skills/hydrogen-analytics/references/vue.md +80 -0
  634. package/skills/hydrogen-cart-drawer/SKILL.md +248 -0
  635. package/skills/hydrogen-cart-drawer/references/accessibility.md +109 -0
  636. package/skills/hydrogen-cart-drawer/references/css.md +67 -0
  637. package/skills/hydrogen-cart-ui/SKILL.md +224 -0
  638. package/skills/hydrogen-cart-ui/references/nextjs.md +89 -0
  639. package/skills/hydrogen-cart-ui/references/react.md +285 -0
  640. package/skills/hydrogen-cart-ui/references/vue.md +228 -0
  641. package/skills/hydrogen-collection-browser/SKILL.md +83 -0
  642. package/skills/hydrogen-collection-browser/references/nextjs.md +118 -0
  643. package/skills/hydrogen-collection-browser/references/nuxt.md +108 -0
  644. package/skills/hydrogen-collection-browser/references/react.md +301 -0
  645. package/skills/hydrogen-customer-account/SKILL.md +107 -0
  646. package/skills/hydrogen-image/SKILL.md +65 -0
  647. package/skills/hydrogen-local-https/SKILL.md +142 -0
  648. package/skills/hydrogen-markets/SKILL.md +221 -0
  649. package/skills/hydrogen-markets/references/nextjs.md +157 -0
  650. package/skills/hydrogen-money/SKILL.md +67 -0
  651. package/skills/hydrogen-oxygen/SKILL.md +245 -0
  652. package/skills/hydrogen-oxygen/references/react-router.md +230 -0
  653. package/skills/hydrogen-predictive-search/SKILL.md +130 -0
  654. package/skills/hydrogen-predictive-search/references/react.md +32 -0
  655. package/skills/hydrogen-predictive-search/references/vue.md +40 -0
  656. package/skills/hydrogen-request-handlers/SKILL.md +107 -0
  657. package/skills/hydrogen-request-handlers/references/frameworks.md +179 -0
  658. package/skills/hydrogen-request-handlers/references/nextjs.md +137 -0
  659. package/skills/hydrogen-request-handlers/references/nuxt.md +215 -0
  660. package/skills/hydrogen-routing/SKILL.md +171 -0
  661. package/skills/hydrogen-setup/SKILL.md +50 -0
  662. package/skills/hydrogen-setup/references/analytics.md +624 -0
  663. package/skills/hydrogen-setup/steps/1-inspect-app.md +62 -0
  664. package/skills/hydrogen-setup/steps/10-analytics.md +10 -0
  665. package/skills/hydrogen-setup/steps/11-verify.md +31 -0
  666. package/skills/hydrogen-setup/steps/2-scaffold.md +86 -0
  667. package/skills/hydrogen-setup/steps/3-build-home-page.md +37 -0
  668. package/skills/hydrogen-setup/steps/4-collection-and-search.md +14 -0
  669. package/skills/hydrogen-setup/steps/5-cart.md +10 -0
  670. package/skills/hydrogen-setup/steps/6-product-detail-page.md +416 -0
  671. package/skills/hydrogen-setup/steps/7-shopify-runtime-scripts.md +69 -0
  672. package/skills/hydrogen-setup/steps/8-cart-drawer-and-navbar.md +35 -0
  673. package/skills/hydrogen-setup/steps/9-account-page.md +54 -0
  674. package/skills/hydrogen-shop-pay/SKILL.md +79 -0
  675. package/skills/hydrogen-shop-pay/references/core.md +66 -0
  676. package/skills/hydrogen-shop-pay/references/react.md +50 -0
  677. package/skills/hydrogen-shop-pay/references/vue.md +39 -0
  678. package/skills/hydrogen-smoke-test/SKILL.md +205 -0
  679. package/skills/hydrogen-storefront-client/SKILL.md +322 -0
  680. package/skills/hydrogen-storefront-client/references/astro.md +125 -0
  681. package/skills/hydrogen-storefront-client/references/caching.md +25 -0
  682. package/skills/hydrogen-storefront-client/references/nextjs.md +121 -0
  683. package/skills/hydrogen-storefront-client/references/nuxt.md +121 -0
  684. package/skills/hydrogen-storefront-client/references/query-validation.md +95 -0
  685. package/skills/hydrogen-storefront-client/references/react-router.md +81 -0
  686. package/skills/hydrogen-storefront-client/references/solidstart.md +131 -0
  687. package/skills/hydrogen-storefront-client/references/sveltekit.md +169 -0
  688. package/skills/hydrogen-variant-form/SKILL.md +267 -0
  689. package/skills/hydrogen-variant-form/references/nextjs.md +207 -0
  690. package/skills/hydrogen-variant-form/references/nuxt.md +95 -0
  691. package/skills/hydrogen-variant-form/references/react.md +71 -0
  692. package/dist/dev/get-virtual-routes-H72465VB.js +0 -74
  693. package/dist/dev/hydrogen-routes.d.ts +0 -5
  694. package/dist/dev/hydrogen-routes.js +0 -25
  695. package/dist/development/get-virtual-routes-ACFZHU42.js +0 -71
  696. package/dist/development/get-virtual-routes-ACFZHU42.js.map +0 -1
  697. package/dist/development/index.cjs +0 -6978
  698. package/dist/development/index.cjs.map +0 -1
  699. package/dist/development/index.js +0 -6631
  700. package/dist/development/index.js.map +0 -1
  701. package/dist/development/log-seo-tags-IG37ONQ2.js +0 -74
  702. package/dist/development/log-seo-tags-IG37ONQ2.js.map +0 -1
  703. package/dist/development/react-router-preset.d.ts +0 -45
  704. package/dist/development/react-router-preset.js +0 -49
  705. package/dist/development/react-router-preset.js.map +0 -1
  706. package/dist/index.cjs +0 -1
  707. package/dist/oxygen/index.d.ts +0 -197
  708. package/dist/oxygen/index.js +0 -107
  709. package/dist/production/get-virtual-routes-ZZEGQQDV.js +0 -3
  710. package/dist/production/get-virtual-routes-ZZEGQQDV.js.map +0 -1
  711. package/dist/production/index.cjs +0 -1019
  712. package/dist/production/index.cjs.map +0 -1
  713. package/dist/production/index.d.cts +0 -3260
  714. package/dist/production/index.d.ts +0 -3260
  715. package/dist/production/index.js +0 -1019
  716. package/dist/production/index.js.map +0 -1
  717. package/dist/production/log-seo-tags-TY72EQWZ.js +0 -2
  718. package/dist/production/log-seo-tags-TY72EQWZ.js.map +0 -1
  719. package/dist/production/react-router-preset.d.ts +0 -45
  720. package/dist/production/react-router-preset.js +0 -11
  721. package/dist/react-router.d.ts +0 -75
  722. package/dist/vite/chunk-4O5OI3OO.js +0 -127
  723. package/dist/vite/chunk-FAQ7TVHC.js +0 -9
  724. package/dist/vite/chunk-QXBQVDMY.js +0 -68
  725. package/dist/vite/compat-date.d.ts +0 -3
  726. package/dist/vite/compat-date.js +0 -6
  727. package/dist/vite/get-virtual-routes.d.ts +0 -21
  728. package/dist/vite/get-virtual-routes.js +0 -74
  729. package/dist/vite/hydrogen-middleware.d.ts +0 -9
  730. package/dist/vite/hydrogen-middleware.js +0 -7
  731. package/dist/vite/plugin.d.ts +0 -22
  732. package/dist/vite/plugin.js +0 -171
  733. package/dist/vite/request-events.d.ts +0 -144
  734. package/dist/vite/request-events.js +0 -10
  735. package/dist/vite/types.d.ts +0 -5
  736. package/dist/vite/types.js +0 -0
  737. package/dist/vite/virtual-routes/assets/debug-network.css +0 -609
  738. package/dist/vite/virtual-routes/assets/favicon-dark.svg +0 -20
  739. package/dist/vite/virtual-routes/assets/favicon.svg +0 -28
  740. package/dist/vite/virtual-routes/assets/inter-variable-font.woff2 +0 -0
  741. package/dist/vite/virtual-routes/assets/jetbrainsmono-variable-font.woff2 +0 -0
  742. package/dist/vite/virtual-routes/assets/styles.css +0 -249
  743. package/dist/vite/virtual-routes/components/FlameChartWrapper.jsx +0 -123
  744. package/dist/vite/virtual-routes/components/HydrogenLogoBaseBW.jsx +0 -32
  745. package/dist/vite/virtual-routes/components/HydrogenLogoBaseColor.jsx +0 -47
  746. package/dist/vite/virtual-routes/components/IconBanner.jsx +0 -292
  747. package/dist/vite/virtual-routes/components/IconClose.jsx +0 -38
  748. package/dist/vite/virtual-routes/components/IconDiscard.jsx +0 -44
  749. package/dist/vite/virtual-routes/components/IconError.jsx +0 -61
  750. package/dist/vite/virtual-routes/components/IconGithub.jsx +0 -23
  751. package/dist/vite/virtual-routes/components/IconTwitter.jsx +0 -21
  752. package/dist/vite/virtual-routes/components/Layout.jsx +0 -7
  753. package/dist/vite/virtual-routes/components/RequestDetails.jsx +0 -171
  754. package/dist/vite/virtual-routes/components/RequestTable.jsx +0 -91
  755. package/dist/vite/virtual-routes/components/RequestWaterfall.jsx +0 -151
  756. package/dist/vite/virtual-routes/layout.jsx +0 -33
  757. package/dist/vite/virtual-routes/lib/useDebugNetworkServer.jsx +0 -178
  758. package/dist/vite/virtual-routes/routes/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.jsx +0 -37
  759. package/dist/vite/virtual-routes/routes/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.tsx +0 -79
  760. package/dist/vite/virtual-routes/routes/graphiql.jsx +0 -5
  761. package/dist/vite/virtual-routes/routes/index.jsx +0 -265
  762. package/dist/vite/virtual-routes/routes/subrequest-profiler.jsx +0 -243
  763. package/dist/vite/virtual-routes/virtual-root-with-layout.jsx +0 -63
  764. package/dist/vite/virtual-routes/virtual-root.jsx +0 -67
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cart.mjs","names":[],"sources":["../../../../src/core/cart/cart.ts"],"sourcesContent":["import type {\n CartActionError,\n ShopifyStandardActions,\n UpdateCartOptions,\n UpdateCartPayload,\n UpdateCartResult,\n} from \"../../../vendor/standard-actions\";\nimport type {\n CartAttributesUpdateEvent,\n CartAttributesUpdateResult,\n CartDiscountUpdateEvent,\n CartDiscountUpdateResult,\n CartLinesUpdateEvent,\n CartLinesUpdateResult,\n CartNoteUpdateEvent,\n CartNoteUpdateResult,\n} from \"../../../vendor/standard-events\";\nimport type { CartErrorCode, CartWarningCode } from \"../../graphql/generated/storefront-api-types\";\nimport { getLogger } from \"../logging\";\nimport { createObservable } from \"../observable\";\nimport {\n SHOPIFY_STOREFRONT_STANDARD_ACTIONS_SCRIPT,\n VISITOR_CONSENT_COLLECTED_EVENT,\n} from \"../shopify-scripts/index\";\nimport { getCartAttributeFormEntries } from \"./form\";\nimport { DEFAULT_MINIMUM_QUANTITY, sanitizeQuantity } from \"./quantity\";\nimport type {\n CartCost,\n CartData,\n CartErrorGroup,\n CartLine,\n CartNetworkEntry,\n CartState,\n CartUserError,\n CartWarning,\n} from \"./state\";\nimport { createCartState, createEmptyCartState, createEmptyErrorGroup } from \"./state\";\nimport { syncQuantityInputs } from \"./sync-quantity-inputs\";\n\nconst log = getLogger(\"cart\");\n\ninterface CartResponse extends CartData {\n id: string;\n cost: CartCost;\n checkoutUrl?: string | null;\n}\n\ntype CartMutationResult =\n | UpdateCartResult\n | CartAttributesUpdateResult\n | CartLinesUpdateResult\n | CartDiscountUpdateResult\n | CartNoteUpdateResult;\n\ntype StandardEventCart = NonNullable<CartMutationResult[\"cart\"]>;\ntype CartActionFailure = CartActionError[\"cause\"];\ntype VendorUserError = NonNullable<CartActionFailure[\"userErrors\"]>[number];\ntype VendorWarning = NonNullable<CartActionFailure[\"warnings\"]>[number];\ntype KeyResult = string | string[] | undefined;\ntype ErrorProjector = (state: CartState, timestampMs: number) => CartState;\ntype AddError = (project: ErrorProjector, keys?: string[]) => void;\ntype TransactionSettlementOptions = { mergeServerCart: boolean };\ntype UpdateCartTransport = (\n payload: UpdateCartPayload,\n options?: UpdateCartOptions,\n) => Promise<UpdateCartResult>;\n\nconst OPTIMISTIC_LINE_ID_PREFIX = \"optimistic:\";\nconst LINE_KEY_PREFIX = \"line:\";\nconst MERCHANDISE_KEY_PREFIX = \"merchandise:\";\nconst DISCOUNT_KEY_PREFIX = \"discount:\";\nconst NOTE_KEY = \"note\";\nconst ATTRIBUTES_KEY = \"attributes\";\nconst DISCOUNT_CODES_KEY = \"discount-codes\";\nconst REVALIDATION_ERROR_KEY = \"cart-revalidation\";\nconst TRANSACTION_EVENT_TOKEN_KEY = \"__shopifyHydrogenCartTransaction\";\nconst DEFAULT_ADD_QUANTITY = 1;\nconst NOOP = () => {};\nconst EMPTY_QUANTITY = 0;\nconst FNV1A_OFFSET_BASIS = 0x811c9dc5;\nconst FNV1A_PRIME = 0x01000193;\nconst CART_REVALIDATION_ERROR_MESSAGE =\n \"Something went wrong refreshing your cart. Please try again.\";\n\nexport const STANDARD_ACTION_TIMEOUT_IN_MS = 30_000;\n\nexport class CartNetworkError extends Error {\n readonly status: number;\n\n constructor(status: number) {\n super(\"Something went wrong updating your cart. Please try again.\");\n this.name = \"CartNetworkError\";\n this.status = status;\n }\n}\n\nexport type CartStore = {\n connect(): void;\n destroy(): void;\n hydrate(data: CartData): void;\n getState(): CartState;\n subscribe(listener: (state: CartState) => void): () => void;\n fetch(): Promise<void>;\n /**\n * Reconciles the cart after an out-of-band mutation: revalidates the current\n * cart, or loads one when none is present yet (e.g. just created server-side).\n */\n refresh(): void;\n reset(): void;\n handleFormSubmit(event: SubmitEvent, eventDetail?: Record<string, unknown>): Promise<void>;\n};\n\ntype CartInitialData<TData extends CartData = CartData> = {\n cart: TData | null;\n errors?: Array<{ message: string }>;\n};\n\nexport type CreateCartStoreOptions<TData extends CartData = CartData> = {\n initialData?: CartInitialData<TData> | PromiseLike<CartInitialData<TData>>;\n};\n\ntype AddLinePayload = {\n merchandiseId: string;\n quantity: number;\n attributes?: AddLineAttribute[];\n sellingPlanId?: string;\n};\ntype AddLineIdentity = Pick<AddLinePayload, \"merchandiseId\" | \"attributes\" | \"sellingPlanId\">;\ntype AddLineAttribute = { key: string; value: string };\ntype LineAttribute = { key: string; value: string | null };\n\ntype AddToCartPayload = {\n lines: AddLinePayload[];\n products: Array<Record<string, unknown>>;\n eventDetail?: Record<string, unknown>;\n};\n\ntype ChangeLineQuantityPayload = {\n lineId: string;\n quantity: number;\n};\n\ntype SetDiscountCodesPayload = {\n discountCodes: string[];\n};\n\ntype SetNotePayload = {\n note: string;\n};\n\ntype SetAttributesPayload = {\n attributes: Array<{ key: string; value: string }>;\n};\n\ntype TransactionDefinition<TPayload> = {\n payload: TPayload;\n transport(\n payload: TPayload,\n signal: AbortSignal,\n updateCart: UpdateCartTransport,\n ): Promise<UpdateCartResult>;\n projectPayload(state: CartState, payload: TPayload): CartState;\n projectPromise(\n state: CartState,\n result: CartMutationResult,\n payload: TPayload,\n addError: AddError,\n options: TransactionSettlementOptions,\n ): CartState;\n getSignalKeys?(state: CartState, payload: TPayload): KeyResult;\n getPendingKeys?(state: CartState, payload: TPayload): KeyResult;\n getErrorKeys?(state: CartState, payload: TPayload): KeyResult;\n removeSupersededPayload?(older: TPayload, successful: TPayload): TPayload | undefined;\n};\n\nfunction defineTransactionTypes<const TPayloads extends Record<string, unknown>>(definitions: {\n [TType in keyof TPayloads]: TransactionDefinition<TPayloads[TType]>;\n}): { [TType in keyof TPayloads]: TransactionDefinition<TPayloads[TType]> } {\n return definitions;\n}\n\ntype TransactionRegistry = typeof CART_TRANSACTION_TYPES;\ntype TransactionType = keyof TransactionRegistry;\ntype TransactionPayload<TType extends TransactionType> = TransactionRegistry[TType][\"payload\"];\n\nfunction getTransactionDefinition<TType extends TransactionType>(\n type: TType,\n): TransactionDefinition<TransactionPayload<TType>> {\n return CART_TRANSACTION_TYPES[type] as TransactionDefinition<TransactionPayload<TType>>;\n}\n\ntype TransactionOwner = {\n controller: AbortController;\n token: object;\n};\n\ntype PendingTransaction = {\n id: number;\n sequence: number;\n generation: number;\n type: TransactionType;\n payload: unknown;\n signalKeys: string[];\n pendingKeys: string[];\n errorKeys: string[];\n requiresRevalidation: boolean;\n owner: TransactionOwner | null;\n promise: PromiseLike<CartMutationResult>;\n projectPayload(state: CartState): CartState;\n projectPromise(state: CartState, result: CartMutationResult, addError: AddError): CartState;\n trimAfter(successful: PendingTransaction): PendingTransaction | undefined;\n};\n\ntype ProjectedError = {\n keys: string[];\n project(state: CartState): CartState;\n};\n\ntype ActiveCartLoad = {\n state: CartState;\n promise: Promise<void>;\n resolveReadyPromise: () => void;\n};\n\ntype ActiveCartRevalidation = {\n // Null for a discovery load (no local cart to target).\n cartId: string | null;\n controller: AbortController;\n generation: number;\n mutationRevision: number;\n promise: Promise<void>;\n};\n\ntype CartRevalidation = {\n requested: boolean;\n active: ActiveCartRevalidation | null;\n visible: boolean;\n};\n\ntype DeferredCartMutation = {\n promise: Promise<CartMutationResult>;\n resolve(result: CartMutationResult): void;\n reject(error: unknown): void;\n};\n\ntype QueuedInitialAdd = {\n deferred: DeferredCartMutation;\n generation: number;\n payload: AddToCartPayload;\n reservation: TransactionReservation;\n signal: AbortSignal;\n};\n\ntype CartIdentityTransportGate = {\n active: QueuedInitialAdd | null;\n waiting: QueuedInitialAdd[];\n};\n\ntype TransactionReservation = {\n type: TransactionType;\n payload: unknown;\n signalKeys: string[];\n pendingKeys: string[];\n errorKeys: string[];\n owner: TransactionOwner | null;\n consumed: boolean;\n};\n\ntype ExpectedTransactionEvent = {\n token: string;\n};\n\ntype TransactionIdentity = Pick<\n PendingTransaction,\n \"id\" | \"sequence\" | \"generation\" | \"owner\" | \"signalKeys\" | \"requiresRevalidation\"\n> & { pendingKeys?: string[]; errorKeys?: string[] };\n\ntype CartObservable = ReturnType<typeof createCartObservable>;\n\ntype CartStoreContext = {\n observable: CartObservable;\n settled: CartState;\n transactions: PendingTransaction[];\n projectedErrors: ProjectedError[];\n observedPromises: Set<PromiseLike<CartMutationResult>>;\n activeMutationTransports: Set<PromiseLike<CartMutationResult>>;\n expectedEvents: ExpectedTransactionEvent[];\n nextTransactionId: number;\n generation: number;\n lifecycleController: AbortController;\n keyedOwners: Map<string, TransactionOwner>;\n activeCartLoad: ActiveCartLoad | null;\n revalidation: CartRevalidation;\n mutationRevision: number;\n identityTransportGate: CartIdentityTransportGate;\n cartSyncAttached: boolean;\n reservation: TransactionReservation | null;\n lastSnapshotSequence: number;\n};\n\ntype CartEventHandlers = {\n lines: EventListener;\n discount: EventListener;\n note: EventListener;\n attributes: EventListener;\n};\n\nlet configuredCartEndpoint: string | null = null;\nlet hasConfiguredUpdateCart = false;\nlet standardActionsPromise: Promise<ShopifyStandardActions> | null = null;\nconst connectedCartStores = new Set<CartStoreContext>();\nlet cartConsentListenerAttached = false;\n\nfunction getLines(cart: CartData): CartLine[] {\n return cart.lines.nodes;\n}\n\nfunction setLines<TData extends CartData>(cart: TData, lines: CartLine[]): TData {\n if (cart.lines.nodes === lines) return cart;\n return { ...cart, lines: { ...cart.lines, nodes: lines } };\n}\n\nfunction reconcileCartLines<TData extends CartData>(cart: TData, lines: CartLine[]): TData {\n const currentLines = getLines(cart);\n if (currentLines === lines) return cart;\n\n // Preserve quantities outside the loaded lines connection by applying only its visible delta.\n const currentLoadedQuantity = currentLines.reduce(\n (total, line) => total + line.quantity,\n EMPTY_QUANTITY,\n );\n const nextLoadedQuantity = lines.reduce((total, line) => total + line.quantity, EMPTY_QUANTITY);\n const totalQuantity = cart.totalQuantity + nextLoadedQuantity - currentLoadedQuantity;\n return setLines({ ...cart, totalQuantity }, lines);\n}\n\nfunction normalizeKeys(keys: KeyResult): string[] {\n if (keys === undefined) return [];\n return typeof keys === \"string\" ? [keys] : [...new Set(keys)];\n}\n\nfunction lineKey(lineId: string): string {\n return `${LINE_KEY_PREFIX}${lineId}`;\n}\n\nfunction compareAttributes(left: LineAttribute, right: LineAttribute): number {\n if (left.key !== right.key) return left.key < right.key ? -1 : 1;\n if (left.value === null) return right.value === null ? 0 : -1;\n if (right.value === null) return 1;\n if (left.value !== right.value) return left.value < right.value ? -1 : 1;\n return 0;\n}\n\nfunction normalizeAttributes<TAttribute extends LineAttribute>(\n attributes: readonly TAttribute[] | undefined,\n): TAttribute[] {\n if (!attributes?.length) return [];\n return attributes.toSorted(compareAttributes);\n}\n\nfunction sameAttributes(\n left: readonly LineAttribute[] | undefined,\n right: readonly LineAttribute[] | undefined,\n): boolean {\n const normalizedLeft = normalizeAttributes(left);\n const normalizedRight = normalizeAttributes(right);\n if (normalizedLeft.length !== normalizedRight.length) return false;\n return normalizedLeft.every(\n (attribute, index) =>\n attribute.key === normalizedRight[index].key &&\n attribute.value === normalizedRight[index].value,\n );\n}\n\nfunction hashString(value: string): string {\n let hash = FNV1A_OFFSET_BASIS;\n for (const character of value) {\n hash ^= character.codePointAt(0) ?? 0;\n hash = Math.imul(hash, FNV1A_PRIME);\n }\n return (hash >>> 0).toString(36);\n}\n\nfunction merchandiseKey(line: AddLineIdentity): string {\n return `${MERCHANDISE_KEY_PREFIX}${JSON.stringify({\n merchandiseId: line.merchandiseId,\n sellingPlanId: line.sellingPlanId ?? null,\n attributes: normalizeAttributes(line.attributes),\n })}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isAttribute(value: unknown): value is AddLineAttribute {\n return isRecord(value) && typeof value.key === \"string\" && typeof value.value === \"string\";\n}\n\nfunction parseMerchandiseKey(key: string): AddLineIdentity | undefined {\n if (!key.startsWith(MERCHANDISE_KEY_PREFIX)) return undefined;\n const value = key.slice(MERCHANDISE_KEY_PREFIX.length);\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n return undefined;\n }\n\n if (!isRecord(parsed) || typeof parsed.merchandiseId !== \"string\") return undefined;\n if (parsed.sellingPlanId !== null && typeof parsed.sellingPlanId !== \"string\") return undefined;\n if (!Array.isArray(parsed.attributes) || !parsed.attributes.every(isAttribute)) return undefined;\n const attributes = normalizeAttributes(parsed.attributes);\n return {\n merchandiseId: parsed.merchandiseId,\n ...(parsed.sellingPlanId ? { sellingPlanId: parsed.sellingPlanId } : {}),\n ...(attributes.length > 0 ? { attributes } : {}),\n };\n}\n\nfunction optimisticLineId(line: AddLineIdentity): string {\n const sellingPlanSuffix = line.sellingPlanId ? `:${line.sellingPlanId}` : \"\";\n const attributes = normalizeAttributes(line.attributes);\n const attributesSuffix =\n attributes.length > 0 ? `:${hashString(JSON.stringify(attributes))}` : \"\";\n return `${OPTIMISTIC_LINE_ID_PREFIX}${line.merchandiseId}${sellingPlanSuffix}${attributesSuffix}`;\n}\n\nfunction cartResponseFromStandardEvent(cart: StandardEventCart): CartResponse {\n const response = cart as unknown as CartResponse;\n const lines = Array.isArray(cart.lines) ? cart.lines : response.lines.nodes;\n const connection = Array.isArray(cart.lines)\n ? { nodes: lines as CartLine[] }\n : { ...response.lines, nodes: lines as CartLine[] };\n return { ...response, lines: connection };\n}\n\nfunction isPromiseLike<T>(value: unknown): value is PromiseLike<T> {\n return (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n typeof (value as { then?: unknown }).then === \"function\"\n );\n}\n\nfunction shallowEqualRecord(left: object, right: object): boolean {\n const leftRecord = left as Record<string, unknown>;\n const rightRecord = right as Record<string, unknown>;\n const leftKeys = Object.keys(leftRecord);\n if (leftKeys.length !== Object.keys(rightRecord).length) return false;\n return leftKeys.every((key) => Object.is(leftRecord[key], rightRecord[key]));\n}\n\nfunction reuseLineReferences(previous: CartLine[], next: CartLine[]): CartLine[] {\n const previousById = new Map(previous.map((line) => [line.id, line]));\n let changed = previous.length !== next.length;\n const shared = next.map((line, index) => {\n const prior = previousById.get(line.id);\n const value = prior && shallowEqualRecord(prior, line) ? prior : line;\n if (previous[index] !== value) changed = true;\n return value;\n });\n return changed ? shared : previous;\n}\n\nfunction sameSet<T>(left: Set<T>, right: Set<T>): boolean {\n return left.size === right.size && [...left].every((value) => right.has(value));\n}\n\nfunction reuseVisibleReferences(previous: CartState, next: CartState): CartState {\n const lines = reuseLineReferences(getLines(previous.data), getLines(next.data));\n const dataWithLines = setLines(next.data, lines);\n const data = shallowEqualRecord(previous.data, dataWithLines) ? previous.data : dataWithLines;\n const pendingLines = sameSet(previous.pending.lines, next.pending.lines)\n ? previous.pending.lines\n : next.pending.lines;\n const pendingDiscountCodes = sameSet(previous.pending.discountCodes, next.pending.discountCodes)\n ? previous.pending.discountCodes\n : next.pending.discountCodes;\n const nextPending = {\n lines: pendingLines,\n note: next.pending.note,\n attributes: next.pending.attributes,\n discountCodes: pendingDiscountCodes,\n cost: next.pending.cost,\n };\n const pending = shallowEqualRecord(previous.pending, nextPending)\n ? previous.pending\n : nextPending;\n\n if (\n previous.data === data &&\n previous.loading === next.loading &&\n previous.revalidating === next.revalidating &&\n previous.errors === next.errors &&\n previous.pending === pending\n ) {\n return previous;\n }\n\n return { ...next, data, pending };\n}\n\nfunction derivePending(state: CartState, transactions: PendingTransaction[]): CartState[\"pending\"] {\n const lines = new Set<string>();\n const discountCodes = new Set<string>();\n let note = false;\n let attributes = false;\n let cost = false;\n\n for (const transaction of transactions) {\n for (const key of transaction.pendingKeys) {\n if (key === NOTE_KEY) note = true;\n if (key === ATTRIBUTES_KEY) attributes = true;\n if (key.startsWith(LINE_KEY_PREFIX)) {\n lines.add(key.slice(LINE_KEY_PREFIX.length));\n cost = true;\n }\n if (key.startsWith(DISCOUNT_KEY_PREFIX)) {\n discountCodes.add(key.slice(DISCOUNT_KEY_PREFIX.length));\n cost = true;\n }\n const addition = parseMerchandiseKey(key);\n if (!addition) continue;\n const line = findLineForAddition(getLines(state.data), addition);\n if (line) lines.add(line.id);\n cost = true;\n }\n }\n\n return { lines, note, attributes, discountCodes, cost };\n}\n\nfunction projectVisibleState(store: CartStoreContext): CartState {\n let state = store.settled;\n for (const transaction of store.transactions) state = transaction.projectPayload(state);\n state = { ...state, pending: derivePending(state, store.transactions) };\n for (const error of store.projectedErrors) state = error.project(state);\n if (store.revalidation.visible) state = { ...state, revalidating: true };\n return state;\n}\n\nfunction publishVisibleState(store: CartStoreContext): void {\n const previous = store.observable.state;\n const next = reuseVisibleReferences(previous, projectVisibleState(store));\n if (configuredCartEndpoint && previous !== next) {\n const previousLines = new Map(getLines(previous.data).map((line) => [line.id, line]));\n const changedQuantities = getLines(next.data)\n .filter((line) => previousLines.get(line.id)?.quantity !== line.quantity)\n .map((line) => ({ id: line.id, quantity: line.quantity }));\n if (changedQuantities.length > 0) {\n syncQuantityInputs(changedQuantities, configuredCartEndpoint);\n }\n }\n store.observable.setState(next);\n}\n\nfunction sharesKey(left: string[], right: string[]): boolean {\n const rightKeys = new Set(right);\n return left.some((key) => rightKeys.has(key));\n}\n\nfunction clearProjectedErrors(store: CartStoreContext, keys: string[]): void {\n if (keys.length === 0) return;\n store.projectedErrors = store.projectedErrors.filter((error) => !sharesKey(error.keys, keys));\n}\n\nfunction addProjectedError(\n store: CartStoreContext,\n keys: string[],\n projector: ErrorProjector,\n): void {\n const timestampMs = Date.now();\n store.projectedErrors.push({\n keys,\n project: (state) => projector(state, timestampMs),\n });\n}\n\nfunction createOwner(store: CartStoreContext, keys: string[]): TransactionOwner | null {\n if (keys.length === 0) return null;\n const owner = { controller: new AbortController(), token: {} };\n for (const key of keys) {\n store.keyedOwners.get(key)?.controller.abort();\n store.keyedOwners.set(key, owner);\n }\n return owner;\n}\n\nfunction ownsSignalKeys(store: CartStoreContext, transaction: PendingTransaction): boolean {\n if (!transaction.owner) return true;\n return transaction.signalKeys.every(\n (key) => store.keyedOwners.get(key)?.token === transaction.owner?.token,\n );\n}\n\nfunction releaseSignalKeys(store: CartStoreContext, transaction: PendingTransaction): void {\n if (!transaction.owner) return;\n for (const key of transaction.signalKeys) {\n if (store.keyedOwners.get(key)?.token === transaction.owner.token) {\n store.keyedOwners.delete(key);\n }\n }\n}\n\nfunction getErrorGroup(map: Map<string, CartErrorGroup>, key: string): CartErrorGroup {\n const existing = map.get(key);\n if (existing) return existing;\n const group = createEmptyErrorGroup();\n map.set(key, group);\n return group;\n}\n\nfunction toCartUserError(error: VendorUserError): CartUserError {\n return {\n code: (error.code as CartErrorCode) ?? null,\n message: error.message,\n ...(error.field ? { field: error.field } : {}),\n };\n}\n\nfunction toCartWarning(warning: VendorWarning): CartWarning {\n return {\n code: (warning.code as CartWarningCode) ?? (\"UNKNOWN\" as CartWarningCode),\n message: warning.message,\n };\n}\n\nfunction findFieldIndex(field: string[] | undefined, ...keys: string[]): number | undefined {\n if (!field) return undefined;\n const index = field.findIndex(\n (part, fieldIndex) => keys.includes(part) && /^\\d+$/.test(field[fieldIndex + 1] ?? \"\"),\n );\n return index === -1 ? undefined : Number(field[index + 1]);\n}\n\nfunction isCartLineId(value: unknown): value is string {\n return typeof value === \"string\" && value.startsWith(\"gid://shopify/CartLine/\");\n}\n\nfunction groupLineErrors(\n failure: CartActionFailure | undefined,\n lineIds: string[],\n): { lines: Map<string, CartErrorGroup>; cart: CartErrorGroup } {\n const lines = new Map<string, CartErrorGroup>();\n const cart = createEmptyErrorGroup();\n\n for (const error of failure?.userErrors ?? []) {\n const lineIndex = findFieldIndex(error.field, \"lines\", \"lineIds\");\n const lineId = lineIndex === undefined ? undefined : lineIds[lineIndex];\n const group = lineId ? getErrorGroup(lines, lineId) : cart;\n group.userErrors.push(toCartUserError(error));\n }\n\n for (const warning of failure?.warnings ?? []) {\n const group = isCartLineId(warning.target) ? getErrorGroup(lines, warning.target) : cart;\n group.warnings.push(toCartWarning(warning));\n }\n\n return { lines, cart };\n}\n\nfunction isDiscountWarning(code: string | undefined): boolean {\n return typeof code === \"string\" && code.startsWith(\"DISCOUNT_\");\n}\n\nfunction addDiscountWarning(\n codes: Map<string, CartErrorGroup>,\n cart: CartErrorGroup,\n warning: VendorWarning,\n nonApplicableCodes: string[],\n): void {\n if (!isDiscountWarning(warning.code) || nonApplicableCodes.length === 0) {\n cart.warnings.push(toCartWarning(warning));\n return;\n }\n for (const code of nonApplicableCodes) {\n getErrorGroup(codes, code).warnings.push(toCartWarning(warning));\n }\n}\n\nfunction groupDiscountErrors(\n failure: CartActionFailure | undefined,\n discountCodes: string[],\n resolvedDiscountCodes?: Array<{ code: string; applicable: boolean }>,\n): { discountCodes: Map<string, CartErrorGroup>; cart: CartErrorGroup } {\n const codes = new Map<string, CartErrorGroup>();\n const cart = createEmptyErrorGroup();\n\n for (const error of failure?.userErrors ?? []) {\n const codeIndex = findFieldIndex(error.field, \"discountCodes\");\n const code = codeIndex === undefined ? undefined : discountCodes[codeIndex];\n const group = code ? getErrorGroup(codes, code) : cart;\n group.userErrors.push(toCartUserError(error));\n }\n\n const nonApplicableCodes =\n resolvedDiscountCodes?.filter((code) => !code.applicable).map((code) => code.code) ?? [];\n for (const warning of failure?.warnings ?? []) {\n addDiscountWarning(codes, cart, warning, nonApplicableCodes);\n }\n\n return { discountCodes: codes, cart };\n}\n\nfunction groupAttributeErrors(\n failure: CartActionFailure | undefined,\n attributes: CartData[\"attributes\"],\n): { attributes: Map<string, CartErrorGroup>; cart: CartErrorGroup } {\n const attributeErrors = new Map<string, CartErrorGroup>();\n const cart = createEmptyErrorGroup();\n\n for (const error of failure?.userErrors ?? []) {\n const attributeIndex = findFieldIndex(error.field, \"attributes\");\n const key = attributeIndex === undefined ? undefined : attributes[attributeIndex]?.key;\n const group = key ? getErrorGroup(attributeErrors, key) : cart;\n group.userErrors.push(toCartUserError(error));\n }\n for (const warning of failure?.warnings ?? []) cart.warnings.push(toCartWarning(warning));\n return { attributes: attributeErrors, cart };\n}\n\nfunction toCartErrorGroup(failure: CartActionFailure | undefined): CartErrorGroup {\n return {\n userErrors: (failure?.userErrors ?? []).map(toCartUserError),\n warnings: (failure?.warnings ?? []).map(toCartWarning),\n };\n}\n\nfunction extractCartActionFailure(error: unknown): CartActionFailure | undefined {\n const cause = (error as CartActionError | null)?.cause;\n return Array.isArray(cause?.userErrors) || Array.isArray(cause?.warnings) ? cause : undefined;\n}\n\nfunction createNetworkEntry(error: unknown): CartNetworkEntry {\n if (error instanceof CartNetworkError) {\n return { message: error.message, status: error.status };\n }\n return {\n message: error instanceof Error ? error.message : \"Cart update failed\",\n };\n}\n\nfunction mergeErrorGroups(left: CartErrorGroup, right: CartErrorGroup): CartErrorGroup {\n return {\n userErrors: [...left.userErrors, ...right.userErrors],\n warnings: [...left.warnings, ...right.warnings],\n };\n}\n\nfunction writeNetworkError(state: CartState, error: unknown, timestampMs: number): CartState {\n return {\n ...state,\n errors: {\n ...state.errors,\n network: [...state.errors.network, createNetworkEntry(error)],\n networkUpdatedAt: timestampMs,\n lastUpdatedAt: timestampMs,\n },\n };\n}\n\nfunction projectLineErrors(\n state: CartState,\n failure: CartActionFailure | undefined,\n lineIds: string[],\n timestampMs: number,\n): CartState {\n if (!failure) return state;\n const grouped = groupLineErrors(failure, lineIds);\n return {\n ...state,\n errors: {\n ...state.errors,\n lines: new Map([...state.errors.lines, ...grouped.lines]),\n cart: mergeErrorGroups(state.errors.cart, grouped.cart),\n linesUpdatedAt: timestampMs,\n cartUpdatedAt: timestampMs,\n lastUpdatedAt: timestampMs,\n },\n };\n}\n\nfunction projectDiscountErrors(\n state: CartState,\n failure: CartActionFailure | undefined,\n discountCodes: string[],\n timestampMs: number,\n resolvedDiscountCodes?: Array<{ code: string; applicable: boolean }>,\n): CartState {\n if (!failure) return state;\n const grouped = groupDiscountErrors(failure, discountCodes, resolvedDiscountCodes);\n return {\n ...state,\n errors: {\n ...state.errors,\n discountCodes: new Map([...state.errors.discountCodes, ...grouped.discountCodes]),\n cart: mergeErrorGroups(state.errors.cart, grouped.cart),\n discountCodesUpdatedAt: timestampMs,\n cartUpdatedAt: timestampMs,\n lastUpdatedAt: timestampMs,\n },\n };\n}\n\nfunction projectNoteErrors(\n state: CartState,\n failure: CartActionFailure | undefined,\n timestampMs: number,\n): CartState {\n if (!failure) return state;\n return {\n ...state,\n errors: {\n ...state.errors,\n note: toCartErrorGroup(failure),\n noteUpdatedAt: timestampMs,\n lastUpdatedAt: timestampMs,\n },\n };\n}\n\nfunction projectAttributeErrors(\n state: CartState,\n failure: CartActionFailure | undefined,\n attributes: CartData[\"attributes\"],\n timestampMs: number,\n): CartState {\n if (!failure) return state;\n const grouped = groupAttributeErrors(failure, attributes);\n return {\n ...state,\n errors: {\n ...state.errors,\n attributes: new Map([...state.errors.attributes, ...grouped.attributes]),\n cart: mergeErrorGroups(state.errors.cart, grouped.cart),\n attributesUpdatedAt: timestampMs,\n cartUpdatedAt: timestampMs,\n lastUpdatedAt: timestampMs,\n },\n };\n}\n\nfunction extractProductDetails(\n detail: Record<string, unknown> | undefined,\n): Array<Record<string, unknown>> {\n const products = detail?.products;\n if (!Array.isArray(products)) return [];\n return products.filter(\n (product): product is Record<string, unknown> =>\n typeof product === \"object\" &&\n product !== null &&\n \"id\" in product &&\n typeof product.id === \"string\",\n );\n}\n\nfunction getLineSellingPlanId(line: CartLine): string | undefined {\n return line.sellingPlanAllocation?.sellingPlan.id;\n}\n\nfunction hasKnownLineIdentity(line: CartLine): boolean {\n return Object.hasOwn(line, \"attributes\") && Object.hasOwn(line, \"sellingPlanAllocation\");\n}\n\nfunction hasAdditionIdentityDetails(addition: AddLineIdentity): boolean {\n return (\n addition.sellingPlanId !== undefined || normalizeAttributes(addition.attributes).length > 0\n );\n}\n\nfunction lineMatchesAddition(line: CartLine, addition: AddLineIdentity): boolean {\n if (line.id === optimisticLineId(addition)) return true;\n if (line.merchandise?.id !== addition.merchandiseId) return false;\n if (!hasKnownLineIdentity(line)) return !hasAdditionIdentityDetails(addition);\n if (getLineSellingPlanId(line) !== addition.sellingPlanId) return false;\n return sameAttributes(line.attributes, addition.attributes);\n}\n\nfunction findLineForAddition(lines: CartLine[], addition: AddLineIdentity): CartLine | undefined {\n return lines.find((line) => lineMatchesAddition(line, addition));\n}\n\nfunction findAvailableLineForAddition(\n lines: CartLine[],\n addition: AddLineIdentity,\n usedLineIds: Set<string>,\n): CartLine | undefined {\n return lines.find((line) => !usedLineIds.has(line.id) && lineMatchesAddition(line, addition));\n}\n\nfunction findResponseLineForAddition(\n serverLines: CartLine[],\n currentLines: CartLine[],\n addition: AddLineIdentity,\n usedLineIds: Set<string>,\n canInferSingleLine: boolean,\n remainingAdditions: number,\n): CartLine | undefined {\n const exact = findAvailableLineForAddition(serverLines, addition, usedLineIds);\n if (exact) return exact;\n\n const currentLine = findLineForAddition(currentLines, addition);\n const matchingCurrentLine = serverLines.find(\n (line) => !usedLineIds.has(line.id) && line.id === currentLine?.id,\n );\n if (matchingCurrentLine) return matchingCurrentLine;\n\n const currentLineIds = new Set(currentLines.map((line) => line.id));\n const newLines = serverLines.filter(\n (line) => !usedLineIds.has(line.id) && !currentLineIds.has(line.id),\n );\n if (remainingAdditions === newLines.length && newLines.length === 1) return newLines[0];\n\n return canInferSingleLine ? serverLines.find((line) => !usedLineIds.has(line.id)) : undefined;\n}\n\nfunction withAdditionMerchandise(\n line: CartLine,\n addition: AddLineIdentity,\n products: Array<Record<string, unknown>>,\n): CartLine {\n if (line.merchandise) return line;\n const product = products.find((candidate) => candidate.id === addition.merchandiseId);\n if (!product) return line;\n const { price: _price, ...merchandise } = product;\n return {\n ...line,\n merchandise: merchandise as unknown as CartLine[\"merchandise\"],\n };\n}\n\nfunction replaceOrPrependLine(\n lines: CartLine[],\n previous: CartLine | undefined,\n next: CartLine,\n): CartLine[] {\n if (previous) return lines.map((line) => (line === previous ? next : line));\n if (lines.some((line) => line.id === next.id)) {\n return lines.map((line) => (line.id === next.id ? next : line));\n }\n return [next, ...lines];\n}\n\nfunction mergeAddResponseLines(\n currentLines: CartLine[],\n serverLines: CartLine[],\n payload: AddToCartPayload,\n): CartLine[] {\n let lines = currentLines;\n const usedLineIds = new Set<string>();\n const canInferSingleLine = payload.lines.length === 1 && serverLines.length === 1;\n\n for (const addition of payload.lines) {\n const remainingAdditions = payload.lines.length - usedLineIds.size;\n const serverLine = findResponseLineForAddition(\n serverLines,\n lines,\n addition,\n usedLineIds,\n canInferSingleLine,\n remainingAdditions,\n );\n if (!serverLine) continue;\n usedLineIds.add(serverLine.id);\n\n const previous =\n findLineForAddition(lines, addition) ?? lines.find((line) => line.id === serverLine.id);\n const next = withAdditionMerchandise(serverLine, addition, payload.products);\n lines = replaceOrPrependLine(lines, previous, mergeServerLine(previous, next));\n }\n\n return lines;\n}\n\nfunction resolveAddLineIds(\n currentLines: CartLine[],\n serverLines: CartLine[],\n payload: AddToCartPayload,\n): string[] {\n const usedLineIds = new Set<string>();\n const canInferSingleLine = payload.lines.length === 1 && serverLines.length === 1;\n return payload.lines.map((addition) => {\n const remainingAdditions = payload.lines.length - usedLineIds.size;\n const serverLine = findResponseLineForAddition(\n serverLines,\n currentLines,\n addition,\n usedLineIds,\n canInferSingleLine,\n remainingAdditions,\n );\n if (serverLine) {\n usedLineIds.add(serverLine.id);\n return serverLine.id;\n }\n return findLineForAddition(currentLines, addition)?.id ?? \"\";\n });\n}\n\nfunction getAddErrorKeys(\n payload: AddToCartPayload,\n lineIds: string[],\n failure: CartActionFailure | undefined,\n): string[] {\n const keys = new Set(payload.lines.map(merchandiseKey));\n for (const lineId of lineIds) {\n if (lineId) keys.add(lineKey(lineId));\n }\n for (const warning of failure?.warnings ?? []) {\n if (isCartLineId(warning.target)) keys.add(lineKey(warning.target));\n }\n return [...keys];\n}\n\nfunction mergeServerLine(previous: CartLine | undefined, next: CartLine): CartLine {\n if (!previous) return next;\n const merchandise = next.merchandise\n ? { ...previous.merchandise, ...next.merchandise }\n : previous.merchandise;\n return { ...previous, ...next, ...(merchandise ? { merchandise } : {}) };\n}\n\nfunction hasProjectedErrors(result: CartActionFailure | undefined): boolean {\n return (result?.userErrors?.length ?? 0) > 0 || (result?.warnings?.length ?? 0) > 0;\n}\n\nfunction transportAddToCart(\n payload: AddToCartPayload,\n signal: AbortSignal,\n updateCart: UpdateCartTransport,\n cartId?: string,\n): Promise<UpdateCartResult> {\n return updateCart(\n { ...(cartId && { cartId }), lines: payload.lines },\n {\n signal,\n ...(payload.eventDetail && { event: { detail: payload.eventDetail } }),\n },\n );\n}\n\nexport const CART_TRANSACTION_TYPES = defineTransactionTypes({\n add_to_cart: {\n payload: {} as AddToCartPayload,\n transport: transportAddToCart,\n projectPayload: (state, payload) => {\n let lines = getLines(state.data);\n let linesChanged = false;\n\n for (const addition of payload.lines) {\n const existing = findLineForAddition(lines, addition);\n if (existing) {\n lines = lines.map((line) =>\n line === existing ? { ...line, quantity: line.quantity + addition.quantity } : line,\n );\n linesChanged = true;\n continue;\n }\n\n const product = payload.products.find(\n (candidate) => candidate.id === addition.merchandiseId,\n );\n if (!product) continue;\n const { price, ...merchandise } = product;\n const amount = (price as CartLine[\"cost\"][\"totalAmount\"] | undefined) ?? {\n amount: \"0\",\n currencyCode: \"\",\n };\n lines = [\n {\n id: optimisticLineId(addition),\n quantity: addition.quantity,\n attributes: addition.attributes ?? [],\n sellingPlanAllocation: addition.sellingPlanId\n ? { sellingPlan: { id: addition.sellingPlanId } }\n : null,\n merchandise: merchandise as unknown as CartLine[\"merchandise\"],\n cost: {\n totalAmount: amount,\n subtotalAmount: amount,\n amountPerQuantity: amount,\n compareAtAmountPerQuantity: null,\n },\n },\n ...lines,\n ];\n linesChanged = true;\n }\n\n const addedQuantity = payload.lines.reduce((total, line) => total + line.quantity, 0);\n const data = setLines(\n {\n ...state.data,\n totalQuantity: state.data.totalQuantity + addedQuantity,\n },\n linesChanged ? lines : getLines(state.data),\n );\n return { ...state, data };\n },\n projectPromise: (state, result, payload, addError) => {\n const currentLines = getLines(state.data);\n const cart = result.cart ? cartResponseFromStandardEvent(result.cart) : undefined;\n const serverLines = cart ? getLines(cart) : [];\n const lineIds = resolveAddLineIds(currentLines, serverLines, payload);\n if (hasProjectedErrors(result)) {\n addError(\n (current, timestampMs) => projectLineErrors(current, result, lineIds, timestampMs),\n getAddErrorKeys(payload, lineIds, result),\n );\n }\n if (!cart) return state;\n\n const lines = mergeAddResponseLines(currentLines, serverLines, payload);\n return { ...state, data: reconcileCartLines(state.data, lines) };\n },\n getPendingKeys: (state, payload) => {\n const keys: string[] = [];\n const lines = getLines(state.data);\n for (const addition of payload.lines) {\n keys.push(merchandiseKey(addition));\n const existing = findLineForAddition(lines, addition);\n if (existing) keys.push(lineKey(existing.id));\n if (\n !existing &&\n payload.products.some((product) => product.id === addition.merchandiseId)\n ) {\n keys.push(lineKey(optimisticLineId(addition)));\n }\n }\n return keys;\n },\n getErrorKeys: (_state, payload) => payload.lines.map(merchandiseKey),\n removeSupersededPayload: (older, successful) => {\n const successfulKeys = new Set(successful.lines.map(merchandiseKey));\n const lines = older.lines.filter((line) => !successfulKeys.has(merchandiseKey(line)));\n return lines.length > 0 ? { ...older, lines } : undefined;\n },\n },\n change_line_quantity: {\n payload: {} as ChangeLineQuantityPayload,\n transport: (payload, signal, updateCart) =>\n updateCart({ lines: [{ id: payload.lineId, quantity: payload.quantity }] }, { signal }),\n projectPayload: (state, payload) => {\n const previous = getLines(state.data);\n const existing = previous.find((line) => line.id === payload.lineId);\n if (!existing) return state;\n const lines =\n payload.quantity === 0\n ? previous.filter((line) => line.id !== payload.lineId)\n : previous.map((line) =>\n line.id === payload.lineId ? { ...line, quantity: payload.quantity } : line,\n );\n return { ...state, data: reconcileCartLines(state.data, lines) };\n },\n projectPromise: (state, result, payload, addError) => {\n if (hasProjectedErrors(result)) {\n addError((current, timestampMs) =>\n projectLineErrors(current, result, [payload.lineId], timestampMs),\n );\n }\n if (!result.cart) return state;\n\n const cart = cartResponseFromStandardEvent(result.cart);\n const serverLines = getLines(cart);\n const matching = serverLines.find((line) => line.id === payload.lineId);\n const previous = getLines(state.data);\n let lines = previous.filter((line) => line.id !== payload.lineId);\n if (matching) {\n const prior = previous.find((line) => line.id === payload.lineId);\n lines = previous.map((line) =>\n line.id === payload.lineId ? mergeServerLine(prior, matching) : line,\n );\n } else if (payload.quantity > 0 && previous.length === 1 && serverLines.length === 1) {\n lines = [mergeServerLine(previous[0], serverLines[0])];\n }\n return { ...state, data: reconcileCartLines(state.data, lines) };\n },\n getSignalKeys: (_state, payload) => lineKey(payload.lineId),\n },\n set_discount_codes: {\n payload: {} as SetDiscountCodesPayload,\n transport: (payload, signal, updateCart) =>\n updateCart({ discountCodes: payload.discountCodes }, { signal }),\n projectPayload: (state, payload) => {\n const discountCodes = payload.discountCodes.map((code) => {\n const existing = state.data.discountCodes.find((discount) => discount.code === code);\n return { code, applicable: existing?.applicable ?? false };\n });\n return { ...state, data: { ...state.data, discountCodes } };\n },\n projectPromise: (state, result, payload, addError, options) => {\n const resolvedCodes = result.cart\n ? cartResponseFromStandardEvent(result.cart).discountCodes\n : undefined;\n if (hasProjectedErrors(result)) {\n addError((current, timestampMs) =>\n projectDiscountErrors(current, result, payload.discountCodes, timestampMs, resolvedCodes),\n );\n }\n if (!result.cart) return state;\n const cart = cartResponseFromStandardEvent(result.cart);\n if (options.mergeServerCart) {\n return { ...state, data: mergeAuthoritativeCartData(state.data, cart) };\n }\n return {\n ...state,\n data: { ...state.data, discountCodes: cart.discountCodes },\n };\n },\n getSignalKeys: () => DISCOUNT_CODES_KEY,\n getPendingKeys: (state, payload) => {\n const current = new Set(state.data.discountCodes.map((discount) => discount.code));\n const next = new Set(payload.discountCodes);\n return [...new Set([...current, ...next])]\n .filter((code) => current.has(code) !== next.has(code))\n .map((code) => `${DISCOUNT_KEY_PREFIX}${code}`);\n },\n },\n set_note: {\n payload: {} as SetNotePayload,\n transport: (payload, signal, updateCart) => updateCart({ note: payload.note }, { signal }),\n projectPayload: (state, payload) => ({\n ...state,\n data: { ...state.data, note: payload.note },\n }),\n projectPromise: (state, result, payload, addError) => {\n if (hasProjectedErrors(result)) {\n addError((current, timestampMs) => projectNoteErrors(current, result, timestampMs));\n }\n if (!result.cart) return state;\n return { ...state, data: { ...state.data, note: payload.note } };\n },\n getSignalKeys: () => NOTE_KEY,\n },\n set_attributes: {\n payload: {} as SetAttributesPayload,\n transport: (payload, signal, updateCart) =>\n updateCart({ attributes: payload.attributes }, { signal }),\n projectPayload: (state, payload) => ({\n ...state,\n data: { ...state.data, attributes: payload.attributes },\n }),\n projectPromise: (state, result, payload, addError) => {\n if (hasProjectedErrors(result)) {\n addError((current, timestampMs) =>\n projectAttributeErrors(current, result, payload.attributes, timestampMs),\n );\n }\n if (!result.cart || (result.userErrors?.length ?? 0) > 0) return state;\n return {\n ...state,\n data: { ...state.data, attributes: payload.attributes },\n };\n },\n getSignalKeys: () => ATTRIBUTES_KEY,\n },\n});\n\nfunction getTransactionProjectionKeys<TType extends TransactionType>(\n definition: TransactionDefinition<TransactionPayload<TType>>,\n state: CartState,\n payload: TransactionPayload<TType>,\n signalKeys: string[],\n): { pendingKeys: string[]; errorKeys: string[] } {\n return {\n pendingKeys: normalizeKeys(definition.getPendingKeys?.(state, payload) ?? signalKeys),\n errorKeys: normalizeKeys(definition.getErrorKeys?.(state, payload) ?? signalKeys),\n };\n}\n\nfunction resolveTransactionIdentity<TType extends TransactionType>(\n store: CartStoreContext,\n definition: TransactionDefinition<TransactionPayload<TType>>,\n payload: TransactionPayload<TType>,\n reservation: TransactionReservation | undefined,\n identity: TransactionIdentity | undefined,\n): TransactionIdentity & { pendingKeys: string[]; errorKeys: string[] } {\n const state = store.observable.state;\n if (identity) {\n const projectedKeys = getTransactionProjectionKeys(\n definition,\n state,\n payload,\n identity.signalKeys,\n );\n const pendingKeys = identity.pendingKeys ?? projectedKeys.pendingKeys;\n const errorKeys = identity.errorKeys ?? projectedKeys.errorKeys;\n return { ...identity, pendingKeys, errorKeys };\n }\n if (reservation) {\n const id = store.nextTransactionId++;\n return {\n ...reservation,\n id,\n sequence: id,\n generation: store.generation,\n requiresRevalidation: false,\n };\n }\n const signalKeys = normalizeKeys(definition.getSignalKeys?.(state, payload));\n const { pendingKeys, errorKeys } = getTransactionProjectionKeys(\n definition,\n state,\n payload,\n signalKeys,\n );\n const id = store.nextTransactionId++;\n return {\n id,\n sequence: id,\n generation: store.generation,\n owner: createOwner(store, signalKeys),\n signalKeys,\n pendingKeys,\n errorKeys,\n requiresRevalidation: false,\n };\n}\n\nfunction createPendingTransaction<TType extends TransactionType>(\n store: CartStoreContext,\n type: TType,\n definition: TransactionDefinition<TransactionPayload<TType>>,\n payload: TransactionPayload<TType>,\n promise: PromiseLike<CartMutationResult>,\n reservation?: TransactionReservation,\n identity?: TransactionIdentity,\n): PendingTransaction {\n const metadata = resolveTransactionIdentity(store, definition, payload, reservation, identity);\n const {\n id,\n sequence,\n generation,\n owner,\n signalKeys,\n pendingKeys,\n errorKeys,\n requiresRevalidation,\n } = metadata;\n\n const transaction: PendingTransaction = {\n id,\n sequence,\n generation,\n type,\n payload,\n signalKeys,\n pendingKeys,\n errorKeys,\n requiresRevalidation,\n owner,\n promise,\n projectPayload: (current) => definition.projectPayload(current, payload),\n projectPromise: (current, result, addError) =>\n definition.projectPromise(current, result, payload, addError, {\n mergeServerCart: !transaction.requiresRevalidation,\n }),\n trimAfter: (successful) =>\n trimPendingTransaction(\n store,\n type,\n definition,\n payload,\n promise,\n {\n id,\n sequence,\n generation,\n owner,\n signalKeys,\n pendingKeys,\n errorKeys,\n requiresRevalidation: transaction.requiresRevalidation,\n },\n successful,\n ),\n };\n return transaction;\n}\n\nfunction trimPendingTransaction<TType extends TransactionType>(\n store: CartStoreContext,\n type: TType,\n definition: TransactionDefinition<TransactionPayload<TType>>,\n payload: TransactionPayload<TType>,\n promise: PromiseLike<CartMutationResult>,\n identity: TransactionIdentity,\n successful: PendingTransaction,\n): PendingTransaction | undefined {\n let remaining = payload;\n let nextIdentity = identity;\n if (successful.type === type && definition.removeSupersededPayload) {\n const trimmed = definition.removeSupersededPayload(\n payload,\n successful.payload as TransactionPayload<TType>,\n );\n if (!trimmed) return undefined;\n remaining = trimmed;\n nextIdentity = {\n ...identity,\n pendingKeys: undefined,\n errorKeys: undefined,\n };\n }\n return createPendingTransaction(\n store,\n type,\n definition,\n remaining,\n promise,\n undefined,\n nextIdentity,\n );\n}\n\nfunction addSnapshotFields(state: CartState, result: CartMutationResult): CartState {\n if (!result.cart) return state;\n const cart = cartResponseFromStandardEvent(result.cart);\n return {\n ...state,\n data: {\n ...state.data,\n id: cart.id,\n checkoutUrl: cart.checkoutUrl ?? state.data.checkoutUrl,\n updatedAt: cart.updatedAt ?? state.data.updatedAt,\n totalQuantity: cart.totalQuantity,\n cost: cart.cost,\n },\n };\n}\n\nfunction addSnapshotIdentity(state: CartState, result: CartMutationResult): CartState {\n if (!result.cart || state.data.id) return state;\n const cart = cartResponseFromStandardEvent(result.cart);\n return { ...state, data: { ...state.data, id: cart.id } };\n}\n\nfunction removeTransaction(\n store: CartStoreContext,\n transactionId: number,\n): PendingTransaction | null {\n const index = store.transactions.findIndex((transaction) => transaction.id === transactionId);\n if (index === -1) return null;\n const [transaction] = store.transactions.splice(index, 1);\n return transaction;\n}\n\nfunction trimOlderRelativeTransactions(\n store: CartStoreContext,\n successful: PendingTransaction,\n): void {\n store.transactions = store.transactions.flatMap((transaction) => {\n if (transaction.sequence >= successful.sequence) return [transaction];\n const trimmed = transaction.trimAfter(successful);\n return trimmed ? [trimmed] : [];\n });\n}\n\nfunction fulfillTransaction(\n store: CartStoreContext,\n transactionId: number,\n result: CartMutationResult,\n): void {\n const transaction = store.transactions.find((candidate) => candidate.id === transactionId);\n if (!transaction || transaction.generation !== store.generation) return;\n store.observedPromises.delete(transaction.promise);\n if (!ownsSignalKeys(store, transaction)) {\n removeTransaction(store, transactionId);\n publishVisibleState(store);\n revalidateCartWhenIdle(store);\n return;\n }\n\n store.settled = transaction.projectPromise(store.settled, result, (projector, keys) =>\n addProjectedError(store, keys ?? transaction.errorKeys, projector),\n );\n store.settled = addSnapshotIdentity(store.settled, result);\n if (\n result.cart &&\n !transaction.requiresRevalidation &&\n transaction.sequence >= store.lastSnapshotSequence\n ) {\n store.settled = addSnapshotFields(store.settled, result);\n store.lastSnapshotSequence = transaction.sequence;\n }\n removeTransaction(store, transactionId);\n if (result.cart) trimOlderRelativeTransactions(store, transaction);\n releaseSignalKeys(store, transaction);\n publishVisibleState(store);\n revalidateCartWhenIdle(store);\n}\n\nfunction rejectedResult(failure: CartActionFailure): CartMutationResult {\n return { cart: null, ...failure } as CartMutationResult;\n}\n\nfunction rejectTransaction(store: CartStoreContext, transactionId: number, error: unknown): void {\n const transaction = store.transactions.find((candidate) => candidate.id === transactionId);\n if (!transaction || transaction.generation !== store.generation) return;\n store.observedPromises.delete(transaction.promise);\n const owned = ownsSignalKeys(store, transaction);\n removeTransaction(store, transactionId);\n releaseSignalKeys(store, transaction);\n\n if (owned) {\n const failure = extractCartActionFailure(error);\n if (failure) {\n transaction.projectPromise(store.settled, rejectedResult(failure), (projector, keys) =>\n addProjectedError(store, keys ?? transaction.errorKeys, projector),\n );\n }\n if (!failure && !isAbortError(error)) {\n addProjectedError(store, transaction.errorKeys, (state, timestampMs) =>\n writeNetworkError(state, error, timestampMs),\n );\n }\n }\n publishVisibleState(store);\n revalidateCartWhenIdle(store);\n}\n\nfunction enqueueTransaction<TType extends TransactionType>(\n store: CartStoreContext,\n type: TType,\n payload: TransactionPayload<TType>,\n promise: PromiseLike<CartMutationResult>,\n reservedTransaction?: TransactionReservation,\n eventToken?: string,\n): void {\n const expectedEventIndex = store.expectedEvents.findIndex(\n (expected) => expected.token === eventToken,\n );\n if (expectedEventIndex !== -1) {\n store.expectedEvents.splice(expectedEventIndex, 1);\n return;\n }\n if (store.observedPromises.has(promise)) return;\n store.observedPromises.add(promise);\n const releaseObservedPromise = () => {\n store.observedPromises.delete(promise);\n };\n promise.then(releaseObservedPromise, releaseObservedPromise);\n const activeReservation = store.reservation?.type === type ? store.reservation : undefined;\n const reservation = reservedTransaction ?? activeReservation;\n if (reservation) reservation.consumed = true;\n const transaction = createPendingTransaction(\n store,\n type,\n getTransactionDefinition(type),\n reservation ? (reservation.payload as TransactionPayload<TType>) : payload,\n promise,\n reservation,\n );\n store.mutationRevision += 1;\n markOverlappingTransactionForRevalidation(store, transaction);\n clearProjectedErrors(store, transaction.errorKeys);\n store.transactions.push(transaction);\n if (!reservation) observeMutationTransport(store, promise);\n publishVisibleState(store);\n promise.then(\n (result) => fulfillTransaction(store, transaction.id, result),\n (error: unknown) => rejectTransaction(store, transaction.id, error),\n );\n}\n\nfunction markOverlappingTransactionForRevalidation(\n store: CartStoreContext,\n transaction: PendingTransaction,\n): void {\n if (\n store.transactions.length === 0 &&\n !store.revalidation.active &&\n store.activeMutationTransports.size === 0\n ) {\n return;\n }\n transaction.requiresRevalidation = true;\n for (const pending of store.transactions) pending.requiresRevalidation = true;\n requestCartRevalidation(store);\n}\n\nfunction requestCartRevalidation(store: CartStoreContext): void {\n store.revalidation.requested = true;\n store.revalidation.visible = true;\n store.revalidation.active?.controller.abort();\n}\n\nfunction observeMutationTransport(\n store: CartStoreContext,\n promise: PromiseLike<CartMutationResult>,\n): void {\n if (store.activeMutationTransports.has(promise)) return;\n store.activeMutationTransports.add(promise);\n const releaseTransport = () => {\n store.activeMutationTransports.delete(promise);\n revalidateCartWhenIdle(store);\n };\n promise.then(releaseTransport, releaseTransport);\n}\n\nfunction createTransactionEventToken(): string {\n return crypto.randomUUID();\n}\n\nfunction withTransactionEventToken(\n updateCart: UpdateCartTransport,\n token: string,\n): UpdateCartTransport {\n return (payload, options) =>\n updateCart(payload, {\n ...options,\n event: {\n ...options?.event,\n detail: {\n ...options?.event?.detail,\n [TRANSACTION_EVENT_TOKEN_KEY]: token,\n },\n },\n });\n}\n\nfunction getTransactionEventToken(detail: Record<string, unknown> | undefined): string | undefined {\n const token = detail?.[TRANSACTION_EVENT_TOKEN_KEY];\n return typeof token === \"string\" ? token : undefined;\n}\n\nfunction reserveTransaction<TType extends TransactionType>(\n store: CartStoreContext,\n type: TType,\n payload: TransactionPayload<TType>,\n): TransactionReservation {\n const definition = getTransactionDefinition(type);\n const state = store.observable.state;\n const signalKeys = normalizeKeys(definition.getSignalKeys?.(state, payload));\n const pendingKeys = normalizeKeys(definition.getPendingKeys?.(state, payload) ?? signalKeys);\n const errorKeys = normalizeKeys(definition.getErrorKeys?.(state, payload) ?? signalKeys);\n clearProjectedErrors(store, errorKeys);\n return {\n type,\n payload,\n signalKeys,\n pendingKeys,\n errorKeys,\n owner: createOwner(store, signalKeys),\n consumed: false,\n };\n}\n\nfunction createTransactionSignal(\n store: CartStoreContext,\n reservation: TransactionReservation,\n): AbortSignal {\n const signals = [\n store.lifecycleController.signal,\n AbortSignal.timeout(STANDARD_ACTION_TIMEOUT_IN_MS),\n ];\n if (reservation.owner) signals.push(reservation.owner.controller.signal);\n return AbortSignal.any(signals);\n}\n\nasync function dispatchTransaction<TType extends TransactionType>(\n store: CartStoreContext,\n type: TType,\n payload: TransactionPayload<TType>,\n): Promise<void> {\n if (type === \"add_to_cart\" && !store.observable.state.data.id) {\n return dispatchInitialCartAdd(store, payload as AddToCartPayload);\n }\n return dispatchTransactionNow(store, type, payload);\n}\n\nasync function dispatchTransactionNow<TType extends TransactionType>(\n store: CartStoreContext,\n type: TType,\n payload: TransactionPayload<TType>,\n): Promise<void> {\n const generation = store.generation;\n const { updateCart } = await getShopifyStandardActions();\n if (generation !== store.generation) return;\n const reservation = reserveTransaction(store, type, payload);\n store.reservation = reservation;\n const signal = createTransactionSignal(store, reservation);\n const eventToken = createTransactionEventToken();\n // Standard Events can arrive asynchronously, so the reservation keeps signal ownership alive\n // until the correlated event consumes it.\n const correlatedUpdateCart = withTransactionEventToken(updateCart, eventToken);\n let promise: Promise<UpdateCartResult>;\n\n try {\n promise = getTransactionDefinition(type).transport(payload, signal, correlatedUpdateCart);\n } finally {\n store.reservation = null;\n }\n if (!reservation.consumed) {\n enqueueTransaction(store, type, payload, promise, reservation);\n store.expectedEvents.push({ token: eventToken });\n }\n observeMutationTransport(store, promise);\n\n try {\n await promise;\n } catch (error) {\n if (isAbortError(error)) return;\n throw error;\n }\n}\n\nfunction createDeferredCartMutation(): DeferredCartMutation {\n let resolveMutation: ((result: CartMutationResult) => void) | undefined;\n let rejectMutation: ((error: unknown) => void) | undefined;\n const promise = new Promise<CartMutationResult>((resolve, reject) => {\n resolveMutation = resolve;\n rejectMutation = reject;\n });\n return {\n promise,\n resolve: (result) => resolveMutation?.(result),\n reject: (error) => rejectMutation?.(error),\n };\n}\n\nfunction startQueuedInitialAdd(\n store: CartStoreContext,\n queued: QueuedInitialAdd,\n cartId?: string,\n): void {\n if (queued.generation !== store.generation || queued.signal.aborted) {\n queued.deferred.reject(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n return;\n }\n\n void getShopifyStandardActions().then(({ updateCart }) => {\n if (queued.generation !== store.generation || queued.signal.aborted) {\n queued.deferred.reject(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n return;\n }\n const eventToken = createTransactionEventToken();\n const expectedEvent = { token: eventToken };\n store.expectedEvents.push(expectedEvent);\n let transport: Promise<UpdateCartResult>;\n try {\n transport = transportAddToCart(\n queued.payload,\n queued.signal,\n withTransactionEventToken(updateCart, eventToken),\n cartId,\n );\n } catch (error) {\n const expectedIndex = store.expectedEvents.indexOf(expectedEvent);\n if (expectedIndex !== -1) store.expectedEvents.splice(expectedIndex, 1);\n queued.deferred.reject(error);\n return;\n }\n observeMutationTransport(store, transport);\n transport.then(queued.deferred.resolve, queued.deferred.reject);\n }, queued.deferred.reject);\n}\n\nfunction releaseQueuedInitialAdds(store: CartStoreContext): void {\n const gate = store.identityTransportGate;\n if (gate.active || gate.waiting.length === 0) return;\n\n const cartId = store.settled.data.id;\n if (cartId) {\n const waiting = gate.waiting.splice(0);\n for (const queued of waiting) startQueuedInitialAdd(store, queued, cartId);\n return;\n }\n\n const queued = gate.waiting.shift();\n if (!queued) return;\n gate.active = queued;\n const releaseNext = () => {\n if (gate.active !== queued) return;\n gate.active = null;\n releaseQueuedInitialAdds(store);\n };\n queued.deferred.promise.then(releaseNext, releaseNext);\n startQueuedInitialAdd(store, queued, store.settled.data.id ?? undefined);\n}\n\nasync function dispatchInitialCartAdd(\n store: CartStoreContext,\n payload: AddToCartPayload,\n): Promise<void> {\n const gate = store.identityTransportGate;\n const deferred = createDeferredCartMutation();\n const reservation = reserveTransaction(store, \"add_to_cart\", payload);\n const signal = createTransactionSignal(store, reservation);\n const queued = {\n deferred,\n generation: store.generation,\n payload,\n reservation,\n signal,\n };\n enqueueTransaction(store, \"add_to_cart\", payload, deferred.promise, reservation);\n gate.waiting.push(queued);\n releaseQueuedInitialAdds(store);\n signal.addEventListener(\n \"abort\",\n () => {\n const index = gate.waiting.indexOf(queued);\n if (index === -1) return;\n gate.waiting.splice(index, 1);\n deferred.reject(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n },\n { once: true },\n );\n\n try {\n await deferred.promise;\n } catch (error) {\n if (isAbortError(error)) return;\n throw error;\n }\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nfunction payloadFromAddEvent(event: CartLinesUpdateEvent): AddToCartPayload {\n return {\n lines: event.lines as AddLinePayload[],\n products: extractProductDetails(event.detail),\n ...(event.detail ? { eventDetail: event.detail } : {}),\n };\n}\n\nfunction handleLinesEvent(store: CartStoreContext, event: CartLinesUpdateEvent): void {\n const eventToken = getTransactionEventToken(event.detail);\n if (event.action === \"add\") {\n enqueueTransaction(\n store,\n \"add_to_cart\",\n payloadFromAddEvent(event),\n event.promise,\n undefined,\n eventToken,\n );\n return;\n }\n if (event.lines.length !== 1) return;\n const line = event.lines[0] as { id: string; quantity: number };\n enqueueTransaction(\n store,\n \"change_line_quantity\",\n { lineId: line.id, quantity: line.quantity },\n event.promise,\n undefined,\n eventToken,\n );\n}\n\nfunction handleDiscountEvent(store: CartStoreContext, event: CartDiscountUpdateEvent): void {\n enqueueTransaction(\n store,\n \"set_discount_codes\",\n { discountCodes: event.discountCodes.map((discount) => discount.code) },\n event.promise,\n undefined,\n getTransactionEventToken(event.detail),\n );\n}\n\nfunction handleNoteEvent(store: CartStoreContext, event: CartNoteUpdateEvent): void {\n enqueueTransaction(\n store,\n \"set_note\",\n { note: event.note },\n event.promise,\n undefined,\n getTransactionEventToken(event.detail),\n );\n}\n\nfunction handleAttributesEvent(store: CartStoreContext, event: CartAttributesUpdateEvent): void {\n enqueueTransaction(\n store,\n \"set_attributes\",\n { attributes: event.attributes },\n event.promise,\n undefined,\n getTransactionEventToken(event.detail),\n );\n}\n\nfunction connectCartStore(store: CartStoreContext, handlers: CartEventHandlers): boolean {\n if (typeof document === \"undefined\") return false;\n if (store.lifecycleController.signal.aborted) store.lifecycleController = new AbortController();\n if (store.cartSyncAttached) return true;\n store.cartSyncAttached = true;\n connectedCartStores.add(store);\n attachCartConsentListener();\n document.addEventListener(\"shopify:cart:lines-update\", handlers.lines);\n document.addEventListener(\"shopify:cart:discount-update\", handlers.discount);\n document.addEventListener(\"shopify:cart:note-update\", handlers.note);\n document.addEventListener(\"shopify:cart:attributes-update\", handlers.attributes);\n void getShopifyStandardActions().catch(() => {});\n return true;\n}\n\nfunction cancelCartRevalidation(store: CartStoreContext): void {\n store.revalidation.active?.controller.abort();\n store.revalidation.active = null;\n store.revalidation.requested = false;\n store.revalidation.visible = false;\n}\n\nfunction clearPendingTransactions(store: CartStoreContext): void {\n store.generation += 1;\n store.lifecycleController.abort();\n store.lifecycleController = new AbortController();\n for (const owner of new Set(store.keyedOwners.values())) owner.controller.abort();\n store.keyedOwners.clear();\n store.transactions = [];\n store.projectedErrors = [];\n store.observedPromises.clear();\n store.activeMutationTransports.clear();\n store.expectedEvents = [];\n store.reservation = null;\n store.identityTransportGate.active = null;\n for (const queued of store.identityTransportGate.waiting) {\n queued.deferred.reject(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n }\n store.identityTransportGate.waiting = [];\n cancelCartRevalidation(store);\n}\n\nfunction destroyCartStore(store: CartStoreContext, handlers: CartEventHandlers): void {\n clearPendingTransactions(store);\n if (typeof document !== \"undefined\" && store.cartSyncAttached) {\n document.removeEventListener(\"shopify:cart:lines-update\", handlers.lines);\n document.removeEventListener(\"shopify:cart:discount-update\", handlers.discount);\n document.removeEventListener(\"shopify:cart:note-update\", handlers.note);\n document.removeEventListener(\"shopify:cart:attributes-update\", handlers.attributes);\n }\n connectedCartStores.delete(store);\n detachCartConsentListenerIfIdle();\n store.cartSyncAttached = false;\n publishVisibleState(store);\n}\n\nfunction handleVisitorConsentCollected(): void {\n revalidateConnectedCartCheckoutUrls();\n}\n\nfunction attachCartConsentListener(): void {\n if (cartConsentListenerAttached) return;\n document.addEventListener(VISITOR_CONSENT_COLLECTED_EVENT, handleVisitorConsentCollected);\n cartConsentListenerAttached = true;\n}\n\nfunction detachCartConsentListenerIfIdle(): void {\n if (!cartConsentListenerAttached || connectedCartStores.size > 0) return;\n document.removeEventListener(VISITOR_CONSENT_COLLECTED_EVENT, handleVisitorConsentCollected);\n cartConsentListenerAttached = false;\n}\n\nfunction createCartObservable(initialState: CartState, onReadyPromiseRemoved: () => void) {\n const observable = createObservable<CartState>(initialState);\n\n return {\n get state() {\n return observable.state;\n },\n subscribe: observable.subscribe,\n setState(next: CartState | ((prev: CartState) => CartState)): void {\n observable.setState((prev) => {\n const nextState = typeof next === \"function\" ? next(prev) : next;\n if (Object.is(nextState, prev)) return prev;\n if (prev.readyPromise) {\n onReadyPromiseRemoved();\n return withoutReadyPromise({ ...nextState, loading: false });\n }\n return withoutReadyPromise(nextState);\n });\n },\n setReadyState(next: CartState): void {\n observable.setState(next);\n },\n clearReadyState(): void {\n observable.setState(withoutReadyPromise(observable.state));\n },\n };\n}\n\nfunction withoutReadyPromise(state: CartState): CartState {\n if (!state.readyPromise) return state;\n const nextState = { ...state, loading: false };\n delete nextState.readyPromise;\n return nextState;\n}\n\nfunction invalidateActiveCartLoad(store: CartStoreContext): void {\n const activeCartLoad = store.activeCartLoad;\n if (!activeCartLoad) return;\n store.activeCartLoad = null;\n activeCartLoad.resolveReadyPromise();\n}\n\nfunction hasLocalCartData(state: CartState): boolean {\n return (\n state.data.id !== null ||\n state.data.totalQuantity > EMPTY_QUANTITY ||\n getLines(state.data).length > 0\n );\n}\n\nfunction hydrateCartInStore(store: CartStoreContext, data: CartData): void {\n const current = store.observable.state;\n invalidateActiveCartLoad(store);\n if (current.data.id !== null && current.data.id === data.id) {\n store.observable.clearReadyState();\n return;\n }\n if (store.transactions.length > 0) {\n store.observable.clearReadyState();\n return;\n }\n cancelCartRevalidation(store);\n store.settled = createCartState(data);\n store.projectedErrors = [];\n publishVisibleState(store);\n}\n\nfunction resetCartStore(store: CartStoreContext): void {\n const hadActiveCartLoad = store.activeCartLoad !== null;\n const hadActiveRevalidation = store.revalidation.active !== null;\n const shouldReloadAfterReset =\n store.cartSyncAttached &&\n !hadActiveRevalidation &&\n (hadActiveCartLoad || hasLocalCartData(store.observable.state));\n\n clearPendingTransactions(store);\n invalidateActiveCartLoad(store);\n cancelCartRevalidation(store);\n store.lastSnapshotSequence = 0;\n store.settled = createEmptyCartState();\n publishVisibleState(store);\n\n if (shouldReloadAfterReset) {\n loadCartInStore(store).catch((error: unknown) =>\n log.error(\"cart reset load failed\", { error }),\n );\n }\n}\n\nfunction isCurrentCartLoad(store: CartStoreContext, request: ActiveCartLoad): boolean {\n return store.activeCartLoad === request && store.observable.state === request.state;\n}\n\nfunction loadCartInStore(\n store: CartStoreContext,\n cartPromise?: PromiseLike<CartData | null>,\n): Promise<void> {\n const existing = store.activeCartLoad;\n if (existing?.state === store.observable.state) return existing.promise;\n\n invalidateActiveCartLoad(store);\n\n let resolveReadyPromise = NOOP;\n const readyPromise = new Promise<void>((resolve) => {\n resolveReadyPromise = resolve;\n });\n let request: ActiveCartLoad;\n const state = { ...store.observable.state, readyPromise };\n const promise = Promise.resolve(cartPromise ?? fetchCartData(state.data.id))\n .then((data) => {\n if (!isCurrentCartLoad(store, request)) return;\n if (data) hydrateCartInStore(store, data);\n if (!data) {\n store.settled = { ...store.settled, loading: false };\n publishVisibleState(store);\n }\n })\n .catch((error) => {\n if (isCurrentCartLoad(store, request)) {\n store.settled = { ...store.settled, loading: false };\n publishVisibleState(store);\n }\n throw error;\n })\n .finally(() => {\n if (store.activeCartLoad === request) store.activeCartLoad = null;\n request.resolveReadyPromise();\n });\n request = { state, promise, resolveReadyPromise };\n store.activeCartLoad = request;\n store.observable.setReadyState(state);\n return promise;\n}\n\nexport function createCartStore<TData extends CartData = CartData>(\n options: CreateCartStoreOptions<TData> = {},\n): CartStore {\n const initialData = options.initialData;\n const asyncInitialData = isPromiseLike<CartInitialData<TData>>(initialData);\n const syncInitialData = initialData !== undefined && !asyncInitialData;\n const initialCart = syncInitialData ? initialData.cart : null;\n const settled = initialCart\n ? createCartState(initialCart)\n : syncInitialData\n ? createEmptyCartState({ loading: false })\n : createEmptyCartState();\n let context: CartStoreContext | null = null;\n const observable = createCartObservable(settled, () => {\n if (context) invalidateActiveCartLoad(context);\n });\n const store: CartStoreContext = {\n observable,\n settled,\n transactions: [],\n projectedErrors: [],\n observedPromises: new Set(),\n activeMutationTransports: new Set(),\n expectedEvents: [],\n nextTransactionId: 1,\n generation: 0,\n lifecycleController: new AbortController(),\n keyedOwners: new Map(),\n activeCartLoad: null,\n revalidation: { requested: false, active: null, visible: false },\n mutationRevision: 0,\n identityTransportGate: { active: null, waiting: [] },\n cartSyncAttached: false,\n reservation: null,\n lastSnapshotSequence: 0,\n };\n context = store;\n const handlers: CartEventHandlers = {\n lines: ((event: Event) =>\n handleLinesEvent(store, event as CartLinesUpdateEvent)) as EventListener,\n discount: ((event: Event) =>\n handleDiscountEvent(store, event as CartDiscountUpdateEvent)) as EventListener,\n note: ((event: Event) => handleNoteEvent(store, event as CartNoteUpdateEvent)) as EventListener,\n attributes: ((event: Event) =>\n handleAttributesEvent(store, event as CartAttributesUpdateEvent)) as EventListener,\n };\n if (asyncInitialData) {\n loadCartInStore(\n store,\n Promise.resolve(initialData).then((data) => data.cart),\n ).catch((error: unknown) => log.error(\"cart initial load failed\", { error }));\n }\n\n let initialCartLoadStarted = syncInitialData || asyncInitialData;\n\n return {\n connect: () => {\n const connected = connectCartStore(store, handlers);\n if (!connected || initialCartLoadStarted) return;\n initialCartLoadStarted = true;\n loadCartInStore(store).catch((error: unknown) =>\n log.error(\"cart initial load failed\", { error }),\n );\n },\n destroy: () => destroyCartStore(store, handlers),\n hydrate: (data) => hydrateCartInStore(store, data),\n getState: () => store.observable.state,\n subscribe: (listener) => store.observable.subscribe(listener),\n fetch: () => loadCartInStore(store),\n refresh: () => refreshCartInStore(store),\n reset: () => resetCartStore(store),\n handleFormSubmit: (event, eventDetail) =>\n handleFormSubmitInStore(store, handlers, event, eventDetail),\n };\n}\n\nconst LINE_INTENTS = new Set([\"increase\", \"decrease\", \"remove\", \"set\"]);\nconst DISCOUNT_INTENTS = new Set([\"discount-apply\", \"discount-remove\"]);\n\nfunction requireFormEvent(event: SubmitEvent): {\n form: HTMLFormElement;\n submitter: HTMLElement;\n} {\n if (!(event.target instanceof HTMLFormElement)) {\n throw new TypeError(`Expected event.target to be an HTMLFormElement, got ${event.target}`);\n }\n if (!(event.submitter instanceof HTMLElement)) {\n throw new TypeError(`Expected event.submitter to be an HTMLElement, got ${event.submitter}`);\n }\n return { form: event.target, submitter: event.submitter };\n}\n\nfunction getLineQuantityPayload(\n state: CartState,\n intent: string,\n lineId: string,\n formData: FormData,\n): ChangeLineQuantityPayload {\n const line = getLines(state.data).find((candidate) => candidate.id === lineId);\n const currentQuantity = line?.quantity ?? 0;\n if (intent === \"remove\") return { lineId, quantity: 0 };\n if (intent === \"increase\") return { lineId, quantity: currentQuantity + 1 };\n if (intent === \"decrease\") return { lineId, quantity: Math.max(0, currentQuantity - 1) };\n\n const rawQuantity = Number(formData.get(\"quantity\"));\n const explicitQuantity = Number.isNaN(rawQuantity) ? DEFAULT_MINIMUM_QUANTITY : rawQuantity;\n if (explicitQuantity <= 0) return { lineId, quantity: 0 };\n const maxQuantity = line?.merchandise?.quantityAvailable ?? undefined;\n return {\n lineId,\n quantity: sanitizeQuantity(explicitQuantity, {\n min: DEFAULT_MINIMUM_QUANTITY,\n max: maxQuantity,\n }),\n };\n}\n\nfunction getAddPayload(\n formData: FormData,\n eventDetail?: Record<string, unknown>,\n): AddToCartPayload {\n const merchandiseId = formData.get(\"merchandiseId\") as string | null;\n if (!merchandiseId) throw new Error('Add intent requires a \"merchandiseId\" field.');\n const rawQuantity = Number.parseInt(formData.get(\"quantity\") as string, 10);\n const quantity = Number.isNaN(rawQuantity)\n ? DEFAULT_ADD_QUANTITY\n : Math.max(DEFAULT_ADD_QUANTITY, rawQuantity);\n const rawSellingPlanId = formData.get(\"sellingPlanId\") as string | null;\n const sellingPlanId = rawSellingPlanId || undefined;\n return {\n lines: [{ merchandiseId, quantity, ...(sellingPlanId ? { sellingPlanId } : {}) }],\n products: extractProductDetails(eventDetail),\n ...(eventDetail ? { eventDetail } : {}),\n };\n}\n\nfunction submitLineIntent(\n store: CartStoreContext,\n intent: string,\n formData: FormData,\n): Promise<void> {\n const lineId = formData.get(\"lineId\") as string | null;\n if (!lineId) throw new Error('Missing \"lineId\" in form data');\n const payload = getLineQuantityPayload(store.observable.state, intent, lineId, formData);\n return dispatchTransaction(store, \"change_line_quantity\", payload);\n}\n\nfunction submitDiscountIntent(\n store: CartStoreContext,\n intent: string,\n formData: FormData,\n): Promise<void> {\n const code = (formData.get(\"discountCode\") as string) ?? \"\";\n const currentCodes = store.observable.state.data.discountCodes.map((discount) => discount.code);\n const discountCodes =\n intent === \"discount-apply\"\n ? [...currentCodes, code]\n : currentCodes.filter((current) => current !== code);\n return dispatchTransaction(store, \"set_discount_codes\", { discountCodes });\n}\n\nasync function handleFormSubmitInStore(\n store: CartStoreContext,\n handlers: CartEventHandlers,\n event: SubmitEvent,\n eventDetail?: Record<string, unknown>,\n): Promise<void> {\n const { form, submitter } = requireFormEvent(event);\n connectCartStore(store, handlers);\n const intent = submitter.getAttribute(\"value\") ?? \"\";\n const formData = new FormData(form);\n\n if (intent === \"add\" || (!intent && formData.has(\"merchandiseId\"))) {\n return dispatchTransaction(store, \"add_to_cart\", getAddPayload(formData, eventDetail));\n }\n if (LINE_INTENTS.has(intent)) return submitLineIntent(store, intent, formData);\n if (DISCOUNT_INTENTS.has(intent)) return submitDiscountIntent(store, intent, formData);\n if (intent === \"note-update\") {\n const note = (formData.get(\"note\") as string) ?? \"\";\n return dispatchTransaction(store, \"set_note\", { note });\n }\n if (intent === \"attributes-update\") {\n const attributes = getCartAttributeFormEntries(formData).map(({ key, value }) => ({\n key,\n value: String(value),\n }));\n return dispatchTransaction(store, \"set_attributes\", { attributes });\n }\n throw new Error(`Unknown cart form intent: \"${intent}\"`);\n}\n\nexport function configureCartEndpoint(endpoint: string): void {\n if (configuredCartEndpoint === endpoint) return;\n if (configuredCartEndpoint !== null) {\n log.warn(\n `configureCartEndpoint called with \"${endpoint}\" but already configured with \"${configuredCartEndpoint}\".`,\n );\n }\n configuredCartEndpoint = endpoint;\n}\n\nasync function postCartUpdateToEndpoint(\n endpoint: string,\n payload: UpdateCartPayload,\n options?: UpdateCartOptions,\n): Promise<UpdateCartResult> {\n const timeoutSignal = AbortSignal.timeout(STANDARD_ACTION_TIMEOUT_IN_MS);\n const signal = options?.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(payload),\n signal,\n });\n if (!response.ok) throw new CartNetworkError(response.status);\n return response.json();\n}\n\nfunction configureUpdateCartOnce(actions: ShopifyStandardActions): void {\n if (hasConfiguredUpdateCart) return;\n const configured = actions.updateCart.configure({\n eventTarget: () => document,\n handler: (defaultHandler, payload, options) => {\n if (!configuredCartEndpoint || !payload) return defaultHandler();\n return postCartUpdateToEndpoint(configuredCartEndpoint, payload, options);\n },\n });\n if (configured === false) {\n throw new Error(\"Standard Actions updateCart could not be configured.\");\n }\n hasConfiguredUpdateCart = true;\n}\n\nfunction hasShopifyStandardActionsScript(): boolean {\n if (typeof document === \"undefined\") return false;\n return (\n document.querySelector(`script[src=\"${SHOPIFY_STOREFRONT_STANDARD_ACTIONS_SCRIPT}\"]`) !== null\n );\n}\n\nexport function getShopifyStandardActions(): Promise<ShopifyStandardActions> {\n return (standardActionsPromise ??= new Promise<ShopifyStandardActions>((resolve, reject) => {\n const configure = () => {\n const actions = typeof window === \"undefined\" ? undefined : window.Shopify?.actions;\n if (actions?.updateCart) {\n configureUpdateCartOnce(actions);\n resolve(actions);\n return;\n }\n const message = hasShopifyStandardActionsScript()\n ? \"Standard Actions not available. Ensure the Shopify script tag has loaded before calling cart actions.\"\n : `Standard Actions not available. Add ShopifyScripts to your document head or include ${SHOPIFY_STOREFRONT_STANDARD_ACTIONS_SCRIPT} before calling cart actions.`;\n reject(new Error(message));\n };\n\n if (typeof document !== \"undefined\" && document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", configure, {\n once: true,\n });\n return;\n }\n configure();\n }).catch((error) => {\n standardActionsPromise = null;\n throw error;\n }));\n}\n\n/** @internal */\nexport function resetStandardActionsForTests(): void {\n configuredCartEndpoint = null;\n hasConfiguredUpdateCart = false;\n standardActionsPromise = null;\n}\n\nfunction extractNoteFromCart(cart: CartResponse): string {\n return ((cart as unknown as Record<string, unknown>).note as string) ?? \"\";\n}\n\nasync function fetchCart(\n cartId?: string | null,\n callerSignal?: AbortSignal,\n): Promise<{ cart: CartResponse | null }> {\n const timeoutSignal = AbortSignal.timeout(STANDARD_ACTION_TIMEOUT_IN_MS);\n const signal = callerSignal ? AbortSignal.any([callerSignal, timeoutSignal]) : timeoutSignal;\n if (configuredCartEndpoint) {\n const response = await fetch(configuredCartEndpoint, {\n cache: \"no-store\",\n signal,\n });\n if (!response.ok) throw new CartNetworkError(response.status);\n const result = (await response.json()) as { cart: CartResponse | null };\n return { cart: result.cart };\n }\n\n const { getCart } = await getShopifyStandardActions();\n if (!getCart) {\n throw new Error(\n \"Standard Actions not available. Ensure the Shopify script tag is loaded before calling fetchCart.\",\n );\n }\n const result = (await getCart(cartId ? { cartId } : undefined, {\n signal,\n })) as { cart: CartResponse | null };\n return { cart: result.cart };\n}\n\nfunction fetchCartData(cartId?: string | null, signal?: AbortSignal): Promise<CartData | null> {\n return fetchCart(cartId, signal).then(({ cart }) =>\n cart\n ? {\n ...cart,\n checkoutUrl: cart.checkoutUrl ?? null,\n note: extractNoteFromCart(cart),\n attributes: cart.attributes ?? [],\n }\n : null,\n );\n}\n\nfunction mergeAuthoritativeCartData(previous: CartData, authoritative: CartData): CartData {\n const previousLines = new Map(getLines(previous).map((line) => [line.id, line]));\n const lines = getLines(authoritative).map((line) =>\n mergeServerLine(previousLines.get(line.id), line),\n );\n const {\n checkoutUrl,\n cost,\n lines: authoritativeConnection,\n note,\n ...authoritativeFields\n } = authoritative;\n return {\n ...previous,\n ...authoritativeFields,\n cost: { ...previous.cost, ...cost },\n lines: { ...previous.lines, ...authoritativeConnection, nodes: lines },\n ...(checkoutUrl !== undefined && { checkoutUrl }),\n ...(note !== undefined && { note }),\n };\n}\n\nfunction fetchCartRevalidationData(cartId: string, signal: AbortSignal): Promise<CartData | null> {\n return fetchCart(cartId, signal).then(({ cart }) =>\n cart ? cartResponseFromStandardEvent(cart as unknown as StandardEventCart) : null,\n );\n}\n\nfunction isCurrentCartRevalidationRequest(\n store: CartStoreContext,\n request: ActiveCartRevalidation,\n): boolean {\n return (\n !request.controller.signal.aborted &&\n store.revalidation.active === request &&\n store.generation === request.generation &&\n store.mutationRevision === request.mutationRevision &&\n store.transactions.length === 0 &&\n store.settled.data.id === request.cartId\n );\n}\n\n// Merges authoritative fields for a same-cart revalidation, or adopts a\n// discovered cart when the refresh had no cart id.\nfunction applyCartRevalidation(\n store: CartStoreContext,\n request: ActiveCartRevalidation,\n cart: CartData | null,\n): void {\n if (!isCurrentCartRevalidationRequest(store, request)) return;\n\n if (request.cartId === null) {\n // A null result isn't an error (an out-of-band creation hasn't propagated\n // yet); adopt the cart once it appears. hydrateCartInStore resets\n // revalidation state.\n if (cart) {\n hydrateCartInStore(store, cart);\n return;\n }\n store.revalidation.visible = false;\n publishVisibleState(store);\n return;\n }\n\n if (!cart) throw new Error(CART_REVALIDATION_ERROR_MESSAGE);\n if (cart.id !== request.cartId) {\n // A configured endpoint resolves the cart from its cookie, which an external\n // operation can swap for a different cart. Treat the response as an\n // authoritative replacement; hydrateCartInStore adopts it and clears\n // revalidation state so clients don't stay stuck with revalidating: true.\n hydrateCartInStore(store, cart);\n return;\n }\n store.settled = {\n ...store.settled,\n data: mergeAuthoritativeCartData(store.settled.data, cart),\n };\n store.revalidation.visible = false;\n publishVisibleState(store);\n}\n\nfunction refreshCartInStore(store: CartStoreContext): void {\n // Publishing over an in-flight initial load invalidates it (the ready state\n // carries the load's identity), which would discard the fetched cart. Wait\n // for the load to settle, then reconcile against whatever cart it produced.\n const activeCartLoad = store.activeCartLoad;\n if (activeCartLoad) {\n const runAfterLoad = () => refreshCartInStore(store);\n activeCartLoad.promise.then(runAfterLoad, runAfterLoad);\n return;\n }\n // Reconcile through the queue so the refresh stays non-blocking. With no cart\n // id, revalidateCartWhenIdle waits for in-flight work then discovers a cart\n // created out of band.\n requestCartRevalidation(store);\n publishVisibleState(store);\n revalidateCartWhenIdle(store);\n}\n\nfunction revalidateCartWhenIdle(store: CartStoreContext): void {\n if (\n !store.revalidation.requested ||\n store.revalidation.active ||\n store.transactions.length > 0 ||\n store.activeMutationTransports.size > 0\n ) {\n return;\n }\n\n store.revalidation.requested = false;\n clearProjectedErrors(store, [REVALIDATION_ERROR_KEY]);\n publishVisibleState(store);\n\n // No cart id: discover one with a full-cart load instead of revalidating.\n const cartId = store.settled.data.id;\n const controller = new AbortController();\n let request: ActiveCartRevalidation;\n const revalidationFetch = cartId\n ? fetchCartRevalidationData(cartId, controller.signal)\n : fetchCartData(null, controller.signal);\n const promise = revalidationFetch\n .then((cart) => applyCartRevalidation(store, request, cart))\n .catch((error: unknown) => {\n if (isAbortError(error) || !isCurrentCartRevalidationRequest(store, request)) return;\n store.revalidation.visible = false;\n addProjectedError(store, [REVALIDATION_ERROR_KEY], (state, timestampMs) =>\n writeNetworkError(state, new Error(CART_REVALIDATION_ERROR_MESSAGE), timestampMs),\n );\n publishVisibleState(store);\n })\n .finally(() => {\n if (store.revalidation.active === request) store.revalidation.active = null;\n revalidateCartWhenIdle(store);\n });\n request = {\n cartId,\n controller,\n generation: store.generation,\n mutationRevision: store.mutationRevision,\n promise,\n };\n store.revalidation.active = request;\n}\n\nasync function refreshCheckoutUrl(store: CartStoreContext): Promise<void> {\n const { cart } = await fetchCart(store.observable.state.data.id);\n const current = store.observable.state;\n if (!cart || (current.data.id && current.data.id !== cart.id)) return;\n const checkoutUrl = cart.checkoutUrl ?? null;\n if (current.data.checkoutUrl === checkoutUrl) return;\n store.settled = {\n ...store.settled,\n data: { ...store.settled.data, checkoutUrl },\n };\n publishVisibleState(store);\n}\n\n/** @internal */\nexport function revalidateConnectedCartCheckoutUrls(): void {\n if (typeof window === \"undefined\") return;\n for (const store of connectedCartStores) {\n const state = store.observable.state;\n if (!state.data.checkoutUrl || state.data.totalQuantity === 0) continue;\n refreshCheckoutUrl(store).catch(() => {});\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ //#region src/core/cart/cookie.d.ts
2
+ declare function createCartCookie(cartId: string): string;
3
+ //#endregion
4
+ export { createCartCookie };
5
+ //# sourceMappingURL=cookie.d.mts.map
@@ -0,0 +1,28 @@
1
+ //#region src/core/cart/cookie.ts
2
+ const COOKIE_NAME = "cart";
3
+ const MAX_AGE_IN_SECONDS = 1209600;
4
+ const CART_GID_PREFIX = "gid://shopify/Cart/";
5
+ function normalizeCartId(cartId) {
6
+ if (!cartId) return null;
7
+ return cartId.startsWith(CART_GID_PREFIX) ? cartId : CART_GID_PREFIX + cartId;
8
+ }
9
+ function getCartIdFromCookie(input) {
10
+ const header = input instanceof Request ? input.headers.get("cookie") : input.cookie;
11
+ if (!header) return null;
12
+ const match = header.match(new RegExp(`(?:^|;\\s*)${COOKIE_NAME}=([^;]*)`));
13
+ if (!match || !match[1]) return null;
14
+ const token = decodeURIComponent(match[1]);
15
+ if (!token) return null;
16
+ return normalizeCartId(token);
17
+ }
18
+ function createCartCookie(cartId) {
19
+ const token = cartId.startsWith(CART_GID_PREFIX) ? cartId.slice(19) : cartId;
20
+ return `${COOKIE_NAME}=${encodeURIComponent(token)}; Path=/; SameSite=Lax; Max-Age=${MAX_AGE_IN_SECONDS}`;
21
+ }
22
+ function createExpiredCartCookie() {
23
+ return `${COOKIE_NAME}=; Path=/; SameSite=Lax; Max-Age=0`;
24
+ }
25
+
26
+ //#endregion
27
+ export { createCartCookie, createExpiredCartCookie, getCartIdFromCookie, normalizeCartId };
28
+ //# sourceMappingURL=cookie.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie.mjs","names":[],"sources":["../../../../src/core/cart/cookie.ts"],"sourcesContent":["const COOKIE_NAME = \"cart\";\nconst MAX_AGE_IN_SECONDS = 1209600; // 14 days\nconst CART_GID_PREFIX = \"gid://shopify/Cart/\";\n\ntype CartCookieSource = Request | { cookie?: string };\n\nexport function normalizeCartId(cartId: string | null | undefined): string | null {\n if (!cartId) return null;\n return cartId.startsWith(CART_GID_PREFIX) ? cartId : CART_GID_PREFIX + cartId;\n}\n\nexport function getCartIdFromCookie(input: CartCookieSource): string | null {\n const header = input instanceof Request ? input.headers.get(\"cookie\") : input.cookie;\n if (!header) return null;\n\n const match = header.match(new RegExp(`(?:^|;\\\\s*)${COOKIE_NAME}=([^;]*)`));\n if (!match || !match[1]) return null;\n\n const token = decodeURIComponent(match[1]);\n if (!token) return null;\n\n return normalizeCartId(token);\n}\n\nexport function createCartCookie(cartId: string): string {\n const token = cartId.startsWith(CART_GID_PREFIX) ? cartId.slice(CART_GID_PREFIX.length) : cartId;\n const encoded = encodeURIComponent(token);\n return `${COOKIE_NAME}=${encoded}; Path=/; SameSite=Lax; Max-Age=${MAX_AGE_IN_SECONDS}`;\n}\n\nexport function createExpiredCartCookie(): string {\n return `${COOKIE_NAME}=; Path=/; SameSite=Lax; Max-Age=0`;\n}\n"],"mappings":";AAAA,MAAM,cAAc;AACpB,MAAM,qBAAqB;AAC3B,MAAM,kBAAkB;AAIxB,SAAgB,gBAAgB,QAAkD;AAChF,KAAI,CAAC,OAAQ,QAAO;AACpB,QAAO,OAAO,WAAW,gBAAgB,GAAG,SAAS,kBAAkB;;AAGzE,SAAgB,oBAAoB,OAAwC;CAC1E,MAAM,SAAS,iBAAiB,UAAU,MAAM,QAAQ,IAAI,SAAS,GAAG,MAAM;AAC9E,KAAI,CAAC,OAAQ,QAAO;CAEpB,MAAM,QAAQ,OAAO,MAAM,IAAI,OAAO,cAAc,YAAY,UAAU,CAAC;AAC3E,KAAI,CAAC,SAAS,CAAC,MAAM,GAAI,QAAO;CAEhC,MAAM,QAAQ,mBAAmB,MAAM,GAAG;AAC1C,KAAI,CAAC,MAAO,QAAO;AAEnB,QAAO,gBAAgB,MAAM;;AAG/B,SAAgB,iBAAiB,QAAwB;CACvD,MAAM,QAAQ,OAAO,WAAW,gBAAgB,GAAG,OAAO,MAAM,GAAuB,GAAG;AAE1F,QAAO,GAAG,YAAY,GADN,mBAAmB,MACH,CAAC,kCAAkC;;AAGrE,SAAgB,0BAAkC;AAChD,QAAO,GAAG,YAAY"}
@@ -0,0 +1,130 @@
1
+ //#region src/core/cart/form.d.ts
2
+ interface SetButtonAttributes {
3
+ name: "intent";
4
+ value: "set";
5
+ type: "submit";
6
+ hidden: true;
7
+ }
8
+ interface QuantityInputAttributes {
9
+ name: "quantity";
10
+ value: string;
11
+ type: "text";
12
+ inputMode: "numeric";
13
+ pattern: string;
14
+ autoComplete: "off";
15
+ autoCorrect: "off";
16
+ }
17
+ type AttributeValueName = `attributes.${string}`;
18
+ type CartFormRegister = {
19
+ (field: "lineId", opts: {
20
+ value: string;
21
+ }): {
22
+ name: "lineId";
23
+ value: string;
24
+ readOnly: true;
25
+ };
26
+ (field: "quantity", opts: {
27
+ value: number | string;
28
+ interactive: true;
29
+ }): QuantityInputAttributes;
30
+ (field: "quantity", opts: {
31
+ value: number | string;
32
+ interactive?: false;
33
+ }): {
34
+ name: "quantity";
35
+ value: string;
36
+ };
37
+ (field: "quantity", opts: {
38
+ defaultValue: number;
39
+ }): {
40
+ name: "quantity";
41
+ defaultValue: string;
42
+ };
43
+ (field: "discountCode", opts: {
44
+ value: string;
45
+ }): {
46
+ name: "discountCode";
47
+ value: string;
48
+ };
49
+ (field: "discountCode", opts: {
50
+ defaultValue: string;
51
+ }): {
52
+ name: "discountCode";
53
+ defaultValue: string;
54
+ };
55
+ (field: "merchandiseId", opts: {
56
+ value: string;
57
+ }): {
58
+ name: "merchandiseId";
59
+ value: string;
60
+ };
61
+ (field: "note", opts: {
62
+ value: string;
63
+ }): {
64
+ name: "note";
65
+ value: string;
66
+ };
67
+ (field: "note", opts: {
68
+ defaultValue: string;
69
+ }): {
70
+ name: "note";
71
+ defaultValue: string;
72
+ };
73
+ (field: "attributeValue", opts: {
74
+ key: string;
75
+ value: string;
76
+ }): {
77
+ name: AttributeValueName;
78
+ value: string;
79
+ };
80
+ (field: "attributeValue", opts: {
81
+ key: string;
82
+ defaultValue: string;
83
+ }): {
84
+ name: AttributeValueName;
85
+ defaultValue: string;
86
+ };
87
+ (field: "sellingPlanId", opts: {
88
+ value: string;
89
+ }): {
90
+ name: "sellingPlanId";
91
+ value: string;
92
+ };
93
+ (action: "add"): {
94
+ name: "intent";
95
+ value: "add";
96
+ };
97
+ (action: "increase"): {
98
+ name: "intent";
99
+ value: "increase";
100
+ };
101
+ (action: "decrease"): {
102
+ name: "intent";
103
+ value: "decrease";
104
+ };
105
+ (action: "remove"): {
106
+ name: "intent";
107
+ value: "remove";
108
+ };
109
+ (action: "set"): SetButtonAttributes;
110
+ (action: "discount-apply"): {
111
+ name: "intent";
112
+ value: "discount-apply";
113
+ };
114
+ (action: "discount-remove"): {
115
+ name: "intent";
116
+ value: "discount-remove";
117
+ };
118
+ (action: "note-update"): {
119
+ name: "intent";
120
+ value: "note-update";
121
+ };
122
+ (action: "attributes-update"): {
123
+ name: "intent";
124
+ value: "attributes-update";
125
+ };
126
+ };
127
+ declare function createCartFormRegister(): CartFormRegister;
128
+ //#endregion
129
+ export { CartFormRegister, QuantityInputAttributes, SetButtonAttributes, createCartFormRegister };
130
+ //# sourceMappingURL=form.d.mts.map
@@ -0,0 +1,75 @@
1
+ //#region src/core/cart/form.ts
2
+ const FIELD_REGISTERS = new Set([
3
+ "lineId",
4
+ "quantity",
5
+ "discountCode",
6
+ "merchandiseId",
7
+ "note",
8
+ "sellingPlanId"
9
+ ]);
10
+ const ATTRIBUTE_VALUE_NAME_PREFIX = "attributes.";
11
+ function getCartAttributeFormEntries(formData) {
12
+ const attributes = [];
13
+ for (const [name, value] of formData.entries()) {
14
+ if (!name.startsWith(ATTRIBUTE_VALUE_NAME_PREFIX)) continue;
15
+ attributes.push({
16
+ key: name.slice(11),
17
+ value
18
+ });
19
+ }
20
+ return attributes;
21
+ }
22
+ function createAttributeValueAttributes(opts) {
23
+ if (!opts?.key) throw new TypeError("Cart attribute values require a non-empty \"key\".");
24
+ const name = `${ATTRIBUTE_VALUE_NAME_PREFIX}${opts.key}`;
25
+ if ("defaultValue" in opts) return {
26
+ name,
27
+ defaultValue: String(opts.defaultValue)
28
+ };
29
+ return {
30
+ name,
31
+ value: String(opts.value ?? "")
32
+ };
33
+ }
34
+ function createFieldAttributes(name, opts) {
35
+ if (opts && "defaultValue" in opts) return {
36
+ name,
37
+ defaultValue: String(opts.defaultValue)
38
+ };
39
+ const value = String(opts?.value ?? "");
40
+ if (name === "quantity" && opts?.interactive) return {
41
+ name: "quantity",
42
+ value,
43
+ type: "text",
44
+ inputMode: "numeric",
45
+ pattern: "\\d+",
46
+ autoComplete: "off",
47
+ autoCorrect: "off"
48
+ };
49
+ const attrs = {
50
+ name,
51
+ value
52
+ };
53
+ if (name === "lineId") attrs.readOnly = true;
54
+ return attrs;
55
+ }
56
+ function createCartFormRegister() {
57
+ return ((nameOrAction, opts) => {
58
+ if (nameOrAction === "attributeValue") return createAttributeValueAttributes(opts);
59
+ if (FIELD_REGISTERS.has(nameOrAction)) return createFieldAttributes(nameOrAction, opts);
60
+ if (nameOrAction === "set") return {
61
+ name: "intent",
62
+ value: "set",
63
+ type: "submit",
64
+ hidden: true
65
+ };
66
+ return {
67
+ name: "intent",
68
+ value: nameOrAction
69
+ };
70
+ });
71
+ }
72
+
73
+ //#endregion
74
+ export { createCartFormRegister, getCartAttributeFormEntries };
75
+ //# sourceMappingURL=form.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.mjs","names":[],"sources":["../../../../src/core/cart/form.ts"],"sourcesContent":["export interface SetButtonAttributes {\n name: \"intent\";\n value: \"set\";\n type: \"submit\";\n hidden: true;\n}\n\nexport interface QuantityInputAttributes {\n name: \"quantity\";\n value: string;\n type: \"text\";\n inputMode: \"numeric\";\n pattern: string;\n autoComplete: \"off\";\n autoCorrect: \"off\";\n}\n\ntype AttributeValueName = `attributes.${string}`;\n\nexport type CartFormRegister = {\n (field: \"lineId\", opts: { value: string }): { name: \"lineId\"; value: string; readOnly: true };\n (field: \"quantity\", opts: { value: number | string; interactive: true }): QuantityInputAttributes;\n (\n field: \"quantity\",\n opts: { value: number | string; interactive?: false },\n ): { name: \"quantity\"; value: string };\n (field: \"quantity\", opts: { defaultValue: number }): { name: \"quantity\"; defaultValue: string };\n (field: \"discountCode\", opts: { value: string }): { name: \"discountCode\"; value: string };\n (\n field: \"discountCode\",\n opts: { defaultValue: string },\n ): { name: \"discountCode\"; defaultValue: string };\n (field: \"merchandiseId\", opts: { value: string }): { name: \"merchandiseId\"; value: string };\n (field: \"note\", opts: { value: string }): { name: \"note\"; value: string };\n (field: \"note\", opts: { defaultValue: string }): { name: \"note\"; defaultValue: string };\n (\n field: \"attributeValue\",\n opts: { key: string; value: string },\n ): { name: AttributeValueName; value: string };\n (\n field: \"attributeValue\",\n opts: { key: string; defaultValue: string },\n ): { name: AttributeValueName; defaultValue: string };\n (field: \"sellingPlanId\", opts: { value: string }): { name: \"sellingPlanId\"; value: string };\n (action: \"add\"): { name: \"intent\"; value: \"add\" };\n (action: \"increase\"): { name: \"intent\"; value: \"increase\" };\n (action: \"decrease\"): { name: \"intent\"; value: \"decrease\" };\n (action: \"remove\"): { name: \"intent\"; value: \"remove\" };\n (action: \"set\"): SetButtonAttributes;\n (action: \"discount-apply\"): { name: \"intent\"; value: \"discount-apply\" };\n (action: \"discount-remove\"): { name: \"intent\"; value: \"discount-remove\" };\n (action: \"note-update\"): { name: \"intent\"; value: \"note-update\" };\n (action: \"attributes-update\"): { name: \"intent\"; value: \"attributes-update\" };\n};\n\nconst FIELD_REGISTERS = new Set([\n \"lineId\",\n \"quantity\",\n \"discountCode\",\n \"merchandiseId\",\n \"note\",\n \"sellingPlanId\",\n]);\n\nconst ATTRIBUTE_VALUE_NAME_PREFIX = \"attributes.\";\n\ntype RegisterOptions = {\n key?: string;\n value?: string | number;\n defaultValue?: string;\n interactive?: boolean;\n};\n\nexport function getCartAttributeFormEntries(\n formData: FormData,\n): Array<{ key: string; value: FormDataEntryValue }> {\n const attributes: Array<{ key: string; value: FormDataEntryValue }> = [];\n for (const [name, value] of formData.entries()) {\n if (!name.startsWith(ATTRIBUTE_VALUE_NAME_PREFIX)) continue;\n attributes.push({ key: name.slice(ATTRIBUTE_VALUE_NAME_PREFIX.length), value });\n }\n return attributes;\n}\n\nfunction createAttributeValueAttributes(opts?: RegisterOptions) {\n if (!opts?.key) throw new TypeError('Cart attribute values require a non-empty \"key\".');\n const name = `${ATTRIBUTE_VALUE_NAME_PREFIX}${opts.key}` as AttributeValueName;\n if (\"defaultValue\" in opts) {\n return { name, defaultValue: String(opts.defaultValue) };\n }\n return { name, value: String(opts.value ?? \"\") };\n}\n\nfunction createFieldAttributes(name: string, opts?: RegisterOptions) {\n if (opts && \"defaultValue\" in opts) {\n return { name, defaultValue: String(opts.defaultValue) };\n }\n\n const value = String(opts?.value ?? \"\");\n\n if (name === \"quantity\" && opts?.interactive) {\n return {\n name: \"quantity\",\n value,\n type: \"text\",\n inputMode: \"numeric\",\n pattern: \"\\\\d+\",\n autoComplete: \"off\",\n autoCorrect: \"off\",\n } satisfies QuantityInputAttributes;\n }\n\n const attrs: Record<string, string | boolean> = { name, value };\n if (name === \"lineId\") attrs.readOnly = true;\n return attrs;\n}\n\nexport function createCartFormRegister(): CartFormRegister {\n return ((nameOrAction: string, opts?: RegisterOptions) => {\n if (nameOrAction === \"attributeValue\") {\n return createAttributeValueAttributes(opts);\n }\n\n if (FIELD_REGISTERS.has(nameOrAction)) {\n return createFieldAttributes(nameOrAction, opts);\n }\n\n if (nameOrAction === \"set\") {\n return {\n name: \"intent\",\n value: \"set\",\n type: \"submit\",\n hidden: true,\n } satisfies SetButtonAttributes;\n }\n\n return { name: \"intent\", value: nameOrAction };\n }) as CartFormRegister;\n}\n"],"mappings":";AAuDA,MAAM,kBAAkB,IAAI,IAAI;CAC9B;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,8BAA8B;AASpC,SAAgB,4BACd,UACmD;CACnD,MAAM,aAAgE,EAAE;AACxE,MAAK,MAAM,CAAC,MAAM,UAAU,SAAS,SAAS,EAAE;AAC9C,MAAI,CAAC,KAAK,WAAW,4BAA4B,CAAE;AACnD,aAAW,KAAK;GAAE,KAAK,KAAK,MAAM,GAAmC;GAAE;GAAO,CAAC;;AAEjF,QAAO;;AAGT,SAAS,+BAA+B,MAAwB;AAC9D,KAAI,CAAC,MAAM,IAAK,OAAM,IAAI,UAAU,qDAAmD;CACvF,MAAM,OAAO,GAAG,8BAA8B,KAAK;AACnD,KAAI,kBAAkB,KACpB,QAAO;EAAE;EAAM,cAAc,OAAO,KAAK,aAAa;EAAE;AAE1D,QAAO;EAAE;EAAM,OAAO,OAAO,KAAK,SAAS,GAAG;EAAE;;AAGlD,SAAS,sBAAsB,MAAc,MAAwB;AACnE,KAAI,QAAQ,kBAAkB,KAC5B,QAAO;EAAE;EAAM,cAAc,OAAO,KAAK,aAAa;EAAE;CAG1D,MAAM,QAAQ,OAAO,MAAM,SAAS,GAAG;AAEvC,KAAI,SAAS,cAAc,MAAM,YAC/B,QAAO;EACL,MAAM;EACN;EACA,MAAM;EACN,WAAW;EACX,SAAS;EACT,cAAc;EACd,aAAa;EACd;CAGH,MAAM,QAA0C;EAAE;EAAM;EAAO;AAC/D,KAAI,SAAS,SAAU,OAAM,WAAW;AACxC,QAAO;;AAGT,SAAgB,yBAA2C;AACzD,UAAS,cAAsB,SAA2B;AACxD,MAAI,iBAAiB,iBACnB,QAAO,+BAA+B,KAAK;AAG7C,MAAI,gBAAgB,IAAI,aAAa,CACnC,QAAO,sBAAsB,cAAc,KAAK;AAGlD,MAAI,iBAAiB,MACnB,QAAO;GACL,MAAM;GACN,OAAO;GACP,MAAM;GACN,QAAQ;GACT;AAGH,SAAO;GAAE,MAAM;GAAU,OAAO;GAAc"}
@@ -0,0 +1,25 @@
1
+ import { ShopifyRequestContext } from "../request-context.mjs";
2
+ import { AnyStorefrontQueryString, StorefrontQueryString } from "../../graphql/graphql.mjs";
3
+ import { StorefrontClient } from "../../client/types.mjs";
4
+ import { CartData } from "./state.mjs";
5
+ import { cartQueries } from "./queries.mjs";
6
+
7
+ //#region src/core/cart/get-cart.d.ts
8
+ type MergeCartData<TCart> = Omit<CartData, keyof TCart> & TCart;
9
+ type CartDataFromQuery<TQuery extends AnyStorefrontQueryString> = TQuery extends StorefrontQueryString<infer Result, infer _Variables, string> ? Result extends {
10
+ cart?: (infer Cart) | null;
11
+ } ? MergeCartData<NonNullable<Cart>> : CartData : CartData;
12
+ type CartResult<TCart extends CartData = CartData> = {
13
+ cart: TCart | null;
14
+ errors?: Array<{
15
+ message: string;
16
+ }>;
17
+ headers: Headers;
18
+ };
19
+ type StorefrontCartClient = Pick<StorefrontClient, "graphql">;
20
+ type CartIdSource = Request | Pick<ShopifyRequestContext, "cookie" | "url">;
21
+ declare function getCartId(input: CartIdSource): string | null;
22
+ declare function getCart<TQuery extends AnyStorefrontQueryString = typeof cartQueries.cart>(cartId: string | null, storefront: StorefrontCartClient, cartQuery?: TQuery): Promise<CartResult<CartDataFromQuery<TQuery>>>;
23
+ //#endregion
24
+ export { CartDataFromQuery, CartResult, getCart, getCartId };
25
+ //# sourceMappingURL=get-cart.d.mts.map
@@ -0,0 +1,32 @@
1
+ import { getCartIdFromCookie } from "./cookie.mjs";
2
+ import { cartQueries } from "./queries.mjs";
3
+
4
+ //#region src/core/cart/get-cart.ts
5
+ function getCartId(input) {
6
+ if (input.url) {
7
+ const cartId = new URL(input.url, "https://hydrogen.local").searchParams.get("cartId");
8
+ if (cartId) return cartId;
9
+ }
10
+ return getCartIdFromCookie(input);
11
+ }
12
+ async function getCart(cartId, storefront, cartQuery = cartQueries.cart) {
13
+ if (!cartId) return {
14
+ cart: null,
15
+ headers: new Headers()
16
+ };
17
+ const queryCart = storefront.graphql;
18
+ const result = await queryCart(cartQuery, { variables: { id: cartId } });
19
+ if (result.errors || !result.data?.cart) return {
20
+ cart: null,
21
+ errors: result.errors,
22
+ headers: result.headers
23
+ };
24
+ return {
25
+ cart: result.data.cart,
26
+ headers: result.headers
27
+ };
28
+ }
29
+
30
+ //#endregion
31
+ export { getCart, getCartId };
32
+ //# sourceMappingURL=get-cart.mjs.map