@shopify/hydrogen 2026.4.4 → 2026.10.0-preview.1

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 (754) hide show
  1. package/README.md +73 -13
  2. package/bin/hydrogen.mjs +7 -0
  3. package/dist/cli/index.mjs +330 -0
  4. package/dist/client/client.d.mts +34 -0
  5. package/dist/client/client.mjs +193 -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 +32 -0
  50. package/dist/core/cart/cart.mjs +1687 -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 +70 -0
  87. package/dist/core/collection/url.mjs +367 -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 +44 -0
  93. package/dist/core/headers.mjs.map +1 -0
  94. package/dist/core/index.d.mts +55 -0
  95. package/dist/core/index.mjs +44 -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/form.d.mts +63 -0
  133. package/dist/core/product/form.mjs +44 -0
  134. package/dist/core/product/form.mjs.map +1 -0
  135. package/dist/core/product/index.d.mts +4 -0
  136. package/dist/core/product/options.d.mts +40 -0
  137. package/dist/core/product/options.mjs +291 -0
  138. package/dist/core/product/options.mjs.map +1 -0
  139. package/dist/core/product/product-form.d.mts +72 -0
  140. package/dist/core/product/product-form.mjs +158 -0
  141. package/dist/core/product/product-form.mjs.map +1 -0
  142. package/dist/core/product/state.d.mts +68 -0
  143. package/dist/core/request-context.d.mts +70 -0
  144. package/dist/core/request-context.mjs +120 -0
  145. package/dist/core/request-context.mjs.map +1 -0
  146. package/dist/core/request-routing/handle-shopify-redirects.d.mts +17 -0
  147. package/dist/core/request-routing/handle-shopify-redirects.mjs +31 -0
  148. package/dist/core/request-routing/handle-shopify-redirects.mjs.map +1 -0
  149. package/dist/core/request-routing/handle-shopify-routes.d.mts +14 -0
  150. package/dist/core/request-routing/handle-shopify-routes.mjs +42 -0
  151. package/dist/core/request-routing/handle-shopify-routes.mjs.map +1 -0
  152. package/dist/core/request-routing/interceptors/admin-redirect.mjs +12 -0
  153. package/dist/core/request-routing/interceptors/admin-redirect.mjs.map +1 -0
  154. package/dist/core/request-routing/interceptors/agent-proxy.mjs +19 -0
  155. package/dist/core/request-routing/interceptors/agent-proxy.mjs.map +1 -0
  156. package/dist/core/request-routing/interceptors/ajax-api.mjs +16 -0
  157. package/dist/core/request-routing/interceptors/ajax-api.mjs.map +1 -0
  158. package/dist/core/request-routing/interceptors/api-proxy.mjs +20 -0
  159. package/dist/core/request-routing/interceptors/api-proxy.mjs.map +1 -0
  160. package/dist/core/request-routing/interceptors/checkout.mjs +58 -0
  161. package/dist/core/request-routing/interceptors/checkout.mjs.map +1 -0
  162. package/dist/core/request-routing/interceptors/mcp-proxy.mjs +23 -0
  163. package/dist/core/request-routing/interceptors/mcp-proxy.mjs.map +1 -0
  164. package/dist/core/request-routing/interceptors/proxy.mjs +68 -0
  165. package/dist/core/request-routing/interceptors/proxy.mjs.map +1 -0
  166. package/dist/core/request-routing/interceptors/query-param-redirect.mjs +22 -0
  167. package/dist/core/request-routing/interceptors/query-param-redirect.mjs.map +1 -0
  168. package/dist/core/request-routing/interceptors/sfapi-proxy.mjs +27 -0
  169. package/dist/core/request-routing/interceptors/sfapi-proxy.mjs.map +1 -0
  170. package/dist/core/request-routing/interceptors/standard-routes.mjs +19 -0
  171. package/dist/core/request-routing/interceptors/standard-routes.mjs.map +1 -0
  172. package/dist/core/request-routing/interceptors/url-redirects.mjs +27 -0
  173. package/dist/core/request-routing/interceptors/url-redirects.mjs.map +1 -0
  174. package/dist/core/request-routing/interceptors/well-known.mjs +19 -0
  175. package/dist/core/request-routing/interceptors/well-known.mjs.map +1 -0
  176. package/dist/core/request-routing/registered-routes.d.mts +7 -0
  177. package/dist/core/request-routing/registered-routes.mjs +59 -0
  178. package/dist/core/request-routing/registered-routes.mjs.map +1 -0
  179. package/dist/core/request-routing/route-types.d.mts +51 -0
  180. package/dist/core/request-routing/safe-apply-response-headers.mjs +16 -0
  181. package/dist/core/request-routing/safe-apply-response-headers.mjs.map +1 -0
  182. package/dist/core/shop-pay/shop-pay.d.mts +102 -0
  183. package/dist/core/shop-pay/shop-pay.mjs +289 -0
  184. package/dist/core/shop-pay/shop-pay.mjs.map +1 -0
  185. package/dist/core/shopify-scripts/analytics.mjs +26 -0
  186. package/dist/core/shopify-scripts/analytics.mjs.map +1 -0
  187. package/dist/core/shopify-scripts/consent.mjs +17 -0
  188. package/dist/core/shopify-scripts/consent.mjs.map +1 -0
  189. package/dist/core/shopify-scripts/constants.mjs +19 -0
  190. package/dist/core/shopify-scripts/constants.mjs.map +1 -0
  191. package/dist/core/shopify-scripts/deprecated-cookies.mjs +97 -0
  192. package/dist/core/shopify-scripts/deprecated-cookies.mjs.map +1 -0
  193. package/dist/core/shopify-scripts/global.d.mts +1 -0
  194. package/dist/core/shopify-scripts/global.mjs +86 -0
  195. package/dist/core/shopify-scripts/global.mjs.map +1 -0
  196. package/dist/core/shopify-scripts/index.d.mts +27 -0
  197. package/dist/core/shopify-scripts/index.mjs +135 -0
  198. package/dist/core/shopify-scripts/index.mjs.map +1 -0
  199. package/dist/core/shopify-scripts/initialize.d.mts +18 -0
  200. package/dist/core/shopify-scripts/initialize.mjs +27 -0
  201. package/dist/core/shopify-scripts/initialize.mjs.map +1 -0
  202. package/dist/core/shopify-scripts/page-view.mjs +49 -0
  203. package/dist/core/shopify-scripts/page-view.mjs.map +1 -0
  204. package/dist/core/shopify-scripts/perfkit.mjs +33 -0
  205. package/dist/core/shopify-scripts/perfkit.mjs.map +1 -0
  206. package/dist/core/shopify-scripts/render.d.mts +1 -0
  207. package/dist/core/shopify-scripts/render.mjs +23 -0
  208. package/dist/core/shopify-scripts/render.mjs.map +1 -0
  209. package/dist/core/shopify-scripts/types.d.mts +76 -0
  210. package/dist/core/shopify-scripts/utils/cookie-domain.mjs +43 -0
  211. package/dist/core/shopify-scripts/utils/cookie-domain.mjs.map +1 -0
  212. package/dist/core/shopify-scripts/utils/inline-script.mjs +8 -0
  213. package/dist/core/shopify-scripts/utils/inline-script.mjs.map +1 -0
  214. package/dist/core/shopify-scripts/utils/navigation.mjs +46 -0
  215. package/dist/core/shopify-scripts/utils/navigation.mjs.map +1 -0
  216. package/dist/core/shopify-scripts/utils/tracking-values.mjs +65 -0
  217. package/dist/core/shopify-scripts/utils/tracking-values.mjs.map +1 -0
  218. package/dist/core/shopify-scripts/utils/uuid.mjs +17 -0
  219. package/dist/core/shopify-scripts/utils/uuid.mjs.map +1 -0
  220. package/dist/core/shopify-scripts/webmcp.mjs +22 -0
  221. package/dist/core/shopify-scripts/webmcp.mjs.map +1 -0
  222. package/dist/core/standard-routes/build.d.mts +34 -0
  223. package/dist/core/standard-routes/build.mjs +54 -0
  224. package/dist/core/standard-routes/build.mjs.map +1 -0
  225. package/dist/core/standard-routes/defaults.mjs +31 -0
  226. package/dist/core/standard-routes/defaults.mjs.map +1 -0
  227. package/dist/core/standard-routes/match.mjs +108 -0
  228. package/dist/core/standard-routes/match.mjs.map +1 -0
  229. package/dist/core/standard-routes/path.mjs +58 -0
  230. package/dist/core/standard-routes/path.mjs.map +1 -0
  231. package/dist/core/standard-routes/redirects.mjs +51 -0
  232. package/dist/core/standard-routes/redirects.mjs.map +1 -0
  233. package/dist/core/standard-routes/types.d.mts +95 -0
  234. package/dist/core/url.mjs +35 -0
  235. package/dist/core/url.mjs.map +1 -0
  236. package/dist/core/utils/load-script.mjs +34 -0
  237. package/dist/core/utils/load-script.mjs.map +1 -0
  238. package/dist/core/utils/parse-gid.mjs +33 -0
  239. package/dist/core/utils/parse-gid.mjs.map +1 -0
  240. package/dist/core/utils/record.mjs +8 -0
  241. package/dist/core/utils/record.mjs.map +1 -0
  242. package/dist/customer-account/client.d.mts +50 -0
  243. package/dist/customer-account/client.mjs +239 -0
  244. package/dist/customer-account/client.mjs.map +1 -0
  245. package/dist/customer-account/errors.d.mts +28 -0
  246. package/dist/customer-account/errors.mjs +39 -0
  247. package/dist/customer-account/errors.mjs.map +1 -0
  248. package/dist/customer-account/graphql.d.mts +29 -0
  249. package/dist/customer-account/graphql.mjs +39 -0
  250. package/dist/customer-account/graphql.mjs.map +1 -0
  251. package/dist/customer-account/index.d.mts +7 -0
  252. package/dist/customer-account/index.mjs +7 -0
  253. package/dist/customer-account/session.d.mts +117 -0
  254. package/dist/customer-account/session.mjs +733 -0
  255. package/dist/customer-account/session.mjs.map +1 -0
  256. package/dist/customer-account/type-resolver.d.mts +11 -0
  257. package/dist/customer-account-api-types.d.ts +3269 -3270
  258. package/dist/customer-account.schema.json +50753 -1
  259. package/dist/development/_virtual/_@oxc-project_runtime@0.127.0/helpers/taggedTemplateLiteral.mjs +7 -0
  260. package/dist/development/client/client.d.mts +34 -0
  261. package/dist/development/client/client.mjs +193 -0
  262. package/dist/development/client/client.mjs.map +1 -0
  263. package/dist/development/client/errors.d.mts +48 -0
  264. package/dist/development/client/errors.mjs +57 -0
  265. package/dist/development/client/errors.mjs.map +1 -0
  266. package/dist/development/client/index.d.mts +4 -0
  267. package/dist/development/client/types.d.mts +147 -0
  268. package/dist/development/core/analytics/cart-tracker.d.mts +8 -0
  269. package/dist/development/core/analytics/cart-tracker.mjs +144 -0
  270. package/dist/development/core/analytics/cart-tracker.mjs.map +1 -0
  271. package/dist/development/core/analytics/events.d.mts +15 -0
  272. package/dist/development/core/analytics/events.mjs +15 -0
  273. package/dist/development/core/analytics/events.mjs.map +1 -0
  274. package/dist/development/core/analytics/index.d.mts +3 -0
  275. package/dist/development/core/analytics/types.d.mts +143 -0
  276. package/dist/development/core/analytics/utils/flatten-connection.d.mts +19 -0
  277. package/dist/development/core/analytics/utils/flatten-connection.mjs +25 -0
  278. package/dist/development/core/analytics/utils/flatten-connection.mjs.map +1 -0
  279. package/dist/development/core/cache/cache-status.mjs +17 -0
  280. package/dist/development/core/cache/cache-status.mjs.map +1 -0
  281. package/dist/development/core/cache/fetch-with-cache.d.mts +43 -0
  282. package/dist/development/core/cache/fetch-with-cache.mjs +188 -0
  283. package/dist/development/core/cache/fetch-with-cache.mjs.map +1 -0
  284. package/dist/development/core/cache/key.d.mts +6 -0
  285. package/dist/development/core/cache/key.mjs +27 -0
  286. package/dist/development/core/cache/key.mjs.map +1 -0
  287. package/dist/development/core/cache/run-with-cache.d.mts +36 -0
  288. package/dist/development/core/cache/run-with-cache.mjs +114 -0
  289. package/dist/development/core/cache/run-with-cache.mjs.map +1 -0
  290. package/dist/development/core/cache/store.d.mts +19 -0
  291. package/dist/development/core/cache/store.mjs +62 -0
  292. package/dist/development/core/cache/store.mjs.map +1 -0
  293. package/dist/development/core/cache/strategies.d.mts +39 -0
  294. package/dist/development/core/cache/strategies.mjs +70 -0
  295. package/dist/development/core/cache/strategies.mjs.map +1 -0
  296. package/dist/development/core/cart/actions.d.mts +50 -0
  297. package/dist/development/core/cart/actions.mjs +240 -0
  298. package/dist/development/core/cart/actions.mjs.map +1 -0
  299. package/dist/development/core/cart/attach-quantity-input.d.mts +5 -0
  300. package/dist/development/core/cart/attach-quantity-input.mjs +17 -0
  301. package/dist/development/core/cart/attach-quantity-input.mjs.map +1 -0
  302. package/dist/development/core/cart/buyer-identity-sync.d.mts +19 -0
  303. package/dist/development/core/cart/buyer-identity-sync.mjs +6 -0
  304. package/dist/development/core/cart/buyer-identity-sync.mjs.map +1 -0
  305. package/dist/development/core/cart/cart.d.mts +32 -0
  306. package/dist/development/core/cart/cart.mjs +1687 -0
  307. package/dist/development/core/cart/cart.mjs.map +1 -0
  308. package/dist/development/core/cart/cookie.d.mts +5 -0
  309. package/dist/development/core/cart/cookie.mjs +28 -0
  310. package/dist/development/core/cart/cookie.mjs.map +1 -0
  311. package/dist/development/core/cart/form.d.mts +130 -0
  312. package/dist/development/core/cart/form.mjs +75 -0
  313. package/dist/development/core/cart/form.mjs.map +1 -0
  314. package/dist/development/core/cart/get-cart.d.mts +25 -0
  315. package/dist/development/core/cart/get-cart.mjs +32 -0
  316. package/dist/development/core/cart/get-cart.mjs.map +1 -0
  317. package/dist/development/core/cart/index.d.mts +10 -0
  318. package/dist/development/core/cart/quantity.d.mts +10 -0
  319. package/dist/development/core/cart/quantity.mjs +14 -0
  320. package/dist/development/core/cart/quantity.mjs.map +1 -0
  321. package/dist/development/core/cart/queries.d.mts +4296 -0
  322. package/dist/development/core/cart/queries.mjs +70 -0
  323. package/dist/development/core/cart/queries.mjs.map +1 -0
  324. package/dist/development/core/cart/server-handlers.d.mts +82 -0
  325. package/dist/development/core/cart/server-handlers.mjs +322 -0
  326. package/dist/development/core/cart/server-handlers.mjs.map +1 -0
  327. package/dist/development/core/cart/state.d.mts +137 -0
  328. package/dist/development/core/cart/state.mjs +76 -0
  329. package/dist/development/core/cart/state.mjs.map +1 -0
  330. package/dist/development/core/cart/sync-quantity-inputs.mjs +16 -0
  331. package/dist/development/core/cart/sync-quantity-inputs.mjs.map +1 -0
  332. package/dist/development/core/collection/collection.d.mts +134 -0
  333. package/dist/development/core/collection/collection.mjs +170 -0
  334. package/dist/development/core/collection/collection.mjs.map +1 -0
  335. package/dist/development/core/collection/index.d.mts +6 -0
  336. package/dist/development/core/collection/reconciler.d.mts +32 -0
  337. package/dist/development/core/collection/reconciler.mjs +89 -0
  338. package/dist/development/core/collection/reconciler.mjs.map +1 -0
  339. package/dist/development/core/collection/state.d.mts +66 -0
  340. package/dist/development/core/collection/state.mjs +20 -0
  341. package/dist/development/core/collection/state.mjs.map +1 -0
  342. package/dist/development/core/collection/url.d.mts +70 -0
  343. package/dist/development/core/collection/url.mjs +367 -0
  344. package/dist/development/core/collection/url.mjs.map +1 -0
  345. package/dist/development/core/constants.mjs +7 -0
  346. package/dist/development/core/constants.mjs.map +1 -0
  347. package/dist/development/core/development.d.mts +55 -0
  348. package/dist/development/core/development.mjs +44 -0
  349. package/dist/development/core/headers.mjs +44 -0
  350. package/dist/development/core/headers.mjs.map +1 -0
  351. package/dist/development/core/index.d.mts +53 -0
  352. package/dist/development/core/logging/logging.d.mts +21 -0
  353. package/dist/development/core/logging/logging.mjs +99 -0
  354. package/dist/development/core/logging/logging.mjs.map +1 -0
  355. package/dist/development/core/logging/types.d.mts +40 -0
  356. package/dist/development/core/logging/types.mjs +18 -0
  357. package/dist/development/core/logging/types.mjs.map +1 -0
  358. package/dist/development/core/money/cache.mjs +25 -0
  359. package/dist/development/core/money/cache.mjs.map +1 -0
  360. package/dist/development/core/money/format.d.mts +15 -0
  361. package/dist/development/core/money/format.mjs +243 -0
  362. package/dist/development/core/money/format.mjs.map +1 -0
  363. package/dist/development/core/money/types.d.mts +47 -0
  364. package/dist/development/core/observable.mjs +46 -0
  365. package/dist/development/core/observable.mjs.map +1 -0
  366. package/dist/development/core/predictive-search/constants.d.mts +5 -0
  367. package/dist/development/core/predictive-search/constants.mjs +6 -0
  368. package/dist/development/core/predictive-search/constants.mjs.map +1 -0
  369. package/dist/development/core/predictive-search/form.d.mts +31 -0
  370. package/dist/development/core/predictive-search/form.mjs +31 -0
  371. package/dist/development/core/predictive-search/form.mjs.map +1 -0
  372. package/dist/development/core/predictive-search/index.d.mts +6 -0
  373. package/dist/development/core/predictive-search/queries.d.mts +118 -0
  374. package/dist/development/core/predictive-search/queries.mjs +81 -0
  375. package/dist/development/core/predictive-search/queries.mjs.map +1 -0
  376. package/dist/development/core/predictive-search/search.d.mts +32 -0
  377. package/dist/development/core/predictive-search/search.mjs +74 -0
  378. package/dist/development/core/predictive-search/search.mjs.map +1 -0
  379. package/dist/development/core/predictive-search/server-handlers.d.mts +36 -0
  380. package/dist/development/core/predictive-search/server-handlers.mjs +113 -0
  381. package/dist/development/core/predictive-search/server-handlers.mjs.map +1 -0
  382. package/dist/development/core/predictive-search/store.d.mts +44 -0
  383. package/dist/development/core/predictive-search/store.mjs +224 -0
  384. package/dist/development/core/predictive-search/store.mjs.map +1 -0
  385. package/dist/development/core/predictive-search/url.d.mts +41 -0
  386. package/dist/development/core/predictive-search/url.mjs +71 -0
  387. package/dist/development/core/predictive-search/url.mjs.map +1 -0
  388. package/dist/development/core/product/form.d.mts +63 -0
  389. package/dist/development/core/product/form.mjs +44 -0
  390. package/dist/development/core/product/form.mjs.map +1 -0
  391. package/dist/development/core/product/index.d.mts +4 -0
  392. package/dist/development/core/product/options.d.mts +40 -0
  393. package/dist/development/core/product/options.mjs +291 -0
  394. package/dist/development/core/product/options.mjs.map +1 -0
  395. package/dist/development/core/product/product-form.d.mts +72 -0
  396. package/dist/development/core/product/product-form.mjs +158 -0
  397. package/dist/development/core/product/product-form.mjs.map +1 -0
  398. package/dist/development/core/product/state.d.mts +68 -0
  399. package/dist/development/core/request-context.d.mts +70 -0
  400. package/dist/development/core/request-context.mjs +120 -0
  401. package/dist/development/core/request-context.mjs.map +1 -0
  402. package/dist/development/core/request-routing/handle-shopify-redirects.d.mts +17 -0
  403. package/dist/development/core/request-routing/handle-shopify-redirects.mjs +31 -0
  404. package/dist/development/core/request-routing/handle-shopify-redirects.mjs.map +1 -0
  405. package/dist/development/core/request-routing/handle-shopify-routes.d.mts +1 -0
  406. package/dist/development/core/request-routing/handle-shopify-routes.development.d.mts +11 -0
  407. package/dist/development/core/request-routing/handle-shopify-routes.development.mjs +16 -0
  408. package/dist/development/core/request-routing/handle-shopify-routes.development.mjs.map +1 -0
  409. package/dist/development/core/request-routing/handle-shopify-routes.mjs +42 -0
  410. package/dist/development/core/request-routing/handle-shopify-routes.mjs.map +1 -0
  411. package/dist/development/core/request-routing/interceptors/admin-redirect.mjs +12 -0
  412. package/dist/development/core/request-routing/interceptors/admin-redirect.mjs.map +1 -0
  413. package/dist/development/core/request-routing/interceptors/agent-proxy.mjs +19 -0
  414. package/dist/development/core/request-routing/interceptors/agent-proxy.mjs.map +1 -0
  415. package/dist/development/core/request-routing/interceptors/ajax-api.mjs +16 -0
  416. package/dist/development/core/request-routing/interceptors/ajax-api.mjs.map +1 -0
  417. package/dist/development/core/request-routing/interceptors/api-proxy.mjs +20 -0
  418. package/dist/development/core/request-routing/interceptors/api-proxy.mjs.map +1 -0
  419. package/dist/development/core/request-routing/interceptors/checkout.mjs +58 -0
  420. package/dist/development/core/request-routing/interceptors/checkout.mjs.map +1 -0
  421. package/dist/development/core/request-routing/interceptors/graphiql.mjs +46 -0
  422. package/dist/development/core/request-routing/interceptors/graphiql.mjs.map +1 -0
  423. package/dist/development/core/request-routing/interceptors/mcp-proxy.mjs +23 -0
  424. package/dist/development/core/request-routing/interceptors/mcp-proxy.mjs.map +1 -0
  425. package/dist/development/core/request-routing/interceptors/proxy.mjs +68 -0
  426. package/dist/development/core/request-routing/interceptors/proxy.mjs.map +1 -0
  427. package/dist/development/core/request-routing/interceptors/query-param-redirect.mjs +22 -0
  428. package/dist/development/core/request-routing/interceptors/query-param-redirect.mjs.map +1 -0
  429. package/dist/development/core/request-routing/interceptors/sfapi-proxy.mjs +27 -0
  430. package/dist/development/core/request-routing/interceptors/sfapi-proxy.mjs.map +1 -0
  431. package/dist/development/core/request-routing/interceptors/standard-routes.mjs +19 -0
  432. package/dist/development/core/request-routing/interceptors/standard-routes.mjs.map +1 -0
  433. package/dist/development/core/request-routing/interceptors/url-redirects.mjs +27 -0
  434. package/dist/development/core/request-routing/interceptors/url-redirects.mjs.map +1 -0
  435. package/dist/development/core/request-routing/interceptors/well-known.mjs +19 -0
  436. package/dist/development/core/request-routing/interceptors/well-known.mjs.map +1 -0
  437. package/dist/development/core/request-routing/registered-routes.d.mts +7 -0
  438. package/dist/development/core/request-routing/registered-routes.mjs +59 -0
  439. package/dist/development/core/request-routing/registered-routes.mjs.map +1 -0
  440. package/dist/development/core/request-routing/route-types.d.mts +51 -0
  441. package/dist/development/core/request-routing/safe-apply-response-headers.mjs +16 -0
  442. package/dist/development/core/request-routing/safe-apply-response-headers.mjs.map +1 -0
  443. package/dist/development/core/shop-pay/shop-pay.d.mts +102 -0
  444. package/dist/development/core/shop-pay/shop-pay.mjs +289 -0
  445. package/dist/development/core/shop-pay/shop-pay.mjs.map +1 -0
  446. package/dist/development/core/shopify-scripts/analytics.mjs +26 -0
  447. package/dist/development/core/shopify-scripts/analytics.mjs.map +1 -0
  448. package/dist/development/core/shopify-scripts/consent.mjs +17 -0
  449. package/dist/development/core/shopify-scripts/consent.mjs.map +1 -0
  450. package/dist/development/core/shopify-scripts/constants.mjs +19 -0
  451. package/dist/development/core/shopify-scripts/constants.mjs.map +1 -0
  452. package/dist/development/core/shopify-scripts/deprecated-cookies.mjs +97 -0
  453. package/dist/development/core/shopify-scripts/deprecated-cookies.mjs.map +1 -0
  454. package/dist/development/core/shopify-scripts/global.d.mts +1 -0
  455. package/dist/development/core/shopify-scripts/global.mjs +86 -0
  456. package/dist/development/core/shopify-scripts/global.mjs.map +1 -0
  457. package/dist/development/core/shopify-scripts/index.d.mts +27 -0
  458. package/dist/development/core/shopify-scripts/index.mjs +145 -0
  459. package/dist/development/core/shopify-scripts/index.mjs.map +1 -0
  460. package/dist/development/core/shopify-scripts/initialize.d.mts +18 -0
  461. package/dist/development/core/shopify-scripts/initialize.mjs +27 -0
  462. package/dist/development/core/shopify-scripts/initialize.mjs.map +1 -0
  463. package/dist/development/core/shopify-scripts/page-view.mjs +49 -0
  464. package/dist/development/core/shopify-scripts/page-view.mjs.map +1 -0
  465. package/dist/development/core/shopify-scripts/perfkit.mjs +33 -0
  466. package/dist/development/core/shopify-scripts/perfkit.mjs.map +1 -0
  467. package/dist/development/core/shopify-scripts/render.d.mts +1 -0
  468. package/dist/development/core/shopify-scripts/render.mjs +23 -0
  469. package/dist/development/core/shopify-scripts/render.mjs.map +1 -0
  470. package/dist/development/core/shopify-scripts/types.d.mts +76 -0
  471. package/dist/development/core/shopify-scripts/utils/cookie-domain.mjs +43 -0
  472. package/dist/development/core/shopify-scripts/utils/cookie-domain.mjs.map +1 -0
  473. package/dist/development/core/shopify-scripts/utils/inline-script.mjs +8 -0
  474. package/dist/development/core/shopify-scripts/utils/inline-script.mjs.map +1 -0
  475. package/dist/development/core/shopify-scripts/utils/navigation.mjs +46 -0
  476. package/dist/development/core/shopify-scripts/utils/navigation.mjs.map +1 -0
  477. package/dist/development/core/shopify-scripts/utils/tracking-values.mjs +65 -0
  478. package/dist/development/core/shopify-scripts/utils/tracking-values.mjs.map +1 -0
  479. package/dist/development/core/shopify-scripts/utils/uuid.mjs +17 -0
  480. package/dist/development/core/shopify-scripts/utils/uuid.mjs.map +1 -0
  481. package/dist/development/core/shopify-scripts/webmcp.mjs +22 -0
  482. package/dist/development/core/shopify-scripts/webmcp.mjs.map +1 -0
  483. package/dist/development/core/standard-routes/build.d.mts +34 -0
  484. package/dist/development/core/standard-routes/build.mjs +54 -0
  485. package/dist/development/core/standard-routes/build.mjs.map +1 -0
  486. package/dist/development/core/standard-routes/defaults.mjs +31 -0
  487. package/dist/development/core/standard-routes/defaults.mjs.map +1 -0
  488. package/dist/development/core/standard-routes/match.mjs +108 -0
  489. package/dist/development/core/standard-routes/match.mjs.map +1 -0
  490. package/dist/development/core/standard-routes/path.mjs +58 -0
  491. package/dist/development/core/standard-routes/path.mjs.map +1 -0
  492. package/dist/development/core/standard-routes/redirects.mjs +51 -0
  493. package/dist/development/core/standard-routes/redirects.mjs.map +1 -0
  494. package/dist/development/core/standard-routes/types.d.mts +95 -0
  495. package/dist/development/core/types.d.mts +11 -0
  496. package/dist/development/core/url.mjs +35 -0
  497. package/dist/development/core/url.mjs.map +1 -0
  498. package/dist/development/core/utils/load-script.mjs +34 -0
  499. package/dist/development/core/utils/load-script.mjs.map +1 -0
  500. package/dist/development/core/utils/parse-gid.mjs +33 -0
  501. package/dist/development/core/utils/parse-gid.mjs.map +1 -0
  502. package/dist/development/customer-account/session.d.mts +46 -0
  503. package/dist/development/customer-account/session.mjs +21 -0
  504. package/dist/development/customer-account/session.mjs.map +1 -0
  505. package/dist/development/globals.d.mts +64 -0
  506. package/dist/development/graphql/generated/customer-account-api-types.d.mts +13 -0
  507. package/dist/development/graphql/generated/graphql-env.d.mts +19280 -0
  508. package/dist/development/graphql/generated/storefront-api-types.d.mts +47 -0
  509. package/dist/development/graphql/graphql.d.mts +40 -0
  510. package/dist/development/graphql/graphql.mjs +16 -0
  511. package/dist/development/graphql/graphql.mjs.map +1 -0
  512. package/dist/development/graphql/index.d.mts +2 -0
  513. package/dist/development/graphql/scalars.d.mts +15 -0
  514. package/dist/development/graphql/type-resolver.d.mts +229 -0
  515. package/dist/development/react/cart.d.mts +40 -0
  516. package/dist/development/react/cart.mjs +150 -0
  517. package/dist/development/react/cart.mjs.map +1 -0
  518. package/dist/development/react/collection.d.mts +91 -0
  519. package/dist/development/react/collection.mjs +129 -0
  520. package/dist/development/react/collection.mjs.map +1 -0
  521. package/dist/development/react/index.d.mts +13 -0
  522. package/dist/development/react/index.mjs +10 -0
  523. package/dist/development/react/predictive-search.d.mts +49 -0
  524. package/dist/development/react/predictive-search.mjs +133 -0
  525. package/dist/development/react/predictive-search.mjs.map +1 -0
  526. package/dist/development/react/product.d.mts +72 -0
  527. package/dist/development/react/product.mjs +127 -0
  528. package/dist/development/react/product.mjs.map +1 -0
  529. package/dist/development/react/shop-pay.d.mts +9 -0
  530. package/dist/development/react/shop-pay.mjs +16 -0
  531. package/dist/development/react/shop-pay.mjs.map +1 -0
  532. package/dist/development/react/shopify-scripts.d.mts +20 -0
  533. package/dist/development/react/shopify-scripts.mjs +39 -0
  534. package/dist/development/react/shopify-scripts.mjs.map +1 -0
  535. package/dist/development/vendor/standard-actions.d.mts +134 -0
  536. package/dist/development/vendor/standard-events.d.mts +1107 -0
  537. package/dist/development/vue/cart.d.mts +42 -0
  538. package/dist/development/vue/cart.mjs +118 -0
  539. package/dist/development/vue/cart.mjs.map +1 -0
  540. package/dist/development/vue/collection.d.mts +46 -0
  541. package/dist/development/vue/collection.mjs +108 -0
  542. package/dist/development/vue/collection.mjs.map +1 -0
  543. package/dist/development/vue/index.d.mts +11 -0
  544. package/dist/development/vue/index.mjs +8 -0
  545. package/dist/development/vue/predictive-search.d.mts +124 -0
  546. package/dist/development/vue/predictive-search.mjs +171 -0
  547. package/dist/development/vue/predictive-search.mjs.map +1 -0
  548. package/dist/development/vue/product.d.mts +57 -0
  549. package/dist/development/vue/product.mjs +167 -0
  550. package/dist/development/vue/product.mjs.map +1 -0
  551. package/dist/development/vue/shop-pay.d.mts +25 -0
  552. package/dist/development/vue/shop-pay.mjs +35 -0
  553. package/dist/development/vue/shop-pay.mjs.map +1 -0
  554. package/dist/development/vue/shopify-scripts.d.mts +127 -0
  555. package/dist/development/vue/shopify-scripts.mjs +79 -0
  556. package/dist/development/vue/shopify-scripts.mjs.map +1 -0
  557. package/dist/globals.d.mts +64 -0
  558. package/dist/graphql/generated/customer-account-api-types.d.mts +13 -0
  559. package/dist/graphql/generated/customer-account-graphql-env.d.mts +22170 -0
  560. package/dist/graphql/generated/graphql-env.d.mts +19280 -0
  561. package/dist/graphql/generated/storefront-api-types.d.mts +47 -0
  562. package/dist/graphql/graphql.d.mts +40 -0
  563. package/dist/graphql/graphql.mjs +16 -0
  564. package/dist/graphql/graphql.mjs.map +1 -0
  565. package/dist/graphql/index.d.mts +2 -0
  566. package/dist/graphql/scalars.d.mts +26 -0
  567. package/dist/graphql/type-resolver.d.mts +229 -0
  568. package/dist/react/cart.d.mts +40 -0
  569. package/dist/react/cart.mjs +150 -0
  570. package/dist/react/cart.mjs.map +1 -0
  571. package/dist/react/collection.d.mts +91 -0
  572. package/dist/react/collection.mjs +129 -0
  573. package/dist/react/collection.mjs.map +1 -0
  574. package/dist/react/index.d.mts +13 -0
  575. package/dist/react/index.mjs +10 -0
  576. package/dist/react/predictive-search.d.mts +49 -0
  577. package/dist/react/predictive-search.mjs +133 -0
  578. package/dist/react/predictive-search.mjs.map +1 -0
  579. package/dist/react/product.d.mts +72 -0
  580. package/dist/react/product.mjs +127 -0
  581. package/dist/react/product.mjs.map +1 -0
  582. package/dist/react/shop-pay.d.mts +9 -0
  583. package/dist/react/shop-pay.mjs +16 -0
  584. package/dist/react/shop-pay.mjs.map +1 -0
  585. package/dist/react/shopify-scripts.d.mts +20 -0
  586. package/dist/react/shopify-scripts.mjs +39 -0
  587. package/dist/react/shopify-scripts.mjs.map +1 -0
  588. package/dist/storefront-api-types.d.ts +2351 -2390
  589. package/dist/storefront.schema.json +41534 -1
  590. package/dist/ts-plugin/index.cjs +68 -0
  591. package/dist/ts-plugin/index.cjs.map +1 -0
  592. package/dist/ts-plugin/index.d.cts +4 -0
  593. package/dist/vendor/standard-actions.d.mts +134 -0
  594. package/dist/vendor/standard-events.d.mts +1107 -0
  595. package/dist/vite/index.d.mts +2 -0
  596. package/dist/vite/index.mjs +3 -0
  597. package/dist/vite/local-https.d.mts +35 -0
  598. package/dist/vite/local-https.mjs +202 -0
  599. package/dist/vite/local-https.mjs.map +1 -0
  600. package/dist/vue/cart.d.mts +42 -0
  601. package/dist/vue/cart.mjs +118 -0
  602. package/dist/vue/cart.mjs.map +1 -0
  603. package/dist/vue/collection.d.mts +46 -0
  604. package/dist/vue/collection.mjs +108 -0
  605. package/dist/vue/collection.mjs.map +1 -0
  606. package/dist/vue/index.d.mts +11 -0
  607. package/dist/vue/index.mjs +8 -0
  608. package/dist/vue/predictive-search.d.mts +124 -0
  609. package/dist/vue/predictive-search.mjs +171 -0
  610. package/dist/vue/predictive-search.mjs.map +1 -0
  611. package/dist/vue/product.d.mts +57 -0
  612. package/dist/vue/product.mjs +167 -0
  613. package/dist/vue/product.mjs.map +1 -0
  614. package/dist/vue/shop-pay.d.mts +25 -0
  615. package/dist/vue/shop-pay.mjs +35 -0
  616. package/dist/vue/shop-pay.mjs.map +1 -0
  617. package/dist/vue/shopify-scripts.d.mts +127 -0
  618. package/dist/vue/shopify-scripts.mjs +79 -0
  619. package/dist/vue/shopify-scripts.mjs.map +1 -0
  620. package/package.json +116 -86
  621. package/skills/hydrogen-analytics/SKILL.md +80 -0
  622. package/skills/hydrogen-analytics/references/react.md +160 -0
  623. package/skills/hydrogen-analytics/references/vue.md +80 -0
  624. package/skills/hydrogen-cart-drawer/SKILL.md +248 -0
  625. package/skills/hydrogen-cart-drawer/references/accessibility.md +109 -0
  626. package/skills/hydrogen-cart-drawer/references/css.md +67 -0
  627. package/skills/hydrogen-cart-ui/SKILL.md +218 -0
  628. package/skills/hydrogen-cart-ui/references/nextjs.md +89 -0
  629. package/skills/hydrogen-cart-ui/references/react.md +263 -0
  630. package/skills/hydrogen-cart-ui/references/vue.md +204 -0
  631. package/skills/hydrogen-collection-browser/SKILL.md +80 -0
  632. package/skills/hydrogen-collection-browser/references/nextjs.md +118 -0
  633. package/skills/hydrogen-collection-browser/references/nuxt.md +108 -0
  634. package/skills/hydrogen-collection-browser/references/react.md +237 -0
  635. package/skills/hydrogen-customer-account/SKILL.md +107 -0
  636. package/skills/hydrogen-image/SKILL.md +65 -0
  637. package/skills/hydrogen-local-https/SKILL.md +144 -0
  638. package/skills/hydrogen-markets/SKILL.md +221 -0
  639. package/skills/hydrogen-markets/references/nextjs.md +157 -0
  640. package/skills/hydrogen-money/SKILL.md +67 -0
  641. package/skills/hydrogen-oxygen/SKILL.md +245 -0
  642. package/skills/hydrogen-oxygen/references/react-router.md +230 -0
  643. package/skills/hydrogen-predictive-search/SKILL.md +130 -0
  644. package/skills/hydrogen-predictive-search/references/react.md +32 -0
  645. package/skills/hydrogen-predictive-search/references/vue.md +40 -0
  646. package/skills/hydrogen-request-handlers/SKILL.md +90 -0
  647. package/skills/hydrogen-request-handlers/references/frameworks.md +174 -0
  648. package/skills/hydrogen-request-handlers/references/nextjs.md +136 -0
  649. package/skills/hydrogen-request-handlers/references/nuxt.md +214 -0
  650. package/skills/hydrogen-routing/SKILL.md +154 -0
  651. package/skills/hydrogen-setup/SKILL.md +50 -0
  652. package/skills/hydrogen-setup/references/analytics.md +624 -0
  653. package/skills/hydrogen-setup/steps/1-inspect-app.md +62 -0
  654. package/skills/hydrogen-setup/steps/10-analytics.md +10 -0
  655. package/skills/hydrogen-setup/steps/11-verify.md +31 -0
  656. package/skills/hydrogen-setup/steps/2-scaffold.md +86 -0
  657. package/skills/hydrogen-setup/steps/3-build-home-page.md +37 -0
  658. package/skills/hydrogen-setup/steps/4-collection-and-search.md +13 -0
  659. package/skills/hydrogen-setup/steps/5-cart.md +10 -0
  660. package/skills/hydrogen-setup/steps/6-product-detail-page.md +390 -0
  661. package/skills/hydrogen-setup/steps/7-shopify-runtime-scripts.md +69 -0
  662. package/skills/hydrogen-setup/steps/8-cart-drawer-and-navbar.md +35 -0
  663. package/skills/hydrogen-setup/steps/9-account-page.md +54 -0
  664. package/skills/hydrogen-shop-pay/SKILL.md +79 -0
  665. package/skills/hydrogen-shop-pay/references/core.md +66 -0
  666. package/skills/hydrogen-shop-pay/references/react.md +50 -0
  667. package/skills/hydrogen-shop-pay/references/vue.md +39 -0
  668. package/skills/hydrogen-smoke-test/SKILL.md +203 -0
  669. package/skills/hydrogen-storefront-client/SKILL.md +322 -0
  670. package/skills/hydrogen-storefront-client/references/astro.md +125 -0
  671. package/skills/hydrogen-storefront-client/references/caching.md +25 -0
  672. package/skills/hydrogen-storefront-client/references/nextjs.md +121 -0
  673. package/skills/hydrogen-storefront-client/references/nuxt.md +121 -0
  674. package/skills/hydrogen-storefront-client/references/query-validation.md +95 -0
  675. package/skills/hydrogen-storefront-client/references/react-router.md +81 -0
  676. package/skills/hydrogen-storefront-client/references/solidstart.md +131 -0
  677. package/skills/hydrogen-storefront-client/references/sveltekit.md +169 -0
  678. package/skills/hydrogen-variant-form/SKILL.md +250 -0
  679. package/skills/hydrogen-variant-form/references/nextjs.md +203 -0
  680. package/skills/hydrogen-variant-form/references/nuxt.md +95 -0
  681. package/skills/hydrogen-variant-form/references/react.md +71 -0
  682. package/dist/dev/get-virtual-routes-H72465VB.js +0 -74
  683. package/dist/dev/hydrogen-routes.d.ts +0 -5
  684. package/dist/dev/hydrogen-routes.js +0 -25
  685. package/dist/development/get-virtual-routes-ACFZHU42.js +0 -71
  686. package/dist/development/get-virtual-routes-ACFZHU42.js.map +0 -1
  687. package/dist/development/index.cjs +0 -6948
  688. package/dist/development/index.cjs.map +0 -1
  689. package/dist/development/index.js +0 -6601
  690. package/dist/development/index.js.map +0 -1
  691. package/dist/development/log-seo-tags-IG37ONQ2.js +0 -74
  692. package/dist/development/log-seo-tags-IG37ONQ2.js.map +0 -1
  693. package/dist/development/react-router-preset.d.ts +0 -45
  694. package/dist/development/react-router-preset.js +0 -49
  695. package/dist/development/react-router-preset.js.map +0 -1
  696. package/dist/index.cjs +0 -1
  697. package/dist/oxygen/index.d.ts +0 -197
  698. package/dist/oxygen/index.js +0 -107
  699. package/dist/production/get-virtual-routes-ZZEGQQDV.js +0 -3
  700. package/dist/production/get-virtual-routes-ZZEGQQDV.js.map +0 -1
  701. package/dist/production/index.cjs +0 -1019
  702. package/dist/production/index.cjs.map +0 -1
  703. package/dist/production/index.d.cts +0 -3260
  704. package/dist/production/index.d.ts +0 -3260
  705. package/dist/production/index.js +0 -1019
  706. package/dist/production/index.js.map +0 -1
  707. package/dist/production/log-seo-tags-TY72EQWZ.js +0 -2
  708. package/dist/production/log-seo-tags-TY72EQWZ.js.map +0 -1
  709. package/dist/production/react-router-preset.d.ts +0 -45
  710. package/dist/production/react-router-preset.js +0 -11
  711. package/dist/react-router.d.ts +0 -75
  712. package/dist/vite/chunk-4O5OI3OO.js +0 -127
  713. package/dist/vite/chunk-FAQ7TVHC.js +0 -9
  714. package/dist/vite/chunk-QXBQVDMY.js +0 -68
  715. package/dist/vite/compat-date.d.ts +0 -3
  716. package/dist/vite/compat-date.js +0 -6
  717. package/dist/vite/get-virtual-routes.d.ts +0 -21
  718. package/dist/vite/get-virtual-routes.js +0 -74
  719. package/dist/vite/hydrogen-middleware.d.ts +0 -9
  720. package/dist/vite/hydrogen-middleware.js +0 -7
  721. package/dist/vite/plugin.d.ts +0 -22
  722. package/dist/vite/plugin.js +0 -171
  723. package/dist/vite/request-events.d.ts +0 -144
  724. package/dist/vite/request-events.js +0 -10
  725. package/dist/vite/types.d.ts +0 -5
  726. package/dist/vite/types.js +0 -0
  727. package/dist/vite/virtual-routes/assets/debug-network.css +0 -609
  728. package/dist/vite/virtual-routes/assets/favicon-dark.svg +0 -20
  729. package/dist/vite/virtual-routes/assets/favicon.svg +0 -28
  730. package/dist/vite/virtual-routes/assets/inter-variable-font.woff2 +0 -0
  731. package/dist/vite/virtual-routes/assets/jetbrainsmono-variable-font.woff2 +0 -0
  732. package/dist/vite/virtual-routes/assets/styles.css +0 -249
  733. package/dist/vite/virtual-routes/components/FlameChartWrapper.jsx +0 -123
  734. package/dist/vite/virtual-routes/components/HydrogenLogoBaseBW.jsx +0 -32
  735. package/dist/vite/virtual-routes/components/HydrogenLogoBaseColor.jsx +0 -47
  736. package/dist/vite/virtual-routes/components/IconBanner.jsx +0 -292
  737. package/dist/vite/virtual-routes/components/IconClose.jsx +0 -38
  738. package/dist/vite/virtual-routes/components/IconDiscard.jsx +0 -44
  739. package/dist/vite/virtual-routes/components/IconError.jsx +0 -61
  740. package/dist/vite/virtual-routes/components/IconGithub.jsx +0 -23
  741. package/dist/vite/virtual-routes/components/IconTwitter.jsx +0 -21
  742. package/dist/vite/virtual-routes/components/Layout.jsx +0 -7
  743. package/dist/vite/virtual-routes/components/RequestDetails.jsx +0 -171
  744. package/dist/vite/virtual-routes/components/RequestTable.jsx +0 -91
  745. package/dist/vite/virtual-routes/components/RequestWaterfall.jsx +0 -151
  746. package/dist/vite/virtual-routes/layout.jsx +0 -33
  747. package/dist/vite/virtual-routes/lib/useDebugNetworkServer.jsx +0 -178
  748. package/dist/vite/virtual-routes/routes/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.jsx +0 -37
  749. package/dist/vite/virtual-routes/routes/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.tsx +0 -79
  750. package/dist/vite/virtual-routes/routes/graphiql.jsx +0 -5
  751. package/dist/vite/virtual-routes/routes/index.jsx +0 -265
  752. package/dist/vite/virtual-routes/routes/subrequest-profiler.jsx +0 -243
  753. package/dist/vite/virtual-routes/virtual-root-with-layout.jsx +0 -63
  754. package/dist/vite/virtual-routes/virtual-root.jsx +0 -67
