@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,46 @@
1
+ //#region src/core/shopify-scripts/utils/navigation.ts
2
+ const navigationCallbacks = /* @__PURE__ */ new Set();
3
+ let stopObservingNavigation;
4
+ function observeNavigation(callback) {
5
+ navigationCallbacks.add(callback);
6
+ stopObservingNavigation ??= startObservingNavigation();
7
+ return () => {
8
+ navigationCallbacks.delete(callback);
9
+ if (navigationCallbacks.size > 0) return;
10
+ stopObservingNavigation?.();
11
+ stopObservingNavigation = void 0;
12
+ };
13
+ }
14
+ function startObservingNavigation() {
15
+ const navigation = Reflect.get(window, "navigation");
16
+ if (navigation instanceof EventTarget) {
17
+ navigation.addEventListener("currententrychange", notifyNavigationCallbacks);
18
+ return () => navigation.removeEventListener("currententrychange", notifyNavigationCallbacks);
19
+ }
20
+ const restorePushState = patchHistoryMethod("pushState");
21
+ const restoreReplaceState = patchHistoryMethod("replaceState");
22
+ window.addEventListener("popstate", notifyNavigationCallbacks);
23
+ return () => {
24
+ restorePushState();
25
+ restoreReplaceState();
26
+ window.removeEventListener("popstate", notifyNavigationCallbacks);
27
+ };
28
+ }
29
+ function notifyNavigationCallbacks() {
30
+ for (const callback of navigationCallbacks) callback();
31
+ }
32
+ function patchHistoryMethod(method) {
33
+ const original = window.history[method];
34
+ const patched = function(data, unused, url) {
35
+ original.call(this, data, unused, url);
36
+ notifyNavigationCallbacks();
37
+ };
38
+ window.history[method] = patched;
39
+ return () => {
40
+ if (window.history[method] === patched) window.history[method] = original;
41
+ };
42
+ }
43
+
44
+ //#endregion
45
+ export { observeNavigation };
46
+ //# sourceMappingURL=navigation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.mjs","names":[],"sources":["../../../../src/core/shopify-scripts/utils/navigation.ts"],"sourcesContent":["const navigationCallbacks = new Set<() => void>();\nlet stopObservingNavigation: (() => void) | undefined;\n\nexport function observeNavigation(callback: () => void) {\n navigationCallbacks.add(callback);\n stopObservingNavigation ??= startObservingNavigation();\n\n return () => {\n navigationCallbacks.delete(callback);\n if (navigationCallbacks.size > 0) return;\n\n stopObservingNavigation?.();\n stopObservingNavigation = undefined;\n };\n}\n\nfunction startObservingNavigation() {\n const navigation = Reflect.get(window, \"navigation\");\n if (navigation instanceof EventTarget) {\n navigation.addEventListener(\"currententrychange\", notifyNavigationCallbacks);\n return () => navigation.removeEventListener(\"currententrychange\", notifyNavigationCallbacks);\n }\n\n const restorePushState = patchHistoryMethod(\"pushState\");\n const restoreReplaceState = patchHistoryMethod(\"replaceState\");\n window.addEventListener(\"popstate\", notifyNavigationCallbacks);\n\n return () => {\n restorePushState();\n restoreReplaceState();\n window.removeEventListener(\"popstate\", notifyNavigationCallbacks);\n };\n}\n\nfunction notifyNavigationCallbacks() {\n for (const callback of navigationCallbacks) callback();\n}\n\nfunction patchHistoryMethod(method: \"pushState\" | \"replaceState\") {\n const original = window.history[method];\n const patched: History[typeof method] = function (this: History, data, unused, url) {\n original.call(this, data, unused, url);\n notifyNavigationCallbacks();\n };\n\n window.history[method] = patched;\n\n return () => {\n if (window.history[method] === patched) window.history[method] = original;\n };\n}\n"],"mappings":";AAAA,MAAM,sCAAsB,IAAI,KAAiB;AACjD,IAAI;AAEJ,SAAgB,kBAAkB,UAAsB;AACtD,qBAAoB,IAAI,SAAS;AACjC,6BAA4B,0BAA0B;AAEtD,cAAa;AACX,sBAAoB,OAAO,SAAS;AACpC,MAAI,oBAAoB,OAAO,EAAG;AAElC,6BAA2B;AAC3B,4BAA0B;;;AAI9B,SAAS,2BAA2B;CAClC,MAAM,aAAa,QAAQ,IAAI,QAAQ,aAAa;AACpD,KAAI,sBAAsB,aAAa;AACrC,aAAW,iBAAiB,sBAAsB,0BAA0B;AAC5E,eAAa,WAAW,oBAAoB,sBAAsB,0BAA0B;;CAG9F,MAAM,mBAAmB,mBAAmB,YAAY;CACxD,MAAM,sBAAsB,mBAAmB,eAAe;AAC9D,QAAO,iBAAiB,YAAY,0BAA0B;AAE9D,cAAa;AACX,oBAAkB;AAClB,uBAAqB;AACrB,SAAO,oBAAoB,YAAY,0BAA0B;;;AAIrE,SAAS,4BAA4B;AACnC,MAAK,MAAM,YAAY,oBAAqB,WAAU;;AAGxD,SAAS,mBAAmB,QAAsC;CAChE,MAAM,WAAW,OAAO,QAAQ;CAChC,MAAM,UAAkC,SAAyB,MAAM,QAAQ,KAAK;AAClF,WAAS,KAAK,MAAM,MAAM,QAAQ,IAAI;AACtC,6BAA2B;;AAG7B,QAAO,QAAQ,UAAU;AAEzB,cAAa;AACX,MAAI,OAAO,QAAQ,YAAY,QAAS,QAAO,QAAQ,UAAU"}
@@ -0,0 +1,65 @@
1
+ //#region src/core/shopify-scripts/utils/tracking-values.ts
2
+ const cachedTrackingValues = { current: null };
3
+ function getTrackingValues() {
4
+ let trackingValues;
5
+ if (typeof window !== "undefined" && typeof window.performance !== "undefined") try {
6
+ const resourceRE = /^https?:\/\/([^/]+)(\/api\/(?:unstable|2\d{3}-\d{2})\/graphql\.json(?=$|\?))?/;
7
+ const entries = performance.getEntriesByType("resource");
8
+ let matchedValues;
9
+ for (let i = entries.length - 1; i >= 0; i--) {
10
+ const entry = entries[i];
11
+ if (entry.initiatorType !== "fetch") continue;
12
+ const currentHost = window.location.host;
13
+ const match = entry.name.match(resourceRE);
14
+ if (!match) continue;
15
+ const [, matchedHost, sfapiPath] = match;
16
+ if (matchedHost === currentHost || sfapiPath && matchedHost?.endsWith(`.${currentHost}`)) {
17
+ const values = extractFromPerformanceEntry(entry);
18
+ if (values) {
19
+ matchedValues = values;
20
+ break;
21
+ }
22
+ }
23
+ }
24
+ if (matchedValues) trackingValues = matchedValues;
25
+ if (trackingValues) cachedTrackingValues.current = trackingValues;
26
+ else if (cachedTrackingValues.current) trackingValues = cachedTrackingValues.current;
27
+ if (!trackingValues) {
28
+ const navigationEntries = performance.getEntriesByType("navigation")[0];
29
+ trackingValues = extractFromPerformanceEntry(navigationEntries, false);
30
+ }
31
+ } catch {}
32
+ if (!trackingValues) {
33
+ const cookie = typeof document !== "undefined" ? document.cookie : "";
34
+ trackingValues = {
35
+ uniqueToken: cookie.match(/\b_shopify_y=([^;]+)/)?.[1] || "",
36
+ visitToken: cookie.match(/\b_shopify_s=([^;]+)/)?.[1] || "",
37
+ consent: cookie.match(/\b_tracking_consent=([^;]+)/)?.[1] || ""
38
+ };
39
+ }
40
+ return trackingValues;
41
+ }
42
+ function extractFromPerformanceEntry(entry, isConsentRequired = true) {
43
+ let uniqueToken = "";
44
+ let visitToken = "";
45
+ let consent = "";
46
+ const serverTiming = entry.serverTiming;
47
+ const minimumEntries = isConsentRequired ? 3 : 2;
48
+ if (serverTiming && serverTiming.length >= minimumEntries) for (let i = serverTiming.length - 1; i >= 0; i--) {
49
+ const { name, description } = serverTiming[i];
50
+ if (!name || !description) continue;
51
+ if (name === "_y") uniqueToken = description;
52
+ else if (name === "_s") visitToken = description;
53
+ else if (name === "_cmp") consent = description;
54
+ if (uniqueToken && visitToken && consent) break;
55
+ }
56
+ return uniqueToken && visitToken && (isConsentRequired ? consent : true) ? {
57
+ uniqueToken,
58
+ visitToken,
59
+ consent
60
+ } : void 0;
61
+ }
62
+
63
+ //#endregion
64
+ export { getTrackingValues };
65
+ //# sourceMappingURL=tracking-values.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking-values.mjs","names":[],"sources":["../../../../src/core/shopify-scripts/utils/tracking-values.ts"],"sourcesContent":["/**\n * Inlined from @shopify/hydrogen-react/tracking-utils.\n * Retrieves user session tracking values from Server-Timing headers\n * and the Performance API.\n */\n\ntype TrackingValues = {\n uniqueToken: string;\n visitToken: string;\n consent: string;\n};\n\nconst cachedTrackingValues: { current: null | TrackingValues } = { current: null };\n\nexport function getTrackingValues(): TrackingValues {\n // Tracking values are returned in Server-Timing headers from SFAPI responses.\n // Prefer recent fetch/resource entries, then cached values, then the initial\n // navigation entry, and finally the deprecated JS-visible cookies.\n let trackingValues: TrackingValues | undefined;\n\n if (typeof window !== \"undefined\" && typeof window.performance !== \"undefined\") {\n try {\n // Extract host and optionally match the SFAPI GraphQL pathname.\n const resourceRE =\n /^https?:\\/\\/([^/]+)(\\/api\\/(?:unstable|2\\d{3}-\\d{2})\\/graphql\\.json(?=$|\\?))?/;\n\n // Search backwards so the latest matching fetch with complete tracking\n // values wins. Same-origin fetches cover Hydrogen proxy/server responses;\n // subdomain SFAPI requests cover direct Storefront API calls.\n const entries = performance.getEntriesByType(\"resource\") as PerformanceResourceTiming[];\n\n let matchedValues: TrackingValues | undefined;\n\n for (let i = entries.length - 1; i >= 0; i--) {\n const entry = entries[i];\n if (entry.initiatorType !== \"fetch\") continue;\n\n const currentHost = window.location.host;\n const match = entry.name.match(resourceRE);\n if (!match) continue;\n\n const [, matchedHost, sfapiPath] = match;\n const isMatch =\n matchedHost === currentHost || (sfapiPath && matchedHost?.endsWith(`.${currentHost}`));\n\n if (isMatch) {\n const values = extractFromPerformanceEntry(entry);\n if (values) {\n matchedValues = values;\n break;\n }\n }\n }\n\n if (matchedValues) {\n trackingValues = matchedValues;\n }\n\n // Resource entries have a limited buffer and can be removed over time.\n // A cached resource entry is newer than the navigation entry.\n if (trackingValues) {\n cachedTrackingValues.current = trackingValues;\n } else if (cachedTrackingValues.current) {\n trackingValues = cachedTrackingValues.current;\n }\n\n if (!trackingValues) {\n // The document navigation entry can omit _cmp when the server generated\n // tracking tokens, so only _y and _s are required for this fallback.\n const navigationEntries = performance.getEntriesByType(\n \"navigation\",\n )[0] as PerformanceNavigationTiming;\n trackingValues = extractFromPerformanceEntry(navigationEntries, false);\n }\n } catch {}\n }\n\n if (!trackingValues) {\n const cookie = typeof document !== \"undefined\" ? document.cookie : \"\";\n\n trackingValues = {\n uniqueToken: cookie.match(/\\b_shopify_y=([^;]+)/)?.[1] || \"\",\n visitToken: cookie.match(/\\b_shopify_s=([^;]+)/)?.[1] || \"\",\n consent: cookie.match(/\\b_tracking_consent=([^;]+)/)?.[1] || \"\",\n };\n }\n\n return trackingValues;\n}\n\nfunction extractFromPerformanceEntry(\n entry: PerformanceNavigationTiming | PerformanceResourceTiming,\n isConsentRequired = true,\n): TrackingValues | undefined {\n let uniqueToken = \"\";\n let visitToken = \"\";\n let consent = \"\";\n\n const serverTiming = entry.serverTiming;\n const minimumEntries = isConsentRequired ? 3 : 2;\n if (serverTiming && serverTiming.length >= minimumEntries) {\n // Iterate backwards since Shopify tracking metrics are usually appended\n // after framework/server metrics.\n for (let i = serverTiming.length - 1; i >= 0; i--) {\n const { name, description } = serverTiming[i];\n if (!name || !description) continue;\n\n if (name === \"_y\") uniqueToken = description;\n else if (name === \"_s\") visitToken = description;\n else if (name === \"_cmp\") {\n // Consent value used by consent-tracking-api and privacy-banner scripts.\n consent = description;\n }\n\n if (uniqueToken && visitToken && consent) break;\n }\n }\n\n return uniqueToken && visitToken && (isConsentRequired ? consent : true)\n ? { uniqueToken, visitToken, consent }\n : undefined;\n}\n"],"mappings":";AAYA,MAAM,uBAA2D,EAAE,SAAS,MAAM;AAElF,SAAgB,oBAAoC;CAIlD,IAAI;AAEJ,KAAI,OAAO,WAAW,eAAe,OAAO,OAAO,gBAAgB,YACjE,KAAI;EAEF,MAAM,aACJ;EAKF,MAAM,UAAU,YAAY,iBAAiB,WAAW;EAExD,IAAI;AAEJ,OAAK,IAAI,IAAI,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;GAC5C,MAAM,QAAQ,QAAQ;AACtB,OAAI,MAAM,kBAAkB,QAAS;GAErC,MAAM,cAAc,OAAO,SAAS;GACpC,MAAM,QAAQ,MAAM,KAAK,MAAM,WAAW;AAC1C,OAAI,CAAC,MAAO;GAEZ,MAAM,GAAG,aAAa,aAAa;AAInC,OAFE,gBAAgB,eAAgB,aAAa,aAAa,SAAS,IAAI,cAAc,EAE1E;IACX,MAAM,SAAS,4BAA4B,MAAM;AACjD,QAAI,QAAQ;AACV,qBAAgB;AAChB;;;;AAKN,MAAI,cACF,kBAAiB;AAKnB,MAAI,eACF,sBAAqB,UAAU;WACtB,qBAAqB,QAC9B,kBAAiB,qBAAqB;AAGxC,MAAI,CAAC,gBAAgB;GAGnB,MAAM,oBAAoB,YAAY,iBACpC,aACD,CAAC;AACF,oBAAiB,4BAA4B,mBAAmB,MAAM;;SAElE;AAGV,KAAI,CAAC,gBAAgB;EACnB,MAAM,SAAS,OAAO,aAAa,cAAc,SAAS,SAAS;AAEnE,mBAAiB;GACf,aAAa,OAAO,MAAM,uBAAuB,GAAG,MAAM;GAC1D,YAAY,OAAO,MAAM,uBAAuB,GAAG,MAAM;GACzD,SAAS,OAAO,MAAM,8BAA8B,GAAG,MAAM;GAC9D;;AAGH,QAAO;;AAGT,SAAS,4BACP,OACA,oBAAoB,MACQ;CAC5B,IAAI,cAAc;CAClB,IAAI,aAAa;CACjB,IAAI,UAAU;CAEd,MAAM,eAAe,MAAM;CAC3B,MAAM,iBAAiB,oBAAoB,IAAI;AAC/C,KAAI,gBAAgB,aAAa,UAAU,eAGzC,MAAK,IAAI,IAAI,aAAa,SAAS,GAAG,KAAK,GAAG,KAAK;EACjD,MAAM,EAAE,MAAM,gBAAgB,aAAa;AAC3C,MAAI,CAAC,QAAQ,CAAC,YAAa;AAE3B,MAAI,SAAS,KAAM,eAAc;WACxB,SAAS,KAAM,cAAa;WAC5B,SAAS,OAEhB,WAAU;AAGZ,MAAI,eAAe,cAAc,QAAS;;AAI9C,QAAO,eAAe,eAAe,oBAAoB,UAAU,QAC/D;EAAE;EAAa;EAAY;EAAS,GACpC"}
@@ -0,0 +1,17 @@
1
+ //#region src/core/shopify-scripts/utils/uuid.ts
2
+ /**
3
+ * Inlined from @shopify/hydrogen-react/analytics-utils.
4
+ * UUID v4 generator for analytics event IDs.
5
+ */
6
+ const UUID_V4_REPLACE_REGEX = /[018]/g;
7
+ const CRYPTO_RANDOM_VALUES_ARRAY = new Uint8Array(1);
8
+ function buildUUID() {
9
+ return "10000000-1000-4000-8000-100000000000".replace(UUID_V4_REPLACE_REGEX, (c) => {
10
+ const randomValue = crypto.getRandomValues(CRYPTO_RANDOM_VALUES_ARRAY)[0];
11
+ return (+c ^ randomValue & 15 >> +c / 4).toString(16);
12
+ });
13
+ }
14
+
15
+ //#endregion
16
+ export { buildUUID };
17
+ //# sourceMappingURL=uuid.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.mjs","names":[],"sources":["../../../../src/core/shopify-scripts/utils/uuid.ts"],"sourcesContent":["/**\n * Inlined from @shopify/hydrogen-react/analytics-utils.\n * UUID v4 generator for analytics event IDs.\n */\n\nconst UUID_V4_REPLACE_REGEX = /[018]/g;\nconst CRYPTO_RANDOM_VALUES_ARRAY = new Uint8Array(1);\n\nexport function buildUUID(): string {\n return \"10000000-1000-4000-8000-100000000000\".replace(UUID_V4_REPLACE_REGEX, (c) => {\n const randomValue = crypto.getRandomValues(CRYPTO_RANDOM_VALUES_ARRAY)[0];\n return (+c ^ (randomValue & (15 >> (+c / 4)))).toString(16);\n });\n}\n"],"mappings":";;;;;AAKA,MAAM,wBAAwB;AAC9B,MAAM,6BAA6B,IAAI,WAAW,EAAE;AAEpD,SAAgB,YAAoB;AAClC,QAAO,uCAAuC,QAAQ,wBAAwB,MAAM;EAClF,MAAM,cAAc,OAAO,gBAAgB,2BAA2B,CAAC;AACvE,UAAQ,CAAC,IAAK,cAAe,MAAO,CAAC,IAAI,GAAM,SAAS,GAAG;GAC3D"}
@@ -0,0 +1,22 @@
1
+ import { getLogger } from "../logging/logging.mjs";
2
+ import { SHOPIFY_STOREFRONT_WEBMCP_SCRIPT } from "./constants.mjs";
3
+ import { loadScript } from "../utils/load-script.mjs";
4
+
5
+ //#region src/core/shopify-scripts/webmcp.ts
6
+ const log = getLogger("webmcp");
7
+ function loadShopifyWebMcpTools() {
8
+ if (typeof document !== "undefined" && "modelContext" in document || typeof navigator !== "undefined" && "modelContext" in navigator) return loadScript(SHOPIFY_STOREFRONT_WEBMCP_SCRIPT, {
9
+ in: "head",
10
+ attributes: {
11
+ id: "shopify-webmcp",
12
+ crossorigin: "anonymous"
13
+ }
14
+ }).catch((error) => {
15
+ log.warn("failed to load Shopify WebMCP", { error });
16
+ });
17
+ return Promise.resolve();
18
+ }
19
+
20
+ //#endregion
21
+ export { loadShopifyWebMcpTools };
22
+ //# sourceMappingURL=webmcp.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webmcp.mjs","names":[],"sources":["../../../src/core/shopify-scripts/webmcp.ts"],"sourcesContent":["import { getLogger } from \"../logging\";\nimport { loadScript } from \"../utils/load-script\";\nimport { SHOPIFY_STOREFRONT_WEBMCP_SCRIPT } from \"./constants\";\n\nconst log = getLogger(\"webmcp\");\n\nexport function loadShopifyWebMcpTools(): Promise<boolean | void> {\n if (\n (typeof document !== \"undefined\" && \"modelContext\" in document) ||\n (typeof navigator !== \"undefined\" && \"modelContext\" in navigator)\n ) {\n return loadScript(SHOPIFY_STOREFRONT_WEBMCP_SCRIPT, {\n in: \"head\",\n attributes: { id: \"shopify-webmcp\", crossorigin: \"anonymous\" },\n }).catch((error) => {\n log.warn(\"failed to load Shopify WebMCP\", { error });\n });\n }\n\n return Promise.resolve();\n}\n"],"mappings":";;;;;AAIA,MAAM,MAAM,UAAU,SAAS;AAE/B,SAAgB,yBAAkD;AAChE,KACG,OAAO,aAAa,eAAe,kBAAkB,YACrD,OAAO,cAAc,eAAe,kBAAkB,UAEvD,QAAO,WAAW,kCAAkC;EAClD,IAAI;EACJ,YAAY;GAAE,IAAI;GAAkB,aAAa;GAAa;EAC/D,CAAC,CAAC,OAAO,UAAU;AAClB,MAAI,KAAK,iCAAiC,EAAE,OAAO,CAAC;GACpD;AAGJ,QAAO,QAAQ,SAAS"}
@@ -0,0 +1,34 @@
1
+ import { ShopifyRouteTemplates } from "./types.mjs";
2
+
3
+ //#region src/core/standard-routes/build.d.ts
4
+ /**
5
+ * Creates a typed map of custom route templates for Shopify standard storefront routes.
6
+ *
7
+ * Use the returned object anywhere Hydrogen needs to understand the app's URL shape for
8
+ * Shopify resources and utility pages: `handleShopifyRedirects({routeTemplates})`, `ShopifyScripts`
9
+ * `routes={routeTemplates}`, and predictive search URL helpers.
10
+ *
11
+ * Each key represents a Shopify standard route identity, while each value is the app's custom
12
+ * pathname template. Templates must start with `/` and include the required named handle
13
+ * placeholders for routes that identify a resource. Do not include an i18n path prefix in the
14
+ * template; Hydrogen applies `i18n.pathPrefix` separately when resolving routes. Pass an empty
15
+ * object when the app uses standard storefront routes so there is still one app-owned routing
16
+ * manifest to update if routes change later. When matching the current page, standard storefront
17
+ * routes retain their page-template identities even if a configured template resolves another
18
+ * route to the same pathname.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * const routeTemplates = createShopifyRouteTemplates({
23
+ * product: "/p/:productHandle",
24
+ * collection: "/c/:collectionHandle",
25
+ * article: "/journal/:blogHandle/:articleHandle",
26
+ * cart: "/basket",
27
+ * policy: "/legal/:policyHandle",
28
+ * });
29
+ * ```
30
+ */
31
+ declare function createShopifyRouteTemplates<const TRoutes extends ShopifyRouteTemplates>(routes: TRoutes): TRoutes;
32
+ //#endregion
33
+ export { createShopifyRouteTemplates };
34
+ //# sourceMappingURL=build.d.mts.map
@@ -0,0 +1,54 @@
1
+ import { DEFAULT_STANDARD_ROUTES, isStandardRouteParamName } from "./defaults.mjs";
2
+ import { prependPathPrefix } from "./path.mjs";
3
+
4
+ //#region src/core/standard-routes/build.ts
5
+ /**
6
+ * Creates a typed map of custom route templates for Shopify standard storefront routes.
7
+ *
8
+ * Use the returned object anywhere Hydrogen needs to understand the app's URL shape for
9
+ * Shopify resources and utility pages: `handleShopifyRedirects({routeTemplates})`, `ShopifyScripts`
10
+ * `routes={routeTemplates}`, and predictive search URL helpers.
11
+ *
12
+ * Each key represents a Shopify standard route identity, while each value is the app's custom
13
+ * pathname template. Templates must start with `/` and include the required named handle
14
+ * placeholders for routes that identify a resource. Do not include an i18n path prefix in the
15
+ * template; Hydrogen applies `i18n.pathPrefix` separately when resolving routes. Pass an empty
16
+ * object when the app uses standard storefront routes so there is still one app-owned routing
17
+ * manifest to update if routes change later. When matching the current page, standard storefront
18
+ * routes retain their page-template identities even if a configured template resolves another
19
+ * route to the same pathname.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * const routeTemplates = createShopifyRouteTemplates({
24
+ * product: "/p/:productHandle",
25
+ * collection: "/c/:collectionHandle",
26
+ * article: "/journal/:blogHandle/:articleHandle",
27
+ * cart: "/basket",
28
+ * policy: "/legal/:policyHandle",
29
+ * });
30
+ * ```
31
+ */
32
+ function createShopifyRouteTemplates(routes) {
33
+ return routes;
34
+ }
35
+ function getStandardRoute(routeTemplates, route, params, options = {}) {
36
+ return buildStandardRouteTarget(routeTemplates[route] ?? DEFAULT_STANDARD_ROUTES[route][0], params, options.pathPrefix);
37
+ }
38
+ /**
39
+ * Builds a pathname from a route template, handle params, and optional i18n path prefix.
40
+ */
41
+ function buildStandardRouteTarget(template, params, pathPrefix) {
42
+ return prependPathPrefix(interpolateRouteTemplate(template, params), pathPrefix);
43
+ }
44
+ function interpolateRouteTemplate(template, params) {
45
+ return template.replace(/:([A-Za-z][A-Za-z0-9_]*)/g, (placeholder, name) => {
46
+ if (!isStandardRouteParamName(name)) return placeholder;
47
+ const value = params[name];
48
+ return value === void 0 ? placeholder : encodeURIComponent(value);
49
+ });
50
+ }
51
+
52
+ //#endregion
53
+ export { buildStandardRouteTarget, createShopifyRouteTemplates, getStandardRoute };
54
+ //# sourceMappingURL=build.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.mjs","names":[],"sources":["../../../src/core/standard-routes/build.ts"],"sourcesContent":["import { DEFAULT_STANDARD_ROUTES, isStandardRouteParamName } from \"./defaults\";\nimport { prependPathPrefix } from \"./path\";\nimport type {\n ShopifyRouteTemplates,\n StandardRouteName,\n StandardRouteOptions,\n StandardRouteParams,\n StandardRouteParamsByName,\n} from \"./types\";\n\n/**\n * Creates a typed map of custom route templates for Shopify standard storefront routes.\n *\n * Use the returned object anywhere Hydrogen needs to understand the app's URL shape for\n * Shopify resources and utility pages: `handleShopifyRedirects({routeTemplates})`, `ShopifyScripts`\n * `routes={routeTemplates}`, and predictive search URL helpers.\n *\n * Each key represents a Shopify standard route identity, while each value is the app's custom\n * pathname template. Templates must start with `/` and include the required named handle\n * placeholders for routes that identify a resource. Do not include an i18n path prefix in the\n * template; Hydrogen applies `i18n.pathPrefix` separately when resolving routes. Pass an empty\n * object when the app uses standard storefront routes so there is still one app-owned routing\n * manifest to update if routes change later. When matching the current page, standard storefront\n * routes retain their page-template identities even if a configured template resolves another\n * route to the same pathname.\n *\n * @example\n * ```ts\n * const routeTemplates = createShopifyRouteTemplates({\n * product: \"/p/:productHandle\",\n * collection: \"/c/:collectionHandle\",\n * article: \"/journal/:blogHandle/:articleHandle\",\n * cart: \"/basket\",\n * policy: \"/legal/:policyHandle\",\n * });\n * ```\n */\nexport function createShopifyRouteTemplates<const TRoutes extends ShopifyRouteTemplates>(\n routes: TRoutes,\n): TRoutes {\n return routes;\n}\n\nexport function getStandardRoute<const TRoute extends StandardRouteName>(\n routeTemplates: ShopifyRouteTemplates,\n route: TRoute,\n params: StandardRouteParamsByName[TRoute],\n options: StandardRouteOptions = {},\n): string {\n const target = routeTemplates[route] ?? DEFAULT_STANDARD_ROUTES[route][0];\n\n return buildStandardRouteTarget(target, params, options.pathPrefix);\n}\n\n/**\n * Builds a pathname from a route template, handle params, and optional i18n path prefix.\n */\nexport function buildStandardRouteTarget(\n template: string,\n params: StandardRouteParams,\n pathPrefix: string | undefined,\n): string {\n return prependPathPrefix(interpolateRouteTemplate(template, params), pathPrefix);\n}\n\nfunction interpolateRouteTemplate(template: string, params: StandardRouteParams): string {\n return template.replace(/:([A-Za-z][A-Za-z0-9_]*)/g, (placeholder, name: string) => {\n if (!isStandardRouteParamName(name)) return placeholder;\n\n const value = params[name];\n return value === undefined ? placeholder : encodeURIComponent(value);\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,SAAgB,4BACd,QACS;AACT,QAAO;;AAGT,SAAgB,iBACd,gBACA,OACA,QACA,UAAgC,EAAE,EAC1B;AAGR,QAAO,yBAFQ,eAAe,UAAU,wBAAwB,OAAO,IAE/B,QAAQ,QAAQ,WAAW;;;;;AAMrE,SAAgB,yBACd,UACA,QACA,YACQ;AACR,QAAO,kBAAkB,yBAAyB,UAAU,OAAO,EAAE,WAAW;;AAGlF,SAAS,yBAAyB,UAAkB,QAAqC;AACvF,QAAO,SAAS,QAAQ,8BAA8B,aAAa,SAAiB;AAClF,MAAI,CAAC,yBAAyB,KAAK,CAAE,QAAO;EAE5C,MAAM,QAAQ,OAAO;AACrB,SAAO,UAAU,SAAY,cAAc,mBAAmB,MAAM;GACpE"}
@@ -0,0 +1,31 @@
1
+ //#region src/core/standard-routes/defaults.ts
2
+ const STANDARD_ROUTE_PARAM_NAMES = [
3
+ "articleHandle",
4
+ "blogHandle",
5
+ "collectionHandle",
6
+ "pageHandle",
7
+ "policyHandle",
8
+ "productHandle"
9
+ ];
10
+ const DEFAULT_STANDARD_ROUTES = {
11
+ product: ["/products/:productHandle"],
12
+ collection: ["/collections/:collectionHandle"],
13
+ collectionList: ["/collections", "/products"],
14
+ page: ["/pages/:pageHandle"],
15
+ policy: ["/policies/:policyHandle"],
16
+ blog: ["/blogs/:blogHandle"],
17
+ article: ["/blogs/:blogHandle/:articleHandle"],
18
+ productInCollection: ["/collections/:collectionHandle/products/:productHandle"],
19
+ cart: ["/cart"],
20
+ search: ["/search"]
21
+ };
22
+ function isStandardRouteParamName(name) {
23
+ return STANDARD_ROUTE_PARAM_NAMES.some((paramName) => paramName === name);
24
+ }
25
+ function isStandardRouteName(name) {
26
+ return Object.hasOwn(DEFAULT_STANDARD_ROUTES, name);
27
+ }
28
+
29
+ //#endregion
30
+ export { DEFAULT_STANDARD_ROUTES, isStandardRouteName, isStandardRouteParamName };
31
+ //# sourceMappingURL=defaults.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.mjs","names":[],"sources":["../../../src/core/standard-routes/defaults.ts"],"sourcesContent":["import type { ShopifyRouteTemplates, StandardRouteName, StandardRouteParamName } from \"./types\";\n\ntype DefaultStandardRoutes = {\n [Route in StandardRouteName]: readonly [\n NonNullable<ShopifyRouteTemplates[Route]>,\n ...NonNullable<ShopifyRouteTemplates[Route]>[],\n ];\n};\n\nconst STANDARD_ROUTE_PARAM_NAMES = [\n \"articleHandle\",\n \"blogHandle\",\n \"collectionHandle\",\n \"pageHandle\",\n \"policyHandle\",\n \"productHandle\",\n] as const satisfies readonly StandardRouteParamName[];\n\nexport const DEFAULT_STANDARD_ROUTES = {\n product: [\"/products/:productHandle\"],\n collection: [\"/collections/:collectionHandle\"],\n collectionList: [\"/collections\", \"/products\"],\n page: [\"/pages/:pageHandle\"],\n policy: [\"/policies/:policyHandle\"],\n blog: [\"/blogs/:blogHandle\"],\n article: [\"/blogs/:blogHandle/:articleHandle\"],\n productInCollection: [\"/collections/:collectionHandle/products/:productHandle\"],\n cart: [\"/cart\"],\n search: [\"/search\"],\n} as const satisfies DefaultStandardRoutes;\n\nexport function isStandardRouteParamName(name: string): name is StandardRouteParamName {\n return STANDARD_ROUTE_PARAM_NAMES.some((paramName) => paramName === name);\n}\n\nexport function isStandardRouteName(name: string): name is StandardRouteName {\n return Object.hasOwn(DEFAULT_STANDARD_ROUTES, name);\n}\n"],"mappings":";AASA,MAAM,6BAA6B;CACjC;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,0BAA0B;CACrC,SAAS,CAAC,2BAA2B;CACrC,YAAY,CAAC,iCAAiC;CAC9C,gBAAgB,CAAC,gBAAgB,YAAY;CAC7C,MAAM,CAAC,qBAAqB;CAC5B,QAAQ,CAAC,0BAA0B;CACnC,MAAM,CAAC,qBAAqB;CAC5B,SAAS,CAAC,oCAAoC;CAC9C,qBAAqB,CAAC,yDAAyD;CAC/E,MAAM,CAAC,QAAQ;CACf,QAAQ,CAAC,UAAU;CACpB;AAED,SAAgB,yBAAyB,MAA8C;AACrF,QAAO,2BAA2B,MAAM,cAAc,cAAc,KAAK;;AAG3E,SAAgB,oBAAoB,MAAyC;AAC3E,QAAO,OAAO,OAAO,yBAAyB,KAAK"}
@@ -0,0 +1,108 @@
1
+ import { DEFAULT_STANDARD_ROUTES, isStandardRouteName, isStandardRouteParamName } from "./defaults.mjs";
2
+ import { parseSameOriginUrl, stripI18nPathPrefix, stripTrailingSlash } from "./path.mjs";
3
+ import { buildStandardRouteTarget } from "./build.mjs";
4
+
5
+ //#region src/core/standard-routes/match.ts
6
+ /**
7
+ * Matches a URL against both configured app route templates and standard storefront routes.
8
+ *
9
+ * This powers browser current-page detection, where consumers need to recognize the standard
10
+ * Shopify resource represented by either a custom app URL like `/p/snowboard` or a standard URL
11
+ * like `/products/snowboard`. The root and standard storefront routes retain their page-template
12
+ * identities; configured templates identify otherwise non-standard app paths.
13
+ */
14
+ function matchStandardRouteUrl({ baseUrl, pathPrefix, routeTemplates, url }) {
15
+ const parsedUrl = parseSameOriginUrl(url, baseUrl);
16
+ if (!parsedUrl) return null;
17
+ if (stripI18nPathPrefix(stripTrailingSlash(parsedUrl.pathname), pathPrefix) === "/") return addStandardRouteContext({
18
+ route: "index",
19
+ pageTemplateName: "index",
20
+ params: {}
21
+ }, pathPrefix, routeTemplates);
22
+ const match = matchStandardRouteTemplates(parsedUrl.pathname, pathPrefix, (route) => DEFAULT_STANDARD_ROUTES[route]) ?? matchStandardRouteTemplates(parsedUrl.pathname, pathPrefix, (route) => [routeTemplates[route]]);
23
+ return match ? addStandardRouteContext(match, pathPrefix, routeTemplates) : null;
24
+ }
25
+ function addStandardRouteContext(match, pathPrefix, routeTemplates) {
26
+ const standardTemplate = match.route === "index" ? "/" : DEFAULT_STANDARD_ROUTES[match.route][0];
27
+ const customTemplate = match.route === "index" ? standardTemplate : routeTemplates[match.route] ?? standardTemplate;
28
+ return {
29
+ ...match,
30
+ standardPathname: buildStandardRouteTarget(standardTemplate, match.params, pathPrefix),
31
+ templates: {
32
+ standard: standardTemplate,
33
+ custom: customTemplate
34
+ }
35
+ };
36
+ }
37
+ /**
38
+ * Iterates over known Shopify route names and tries the templates supplied by the caller.
39
+ *
40
+ * Different callers choose different template sets: redirects only match default Shopify templates
41
+ * for resources with custom app templates, while browser matching tries Shopify defaults before
42
+ * configured app templates.
43
+ */
44
+ function matchStandardRouteTemplates(pathname, pathPrefix, getTemplatesForRoute) {
45
+ const normalizedPathname = stripI18nPathPrefix(stripTrailingSlash(pathname), pathPrefix);
46
+ for (const route in DEFAULT_STANDARD_ROUTES) {
47
+ if (!isStandardRouteName(route)) continue;
48
+ for (const template of getTemplatesForRoute(route)) {
49
+ if (!template) continue;
50
+ const match = matchRouteTemplate(normalizedPathname, template);
51
+ if (match) return {
52
+ route,
53
+ params: match,
54
+ pageTemplateName: normalizeStandardRouteTemplateName(route)
55
+ };
56
+ }
57
+ }
58
+ return null;
59
+ }
60
+ function normalizeStandardRouteTemplateName(route) {
61
+ if (route === "productInCollection") return "product";
62
+ if (route === "collectionList") return "list-collections";
63
+ return route;
64
+ }
65
+ /**
66
+ * Matches a normalized pathname against one route template and returns decoded handle params.
67
+ */
68
+ function matchRouteTemplate(pathname, template) {
69
+ const match = templateToPattern(template).exec(pathname);
70
+ if (!match) return null;
71
+ const params = {};
72
+ for (const [name, value] of Object.entries(match.groups ?? {})) {
73
+ if (!isStandardRouteParamName(name)) continue;
74
+ params[name] = decodePathSegment(value);
75
+ }
76
+ return params;
77
+ }
78
+ /**
79
+ * Converts a route template into a regular expression with named capture groups.
80
+ *
81
+ * Static path text is escaped first so regex metacharacters in templates are treated literally.
82
+ * Then known placeholders such as `:productHandle` become segment-safe captures like
83
+ * `(?<productHandle>[^/]+)`.
84
+ */
85
+ function templateToPattern(template) {
86
+ const source = escapeRegExp(stripTrailingSlash(template)).replace(/:([A-Za-z][A-Za-z0-9_]*)/g, (placeholder, name) => isStandardRouteParamName(name) ? `(?<${name}>[^/]+)` : placeholder);
87
+ return new RegExp(`^${source}$`);
88
+ }
89
+ /**
90
+ * Escapes regex metacharacters so template text can be embedded in a `RegExp` literally.
91
+ *
92
+ * For example, `/products/:productHandle.json` must match a literal `.json` suffix; without
93
+ * escaping, `.` would mean "any character" in the generated regex.
94
+ */
95
+ function escapeRegExp(value) {
96
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
97
+ }
98
+ function decodePathSegment(segment) {
99
+ try {
100
+ return decodeURIComponent(segment);
101
+ } catch {
102
+ return segment;
103
+ }
104
+ }
105
+
106
+ //#endregion
107
+ export { matchStandardRouteTemplates, matchStandardRouteUrl };
108
+ //# sourceMappingURL=match.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match.mjs","names":[],"sources":["../../../src/core/standard-routes/match.ts"],"sourcesContent":["import { buildStandardRouteTarget } from \"./build\";\nimport { DEFAULT_STANDARD_ROUTES, isStandardRouteName, isStandardRouteParamName } from \"./defaults\";\nimport { parseSameOriginUrl, stripI18nPathPrefix, stripTrailingSlash } from \"./path\";\nimport type {\n ShopifyRouteTemplates,\n ShopifyPageTemplateName,\n ShopifyStandardRouteMatch,\n ShopifyStandardRouteName,\n StandardRouteName,\n StandardRouteParams,\n} from \"./types\";\n\n/**\n * Matches a URL against both configured app route templates and standard storefront routes.\n *\n * This powers browser current-page detection, where consumers need to recognize the standard\n * Shopify resource represented by either a custom app URL like `/p/snowboard` or a standard URL\n * like `/products/snowboard`. The root and standard storefront routes retain their page-template\n * identities; configured templates identify otherwise non-standard app paths.\n */\nexport function matchStandardRouteUrl({\n baseUrl,\n pathPrefix,\n routeTemplates,\n url,\n}: {\n baseUrl?: string;\n pathPrefix?: string;\n routeTemplates: ShopifyRouteTemplates;\n url: string;\n}): ShopifyStandardRouteMatch | null {\n const parsedUrl = parseSameOriginUrl(url, baseUrl);\n if (!parsedUrl) return null;\n\n const pathname = stripI18nPathPrefix(stripTrailingSlash(parsedUrl.pathname), pathPrefix);\n if (pathname === \"/\") {\n return addStandardRouteContext(\n { route: \"index\", pageTemplateName: \"index\", params: {} },\n pathPrefix,\n routeTemplates,\n );\n }\n\n const match =\n matchStandardRouteTemplates(\n parsedUrl.pathname,\n pathPrefix,\n (route) => DEFAULT_STANDARD_ROUTES[route],\n ) ??\n matchStandardRouteTemplates(parsedUrl.pathname, pathPrefix, (route) => [routeTemplates[route]]);\n\n return match ? addStandardRouteContext(match, pathPrefix, routeTemplates) : null;\n}\n\nfunction addStandardRouteContext(\n match: Pick<ShopifyStandardRouteMatch, \"pageTemplateName\" | \"params\" | \"route\">,\n pathPrefix: string | undefined,\n routeTemplates: ShopifyRouteTemplates,\n): ShopifyStandardRouteMatch {\n const standardTemplate = match.route === \"index\" ? \"/\" : DEFAULT_STANDARD_ROUTES[match.route][0];\n const customTemplate =\n match.route === \"index\" ? standardTemplate : (routeTemplates[match.route] ?? standardTemplate);\n\n return {\n ...match,\n standardPathname: buildStandardRouteTarget(standardTemplate, match.params, pathPrefix),\n templates: {\n standard: standardTemplate,\n custom: customTemplate,\n },\n };\n}\n\n/**\n * Iterates over known Shopify route names and tries the templates supplied by the caller.\n *\n * Different callers choose different template sets: redirects only match default Shopify templates\n * for resources with custom app templates, while browser matching tries Shopify defaults before\n * configured app templates.\n */\nexport function matchStandardRouteTemplates(\n pathname: string,\n pathPrefix: string | undefined,\n getTemplatesForRoute: (route: StandardRouteName) => ReadonlyArray<string | undefined>,\n): Pick<\n ShopifyStandardRouteMatch<StandardRouteName>,\n \"pageTemplateName\" | \"params\" | \"route\"\n> | null {\n const normalizedPathname = stripI18nPathPrefix(stripTrailingSlash(pathname), pathPrefix);\n\n for (const route in DEFAULT_STANDARD_ROUTES) {\n if (!isStandardRouteName(route)) continue;\n\n for (const template of getTemplatesForRoute(route)) {\n if (!template) continue;\n\n const match = matchRouteTemplate(normalizedPathname, template);\n if (match) {\n return {\n route,\n params: match,\n pageTemplateName: normalizeStandardRouteTemplateName(route),\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Converts a standard route identity to the corresponding page template name.\n * Collection-scoped product URLs still render the `product` template, while\n * the collection-listing route uses the hyphenated `list-collections` name.\n */\nfunction normalizeStandardRouteTemplateName<TRoute extends ShopifyStandardRouteName>(\n route: TRoute,\n): ShopifyPageTemplateName<TRoute>;\nfunction normalizeStandardRouteTemplateName(\n route: ShopifyStandardRouteName,\n): ShopifyPageTemplateName {\n if (route === \"productInCollection\") return \"product\";\n if (route === \"collectionList\") return \"list-collections\";\n return route;\n}\n\n/**\n * Matches a normalized pathname against one route template and returns decoded handle params.\n */\nfunction matchRouteTemplate(pathname: string, template: string): StandardRouteParams | null {\n const match = templateToPattern(template).exec(pathname);\n if (!match) return null;\n\n const params: StandardRouteParams = {};\n for (const [name, value] of Object.entries(match.groups ?? {})) {\n if (!isStandardRouteParamName(name)) continue;\n\n params[name] = decodePathSegment(value);\n }\n\n return params;\n}\n\n/**\n * Converts a route template into a regular expression with named capture groups.\n *\n * Static path text is escaped first so regex metacharacters in templates are treated literally.\n * Then known placeholders such as `:productHandle` become segment-safe captures like\n * `(?<productHandle>[^/]+)`.\n */\nfunction templateToPattern(template: string): RegExp {\n const source = escapeRegExp(stripTrailingSlash(template)).replace(\n /:([A-Za-z][A-Za-z0-9_]*)/g,\n (placeholder, name: string) =>\n isStandardRouteParamName(name) ? `(?<${name}>[^/]+)` : placeholder,\n );\n\n return new RegExp(`^${source}$`);\n}\n\n/**\n * Escapes regex metacharacters so template text can be embedded in a `RegExp` literally.\n *\n * For example, `/products/:productHandle.json` must match a literal `.json` suffix; without\n * escaping, `.` would mean \"any character\" in the generated regex.\n */\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction decodePathSegment(segment: string): string {\n try {\n return decodeURIComponent(segment);\n } catch {\n return segment;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAoBA,SAAgB,sBAAsB,EACpC,SACA,YACA,gBACA,OAMmC;CACnC,MAAM,YAAY,mBAAmB,KAAK,QAAQ;AAClD,KAAI,CAAC,UAAW,QAAO;AAGvB,KADiB,oBAAoB,mBAAmB,UAAU,SAAS,EAAE,WACjE,KAAK,IACf,QAAO,wBACL;EAAE,OAAO;EAAS,kBAAkB;EAAS,QAAQ,EAAE;EAAE,EACzD,YACA,eACD;CAGH,MAAM,QACJ,4BACE,UAAU,UACV,aACC,UAAU,wBAAwB,OACpC,IACD,4BAA4B,UAAU,UAAU,aAAa,UAAU,CAAC,eAAe,OAAO,CAAC;AAEjG,QAAO,QAAQ,wBAAwB,OAAO,YAAY,eAAe,GAAG;;AAG9E,SAAS,wBACP,OACA,YACA,gBAC2B;CAC3B,MAAM,mBAAmB,MAAM,UAAU,UAAU,MAAM,wBAAwB,MAAM,OAAO;CAC9F,MAAM,iBACJ,MAAM,UAAU,UAAU,mBAAoB,eAAe,MAAM,UAAU;AAE/E,QAAO;EACL,GAAG;EACH,kBAAkB,yBAAyB,kBAAkB,MAAM,QAAQ,WAAW;EACtF,WAAW;GACT,UAAU;GACV,QAAQ;GACT;EACF;;;;;;;;;AAUH,SAAgB,4BACd,UACA,YACA,sBAIO;CACP,MAAM,qBAAqB,oBAAoB,mBAAmB,SAAS,EAAE,WAAW;AAExF,MAAK,MAAM,SAAS,yBAAyB;AAC3C,MAAI,CAAC,oBAAoB,MAAM,CAAE;AAEjC,OAAK,MAAM,YAAY,qBAAqB,MAAM,EAAE;AAClD,OAAI,CAAC,SAAU;GAEf,MAAM,QAAQ,mBAAmB,oBAAoB,SAAS;AAC9D,OAAI,MACF,QAAO;IACL;IACA,QAAQ;IACR,kBAAkB,mCAAmC,MAAM;IAC5D;;;AAKP,QAAO;;AAWT,SAAS,mCACP,OACyB;AACzB,KAAI,UAAU,sBAAuB,QAAO;AAC5C,KAAI,UAAU,iBAAkB,QAAO;AACvC,QAAO;;;;;AAMT,SAAS,mBAAmB,UAAkB,UAA8C;CAC1F,MAAM,QAAQ,kBAAkB,SAAS,CAAC,KAAK,SAAS;AACxD,KAAI,CAAC,MAAO,QAAO;CAEnB,MAAM,SAA8B,EAAE;AACtC,MAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,MAAM,UAAU,EAAE,CAAC,EAAE;AAC9D,MAAI,CAAC,yBAAyB,KAAK,CAAE;AAErC,SAAO,QAAQ,kBAAkB,MAAM;;AAGzC,QAAO;;;;;;;;;AAUT,SAAS,kBAAkB,UAA0B;CACnD,MAAM,SAAS,aAAa,mBAAmB,SAAS,CAAC,CAAC,QACxD,8BACC,aAAa,SACZ,yBAAyB,KAAK,GAAG,MAAM,KAAK,WAAW,YAC1D;AAED,QAAO,IAAI,OAAO,IAAI,OAAO,GAAG;;;;;;;;AASlC,SAAS,aAAa,OAAuB;AAC3C,QAAO,MAAM,QAAQ,uBAAuB,OAAO;;AAGrD,SAAS,kBAAkB,SAAyB;AAClD,KAAI;AACF,SAAO,mBAAmB,QAAQ;SAC5B;AACN,SAAO"}
@@ -0,0 +1,58 @@
1
+ //#region src/core/standard-routes/path.ts
2
+ function prependPathPrefix(pathname, pathPrefix) {
3
+ const normalizedPathPrefix = normalizePathPrefix(pathPrefix);
4
+ if (!normalizedPathPrefix) return pathname;
5
+ return `${normalizedPathPrefix}/${pathname.replace(/^\/+/, "")}`;
6
+ }
7
+ function normalizePathPrefix(pathPrefix) {
8
+ if (!pathPrefix) return "";
9
+ const trimmedPathPrefix = pathPrefix.trim().replace(/^\/+|\/+$/g, "");
10
+ return trimmedPathPrefix ? `/${trimmedPathPrefix}` : "";
11
+ }
12
+ function parseUrl(url, baseUrl) {
13
+ try {
14
+ return new URL(url, baseUrl ?? "https://shopify.local");
15
+ } catch {
16
+ return null;
17
+ }
18
+ }
19
+ /**
20
+ * Parses a URL and rejects absolute URLs that do not share `baseUrl`'s origin.
21
+ *
22
+ * Relative URLs are resolved against `baseUrl` when provided, or against a throwaway local origin
23
+ * when no base is available.
24
+ */
25
+ function parseSameOriginUrl(url, baseUrl) {
26
+ const parsedUrl = parseUrl(url, baseUrl);
27
+ if (!parsedUrl) return null;
28
+ const parsedBaseUrl = baseUrl ? parseUrl(baseUrl, void 0) : null;
29
+ if (parsedBaseUrl && parsedUrl.origin !== parsedBaseUrl.origin) return null;
30
+ return parsedUrl;
31
+ }
32
+ function isAbsoluteUrl(url) {
33
+ return /^[A-Za-z][A-Za-z0-9+.-]*:/.test(url);
34
+ }
35
+ function stripTrailingSlash(pathname) {
36
+ if (pathname === "/") return pathname;
37
+ return pathname.replace(/\/+$/, "");
38
+ }
39
+ /**
40
+ * Removes the locale prefix before matching route templates.
41
+ *
42
+ * `ShopifyScripts` stores `routes.root` with a trailing slash, while server i18n uses
43
+ * `pathPrefix`; both are normalized here so `/fr-ca/products/snowboard` can match the same
44
+ * template as `/products/snowboard`.
45
+ */
46
+ function stripI18nPathPrefix(pathname, pathPrefix) {
47
+ const normalizedPathPrefix = normalizePathPrefix(pathPrefix);
48
+ if (!normalizedPathPrefix) return pathname;
49
+ const lowerPathname = pathname.toLowerCase();
50
+ const lowerPathPrefix = normalizedPathPrefix.toLowerCase();
51
+ if (lowerPathname === lowerPathPrefix) return "/";
52
+ if (!lowerPathname.startsWith(`${lowerPathPrefix}/`)) return pathname;
53
+ return pathname.slice(normalizedPathPrefix.length) || "/";
54
+ }
55
+
56
+ //#endregion
57
+ export { isAbsoluteUrl, normalizePathPrefix, parseSameOriginUrl, prependPathPrefix, stripI18nPathPrefix, stripTrailingSlash };
58
+ //# sourceMappingURL=path.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.mjs","names":[],"sources":["../../../src/core/standard-routes/path.ts"],"sourcesContent":["export function prependPathPrefix(pathname: string, pathPrefix: string | undefined): string {\n const normalizedPathPrefix = normalizePathPrefix(pathPrefix);\n if (!normalizedPathPrefix) return pathname;\n\n return `${normalizedPathPrefix}/${pathname.replace(/^\\/+/, \"\")}`;\n}\n\nexport function normalizePathPrefix(pathPrefix: string | undefined): string {\n if (!pathPrefix) return \"\";\n\n const trimmedPathPrefix = pathPrefix.trim().replace(/^\\/+|\\/+$/g, \"\");\n return trimmedPathPrefix ? `/${trimmedPathPrefix}` : \"\";\n}\n\nfunction parseUrl(url: string, baseUrl: string | undefined): URL | null {\n try {\n return new URL(url, baseUrl ?? \"https://shopify.local\");\n } catch {\n return null;\n }\n}\n\n/**\n * Parses a URL and rejects absolute URLs that do not share `baseUrl`'s origin.\n *\n * Relative URLs are resolved against `baseUrl` when provided, or against a throwaway local origin\n * when no base is available.\n */\nexport function parseSameOriginUrl(url: string, baseUrl: string | undefined): URL | null {\n const parsedUrl = parseUrl(url, baseUrl);\n if (!parsedUrl) return null;\n\n const parsedBaseUrl = baseUrl ? parseUrl(baseUrl, undefined) : null;\n if (parsedBaseUrl && parsedUrl.origin !== parsedBaseUrl.origin) return null;\n\n return parsedUrl;\n}\n\nexport function isAbsoluteUrl(url: string): boolean {\n return /^[A-Za-z][A-Za-z0-9+.-]*:/.test(url);\n}\n\nexport function stripTrailingSlash(pathname: string): string {\n if (pathname === \"/\") return pathname;\n return pathname.replace(/\\/+$/, \"\");\n}\n\n/**\n * Removes the locale prefix before matching route templates.\n *\n * `ShopifyScripts` stores `routes.root` with a trailing slash, while server i18n uses\n * `pathPrefix`; both are normalized here so `/fr-ca/products/snowboard` can match the same\n * template as `/products/snowboard`.\n */\nexport function stripI18nPathPrefix(pathname: string, pathPrefix: string | undefined): string {\n const normalizedPathPrefix = normalizePathPrefix(pathPrefix);\n if (!normalizedPathPrefix) return pathname;\n\n const lowerPathname = pathname.toLowerCase();\n const lowerPathPrefix = normalizedPathPrefix.toLowerCase();\n\n if (lowerPathname === lowerPathPrefix) return \"/\";\n if (!lowerPathname.startsWith(`${lowerPathPrefix}/`)) return pathname;\n\n return pathname.slice(normalizedPathPrefix.length) || \"/\";\n}\n"],"mappings":";AAAA,SAAgB,kBAAkB,UAAkB,YAAwC;CAC1F,MAAM,uBAAuB,oBAAoB,WAAW;AAC5D,KAAI,CAAC,qBAAsB,QAAO;AAElC,QAAO,GAAG,qBAAqB,GAAG,SAAS,QAAQ,QAAQ,GAAG;;AAGhE,SAAgB,oBAAoB,YAAwC;AAC1E,KAAI,CAAC,WAAY,QAAO;CAExB,MAAM,oBAAoB,WAAW,MAAM,CAAC,QAAQ,cAAc,GAAG;AACrE,QAAO,oBAAoB,IAAI,sBAAsB;;AAGvD,SAAS,SAAS,KAAa,SAAyC;AACtE,KAAI;AACF,SAAO,IAAI,IAAI,KAAK,WAAW,wBAAwB;SACjD;AACN,SAAO;;;;;;;;;AAUX,SAAgB,mBAAmB,KAAa,SAAyC;CACvF,MAAM,YAAY,SAAS,KAAK,QAAQ;AACxC,KAAI,CAAC,UAAW,QAAO;CAEvB,MAAM,gBAAgB,UAAU,SAAS,SAAS,OAAU,GAAG;AAC/D,KAAI,iBAAiB,UAAU,WAAW,cAAc,OAAQ,QAAO;AAEvE,QAAO;;AAGT,SAAgB,cAAc,KAAsB;AAClD,QAAO,4BAA4B,KAAK,IAAI;;AAG9C,SAAgB,mBAAmB,UAA0B;AAC3D,KAAI,aAAa,IAAK,QAAO;AAC7B,QAAO,SAAS,QAAQ,QAAQ,GAAG;;;;;;;;;AAUrC,SAAgB,oBAAoB,UAAkB,YAAwC;CAC5F,MAAM,uBAAuB,oBAAoB,WAAW;AAC5D,KAAI,CAAC,qBAAsB,QAAO;CAElC,MAAM,gBAAgB,SAAS,aAAa;CAC5C,MAAM,kBAAkB,qBAAqB,aAAa;AAE1D,KAAI,kBAAkB,gBAAiB,QAAO;AAC9C,KAAI,CAAC,cAAc,WAAW,GAAG,gBAAgB,GAAG,CAAE,QAAO;AAE7D,QAAO,SAAS,MAAM,qBAAqB,OAAO,IAAI"}
@@ -0,0 +1,51 @@
1
+ import { DEFAULT_STANDARD_ROUTES } from "./defaults.mjs";
2
+ import { isAbsoluteUrl, parseSameOriginUrl, stripTrailingSlash } from "./path.mjs";
3
+ import { buildStandardRouteTarget } from "./build.mjs";
4
+ import { matchStandardRouteTemplates } from "./match.mjs";
5
+
6
+ //#region src/core/standard-routes/redirects.ts
7
+ /**
8
+ * Returns the custom route target for a Shopify standard route pathname.
9
+ *
10
+ * This is used by server redirects: it only matches Shopify's default route shape when the app
11
+ * configured a custom template for that same resource, so standard `/products/...` requests do not
12
+ * redirect unless the app opted into a non-standard product route.
13
+ */
14
+ function getStandardRouteTarget({ pathname, pathPrefix, routeTemplates }) {
15
+ const match = matchStandardRouteTemplates(pathname, pathPrefix, (route) => routeTemplates[route] ? DEFAULT_STANDARD_ROUTES[route] : []);
16
+ if (!match) return null;
17
+ const target = routeTemplates[match.route];
18
+ if (!target) return null;
19
+ return buildStandardRouteTarget(target, match.params, pathPrefix);
20
+ }
21
+ /**
22
+ * Resolves a Shopify standard resource URL to the app's configured route template.
23
+ *
24
+ * Query strings and hashes are preserved. Absolute URLs are only resolved when they share the same
25
+ * origin as `baseUrl`; external URLs are returned unchanged.
26
+ */
27
+ function resolveStandardRouteUrl({ baseUrl, pathPrefix, routeTemplates, url }) {
28
+ const parsedUrl = parseSameOriginUrl(url, baseUrl);
29
+ if (!parsedUrl) return url;
30
+ const target = getStandardRouteTarget({
31
+ pathname: parsedUrl.pathname,
32
+ pathPrefix,
33
+ routeTemplates
34
+ });
35
+ if (!target) return url;
36
+ const resolvedUrl = `${target}${parsedUrl.search}${parsedUrl.hash}`;
37
+ return isAbsoluteUrl(url) ? `${parsedUrl.origin}${resolvedUrl}` : resolvedUrl;
38
+ }
39
+ function isStandardRouteSelfRedirect(requestUrl, location) {
40
+ try {
41
+ const sourceUrl = new URL(requestUrl);
42
+ const targetUrl = new URL(location, sourceUrl.origin);
43
+ return sourceUrl.origin === targetUrl.origin && stripTrailingSlash(sourceUrl.pathname) === stripTrailingSlash(targetUrl.pathname) && sourceUrl.search === targetUrl.search;
44
+ } catch {
45
+ return false;
46
+ }
47
+ }
48
+
49
+ //#endregion
50
+ export { getStandardRouteTarget, isStandardRouteSelfRedirect, resolveStandardRouteUrl };
51
+ //# sourceMappingURL=redirects.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirects.mjs","names":[],"sources":["../../../src/core/standard-routes/redirects.ts"],"sourcesContent":["import { buildStandardRouteTarget } from \"./build\";\nimport { DEFAULT_STANDARD_ROUTES } from \"./defaults\";\nimport { matchStandardRouteTemplates } from \"./match\";\nimport { isAbsoluteUrl, parseSameOriginUrl, stripTrailingSlash } from \"./path\";\nimport type { ShopifyRouteTemplates } from \"./types\";\n\n/**\n * Returns the custom route target for a Shopify standard route pathname.\n *\n * This is used by server redirects: it only matches Shopify's default route shape when the app\n * configured a custom template for that same resource, so standard `/products/...` requests do not\n * redirect unless the app opted into a non-standard product route.\n */\nexport function getStandardRouteTarget({\n pathname,\n pathPrefix,\n routeTemplates,\n}: {\n pathname: string;\n pathPrefix?: string;\n routeTemplates: ShopifyRouteTemplates;\n}): string | null {\n const match = matchStandardRouteTemplates(pathname, pathPrefix, (route) =>\n routeTemplates[route] ? DEFAULT_STANDARD_ROUTES[route] : [],\n );\n\n if (!match) return null;\n\n const target = routeTemplates[match.route];\n if (!target) return null;\n\n return buildStandardRouteTarget(target, match.params, pathPrefix);\n}\n\n/**\n * Resolves a Shopify standard resource URL to the app's configured route template.\n *\n * Query strings and hashes are preserved. Absolute URLs are only resolved when they share the same\n * origin as `baseUrl`; external URLs are returned unchanged.\n */\nexport function resolveStandardRouteUrl({\n baseUrl,\n pathPrefix,\n routeTemplates,\n url,\n}: {\n baseUrl?: string;\n pathPrefix?: string;\n routeTemplates: ShopifyRouteTemplates;\n url: string;\n}): string {\n const parsedUrl = parseSameOriginUrl(url, baseUrl);\n if (!parsedUrl) return url;\n\n const target = getStandardRouteTarget({\n pathname: parsedUrl.pathname,\n pathPrefix,\n routeTemplates,\n });\n\n if (!target) return url;\n\n const resolvedUrl = `${target}${parsedUrl.search}${parsedUrl.hash}`;\n\n return isAbsoluteUrl(url) ? `${parsedUrl.origin}${resolvedUrl}` : resolvedUrl;\n}\n\nexport function isStandardRouteSelfRedirect(requestUrl: string, location: string): boolean {\n try {\n const sourceUrl = new URL(requestUrl);\n const targetUrl = new URL(location, sourceUrl.origin);\n\n return (\n sourceUrl.origin === targetUrl.origin &&\n stripTrailingSlash(sourceUrl.pathname) === stripTrailingSlash(targetUrl.pathname) &&\n sourceUrl.search === targetUrl.search\n );\n } catch {\n return false;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,SAAgB,uBAAuB,EACrC,UACA,YACA,kBAKgB;CAChB,MAAM,QAAQ,4BAA4B,UAAU,aAAa,UAC/D,eAAe,SAAS,wBAAwB,SAAS,EAAE,CAC5D;AAED,KAAI,CAAC,MAAO,QAAO;CAEnB,MAAM,SAAS,eAAe,MAAM;AACpC,KAAI,CAAC,OAAQ,QAAO;AAEpB,QAAO,yBAAyB,QAAQ,MAAM,QAAQ,WAAW;;;;;;;;AASnE,SAAgB,wBAAwB,EACtC,SACA,YACA,gBACA,OAMS;CACT,MAAM,YAAY,mBAAmB,KAAK,QAAQ;AAClD,KAAI,CAAC,UAAW,QAAO;CAEvB,MAAM,SAAS,uBAAuB;EACpC,UAAU,UAAU;EACpB;EACA;EACD,CAAC;AAEF,KAAI,CAAC,OAAQ,QAAO;CAEpB,MAAM,cAAc,GAAG,SAAS,UAAU,SAAS,UAAU;AAE7D,QAAO,cAAc,IAAI,GAAG,GAAG,UAAU,SAAS,gBAAgB;;AAGpE,SAAgB,4BAA4B,YAAoB,UAA2B;AACzF,KAAI;EACF,MAAM,YAAY,IAAI,IAAI,WAAW;EACrC,MAAM,YAAY,IAAI,IAAI,UAAU,UAAU,OAAO;AAErD,SACE,UAAU,WAAW,UAAU,UAC/B,mBAAmB,UAAU,SAAS,KAAK,mBAAmB,UAAU,SAAS,IACjF,UAAU,WAAW,UAAU;SAE3B;AACN,SAAO"}