@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
+ import { _taggedTemplateLiteral } from "../../../_virtual/_@oxc-project_runtime@0.127.0/helpers/taggedTemplateLiteral.mjs";
2
+
3
+ //#region src/core/request-routing/interceptors/graphiql.ts
4
+ var _templateObject;
5
+ const DEV_SCHEMA_FETCH_TIMEOUT_MS = 1e4;
6
+ const handleGraphiql = (url, { request, storefrontClient, graphiql: graphiqlOptions }) => {
7
+ if (request.method !== "GET" || url.pathname !== "/graphiql") return null;
8
+ return createGraphiqlResponse(storefrontClient, graphiqlOptions);
9
+ };
10
+ async function createGraphiqlResponse(storefrontClient, graphiqlOptions) {
11
+ const schemas = {};
12
+ schemas.storefront = {
13
+ name: "Storefront API",
14
+ authHeader: "X-Shopify-Storefront-Access-Token",
15
+ apiUrl: `${storefrontClient.storeUrl}/api/unstable/graphql.json`,
16
+ icon: "SF"
17
+ };
18
+ if (graphiqlOptions?.customerAccount) {
19
+ const { apiUrl, accessToken, schemaUrl } = graphiqlOptions.customerAccount;
20
+ try {
21
+ const schemaJson = await (await fetch(schemaUrl, { signal: AbortSignal.timeout(DEV_SCHEMA_FETCH_TIMEOUT_MS) })).json();
22
+ if (typeof schemaJson === "object" && schemaJson !== null) schemas["customer-account"] = {
23
+ name: "Customer Account API",
24
+ value: schemaJson,
25
+ authHeader: "Authorization",
26
+ accessToken,
27
+ apiUrl,
28
+ icon: "CA"
29
+ };
30
+ } catch {}
31
+ }
32
+ const favicon = "https://avatars.githubusercontent.com/u/12972006?s=48&v=4";
33
+ const html = String.raw;
34
+ return new Response(html(_templateObject || (_templateObject = _taggedTemplateLiteral([
35
+ "\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <title>GraphiQL</title>\n <link rel=\"icon\" type=\"image/x-icon\" href=\"",
36
+ "\" />\n <meta charset=\"utf-8\" />\n <style>\n body {\n height: 100%;\n margin: 0;\n width: 100%;\n overflow: hidden;\n background-color: hsl(219, 29%, 18%);\n }\n #graphiql {\n height: 100vh;\n }\n #graphiql > .placeholder {\n color: slategray;\n width: fit-content;\n margin: 40px auto;\n font-family: Arial;\n }\n .graphiql-api-toolbar-label {\n position: absolute;\n bottom: -6px;\n right: -4px;\n font-size: 8px;\n }\n </style>\n <link rel=\"stylesheet\" href=\"https://esm.sh/graphiql/dist/style.css\" />\n <link rel=\"stylesheet\" href=\"https://esm.sh/@graphiql/plugin-explorer/dist/style.css\" />\n <script type=\"importmap\">\n {\n \"imports\": {\n \"react\": \"https://esm.sh/react@19.1.0\",\n \"react/jsx-runtime\": \"https://esm.sh/react@19.1.0/jsx-runtime\",\n \"react-dom\": \"https://esm.sh/react-dom@19.1.0\",\n \"react-dom/client\": \"https://esm.sh/react-dom@19.1.0/client\",\n \"graphql\": \"https://esm.sh/graphql@16.11.0\",\n \"graphiql\": \"https://esm.sh/graphiql?standalone&external=react,react-dom,@graphiql/react,graphql\",\n \"@graphiql/plugin-explorer\": \"https://esm.sh/@graphiql/plugin-explorer?standalone&external=react,@graphiql/react,graphql\",\n \"@graphiql/react\": \"https://esm.sh/@graphiql/react?standalone&external=react,react-dom,graphql\",\n \"@graphiql/toolkit\": \"https://esm.sh/@graphiql/toolkit?standalone&external=graphql\"\n }\n }\n <\/script>\n <script type=\"module\">\n import React from \"react\";\n import ReactDOM from \"react-dom/client\";\n import { GraphiQL, HISTORY_PLUGIN } from \"graphiql\";\n import { createGraphiQLFetcher } from \"@graphiql/toolkit\";\n import { explorerPlugin } from \"@graphiql/plugin-explorer\";\n import { ToolbarButton } from \"@graphiql/react\";\n import createJSONWorker from \"https://esm.sh/monaco-editor/esm/vs/language/json/json.worker.js?worker\";\n import createGraphQLWorker from \"https://esm.sh/monaco-graphql/esm/graphql.worker.js?worker\";\n import createEditorWorker from \"https://esm.sh/monaco-editor/esm/vs/editor/editor.worker.js?worker\";\n import { parse, print } from \"graphql\";\n\n globalThis.MonacoEnvironment = {\n getWorker(_workerId, label) {\n switch (label) {\n case \"json\":\n return createJSONWorker();\n case \"graphql\":\n return createGraphQLWorker();\n }\n return createEditorWorker();\n },\n };\n\n const windowUrl = new URL(document.URL);\n const startingSchemaKey = windowUrl.searchParams.get(\"schema\") || \"storefront\";\n\n let initialQuery = \"{ shop { name } }\";\n if (windowUrl.searchParams.has(\"query\")) {\n initialQuery = decodeURIComponent(windowUrl.searchParams.get(\"query\") ?? initialQuery);\n }\n\n initialQuery = print(parse(initialQuery));\n\n let variables;\n if (windowUrl.searchParams.has(\"variables\")) {\n variables = decodeURIComponent(windowUrl.searchParams.get(\"variables\") ?? \"\");\n }\n\n if (variables) {\n variables = JSON.stringify(JSON.parse(variables), null, 2);\n }\n\n const schemas = ",
37
+ ";\n\n let lastActiveTabIndex = -1;\n let lastTabAmount = -1;\n\n const TAB_STATE_KEY = \"graphiql:tabState\";\n const storage = {\n getTabState: () => JSON.parse(localStorage.getItem(TAB_STATE_KEY)),\n setTabState: (state) => localStorage.setItem(TAB_STATE_KEY, JSON.stringify(state)),\n };\n\n let nextSchemaKey;\n\n function App() {\n const [activeSchema, setActiveSchema] = React.useState(startingSchemaKey);\n\n const schema = schemas[activeSchema];\n\n if (!schema) {\n throw new Error(\"No schema found for \" + activeSchema);\n }\n\n const requestHeaders = schema.accessToken\n ? { [schema.authHeader]: schema.accessToken }\n : {};\n\n const fetcher = createGraphiQLFetcher({\n url: schema.apiUrl,\n headers: requestHeaders,\n enableIncrementalDelivery: false,\n });\n\n function createJsonFetcher(options, httpFetch) {\n if (activeSchema === \"storefront\") {\n return fetcher(options, httpFetch);\n } else {\n if (options.operationName === \"IntrospectionQuery\") {\n return { data: schema.value };\n } else {\n return fetcher(options, httpFetch);\n }\n }\n }\n\n const keys = Object.keys(schemas);\n\n function onTabChange(state) {\n const { activeTabIndex, tabs } = state;\n const activeTab = tabs[activeTabIndex];\n\n if (activeTabIndex === lastActiveTabIndex && lastTabAmount === tabs.length) {\n if (nextSchemaKey && activeTab && activeTab.schemaKey !== nextSchemaKey) {\n activeTab.schemaKey = nextSchemaKey;\n nextSchemaKey = undefined;\n storage.setTabState(state);\n setTimeout(() => storage.setTabState(state), 500);\n }\n return;\n }\n\n if (activeTab) {\n if (!activeTab.schemaKey) {\n if (lastTabAmount < tabs.length) {\n activeTab.schemaKey = activeSchema;\n storage.setTabState(state);\n }\n }\n\n const nextSchema = activeTab.schemaKey || \"storefront\";\n\n if (nextSchema !== activeSchema) {\n setActiveSchema(nextSchema);\n }\n }\n\n lastActiveTabIndex = activeTabIndex;\n lastTabAmount = tabs.length;\n }\n\n const plugins = [HISTORY_PLUGIN, explorerPlugin()];\n\n const props = {\n fetcher: createJsonFetcher,\n defaultEditorToolsVisibility: true,\n initialQuery,\n variables,\n schema: schema.value,\n plugins,\n onTabChange,\n };\n\n function toggleSelectedApi() {\n const activeKeyIndex = keys.indexOf(activeSchema);\n nextSchemaKey = keys[(activeKeyIndex + 1) % keys.length];\n if (nextSchemaKey) setActiveSchema(nextSchemaKey);\n }\n\n const CustomToolbar = React.createElement(GraphiQL.Toolbar, { key: \"Custom Toolbar\" }, [\n React.createElement(\n ToolbarButton,\n {\n key: \"api-wrapper\",\n onClick: toggleSelectedApi,\n label: \"Toggle between different API schemas\",\n },\n [\n React.createElement(\"div\", { key: \"icon\", style: { textAlign: \"center\" } }, [\n schema.icon,\n React.createElement(\n \"div\",\n {\n key: \"icon-label\",\n className: \"graphiql-api-toolbar-label\",\n },\n \"API\",\n ),\n ]),\n ],\n ),\n ]);\n\n const CustomLogo = React.createElement(GraphiQL.Logo, { key: \"Logo replacement\" }, [\n React.createElement(\n \"div\",\n {\n key: \"Logo wrapper\",\n style: { display: \"flex\", alignItems: \"center\" },\n },\n [\n React.createElement(\n \"div\",\n {\n key: \"api\",\n className: \"graphiql-logo\",\n style: { paddingRight: 0, whiteSpace: \"nowrap\" },\n },\n [schema.name],\n ),\n React.createElement(GraphiQL.Logo, { key: \"logo\" }),\n ],\n ),\n ]);\n\n return React.createElement(GraphiQL, props, [CustomToolbar, CustomLogo]);\n }\n\n const container = document.getElementById(\"graphiql\");\n const root = ReactDOM.createRoot(container);\n root.render(React.createElement(App));\n <\/script>\n </head>\n <body>\n <div id=\"graphiql\">\n <div class=\"placeholder\">Loading GraphiQL...</div>\n </div>\n </body>\n </html>\n "
38
+ ])), favicon, JSON.stringify(schemas).replace(/</g, "\\u003c")), {
39
+ status: 200,
40
+ headers: { "content-type": "text/html" }
41
+ });
42
+ }
43
+
44
+ //#endregion
45
+ export { handleGraphiql };
46
+ //# sourceMappingURL=graphiql.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphiql.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/graphiql.ts"],"sourcesContent":["import type { StorefrontClient } from \"../../../client\";\nimport type { GraphiQLOptions } from \"../../types\";\nimport type { HydrogenRouteInterceptor } from \"../route-types\";\n\nconst DEV_SCHEMA_FETCH_TIMEOUT_MS = 10_000;\n\ntype GraphiqlRouteOptions = {\n graphiql?: GraphiQLOptions;\n};\n\nexport const handleGraphiql: HydrogenRouteInterceptor<GraphiqlRouteOptions> = (\n url,\n { request, storefrontClient, graphiql: graphiqlOptions },\n) => {\n if (request.method !== \"GET\" || url.pathname !== \"/graphiql\") return null;\n\n return createGraphiqlResponse(storefrontClient, graphiqlOptions);\n};\n\nasync function createGraphiqlResponse(\n storefrontClient: StorefrontClient,\n graphiqlOptions?: GraphiQLOptions,\n): Promise<Response> {\n const schemas: Record<\n string,\n {\n name: string;\n value?: object;\n accessToken?: string;\n authHeader: string;\n apiUrl: string;\n icon: string;\n }\n > = {};\n\n const sfapiUrl = `${storefrontClient.storeUrl}/api/unstable/graphql.json`;\n\n schemas.storefront = {\n name: \"Storefront API\",\n authHeader: \"X-Shopify-Storefront-Access-Token\",\n apiUrl: sfapiUrl,\n icon: \"SF\",\n };\n\n if (graphiqlOptions?.customerAccount) {\n const { apiUrl, accessToken, schemaUrl } = graphiqlOptions.customerAccount;\n\n try {\n const schemaResponse = await fetch(schemaUrl, {\n signal: AbortSignal.timeout(DEV_SCHEMA_FETCH_TIMEOUT_MS),\n });\n const schemaJson: unknown = await schemaResponse.json();\n\n if (typeof schemaJson === \"object\" && schemaJson !== null) {\n schemas[\"customer-account\"] = {\n name: \"Customer Account API\",\n value: schemaJson as object,\n authHeader: \"Authorization\",\n accessToken,\n apiUrl,\n icon: \"CA\",\n };\n }\n } catch {\n // CAAPI schema unavailable — skip the tab silently\n }\n }\n\n const favicon = \"https://avatars.githubusercontent.com/u/12972006?s=48&v=4\";\n\n const html = String.raw;\n\n return new Response(\n html`\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <title>GraphiQL</title>\n <link rel=\"icon\" type=\"image/x-icon\" href=\"${favicon}\" />\n <meta charset=\"utf-8\" />\n <style>\n body {\n height: 100%;\n margin: 0;\n width: 100%;\n overflow: hidden;\n background-color: hsl(219, 29%, 18%);\n }\n #graphiql {\n height: 100vh;\n }\n #graphiql > .placeholder {\n color: slategray;\n width: fit-content;\n margin: 40px auto;\n font-family: Arial;\n }\n .graphiql-api-toolbar-label {\n position: absolute;\n bottom: -6px;\n right: -4px;\n font-size: 8px;\n }\n </style>\n <link rel=\"stylesheet\" href=\"https://esm.sh/graphiql/dist/style.css\" />\n <link rel=\"stylesheet\" href=\"https://esm.sh/@graphiql/plugin-explorer/dist/style.css\" />\n <script type=\"importmap\">\n {\n \"imports\": {\n \"react\": \"https://esm.sh/react@19.1.0\",\n \"react/jsx-runtime\": \"https://esm.sh/react@19.1.0/jsx-runtime\",\n \"react-dom\": \"https://esm.sh/react-dom@19.1.0\",\n \"react-dom/client\": \"https://esm.sh/react-dom@19.1.0/client\",\n \"graphql\": \"https://esm.sh/graphql@16.11.0\",\n \"graphiql\": \"https://esm.sh/graphiql?standalone&external=react,react-dom,@graphiql/react,graphql\",\n \"@graphiql/plugin-explorer\": \"https://esm.sh/@graphiql/plugin-explorer?standalone&external=react,@graphiql/react,graphql\",\n \"@graphiql/react\": \"https://esm.sh/@graphiql/react?standalone&external=react,react-dom,graphql\",\n \"@graphiql/toolkit\": \"https://esm.sh/@graphiql/toolkit?standalone&external=graphql\"\n }\n }\n </script>\n <script type=\"module\">\n import React from \"react\";\n import ReactDOM from \"react-dom/client\";\n import { GraphiQL, HISTORY_PLUGIN } from \"graphiql\";\n import { createGraphiQLFetcher } from \"@graphiql/toolkit\";\n import { explorerPlugin } from \"@graphiql/plugin-explorer\";\n import { ToolbarButton } from \"@graphiql/react\";\n import createJSONWorker from \"https://esm.sh/monaco-editor/esm/vs/language/json/json.worker.js?worker\";\n import createGraphQLWorker from \"https://esm.sh/monaco-graphql/esm/graphql.worker.js?worker\";\n import createEditorWorker from \"https://esm.sh/monaco-editor/esm/vs/editor/editor.worker.js?worker\";\n import { parse, print } from \"graphql\";\n\n globalThis.MonacoEnvironment = {\n getWorker(_workerId, label) {\n switch (label) {\n case \"json\":\n return createJSONWorker();\n case \"graphql\":\n return createGraphQLWorker();\n }\n return createEditorWorker();\n },\n };\n\n const windowUrl = new URL(document.URL);\n const startingSchemaKey = windowUrl.searchParams.get(\"schema\") || \"storefront\";\n\n let initialQuery = \"{ shop { name } }\";\n if (windowUrl.searchParams.has(\"query\")) {\n initialQuery = decodeURIComponent(windowUrl.searchParams.get(\"query\") ?? initialQuery);\n }\n\n initialQuery = print(parse(initialQuery));\n\n let variables;\n if (windowUrl.searchParams.has(\"variables\")) {\n variables = decodeURIComponent(windowUrl.searchParams.get(\"variables\") ?? \"\");\n }\n\n if (variables) {\n variables = JSON.stringify(JSON.parse(variables), null, 2);\n }\n\n const schemas = ${JSON.stringify(schemas).replace(/</g, '\\\\u003c')};\n\n let lastActiveTabIndex = -1;\n let lastTabAmount = -1;\n\n const TAB_STATE_KEY = \"graphiql:tabState\";\n const storage = {\n getTabState: () => JSON.parse(localStorage.getItem(TAB_STATE_KEY)),\n setTabState: (state) => localStorage.setItem(TAB_STATE_KEY, JSON.stringify(state)),\n };\n\n let nextSchemaKey;\n\n function App() {\n const [activeSchema, setActiveSchema] = React.useState(startingSchemaKey);\n\n const schema = schemas[activeSchema];\n\n if (!schema) {\n throw new Error(\"No schema found for \" + activeSchema);\n }\n\n const requestHeaders = schema.accessToken\n ? { [schema.authHeader]: schema.accessToken }\n : {};\n\n const fetcher = createGraphiQLFetcher({\n url: schema.apiUrl,\n headers: requestHeaders,\n enableIncrementalDelivery: false,\n });\n\n function createJsonFetcher(options, httpFetch) {\n if (activeSchema === \"storefront\") {\n return fetcher(options, httpFetch);\n } else {\n if (options.operationName === \"IntrospectionQuery\") {\n return { data: schema.value };\n } else {\n return fetcher(options, httpFetch);\n }\n }\n }\n\n const keys = Object.keys(schemas);\n\n function onTabChange(state) {\n const { activeTabIndex, tabs } = state;\n const activeTab = tabs[activeTabIndex];\n\n if (activeTabIndex === lastActiveTabIndex && lastTabAmount === tabs.length) {\n if (nextSchemaKey && activeTab && activeTab.schemaKey !== nextSchemaKey) {\n activeTab.schemaKey = nextSchemaKey;\n nextSchemaKey = undefined;\n storage.setTabState(state);\n setTimeout(() => storage.setTabState(state), 500);\n }\n return;\n }\n\n if (activeTab) {\n if (!activeTab.schemaKey) {\n if (lastTabAmount < tabs.length) {\n activeTab.schemaKey = activeSchema;\n storage.setTabState(state);\n }\n }\n\n const nextSchema = activeTab.schemaKey || \"storefront\";\n\n if (nextSchema !== activeSchema) {\n setActiveSchema(nextSchema);\n }\n }\n\n lastActiveTabIndex = activeTabIndex;\n lastTabAmount = tabs.length;\n }\n\n const plugins = [HISTORY_PLUGIN, explorerPlugin()];\n\n const props = {\n fetcher: createJsonFetcher,\n defaultEditorToolsVisibility: true,\n initialQuery,\n variables,\n schema: schema.value,\n plugins,\n onTabChange,\n };\n\n function toggleSelectedApi() {\n const activeKeyIndex = keys.indexOf(activeSchema);\n nextSchemaKey = keys[(activeKeyIndex + 1) % keys.length];\n if (nextSchemaKey) setActiveSchema(nextSchemaKey);\n }\n\n const CustomToolbar = React.createElement(GraphiQL.Toolbar, { key: \"Custom Toolbar\" }, [\n React.createElement(\n ToolbarButton,\n {\n key: \"api-wrapper\",\n onClick: toggleSelectedApi,\n label: \"Toggle between different API schemas\",\n },\n [\n React.createElement(\"div\", { key: \"icon\", style: { textAlign: \"center\" } }, [\n schema.icon,\n React.createElement(\n \"div\",\n {\n key: \"icon-label\",\n className: \"graphiql-api-toolbar-label\",\n },\n \"API\",\n ),\n ]),\n ],\n ),\n ]);\n\n const CustomLogo = React.createElement(GraphiQL.Logo, { key: \"Logo replacement\" }, [\n React.createElement(\n \"div\",\n {\n key: \"Logo wrapper\",\n style: { display: \"flex\", alignItems: \"center\" },\n },\n [\n React.createElement(\n \"div\",\n {\n key: \"api\",\n className: \"graphiql-logo\",\n style: { paddingRight: 0, whiteSpace: \"nowrap\" },\n },\n [schema.name],\n ),\n React.createElement(GraphiQL.Logo, { key: \"logo\" }),\n ],\n ),\n ]);\n\n return React.createElement(GraphiQL, props, [CustomToolbar, CustomLogo]);\n }\n\n const container = document.getElementById(\"graphiql\");\n const root = ReactDOM.createRoot(container);\n root.render(React.createElement(App));\n </script>\n </head>\n <body>\n <div id=\"graphiql\">\n <div class=\"placeholder\">Loading GraphiQL...</div>\n </div>\n </body>\n </html>\n `,\n { status: 200, headers: { \"content-type\": \"text/html\" } },\n );\n}\n"],"mappings":";;;;AAIA,MAAM,8BAA8B;AAMpC,MAAa,kBACX,KACA,EAAE,SAAS,kBAAkB,UAAU,sBACpC;AACH,KAAI,QAAQ,WAAW,SAAS,IAAI,aAAa,YAAa,QAAO;AAErE,QAAO,uBAAuB,kBAAkB,gBAAgB;;AAGlE,eAAe,uBACb,kBACA,iBACmB;CACnB,MAAM,UAUF,EAAE;AAIN,SAAQ,aAAa;EACnB,MAAM;EACN,YAAY;EACZ,QAAQ,GALU,iBAAiB,SAAS;EAM5C,MAAM;EACP;AAED,KAAI,iBAAiB,iBAAiB;EACpC,MAAM,EAAE,QAAQ,aAAa,cAAc,gBAAgB;AAE3D,MAAI;GAIF,MAAM,aAAsB,OAAM,MAHL,MAAM,WAAW,EAC5C,QAAQ,YAAY,QAAQ,4BAA4B,EACzD,CAAC,EAC+C,MAAM;AAEvD,OAAI,OAAO,eAAe,YAAY,eAAe,KACnD,SAAQ,sBAAsB;IAC5B,MAAM;IACN,OAAO;IACP,YAAY;IACZ;IACA;IACA,MAAM;IACP;UAEG;;CAKV,MAAM,UAAU;CAEhB,MAAM,OAAO,OAAO;AAEpB,QAAO,IAAI,SACT;;;;MAKmD,SAsFzB,KAAK,UAAU,QAAQ,CAAC,QAAQ,MAAM,UAAU,CA6JzE,EACD;EAAE,QAAQ;EAAK,SAAS,EAAE,gBAAgB,aAAa;EAAE,CAC1D"}
@@ -0,0 +1,23 @@
1
+ import { MCP_REQUEST_HEADER_ALLOWLIST } from "../../headers.mjs";
2
+ import { MCP_RE } from "../../url.mjs";
3
+ import { createProxyInterceptor } from "./proxy.mjs";
4
+
5
+ //#region src/core/request-routing/interceptors/mcp-proxy.ts
6
+ const JSON_RPC_INTERNAL_ERROR = -32603;
7
+ const handleMcpProxy = createProxyInterceptor({
8
+ match: MCP_RE,
9
+ headers: { allow: MCP_REQUEST_HEADER_ALLOWLIST },
10
+ formatError: (message) => ({
11
+ jsonrpc: "2.0",
12
+ error: {
13
+ code: JSON_RPC_INTERNAL_ERROR,
14
+ message
15
+ },
16
+ id: null
17
+ }),
18
+ scope: "mcp-proxy"
19
+ });
20
+
21
+ //#endregion
22
+ export { handleMcpProxy };
23
+ //# sourceMappingURL=mcp-proxy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-proxy.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/mcp-proxy.ts"],"sourcesContent":["import { MCP_REQUEST_HEADER_ALLOWLIST } from \"../../headers\";\nimport { MCP_RE } from \"../../url\";\nimport { createProxyInterceptor } from \"./proxy\";\n\nconst JSON_RPC_INTERNAL_ERROR = -32603;\n\nexport const handleMcpProxy = createProxyInterceptor({\n match: MCP_RE,\n headers: { allow: MCP_REQUEST_HEADER_ALLOWLIST },\n formatError: (message) => ({\n jsonrpc: \"2.0\",\n error: { code: JSON_RPC_INTERNAL_ERROR, message },\n id: null,\n }),\n scope: \"mcp-proxy\",\n});\n"],"mappings":";;;;;AAIA,MAAM,0BAA0B;AAEhC,MAAa,iBAAiB,uBAAuB;CACnD,OAAO;CACP,SAAS,EAAE,OAAO,8BAA8B;CAChD,cAAc,aAAa;EACzB,SAAS;EACT,OAAO;GAAE,MAAM;GAAyB;GAAS;EACjD,IAAI;EACL;CACD,OAAO;CACR,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { getLogger } from "../../logging/logging.mjs";
2
+ import { extractHeaders } from "../../headers.mjs";
3
+
4
+ //#region src/core/request-routing/interceptors/proxy.ts
5
+ const PROXY_TIMEOUT_MS = 3e4;
6
+ function createProxyInterceptor(descriptor) {
7
+ const log = getLogger(descriptor.scope);
8
+ const formatError = descriptor.formatError ?? defaultFormatError;
9
+ return (url, options) => {
10
+ const { request, storefrontClient } = options;
11
+ if (!descriptor.match.test(url.pathname)) return null;
12
+ if (descriptor.methods && !descriptor.methods.includes(request.method)) return null;
13
+ let upstreamUrl;
14
+ let init;
15
+ try {
16
+ const upstreamPathname = descriptor.rewritePathname?.(url.pathname) ?? url.pathname;
17
+ upstreamUrl = new URL(upstreamPathname + url.search, storefrontClient.storeUrl);
18
+ const forwardedHeaders = createProxyRequestHeaders(descriptor, request);
19
+ options.requestContext.applyStorefrontRequestHeaders(forwardedHeaders);
20
+ descriptor.headers.prepare?.(forwardedHeaders, options, url);
21
+ init = {
22
+ method: request.method,
23
+ body: request.body,
24
+ headers: forwardedHeaders,
25
+ signal: AbortSignal.timeout(descriptor.timeoutMs ?? PROXY_TIMEOUT_MS),
26
+ redirect: descriptor.redirect ?? "manual"
27
+ };
28
+ if (request.body) init.duplex = "half";
29
+ } catch (error) {
30
+ log.error("request failed", { error });
31
+ return Promise.resolve(createProxyErrorResponse(error, 500, formatError));
32
+ }
33
+ return fetch(upstreamUrl, init).then((upstreamResponse) => new Response(upstreamResponse.body, {
34
+ status: upstreamResponse.status,
35
+ statusText: upstreamResponse.statusText,
36
+ headers: createProxyResponseHeaders(upstreamResponse.headers)
37
+ })).catch((error) => {
38
+ log.error("request failed", { error });
39
+ return createProxyErrorResponse(error, 502, formatError);
40
+ });
41
+ };
42
+ }
43
+ function defaultFormatError(message) {
44
+ return { error: message };
45
+ }
46
+ function createProxyErrorResponse(error, status, formatError) {
47
+ const message = error instanceof Error ? error.message : "Internal proxy error";
48
+ return new Response(JSON.stringify(formatError(message)), {
49
+ status,
50
+ headers: { "content-type": "application/json" }
51
+ });
52
+ }
53
+ function createProxyRequestHeaders(descriptor, request) {
54
+ const { allow, deny } = descriptor.headers;
55
+ const headers = allow ? new Headers(extractHeaders((key) => request.headers.get(key), allow)) : new Headers(request.headers);
56
+ for (const header of deny ?? []) headers.delete(header);
57
+ return headers;
58
+ }
59
+ function createProxyResponseHeaders(upstreamHeaders) {
60
+ const headers = new Headers(upstreamHeaders);
61
+ headers.delete("content-encoding");
62
+ headers.delete("content-length");
63
+ return headers;
64
+ }
65
+
66
+ //#endregion
67
+ export { createProxyInterceptor, createProxyResponseHeaders };
68
+ //# sourceMappingURL=proxy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/proxy.ts"],"sourcesContent":["import { extractHeaders } from \"../../headers\";\nimport { getLogger } from \"../../logging\";\nimport type { HydrogenRouteInterceptor, HydrogenRoutesOptions } from \"../route-types\";\n\nconst PROXY_TIMEOUT_MS = 30_000;\n\ntype ProxyHeaderOptions = (\n | { allow: readonly string[]; deny?: never }\n | { allow?: never; deny: readonly string[] }\n) & {\n prepare?: (headers: Headers, options: HydrogenRoutesOptions, url: URL) => void;\n};\n\ntype ProxyDescriptor = {\n headers: ProxyHeaderOptions;\n match: RegExp;\n methods?: readonly string[];\n formatError?: (message: string) => unknown;\n redirect?: RequestRedirect;\n scope: string;\n timeoutMs?: number;\n rewritePathname?: (pathname: string) => string;\n};\n\nexport function createProxyInterceptor(descriptor: ProxyDescriptor): HydrogenRouteInterceptor {\n const log = getLogger(descriptor.scope);\n const formatError = descriptor.formatError ?? defaultFormatError;\n\n return (url, options) => {\n const { request, storefrontClient } = options;\n if (!descriptor.match.test(url.pathname)) return null;\n if (descriptor.methods && !descriptor.methods.includes(request.method)) return null;\n\n let upstreamUrl: URL;\n let init: RequestInit & { duplex?: \"half\" };\n try {\n const upstreamPathname = descriptor.rewritePathname?.(url.pathname) ?? url.pathname;\n upstreamUrl = new URL(upstreamPathname + url.search, storefrontClient.storeUrl);\n const forwardedHeaders = createProxyRequestHeaders(descriptor, request);\n options.requestContext.applyStorefrontRequestHeaders(forwardedHeaders);\n descriptor.headers.prepare?.(forwardedHeaders, options, url);\n\n init = {\n method: request.method,\n body: request.body,\n headers: forwardedHeaders,\n signal: AbortSignal.timeout(descriptor.timeoutMs ?? PROXY_TIMEOUT_MS),\n redirect: descriptor.redirect ?? \"manual\",\n };\n\n // Node's fetch requires this when forwarding a streaming request body.\n if (request.body) init.duplex = \"half\";\n } catch (error) {\n log.error(\"request failed\", { error });\n return Promise.resolve(createProxyErrorResponse(error, 500, formatError));\n }\n\n return fetch(upstreamUrl, init)\n .then(\n (upstreamResponse) =>\n new Response(upstreamResponse.body, {\n status: upstreamResponse.status,\n statusText: upstreamResponse.statusText,\n headers: createProxyResponseHeaders(upstreamResponse.headers),\n }),\n )\n .catch((error) => {\n log.error(\"request failed\", { error });\n return createProxyErrorResponse(error, 502, formatError);\n });\n };\n}\n\nfunction defaultFormatError(message: string): { error: string } {\n return { error: message };\n}\n\nfunction createProxyErrorResponse(\n error: unknown,\n status: number,\n formatError: (message: string) => unknown,\n): Response {\n const message = error instanceof Error ? error.message : \"Internal proxy error\";\n return new Response(JSON.stringify(formatError(message)), {\n status,\n headers: { \"content-type\": \"application/json\" },\n });\n}\n\nfunction createProxyRequestHeaders(descriptor: ProxyDescriptor, request: Request): Headers {\n const { allow, deny } = descriptor.headers;\n const headers = allow\n ? new Headers(extractHeaders((key) => request.headers.get(key), allow))\n : new Headers(request.headers);\n for (const header of deny ?? []) headers.delete(header);\n return headers;\n}\n\nexport function createProxyResponseHeaders(upstreamHeaders: Headers): Headers {\n const headers = new Headers(upstreamHeaders);\n headers.delete(\"content-encoding\");\n headers.delete(\"content-length\");\n return headers;\n}\n"],"mappings":";;;;AAIA,MAAM,mBAAmB;AAoBzB,SAAgB,uBAAuB,YAAuD;CAC5F,MAAM,MAAM,UAAU,WAAW,MAAM;CACvC,MAAM,cAAc,WAAW,eAAe;AAE9C,SAAQ,KAAK,YAAY;EACvB,MAAM,EAAE,SAAS,qBAAqB;AACtC,MAAI,CAAC,WAAW,MAAM,KAAK,IAAI,SAAS,CAAE,QAAO;AACjD,MAAI,WAAW,WAAW,CAAC,WAAW,QAAQ,SAAS,QAAQ,OAAO,CAAE,QAAO;EAE/E,IAAI;EACJ,IAAI;AACJ,MAAI;GACF,MAAM,mBAAmB,WAAW,kBAAkB,IAAI,SAAS,IAAI,IAAI;AAC3E,iBAAc,IAAI,IAAI,mBAAmB,IAAI,QAAQ,iBAAiB,SAAS;GAC/E,MAAM,mBAAmB,0BAA0B,YAAY,QAAQ;AACvE,WAAQ,eAAe,8BAA8B,iBAAiB;AACtE,cAAW,QAAQ,UAAU,kBAAkB,SAAS,IAAI;AAE5D,UAAO;IACL,QAAQ,QAAQ;IAChB,MAAM,QAAQ;IACd,SAAS;IACT,QAAQ,YAAY,QAAQ,WAAW,aAAa,iBAAiB;IACrE,UAAU,WAAW,YAAY;IAClC;AAGD,OAAI,QAAQ,KAAM,MAAK,SAAS;WACzB,OAAO;AACd,OAAI,MAAM,kBAAkB,EAAE,OAAO,CAAC;AACtC,UAAO,QAAQ,QAAQ,yBAAyB,OAAO,KAAK,YAAY,CAAC;;AAG3E,SAAO,MAAM,aAAa,KAAK,CAC5B,MACE,qBACC,IAAI,SAAS,iBAAiB,MAAM;GAClC,QAAQ,iBAAiB;GACzB,YAAY,iBAAiB;GAC7B,SAAS,2BAA2B,iBAAiB,QAAQ;GAC9D,CAAC,CACL,CACA,OAAO,UAAU;AAChB,OAAI,MAAM,kBAAkB,EAAE,OAAO,CAAC;AACtC,UAAO,yBAAyB,OAAO,KAAK,YAAY;IACxD;;;AAIR,SAAS,mBAAmB,SAAoC;AAC9D,QAAO,EAAE,OAAO,SAAS;;AAG3B,SAAS,yBACP,OACA,QACA,aACU;CACV,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,QAAO,IAAI,SAAS,KAAK,UAAU,YAAY,QAAQ,CAAC,EAAE;EACxD;EACA,SAAS,EAAE,gBAAgB,oBAAoB;EAChD,CAAC;;AAGJ,SAAS,0BAA0B,YAA6B,SAA2B;CACzF,MAAM,EAAE,OAAO,SAAS,WAAW;CACnC,MAAM,UAAU,QACZ,IAAI,QAAQ,gBAAgB,QAAQ,QAAQ,QAAQ,IAAI,IAAI,EAAE,MAAM,CAAC,GACrE,IAAI,QAAQ,QAAQ,QAAQ;AAChC,MAAK,MAAM,UAAU,QAAQ,EAAE,CAAE,SAAQ,OAAO,OAAO;AACvD,QAAO;;AAGT,SAAgB,2BAA2B,iBAAmC;CAC5E,MAAM,UAAU,IAAI,QAAQ,gBAAgB;AAC5C,SAAQ,OAAO,mBAAmB;AAClC,SAAQ,OAAO,iBAAiB;AAChC,QAAO"}
@@ -0,0 +1,22 @@
1
+ //#region src/core/request-routing/interceptors/query-param-redirect.ts
2
+ function handleQueryParamRedirect(request) {
3
+ const url = new URL(request.url);
4
+ const redirectTo = url.searchParams.get("return_to") || url.searchParams.get("redirect");
5
+ if (!redirectTo) return null;
6
+ if (!isSameOrigin(request.url, redirectTo)) return null;
7
+ return new Response(null, {
8
+ status: 301,
9
+ headers: { location: redirectTo }
10
+ });
11
+ }
12
+ function isSameOrigin(requestUrl, redirectUrl) {
13
+ try {
14
+ return new URL(requestUrl).origin === new URL(redirectUrl, requestUrl).origin;
15
+ } catch {
16
+ return false;
17
+ }
18
+ }
19
+
20
+ //#endregion
21
+ export { handleQueryParamRedirect };
22
+ //# sourceMappingURL=query-param-redirect.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-param-redirect.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/query-param-redirect.ts"],"sourcesContent":["export function handleQueryParamRedirect(request: Request): Response | null {\n const url = new URL(request.url);\n const redirectTo = url.searchParams.get(\"return_to\") || url.searchParams.get(\"redirect\");\n\n if (!redirectTo) return null;\n if (!isSameOrigin(request.url, redirectTo)) return null;\n\n return new Response(null, {\n status: 301,\n headers: { location: redirectTo },\n });\n}\n\nfunction isSameOrigin(requestUrl: string, redirectUrl: string): boolean {\n try {\n return new URL(requestUrl).origin === new URL(redirectUrl, requestUrl).origin;\n } catch {\n return false;\n }\n}\n"],"mappings":";AAAA,SAAgB,yBAAyB,SAAmC;CAC1E,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;CAChC,MAAM,aAAa,IAAI,aAAa,IAAI,YAAY,IAAI,IAAI,aAAa,IAAI,WAAW;AAExF,KAAI,CAAC,WAAY,QAAO;AACxB,KAAI,CAAC,aAAa,QAAQ,KAAK,WAAW,CAAE,QAAO;AAEnD,QAAO,IAAI,SAAS,MAAM;EACxB,QAAQ;EACR,SAAS,EAAE,UAAU,YAAY;EAClC,CAAC;;AAGJ,SAAS,aAAa,YAAoB,aAA8B;AACtE,KAAI;AACF,SAAO,IAAI,IAAI,WAAW,CAAC,WAAW,IAAI,IAAI,aAAa,WAAW,CAAC;SACjE;AACN,SAAO"}
@@ -0,0 +1,27 @@
1
+ import { SFAPI_REQUEST_HEADER_ALLOWLIST, STOREFRONT_BUYER_IP_HEADER, STOREFRONT_ID_HEADER } from "../../headers.mjs";
2
+ import { SFAPI_RE } from "../../url.mjs";
3
+ import { createProxyInterceptor } from "./proxy.mjs";
4
+
5
+ //#region src/core/request-routing/interceptors/sfapi-proxy.ts
6
+ const handleSfapiProxy = createProxyInterceptor({
7
+ match: SFAPI_RE,
8
+ headers: {
9
+ allow: SFAPI_REQUEST_HEADER_ALLOWLIST,
10
+ prepare: (headers, { requestContext, storefrontClient }) => {
11
+ headers.delete(STOREFRONT_ID_HEADER);
12
+ if (storefrontClient.storefrontId) headers.set(STOREFRONT_ID_HEADER, storefrontClient.storefrontId);
13
+ headers.delete(STOREFRONT_BUYER_IP_HEADER);
14
+ const { buyerIp } = requestContext;
15
+ if (buyerIp) {
16
+ headers.set(STOREFRONT_BUYER_IP_HEADER, buyerIp);
17
+ return;
18
+ }
19
+ if (storefrontClient.type === "private") throw new Error("requestContext.buyerIp is required for private Storefront API proxy requests");
20
+ }
21
+ },
22
+ scope: "sfapi-proxy"
23
+ });
24
+
25
+ //#endregion
26
+ export { handleSfapiProxy };
27
+ //# sourceMappingURL=sfapi-proxy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sfapi-proxy.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/sfapi-proxy.ts"],"sourcesContent":["import {\n SFAPI_REQUEST_HEADER_ALLOWLIST,\n STOREFRONT_BUYER_IP_HEADER,\n STOREFRONT_ID_HEADER,\n} from \"../../headers\";\nimport { SFAPI_RE } from \"../../url\";\nimport { createProxyInterceptor } from \"./proxy\";\n\nexport const handleSfapiProxy = createProxyInterceptor({\n match: SFAPI_RE,\n headers: {\n allow: SFAPI_REQUEST_HEADER_ALLOWLIST,\n prepare: (headers, { requestContext, storefrontClient }) => {\n headers.delete(STOREFRONT_ID_HEADER);\n if (storefrontClient.storefrontId) {\n headers.set(STOREFRONT_ID_HEADER, storefrontClient.storefrontId);\n }\n\n headers.delete(STOREFRONT_BUYER_IP_HEADER);\n const { buyerIp } = requestContext;\n if (buyerIp) {\n headers.set(STOREFRONT_BUYER_IP_HEADER, buyerIp);\n return;\n }\n if (storefrontClient.type === \"private\") {\n throw new Error(\n \"requestContext.buyerIp is required for private Storefront API proxy requests\",\n );\n }\n },\n },\n scope: \"sfapi-proxy\",\n});\n"],"mappings":";;;;;AAQA,MAAa,mBAAmB,uBAAuB;CACrD,OAAO;CACP,SAAS;EACP,OAAO;EACP,UAAU,SAAS,EAAE,gBAAgB,uBAAuB;AAC1D,WAAQ,OAAO,qBAAqB;AACpC,OAAI,iBAAiB,aACnB,SAAQ,IAAI,sBAAsB,iBAAiB,aAAa;AAGlE,WAAQ,OAAO,2BAA2B;GAC1C,MAAM,EAAE,YAAY;AACpB,OAAI,SAAS;AACX,YAAQ,IAAI,4BAA4B,QAAQ;AAChD;;AAEF,OAAI,iBAAiB,SAAS,UAC5B,OAAM,IAAI,MACR,+EACD;;EAGN;CACD,OAAO;CACR,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { getStandardRouteTarget, isStandardRouteSelfRedirect } from "../../standard-routes/redirects.mjs";
2
+ import { createRedirectLocation, createRedirectResponse } from "./url-redirects.mjs";
3
+
4
+ //#region src/core/request-routing/interceptors/standard-routes.ts
5
+ function handleStandardRouteRedirects({ request, storefrontClient, routeTemplates }) {
6
+ const url = new URL(request.url);
7
+ const target = getStandardRouteTarget({
8
+ pathname: url.pathname,
9
+ pathPrefix: storefrontClient.requestContext.i18n.pathPrefix,
10
+ routeTemplates
11
+ });
12
+ if (!target) return null;
13
+ const location = createRedirectLocation(target, url.searchParams);
14
+ return isStandardRouteSelfRedirect(request.url, location) ? null : createRedirectResponse(location);
15
+ }
16
+
17
+ //#endregion
18
+ export { handleStandardRouteRedirects };
19
+ //# sourceMappingURL=standard-routes.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard-routes.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/standard-routes.ts"],"sourcesContent":["import type { StorefrontClient } from \"../../../client\";\nimport {\n getStandardRouteTarget,\n isStandardRouteSelfRedirect,\n type ShopifyRouteTemplates,\n} from \"../../standard-routes/index\";\nimport { createRedirectLocation, createRedirectResponse } from \"./url-redirects\";\n\nexport function handleStandardRouteRedirects({\n request,\n storefrontClient,\n routeTemplates,\n}: {\n request: Request;\n storefrontClient: StorefrontClient;\n routeTemplates: ShopifyRouteTemplates;\n}): Response | null {\n const url = new URL(request.url);\n const target = getStandardRouteTarget({\n pathname: url.pathname,\n pathPrefix: storefrontClient.requestContext.i18n.pathPrefix,\n routeTemplates,\n });\n\n if (!target) return null;\n\n const location = createRedirectLocation(target, url.searchParams);\n\n return isStandardRouteSelfRedirect(request.url, location)\n ? null\n : createRedirectResponse(location);\n}\n"],"mappings":";;;;AAQA,SAAgB,6BAA6B,EAC3C,SACA,kBACA,kBAKkB;CAClB,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;CAChC,MAAM,SAAS,uBAAuB;EACpC,UAAU,IAAI;EACd,YAAY,iBAAiB,eAAe,KAAK;EACjD;EACD,CAAC;AAEF,KAAI,CAAC,OAAQ,QAAO;CAEpB,MAAM,WAAW,uBAAuB,QAAQ,IAAI,aAAa;AAEjE,QAAO,4BAA4B,QAAQ,KAAK,SAAS,GACrD,OACA,uBAAuB,SAAS"}
@@ -0,0 +1,27 @@
1
+ import { gql } from "../../../graphql/graphql.mjs";
2
+
3
+ //#region src/core/request-routing/interceptors/url-redirects.ts
4
+ const REDIRECT_QUERY = gql(`query redirects($query:String){urlRedirects(first:1 query:$query){edges{node{target}}}}`);
5
+ const PLACEHOLDER_BASE = "https://0.0.0.0";
6
+ async function handleUrlRedirects({ request, storefrontClient }) {
7
+ const { pathname, searchParams } = new URL(request.url);
8
+ const queryPath = pathname.toLowerCase().replace(/\/+$/, "");
9
+ const target = (await storefrontClient.graphql(REDIRECT_QUERY, { variables: { query: `path:${queryPath}` } })).data?.urlRedirects?.edges[0]?.node.target;
10
+ if (!target) return null;
11
+ return createRedirectResponse(createRedirectLocation(target, searchParams));
12
+ }
13
+ function createRedirectLocation(location, searchParams) {
14
+ const url = new URL(location, PLACEHOLDER_BASE);
15
+ for (const [key, value] of searchParams) url.searchParams.append(key, value);
16
+ return url.toString().replace(PLACEHOLDER_BASE, "");
17
+ }
18
+ function createRedirectResponse(location, status = 301) {
19
+ return new Response(null, {
20
+ status,
21
+ headers: { location }
22
+ });
23
+ }
24
+
25
+ //#endregion
26
+ export { createRedirectLocation, createRedirectResponse, handleUrlRedirects };
27
+ //# sourceMappingURL=url-redirects.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-redirects.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/url-redirects.ts"],"sourcesContent":["import { gql } from \"../../../graphql\";\nimport type { RedirectOptions } from \"../handle-shopify-redirects\";\n\ntype UrlRedirectOptions = Pick<RedirectOptions, \"request\" | \"storefrontClient\">;\n\nconst REDIRECT_QUERY = gql(`\n query redirects($query: String) {\n urlRedirects(first: 1, query: $query) {\n edges {\n node {\n target\n }\n }\n }\n }\n`);\n\n// Used as a base for `new URL()` when constructing relative redirect URLs.\n// Stripped from the output — only needed because `new URL` requires a base for relative paths.\nconst PLACEHOLDER_BASE = \"https://0.0.0.0\";\n\nexport async function handleUrlRedirects({\n request,\n storefrontClient,\n}: UrlRedirectOptions): Promise<Response | null> {\n const url = new URL(request.url);\n const { pathname, searchParams } = url;\n\n const queryPath = pathname.toLowerCase().replace(/\\/+$/, \"\");\n const result = await storefrontClient.graphql(REDIRECT_QUERY, {\n variables: { query: `path:${queryPath}` },\n });\n\n const target = result.data?.urlRedirects?.edges[0]?.node.target;\n if (!target) return null;\n\n return createRedirectResponse(createRedirectLocation(target, searchParams));\n}\n\nexport function createRedirectLocation(location: string, searchParams: URLSearchParams): string {\n const url = new URL(location, PLACEHOLDER_BASE);\n\n for (const [key, value] of searchParams) {\n url.searchParams.append(key, value);\n }\n\n return url.toString().replace(PLACEHOLDER_BASE, \"\");\n}\n\nexport function createRedirectResponse(location: string, status: number = 301): Response {\n return new Response(null, {\n status,\n headers: { location },\n });\n}\n"],"mappings":";;;AAKA,MAAA,iBAAA,IAAA,0FAUA;AAIA,MAAA,mBAAA;AAEA,eAAA,mBAAA,EACA,SACA,oBACA;CAEA,MAAA,EAAA,UAAA,iBAAA,IADA,IAAA,QAAA,IACA;CAEA,MAAA,YAAA,SAAA,aAAA,CAAA,QAAA,QAAA,GAAA;CAKA,MAAA,UAAA,MAJA,iBAAA,QAAA,gBAAA,EACA,WAAA,EAAA,OAAA,QAAA,aAAA,EACA,CAAA,EAEA,MAAA,cAAA,MAAA,IAAA,KAAA;AACA,KAAA,CAAA,OAAA,QAAA;AAEA,QAAA,uBAAA,uBAAA,QAAA,aAAA,CAAA;;AAGA,SAAA,uBAAA,UAAA,cAAA;CACA,MAAA,MAAA,IAAA,IAAA,UAAA,iBAAA;AAEA,MAAA,MAAA,CAAA,KAAA,UAAA,aACA,KAAA,aAAA,OAAA,KAAA,MAAA;AAGA,QAAA,IAAA,UAAA,CAAA,QAAA,kBAAA,GAAA;;AAGA,SAAA,uBAAA,UAAA,SAAA,KAAA;AACA,QAAA,IAAA,SAAA,MAAA;EACA;EACA,SAAA,EAAA,UAAA;EACA,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { PROXY_REQUEST_HEADER_DENYLIST } from "../../headers.mjs";
2
+ import { WELL_KNOWN_RE } from "../../url.mjs";
3
+ import { createProxyInterceptor } from "./proxy.mjs";
4
+
5
+ //#region src/core/request-routing/interceptors/well-known.ts
6
+ /**
7
+ * Serves allowlisted Shopify well-known resources from the headless storefront
8
+ * origin so services can verify the customer-facing hostname.
9
+ */
10
+ const handleWellKnownProxy = createProxyInterceptor({
11
+ match: WELL_KNOWN_RE,
12
+ headers: { deny: PROXY_REQUEST_HEADER_DENYLIST },
13
+ redirect: "follow",
14
+ scope: "well-known-proxy"
15
+ });
16
+
17
+ //#endregion
18
+ export { handleWellKnownProxy };
19
+ //# sourceMappingURL=well-known.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"well-known.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/well-known.ts"],"sourcesContent":["import { PROXY_REQUEST_HEADER_DENYLIST } from \"../../headers\";\nimport { WELL_KNOWN_RE } from \"../../url\";\nimport { createProxyInterceptor } from \"./proxy\";\n\n/**\n * Serves allowlisted Shopify well-known resources from the headless storefront\n * origin so services can verify the customer-facing hostname.\n */\nexport const handleWellKnownProxy = createProxyInterceptor({\n match: WELL_KNOWN_RE,\n headers: { deny: PROXY_REQUEST_HEADER_DENYLIST },\n redirect: \"follow\",\n scope: \"well-known-proxy\",\n});\n"],"mappings":";;;;;;;;;AAQA,MAAa,uBAAuB,uBAAuB;CACzD,OAAO;CACP,SAAS,EAAE,MAAM,+BAA+B;CAChD,UAAU;CACV,OAAO;CACR,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { CallableRouteHandler, ShopifyRouteError, ShopifyRouteErrorResult, ShopifyRouteHandler, ShopifyRouteHandlerContext, ShopifyRouteHandlerGroup, ShopifyRouteHandlerResult, ShopifyRouteJsonResult, ShopifyRouteRedirectResult, ShopifyRouteSessionManager } from "./route-types.mjs";
2
+
3
+ //#region src/core/request-routing/registered-routes.d.ts
4
+ declare function createShopifyRouteHandler<const TPathname extends string, const TMethod extends string>(pathname: TPathname, method: TMethod, handler: (context: ShopifyRouteHandlerContext) => Promise<ShopifyRouteHandlerResult>): ShopifyRouteHandler<TPathname, TMethod>;
5
+ //#endregion
6
+ export { createShopifyRouteHandler };
7
+ //# sourceMappingURL=registered-routes.d.mts.map
@@ -0,0 +1,59 @@
1
+ //#region src/core/request-routing/registered-routes.ts
2
+ const HTTP_OK_STATUS = 200;
3
+ const HTTP_SEE_OTHER_STATUS = 303;
4
+ const HTTP_METHOD_NOT_ALLOWED_STATUS = 405;
5
+ const HTTP_BAD_REQUEST_STATUS = 400;
6
+ function createShopifyRouteHandler(pathname, method, handler) {
7
+ return createCallableRouteHandler(pathname, method, handler);
8
+ }
9
+ function createCallableRouteHandler(pathname, method, handler) {
10
+ return Object.assign(handler, {
11
+ pathname,
12
+ method
13
+ });
14
+ }
15
+ const handleShopifyRouteHandlers = (url, { request, sessionManager, storefrontClient, requestContext, handlers = [] }) => {
16
+ const routeHandlers = handlers.flatMap((group) => Object.values(group));
17
+ if (routeHandlers.length === 0) return null;
18
+ const pathMatches = routeHandlers.filter((entry) => entry.pathname === url.pathname);
19
+ if (pathMatches.length === 0) return null;
20
+ const match = pathMatches.find((candidate) => candidate.method === request.method);
21
+ if (!match) return Promise.resolve(new Response("Method Not Allowed", { status: HTTP_METHOD_NOT_ALLOWED_STATUS }));
22
+ return match({
23
+ request,
24
+ sessionManager,
25
+ storefrontClient,
26
+ requestContext
27
+ }).then((result) => createShopifyRouteResponse(result, request));
28
+ };
29
+ function createShopifyRouteResponse(result, request) {
30
+ if (result.type === "redirect") {
31
+ const headers = new Headers(result.headers);
32
+ headers.set("location", resolveRedirectLocation(result.location, request));
33
+ return new Response(null, {
34
+ status: HTTP_SEE_OTHER_STATUS,
35
+ headers
36
+ });
37
+ }
38
+ if (result.type === "error") {
39
+ const headers = new Headers(result.headers);
40
+ headers.set("content-type", "application/json");
41
+ return new Response(JSON.stringify({ error: result.error }), {
42
+ status: result.status ?? HTTP_BAD_REQUEST_STATUS,
43
+ headers
44
+ });
45
+ }
46
+ const headers = new Headers(result.headers);
47
+ headers.set("content-type", "application/json");
48
+ return new Response(JSON.stringify(result.data), {
49
+ status: HTTP_OK_STATUS,
50
+ headers
51
+ });
52
+ }
53
+ function resolveRedirectLocation(location, request) {
54
+ return new URL(location, new URL(request.url).origin).toString();
55
+ }
56
+
57
+ //#endregion
58
+ export { createCallableRouteHandler, createShopifyRouteHandler, handleShopifyRouteHandlers };
59
+ //# sourceMappingURL=registered-routes.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registered-routes.mjs","names":[],"sources":["../../../../src/core/request-routing/registered-routes.ts"],"sourcesContent":["import type {\n CallableRouteHandler,\n HydrogenRouteInterceptor,\n ShopifyRouteHandler,\n ShopifyRouteHandlerContext,\n ShopifyRouteHandlerResult,\n} from \"./route-types\";\n\nexport type {\n CallableRouteHandler,\n ShopifyRouteError,\n ShopifyRouteErrorResult,\n ShopifyRouteHandler,\n ShopifyRouteHandlerContext,\n ShopifyRouteHandlerGroup,\n ShopifyRouteHandlerResult,\n ShopifyRouteJsonResult,\n ShopifyRouteRedirectResult,\n ShopifyRouteSessionManager,\n} from \"./route-types\";\n\nconst HTTP_OK_STATUS = 200;\nconst HTTP_SEE_OTHER_STATUS = 303;\nconst HTTP_METHOD_NOT_ALLOWED_STATUS = 405;\nconst HTTP_BAD_REQUEST_STATUS = 400;\n\nexport function createShopifyRouteHandler<\n const TPathname extends string,\n const TMethod extends string,\n>(\n pathname: TPathname,\n method: TMethod,\n handler: (context: ShopifyRouteHandlerContext) => Promise<ShopifyRouteHandlerResult>,\n): ShopifyRouteHandler<TPathname, TMethod> {\n return createCallableRouteHandler(pathname, method, handler);\n}\n\nexport function createCallableRouteHandler<\n const TPathname extends string,\n const TMethod extends string,\n TContext,\n TResult,\n>(\n pathname: TPathname,\n method: TMethod,\n handler: (context: TContext) => Promise<TResult>,\n): CallableRouteHandler<TContext, TResult, TPathname, TMethod> {\n return Object.assign(handler, { pathname, method });\n}\n\nexport const handleShopifyRouteHandlers: HydrogenRouteInterceptor = (\n url,\n { request, sessionManager, storefrontClient, requestContext, handlers = [] },\n) => {\n const routeHandlers = handlers.flatMap((group) => Object.values(group));\n if (routeHandlers.length === 0) return null;\n\n const pathMatches = routeHandlers.filter((entry) => entry.pathname === url.pathname);\n if (pathMatches.length === 0) return null;\n\n const match = pathMatches.find((candidate) => candidate.method === request.method);\n if (!match)\n return Promise.resolve(\n new Response(\"Method Not Allowed\", { status: HTTP_METHOD_NOT_ALLOWED_STATUS }),\n );\n\n return match({ request, sessionManager, storefrontClient, requestContext }).then((result) =>\n createShopifyRouteResponse(result, request),\n );\n};\n\nfunction createShopifyRouteResponse(result: ShopifyRouteHandlerResult, request: Request): Response {\n if (result.type === \"redirect\") {\n const headers = new Headers(result.headers);\n headers.set(\"location\", resolveRedirectLocation(result.location, request));\n return new Response(null, {\n status: HTTP_SEE_OTHER_STATUS,\n headers,\n });\n }\n\n if (result.type === \"error\") {\n const headers = new Headers(result.headers);\n headers.set(\"content-type\", \"application/json\");\n return new Response(JSON.stringify({ error: result.error }), {\n status: result.status ?? HTTP_BAD_REQUEST_STATUS,\n headers,\n });\n }\n\n const headers = new Headers(result.headers);\n headers.set(\"content-type\", \"application/json\");\n return new Response(JSON.stringify(result.data), {\n status: HTTP_OK_STATUS,\n headers,\n });\n}\n\nfunction resolveRedirectLocation(location: string, request: Request): string {\n // Absolute Location headers are the best common denominator: browsers accept\n // relative redirects, but framework proxy runtimes like Next.js can require\n // absolute URLs when returning a Response from middleware/proxy code.\n return new URL(location, new URL(request.url).origin).toString();\n}\n"],"mappings":";AAqBA,MAAM,iBAAiB;AACvB,MAAM,wBAAwB;AAC9B,MAAM,iCAAiC;AACvC,MAAM,0BAA0B;AAEhC,SAAgB,0BAId,UACA,QACA,SACyC;AACzC,QAAO,2BAA2B,UAAU,QAAQ,QAAQ;;AAG9D,SAAgB,2BAMd,UACA,QACA,SAC6D;AAC7D,QAAO,OAAO,OAAO,SAAS;EAAE;EAAU;EAAQ,CAAC;;AAGrD,MAAa,8BACX,KACA,EAAE,SAAS,gBAAgB,kBAAkB,gBAAgB,WAAW,EAAE,OACvE;CACH,MAAM,gBAAgB,SAAS,SAAS,UAAU,OAAO,OAAO,MAAM,CAAC;AACvE,KAAI,cAAc,WAAW,EAAG,QAAO;CAEvC,MAAM,cAAc,cAAc,QAAQ,UAAU,MAAM,aAAa,IAAI,SAAS;AACpF,KAAI,YAAY,WAAW,EAAG,QAAO;CAErC,MAAM,QAAQ,YAAY,MAAM,cAAc,UAAU,WAAW,QAAQ,OAAO;AAClF,KAAI,CAAC,MACH,QAAO,QAAQ,QACb,IAAI,SAAS,sBAAsB,EAAE,QAAQ,gCAAgC,CAAC,CAC/E;AAEH,QAAO,MAAM;EAAE;EAAS;EAAgB;EAAkB;EAAgB,CAAC,CAAC,MAAM,WAChF,2BAA2B,QAAQ,QAAQ,CAC5C;;AAGH,SAAS,2BAA2B,QAAmC,SAA4B;AACjG,KAAI,OAAO,SAAS,YAAY;EAC9B,MAAM,UAAU,IAAI,QAAQ,OAAO,QAAQ;AAC3C,UAAQ,IAAI,YAAY,wBAAwB,OAAO,UAAU,QAAQ,CAAC;AAC1E,SAAO,IAAI,SAAS,MAAM;GACxB,QAAQ;GACR;GACD,CAAC;;AAGJ,KAAI,OAAO,SAAS,SAAS;EAC3B,MAAM,UAAU,IAAI,QAAQ,OAAO,QAAQ;AAC3C,UAAQ,IAAI,gBAAgB,mBAAmB;AAC/C,SAAO,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,OAAO,OAAO,CAAC,EAAE;GAC3D,QAAQ,OAAO,UAAU;GACzB;GACD,CAAC;;CAGJ,MAAM,UAAU,IAAI,QAAQ,OAAO,QAAQ;AAC3C,SAAQ,IAAI,gBAAgB,mBAAmB;AAC/C,QAAO,IAAI,SAAS,KAAK,UAAU,OAAO,KAAK,EAAE;EAC/C,QAAQ;EACR;EACD,CAAC;;AAGJ,SAAS,wBAAwB,UAAkB,SAA0B;AAI3E,QAAO,IAAI,IAAI,UAAU,IAAI,IAAI,QAAQ,IAAI,CAAC,OAAO,CAAC,UAAU"}
@@ -0,0 +1,51 @@
1
+ import { ShopifyRequestContext } from "../request-context.mjs";
2
+ import { StorefrontClient } from "../../client/types.mjs";
3
+ //#region src/core/request-routing/route-types.d.ts
4
+ type Awaitable<T> = T | Promise<T>;
5
+ type ShopifyRouteSessionManager = {
6
+ getSessionOrigin(): Awaitable<string>;
7
+ getSessionItem(key: string): Awaitable<unknown>;
8
+ setSessionItem(key: string, value: unknown): Awaitable<void>;
9
+ removeSessionItem(key: string): Awaitable<void>;
10
+ commit?(): Awaitable<HeadersInit | void>;
11
+ };
12
+ type ShopifyRouteHandlerContext = {
13
+ request: Request;
14
+ sessionManager: ShopifyRouteSessionManager;
15
+ storefrontClient: StorefrontClient;
16
+ requestContext: ShopifyRequestContext;
17
+ };
18
+ type ShopifyRouteJsonResult<TData = unknown> = {
19
+ type: "json";
20
+ data: TData;
21
+ headers?: HeadersInit;
22
+ };
23
+ type ShopifyRouteRedirectResult = {
24
+ type: "redirect";
25
+ location: string;
26
+ headers?: HeadersInit;
27
+ };
28
+ type ShopifyRouteError = {
29
+ code: string;
30
+ message: string;
31
+ };
32
+ type ShopifyRouteErrorResult<TError extends ShopifyRouteError = ShopifyRouteError> = {
33
+ type: "error";
34
+ error: TError;
35
+ status?: number;
36
+ headers?: HeadersInit;
37
+ };
38
+ type ShopifyRouteHandlerResult<TData = unknown, TError extends ShopifyRouteError = ShopifyRouteError> = ShopifyRouteJsonResult<TData> | ShopifyRouteRedirectResult | ShopifyRouteErrorResult<TError>;
39
+ type CallableRouteHandler<TContext, TResult, TPathname extends string = string, TMethod extends string = string> = ((context: TContext) => Promise<TResult>) & {
40
+ readonly pathname: TPathname;
41
+ readonly method: TMethod;
42
+ };
43
+ type ShopifyRouteHandler<TPathname extends string = string, TMethod extends string = string> = CallableRouteHandler<ShopifyRouteHandlerContext, ShopifyRouteHandlerResult, TPathname, TMethod>;
44
+ type ShopifyRouteHandlerGroup = Record<string, ShopifyRouteHandler>;
45
+ type HydrogenRoutesOptions = ShopifyRouteHandlerContext & {
46
+ handlers?: readonly ShopifyRouteHandlerGroup[];
47
+ };
48
+ type HydrogenRouteHandler<TExtraOptions extends object = object> = (options: HydrogenRoutesOptions & TExtraOptions) => null | Promise<Response>;
49
+ //#endregion
50
+ export { CallableRouteHandler, HydrogenRouteHandler, ShopifyRouteError, ShopifyRouteErrorResult, ShopifyRouteHandler, ShopifyRouteHandlerContext, ShopifyRouteHandlerGroup, ShopifyRouteHandlerResult, ShopifyRouteJsonResult, ShopifyRouteRedirectResult, ShopifyRouteSessionManager };
51
+ //# sourceMappingURL=route-types.d.mts.map
@@ -0,0 +1,16 @@
1
+ //#region src/core/request-routing/safe-apply-response-headers.ts
2
+ function safeApplyResponseHeaders(response, requestContext) {
3
+ try {
4
+ requestContext.applyResponseHeaders(response.headers);
5
+ return response;
6
+ } catch (error) {
7
+ if (!(error instanceof TypeError)) throw error;
8
+ }
9
+ const mutableResponse = new Response(response.body, response);
10
+ requestContext.applyResponseHeaders(mutableResponse.headers);
11
+ return mutableResponse;
12
+ }
13
+
14
+ //#endregion
15
+ export { safeApplyResponseHeaders };
16
+ //# sourceMappingURL=safe-apply-response-headers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-apply-response-headers.mjs","names":[],"sources":["../../../../src/core/request-routing/safe-apply-response-headers.ts"],"sourcesContent":["import type { ShopifyRequestContext } from \"../request-context\";\n\nexport function safeApplyResponseHeaders(\n response: Response,\n requestContext: Pick<ShopifyRequestContext, \"applyResponseHeaders\">,\n): Response {\n try {\n requestContext.applyResponseHeaders(response.headers);\n return response;\n } catch (error) {\n if (!(error instanceof TypeError)) throw error;\n }\n\n const mutableResponse = new Response(response.body, response);\n requestContext.applyResponseHeaders(mutableResponse.headers);\n return mutableResponse;\n}\n"],"mappings":";AAEA,SAAgB,yBACd,UACA,gBACU;AACV,KAAI;AACF,iBAAe,qBAAqB,SAAS,QAAQ;AACrD,SAAO;UACA,OAAO;AACd,MAAI,EAAE,iBAAiB,WAAY,OAAM;;CAG3C,MAAM,kBAAkB,IAAI,SAAS,SAAS,MAAM,SAAS;AAC7D,gBAAe,qBAAqB,gBAAgB,QAAQ;AAC5D,QAAO"}
@@ -0,0 +1,102 @@
1
+ //#region src/core/shop-pay/shop-pay.d.ts
2
+ declare const SHOP_PAY_BUTTON_TAG_NAME = "hydrogen-shop-pay-button";
3
+ type ShopPayButtonBaseOptions = {
4
+ /**
5
+ * Absolute checkout base URL. Omit it to emit same-origin `/checkout` and
6
+ * `/cart` permalink paths, which `handleShopifyRoutes` redirects to the
7
+ * store's real checkout.
8
+ */
9
+ checkoutUrl?: string;
10
+ /**
11
+ * Checkout payment mode. Defaults to `"shop_pay"`. Use
12
+ * `"shop_pay_installments"` only when the checkout path should open Shop Pay
13
+ * Installments.
14
+ */
15
+ paymentOption?: "shop_pay" | "shop_pay_installments";
16
+ /**
17
+ * Attribution source appended to the checkout URL as `source`. Defaults to
18
+ * `"hydrogen"`. Most storefronts should not override this.
19
+ */
20
+ source?: string;
21
+ /**
22
+ * Optional attribution token appended to the checkout URL as `source_token`.
23
+ * Only pass a value when Shopify has provided one for the integration.
24
+ */
25
+ sourceToken?: string;
26
+ /**
27
+ * Content Security Policy nonce applied to the shadow root's inline style.
28
+ */
29
+ nonce?: string;
30
+ /**
31
+ * Sales channel that issued the Storefront API token. Omit it unless checkout
32
+ * needs explicit `"headless"` or `"hydrogen"` attribution.
33
+ */
34
+ channel?: "headless" | "hydrogen";
35
+ /**
36
+ * Disables the button. Disabled buttons render without an `href` and include
37
+ * `aria-disabled="true"`.
38
+ */
39
+ disabled?: boolean;
40
+ /**
41
+ * CSS width for the rendered anchor, for example `"100%"`. Omit it to use
42
+ * the Shop Pay default width.
43
+ */
44
+ width?: string;
45
+ /**
46
+ * CSS border radius for the rendered anchor, for example `"8px"`. Omit it to
47
+ * use the Shop Pay default radius.
48
+ */
49
+ borderRadius?: string;
50
+ /**
51
+ * Localized accessible label for the Shop Pay logo. Defaults to `"Buy with Shop Pay"`.
52
+ * Never translate the brand name `"Shop Pay"`; keep it in Latin script in every locale.
53
+ *
54
+ * @example English
55
+ * `"Buy with Shop Pay"`
56
+ *
57
+ * @example Japanese
58
+ * `"Shop Payで購入"`
59
+ *
60
+ * @example Hindi
61
+ * `"Shop Pay से खरीदें"`
62
+ *
63
+ * @example Arabic
64
+ * `"الشراء باستخدام Shop Pay"`
65
+ */
66
+ accessibilityLabel?: string;
67
+ };
68
+ type ShopPayVariantWithQuantity = {
69
+ /** ProductVariant GID or bare numeric ProductVariant ID. Product IDs are invalid. */id: string; /** Quantity for this variant. Defaults to `1`. */
70
+ quantity?: number;
71
+ };
72
+ type ShopPayVariants = readonly string[] | readonly ShopPayVariantWithQuantity[];
73
+ type ShopPayButtonOptions = ShopPayButtonBaseOptions & {
74
+ /**
75
+ * Variants to check out immediately via a Shopify cart permalink. Omit this
76
+ * for cart checkout mode, where `/checkout` checks out the current cart.
77
+ */
78
+ variants?: ShopPayVariants;
79
+ };
80
+ /**
81
+ * Builds the checkout URL the Shop Pay button navigates to, or `null` when the
82
+ * button is disabled. Variant mode produces a cart permalink; otherwise the
83
+ * current cart checks out.
84
+ */
85
+ declare function getShopPayButtonUrl(options: ShopPayButtonOptions): string | null;
86
+ /**
87
+ * Renders the Shop Pay button as an HTML string: a self-contained wrapper
88
+ * element carrying the styles and anchor it needs to work without client
89
+ * JavaScript. Use it from server templates or frameworks without a Hydrogen
90
+ * binding.
91
+ */
92
+ declare function renderShopPayButton(options: ShopPayButtonOptions): string;
93
+ /**
94
+ * Creates the Shop Pay button as a detached DOM element. The returned element
95
+ * carries the button styles with it.
96
+ */
97
+ declare function createShopPayButton(options: ShopPayButtonOptions): HTMLElement;
98
+ /** Registers the Shop Pay custom element. No-ops during SSR or when already registered. */
99
+ declare function defineShopPayButton(): void;
100
+ //#endregion
101
+ export { SHOP_PAY_BUTTON_TAG_NAME, ShopPayButtonOptions, createShopPayButton, defineShopPayButton, getShopPayButtonUrl, renderShopPayButton };
102
+ //# sourceMappingURL=shop-pay.d.mts.map