@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,89 @@
1
+ import { collectionSearchEqual, mergeCollectionParams, normalizeCollectionSearch } from "./url.mjs";
2
+
3
+ //#region src/core/collection/reconciler.ts
4
+ /**
5
+ * Creates a framework-agnostic reconciler that manages the state machine for
6
+ * keeping the URL, server data, and store in sync during browse-change chains.
7
+ *
8
+ * Framework adapters delegate to this so the reconciliation logic
9
+ * lives in one place.
10
+ */
11
+ function createCollectionReconciler(callbacks, initialPrevUrlSearch = "") {
12
+ let pendingFilter = null;
13
+ let pendingUrls = /* @__PURE__ */ new Set();
14
+ let prevUrlSearch = initialPrevUrlSearch;
15
+ return {
16
+ handleBrowseChange() {
17
+ const store = callbacks.getStore();
18
+ const searchString = mergeCollectionParams(new URLSearchParams(callbacks.readUrlSearch()), store.getState()).toString();
19
+ pendingFilter = searchString;
20
+ pendingUrls.add(searchString);
21
+ callbacks.emitChange(searchString ? `?${searchString}` : "");
22
+ },
23
+ reset(newPrevUrlSearch) {
24
+ pendingFilter = null;
25
+ pendingUrls = /* @__PURE__ */ new Set();
26
+ prevUrlSearch = newPrevUrlSearch;
27
+ },
28
+ reconcile(urlSearch, dataSearch) {
29
+ const store = callbacks.getStore();
30
+ const pendingSearchEquals = (search) => [...pendingUrls].some((pending) => collectionSearchEqual(pending, search));
31
+ const pendingTargetMatchesUrl = pendingFilter != null && collectionSearchEqual(pendingFilter, urlSearch);
32
+ const trySettleFromServer = () => {
33
+ if (store.getState().status !== "loading") return false;
34
+ if (!collectionSearchEqual(dataSearch, urlSearch)) return false;
35
+ const incomingParams = new URLSearchParams(urlSearch);
36
+ if (!store.matchesParams(incomingParams)) store.syncFromParams(incomingParams);
37
+ store.settle();
38
+ return true;
39
+ };
40
+ const clearPendingIfSettled = () => {
41
+ if (!trySettleFromServer()) return false;
42
+ pendingFilter = null;
43
+ pendingUrls.clear();
44
+ return true;
45
+ };
46
+ if (clearPendingIfSettled()) return;
47
+ const urlSearchChanged = normalizeCollectionSearch(urlSearch) !== normalizeCollectionSearch(prevUrlSearch);
48
+ prevUrlSearch = urlSearch;
49
+ const reDispatchToPendingTarget = () => {
50
+ if (pendingFilter == null) return;
51
+ callbacks.emitChange(pendingFilter ? `?${pendingFilter}` : "");
52
+ };
53
+ const routerSettledOnIntermediateWithStaleTarget = pendingFilter != null && pendingSearchEquals(urlSearch) && !pendingTargetMatchesUrl && collectionSearchEqual(dataSearch, urlSearch);
54
+ const serverConfirmedIntermediateWhileTargeting = pendingFilter != null && pendingSearchEquals(dataSearch) && !collectionSearchEqual(dataSearch, pendingFilter) && !collectionSearchEqual(dataSearch, urlSearch);
55
+ if (pendingTargetMatchesUrl) {
56
+ if (trySettleFromServer()) {
57
+ pendingFilter = null;
58
+ pendingUrls.clear();
59
+ } else if (store.getState().status === "loading" && serverConfirmedIntermediateWhileTargeting) reDispatchToPendingTarget();
60
+ return;
61
+ }
62
+ if (pendingFilter != null) {
63
+ if (!urlSearchChanged) {
64
+ if (clearPendingIfSettled()) return;
65
+ if (routerSettledOnIntermediateWithStaleTarget) reDispatchToPendingTarget();
66
+ return;
67
+ }
68
+ if (pendingSearchEquals(urlSearch)) {
69
+ if (clearPendingIfSettled()) return;
70
+ if (routerSettledOnIntermediateWithStaleTarget) reDispatchToPendingTarget();
71
+ return;
72
+ }
73
+ pendingFilter = null;
74
+ pendingUrls.clear();
75
+ }
76
+ const incomingParams = new URLSearchParams(urlSearch);
77
+ if (store.matchesParams(incomingParams)) {
78
+ trySettleFromServer();
79
+ return;
80
+ }
81
+ store.syncFromParams(incomingParams);
82
+ trySettleFromServer();
83
+ }
84
+ };
85
+ }
86
+
87
+ //#endregion
88
+ export { createCollectionReconciler };
89
+ //# sourceMappingURL=reconciler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconciler.mjs","names":[],"sources":["../../../../src/core/collection/reconciler.ts"],"sourcesContent":["import type { CollectionStore } from \"./collection\";\nimport { collectionSearchEqual, mergeCollectionParams, normalizeCollectionSearch } from \"./url\";\n\nexport type ReconcilerCallbacks = {\n getStore: () => CollectionStore;\n readUrlSearch: () => string;\n emitChange: (searchString: string) => void;\n};\n\nexport type CollectionReconciler = {\n /**\n * URL ↔ store reconciliation state machine. Call whenever urlSearch,\n * dataSearch, or store state changes.\n */\n reconcile(urlSearch: string, dataSearch: string): void;\n /**\n * Callback for {@link CollectionStore.setOnBrowseChange}. Merges current\n * URL params with store state, tracks the pending navigation, and emits.\n */\n handleBrowseChange(): void;\n /** Clears pending navigation state (call when the store is recreated). */\n reset(newPrevUrlSearch: string): void;\n};\n\n/**\n * Creates a framework-agnostic reconciler that manages the state machine for\n * keeping the URL, server data, and store in sync during browse-change chains.\n *\n * Framework adapters delegate to this so the reconciliation logic\n * lives in one place.\n */\nexport function createCollectionReconciler(\n callbacks: ReconcilerCallbacks,\n initialPrevUrlSearch = \"\",\n): CollectionReconciler {\n let pendingFilter: string | null = null;\n let pendingUrls = new Set<string>();\n let prevUrlSearch = initialPrevUrlSearch;\n\n return {\n handleBrowseChange() {\n const store = callbacks.getStore();\n const merged = mergeCollectionParams(\n new URLSearchParams(callbacks.readUrlSearch()),\n store.getState(),\n );\n const searchString = merged.toString();\n pendingFilter = searchString;\n pendingUrls.add(searchString);\n callbacks.emitChange(searchString ? `?${searchString}` : \"\");\n },\n\n reset(newPrevUrlSearch: string) {\n pendingFilter = null;\n pendingUrls = new Set();\n prevUrlSearch = newPrevUrlSearch;\n },\n\n // State machine — four states:\n //\n // ┌─────────────────────────────────────────────────────────────────────┐\n // │ State A: No pending navigation (pendingFilter === null) │\n // │ • URL matches store → try settle if server data caught up │\n // │ • URL differs from store → syncFromParams, then try settle │\n // ├─────────────────────────────────────────────────────────────────────┤\n // │ State B: Pending — URL matches target (pendingTargetMatchesUrl) │\n // │ • Server data matches URL → settle, clear pending state │\n // │ • Server data stale (intermediate) → re-dispatch to target │\n // │ • Server data not yet arrived → wait (keep pending set) │\n // ├─────────────────────────────────────────────────────────────────────┤\n // │ State C: Pending — URL is intermediate (in pendingUrls) │\n // │ • Ignore URL change; if router settled here with server data │\n // │ confirming the intermediate, re-dispatch to the real target │\n // ├─────────────────────────────────────────────────────────────────────┤\n // │ State D: Pending — URL is unknown (not in pendingUrls) │\n // │ • External navigation (back/forward, <Link>) │\n // │ • Abandon pending state, fall through to State A │\n // └─────────────────────────────────────────────────────────────────────┘\n //\n // Rapid toggles (A on → B on → A off) produce multiple in-flight navigations.\n // pendingFilter tracks the latest target; pendingUrls tracks every URL\n // dispatched in the chain so intermediates can be distinguished from external navs.\n reconcile(urlSearch: string, dataSearch: string) {\n const store = callbacks.getStore();\n\n const pendingSearchEquals = (search: string): boolean =>\n [...pendingUrls].some((pending) => collectionSearchEqual(pending, search));\n\n const pendingTargetMatchesUrl =\n pendingFilter != null && collectionSearchEqual(pendingFilter, urlSearch);\n\n const trySettleFromServer = (): boolean => {\n if (store.getState().status !== \"loading\") return false;\n if (!collectionSearchEqual(dataSearch, urlSearch)) return false;\n\n const incomingParams = new URLSearchParams(urlSearch);\n if (!store.matchesParams(incomingParams)) {\n store.syncFromParams(incomingParams);\n }\n\n store.settle();\n return true;\n };\n\n const clearPendingIfSettled = (): boolean => {\n if (!trySettleFromServer()) return false;\n pendingFilter = null;\n pendingUrls.clear();\n return true;\n };\n\n if (clearPendingIfSettled()) return;\n\n const normalizedUrlSearch = normalizeCollectionSearch(urlSearch);\n const normalizedPrevUrlSearch = normalizeCollectionSearch(prevUrlSearch);\n const urlSearchChanged = normalizedUrlSearch !== normalizedPrevUrlSearch;\n prevUrlSearch = urlSearch;\n\n const reDispatchToPendingTarget = () => {\n if (pendingFilter == null) return;\n callbacks.emitChange(pendingFilter ? `?${pendingFilter}` : \"\");\n };\n\n const routerSettledOnIntermediateWithStaleTarget =\n pendingFilter != null &&\n pendingSearchEquals(urlSearch) &&\n !pendingTargetMatchesUrl &&\n collectionSearchEqual(dataSearch, urlSearch);\n\n const serverConfirmedIntermediateWhileTargeting =\n pendingFilter != null &&\n pendingSearchEquals(dataSearch) &&\n !collectionSearchEqual(dataSearch, pendingFilter) &&\n !collectionSearchEqual(dataSearch, urlSearch);\n\n if (pendingTargetMatchesUrl) {\n if (trySettleFromServer()) {\n pendingFilter = null;\n pendingUrls.clear();\n } else if (\n store.getState().status === \"loading\" &&\n serverConfirmedIntermediateWhileTargeting\n ) {\n reDispatchToPendingTarget();\n }\n return;\n }\n\n if (pendingFilter != null) {\n if (!urlSearchChanged) {\n if (clearPendingIfSettled()) return;\n if (routerSettledOnIntermediateWithStaleTarget) {\n reDispatchToPendingTarget();\n }\n return;\n }\n\n if (pendingSearchEquals(urlSearch)) {\n if (clearPendingIfSettled()) return;\n if (routerSettledOnIntermediateWithStaleTarget) {\n reDispatchToPendingTarget();\n }\n return;\n }\n\n pendingFilter = null;\n pendingUrls.clear();\n }\n\n const incomingParams = new URLSearchParams(urlSearch);\n\n if (store.matchesParams(incomingParams)) {\n trySettleFromServer();\n return;\n }\n\n store.syncFromParams(incomingParams);\n trySettleFromServer();\n },\n };\n}\n"],"mappings":";;;;;;;;;;AA+BA,SAAgB,2BACd,WACA,uBAAuB,IACD;CACtB,IAAI,gBAA+B;CACnC,IAAI,8BAAc,IAAI,KAAa;CACnC,IAAI,gBAAgB;AAEpB,QAAO;EACL,qBAAqB;GACnB,MAAM,QAAQ,UAAU,UAAU;GAKlC,MAAM,eAJS,sBACb,IAAI,gBAAgB,UAAU,eAAe,CAAC,EAC9C,MAAM,UAAU,CAES,CAAC,UAAU;AACtC,mBAAgB;AAChB,eAAY,IAAI,aAAa;AAC7B,aAAU,WAAW,eAAe,IAAI,iBAAiB,GAAG;;EAG9D,MAAM,kBAA0B;AAC9B,mBAAgB;AAChB,iCAAc,IAAI,KAAK;AACvB,mBAAgB;;EA2BlB,UAAU,WAAmB,YAAoB;GAC/C,MAAM,QAAQ,UAAU,UAAU;GAElC,MAAM,uBAAuB,WAC3B,CAAC,GAAG,YAAY,CAAC,MAAM,YAAY,sBAAsB,SAAS,OAAO,CAAC;GAE5E,MAAM,0BACJ,iBAAiB,QAAQ,sBAAsB,eAAe,UAAU;GAE1E,MAAM,4BAAqC;AACzC,QAAI,MAAM,UAAU,CAAC,WAAW,UAAW,QAAO;AAClD,QAAI,CAAC,sBAAsB,YAAY,UAAU,CAAE,QAAO;IAE1D,MAAM,iBAAiB,IAAI,gBAAgB,UAAU;AACrD,QAAI,CAAC,MAAM,cAAc,eAAe,CACtC,OAAM,eAAe,eAAe;AAGtC,UAAM,QAAQ;AACd,WAAO;;GAGT,MAAM,8BAAuC;AAC3C,QAAI,CAAC,qBAAqB,CAAE,QAAO;AACnC,oBAAgB;AAChB,gBAAY,OAAO;AACnB,WAAO;;AAGT,OAAI,uBAAuB,CAAE;GAI7B,MAAM,mBAFsB,0BAA0B,UAEV,KADZ,0BAA0B,cACc;AACxE,mBAAgB;GAEhB,MAAM,kCAAkC;AACtC,QAAI,iBAAiB,KAAM;AAC3B,cAAU,WAAW,gBAAgB,IAAI,kBAAkB,GAAG;;GAGhE,MAAM,6CACJ,iBAAiB,QACjB,oBAAoB,UAAU,IAC9B,CAAC,2BACD,sBAAsB,YAAY,UAAU;GAE9C,MAAM,4CACJ,iBAAiB,QACjB,oBAAoB,WAAW,IAC/B,CAAC,sBAAsB,YAAY,cAAc,IACjD,CAAC,sBAAsB,YAAY,UAAU;AAE/C,OAAI,yBAAyB;AAC3B,QAAI,qBAAqB,EAAE;AACzB,qBAAgB;AAChB,iBAAY,OAAO;eAEnB,MAAM,UAAU,CAAC,WAAW,aAC5B,0CAEA,4BAA2B;AAE7B;;AAGF,OAAI,iBAAiB,MAAM;AACzB,QAAI,CAAC,kBAAkB;AACrB,SAAI,uBAAuB,CAAE;AAC7B,SAAI,2CACF,4BAA2B;AAE7B;;AAGF,QAAI,oBAAoB,UAAU,EAAE;AAClC,SAAI,uBAAuB,CAAE;AAC7B,SAAI,2CACF,4BAA2B;AAE7B;;AAGF,oBAAgB;AAChB,gBAAY,OAAO;;GAGrB,MAAM,iBAAiB,IAAI,gBAAgB,UAAU;AAErD,OAAI,MAAM,cAAc,eAAe,EAAE;AACvC,yBAAqB;AACrB;;AAGF,SAAM,eAAe,eAAe;AACpC,wBAAqB;;EAExB"}
@@ -0,0 +1,66 @@
1
+ import { ProductCollectionSortKeys } from "../../graphql/generated/storefront-api-types.mjs";
2
+ import { ProductFilter } from "../../vendor/standard-events.mjs";
3
+
4
+ //#region src/core/collection/state.d.ts
5
+ /** How a filter option is visually presented in the storefront UI. */
6
+ type FilterPresentation = "IMAGE" | "SWATCH" | "TEXT";
7
+ /** The input mechanism a filter uses — boolean toggle, multi-select list, or price slider. */
8
+ type FilterType = "BOOLEAN" | "LIST" | "PRICE_RANGE" | (string & {});
9
+ interface BaseAvailableFilterValue {
10
+ /** Unique identifier for this filter value. */
11
+ id: string;
12
+ /** Human-readable label (e.g. "Red", "Nike", "$50–$100"). */
13
+ label: string;
14
+ /** Number of products matching this value in the current result set. */
15
+ count: number;
16
+ /** JSON-encoded `ProductFilter` input to apply this value. */
17
+ input: string;
18
+ }
19
+ type PickIfPresent<TValue, TKey extends PropertyKey> = TKey extends keyof TValue ? Pick<TValue, TKey> : {};
20
+ /**
21
+ * A single selectable value within an {@link AvailableFilter}.
22
+ *
23
+ * Pass your Storefront API query value type as `TValue` to expose query-selected
24
+ * visual fields such as `swatch`.
25
+ */
26
+ type AvailableFilterValue<TValue extends BaseAvailableFilterValue = BaseAvailableFilterValue> = BaseAvailableFilterValue & PickIfPresent<TValue, "swatch">;
27
+ /**
28
+ * A filter facet available for the current collection, returned by the
29
+ * Storefront API. Used to render filter UI (checkboxes, swatches, sliders).
30
+ */
31
+ interface AvailableFilter<TValue extends BaseAvailableFilterValue = BaseAvailableFilterValue> {
32
+ id: string;
33
+ label: string;
34
+ type: FilterType;
35
+ presentation?: FilterPresentation | null;
36
+ values: AvailableFilterValue<TValue>[];
37
+ }
38
+ /**
39
+ * Pure browse-intent state for a collection store. Represents what the user
40
+ * wants to see (filters, sort), not what the server returned.
41
+ *
42
+ * Server response data (productsCount, availableFilters, collection id) lives
43
+ * in the framework's loader data, not in the store.
44
+ */
45
+ interface CollectionState {
46
+ /** URL-safe slug identifying the collection (e.g. `"shoes"`). */
47
+ handle: string;
48
+ /** Active product filters, synced bidirectionally with URL params (`filter.*`). */
49
+ filters: ProductFilter[];
50
+ /** Storefront API sort key. `undefined` means the collection's default sort order. */
51
+ sortKey: ProductCollectionSortKeys | undefined;
52
+ /** When `true`, the sort direction is descending (maps to `sort_by` suffix `-descending`). */
53
+ reverse: boolean;
54
+ /** `"idle"` when browse state matches the last-loaded data, `"loading"` after a browse change before the framework fetch settles. */
55
+ status: "idle" | "loading";
56
+ }
57
+ /**
58
+ * Creates a blank {@link CollectionState} for the given collection handle.
59
+ * All browse fields start at their zero values.
60
+ *
61
+ * @param handle - URL-safe collection slug (e.g. `"shoes"`)
62
+ */
63
+ declare function createInitialCollectionState(handle: string): CollectionState;
64
+ //#endregion
65
+ export { AvailableFilter, AvailableFilterValue, CollectionState, FilterPresentation, FilterType, createInitialCollectionState };
66
+ //# sourceMappingURL=state.d.mts.map
@@ -0,0 +1,20 @@
1
+ //#region src/core/collection/state.ts
2
+ /**
3
+ * Creates a blank {@link CollectionState} for the given collection handle.
4
+ * All browse fields start at their zero values.
5
+ *
6
+ * @param handle - URL-safe collection slug (e.g. `"shoes"`)
7
+ */
8
+ function createInitialCollectionState(handle) {
9
+ return {
10
+ handle,
11
+ filters: [],
12
+ sortKey: void 0,
13
+ reverse: false,
14
+ status: "idle"
15
+ };
16
+ }
17
+
18
+ //#endregion
19
+ export { createInitialCollectionState };
20
+ //# sourceMappingURL=state.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.mjs","names":[],"sources":["../../../../src/core/collection/state.ts"],"sourcesContent":["import type { ProductFilter } from \"../../../vendor/standard-events\";\nimport type { ProductCollectionSortKeys } from \"../../graphql/generated/storefront-api-types\";\n\nexport type { ProductCollectionSortKeys, ProductFilter };\n\n/** How a filter option is visually presented in the storefront UI. */\nexport type FilterPresentation = \"IMAGE\" | \"SWATCH\" | \"TEXT\";\n\n/** The input mechanism a filter uses — boolean toggle, multi-select list, or price slider. */\nexport type FilterType = \"BOOLEAN\" | \"LIST\" | \"PRICE_RANGE\" | (string & {});\n\ninterface BaseAvailableFilterValue {\n /** Unique identifier for this filter value. */\n id: string;\n /** Human-readable label (e.g. \"Red\", \"Nike\", \"$50–$100\"). */\n label: string;\n /** Number of products matching this value in the current result set. */\n count: number;\n /** JSON-encoded `ProductFilter` input to apply this value. */\n input: string;\n}\n\ntype PickIfPresent<TValue, TKey extends PropertyKey> = TKey extends keyof TValue\n ? Pick<TValue, TKey>\n : {};\n\n/**\n * A single selectable value within an {@link AvailableFilter}.\n *\n * Pass your Storefront API query value type as `TValue` to expose query-selected\n * visual fields such as `swatch`.\n */\nexport type AvailableFilterValue<\n TValue extends BaseAvailableFilterValue = BaseAvailableFilterValue,\n> = BaseAvailableFilterValue & PickIfPresent<TValue, \"swatch\">;\n\n/**\n * A filter facet available for the current collection, returned by the\n * Storefront API. Used to render filter UI (checkboxes, swatches, sliders).\n */\nexport interface AvailableFilter<\n TValue extends BaseAvailableFilterValue = BaseAvailableFilterValue,\n> {\n id: string;\n label: string;\n type: FilterType;\n presentation?: FilterPresentation | null;\n values: AvailableFilterValue<TValue>[];\n}\n\n/**\n * Pure browse-intent state for a collection store. Represents what the user\n * wants to see (filters, sort), not what the server returned.\n *\n * Server response data (productsCount, availableFilters, collection id) lives\n * in the framework's loader data, not in the store.\n */\nexport interface CollectionState {\n /** URL-safe slug identifying the collection (e.g. `\"shoes\"`). */\n handle: string;\n\n /** Active product filters, synced bidirectionally with URL params (`filter.*`). */\n filters: ProductFilter[];\n /** Storefront API sort key. `undefined` means the collection's default sort order. */\n sortKey: ProductCollectionSortKeys | undefined;\n /** When `true`, the sort direction is descending (maps to `sort_by` suffix `-descending`). */\n reverse: boolean;\n /** `\"idle\"` when browse state matches the last-loaded data, `\"loading\"` after a browse change before the framework fetch settles. */\n status: \"idle\" | \"loading\";\n}\n\n/**\n * Creates a blank {@link CollectionState} for the given collection handle.\n * All browse fields start at their zero values.\n *\n * @param handle - URL-safe collection slug (e.g. `\"shoes\"`)\n */\nexport function createInitialCollectionState(handle: string): CollectionState {\n return {\n handle,\n filters: [],\n sortKey: undefined,\n reverse: false,\n status: \"idle\",\n };\n}\n"],"mappings":";;;;;;;AA6EA,SAAgB,6BAA6B,QAAiC;AAC5E,QAAO;EACL;EACA,SAAS,EAAE;EACX,SAAS;EACT,SAAS;EACT,QAAQ;EACT"}
@@ -0,0 +1,71 @@
1
+ import { ProductCollectionSortKeys } from "../../graphql/generated/storefront-api-types.mjs";
2
+ import { ProductFilter } from "../../vendor/standard-events.mjs";
3
+ import { CollectionState } from "./state.mjs";
4
+
5
+ //#region src/core/collection/url.d.ts
6
+ /**
7
+ * Parsed collection URL parameters — the subset of {@link CollectionState}
8
+ * that is derived from the URL query string.
9
+ */
10
+ interface CollectionParams {
11
+ filters: ProductFilter[];
12
+ sortKey: ProductCollectionSortKeys | undefined;
13
+ reverse: boolean;
14
+ }
15
+ /**
16
+ * Extracts collection state from URL search params.
17
+ *
18
+ * Handles Liquid-compatible filter keys (`filter.p.*`, `filter.v.*`)
19
+ * and the `sort_by` param (with optional `-descending`/`-ascending` suffix).
20
+ *
21
+ * @param searchParams - URL search params to parse
22
+ */
23
+ declare function parseCollectionParams(searchParams: URLSearchParams): CollectionParams;
24
+ /**
25
+ * Serializes collection state into URL search params using Liquid-compatible keys.
26
+ *
27
+ * Only emits store-owned keys (`filter.*`, `sort_by`).
28
+ * Omits `sort_by` when `sortKey` is `undefined` (collection default).
29
+ *
30
+ * @param state - The filter/sort slice of collection state
31
+ */
32
+ declare function serializeCollectionParams(state: Pick<CollectionState, "filters" | "sortKey" | "reverse">): URLSearchParams;
33
+ /** Normalizes a router search string for comparison (strips a leading `?`). */
34
+ declare function normalizeCollectionSearch(search: string): string;
35
+ /**
36
+ * Builds a URL query string with the given filter removed from the current params.
37
+ *
38
+ * Clears pagination cursors so the changed filter state starts from its first page.
39
+ * Returns `"?"` when removing the filter leaves no params. Useful for
40
+ * rendering "remove filter" links without updating store state.
41
+ */
42
+ declare function getFilterRemovalUrl(currentParams: URLSearchParams, filter: ProductFilter): string;
43
+ /**
44
+ * Converts a Storefront API sort key and direction into the Liquid-compatible
45
+ * `sort_by` param value (e.g. `"price-ascending"`, `"best-selling"`).
46
+ *
47
+ * Direction suffixes are only appended for sort keys that support them
48
+ * (`PRICE`, `TITLE`, `CREATED`, `ID`). Others (like `BEST_SELLING`) return
49
+ * the base value regardless of the `reverse` flag.
50
+ *
51
+ * @param sortKey - Storefront API `ProductCollectionSortKeys` enum value
52
+ * @param reverse - `true` for descending, `false` for ascending
53
+ */
54
+ declare function getSortByValue(sortKey: ProductCollectionSortKeys, reverse: boolean): string;
55
+ /**
56
+ * Parses a Liquid-compatible `sort_by` value back into the Storefront API
57
+ * sort key and direction. Inverse of {@link getSortByValue}.
58
+ *
59
+ * @param value - A `sort_by` param value (e.g. `"price-ascending"`, `"best-selling"`)
60
+ */
61
+ declare function parseSortByValue(value: string): {
62
+ sortKey: ProductCollectionSortKeys | undefined;
63
+ reverse: boolean;
64
+ };
65
+ /** Compares two individual {@link ProductFilter} objects for semantic equality. */
66
+ declare function filterEquals(a: ProductFilter, b: ProductFilter): boolean;
67
+ /** Returns `true` when `input` (a Storefront API filter JSON string) matches an active filter. */
68
+ declare function isFilterInputActive(activeFilters: ProductFilter[], input: string): boolean;
69
+ //#endregion
70
+ export { CollectionParams, filterEquals, getFilterRemovalUrl, getSortByValue, isFilterInputActive, normalizeCollectionSearch, parseCollectionParams, parseSortByValue, serializeCollectionParams };
71
+ //# sourceMappingURL=url.d.mts.map
@@ -0,0 +1,376 @@
1
+ //#region src/core/collection/url.ts
2
+ const SORT_BY_DESCENDING_SUFFIX = "-descending";
3
+ const SORT_BY_ASCENDING_SUFFIX = "-ascending";
4
+ const PAGINATION_CURSOR_PARAMS = ["before", "after"];
5
+ const SORT_KEY_TO_SORT_BY = {
6
+ BEST_SELLING: "best-selling",
7
+ CREATED: "created",
8
+ PRICE: "price",
9
+ TITLE: "title",
10
+ MANUAL: "manual",
11
+ ID: "id",
12
+ RELEVANCE: "relevance",
13
+ COLLECTION_DEFAULT: "collection-default"
14
+ };
15
+ const SORT_BY_TO_SORT_KEY = Object.fromEntries(Object.entries(SORT_KEY_TO_SORT_BY).map(([key, value]) => [value, key]));
16
+ const STANDARD_EVENTS_COLLECTION_SORT_KEY = {
17
+ "best-selling": "BEST_SELLING",
18
+ "created-ascending": "CREATED",
19
+ "created-descending": "CREATED",
20
+ "price-ascending": "PRICE",
21
+ "price-descending": "PRICE",
22
+ "title-ascending": "TITLE",
23
+ "title-descending": "TITLE",
24
+ manual: "MANUAL"
25
+ };
26
+ /**
27
+ * Extracts collection state from URL search params.
28
+ *
29
+ * Handles Liquid-compatible filter keys (`filter.p.*`, `filter.v.*`)
30
+ * and the `sort_by` param (with optional `-descending`/`-ascending` suffix).
31
+ *
32
+ * @param searchParams - URL search params to parse
33
+ */
34
+ function parseCollectionParams(searchParams) {
35
+ return {
36
+ filters: parseProductFilters(searchParams),
37
+ sortKey: parseCollectionSortKey(searchParams),
38
+ reverse: searchParams.get("sort_by")?.endsWith(SORT_BY_DESCENDING_SUFFIX) ?? false
39
+ };
40
+ }
41
+ /**
42
+ * Serializes collection state into URL search params using Liquid-compatible keys.
43
+ *
44
+ * Only emits store-owned keys (`filter.*`, `sort_by`).
45
+ * Omits `sort_by` when `sortKey` is `undefined` (collection default).
46
+ *
47
+ * @param state - The filter/sort slice of collection state
48
+ */
49
+ function serializeCollectionParams(state) {
50
+ const params = new URLSearchParams();
51
+ for (const filter of state.filters) serializeFilter(params, filter);
52
+ if (state.sortKey) params.set("sort_by", getSortByValue(state.sortKey, state.reverse));
53
+ return params;
54
+ }
55
+ /** Returns `true` when the param key is owned by the collection store. */
56
+ function isStoreOwnedParam(key) {
57
+ return key === "sort_by" || key.startsWith("filter.");
58
+ }
59
+ /** Normalizes a router search string for comparison (strips a leading `?`). */
60
+ function normalizeCollectionSearch(search) {
61
+ return search.startsWith("?") ? search.slice(1) : search;
62
+ }
63
+ /**
64
+ * Merges store-owned params from `state` into `existing`, preserving
65
+ * unrelated keys (e.g. `grid`, `view`) already present in the URL. Collection
66
+ * pagination cursors (`before`, `after`) are cleared so changed browse intent
67
+ * starts from the first page.
68
+ */
69
+ function mergeCollectionParams(existing, state) {
70
+ const merged = new URLSearchParams(existing);
71
+ for (const key of Array.from(merged.keys())) if (isStoreOwnedParam(key)) merged.delete(key);
72
+ clearPaginationCursors(merged);
73
+ for (const [key, value] of serializeCollectionParams(state)) merged.append(key, value);
74
+ return merged;
75
+ }
76
+ /** Returns `true` when two router search strings describe the same collection filters and sort. */
77
+ function collectionSearchEqual(a, b) {
78
+ const parsedA = parseCollectionParams(new URLSearchParams(normalizeCollectionSearch(a)));
79
+ const parsedB = parseCollectionParams(new URLSearchParams(normalizeCollectionSearch(b)));
80
+ return parsedA.sortKey === parsedB.sortKey && parsedA.reverse === parsedB.reverse && filtersEqual(parsedA.filters, parsedB.filters);
81
+ }
82
+ /** Returns `true` when URL params and collection browse state describe the same filters and sort. */
83
+ function collectionParamsMatchState(searchParams, state) {
84
+ const parsed = parseCollectionParams(searchParams);
85
+ return parsed.sortKey === state.sortKey && parsed.reverse === state.reverse && filtersEqual(parsed.filters, state.filters);
86
+ }
87
+ /**
88
+ * Builds a URL query string with the given filter removed from the current params.
89
+ *
90
+ * Clears pagination cursors so the changed filter state starts from its first page.
91
+ * Returns `"?"` when removing the filter leaves no params. Useful for
92
+ * rendering "remove filter" links without updating store state.
93
+ */
94
+ function getFilterRemovalUrl(currentParams, filter) {
95
+ const result = new URLSearchParams(currentParams);
96
+ removeFilterParams(result, filter);
97
+ clearPaginationCursors(result);
98
+ const serialized = result.toString();
99
+ return serialized ? `?${serialized}` : "?";
100
+ }
101
+ /** Returns `true` when the sort key supports ascending/descending direction suffixes. */
102
+ function isDirectionalSortKey(sortKey) {
103
+ return sortKey === "PRICE" || sortKey === "TITLE" || sortKey === "CREATED" || sortKey === "ID";
104
+ }
105
+ /**
106
+ * Converts a Storefront API sort key and direction into the Liquid-compatible
107
+ * `sort_by` param value (e.g. `"price-ascending"`, `"best-selling"`).
108
+ *
109
+ * Direction suffixes are only appended for sort keys that support them
110
+ * (`PRICE`, `TITLE`, `CREATED`, `ID`). Others (like `BEST_SELLING`) return
111
+ * the base value regardless of the `reverse` flag.
112
+ *
113
+ * @param sortKey - Storefront API `ProductCollectionSortKeys` enum value
114
+ * @param reverse - `true` for descending, `false` for ascending
115
+ */
116
+ function getSortByValue(sortKey, reverse) {
117
+ const base = SORT_KEY_TO_SORT_BY[sortKey] ?? sortKey.toLowerCase();
118
+ if (!isDirectionalSortKey(sortKey)) return base;
119
+ return reverse ? `${base}-descending` : `${base}-ascending`;
120
+ }
121
+ /**
122
+ * Parses a Liquid-compatible `sort_by` value back into the Storefront API
123
+ * sort key and direction. Inverse of {@link getSortByValue}.
124
+ *
125
+ * @param value - A `sort_by` param value (e.g. `"price-ascending"`, `"best-selling"`)
126
+ */
127
+ function parseSortByValue(value) {
128
+ if (value.endsWith(SORT_BY_DESCENDING_SUFFIX)) return {
129
+ sortKey: SORT_BY_TO_SORT_KEY[value.slice(0, -11)],
130
+ reverse: true
131
+ };
132
+ if (value.endsWith(SORT_BY_ASCENDING_SUFFIX)) return {
133
+ sortKey: SORT_BY_TO_SORT_KEY[value.slice(0, -10)],
134
+ reverse: false
135
+ };
136
+ return {
137
+ sortKey: SORT_BY_TO_SORT_KEY[value],
138
+ reverse: false
139
+ };
140
+ }
141
+ /**
142
+ * Mirrors `parseProductFilters` from storefront-standard-events.
143
+ *
144
+ * Keep this local because Hydrogen only vendors Standard Events
145
+ * declarations, so importing CollectionUpdateEvent would require runtime JS.
146
+ */
147
+ function parseProductFilters(searchParams) {
148
+ const filters = [];
149
+ const price = {};
150
+ const minPrice = searchParams.get("filter.v.price.gte");
151
+ const maxPrice = searchParams.get("filter.v.price.lte");
152
+ if (minPrice) price.min = parseLocalizedNumber(minPrice);
153
+ if (maxPrice) price.max = parseLocalizedNumber(maxPrice);
154
+ if (price.min !== void 0 || price.max !== void 0) filters.push({ price });
155
+ const availability = searchParams.getAll("filter.v.availability");
156
+ const inStock = availability.includes("1");
157
+ const outOfStock = availability.includes("0");
158
+ if (inStock && !outOfStock) filters.push({ available: true });
159
+ if (outOfStock && !inStock) filters.push({ available: false });
160
+ for (const productType of searchParams.getAll("filter.p.product_type")) filters.push({ productType });
161
+ for (const productVendor of searchParams.getAll("filter.p.vendor")) filters.push({ productVendor });
162
+ for (const tag of searchParams.getAll("filter.p.tag")) filters.push({ tag });
163
+ for (const [key, value] of searchParams) {
164
+ let match;
165
+ if (match = key.match(/^filter\.v\.option\.(.+)$/)) {
166
+ filters.push({ variantOption: {
167
+ name: decodeFilterKeyPart(match[1]),
168
+ value
169
+ } });
170
+ continue;
171
+ }
172
+ if (match = key.match(/^filter\.p\.m\.([^.]+)\.(.+)$/)) {
173
+ filters.push({ productMetafield: {
174
+ namespace: decodeFilterKeyPart(match[1]),
175
+ key: decodeFilterKeyPart(match[2]),
176
+ value
177
+ } });
178
+ continue;
179
+ }
180
+ if (match = key.match(/^filter\.v\.m\.([^.]+)\.(.+)$/)) {
181
+ filters.push({ variantMetafield: {
182
+ namespace: decodeFilterKeyPart(match[1]),
183
+ key: decodeFilterKeyPart(match[2]),
184
+ value
185
+ } });
186
+ continue;
187
+ }
188
+ if (match = key.match(/^filter\.v\.t\.([^.]+)\.(.+)$/)) filters.push({ taxonomyMetafield: {
189
+ key: `${decodeFilterKeyPart(match[1])}.${decodeFilterKeyPart(match[2])}`,
190
+ value
191
+ } });
192
+ }
193
+ return filters;
194
+ }
195
+ /** Mirrors `getCollectionSortKey` from storefront-standard-events. */
196
+ function parseCollectionSortKey(searchParams) {
197
+ const rawSortBy = searchParams.get("sort_by");
198
+ return rawSortBy ? STANDARD_EVENTS_COLLECTION_SORT_KEY[rawSortBy] : void 0;
199
+ }
200
+ function parseLocalizedNumber(value) {
201
+ try {
202
+ const locale = typeof window !== "undefined" ? window.Shopify?.locale : void 0;
203
+ const parts = new Intl.NumberFormat(locale ?? "en").formatToParts(1234.5);
204
+ const group = parts.find((part) => part.type === "group")?.value ?? ",";
205
+ const decimal = parts.find((part) => part.type === "decimal")?.value ?? ".";
206
+ const normalized = value.split(group).join("").replace(decimal, ".");
207
+ const number = Number(normalized);
208
+ if (!Number.isNaN(number)) return number;
209
+ } catch {}
210
+ return Number(value.replace(/[^\d.]/g, "")) || 0;
211
+ }
212
+ function decodeFilterKeyPart(value) {
213
+ return decodeURIComponent(value.replace(/\+/g, " "));
214
+ }
215
+ function getFilterParamEntries(filter) {
216
+ const entries = [];
217
+ if (filter.available != null) entries.push({
218
+ key: "filter.v.availability",
219
+ value: filter.available ? "1" : "0"
220
+ });
221
+ if (filter.price) {
222
+ if (filter.price.min != null) entries.push({
223
+ key: "filter.v.price.gte",
224
+ value: String(filter.price.min)
225
+ });
226
+ if (filter.price.max != null) entries.push({
227
+ key: "filter.v.price.lte",
228
+ value: String(filter.price.max)
229
+ });
230
+ }
231
+ if (filter.productType != null) entries.push({
232
+ key: "filter.p.product_type",
233
+ value: filter.productType
234
+ });
235
+ if (filter.productVendor != null) entries.push({
236
+ key: "filter.p.vendor",
237
+ value: filter.productVendor
238
+ });
239
+ if (filter.tag != null) entries.push({
240
+ key: "filter.p.tag",
241
+ value: filter.tag
242
+ });
243
+ if (filter.variantOption) entries.push({
244
+ key: `filter.v.option.${encodeURIComponent(filter.variantOption.name)}`,
245
+ value: filter.variantOption.value ?? ""
246
+ });
247
+ if (filter.productMetafield) {
248
+ const { namespace, key, value } = filter.productMetafield;
249
+ entries.push({
250
+ key: `filter.p.m.${encodeURIComponent(namespace)}.${encodeURIComponent(key)}`,
251
+ value: value ?? ""
252
+ });
253
+ }
254
+ if (filter.variantMetafield) {
255
+ const { namespace, key, value } = filter.variantMetafield;
256
+ entries.push({
257
+ key: `filter.v.m.${encodeURIComponent(namespace)}.${encodeURIComponent(key)}`,
258
+ value: value ?? ""
259
+ });
260
+ }
261
+ if (filter.taxonomyMetafield) {
262
+ const fullKey = filter.taxonomyMetafield.key;
263
+ const dotIdx = fullKey.indexOf(".");
264
+ const ns = dotIdx >= 0 ? fullKey.slice(0, dotIdx) : fullKey;
265
+ const k = dotIdx >= 0 ? fullKey.slice(dotIdx + 1) : "";
266
+ entries.push({
267
+ key: `filter.v.t.${encodeURIComponent(ns)}.${encodeURIComponent(k)}`,
268
+ value: filter.taxonomyMetafield.value
269
+ });
270
+ }
271
+ if (filter.category) entries.push({
272
+ key: "filter.p.category",
273
+ value: filter.category.id
274
+ });
275
+ return entries;
276
+ }
277
+ function serializeFilter(params, filter) {
278
+ for (const { key, value } of getFilterParamEntries(filter)) params.append(key, value);
279
+ }
280
+ function removeFilterParams(params, filter) {
281
+ for (const { key, value } of getFilterParamEntries(filter)) removeParamValue(params, key, value);
282
+ }
283
+ function clearPaginationCursors(params) {
284
+ for (const key of PAGINATION_CURSOR_PARAMS) params.delete(key);
285
+ }
286
+ /** Compares two individual {@link ProductFilter} objects for semantic equality. */
287
+ function filterEquals(a, b) {
288
+ const kindA = filterKind(a);
289
+ if (kindA !== filterKind(b) || kindA == null) return false;
290
+ switch (kindA) {
291
+ case "tag": return a.tag === b.tag;
292
+ case "available": return a.available === b.available;
293
+ case "price": return priceRangeEquals(a.price, b.price);
294
+ case "productType": return a.productType === b.productType;
295
+ case "productVendor": return a.productVendor === b.productVendor;
296
+ case "variantOption": {
297
+ const aOpt = a.variantOption;
298
+ const bOpt = b.variantOption;
299
+ if (aOpt == null || bOpt == null) return false;
300
+ return aOpt.name === bOpt.name && (aOpt.value ?? "") === (bOpt.value ?? "");
301
+ }
302
+ case "productMetafield": {
303
+ const aMeta = a.productMetafield;
304
+ const bMeta = b.productMetafield;
305
+ if (aMeta == null || bMeta == null) return false;
306
+ return metafieldEquals(aMeta, bMeta);
307
+ }
308
+ case "variantMetafield": {
309
+ const aMeta = a.variantMetafield;
310
+ const bMeta = b.variantMetafield;
311
+ if (aMeta == null || bMeta == null) return false;
312
+ return metafieldEquals(aMeta, bMeta);
313
+ }
314
+ case "taxonomyMetafield": {
315
+ const aMeta = a.taxonomyMetafield;
316
+ const bMeta = b.taxonomyMetafield;
317
+ if (aMeta == null || bMeta == null) return false;
318
+ return aMeta.key === bMeta.key && aMeta.value === bMeta.value;
319
+ }
320
+ case "category": {
321
+ const aCat = a.category;
322
+ const bCat = b.category;
323
+ if (aCat == null || bCat == null) return false;
324
+ return aCat.id === bCat.id;
325
+ }
326
+ }
327
+ }
328
+ /** Returns `true` when `input` (a Storefront API filter JSON string) matches an active filter. */
329
+ function isFilterInputActive(activeFilters, input) {
330
+ let parsed;
331
+ try {
332
+ parsed = JSON.parse(input);
333
+ } catch {
334
+ return false;
335
+ }
336
+ return activeFilters.some((filter) => filterEquals(filter, parsed));
337
+ }
338
+ function filterKind(filter) {
339
+ if (filter.tag != null) return "tag";
340
+ if (filter.available != null) return "available";
341
+ if (filter.price != null) return "price";
342
+ if (filter.productType != null) return "productType";
343
+ if (filter.productVendor != null) return "productVendor";
344
+ if (filter.variantOption != null) return "variantOption";
345
+ if (filter.productMetafield != null) return "productMetafield";
346
+ if (filter.variantMetafield != null) return "variantMetafield";
347
+ if (filter.taxonomyMetafield != null) return "taxonomyMetafield";
348
+ if (filter.category != null) return "category";
349
+ return null;
350
+ }
351
+ function priceRangeEquals(a, b) {
352
+ if (a == null || b == null) return a === b;
353
+ return a.min === b.min && a.max === b.max;
354
+ }
355
+ function metafieldEquals(a, b) {
356
+ return a.namespace === b.namespace && a.key === b.key && (a.value ?? "") === (b.value ?? "");
357
+ }
358
+ function filtersEqual(a, b) {
359
+ if (a.length !== b.length) return false;
360
+ const remaining = [...b];
361
+ for (const filter of a) {
362
+ const index = remaining.findIndex((candidate) => filterEquals(filter, candidate));
363
+ if (index === -1) return false;
364
+ remaining.splice(index, 1);
365
+ }
366
+ return true;
367
+ }
368
+ function removeParamValue(params, name, value) {
369
+ const remaining = params.getAll(name).filter((v) => v !== value);
370
+ params.delete(name);
371
+ for (const v of remaining) params.append(name, v);
372
+ }
373
+
374
+ //#endregion
375
+ export { collectionParamsMatchState, collectionSearchEqual, filterEquals, getFilterRemovalUrl, getSortByValue, isDirectionalSortKey, isFilterInputActive, mergeCollectionParams, normalizeCollectionSearch, parseCollectionParams, parseSortByValue, serializeCollectionParams };
376
+ //# sourceMappingURL=url.mjs.map