@@ -0,0 +1,68 @@
1
+ //#region src/core/product/state.d.ts
2
+ interface Money {
3
+ amount: string;
4
+ currencyCode: string;
5
+ }
6
+ interface ProductPriceRange {
7
+ minVariantPrice: Money;
8
+ maxVariantPrice?: Money;
9
+ }
10
+ interface SelectedOption {
11
+ name: string;
12
+ value: string;
13
+ }
14
+ interface ProductVariantInput {
15
+ id: string;
16
+ title: string;
17
+ availableForSale: boolean;
18
+ selectedOptions: SelectedOption[];
19
+ price: Money;
20
+ compareAtPrice?: Money | null;
21
+ image?: unknown;
22
+ product?: {
23
+ handle: string;
24
+ title?: string | null;
25
+ } | null;
26
+ sku?: string | null;
27
+ }
28
+ interface ProductOptionInput<TVariant extends ProductVariantInput = ProductVariantInput> {
29
+ name: string;
30
+ optionValues: Array<ProductOptionValueInput<TVariant>>;
31
+ }
32
+ interface ProductOptionValueInput<TVariant extends ProductVariantInput = ProductVariantInput> {
33
+ name: string;
34
+ firstSelectableVariant?: TVariant | null;
35
+ swatch?: unknown;
36
+ }
37
+ interface ProductInput<TVariant extends ProductVariantInput = ProductVariantInput> {
38
+ id: string;
39
+ title: string;
40
+ handle: string;
41
+ vendor?: string | null;
42
+ priceRange?: ProductPriceRange;
43
+ requiresSellingPlan?: boolean | null;
44
+ encodedVariantExistence?: string | null;
45
+ encodedVariantAvailability?: string | null;
46
+ options: ProductOptionInput<TVariant>[];
47
+ selectedOrFirstAvailableVariant: TVariant | null;
48
+ adjacentVariants: TVariant[];
49
+ }
50
+ type ProductVariantFrom<TProduct extends ProductInput> = TProduct extends ProductInput<infer TVariant> ? TVariant : ProductVariantInput;
51
+ type ProductOptionValueFrom<TProduct extends ProductInput> = TProduct["options"][number]["optionValues"][number];
52
+ interface VariantOptionValueState<TVariant extends ProductVariantInput = ProductVariantInput, TOptionValue extends ProductOptionValueInput = ProductOptionValueInput> {
53
+ name: string;
54
+ swatch?: TOptionValue["swatch"];
55
+ selected: boolean;
56
+ exists: boolean;
57
+ available: boolean;
58
+ variant: TVariant | null;
59
+ selectedOptions: SelectedOption[];
60
+ handle: string;
61
+ }
62
+ interface VariantOptionState<TVariant extends ProductVariantInput = ProductVariantInput, TOptionValue extends ProductOptionValueInput = ProductOptionValueInput> {
63
+ name: string;
64
+ values: VariantOptionValueState<TVariant, TOptionValue>[];
65
+ }
66
+ //#endregion
67
+ export { ProductInput, ProductOptionInput, ProductOptionValueFrom, ProductOptionValueInput, ProductVariantFrom, ProductVariantInput, SelectedOption, VariantOptionState, VariantOptionValueState };
68
+ //# sourceMappingURL=state.d.mts.map
@@ -0,0 +1,70 @@
1
+ import { CountryCode, LanguageCode } from "../graphql/generated/customer-account-api-types.mjs";
2
+ import { CountryCode as CountryCode$1, LanguageCode as LanguageCode$1 } from "../graphql/generated/storefront-api-types.mjs";
3
+
4
+ //#region src/core/request-context.d.ts
5
+ type StorefrontRequest = Pick<Request, "headers"> & Partial<Pick<Request, "method" | "signal" | "url">>;
6
+ type ShopifyLanguageCode = Extract<LanguageCode$1, LanguageCode>;
7
+ type ShopifyCountryCode = Extract<CountryCode$1, CountryCode>;
8
+ type I18nConfig = {
9
+ language: ShopifyLanguageCode;
10
+ country: ShopifyCountryCode; /** Optional app route prefix for localized paths, for example "/es-es". */
11
+ pathPrefix?: string;
12
+ };
13
+ type NormalizedI18nConfig<I18n extends I18nConfig = I18nConfig> = Omit<I18n, "pathPrefix"> & {
14
+ pathPrefix: string;
15
+ };
16
+ type ShopifyRequestContextInputBase<I18n extends I18nConfig = I18nConfig> = {
17
+ request: StorefrontRequest;
18
+ i18n: I18n;
19
+ };
20
+ type ShopifyRequestContextInput<I18n extends I18nConfig = I18nConfig> = ShopifyRequestContextInputBase<I18n> & {
21
+ buyerIp?: never;
22
+ };
23
+ type ShopifyRequestContextWithBuyerIpInput<I18n extends I18nConfig = I18nConfig> = ShopifyRequestContextInputBase<I18n> & {
24
+ buyerIp: string;
25
+ };
26
+ type ShopifyRequestContextBase = {
27
+ /**
28
+ * Compile-time brand so callers use createShopifyRequestContext().
29
+ * @internal
30
+ */
31
+ readonly __hydrogenShopifyRequestContextBrand: never; /** @internal */
32
+ cookie?: string; /** @internal */
33
+ uniqueToken?: string; /** @internal */
34
+ visitToken?: string; /** @internal */
35
+ legacyTokens?: boolean; /** @internal */
36
+ readonly buyerIp?: string; /** @internal */
37
+ requestGroupId: string; /** @internal */
38
+ signal?: AbortSignal; /** @internal */
39
+ url?: string; /** @internal */
40
+ storefrontOrigin?: string;
41
+ /**
42
+ * Apply request-scoped headers required by every Shopify storefront subrequest.
43
+ * @internal
44
+ */
45
+ applyStorefrontRequestHeaders(headers: Headers): void;
46
+ /**
47
+ * Capture the first fresh SFAPI response headers for replay onto the final app response.
48
+ * @internal
49
+ */
50
+ captureSubrequestHeaders(headers: Headers): void;
51
+ /**
52
+ * Mark the final app response as influenced by private customer state.
53
+ * @internal
54
+ */
55
+ markResponseAsPersonalized(reason: string): void;
56
+ i18n: NormalizedI18nConfig; /** Return incoming request headers plus request lifecycle headers for proxy/origin handoff. */
57
+ getForwardedRequestHeaders(): Headers; /** Apply important response headers for the correct functioning of Hydrogen storefronts. */
58
+ applyResponseHeaders(headers: Headers): void;
59
+ };
60
+ type ShopifyRequestContext<I18n extends I18nConfig = I18nConfig> = ShopifyRequestContextBase & {
61
+ i18n: NormalizedI18nConfig<I18n>;
62
+ };
63
+ type ShopifyRequestContextWithBuyerIp<I18n extends I18nConfig = I18nConfig> = ShopifyRequestContext<I18n> & {
64
+ readonly buyerIp: string;
65
+ };
66
+ declare function createShopifyRequestContext<const I18n extends I18nConfig>(input: ShopifyRequestContextWithBuyerIpInput<I18n>): ShopifyRequestContextWithBuyerIp<I18n>;
67
+ declare function createShopifyRequestContext<const I18n extends I18nConfig>(input: ShopifyRequestContextInput<I18n>): ShopifyRequestContext<I18n>;
68
+ //#endregion
69
+ export { I18nConfig, ShopifyRequestContext, ShopifyRequestContextWithBuyerIp, createShopifyRequestContext };
70
+ //# sourceMappingURL=request-context.d.mts.map
@@ -0,0 +1,120 @@
1
+ import { normalizePathPrefix } from "./standard-routes/path.mjs";
2
+ import { HYDROGEN_VERSION_HEADER, REQUEST_GROUP_ID_HEADER, SDK_VARIANT_HEADER, SDK_VARIANT_SOURCE_HEADER, SDK_VERSION_HEADER, SERVER_TIMING_HEADER, SHOPIFY_STOREFRONT_ORIGIN_HEADER, SHOPIFY_STOREFRONT_S_HEADER, SHOPIFY_STOREFRONT_Y_HEADER, SHOPIFY_UNIQUE_TOKEN_HEADER, SHOPIFY_VISIT_TOKEN_HEADER, STOREFRONT_URL_HEADER, applyPrivateResponseCacheHeaders } from "./headers.mjs";
3
+ import { STOREFRONT_API_VERSION } from "./constants.mjs";
4
+
5
+ //#region src/core/request-context.ts
6
+ const UNIQUE_TOKEN_MARKER = "_y";
7
+ const VISIT_TOKEN_MARKER = "_s";
8
+ function createShopifyRequestContext(input) {
9
+ const { request } = input;
10
+ if (!input.i18n?.country || !input.i18n?.language) throw new Error("i18n with country and language is required for Shopify request contexts.");
11
+ if (input.buyerIp !== void 0 && !input.buyerIp) throw new Error("buyerIp must be non-empty when provided");
12
+ const i18n = normalizeI18n(input.i18n);
13
+ const cookie = request.headers.get("cookie") || void 0;
14
+ const url = request.url ?? request.headers.get("x-storefront-url") ?? void 0;
15
+ const storefrontOrigin = getUrlOrigin(url);
16
+ const context = {
17
+ ...cookie && { cookie },
18
+ i18n,
19
+ ...url && { url },
20
+ ...storefrontOrigin && { storefrontOrigin },
21
+ ...input.buyerIp && { buyerIp: input.buyerIp },
22
+ requestGroupId: request.headers.get("Custom-Storefront-Request-Group-ID") ?? request.headers.get("x-request-id") ?? request.headers.get("request-id") ?? crypto.randomUUID(),
23
+ ...isDocumentRequest(request) && { documentRequest: true },
24
+ ...request.signal && { signal: request.signal }
25
+ };
26
+ let capturedSubrequestHeaders;
27
+ let personalizedResponseReason;
28
+ if (!cookie || !/\b_shopify_(analytics|marketing)=/.test(cookie)) {
29
+ const legacyUniqueToken = cookie?.match(/\b_shopify_y=([^;]+)/)?.[1];
30
+ const legacyVisitToken = cookie?.match(/\b_shopify_s=([^;]+)/)?.[1];
31
+ const headerUniqueToken = request.headers.get("X-Shopify-UniqueToken") ?? void 0;
32
+ const headerVisitToken = request.headers.get("X-Shopify-VisitToken") ?? void 0;
33
+ if (legacyUniqueToken || legacyVisitToken) context.legacyTokens = true;
34
+ context.uniqueToken = legacyUniqueToken ?? headerUniqueToken ?? crypto.randomUUID();
35
+ context.visitToken = legacyVisitToken ?? headerVisitToken ?? crypto.randomUUID();
36
+ }
37
+ return {
38
+ ...context,
39
+ getForwardedRequestHeaders() {
40
+ const headers = new Headers(request.headers);
41
+ applyStorefrontRequestHeaders(context, headers);
42
+ if (context.url) headers.set(STOREFRONT_URL_HEADER, context.url);
43
+ return headers;
44
+ },
45
+ applyStorefrontRequestHeaders(headers) {
46
+ applyStorefrontRequestHeaders(context, headers);
47
+ },
48
+ captureSubrequestHeaders(headers) {
49
+ capturedSubrequestHeaders ??= {
50
+ serverTiming: headers.get("Server-Timing") ?? "",
51
+ setCookie: headers.getSetCookie()
52
+ };
53
+ },
54
+ markResponseAsPersonalized(reason) {
55
+ personalizedResponseReason ??= reason;
56
+ },
57
+ applyResponseHeaders(headers) {
58
+ headers.set("powered-by", "Shopify, Hydrogen");
59
+ if (capturedSubrequestHeaders) {
60
+ const existingSetCookies = headers.getSetCookie();
61
+ for (const value of capturedSubrequestHeaders.setCookie) {
62
+ if (existingSetCookies.includes(value)) continue;
63
+ headers.append("set-cookie", value);
64
+ }
65
+ const existingServerTiming = headers.get("Server-Timing") ?? "";
66
+ if (capturedSubrequestHeaders.serverTiming && !hasServerTimingValue(existingServerTiming, capturedSubrequestHeaders.serverTiming)) headers.append(SERVER_TIMING_HEADER, capturedSubrequestHeaders.serverTiming);
67
+ }
68
+ if (personalizedResponseReason) applyPrivateResponseCacheHeaders(headers);
69
+ if (!(headers.get("content-type")?.startsWith("text/html") ?? false) && !context.documentRequest) return;
70
+ const existing = headers.get("Server-Timing") ?? "";
71
+ if (context.uniqueToken && !hasServerTimingMetric(existing, UNIQUE_TOKEN_MARKER)) headers.append(SERVER_TIMING_HEADER, `${UNIQUE_TOKEN_MARKER};desc=${context.uniqueToken}`);
72
+ if (context.visitToken && !hasServerTimingMetric(existing, VISIT_TOKEN_MARKER)) headers.append(SERVER_TIMING_HEADER, `${VISIT_TOKEN_MARKER};desc=${context.visitToken}`);
73
+ }
74
+ };
75
+ }
76
+ function normalizeI18n(i18n) {
77
+ return {
78
+ ...i18n,
79
+ pathPrefix: normalizePathPrefix(i18n.pathPrefix)
80
+ };
81
+ }
82
+ function applyStorefrontRequestHeaders(context, headers) {
83
+ headers.set(SDK_VARIANT_HEADER, "hydrogen");
84
+ headers.set(SDK_VARIANT_SOURCE_HEADER, "kit");
85
+ headers.set(SDK_VERSION_HEADER, STOREFRONT_API_VERSION);
86
+ headers.set(HYDROGEN_VERSION_HEADER, "2026.10.0-preview.1");
87
+ headers.set(REQUEST_GROUP_ID_HEADER, context.requestGroupId);
88
+ if (context.cookie) headers.set("cookie", context.cookie);
89
+ else headers.delete("cookie");
90
+ if (context.storefrontOrigin) headers.set(SHOPIFY_STOREFRONT_ORIGIN_HEADER, context.storefrontOrigin);
91
+ else headers.delete(SHOPIFY_STOREFRONT_ORIGIN_HEADER);
92
+ if (context.uniqueToken) headers.set(SHOPIFY_UNIQUE_TOKEN_HEADER, context.uniqueToken);
93
+ if (context.visitToken) headers.set(SHOPIFY_VISIT_TOKEN_HEADER, context.visitToken);
94
+ if (context.legacyTokens && context.uniqueToken) headers.set(SHOPIFY_STOREFRONT_Y_HEADER, context.uniqueToken);
95
+ if (context.legacyTokens && context.visitToken) headers.set(SHOPIFY_STOREFRONT_S_HEADER, context.visitToken);
96
+ }
97
+ function getUrlOrigin(url) {
98
+ if (!url) return void 0;
99
+ try {
100
+ return new URL(url).origin;
101
+ } catch {
102
+ return;
103
+ }
104
+ }
105
+ function isDocumentRequest(request) {
106
+ if (request.method && request.method !== "GET" && request.method !== "HEAD") return false;
107
+ if (request.headers.get("sec-fetch-dest") === "document") return true;
108
+ return request.headers.get("accept")?.includes("text/html") ?? false;
109
+ }
110
+ function hasServerTimingMetric(value, name) {
111
+ return value.split(",").some((part) => part.trim().startsWith(`${name};`));
112
+ }
113
+ function hasServerTimingValue(existing, next) {
114
+ const existingParts = new Set(existing.split(",").map((part) => part.trim()));
115
+ return next.split(",").every((part) => existingParts.has(part.trim()));
116
+ }
117
+
118
+ //#endregion
119
+ export { createShopifyRequestContext };
120
+ //# sourceMappingURL=request-context.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-context.mjs","names":[],"sources":["../../../src/core/request-context.ts"],"sourcesContent":["import type {\n CountryCode as CustomerAccountCountryCode,\n LanguageCode as CustomerAccountLanguageCode,\n} from \"../graphql/generated/customer-account-api-types\";\nimport type {\n CountryCode as StorefrontCountryCode,\n LanguageCode as StorefrontLanguageCode,\n} from \"../graphql/generated/storefront-api-types\";\nimport { STOREFRONT_API_VERSION } from \"./constants\";\nimport {\n applyPrivateResponseCacheHeaders,\n HYDROGEN_VERSION_HEADER,\n REQUEST_GROUP_ID_HEADER,\n SDK_VARIANT_HEADER,\n SDK_VARIANT_SOURCE_HEADER,\n SDK_VERSION_HEADER,\n SERVER_TIMING_HEADER,\n SHOPIFY_STOREFRONT_ORIGIN_HEADER,\n SHOPIFY_STOREFRONT_S_HEADER,\n SHOPIFY_STOREFRONT_Y_HEADER,\n SHOPIFY_UNIQUE_TOKEN_HEADER,\n SHOPIFY_VISIT_TOKEN_HEADER,\n STOREFRONT_URL_HEADER,\n} from \"./headers\";\nimport { normalizePathPrefix } from \"./standard-routes/path\";\n\nconst UNIQUE_TOKEN_MARKER = \"_y\";\nconst VISIT_TOKEN_MARKER = \"_s\";\n\ntype StorefrontRequest = Pick<Request, \"headers\"> &\n Partial<Pick<Request, \"method\" | \"signal\" | \"url\">>;\n\nexport type ShopifyLanguageCode = Extract<StorefrontLanguageCode, CustomerAccountLanguageCode>;\nexport type ShopifyCountryCode = Extract<StorefrontCountryCode, CustomerAccountCountryCode>;\n\nexport type I18nConfig = {\n language: ShopifyLanguageCode;\n country: ShopifyCountryCode;\n /** Optional app route prefix for localized paths, for example \"/es-es\". */\n pathPrefix?: string;\n};\n\ntype NormalizedI18nConfig<I18n extends I18nConfig = I18nConfig> = Omit<I18n, \"pathPrefix\"> & {\n pathPrefix: string;\n};\n\ntype ShopifyRequestContextInputBase<I18n extends I18nConfig = I18nConfig> = {\n request: StorefrontRequest;\n i18n: I18n;\n};\n\ntype ShopifyRequestContextInput<I18n extends I18nConfig = I18nConfig> =\n ShopifyRequestContextInputBase<I18n> & { buyerIp?: never };\n\ntype ShopifyRequestContextWithBuyerIpInput<I18n extends I18nConfig = I18nConfig> =\n ShopifyRequestContextInputBase<I18n> & { buyerIp: string };\n\ntype ShopifyRequestContextBase = {\n // -- Private fields --\n /**\n * Compile-time brand so callers use createShopifyRequestContext().\n * @internal\n */\n readonly __hydrogenShopifyRequestContextBrand: never;\n /** @internal */\n cookie?: string;\n /** @internal */\n uniqueToken?: string;\n /** @internal */\n visitToken?: string;\n /** @internal */\n legacyTokens?: boolean;\n /** @internal */\n readonly buyerIp?: string;\n /** @internal */\n requestGroupId: string;\n /** @internal */\n signal?: AbortSignal;\n /** @internal */\n url?: string;\n /** @internal */\n storefrontOrigin?: string;\n /**\n * Apply request-scoped headers required by every Shopify storefront subrequest.\n * @internal\n */\n applyStorefrontRequestHeaders(headers: Headers): void;\n /**\n * Capture the first fresh SFAPI response headers for replay onto the final app response.\n * @internal\n */\n captureSubrequestHeaders(headers: Headers): void;\n /**\n * Mark the final app response as influenced by private customer state.\n * @internal\n */\n markResponseAsPersonalized(reason: string): void;\n\n // -- Public fields --\n i18n: NormalizedI18nConfig;\n /** Return incoming request headers plus request lifecycle headers for proxy/origin handoff. */\n getForwardedRequestHeaders(): Headers;\n /** Apply important response headers for the correct functioning of Hydrogen storefronts. */\n applyResponseHeaders(headers: Headers): void;\n};\n\nexport type ShopifyRequestContext<I18n extends I18nConfig = I18nConfig> =\n ShopifyRequestContextBase & {\n i18n: NormalizedI18nConfig<I18n>;\n };\n\nexport type ShopifyRequestContextWithBuyerIp<I18n extends I18nConfig = I18nConfig> =\n ShopifyRequestContext<I18n> & { readonly buyerIp: string };\n\ntype Context<I18n extends I18nConfig = I18nConfig> = {\n cookie?: string;\n uniqueToken?: string;\n visitToken?: string;\n legacyTokens?: boolean;\n buyerIp?: string;\n requestGroupId: string;\n signal?: AbortSignal;\n url?: string;\n storefrontOrigin?: string;\n i18n: NormalizedI18nConfig<I18n>;\n documentRequest?: boolean;\n};\n\nexport function createShopifyRequestContext<const I18n extends I18nConfig>(\n input: ShopifyRequestContextWithBuyerIpInput<I18n>,\n): ShopifyRequestContextWithBuyerIp<I18n>;\nexport function createShopifyRequestContext<const I18n extends I18nConfig>(\n input: ShopifyRequestContextInput<I18n>,\n): ShopifyRequestContext<I18n>;\nexport function createShopifyRequestContext<const I18n extends I18nConfig>(\n input: ShopifyRequestContextInputBase<I18n> & { buyerIp?: string },\n): ShopifyRequestContext<I18n> {\n const { request } = input;\n\n if (!input.i18n?.country || !input.i18n?.language) {\n throw new Error(\"i18n with country and language is required for Shopify request contexts.\");\n }\n\n if (input.buyerIp !== undefined && !input.buyerIp) {\n throw new Error(\"buyerIp must be non-empty when provided\");\n }\n\n const i18n = normalizeI18n(input.i18n);\n const cookie = request.headers.get(\"cookie\") || undefined;\n const url = request.url ?? request.headers.get(STOREFRONT_URL_HEADER) ?? undefined;\n const storefrontOrigin = getUrlOrigin(url);\n const context = {\n ...(cookie && { cookie }),\n i18n,\n ...(url && { url }),\n ...(storefrontOrigin && { storefrontOrigin }),\n ...(input.buyerIp && { buyerIp: input.buyerIp }),\n requestGroupId:\n request.headers.get(REQUEST_GROUP_ID_HEADER) ??\n request.headers.get(\"x-request-id\") ??\n request.headers.get(\"request-id\") ??\n crypto.randomUUID(),\n ...(isDocumentRequest(request) && { documentRequest: true }),\n ...(request.signal && { signal: request.signal }),\n } as Context<I18n>;\n\n let capturedSubrequestHeaders:\n | {\n serverTiming: string;\n setCookie: string[];\n }\n | undefined;\n let personalizedResponseReason: string | undefined;\n\n if (!cookie || !/\\b_shopify_(analytics|marketing)=/.test(cookie)) {\n const legacyUniqueToken = cookie?.match(/\\b_shopify_y=([^;]+)/)?.[1];\n const legacyVisitToken = cookie?.match(/\\b_shopify_s=([^;]+)/)?.[1];\n const headerUniqueToken = request.headers.get(SHOPIFY_UNIQUE_TOKEN_HEADER) ?? undefined;\n const headerVisitToken = request.headers.get(SHOPIFY_VISIT_TOKEN_HEADER) ?? undefined;\n\n if (legacyUniqueToken || legacyVisitToken) context.legacyTokens = true;\n\n context.uniqueToken = legacyUniqueToken ?? headerUniqueToken ?? crypto.randomUUID();\n context.visitToken = legacyVisitToken ?? headerVisitToken ?? crypto.randomUUID();\n }\n\n return {\n ...context,\n getForwardedRequestHeaders() {\n const headers = new Headers(request.headers);\n applyStorefrontRequestHeaders(context, headers);\n if (context.url) headers.set(STOREFRONT_URL_HEADER, context.url);\n return headers;\n },\n applyStorefrontRequestHeaders(headers) {\n applyStorefrontRequestHeaders(context, headers);\n },\n captureSubrequestHeaders(headers) {\n // Capture this the first time we get a fresh response to increase the\n // chance of returning it from the main server response. The main response\n // needs headers set at send time, while the body can stream later, so this\n // may not be used if subrequests finish after the main response is sent.\n capturedSubrequestHeaders ??= {\n serverTiming: headers.get(SERVER_TIMING_HEADER) ?? \"\",\n setCookie: headers.getSetCookie(),\n };\n },\n markResponseAsPersonalized(reason) {\n personalizedResponseReason ??= reason;\n },\n applyResponseHeaders(headers) {\n headers.set(\"powered-by\", \"Shopify, Hydrogen\");\n\n if (capturedSubrequestHeaders) {\n const existingSetCookies = headers.getSetCookie();\n for (const value of capturedSubrequestHeaders.setCookie) {\n if (existingSetCookies.includes(value)) continue;\n headers.append(\"set-cookie\", value);\n }\n const existingServerTiming = headers.get(SERVER_TIMING_HEADER) ?? \"\";\n if (\n capturedSubrequestHeaders.serverTiming &&\n !hasServerTimingValue(existingServerTiming, capturedSubrequestHeaders.serverTiming)\n ) {\n headers.append(SERVER_TIMING_HEADER, capturedSubrequestHeaders.serverTiming);\n }\n }\n\n if (personalizedResponseReason) {\n applyPrivateResponseCacheHeaders(headers);\n }\n\n // Generated fallback tokens are only for document navigation bootstrap.\n const isHtmlResponse = headers.get(\"content-type\")?.startsWith(\"text/html\") ?? false;\n if (!isHtmlResponse && !context.documentRequest) return;\n\n const existing = headers.get(SERVER_TIMING_HEADER) ?? \"\";\n if (context.uniqueToken && !hasServerTimingMetric(existing, UNIQUE_TOKEN_MARKER)) {\n headers.append(SERVER_TIMING_HEADER, `${UNIQUE_TOKEN_MARKER};desc=${context.uniqueToken}`);\n }\n if (context.visitToken && !hasServerTimingMetric(existing, VISIT_TOKEN_MARKER)) {\n headers.append(SERVER_TIMING_HEADER, `${VISIT_TOKEN_MARKER};desc=${context.visitToken}`);\n }\n },\n } as ShopifyRequestContext<I18n>;\n}\n\nfunction normalizeI18n<I18n extends I18nConfig>(i18n: I18n): NormalizedI18nConfig<I18n> {\n return {\n ...i18n,\n pathPrefix: normalizePathPrefix(i18n.pathPrefix),\n } as NormalizedI18nConfig<I18n>;\n}\n\nfunction applyStorefrontRequestHeaders(context: Context, headers: Headers): void {\n headers.set(SDK_VARIANT_HEADER, \"hydrogen\");\n headers.set(SDK_VARIANT_SOURCE_HEADER, \"kit\");\n headers.set(SDK_VERSION_HEADER, STOREFRONT_API_VERSION);\n headers.set(HYDROGEN_VERSION_HEADER, __HYDROGEN_VERSION__);\n headers.set(REQUEST_GROUP_ID_HEADER, context.requestGroupId);\n\n if (context.cookie) headers.set(\"cookie\", context.cookie);\n else headers.delete(\"cookie\");\n if (context.storefrontOrigin) {\n headers.set(SHOPIFY_STOREFRONT_ORIGIN_HEADER, context.storefrontOrigin);\n } else headers.delete(SHOPIFY_STOREFRONT_ORIGIN_HEADER);\n\n if (context.uniqueToken) headers.set(SHOPIFY_UNIQUE_TOKEN_HEADER, context.uniqueToken);\n if (context.visitToken) headers.set(SHOPIFY_VISIT_TOKEN_HEADER, context.visitToken);\n if (context.legacyTokens && context.uniqueToken) {\n headers.set(SHOPIFY_STOREFRONT_Y_HEADER, context.uniqueToken);\n }\n if (context.legacyTokens && context.visitToken) {\n headers.set(SHOPIFY_STOREFRONT_S_HEADER, context.visitToken);\n }\n}\n\nfunction getUrlOrigin(url: string | undefined): string | undefined {\n if (!url) return undefined;\n try {\n return new URL(url).origin;\n } catch {\n return undefined;\n }\n}\n\nfunction isDocumentRequest(request: StorefrontRequest): boolean {\n if (request.method && request.method !== \"GET\" && request.method !== \"HEAD\") return false;\n\n const destination = request.headers.get(\"sec-fetch-dest\");\n if (destination === \"document\") return true;\n\n return request.headers.get(\"accept\")?.includes(\"text/html\") ?? false;\n}\n\nfunction hasServerTimingMetric(value: string, name: string): boolean {\n return value.split(\",\").some((part) => part.trim().startsWith(`${name};`));\n}\n\nfunction hasServerTimingValue(existing: string, next: string): boolean {\n const existingParts = new Set(existing.split(\",\").map((part) => part.trim()));\n return next.split(\",\").every((part) => existingParts.has(part.trim()));\n}\n"],"mappings":";;;;;AA0BA,MAAM,sBAAsB;AAC5B,MAAM,qBAAqB;AA2G3B,SAAgB,4BACd,OAC6B;CAC7B,MAAM,EAAE,YAAY;AAEpB,KAAI,CAAC,MAAM,MAAM,WAAW,CAAC,MAAM,MAAM,SACvC,OAAM,IAAI,MAAM,2EAA2E;AAG7F,KAAI,MAAM,YAAY,UAAa,CAAC,MAAM,QACxC,OAAM,IAAI,MAAM,0CAA0C;CAG5D,MAAM,OAAO,cAAc,MAAM,KAAK;CACtC,MAAM,SAAS,QAAQ,QAAQ,IAAI,SAAS,IAAI;CAChD,MAAM,MAAM,QAAQ,OAAO,QAAQ,QAAQ,uBAA0B,IAAI;CACzE,MAAM,mBAAmB,aAAa,IAAI;CAC1C,MAAM,UAAU;EACd,GAAI,UAAU,EAAE,QAAQ;EACxB;EACA,GAAI,OAAO,EAAE,KAAK;EAClB,GAAI,oBAAoB,EAAE,kBAAkB;EAC5C,GAAI,MAAM,WAAW,EAAE,SAAS,MAAM,SAAS;EAC/C,gBACE,QAAQ,QAAQ,yCAA4B,IAC5C,QAAQ,QAAQ,IAAI,eAAe,IACnC,QAAQ,QAAQ,IAAI,aAAa,IACjC,OAAO,YAAY;EACrB,GAAI,kBAAkB,QAAQ,IAAI,EAAE,iBAAiB,MAAM;EAC3D,GAAI,QAAQ,UAAU,EAAE,QAAQ,QAAQ,QAAQ;EACjD;CAED,IAAI;CAMJ,IAAI;AAEJ,KAAI,CAAC,UAAU,CAAC,oCAAoC,KAAK,OAAO,EAAE;EAChE,MAAM,oBAAoB,QAAQ,MAAM,uBAAuB,GAAG;EAClE,MAAM,mBAAmB,QAAQ,MAAM,uBAAuB,GAAG;EACjE,MAAM,oBAAoB,QAAQ,QAAQ,4BAAgC,IAAI;EAC9E,MAAM,mBAAmB,QAAQ,QAAQ,2BAA+B,IAAI;AAE5E,MAAI,qBAAqB,iBAAkB,SAAQ,eAAe;AAElE,UAAQ,cAAc,qBAAqB,qBAAqB,OAAO,YAAY;AACnF,UAAQ,aAAa,oBAAoB,oBAAoB,OAAO,YAAY;;AAGlF,QAAO;EACL,GAAG;EACH,6BAA6B;GAC3B,MAAM,UAAU,IAAI,QAAQ,QAAQ,QAAQ;AAC5C,iCAA8B,SAAS,QAAQ;AAC/C,OAAI,QAAQ,IAAK,SAAQ,IAAI,uBAAuB,QAAQ,IAAI;AAChE,UAAO;;EAET,8BAA8B,SAAS;AACrC,iCAA8B,SAAS,QAAQ;;EAEjD,yBAAyB,SAAS;AAKhC,iCAA8B;IAC5B,cAAc,QAAQ,oBAAyB,IAAI;IACnD,WAAW,QAAQ,cAAc;IAClC;;EAEH,2BAA2B,QAAQ;AACjC,kCAA+B;;EAEjC,qBAAqB,SAAS;AAC5B,WAAQ,IAAI,cAAc,oBAAoB;AAE9C,OAAI,2BAA2B;IAC7B,MAAM,qBAAqB,QAAQ,cAAc;AACjD,SAAK,MAAM,SAAS,0BAA0B,WAAW;AACvD,SAAI,mBAAmB,SAAS,MAAM,CAAE;AACxC,aAAQ,OAAO,cAAc,MAAM;;IAErC,MAAM,uBAAuB,QAAQ,oBAAyB,IAAI;AAClE,QACE,0BAA0B,gBAC1B,CAAC,qBAAqB,sBAAsB,0BAA0B,aAAa,CAEnF,SAAQ,OAAO,sBAAsB,0BAA0B,aAAa;;AAIhF,OAAI,2BACF,kCAAiC,QAAQ;AAK3C,OAAI,EADmB,QAAQ,IAAI,eAAe,EAAE,WAAW,YAAY,IAAI,UACxD,CAAC,QAAQ,gBAAiB;GAEjD,MAAM,WAAW,QAAQ,oBAAyB,IAAI;AACtD,OAAI,QAAQ,eAAe,CAAC,sBAAsB,UAAU,oBAAoB,CAC9E,SAAQ,OAAO,sBAAsB,GAAG,oBAAoB,QAAQ,QAAQ,cAAc;AAE5F,OAAI,QAAQ,cAAc,CAAC,sBAAsB,UAAU,mBAAmB,CAC5E,SAAQ,OAAO,sBAAsB,GAAG,mBAAmB,QAAQ,QAAQ,aAAa;;EAG7F;;AAGH,SAAS,cAAuC,MAAwC;AACtF,QAAO;EACL,GAAG;EACH,YAAY,oBAAoB,KAAK,WAAW;EACjD;;AAGH,SAAS,8BAA8B,SAAkB,SAAwB;AAC/E,SAAQ,IAAI,oBAAoB,WAAW;AAC3C,SAAQ,IAAI,2BAA2B,MAAM;AAC7C,SAAQ,IAAI,oBAAoB,uBAAuB;AACvD,SAAQ,IAAI,+CAA8C;AAC1D,SAAQ,IAAI,yBAAyB,QAAQ,eAAe;AAE5D,KAAI,QAAQ,OAAQ,SAAQ,IAAI,UAAU,QAAQ,OAAO;KACpD,SAAQ,OAAO,SAAS;AAC7B,KAAI,QAAQ,iBACV,SAAQ,IAAI,kCAAkC,QAAQ,iBAAiB;KAClE,SAAQ,OAAO,iCAAiC;AAEvD,KAAI,QAAQ,YAAa,SAAQ,IAAI,6BAA6B,QAAQ,YAAY;AACtF,KAAI,QAAQ,WAAY,SAAQ,IAAI,4BAA4B,QAAQ,WAAW;AACnF,KAAI,QAAQ,gBAAgB,QAAQ,YAClC,SAAQ,IAAI,6BAA6B,QAAQ,YAAY;AAE/D,KAAI,QAAQ,gBAAgB,QAAQ,WAClC,SAAQ,IAAI,6BAA6B,QAAQ,WAAW;;AAIhE,SAAS,aAAa,KAA6C;AACjE,KAAI,CAAC,IAAK,QAAO;AACjB,KAAI;AACF,SAAO,IAAI,IAAI,IAAI,CAAC;SACd;AACN;;;AAIJ,SAAS,kBAAkB,SAAqC;AAC9D,KAAI,QAAQ,UAAU,QAAQ,WAAW,SAAS,QAAQ,WAAW,OAAQ,QAAO;AAGpF,KADoB,QAAQ,QAAQ,IAAI,iBACzB,KAAK,WAAY,QAAO;AAEvC,QAAO,QAAQ,QAAQ,IAAI,SAAS,EAAE,SAAS,YAAY,IAAI;;AAGjE,SAAS,sBAAsB,OAAe,MAAuB;AACnE,QAAO,MAAM,MAAM,IAAI,CAAC,MAAM,SAAS,KAAK,MAAM,CAAC,WAAW,GAAG,KAAK,GAAG,CAAC;;AAG5E,SAAS,qBAAqB,UAAkB,MAAuB;CACrE,MAAM,gBAAgB,IAAI,IAAI,SAAS,MAAM,IAAI,CAAC,KAAK,SAAS,KAAK,MAAM,CAAC,CAAC;AAC7E,QAAO,KAAK,MAAM,IAAI,CAAC,OAAO,SAAS,cAAc,IAAI,KAAK,MAAM,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { StorefrontClient } from "../../client/types.mjs";
2
+ import { ShopifyRouteTemplates } from "../standard-routes/types.mjs";
3
+
4
+ //#region src/core/request-routing/handle-shopify-redirects.d.ts
5
+ type RedirectOptions = {
6
+ request: Request;
7
+ storefrontClient: StorefrontClient;
8
+ routeTemplates: ShopifyRouteTemplates;
9
+ };
10
+ /**
11
+ * Resolves Shopify redirects after framework routing returns a 404. Matched
12
+ * responses already include request-context response headers.
13
+ */
14
+ declare function handleShopifyRedirects(options: RedirectOptions): Promise<Response | null>;
15
+ //#endregion
16
+ export { RedirectOptions, handleShopifyRedirects };
17
+ //# sourceMappingURL=handle-shopify-redirects.d.mts.map
@@ -0,0 +1,31 @@
1
+ import { getLogger } from "../logging/logging.mjs";
2
+ import { handleAdminRedirect } from "./interceptors/admin-redirect.mjs";
3
+ import { handleQueryParamRedirect } from "./interceptors/query-param-redirect.mjs";
4
+ import { handleUrlRedirects } from "./interceptors/url-redirects.mjs";
5
+ import { handleStandardRouteRedirects } from "./interceptors/standard-routes.mjs";
6
+ import { safeApplyResponseHeaders } from "./safe-apply-response-headers.mjs";
7
+
8
+ //#region src/core/request-routing/handle-shopify-redirects.ts
9
+ const log = getLogger("redirects");
10
+ /**
11
+ * Resolves Shopify redirects after framework routing returns a 404. Matched
12
+ * responses already include request-context response headers.
13
+ */
14
+ async function handleShopifyRedirects(options) {
15
+ const { request, storefrontClient } = options;
16
+ let redirect = null;
17
+ try {
18
+ redirect = handleAdminRedirect(options);
19
+ redirect ??= handleStandardRouteRedirects(options);
20
+ redirect ??= handleQueryParamRedirect(request);
21
+ redirect ??= await handleUrlRedirects(options);
22
+ } catch (error) {
23
+ const url = new URL(request.url);
24
+ log.error(`failed to resolve Shopify redirects for route ${url.pathname}`, { error });
25
+ }
26
+ return redirect ? safeApplyResponseHeaders(redirect, storefrontClient.requestContext) : null;
27
+ }
28
+
29
+ //#endregion
30
+ export { handleShopifyRedirects };
31
+ //# sourceMappingURL=handle-shopify-redirects.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-shopify-redirects.mjs","names":[],"sources":["../../../../src/core/request-routing/handle-shopify-redirects.ts"],"sourcesContent":["import type { StorefrontClient } from \"../../client\";\nimport { getLogger } from \"../logging\";\nimport type { ShopifyRouteTemplates } from \"../standard-routes/index\";\nimport { handleAdminRedirect } from \"./interceptors/admin-redirect\";\nimport { handleQueryParamRedirect } from \"./interceptors/query-param-redirect\";\nimport { handleStandardRouteRedirects } from \"./interceptors/standard-routes\";\nimport { handleUrlRedirects } from \"./interceptors/url-redirects\";\nimport { safeApplyResponseHeaders } from \"./safe-apply-response-headers\";\n\nconst log = getLogger(\"redirects\");\n\nexport type RedirectOptions = {\n request: Request;\n storefrontClient: StorefrontClient;\n routeTemplates: ShopifyRouteTemplates;\n};\n\n/**\n * Resolves Shopify redirects after framework routing returns a 404. Matched\n * responses already include request-context response headers.\n */\nexport async function handleShopifyRedirects(options: RedirectOptions): Promise<Response | null> {\n const { request, storefrontClient } = options;\n let redirect: Response | null = null;\n\n try {\n redirect = handleAdminRedirect(options);\n redirect ??= handleStandardRouteRedirects(options);\n redirect ??= handleQueryParamRedirect(request);\n redirect ??= await handleUrlRedirects(options);\n } catch (error) {\n const url = new URL(request.url);\n log.error(`failed to resolve Shopify redirects for route ${url.pathname}`, { error });\n }\n\n return redirect ? safeApplyResponseHeaders(redirect, storefrontClient.requestContext) : null;\n}\n"],"mappings":";;;;;;;;AASA,MAAM,MAAM,UAAU,YAAY;;;;;AAYlC,eAAsB,uBAAuB,SAAoD;CAC/F,MAAM,EAAE,SAAS,qBAAqB;CACtC,IAAI,WAA4B;AAEhC,KAAI;AACF,aAAW,oBAAoB,QAAQ;AACvC,eAAa,6BAA6B,QAAQ;AAClD,eAAa,yBAAyB,QAAQ;AAC9C,eAAa,MAAM,mBAAmB,QAAQ;UACvC,OAAO;EACd,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;AAChC,MAAI,MAAM,iDAAiD,IAAI,YAAY,EAAE,OAAO,CAAC;;AAGvF,QAAO,WAAW,yBAAyB,UAAU,iBAAiB,eAAe,GAAG"}
@@ -0,0 +1,11 @@
1
+ import { HydrogenRouteHandler } from "./route-types.mjs";
2
+ import { GraphiQLOptions } from "../types.mjs";
3
+
4
+ //#region src/core/request-routing/handle-shopify-routes.development.d.ts
5
+ type HydrogenRoutesDevOptions = {
6
+ graphiql?: GraphiQLOptions;
7
+ };
8
+ declare const handleShopifyRoutesDev: HydrogenRouteHandler<HydrogenRoutesDevOptions>;
9
+ //#endregion
10
+ export { handleShopifyRoutesDev };
11
+ //# sourceMappingURL=handle-shopify-routes.development.d.mts.map
@@ -0,0 +1,16 @@
1
+ import { safeApplyResponseHeaders } from "./safe-apply-response-headers.mjs";
2
+ import { handleShopifyRoutes } from "./handle-shopify-routes.mjs";
3
+ import { handleGraphiql } from "./interceptors/graphiql.mjs";
4
+
5
+ //#region src/core/request-routing/handle-shopify-routes.development.ts
6
+ const handleShopifyRoutesDev = (options) => {
7
+ const productionResult = handleShopifyRoutes(options);
8
+ if (productionResult) return productionResult;
9
+ const graphiqlResult = handleGraphiql(new URL(options.request.url), options);
10
+ if (!graphiqlResult) return null;
11
+ return graphiqlResult.then((response) => safeApplyResponseHeaders(response, options.requestContext));
12
+ };
13
+
14
+ //#endregion
15
+ export { handleShopifyRoutesDev };
16
+ //# sourceMappingURL=handle-shopify-routes.development.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-shopify-routes.development.mjs","names":[],"sources":["../../../../src/core/request-routing/handle-shopify-routes.development.ts"],"sourcesContent":["import type { GraphiQLOptions } from \"../types\";\nimport { handleShopifyRoutes } from \"./handle-shopify-routes\";\nimport { handleGraphiql } from \"./interceptors/graphiql\";\nimport type { HydrogenRouteHandler } from \"./route-types\";\nimport { safeApplyResponseHeaders } from \"./safe-apply-response-headers\";\n\ntype HydrogenRoutesDevOptions = {\n graphiql?: GraphiQLOptions;\n};\n\nexport const handleShopifyRoutesDev: HydrogenRouteHandler<HydrogenRoutesDevOptions> = (options) => {\n const productionResult = handleShopifyRoutes(options);\n if (productionResult) return productionResult;\n\n const graphiqlResult = handleGraphiql(new URL(options.request.url), options);\n if (!graphiqlResult) return null;\n\n return graphiqlResult.then((response) =>\n safeApplyResponseHeaders(response, options.requestContext),\n );\n};\n"],"mappings":";;;;;AAUA,MAAa,0BAA0E,YAAY;CACjG,MAAM,mBAAmB,oBAAoB,QAAQ;AACrD,KAAI,iBAAkB,QAAO;CAE7B,MAAM,iBAAiB,eAAe,IAAI,IAAI,QAAQ,QAAQ,IAAI,EAAE,QAAQ;AAC5E,KAAI,CAAC,eAAgB,QAAO;AAE5B,QAAO,eAAe,MAAM,aAC1B,yBAAyB,UAAU,QAAQ,eAAe,CAC3D"}
@@ -0,0 +1,42 @@
1
+ import { safeApplyResponseHeaders } from "./safe-apply-response-headers.mjs";
2
+ import { handleAgentProxy } from "./interceptors/agent-proxy.mjs";
3
+ import { handleAjaxApi } from "./interceptors/ajax-api.mjs";
4
+ import { handleShopifyApiProxy } from "./interceptors/api-proxy.mjs";
5
+ import { handleCheckoutRedirect } from "./interceptors/checkout.mjs";
6
+ import { handleMcpProxy } from "./interceptors/mcp-proxy.mjs";
7
+ import { handleSfapiProxy } from "./interceptors/sfapi-proxy.mjs";
8
+ import { handleWellKnownProxy } from "./interceptors/well-known.mjs";
9
+ import { handleShopifyRouteHandlers } from "./registered-routes.mjs";
10
+
11
+ //#region src/core/request-routing/handle-shopify-routes.ts
12
+ const SHOPIFY_ROUTE_INTERCEPTORS = [
13
+ handleShopifyApiProxy,
14
+ handleSfapiProxy,
15
+ handleShopifyRouteHandlers,
16
+ handleCheckoutRedirect,
17
+ handleWellKnownProxy,
18
+ handleMcpProxy,
19
+ handleAgentProxy,
20
+ handleAjaxApi
21
+ ];
22
+ /**
23
+ * Matches a request against Shopify standard routes and any registered handler
24
+ * groups, returning a raw `Response` (redirect or JSON) when one matches, or
25
+ * `null` when none do. Use it as the first step of request handling, before
26
+ * framework routing. Matched responses already include request-context
27
+ * response headers.
28
+ */
29
+ const handleShopifyRoutes = (options) => {
30
+ if (options.requestContext !== options.storefrontClient.requestContext) throw new Error("handleShopifyRoutes must receive the same requestContext used by storefrontClient.");
31
+ const url = new URL(options.request.url);
32
+ for (const interceptor of SHOPIFY_ROUTE_INTERCEPTORS) {
33
+ const responsePromise = interceptor(url, options);
34
+ if (!responsePromise) continue;
35
+ return responsePromise.then((response) => safeApplyResponseHeaders(response, options.requestContext));
36
+ }
37
+ return null;
38
+ };
39
+
40
+ //#endregion
41
+ export { handleShopifyRoutes };
42
+ //# sourceMappingURL=handle-shopify-routes.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-shopify-routes.mjs","names":[],"sources":["../../../../src/core/request-routing/handle-shopify-routes.ts"],"sourcesContent":["import { handleAgentProxy } from \"./interceptors/agent-proxy\";\nimport { handleAjaxApi } from \"./interceptors/ajax-api\";\nimport { handleShopifyApiProxy } from \"./interceptors/api-proxy\";\nimport { handleCheckoutRedirect } from \"./interceptors/checkout\";\nimport { handleMcpProxy } from \"./interceptors/mcp-proxy\";\nimport { handleSfapiProxy } from \"./interceptors/sfapi-proxy\";\nimport { handleWellKnownProxy } from \"./interceptors/well-known\";\nimport { handleShopifyRouteHandlers } from \"./registered-routes\";\nimport type { HydrogenRouteHandler, HydrogenRouteInterceptor } from \"./route-types\";\nimport { safeApplyResponseHeaders } from \"./safe-apply-response-headers\";\n\nconst SHOPIFY_ROUTE_INTERCEPTORS = [\n handleShopifyApiProxy,\n handleSfapiProxy,\n handleShopifyRouteHandlers,\n handleCheckoutRedirect,\n handleWellKnownProxy,\n handleMcpProxy,\n handleAgentProxy,\n handleAjaxApi,\n] satisfies readonly HydrogenRouteInterceptor[];\n\n/**\n * Matches a request against Shopify standard routes and any registered handler\n * groups, returning a raw `Response` (redirect or JSON) when one matches, or\n * `null` when none do. Use it as the first step of request handling, before\n * framework routing. Matched responses already include request-context\n * response headers.\n */\nexport const handleShopifyRoutes: HydrogenRouteHandler = (options) => {\n if (options.requestContext !== options.storefrontClient.requestContext) {\n throw new Error(\n \"handleShopifyRoutes must receive the same requestContext used by storefrontClient.\",\n );\n }\n\n const url = new URL(options.request.url);\n\n for (const interceptor of SHOPIFY_ROUTE_INTERCEPTORS) {\n const responsePromise = interceptor(url, options);\n if (!responsePromise) continue;\n\n return responsePromise.then((response) =>\n safeApplyResponseHeaders(response, options.requestContext),\n );\n }\n\n return null;\n};\n"],"mappings":";;;;;;;;;;;AAWA,MAAM,6BAA6B;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;;;AASD,MAAa,uBAA6C,YAAY;AACpE,KAAI,QAAQ,mBAAmB,QAAQ,iBAAiB,eACtD,OAAM,IAAI,MACR,qFACD;CAGH,MAAM,MAAM,IAAI,IAAI,QAAQ,QAAQ,IAAI;AAExC,MAAK,MAAM,eAAe,4BAA4B;EACpD,MAAM,kBAAkB,YAAY,KAAK,QAAQ;AACjD,MAAI,CAAC,gBAAiB;AAEtB,SAAO,gBAAgB,MAAM,aAC3B,yBAAyB,UAAU,QAAQ,eAAe,CAC3D;;AAGH,QAAO"}
@@ -0,0 +1,12 @@
1
+ //#region src/core/request-routing/interceptors/admin-redirect.ts
2
+ function handleAdminRedirect({ request, storefrontClient }) {
3
+ if (new URL(request.url).pathname !== "/admin") return null;
4
+ return new Response(null, {
5
+ status: 301,
6
+ headers: { location: new URL("/admin", storefrontClient.storeUrl).toString() }
7
+ });
8
+ }
9
+
10
+ //#endregion
11
+ export { handleAdminRedirect };
12
+ //# sourceMappingURL=admin-redirect.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-redirect.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/admin-redirect.ts"],"sourcesContent":["import type { RedirectOptions } from \"../handle-shopify-redirects\";\n\ntype AdminRedirectOptions = Pick<RedirectOptions, \"request\" | \"storefrontClient\">;\n\nexport function handleAdminRedirect({\n request,\n storefrontClient,\n}: AdminRedirectOptions): Response | null {\n const url = new URL(request.url);\n if (url.pathname !== \"/admin\") return null;\n\n return new Response(null, {\n status: 301,\n headers: { location: new URL(\"/admin\", storefrontClient.storeUrl).toString() },\n });\n}\n"],"mappings":";AAIA,SAAgB,oBAAoB,EAClC,SACA,oBACwC;AAExC,KAAI,IADY,IAAI,QAAQ,IACrB,CAAC,aAAa,SAAU,QAAO;AAEtC,QAAO,IAAI,SAAS,MAAM;EACxB,QAAQ;EACR,SAAS,EAAE,UAAU,IAAI,IAAI,UAAU,iBAAiB,SAAS,CAAC,UAAU,EAAE;EAC/E,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { AGENT_REQUEST_HEADER_ALLOWLIST, SHOPIFY_CHAT_FRAME_ORIGIN_HEADER } from "../../headers.mjs";
2
+ import { AGENT_BUYER_CLAIMS_RE } from "../../url.mjs";
3
+ import { createProxyInterceptor } from "./proxy.mjs";
4
+
5
+ //#region src/core/request-routing/interceptors/agent-proxy.ts
6
+ const handleAgentProxy = createProxyInterceptor({
7
+ match: AGENT_BUYER_CLAIMS_RE,
8
+ headers: {
9
+ allow: AGENT_REQUEST_HEADER_ALLOWLIST,
10
+ prepare(headers, _options, url) {
11
+ headers.set(SHOPIFY_CHAT_FRAME_ORIGIN_HEADER, url.origin);
12
+ }
13
+ },
14
+ scope: "agent-proxy"
15
+ });
16
+
17
+ //#endregion
18
+ export { handleAgentProxy };
19
+ //# sourceMappingURL=agent-proxy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-proxy.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/agent-proxy.ts"],"sourcesContent":["import { AGENT_REQUEST_HEADER_ALLOWLIST, SHOPIFY_CHAT_FRAME_ORIGIN_HEADER } from \"../../headers\";\nimport { AGENT_BUYER_CLAIMS_RE } from \"../../url\";\nimport { createProxyInterceptor } from \"./proxy\";\n\nexport const handleAgentProxy = createProxyInterceptor({\n match: AGENT_BUYER_CLAIMS_RE,\n headers: {\n allow: AGENT_REQUEST_HEADER_ALLOWLIST,\n prepare(headers, _options, url) {\n headers.set(SHOPIFY_CHAT_FRAME_ORIGIN_HEADER, url.origin);\n },\n },\n scope: \"agent-proxy\",\n});\n"],"mappings":";;;;;AAIA,MAAa,mBAAmB,uBAAuB;CACrD,OAAO;CACP,SAAS;EACP,OAAO;EACP,QAAQ,SAAS,UAAU,KAAK;AAC9B,WAAQ,IAAI,kCAAkC,IAAI,OAAO;;EAE5D;CACD,OAAO;CACR,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { AJAX_API_REQUEST_HEADER_ALLOWLIST } from "../../headers.mjs";
2
+ import { AJAX_CART_RE } from "../../url.mjs";
3
+ import { createProxyInterceptor } from "./proxy.mjs";
4
+
5
+ //#region src/core/request-routing/interceptors/ajax-api.ts
6
+ const rewriteShopifyJsPathname = (pathname) => pathname.replace(/\.js$/i, ".json");
7
+ const handleAjaxApi = createProxyInterceptor({
8
+ match: AJAX_CART_RE,
9
+ headers: { allow: AJAX_API_REQUEST_HEADER_ALLOWLIST },
10
+ rewritePathname: rewriteShopifyJsPathname,
11
+ scope: "ajax-api"
12
+ });
13
+
14
+ //#endregion
15
+ export { handleAjaxApi, rewriteShopifyJsPathname };
16
+ //# sourceMappingURL=ajax-api.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ajax-api.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/ajax-api.ts"],"sourcesContent":["import { AJAX_API_REQUEST_HEADER_ALLOWLIST } from \"../../headers\";\nimport { AJAX_CART_RE } from \"../../url\";\nimport { createProxyInterceptor } from \"./proxy\";\n\n// Known workaround for Shopify server redirects on `.js` endpoints.\nexport const rewriteShopifyJsPathname = (pathname: string): string =>\n pathname.replace(/\\.js$/i, \".json\");\n\nexport const handleAjaxApi = createProxyInterceptor({\n match: AJAX_CART_RE,\n headers: { allow: AJAX_API_REQUEST_HEADER_ALLOWLIST },\n rewritePathname: rewriteShopifyJsPathname,\n scope: \"ajax-api\",\n});\n"],"mappings":";;;;;AAKA,MAAa,4BAA4B,aACvC,SAAS,QAAQ,UAAU,QAAQ;AAErC,MAAa,gBAAgB,uBAAuB;CAClD,OAAO;CACP,SAAS,EAAE,OAAO,mCAAmC;CACrD,iBAAiB;CACjB,OAAO;CACR,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { PROXY_REQUEST_HEADER_DENYLIST } from "../../headers.mjs";
2
+ import { SHOPIFY_API_PROXY_PREFIX, SHOPIFY_API_PROXY_RE } from "../../url.mjs";
3
+ import { createProxyInterceptor } from "./proxy.mjs";
4
+ import { rewriteShopifyJsPathname } from "./ajax-api.mjs";
5
+
6
+ //#region src/core/request-routing/interceptors/api-proxy.ts
7
+ const handleShopifyApiProxy = createProxyInterceptor({
8
+ match: SHOPIFY_API_PROXY_RE,
9
+ headers: { deny: PROXY_REQUEST_HEADER_DENYLIST },
10
+ rewritePathname: (pathname) => {
11
+ const upstreamPathname = "/" + pathname.slice(SHOPIFY_API_PROXY_PREFIX.length).replace(/^\/+/, "");
12
+ if (upstreamPathname.startsWith("/cdn/")) throw new Error("CDN proxy is not supported.");
13
+ return rewriteShopifyJsPathname(upstreamPathname);
14
+ },
15
+ scope: "shopify-api-proxy"
16
+ });
17
+
18
+ //#endregion
19
+ export { handleShopifyApiProxy };
20
+ //# sourceMappingURL=api-proxy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-proxy.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/api-proxy.ts"],"sourcesContent":["import { PROXY_REQUEST_HEADER_DENYLIST } from \"../../headers\";\nimport { SHOPIFY_API_PROXY_PREFIX, SHOPIFY_API_PROXY_RE } from \"../../url\";\nimport { rewriteShopifyJsPathname } from \"./ajax-api\";\nimport { createProxyInterceptor } from \"./proxy\";\n\nexport const handleShopifyApiProxy = createProxyInterceptor({\n match: SHOPIFY_API_PROXY_RE,\n headers: { deny: PROXY_REQUEST_HEADER_DENYLIST },\n rewritePathname: (pathname) => {\n const upstreamPathname =\n \"/\" + pathname.slice(SHOPIFY_API_PROXY_PREFIX.length).replace(/^\\/+/, \"\");\n\n if (upstreamPathname.startsWith(\"/cdn/\")) {\n throw new Error(\"CDN proxy is not supported.\");\n }\n\n return rewriteShopifyJsPathname(upstreamPathname);\n },\n scope: \"shopify-api-proxy\",\n});\n"],"mappings":";;;;;;AAKA,MAAa,wBAAwB,uBAAuB;CAC1D,OAAO;CACP,SAAS,EAAE,MAAM,+BAA+B;CAChD,kBAAkB,aAAa;EAC7B,MAAM,mBACJ,MAAM,SAAS,MAAM,yBAAyB,OAAO,CAAC,QAAQ,QAAQ,GAAG;AAE3E,MAAI,iBAAiB,WAAW,QAAQ,CACtC,OAAM,IAAI,MAAM,8BAA8B;AAGhD,SAAO,yBAAyB,iBAAiB;;CAEnD,OAAO;CACR,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { getLogger } from "../../logging/logging.mjs";
2
+ import { CHECKOUT_RE, isHydrogenServerHandoffPath } from "../../url.mjs";
3
+ import { getCart, getCartId } from "../../cart/get-cart.mjs";
4
+
5
+ //#region src/core/request-routing/interceptors/checkout.ts
6
+ const log = getLogger("checkout");
7
+ const MOCK_SHOP_CART_PERMALINK_ORIGIN = "https://demostore.mock.shop";
8
+ const handleCheckoutRedirect = (url, { request, storefrontClient }) => {
9
+ if (!isHydrogenServerHandoffPath(url.pathname)) return null;
10
+ if (request.method !== "GET" && request.method !== "HEAD") return Promise.resolve(new Response("Method Not Allowed", { status: 405 }));
11
+ return (CHECKOUT_RE.test(url.pathname) ? getCheckoutRedirectUrl(request, storefrontClient) : getCartRedirectUrl(request, storefrontClient)).then((redirectUrl) => {
12
+ if (redirectUrl.pathname !== "/") {
13
+ mergeSearchParams(redirectUrl, url.searchParams);
14
+ redirectUrl.searchParams.set("payment", url.searchParams.get("payment") ?? "shop_pay");
15
+ }
16
+ return new Response(null, {
17
+ status: 302,
18
+ headers: { location: redirectUrl.toString() }
19
+ });
20
+ }).catch((error) => {
21
+ log.error("checkout redirect request failed", { error });
22
+ const message = error instanceof Error ? error.message : "Internal redirect error";
23
+ return new Response(JSON.stringify({ error: message }), {
24
+ status: 502,
25
+ headers: { "content-type": "application/json" }
26
+ });
27
+ });
28
+ };
29
+ async function getCheckoutRedirectUrl(request, storefrontClient) {
30
+ const cartId = getCartId(request);
31
+ if (!cartId) return new URL("/", request.url);
32
+ const result = await getCart(cartId, storefrontClient);
33
+ return result.cart?.checkoutUrl ? new URL(result.cart.checkoutUrl) : new URL("/", request.url);
34
+ }
35
+ async function getCartRedirectUrl(request, storefrontClient) {
36
+ const sourceUrl = new URL(request.url);
37
+ const redirectUrl = new URL(sourceUrl.pathname, getCartPermalinkOrigin(storefrontClient.storeUrl));
38
+ const cartId = getCartId(request);
39
+ if (!cartId) return redirectUrl;
40
+ try {
41
+ const result = await getCart(cartId, storefrontClient);
42
+ if (result.cart?.checkoutUrl) mergeSearchParams(redirectUrl, new URL(result.cart.checkoutUrl).searchParams);
43
+ } catch (error) {
44
+ log.warn("checkout redirect could not load cart permalink tracking params", { error });
45
+ }
46
+ return redirectUrl;
47
+ }
48
+ function getCartPermalinkOrigin(storeUrl) {
49
+ const url = new URL(storeUrl);
50
+ return url.hostname === "mock.shop" ? MOCK_SHOP_CART_PERMALINK_ORIGIN : url.origin;
51
+ }
52
+ function mergeSearchParams(target, source) {
53
+ for (const [key, value] of source) if (!target.searchParams.has(key)) target.searchParams.append(key, value);
54
+ }
55
+
56
+ //#endregion
57
+ export { handleCheckoutRedirect };
58
+ //# sourceMappingURL=checkout.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkout.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/checkout.ts"],"sourcesContent":["import type { StorefrontClient } from \"../../../client\";\nimport { getCart, getCartId } from \"../../cart/get-cart\";\nimport { getLogger } from \"../../logging\";\nimport { CHECKOUT_RE, isHydrogenServerHandoffPath } from \"../../url\";\nimport type { HydrogenRouteInterceptor } from \"../route-types\";\n\nconst log = getLogger(\"checkout\");\nconst MOCK_SHOP_CART_PERMALINK_ORIGIN = \"https://demostore.mock.shop\";\n\nexport const handleCheckoutRedirect: HydrogenRouteInterceptor = (\n url,\n { request, storefrontClient },\n) => {\n if (!isHydrogenServerHandoffPath(url.pathname)) {\n return null;\n }\n\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return Promise.resolve(new Response(\"Method Not Allowed\", { status: 405 }));\n }\n\n const redirectUrlPromise = CHECKOUT_RE.test(url.pathname)\n ? getCheckoutRedirectUrl(request, storefrontClient)\n : getCartRedirectUrl(request, storefrontClient);\n\n return redirectUrlPromise\n .then((redirectUrl) => {\n if (redirectUrl.pathname !== \"/\") {\n mergeSearchParams(redirectUrl, url.searchParams);\n redirectUrl.searchParams.set(\"payment\", url.searchParams.get(\"payment\") ?? \"shop_pay\");\n }\n\n return new Response(null, {\n status: 302,\n headers: { location: redirectUrl.toString() },\n });\n })\n .catch((error) => {\n log.error(\"checkout redirect request failed\", { error });\n const message = error instanceof Error ? error.message : \"Internal redirect error\";\n\n return new Response(JSON.stringify({ error: message }), {\n status: 502,\n headers: { \"content-type\": \"application/json\" },\n });\n });\n};\n\nasync function getCheckoutRedirectUrl(\n request: Request,\n storefrontClient: StorefrontClient,\n): Promise<URL> {\n const cartId = getCartId(request);\n if (!cartId) return new URL(\"/\", request.url);\n\n const result = await getCart(cartId, storefrontClient);\n return result.cart?.checkoutUrl ? new URL(result.cart.checkoutUrl) : new URL(\"/\", request.url);\n}\n\nasync function getCartRedirectUrl(\n request: Request,\n storefrontClient: StorefrontClient,\n): Promise<URL> {\n const sourceUrl = new URL(request.url);\n const redirectUrl = new URL(\n sourceUrl.pathname,\n getCartPermalinkOrigin(storefrontClient.storeUrl),\n );\n\n const cartId = getCartId(request);\n if (!cartId) return redirectUrl;\n\n try {\n const result = await getCart(cartId, storefrontClient);\n if (result.cart?.checkoutUrl) {\n mergeSearchParams(redirectUrl, new URL(result.cart.checkoutUrl).searchParams);\n }\n } catch (error) {\n log.warn(\"checkout redirect could not load cart permalink tracking params\", { error });\n }\n\n return redirectUrl;\n}\n\nfunction getCartPermalinkOrigin(storeUrl: string): string {\n const url = new URL(storeUrl);\n return url.hostname === \"mock.shop\" ? MOCK_SHOP_CART_PERMALINK_ORIGIN : url.origin;\n}\n\nfunction mergeSearchParams(target: URL, source: URLSearchParams): void {\n for (const [key, value] of source) {\n if (!target.searchParams.has(key)) target.searchParams.append(key, value);\n }\n}\n"],"mappings":";;;;;AAMA,MAAM,MAAM,UAAU,WAAW;AACjC,MAAM,kCAAkC;AAExC,MAAa,0BACX,KACA,EAAE,SAAS,uBACR;AACH,KAAI,CAAC,4BAA4B,IAAI,SAAS,CAC5C,QAAO;AAGT,KAAI,QAAQ,WAAW,SAAS,QAAQ,WAAW,OACjD,QAAO,QAAQ,QAAQ,IAAI,SAAS,sBAAsB,EAAE,QAAQ,KAAK,CAAC,CAAC;AAO7E,SAJ2B,YAAY,KAAK,IAAI,SAAS,GACrD,uBAAuB,SAAS,iBAAiB,GACjD,mBAAmB,SAAS,iBAAiB,EAG9C,MAAM,gBAAgB;AACrB,MAAI,YAAY,aAAa,KAAK;AAChC,qBAAkB,aAAa,IAAI,aAAa;AAChD,eAAY,aAAa,IAAI,WAAW,IAAI,aAAa,IAAI,UAAU,IAAI,WAAW;;AAGxF,SAAO,IAAI,SAAS,MAAM;GACxB,QAAQ;GACR,SAAS,EAAE,UAAU,YAAY,UAAU,EAAE;GAC9C,CAAC;GACF,CACD,OAAO,UAAU;AAChB,MAAI,MAAM,oCAAoC,EAAE,OAAO,CAAC;EACxD,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AAEzD,SAAO,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,SAAS,CAAC,EAAE;GACtD,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAChD,CAAC;GACF;;AAGN,eAAe,uBACb,SACA,kBACc;CACd,MAAM,SAAS,UAAU,QAAQ;AACjC,KAAI,CAAC,OAAQ,QAAO,IAAI,IAAI,KAAK,QAAQ,IAAI;CAE7C,MAAM,SAAS,MAAM,QAAQ,QAAQ,iBAAiB;AACtD,QAAO,OAAO,MAAM,cAAc,IAAI,IAAI,OAAO,KAAK,YAAY,GAAG,IAAI,IAAI,KAAK,QAAQ,IAAI;;AAGhG,eAAe,mBACb,SACA,kBACc;CACd,MAAM,YAAY,IAAI,IAAI,QAAQ,IAAI;CACtC,MAAM,cAAc,IAAI,IACtB,UAAU,UACV,uBAAuB,iBAAiB,SAAS,CAClD;CAED,MAAM,SAAS,UAAU,QAAQ;AACjC,KAAI,CAAC,OAAQ,QAAO;AAEpB,KAAI;EACF,MAAM,SAAS,MAAM,QAAQ,QAAQ,iBAAiB;AACtD,MAAI,OAAO,MAAM,YACf,mBAAkB,aAAa,IAAI,IAAI,OAAO,KAAK,YAAY,CAAC,aAAa;UAExE,OAAO;AACd,MAAI,KAAK,mEAAmE,EAAE,OAAO,CAAC;;AAGxF,QAAO;;AAGT,SAAS,uBAAuB,UAA0B;CACxD,MAAM,MAAM,IAAI,IAAI,SAAS;AAC7B,QAAO,IAAI,aAAa,cAAc,kCAAkC,IAAI;;AAG9E,SAAS,kBAAkB,QAAa,QAA+B;AACrE,MAAK,MAAM,CAAC,KAAK,UAAU,OACzB,KAAI,CAAC,OAAO,aAAa,IAAI,IAAI,CAAE,QAAO,aAAa,OAAO,KAAK,MAAM"}