@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.
- package/README.md +73 -13
- package/bin/hydrogen.mjs +7 -0
- package/dist/cli/index.mjs +330 -0
- package/dist/client/client.d.mts +34 -0
- package/dist/client/client.mjs +193 -0
- package/dist/client/client.mjs.map +1 -0
- package/dist/client/errors.d.mts +48 -0
- package/dist/client/errors.mjs +52 -0
- package/dist/client/errors.mjs.map +1 -0
- package/dist/client/index.d.mts +4 -0
- package/dist/client/types.d.mts +147 -0
- package/dist/core/analytics/cart-tracker.d.mts +8 -0
- package/dist/core/analytics/cart-tracker.mjs +144 -0
- package/dist/core/analytics/cart-tracker.mjs.map +1 -0
- package/dist/core/analytics/events.d.mts +15 -0
- package/dist/core/analytics/events.mjs +15 -0
- package/dist/core/analytics/events.mjs.map +1 -0
- package/dist/core/analytics/index.d.mts +3 -0
- package/dist/core/analytics/types.d.mts +143 -0
- package/dist/core/analytics/utils/flatten-connection.d.mts +19 -0
- package/dist/core/analytics/utils/flatten-connection.mjs +25 -0
- package/dist/core/analytics/utils/flatten-connection.mjs.map +1 -0
- package/dist/core/cache/cache-status.mjs +17 -0
- package/dist/core/cache/cache-status.mjs.map +1 -0
- package/dist/core/cache/fetch-with-cache.d.mts +43 -0
- package/dist/core/cache/fetch-with-cache.mjs +188 -0
- package/dist/core/cache/fetch-with-cache.mjs.map +1 -0
- package/dist/core/cache/key.d.mts +6 -0
- package/dist/core/cache/key.mjs +27 -0
- package/dist/core/cache/key.mjs.map +1 -0
- package/dist/core/cache/run-with-cache.d.mts +36 -0
- package/dist/core/cache/run-with-cache.mjs +114 -0
- package/dist/core/cache/run-with-cache.mjs.map +1 -0
- package/dist/core/cache/store.d.mts +19 -0
- package/dist/core/cache/store.mjs +62 -0
- package/dist/core/cache/store.mjs.map +1 -0
- package/dist/core/cache/strategies.d.mts +39 -0
- package/dist/core/cache/strategies.mjs +70 -0
- package/dist/core/cache/strategies.mjs.map +1 -0
- package/dist/core/cart/actions.d.mts +50 -0
- package/dist/core/cart/actions.mjs +240 -0
- package/dist/core/cart/actions.mjs.map +1 -0
- package/dist/core/cart/attach-quantity-input.d.mts +5 -0
- package/dist/core/cart/attach-quantity-input.mjs +17 -0
- package/dist/core/cart/attach-quantity-input.mjs.map +1 -0
- package/dist/core/cart/buyer-identity-sync.d.mts +23 -0
- package/dist/core/cart/buyer-identity-sync.mjs +9 -0
- package/dist/core/cart/buyer-identity-sync.mjs.map +1 -0
- package/dist/core/cart/cart.d.mts +32 -0
- package/dist/core/cart/cart.mjs +1687 -0
- package/dist/core/cart/cart.mjs.map +1 -0
- package/dist/core/cart/cookie.d.mts +5 -0
- package/dist/core/cart/cookie.mjs +28 -0
- package/dist/core/cart/cookie.mjs.map +1 -0
- package/dist/core/cart/form.d.mts +130 -0
- package/dist/core/cart/form.mjs +75 -0
- package/dist/core/cart/form.mjs.map +1 -0
- package/dist/core/cart/get-cart.d.mts +25 -0
- package/dist/core/cart/get-cart.mjs +32 -0
- package/dist/core/cart/get-cart.mjs.map +1 -0
- package/dist/core/cart/index.d.mts +10 -0
- package/dist/core/cart/quantity.d.mts +10 -0
- package/dist/core/cart/quantity.mjs +14 -0
- package/dist/core/cart/quantity.mjs.map +1 -0
- package/dist/core/cart/queries.d.mts +4296 -0
- package/dist/core/cart/queries.mjs +70 -0
- package/dist/core/cart/queries.mjs.map +1 -0
- package/dist/core/cart/server-handlers.d.mts +82 -0
- package/dist/core/cart/server-handlers.mjs +322 -0
- package/dist/core/cart/server-handlers.mjs.map +1 -0
- package/dist/core/cart/state.d.mts +137 -0
- package/dist/core/cart/state.mjs +76 -0
- package/dist/core/cart/state.mjs.map +1 -0
- package/dist/core/cart/sync-quantity-inputs.mjs +16 -0
- package/dist/core/cart/sync-quantity-inputs.mjs.map +1 -0
- package/dist/core/collection/collection.d.mts +134 -0
- package/dist/core/collection/collection.mjs +170 -0
- package/dist/core/collection/collection.mjs.map +1 -0
- package/dist/core/collection/index.d.mts +6 -0
- package/dist/core/collection/reconciler.d.mts +32 -0
- package/dist/core/collection/reconciler.mjs +89 -0
- package/dist/core/collection/reconciler.mjs.map +1 -0
- package/dist/core/collection/state.d.mts +66 -0
- package/dist/core/collection/state.mjs +20 -0
- package/dist/core/collection/state.mjs.map +1 -0
- package/dist/core/collection/url.d.mts +70 -0
- package/dist/core/collection/url.mjs +367 -0
- package/dist/core/collection/url.mjs.map +1 -0
- package/dist/core/constants.d.mts +5 -0
- package/dist/core/constants.mjs +8 -0
- package/dist/core/constants.mjs.map +1 -0
- package/dist/core/headers.mjs +44 -0
- package/dist/core/headers.mjs.map +1 -0
- package/dist/core/index.d.mts +55 -0
- package/dist/core/index.mjs +44 -0
- package/dist/core/logging/logging.d.mts +21 -0
- package/dist/core/logging/logging.mjs +99 -0
- package/dist/core/logging/logging.mjs.map +1 -0
- package/dist/core/logging/types.d.mts +40 -0
- package/dist/core/logging/types.mjs +18 -0
- package/dist/core/logging/types.mjs.map +1 -0
- package/dist/core/money/cache.mjs +25 -0
- package/dist/core/money/cache.mjs.map +1 -0
- package/dist/core/money/format.d.mts +15 -0
- package/dist/core/money/format.mjs +243 -0
- package/dist/core/money/format.mjs.map +1 -0
- package/dist/core/money/types.d.mts +47 -0
- package/dist/core/observable.mjs +46 -0
- package/dist/core/observable.mjs.map +1 -0
- package/dist/core/predictive-search/constants.d.mts +5 -0
- package/dist/core/predictive-search/constants.mjs +6 -0
- package/dist/core/predictive-search/constants.mjs.map +1 -0
- package/dist/core/predictive-search/form.d.mts +31 -0
- package/dist/core/predictive-search/form.mjs +31 -0
- package/dist/core/predictive-search/form.mjs.map +1 -0
- package/dist/core/predictive-search/index.d.mts +6 -0
- package/dist/core/predictive-search/queries.d.mts +118 -0
- package/dist/core/predictive-search/queries.mjs +81 -0
- package/dist/core/predictive-search/queries.mjs.map +1 -0
- package/dist/core/predictive-search/search.d.mts +32 -0
- package/dist/core/predictive-search/search.mjs +74 -0
- package/dist/core/predictive-search/search.mjs.map +1 -0
- package/dist/core/predictive-search/server-handlers.d.mts +36 -0
- package/dist/core/predictive-search/server-handlers.mjs +113 -0
- package/dist/core/predictive-search/server-handlers.mjs.map +1 -0
- package/dist/core/predictive-search/store.d.mts +44 -0
- package/dist/core/predictive-search/store.mjs +224 -0
- package/dist/core/predictive-search/store.mjs.map +1 -0
- package/dist/core/predictive-search/url.d.mts +41 -0
- package/dist/core/predictive-search/url.mjs +71 -0
- package/dist/core/predictive-search/url.mjs.map +1 -0
- package/dist/core/product/form.d.mts +63 -0
- package/dist/core/product/form.mjs +44 -0
- package/dist/core/product/form.mjs.map +1 -0
- package/dist/core/product/index.d.mts +4 -0
- package/dist/core/product/options.d.mts +40 -0
- package/dist/core/product/options.mjs +291 -0
- package/dist/core/product/options.mjs.map +1 -0
- package/dist/core/product/product-form.d.mts +72 -0
- package/dist/core/product/product-form.mjs +158 -0
- package/dist/core/product/product-form.mjs.map +1 -0
- package/dist/core/product/state.d.mts +68 -0
- package/dist/core/request-context.d.mts +70 -0
- package/dist/core/request-context.mjs +120 -0
- package/dist/core/request-context.mjs.map +1 -0
- package/dist/core/request-routing/handle-shopify-redirects.d.mts +17 -0
- package/dist/core/request-routing/handle-shopify-redirects.mjs +31 -0
- package/dist/core/request-routing/handle-shopify-redirects.mjs.map +1 -0
- package/dist/core/request-routing/handle-shopify-routes.d.mts +14 -0
- package/dist/core/request-routing/handle-shopify-routes.mjs +42 -0
- package/dist/core/request-routing/handle-shopify-routes.mjs.map +1 -0
- package/dist/core/request-routing/interceptors/admin-redirect.mjs +12 -0
- package/dist/core/request-routing/interceptors/admin-redirect.mjs.map +1 -0
- package/dist/core/request-routing/interceptors/agent-proxy.mjs +19 -0
- package/dist/core/request-routing/interceptors/agent-proxy.mjs.map +1 -0
- package/dist/core/request-routing/interceptors/ajax-api.mjs +16 -0
- package/dist/core/request-routing/interceptors/ajax-api.mjs.map +1 -0
- package/dist/core/request-routing/interceptors/api-proxy.mjs +20 -0
- package/dist/core/request-routing/interceptors/api-proxy.mjs.map +1 -0
- package/dist/core/request-routing/interceptors/checkout.mjs +58 -0
- package/dist/core/request-routing/interceptors/checkout.mjs.map +1 -0
- package/dist/core/request-routing/interceptors/mcp-proxy.mjs +23 -0
- package/dist/core/request-routing/interceptors/mcp-proxy.mjs.map +1 -0
- package/dist/core/request-routing/interceptors/proxy.mjs +68 -0
- package/dist/core/request-routing/interceptors/proxy.mjs.map +1 -0
- package/dist/core/request-routing/interceptors/query-param-redirect.mjs +22 -0
- package/dist/core/request-routing/interceptors/query-param-redirect.mjs.map +1 -0
- package/dist/core/request-routing/interceptors/sfapi-proxy.mjs +27 -0
- package/dist/core/request-routing/interceptors/sfapi-proxy.mjs.map +1 -0
- package/dist/core/request-routing/interceptors/standard-routes.mjs +19 -0
- package/dist/core/request-routing/interceptors/standard-routes.mjs.map +1 -0
- package/dist/core/request-routing/interceptors/url-redirects.mjs +27 -0
- package/dist/core/request-routing/interceptors/url-redirects.mjs.map +1 -0
- package/dist/core/request-routing/interceptors/well-known.mjs +19 -0
- package/dist/core/request-routing/interceptors/well-known.mjs.map +1 -0
- package/dist/core/request-routing/registered-routes.d.mts +7 -0
- package/dist/core/request-routing/registered-routes.mjs +59 -0
- package/dist/core/request-routing/registered-routes.mjs.map +1 -0
- package/dist/core/request-routing/route-types.d.mts +51 -0
- package/dist/core/request-routing/safe-apply-response-headers.mjs +16 -0
- package/dist/core/request-routing/safe-apply-response-headers.mjs.map +1 -0
- package/dist/core/shop-pay/shop-pay.d.mts +102 -0
- package/dist/core/shop-pay/shop-pay.mjs +289 -0
- package/dist/core/shop-pay/shop-pay.mjs.map +1 -0
- package/dist/core/shopify-scripts/analytics.mjs +26 -0
- package/dist/core/shopify-scripts/analytics.mjs.map +1 -0
- package/dist/core/shopify-scripts/consent.mjs +17 -0
- package/dist/core/shopify-scripts/consent.mjs.map +1 -0
- package/dist/core/shopify-scripts/constants.mjs +19 -0
- package/dist/core/shopify-scripts/constants.mjs.map +1 -0
- package/dist/core/shopify-scripts/deprecated-cookies.mjs +97 -0
- package/dist/core/shopify-scripts/deprecated-cookies.mjs.map +1 -0
- package/dist/core/shopify-scripts/global.d.mts +1 -0
- package/dist/core/shopify-scripts/global.mjs +86 -0
- package/dist/core/shopify-scripts/global.mjs.map +1 -0
- package/dist/core/shopify-scripts/index.d.mts +27 -0
- package/dist/core/shopify-scripts/index.mjs +135 -0
- package/dist/core/shopify-scripts/index.mjs.map +1 -0
- package/dist/core/shopify-scripts/initialize.d.mts +18 -0
- package/dist/core/shopify-scripts/initialize.mjs +27 -0
- package/dist/core/shopify-scripts/initialize.mjs.map +1 -0
- package/dist/core/shopify-scripts/page-view.mjs +49 -0
- package/dist/core/shopify-scripts/page-view.mjs.map +1 -0
- package/dist/core/shopify-scripts/perfkit.mjs +33 -0
- package/dist/core/shopify-scripts/perfkit.mjs.map +1 -0
- package/dist/core/shopify-scripts/render.d.mts +1 -0
- package/dist/core/shopify-scripts/render.mjs +23 -0
- package/dist/core/shopify-scripts/render.mjs.map +1 -0
- package/dist/core/shopify-scripts/types.d.mts +76 -0
- package/dist/core/shopify-scripts/utils/cookie-domain.mjs +43 -0
- package/dist/core/shopify-scripts/utils/cookie-domain.mjs.map +1 -0
- package/dist/core/shopify-scripts/utils/inline-script.mjs +8 -0
- package/dist/core/shopify-scripts/utils/inline-script.mjs.map +1 -0
- package/dist/core/shopify-scripts/utils/navigation.mjs +46 -0
- package/dist/core/shopify-scripts/utils/navigation.mjs.map +1 -0
- package/dist/core/shopify-scripts/utils/tracking-values.mjs +65 -0
- package/dist/core/shopify-scripts/utils/tracking-values.mjs.map +1 -0
- package/dist/core/shopify-scripts/utils/uuid.mjs +17 -0
- package/dist/core/shopify-scripts/utils/uuid.mjs.map +1 -0
- package/dist/core/shopify-scripts/webmcp.mjs +22 -0
- package/dist/core/shopify-scripts/webmcp.mjs.map +1 -0
- package/dist/core/standard-routes/build.d.mts +34 -0
- package/dist/core/standard-routes/build.mjs +54 -0
- package/dist/core/standard-routes/build.mjs.map +1 -0
- package/dist/core/standard-routes/defaults.mjs +31 -0
- package/dist/core/standard-routes/defaults.mjs.map +1 -0
- package/dist/core/standard-routes/match.mjs +108 -0
- package/dist/core/standard-routes/match.mjs.map +1 -0
- package/dist/core/standard-routes/path.mjs +58 -0
- package/dist/core/standard-routes/path.mjs.map +1 -0
- package/dist/core/standard-routes/redirects.mjs +51 -0
- package/dist/core/standard-routes/redirects.mjs.map +1 -0
- package/dist/core/standard-routes/types.d.mts +95 -0
- package/dist/core/url.mjs +35 -0
- package/dist/core/url.mjs.map +1 -0
- package/dist/core/utils/load-script.mjs +34 -0
- package/dist/core/utils/load-script.mjs.map +1 -0
- package/dist/core/utils/parse-gid.mjs +33 -0
- package/dist/core/utils/parse-gid.mjs.map +1 -0
- package/dist/core/utils/record.mjs +8 -0
- package/dist/core/utils/record.mjs.map +1 -0
- package/dist/customer-account/client.d.mts +50 -0
- package/dist/customer-account/client.mjs +239 -0
- package/dist/customer-account/client.mjs.map +1 -0
- package/dist/customer-account/errors.d.mts +28 -0
- package/dist/customer-account/errors.mjs +39 -0
- package/dist/customer-account/errors.mjs.map +1 -0
- package/dist/customer-account/graphql.d.mts +29 -0
- package/dist/customer-account/graphql.mjs +39 -0
- package/dist/customer-account/graphql.mjs.map +1 -0
- package/dist/customer-account/index.d.mts +7 -0
- package/dist/customer-account/index.mjs +7 -0
- package/dist/customer-account/session.d.mts +117 -0
- package/dist/customer-account/session.mjs +733 -0
- package/dist/customer-account/session.mjs.map +1 -0
- package/dist/customer-account/type-resolver.d.mts +11 -0
- package/dist/customer-account-api-types.d.ts +3269 -3270
- package/dist/customer-account.schema.json +50753 -1
- package/dist/development/_virtual/_@oxc-project_runtime@0.127.0/helpers/taggedTemplateLiteral.mjs +7 -0
- package/dist/development/client/client.d.mts +34 -0
- package/dist/development/client/client.mjs +193 -0
- package/dist/development/client/client.mjs.map +1 -0
- package/dist/development/client/errors.d.mts +48 -0
- package/dist/development/client/errors.mjs +57 -0
- package/dist/development/client/errors.mjs.map +1 -0
- package/dist/development/client/index.d.mts +4 -0
- package/dist/development/client/types.d.mts +147 -0
- package/dist/development/core/analytics/cart-tracker.d.mts +8 -0
- package/dist/development/core/analytics/cart-tracker.mjs +144 -0
- package/dist/development/core/analytics/cart-tracker.mjs.map +1 -0
- package/dist/development/core/analytics/events.d.mts +15 -0
- package/dist/development/core/analytics/events.mjs +15 -0
- package/dist/development/core/analytics/events.mjs.map +1 -0
- package/dist/development/core/analytics/index.d.mts +3 -0
- package/dist/development/core/analytics/types.d.mts +143 -0
- package/dist/development/core/analytics/utils/flatten-connection.d.mts +19 -0
- package/dist/development/core/analytics/utils/flatten-connection.mjs +25 -0
- package/dist/development/core/analytics/utils/flatten-connection.mjs.map +1 -0
- package/dist/development/core/cache/cache-status.mjs +17 -0
- package/dist/development/core/cache/cache-status.mjs.map +1 -0
- package/dist/development/core/cache/fetch-with-cache.d.mts +43 -0
- package/dist/development/core/cache/fetch-with-cache.mjs +188 -0
- package/dist/development/core/cache/fetch-with-cache.mjs.map +1 -0
- package/dist/development/core/cache/key.d.mts +6 -0
- package/dist/development/core/cache/key.mjs +27 -0
- package/dist/development/core/cache/key.mjs.map +1 -0
- package/dist/development/core/cache/run-with-cache.d.mts +36 -0
- package/dist/development/core/cache/run-with-cache.mjs +114 -0
- package/dist/development/core/cache/run-with-cache.mjs.map +1 -0
- package/dist/development/core/cache/store.d.mts +19 -0
- package/dist/development/core/cache/store.mjs +62 -0
- package/dist/development/core/cache/store.mjs.map +1 -0
- package/dist/development/core/cache/strategies.d.mts +39 -0
- package/dist/development/core/cache/strategies.mjs +70 -0
- package/dist/development/core/cache/strategies.mjs.map +1 -0
- package/dist/development/core/cart/actions.d.mts +50 -0
- package/dist/development/core/cart/actions.mjs +240 -0
- package/dist/development/core/cart/actions.mjs.map +1 -0
- package/dist/development/core/cart/attach-quantity-input.d.mts +5 -0
- package/dist/development/core/cart/attach-quantity-input.mjs +17 -0
- package/dist/development/core/cart/attach-quantity-input.mjs.map +1 -0
- package/dist/development/core/cart/buyer-identity-sync.d.mts +19 -0
- package/dist/development/core/cart/buyer-identity-sync.mjs +6 -0
- package/dist/development/core/cart/buyer-identity-sync.mjs.map +1 -0
- package/dist/development/core/cart/cart.d.mts +32 -0
- package/dist/development/core/cart/cart.mjs +1687 -0
- package/dist/development/core/cart/cart.mjs.map +1 -0
- package/dist/development/core/cart/cookie.d.mts +5 -0
- package/dist/development/core/cart/cookie.mjs +28 -0
- package/dist/development/core/cart/cookie.mjs.map +1 -0
- package/dist/development/core/cart/form.d.mts +130 -0
- package/dist/development/core/cart/form.mjs +75 -0
- package/dist/development/core/cart/form.mjs.map +1 -0
- package/dist/development/core/cart/get-cart.d.mts +25 -0
- package/dist/development/core/cart/get-cart.mjs +32 -0
- package/dist/development/core/cart/get-cart.mjs.map +1 -0
- package/dist/development/core/cart/index.d.mts +10 -0
- package/dist/development/core/cart/quantity.d.mts +10 -0
- package/dist/development/core/cart/quantity.mjs +14 -0
- package/dist/development/core/cart/quantity.mjs.map +1 -0
- package/dist/development/core/cart/queries.d.mts +4296 -0
- package/dist/development/core/cart/queries.mjs +70 -0
- package/dist/development/core/cart/queries.mjs.map +1 -0
- package/dist/development/core/cart/server-handlers.d.mts +82 -0
- package/dist/development/core/cart/server-handlers.mjs +322 -0
- package/dist/development/core/cart/server-handlers.mjs.map +1 -0
- package/dist/development/core/cart/state.d.mts +137 -0
- package/dist/development/core/cart/state.mjs +76 -0
- package/dist/development/core/cart/state.mjs.map +1 -0
- package/dist/development/core/cart/sync-quantity-inputs.mjs +16 -0
- package/dist/development/core/cart/sync-quantity-inputs.mjs.map +1 -0
- package/dist/development/core/collection/collection.d.mts +134 -0
- package/dist/development/core/collection/collection.mjs +170 -0
- package/dist/development/core/collection/collection.mjs.map +1 -0
- package/dist/development/core/collection/index.d.mts +6 -0
- package/dist/development/core/collection/reconciler.d.mts +32 -0
- package/dist/development/core/collection/reconciler.mjs +89 -0
- package/dist/development/core/collection/reconciler.mjs.map +1 -0
- package/dist/development/core/collection/state.d.mts +66 -0
- package/dist/development/core/collection/state.mjs +20 -0
- package/dist/development/core/collection/state.mjs.map +1 -0
- package/dist/development/core/collection/url.d.mts +70 -0
- package/dist/development/core/collection/url.mjs +367 -0
- package/dist/development/core/collection/url.mjs.map +1 -0
- package/dist/development/core/constants.mjs +7 -0
- package/dist/development/core/constants.mjs.map +1 -0
- package/dist/development/core/development.d.mts +55 -0
- package/dist/development/core/development.mjs +44 -0
- package/dist/development/core/headers.mjs +44 -0
- package/dist/development/core/headers.mjs.map +1 -0
- package/dist/development/core/index.d.mts +53 -0
- package/dist/development/core/logging/logging.d.mts +21 -0
- package/dist/development/core/logging/logging.mjs +99 -0
- package/dist/development/core/logging/logging.mjs.map +1 -0
- package/dist/development/core/logging/types.d.mts +40 -0
- package/dist/development/core/logging/types.mjs +18 -0
- package/dist/development/core/logging/types.mjs.map +1 -0
- package/dist/development/core/money/cache.mjs +25 -0
- package/dist/development/core/money/cache.mjs.map +1 -0
- package/dist/development/core/money/format.d.mts +15 -0
- package/dist/development/core/money/format.mjs +243 -0
- package/dist/development/core/money/format.mjs.map +1 -0
- package/dist/development/core/money/types.d.mts +47 -0
- package/dist/development/core/observable.mjs +46 -0
- package/dist/development/core/observable.mjs.map +1 -0
- package/dist/development/core/predictive-search/constants.d.mts +5 -0
- package/dist/development/core/predictive-search/constants.mjs +6 -0
- package/dist/development/core/predictive-search/constants.mjs.map +1 -0
- package/dist/development/core/predictive-search/form.d.mts +31 -0
- package/dist/development/core/predictive-search/form.mjs +31 -0
- package/dist/development/core/predictive-search/form.mjs.map +1 -0
- package/dist/development/core/predictive-search/index.d.mts +6 -0
- package/dist/development/core/predictive-search/queries.d.mts +118 -0
- package/dist/development/core/predictive-search/queries.mjs +81 -0
- package/dist/development/core/predictive-search/queries.mjs.map +1 -0
- package/dist/development/core/predictive-search/search.d.mts +32 -0
- package/dist/development/core/predictive-search/search.mjs +74 -0
- package/dist/development/core/predictive-search/search.mjs.map +1 -0
- package/dist/development/core/predictive-search/server-handlers.d.mts +36 -0
- package/dist/development/core/predictive-search/server-handlers.mjs +113 -0
- package/dist/development/core/predictive-search/server-handlers.mjs.map +1 -0
- package/dist/development/core/predictive-search/store.d.mts +44 -0
- package/dist/development/core/predictive-search/store.mjs +224 -0
- package/dist/development/core/predictive-search/store.mjs.map +1 -0
- package/dist/development/core/predictive-search/url.d.mts +41 -0
- package/dist/development/core/predictive-search/url.mjs +71 -0
- package/dist/development/core/predictive-search/url.mjs.map +1 -0
- package/dist/development/core/product/form.d.mts +63 -0
- package/dist/development/core/product/form.mjs +44 -0
- package/dist/development/core/product/form.mjs.map +1 -0
- package/dist/development/core/product/index.d.mts +4 -0
- package/dist/development/core/product/options.d.mts +40 -0
- package/dist/development/core/product/options.mjs +291 -0
- package/dist/development/core/product/options.mjs.map +1 -0
- package/dist/development/core/product/product-form.d.mts +72 -0
- package/dist/development/core/product/product-form.mjs +158 -0
- package/dist/development/core/product/product-form.mjs.map +1 -0
- package/dist/development/core/product/state.d.mts +68 -0
- package/dist/development/core/request-context.d.mts +70 -0
- package/dist/development/core/request-context.mjs +120 -0
- package/dist/development/core/request-context.mjs.map +1 -0
- package/dist/development/core/request-routing/handle-shopify-redirects.d.mts +17 -0
- package/dist/development/core/request-routing/handle-shopify-redirects.mjs +31 -0
- package/dist/development/core/request-routing/handle-shopify-redirects.mjs.map +1 -0
- package/dist/development/core/request-routing/handle-shopify-routes.d.mts +1 -0
- package/dist/development/core/request-routing/handle-shopify-routes.development.d.mts +11 -0
- package/dist/development/core/request-routing/handle-shopify-routes.development.mjs +16 -0
- package/dist/development/core/request-routing/handle-shopify-routes.development.mjs.map +1 -0
- package/dist/development/core/request-routing/handle-shopify-routes.mjs +42 -0
- package/dist/development/core/request-routing/handle-shopify-routes.mjs.map +1 -0
- package/dist/development/core/request-routing/interceptors/admin-redirect.mjs +12 -0
- package/dist/development/core/request-routing/interceptors/admin-redirect.mjs.map +1 -0
- package/dist/development/core/request-routing/interceptors/agent-proxy.mjs +19 -0
- package/dist/development/core/request-routing/interceptors/agent-proxy.mjs.map +1 -0
- package/dist/development/core/request-routing/interceptors/ajax-api.mjs +16 -0
- package/dist/development/core/request-routing/interceptors/ajax-api.mjs.map +1 -0
- package/dist/development/core/request-routing/interceptors/api-proxy.mjs +20 -0
- package/dist/development/core/request-routing/interceptors/api-proxy.mjs.map +1 -0
- package/dist/development/core/request-routing/interceptors/checkout.mjs +58 -0
- package/dist/development/core/request-routing/interceptors/checkout.mjs.map +1 -0
- package/dist/development/core/request-routing/interceptors/graphiql.mjs +46 -0
- package/dist/development/core/request-routing/interceptors/graphiql.mjs.map +1 -0
- package/dist/development/core/request-routing/interceptors/mcp-proxy.mjs +23 -0
- package/dist/development/core/request-routing/interceptors/mcp-proxy.mjs.map +1 -0
- package/dist/development/core/request-routing/interceptors/proxy.mjs +68 -0
- package/dist/development/core/request-routing/interceptors/proxy.mjs.map +1 -0
- package/dist/development/core/request-routing/interceptors/query-param-redirect.mjs +22 -0
- package/dist/development/core/request-routing/interceptors/query-param-redirect.mjs.map +1 -0
- package/dist/development/core/request-routing/interceptors/sfapi-proxy.mjs +27 -0
- package/dist/development/core/request-routing/interceptors/sfapi-proxy.mjs.map +1 -0
- package/dist/development/core/request-routing/interceptors/standard-routes.mjs +19 -0
- package/dist/development/core/request-routing/interceptors/standard-routes.mjs.map +1 -0
- package/dist/development/core/request-routing/interceptors/url-redirects.mjs +27 -0
- package/dist/development/core/request-routing/interceptors/url-redirects.mjs.map +1 -0
- package/dist/development/core/request-routing/interceptors/well-known.mjs +19 -0
- package/dist/development/core/request-routing/interceptors/well-known.mjs.map +1 -0
- package/dist/development/core/request-routing/registered-routes.d.mts +7 -0
- package/dist/development/core/request-routing/registered-routes.mjs +59 -0
- package/dist/development/core/request-routing/registered-routes.mjs.map +1 -0
- package/dist/development/core/request-routing/route-types.d.mts +51 -0
- package/dist/development/core/request-routing/safe-apply-response-headers.mjs +16 -0
- package/dist/development/core/request-routing/safe-apply-response-headers.mjs.map +1 -0
- package/dist/development/core/shop-pay/shop-pay.d.mts +102 -0
- package/dist/development/core/shop-pay/shop-pay.mjs +289 -0
- package/dist/development/core/shop-pay/shop-pay.mjs.map +1 -0
- package/dist/development/core/shopify-scripts/analytics.mjs +26 -0
- package/dist/development/core/shopify-scripts/analytics.mjs.map +1 -0
- package/dist/development/core/shopify-scripts/consent.mjs +17 -0
- package/dist/development/core/shopify-scripts/consent.mjs.map +1 -0
- package/dist/development/core/shopify-scripts/constants.mjs +19 -0
- package/dist/development/core/shopify-scripts/constants.mjs.map +1 -0
- package/dist/development/core/shopify-scripts/deprecated-cookies.mjs +97 -0
- package/dist/development/core/shopify-scripts/deprecated-cookies.mjs.map +1 -0
- package/dist/development/core/shopify-scripts/global.d.mts +1 -0
- package/dist/development/core/shopify-scripts/global.mjs +86 -0
- package/dist/development/core/shopify-scripts/global.mjs.map +1 -0
- package/dist/development/core/shopify-scripts/index.d.mts +27 -0
- package/dist/development/core/shopify-scripts/index.mjs +145 -0
- package/dist/development/core/shopify-scripts/index.mjs.map +1 -0
- package/dist/development/core/shopify-scripts/initialize.d.mts +18 -0
- package/dist/development/core/shopify-scripts/initialize.mjs +27 -0
- package/dist/development/core/shopify-scripts/initialize.mjs.map +1 -0
- package/dist/development/core/shopify-scripts/page-view.mjs +49 -0
- package/dist/development/core/shopify-scripts/page-view.mjs.map +1 -0
- package/dist/development/core/shopify-scripts/perfkit.mjs +33 -0
- package/dist/development/core/shopify-scripts/perfkit.mjs.map +1 -0
- package/dist/development/core/shopify-scripts/render.d.mts +1 -0
- package/dist/development/core/shopify-scripts/render.mjs +23 -0
- package/dist/development/core/shopify-scripts/render.mjs.map +1 -0
- package/dist/development/core/shopify-scripts/types.d.mts +76 -0
- package/dist/development/core/shopify-scripts/utils/cookie-domain.mjs +43 -0
- package/dist/development/core/shopify-scripts/utils/cookie-domain.mjs.map +1 -0
- package/dist/development/core/shopify-scripts/utils/inline-script.mjs +8 -0
- package/dist/development/core/shopify-scripts/utils/inline-script.mjs.map +1 -0
- package/dist/development/core/shopify-scripts/utils/navigation.mjs +46 -0
- package/dist/development/core/shopify-scripts/utils/navigation.mjs.map +1 -0
- package/dist/development/core/shopify-scripts/utils/tracking-values.mjs +65 -0
- package/dist/development/core/shopify-scripts/utils/tracking-values.mjs.map +1 -0
- package/dist/development/core/shopify-scripts/utils/uuid.mjs +17 -0
- package/dist/development/core/shopify-scripts/utils/uuid.mjs.map +1 -0
- package/dist/development/core/shopify-scripts/webmcp.mjs +22 -0
- package/dist/development/core/shopify-scripts/webmcp.mjs.map +1 -0
- package/dist/development/core/standard-routes/build.d.mts +34 -0
- package/dist/development/core/standard-routes/build.mjs +54 -0
- package/dist/development/core/standard-routes/build.mjs.map +1 -0
- package/dist/development/core/standard-routes/defaults.mjs +31 -0
- package/dist/development/core/standard-routes/defaults.mjs.map +1 -0
- package/dist/development/core/standard-routes/match.mjs +108 -0
- package/dist/development/core/standard-routes/match.mjs.map +1 -0
- package/dist/development/core/standard-routes/path.mjs +58 -0
- package/dist/development/core/standard-routes/path.mjs.map +1 -0
- package/dist/development/core/standard-routes/redirects.mjs +51 -0
- package/dist/development/core/standard-routes/redirects.mjs.map +1 -0
- package/dist/development/core/standard-routes/types.d.mts +95 -0
- package/dist/development/core/types.d.mts +11 -0
- package/dist/development/core/url.mjs +35 -0
- package/dist/development/core/url.mjs.map +1 -0
- package/dist/development/core/utils/load-script.mjs +34 -0
- package/dist/development/core/utils/load-script.mjs.map +1 -0
- package/dist/development/core/utils/parse-gid.mjs +33 -0
- package/dist/development/core/utils/parse-gid.mjs.map +1 -0
- package/dist/development/customer-account/session.d.mts +46 -0
- package/dist/development/customer-account/session.mjs +21 -0
- package/dist/development/customer-account/session.mjs.map +1 -0
- package/dist/development/globals.d.mts +64 -0
- package/dist/development/graphql/generated/customer-account-api-types.d.mts +13 -0
- package/dist/development/graphql/generated/graphql-env.d.mts +19280 -0
- package/dist/development/graphql/generated/storefront-api-types.d.mts +47 -0
- package/dist/development/graphql/graphql.d.mts +40 -0
- package/dist/development/graphql/graphql.mjs +16 -0
- package/dist/development/graphql/graphql.mjs.map +1 -0
- package/dist/development/graphql/index.d.mts +2 -0
- package/dist/development/graphql/scalars.d.mts +15 -0
- package/dist/development/graphql/type-resolver.d.mts +229 -0
- package/dist/development/react/cart.d.mts +40 -0
- package/dist/development/react/cart.mjs +150 -0
- package/dist/development/react/cart.mjs.map +1 -0
- package/dist/development/react/collection.d.mts +91 -0
- package/dist/development/react/collection.mjs +129 -0
- package/dist/development/react/collection.mjs.map +1 -0
- package/dist/development/react/index.d.mts +13 -0
- package/dist/development/react/index.mjs +10 -0
- package/dist/development/react/predictive-search.d.mts +49 -0
- package/dist/development/react/predictive-search.mjs +133 -0
- package/dist/development/react/predictive-search.mjs.map +1 -0
- package/dist/development/react/product.d.mts +72 -0
- package/dist/development/react/product.mjs +127 -0
- package/dist/development/react/product.mjs.map +1 -0
- package/dist/development/react/shop-pay.d.mts +9 -0
- package/dist/development/react/shop-pay.mjs +16 -0
- package/dist/development/react/shop-pay.mjs.map +1 -0
- package/dist/development/react/shopify-scripts.d.mts +20 -0
- package/dist/development/react/shopify-scripts.mjs +39 -0
- package/dist/development/react/shopify-scripts.mjs.map +1 -0
- package/dist/development/vendor/standard-actions.d.mts +134 -0
- package/dist/development/vendor/standard-events.d.mts +1107 -0
- package/dist/development/vue/cart.d.mts +42 -0
- package/dist/development/vue/cart.mjs +118 -0
- package/dist/development/vue/cart.mjs.map +1 -0
- package/dist/development/vue/collection.d.mts +46 -0
- package/dist/development/vue/collection.mjs +108 -0
- package/dist/development/vue/collection.mjs.map +1 -0
- package/dist/development/vue/index.d.mts +11 -0
- package/dist/development/vue/index.mjs +8 -0
- package/dist/development/vue/predictive-search.d.mts +124 -0
- package/dist/development/vue/predictive-search.mjs +171 -0
- package/dist/development/vue/predictive-search.mjs.map +1 -0
- package/dist/development/vue/product.d.mts +57 -0
- package/dist/development/vue/product.mjs +167 -0
- package/dist/development/vue/product.mjs.map +1 -0
- package/dist/development/vue/shop-pay.d.mts +25 -0
- package/dist/development/vue/shop-pay.mjs +35 -0
- package/dist/development/vue/shop-pay.mjs.map +1 -0
- package/dist/development/vue/shopify-scripts.d.mts +127 -0
- package/dist/development/vue/shopify-scripts.mjs +79 -0
- package/dist/development/vue/shopify-scripts.mjs.map +1 -0
- package/dist/globals.d.mts +64 -0
- package/dist/graphql/generated/customer-account-api-types.d.mts +13 -0
- package/dist/graphql/generated/customer-account-graphql-env.d.mts +22170 -0
- package/dist/graphql/generated/graphql-env.d.mts +19280 -0
- package/dist/graphql/generated/storefront-api-types.d.mts +47 -0
- package/dist/graphql/graphql.d.mts +40 -0
- package/dist/graphql/graphql.mjs +16 -0
- package/dist/graphql/graphql.mjs.map +1 -0
- package/dist/graphql/index.d.mts +2 -0
- package/dist/graphql/scalars.d.mts +26 -0
- package/dist/graphql/type-resolver.d.mts +229 -0
- package/dist/react/cart.d.mts +40 -0
- package/dist/react/cart.mjs +150 -0
- package/dist/react/cart.mjs.map +1 -0
- package/dist/react/collection.d.mts +91 -0
- package/dist/react/collection.mjs +129 -0
- package/dist/react/collection.mjs.map +1 -0
- package/dist/react/index.d.mts +13 -0
- package/dist/react/index.mjs +10 -0
- package/dist/react/predictive-search.d.mts +49 -0
- package/dist/react/predictive-search.mjs +133 -0
- package/dist/react/predictive-search.mjs.map +1 -0
- package/dist/react/product.d.mts +72 -0
- package/dist/react/product.mjs +127 -0
- package/dist/react/product.mjs.map +1 -0
- package/dist/react/shop-pay.d.mts +9 -0
- package/dist/react/shop-pay.mjs +16 -0
- package/dist/react/shop-pay.mjs.map +1 -0
- package/dist/react/shopify-scripts.d.mts +20 -0
- package/dist/react/shopify-scripts.mjs +39 -0
- package/dist/react/shopify-scripts.mjs.map +1 -0
- package/dist/storefront-api-types.d.ts +2351 -2390
- package/dist/storefront.schema.json +41534 -1
- package/dist/ts-plugin/index.cjs +68 -0
- package/dist/ts-plugin/index.cjs.map +1 -0
- package/dist/ts-plugin/index.d.cts +4 -0
- package/dist/vendor/standard-actions.d.mts +134 -0
- package/dist/vendor/standard-events.d.mts +1107 -0
- package/dist/vite/index.d.mts +2 -0
- package/dist/vite/index.mjs +3 -0
- package/dist/vite/local-https.d.mts +35 -0
- package/dist/vite/local-https.mjs +202 -0
- package/dist/vite/local-https.mjs.map +1 -0
- package/dist/vue/cart.d.mts +42 -0
- package/dist/vue/cart.mjs +118 -0
- package/dist/vue/cart.mjs.map +1 -0
- package/dist/vue/collection.d.mts +46 -0
- package/dist/vue/collection.mjs +108 -0
- package/dist/vue/collection.mjs.map +1 -0
- package/dist/vue/index.d.mts +11 -0
- package/dist/vue/index.mjs +8 -0
- package/dist/vue/predictive-search.d.mts +124 -0
- package/dist/vue/predictive-search.mjs +171 -0
- package/dist/vue/predictive-search.mjs.map +1 -0
- package/dist/vue/product.d.mts +57 -0
- package/dist/vue/product.mjs +167 -0
- package/dist/vue/product.mjs.map +1 -0
- package/dist/vue/shop-pay.d.mts +25 -0
- package/dist/vue/shop-pay.mjs +35 -0
- package/dist/vue/shop-pay.mjs.map +1 -0
- package/dist/vue/shopify-scripts.d.mts +127 -0
- package/dist/vue/shopify-scripts.mjs +79 -0
- package/dist/vue/shopify-scripts.mjs.map +1 -0
- package/package.json +116 -86
- package/skills/hydrogen-analytics/SKILL.md +80 -0
- package/skills/hydrogen-analytics/references/react.md +160 -0
- package/skills/hydrogen-analytics/references/vue.md +80 -0
- package/skills/hydrogen-cart-drawer/SKILL.md +248 -0
- package/skills/hydrogen-cart-drawer/references/accessibility.md +109 -0
- package/skills/hydrogen-cart-drawer/references/css.md +67 -0
- package/skills/hydrogen-cart-ui/SKILL.md +218 -0
- package/skills/hydrogen-cart-ui/references/nextjs.md +89 -0
- package/skills/hydrogen-cart-ui/references/react.md +263 -0
- package/skills/hydrogen-cart-ui/references/vue.md +204 -0
- package/skills/hydrogen-collection-browser/SKILL.md +80 -0
- package/skills/hydrogen-collection-browser/references/nextjs.md +118 -0
- package/skills/hydrogen-collection-browser/references/nuxt.md +108 -0
- package/skills/hydrogen-collection-browser/references/react.md +237 -0
- package/skills/hydrogen-customer-account/SKILL.md +107 -0
- package/skills/hydrogen-image/SKILL.md +65 -0
- package/skills/hydrogen-local-https/SKILL.md +144 -0
- package/skills/hydrogen-markets/SKILL.md +221 -0
- package/skills/hydrogen-markets/references/nextjs.md +157 -0
- package/skills/hydrogen-money/SKILL.md +67 -0
- package/skills/hydrogen-oxygen/SKILL.md +245 -0
- package/skills/hydrogen-oxygen/references/react-router.md +230 -0
- package/skills/hydrogen-predictive-search/SKILL.md +130 -0
- package/skills/hydrogen-predictive-search/references/react.md +32 -0
- package/skills/hydrogen-predictive-search/references/vue.md +40 -0
- package/skills/hydrogen-request-handlers/SKILL.md +90 -0
- package/skills/hydrogen-request-handlers/references/frameworks.md +174 -0
- package/skills/hydrogen-request-handlers/references/nextjs.md +136 -0
- package/skills/hydrogen-request-handlers/references/nuxt.md +214 -0
- package/skills/hydrogen-routing/SKILL.md +154 -0
- package/skills/hydrogen-setup/SKILL.md +50 -0
- package/skills/hydrogen-setup/references/analytics.md +624 -0
- package/skills/hydrogen-setup/steps/1-inspect-app.md +62 -0
- package/skills/hydrogen-setup/steps/10-analytics.md +10 -0
- package/skills/hydrogen-setup/steps/11-verify.md +31 -0
- package/skills/hydrogen-setup/steps/2-scaffold.md +86 -0
- package/skills/hydrogen-setup/steps/3-build-home-page.md +37 -0
- package/skills/hydrogen-setup/steps/4-collection-and-search.md +13 -0
- package/skills/hydrogen-setup/steps/5-cart.md +10 -0
- package/skills/hydrogen-setup/steps/6-product-detail-page.md +390 -0
- package/skills/hydrogen-setup/steps/7-shopify-runtime-scripts.md +69 -0
- package/skills/hydrogen-setup/steps/8-cart-drawer-and-navbar.md +35 -0
- package/skills/hydrogen-setup/steps/9-account-page.md +54 -0
- package/skills/hydrogen-shop-pay/SKILL.md +79 -0
- package/skills/hydrogen-shop-pay/references/core.md +66 -0
- package/skills/hydrogen-shop-pay/references/react.md +50 -0
- package/skills/hydrogen-shop-pay/references/vue.md +39 -0
- package/skills/hydrogen-smoke-test/SKILL.md +203 -0
- package/skills/hydrogen-storefront-client/SKILL.md +322 -0
- package/skills/hydrogen-storefront-client/references/astro.md +125 -0
- package/skills/hydrogen-storefront-client/references/caching.md +25 -0
- package/skills/hydrogen-storefront-client/references/nextjs.md +121 -0
- package/skills/hydrogen-storefront-client/references/nuxt.md +121 -0
- package/skills/hydrogen-storefront-client/references/query-validation.md +95 -0
- package/skills/hydrogen-storefront-client/references/react-router.md +81 -0
- package/skills/hydrogen-storefront-client/references/solidstart.md +131 -0
- package/skills/hydrogen-storefront-client/references/sveltekit.md +169 -0
- package/skills/hydrogen-variant-form/SKILL.md +250 -0
- package/skills/hydrogen-variant-form/references/nextjs.md +203 -0
- package/skills/hydrogen-variant-form/references/nuxt.md +95 -0
- package/skills/hydrogen-variant-form/references/react.md +71 -0
- package/dist/dev/get-virtual-routes-H72465VB.js +0 -74
- package/dist/dev/hydrogen-routes.d.ts +0 -5
- package/dist/dev/hydrogen-routes.js +0 -25
- package/dist/development/get-virtual-routes-ACFZHU42.js +0 -71
- package/dist/development/get-virtual-routes-ACFZHU42.js.map +0 -1
- package/dist/development/index.cjs +0 -6948
- package/dist/development/index.cjs.map +0 -1
- package/dist/development/index.js +0 -6601
- package/dist/development/index.js.map +0 -1
- package/dist/development/log-seo-tags-IG37ONQ2.js +0 -74
- package/dist/development/log-seo-tags-IG37ONQ2.js.map +0 -1
- package/dist/development/react-router-preset.d.ts +0 -45
- package/dist/development/react-router-preset.js +0 -49
- package/dist/development/react-router-preset.js.map +0 -1
- package/dist/index.cjs +0 -1
- package/dist/oxygen/index.d.ts +0 -197
- package/dist/oxygen/index.js +0 -107
- package/dist/production/get-virtual-routes-ZZEGQQDV.js +0 -3
- package/dist/production/get-virtual-routes-ZZEGQQDV.js.map +0 -1
- package/dist/production/index.cjs +0 -1019
- package/dist/production/index.cjs.map +0 -1
- package/dist/production/index.d.cts +0 -3260
- package/dist/production/index.d.ts +0 -3260
- package/dist/production/index.js +0 -1019
- package/dist/production/index.js.map +0 -1
- package/dist/production/log-seo-tags-TY72EQWZ.js +0 -2
- package/dist/production/log-seo-tags-TY72EQWZ.js.map +0 -1
- package/dist/production/react-router-preset.d.ts +0 -45
- package/dist/production/react-router-preset.js +0 -11
- package/dist/react-router.d.ts +0 -75
- package/dist/vite/chunk-4O5OI3OO.js +0 -127
- package/dist/vite/chunk-FAQ7TVHC.js +0 -9
- package/dist/vite/chunk-QXBQVDMY.js +0 -68
- package/dist/vite/compat-date.d.ts +0 -3
- package/dist/vite/compat-date.js +0 -6
- package/dist/vite/get-virtual-routes.d.ts +0 -21
- package/dist/vite/get-virtual-routes.js +0 -74
- package/dist/vite/hydrogen-middleware.d.ts +0 -9
- package/dist/vite/hydrogen-middleware.js +0 -7
- package/dist/vite/plugin.d.ts +0 -22
- package/dist/vite/plugin.js +0 -171
- package/dist/vite/request-events.d.ts +0 -144
- package/dist/vite/request-events.js +0 -10
- package/dist/vite/types.d.ts +0 -5
- package/dist/vite/types.js +0 -0
- package/dist/vite/virtual-routes/assets/debug-network.css +0 -609
- package/dist/vite/virtual-routes/assets/favicon-dark.svg +0 -20
- package/dist/vite/virtual-routes/assets/favicon.svg +0 -28
- package/dist/vite/virtual-routes/assets/inter-variable-font.woff2 +0 -0
- package/dist/vite/virtual-routes/assets/jetbrainsmono-variable-font.woff2 +0 -0
- package/dist/vite/virtual-routes/assets/styles.css +0 -249
- package/dist/vite/virtual-routes/components/FlameChartWrapper.jsx +0 -123
- package/dist/vite/virtual-routes/components/HydrogenLogoBaseBW.jsx +0 -32
- package/dist/vite/virtual-routes/components/HydrogenLogoBaseColor.jsx +0 -47
- package/dist/vite/virtual-routes/components/IconBanner.jsx +0 -292
- package/dist/vite/virtual-routes/components/IconClose.jsx +0 -38
- package/dist/vite/virtual-routes/components/IconDiscard.jsx +0 -44
- package/dist/vite/virtual-routes/components/IconError.jsx +0 -61
- package/dist/vite/virtual-routes/components/IconGithub.jsx +0 -23
- package/dist/vite/virtual-routes/components/IconTwitter.jsx +0 -21
- package/dist/vite/virtual-routes/components/Layout.jsx +0 -7
- package/dist/vite/virtual-routes/components/RequestDetails.jsx +0 -171
- package/dist/vite/virtual-routes/components/RequestTable.jsx +0 -91
- package/dist/vite/virtual-routes/components/RequestWaterfall.jsx +0 -151
- package/dist/vite/virtual-routes/layout.jsx +0 -33
- package/dist/vite/virtual-routes/lib/useDebugNetworkServer.jsx +0 -178
- package/dist/vite/virtual-routes/routes/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.jsx +0 -37
- package/dist/vite/virtual-routes/routes/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.tsx +0 -79
- package/dist/vite/virtual-routes/routes/graphiql.jsx +0 -5
- package/dist/vite/virtual-routes/routes/index.jsx +0 -265
- package/dist/vite/virtual-routes/routes/subrequest-profiler.jsx +0 -243
- package/dist/vite/virtual-routes/virtual-root-with-layout.jsx +0 -63
- package/dist/vite/virtual-routes/virtual-root.jsx +0 -67
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
//#region src/core/product/state.d.ts
|
|
2
|
+
interface Money {
|
|
3
|
+
amount: string;
|
|
4
|
+
currencyCode: string;
|
|
5
|
+
}
|
|
6
|
+
interface ProductPriceRange {
|
|
7
|
+
minVariantPrice: Money;
|
|
8
|
+
maxVariantPrice?: Money;
|
|
9
|
+
}
|
|
10
|
+
interface SelectedOption {
|
|
11
|
+
name: string;
|
|
12
|
+
value: string;
|
|
13
|
+
}
|
|
14
|
+
interface ProductVariantInput {
|
|
15
|
+
id: string;
|
|
16
|
+
title: string;
|
|
17
|
+
availableForSale: boolean;
|
|
18
|
+
selectedOptions: SelectedOption[];
|
|
19
|
+
price: Money;
|
|
20
|
+
compareAtPrice?: Money | null;
|
|
21
|
+
image?: unknown;
|
|
22
|
+
product?: {
|
|
23
|
+
handle: string;
|
|
24
|
+
title?: string | null;
|
|
25
|
+
} | null;
|
|
26
|
+
sku?: string | null;
|
|
27
|
+
}
|
|
28
|
+
interface ProductOptionInput<TVariant extends ProductVariantInput = ProductVariantInput> {
|
|
29
|
+
name: string;
|
|
30
|
+
optionValues: Array<ProductOptionValueInput<TVariant>>;
|
|
31
|
+
}
|
|
32
|
+
interface ProductOptionValueInput<TVariant extends ProductVariantInput = ProductVariantInput> {
|
|
33
|
+
name: string;
|
|
34
|
+
firstSelectableVariant?: TVariant | null;
|
|
35
|
+
swatch?: unknown;
|
|
36
|
+
}
|
|
37
|
+
interface ProductInput<TVariant extends ProductVariantInput = ProductVariantInput> {
|
|
38
|
+
id: string;
|
|
39
|
+
title: string;
|
|
40
|
+
handle: string;
|
|
41
|
+
vendor?: string | null;
|
|
42
|
+
priceRange?: ProductPriceRange;
|
|
43
|
+
requiresSellingPlan?: boolean | null;
|
|
44
|
+
encodedVariantExistence?: string | null;
|
|
45
|
+
encodedVariantAvailability?: string | null;
|
|
46
|
+
options: ProductOptionInput<TVariant>[];
|
|
47
|
+
selectedOrFirstAvailableVariant: TVariant | null;
|
|
48
|
+
adjacentVariants: TVariant[];
|
|
49
|
+
}
|
|
50
|
+
type ProductVariantFrom<TProduct extends ProductInput> = TProduct extends ProductInput<infer TVariant> ? TVariant : ProductVariantInput;
|
|
51
|
+
type ProductOptionValueFrom<TProduct extends ProductInput> = TProduct["options"][number]["optionValues"][number];
|
|
52
|
+
interface VariantOptionValueState<TVariant extends ProductVariantInput = ProductVariantInput, TOptionValue extends ProductOptionValueInput = ProductOptionValueInput> {
|
|
53
|
+
name: string;
|
|
54
|
+
swatch?: TOptionValue["swatch"];
|
|
55
|
+
selected: boolean;
|
|
56
|
+
exists: boolean;
|
|
57
|
+
available: boolean;
|
|
58
|
+
variant: TVariant | null;
|
|
59
|
+
selectedOptions: SelectedOption[];
|
|
60
|
+
handle: string;
|
|
61
|
+
}
|
|
62
|
+
interface VariantOptionState<TVariant extends ProductVariantInput = ProductVariantInput, TOptionValue extends ProductOptionValueInput = ProductOptionValueInput> {
|
|
63
|
+
name: string;
|
|
64
|
+
values: VariantOptionValueState<TVariant, TOptionValue>[];
|
|
65
|
+
}
|
|
66
|
+
//#endregion
|
|
67
|
+
export { ProductInput, ProductOptionInput, ProductOptionValueFrom, ProductOptionValueInput, ProductVariantFrom, ProductVariantInput, SelectedOption, VariantOptionState, VariantOptionValueState };
|
|
68
|
+
//# sourceMappingURL=state.d.mts.map
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { CountryCode, LanguageCode } from "../graphql/generated/customer-account-api-types.mjs";
|
|
2
|
+
import { CountryCode as CountryCode$1, LanguageCode as LanguageCode$1 } from "../graphql/generated/storefront-api-types.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/core/request-context.d.ts
|
|
5
|
+
type StorefrontRequest = Pick<Request, "headers"> & Partial<Pick<Request, "method" | "signal" | "url">>;
|
|
6
|
+
type ShopifyLanguageCode = Extract<LanguageCode$1, LanguageCode>;
|
|
7
|
+
type ShopifyCountryCode = Extract<CountryCode$1, CountryCode>;
|
|
8
|
+
type I18nConfig = {
|
|
9
|
+
language: ShopifyLanguageCode;
|
|
10
|
+
country: ShopifyCountryCode; /** Optional app route prefix for localized paths, for example "/es-es". */
|
|
11
|
+
pathPrefix?: string;
|
|
12
|
+
};
|
|
13
|
+
type NormalizedI18nConfig<I18n extends I18nConfig = I18nConfig> = Omit<I18n, "pathPrefix"> & {
|
|
14
|
+
pathPrefix: string;
|
|
15
|
+
};
|
|
16
|
+
type ShopifyRequestContextInputBase<I18n extends I18nConfig = I18nConfig> = {
|
|
17
|
+
request: StorefrontRequest;
|
|
18
|
+
i18n: I18n;
|
|
19
|
+
};
|
|
20
|
+
type ShopifyRequestContextInput<I18n extends I18nConfig = I18nConfig> = ShopifyRequestContextInputBase<I18n> & {
|
|
21
|
+
buyerIp?: never;
|
|
22
|
+
};
|
|
23
|
+
type ShopifyRequestContextWithBuyerIpInput<I18n extends I18nConfig = I18nConfig> = ShopifyRequestContextInputBase<I18n> & {
|
|
24
|
+
buyerIp: string;
|
|
25
|
+
};
|
|
26
|
+
type ShopifyRequestContextBase = {
|
|
27
|
+
/**
|
|
28
|
+
* Compile-time brand so callers use createShopifyRequestContext().
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
readonly __hydrogenShopifyRequestContextBrand: never; /** @internal */
|
|
32
|
+
cookie?: string; /** @internal */
|
|
33
|
+
uniqueToken?: string; /** @internal */
|
|
34
|
+
visitToken?: string; /** @internal */
|
|
35
|
+
legacyTokens?: boolean; /** @internal */
|
|
36
|
+
readonly buyerIp?: string; /** @internal */
|
|
37
|
+
requestGroupId: string; /** @internal */
|
|
38
|
+
signal?: AbortSignal; /** @internal */
|
|
39
|
+
url?: string; /** @internal */
|
|
40
|
+
storefrontOrigin?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Apply request-scoped headers required by every Shopify storefront subrequest.
|
|
43
|
+
* @internal
|
|
44
|
+
*/
|
|
45
|
+
applyStorefrontRequestHeaders(headers: Headers): void;
|
|
46
|
+
/**
|
|
47
|
+
* Capture the first fresh SFAPI response headers for replay onto the final app response.
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
captureSubrequestHeaders(headers: Headers): void;
|
|
51
|
+
/**
|
|
52
|
+
* Mark the final app response as influenced by private customer state.
|
|
53
|
+
* @internal
|
|
54
|
+
*/
|
|
55
|
+
markResponseAsPersonalized(reason: string): void;
|
|
56
|
+
i18n: NormalizedI18nConfig; /** Return incoming request headers plus request lifecycle headers for proxy/origin handoff. */
|
|
57
|
+
getForwardedRequestHeaders(): Headers; /** Apply important response headers for the correct functioning of Hydrogen storefronts. */
|
|
58
|
+
applyResponseHeaders(headers: Headers): void;
|
|
59
|
+
};
|
|
60
|
+
type ShopifyRequestContext<I18n extends I18nConfig = I18nConfig> = ShopifyRequestContextBase & {
|
|
61
|
+
i18n: NormalizedI18nConfig<I18n>;
|
|
62
|
+
};
|
|
63
|
+
type ShopifyRequestContextWithBuyerIp<I18n extends I18nConfig = I18nConfig> = ShopifyRequestContext<I18n> & {
|
|
64
|
+
readonly buyerIp: string;
|
|
65
|
+
};
|
|
66
|
+
declare function createShopifyRequestContext<const I18n extends I18nConfig>(input: ShopifyRequestContextWithBuyerIpInput<I18n>): ShopifyRequestContextWithBuyerIp<I18n>;
|
|
67
|
+
declare function createShopifyRequestContext<const I18n extends I18nConfig>(input: ShopifyRequestContextInput<I18n>): ShopifyRequestContext<I18n>;
|
|
68
|
+
//#endregion
|
|
69
|
+
export { I18nConfig, ShopifyRequestContext, ShopifyRequestContextWithBuyerIp, createShopifyRequestContext };
|
|
70
|
+
//# sourceMappingURL=request-context.d.mts.map
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { normalizePathPrefix } from "./standard-routes/path.mjs";
|
|
2
|
+
import { HYDROGEN_VERSION_HEADER, REQUEST_GROUP_ID_HEADER, SDK_VARIANT_HEADER, SDK_VARIANT_SOURCE_HEADER, SDK_VERSION_HEADER, SERVER_TIMING_HEADER, SHOPIFY_STOREFRONT_ORIGIN_HEADER, SHOPIFY_STOREFRONT_S_HEADER, SHOPIFY_STOREFRONT_Y_HEADER, SHOPIFY_UNIQUE_TOKEN_HEADER, SHOPIFY_VISIT_TOKEN_HEADER, STOREFRONT_URL_HEADER, applyPrivateResponseCacheHeaders } from "./headers.mjs";
|
|
3
|
+
import { STOREFRONT_API_VERSION } from "./constants.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/core/request-context.ts
|
|
6
|
+
const UNIQUE_TOKEN_MARKER = "_y";
|
|
7
|
+
const VISIT_TOKEN_MARKER = "_s";
|
|
8
|
+
function createShopifyRequestContext(input) {
|
|
9
|
+
const { request } = input;
|
|
10
|
+
if (!input.i18n?.country || !input.i18n?.language) throw new Error("i18n with country and language is required for Shopify request contexts.");
|
|
11
|
+
if (input.buyerIp !== void 0 && !input.buyerIp) throw new Error("buyerIp must be non-empty when provided");
|
|
12
|
+
const i18n = normalizeI18n(input.i18n);
|
|
13
|
+
const cookie = request.headers.get("cookie") || void 0;
|
|
14
|
+
const url = request.url ?? request.headers.get("x-storefront-url") ?? void 0;
|
|
15
|
+
const storefrontOrigin = getUrlOrigin(url);
|
|
16
|
+
const context = {
|
|
17
|
+
...cookie && { cookie },
|
|
18
|
+
i18n,
|
|
19
|
+
...url && { url },
|
|
20
|
+
...storefrontOrigin && { storefrontOrigin },
|
|
21
|
+
...input.buyerIp && { buyerIp: input.buyerIp },
|
|
22
|
+
requestGroupId: request.headers.get("Custom-Storefront-Request-Group-ID") ?? request.headers.get("x-request-id") ?? request.headers.get("request-id") ?? crypto.randomUUID(),
|
|
23
|
+
...isDocumentRequest(request) && { documentRequest: true },
|
|
24
|
+
...request.signal && { signal: request.signal }
|
|
25
|
+
};
|
|
26
|
+
let capturedSubrequestHeaders;
|
|
27
|
+
let personalizedResponseReason;
|
|
28
|
+
if (!cookie || !/\b_shopify_(analytics|marketing)=/.test(cookie)) {
|
|
29
|
+
const legacyUniqueToken = cookie?.match(/\b_shopify_y=([^;]+)/)?.[1];
|
|
30
|
+
const legacyVisitToken = cookie?.match(/\b_shopify_s=([^;]+)/)?.[1];
|
|
31
|
+
const headerUniqueToken = request.headers.get("X-Shopify-UniqueToken") ?? void 0;
|
|
32
|
+
const headerVisitToken = request.headers.get("X-Shopify-VisitToken") ?? void 0;
|
|
33
|
+
if (legacyUniqueToken || legacyVisitToken) context.legacyTokens = true;
|
|
34
|
+
context.uniqueToken = legacyUniqueToken ?? headerUniqueToken ?? crypto.randomUUID();
|
|
35
|
+
context.visitToken = legacyVisitToken ?? headerVisitToken ?? crypto.randomUUID();
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
...context,
|
|
39
|
+
getForwardedRequestHeaders() {
|
|
40
|
+
const headers = new Headers(request.headers);
|
|
41
|
+
applyStorefrontRequestHeaders(context, headers);
|
|
42
|
+
if (context.url) headers.set(STOREFRONT_URL_HEADER, context.url);
|
|
43
|
+
return headers;
|
|
44
|
+
},
|
|
45
|
+
applyStorefrontRequestHeaders(headers) {
|
|
46
|
+
applyStorefrontRequestHeaders(context, headers);
|
|
47
|
+
},
|
|
48
|
+
captureSubrequestHeaders(headers) {
|
|
49
|
+
capturedSubrequestHeaders ??= {
|
|
50
|
+
serverTiming: headers.get("Server-Timing") ?? "",
|
|
51
|
+
setCookie: headers.getSetCookie()
|
|
52
|
+
};
|
|
53
|
+
},
|
|
54
|
+
markResponseAsPersonalized(reason) {
|
|
55
|
+
personalizedResponseReason ??= reason;
|
|
56
|
+
},
|
|
57
|
+
applyResponseHeaders(headers) {
|
|
58
|
+
headers.set("powered-by", "Shopify, Hydrogen");
|
|
59
|
+
if (capturedSubrequestHeaders) {
|
|
60
|
+
const existingSetCookies = headers.getSetCookie();
|
|
61
|
+
for (const value of capturedSubrequestHeaders.setCookie) {
|
|
62
|
+
if (existingSetCookies.includes(value)) continue;
|
|
63
|
+
headers.append("set-cookie", value);
|
|
64
|
+
}
|
|
65
|
+
const existingServerTiming = headers.get("Server-Timing") ?? "";
|
|
66
|
+
if (capturedSubrequestHeaders.serverTiming && !hasServerTimingValue(existingServerTiming, capturedSubrequestHeaders.serverTiming)) headers.append(SERVER_TIMING_HEADER, capturedSubrequestHeaders.serverTiming);
|
|
67
|
+
}
|
|
68
|
+
if (personalizedResponseReason) applyPrivateResponseCacheHeaders(headers);
|
|
69
|
+
if (!(headers.get("content-type")?.startsWith("text/html") ?? false) && !context.documentRequest) return;
|
|
70
|
+
const existing = headers.get("Server-Timing") ?? "";
|
|
71
|
+
if (context.uniqueToken && !hasServerTimingMetric(existing, UNIQUE_TOKEN_MARKER)) headers.append(SERVER_TIMING_HEADER, `${UNIQUE_TOKEN_MARKER};desc=${context.uniqueToken}`);
|
|
72
|
+
if (context.visitToken && !hasServerTimingMetric(existing, VISIT_TOKEN_MARKER)) headers.append(SERVER_TIMING_HEADER, `${VISIT_TOKEN_MARKER};desc=${context.visitToken}`);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function normalizeI18n(i18n) {
|
|
77
|
+
return {
|
|
78
|
+
...i18n,
|
|
79
|
+
pathPrefix: normalizePathPrefix(i18n.pathPrefix)
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function applyStorefrontRequestHeaders(context, headers) {
|
|
83
|
+
headers.set(SDK_VARIANT_HEADER, "hydrogen");
|
|
84
|
+
headers.set(SDK_VARIANT_SOURCE_HEADER, "kit");
|
|
85
|
+
headers.set(SDK_VERSION_HEADER, STOREFRONT_API_VERSION);
|
|
86
|
+
headers.set(HYDROGEN_VERSION_HEADER, "2026.10.0-preview.1");
|
|
87
|
+
headers.set(REQUEST_GROUP_ID_HEADER, context.requestGroupId);
|
|
88
|
+
if (context.cookie) headers.set("cookie", context.cookie);
|
|
89
|
+
else headers.delete("cookie");
|
|
90
|
+
if (context.storefrontOrigin) headers.set(SHOPIFY_STOREFRONT_ORIGIN_HEADER, context.storefrontOrigin);
|
|
91
|
+
else headers.delete(SHOPIFY_STOREFRONT_ORIGIN_HEADER);
|
|
92
|
+
if (context.uniqueToken) headers.set(SHOPIFY_UNIQUE_TOKEN_HEADER, context.uniqueToken);
|
|
93
|
+
if (context.visitToken) headers.set(SHOPIFY_VISIT_TOKEN_HEADER, context.visitToken);
|
|
94
|
+
if (context.legacyTokens && context.uniqueToken) headers.set(SHOPIFY_STOREFRONT_Y_HEADER, context.uniqueToken);
|
|
95
|
+
if (context.legacyTokens && context.visitToken) headers.set(SHOPIFY_STOREFRONT_S_HEADER, context.visitToken);
|
|
96
|
+
}
|
|
97
|
+
function getUrlOrigin(url) {
|
|
98
|
+
if (!url) return void 0;
|
|
99
|
+
try {
|
|
100
|
+
return new URL(url).origin;
|
|
101
|
+
} catch {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function isDocumentRequest(request) {
|
|
106
|
+
if (request.method && request.method !== "GET" && request.method !== "HEAD") return false;
|
|
107
|
+
if (request.headers.get("sec-fetch-dest") === "document") return true;
|
|
108
|
+
return request.headers.get("accept")?.includes("text/html") ?? false;
|
|
109
|
+
}
|
|
110
|
+
function hasServerTimingMetric(value, name) {
|
|
111
|
+
return value.split(",").some((part) => part.trim().startsWith(`${name};`));
|
|
112
|
+
}
|
|
113
|
+
function hasServerTimingValue(existing, next) {
|
|
114
|
+
const existingParts = new Set(existing.split(",").map((part) => part.trim()));
|
|
115
|
+
return next.split(",").every((part) => existingParts.has(part.trim()));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
//#endregion
|
|
119
|
+
export { createShopifyRequestContext };
|
|
120
|
+
//# sourceMappingURL=request-context.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-context.mjs","names":[],"sources":["../../../src/core/request-context.ts"],"sourcesContent":["import type {\n CountryCode as CustomerAccountCountryCode,\n LanguageCode as CustomerAccountLanguageCode,\n} from \"../graphql/generated/customer-account-api-types\";\nimport type {\n CountryCode as StorefrontCountryCode,\n LanguageCode as StorefrontLanguageCode,\n} from \"../graphql/generated/storefront-api-types\";\nimport { STOREFRONT_API_VERSION } from \"./constants\";\nimport {\n applyPrivateResponseCacheHeaders,\n HYDROGEN_VERSION_HEADER,\n REQUEST_GROUP_ID_HEADER,\n SDK_VARIANT_HEADER,\n SDK_VARIANT_SOURCE_HEADER,\n SDK_VERSION_HEADER,\n SERVER_TIMING_HEADER,\n SHOPIFY_STOREFRONT_ORIGIN_HEADER,\n SHOPIFY_STOREFRONT_S_HEADER,\n SHOPIFY_STOREFRONT_Y_HEADER,\n SHOPIFY_UNIQUE_TOKEN_HEADER,\n SHOPIFY_VISIT_TOKEN_HEADER,\n STOREFRONT_URL_HEADER,\n} from \"./headers\";\nimport { normalizePathPrefix } from \"./standard-routes/path\";\n\nconst UNIQUE_TOKEN_MARKER = \"_y\";\nconst VISIT_TOKEN_MARKER = \"_s\";\n\ntype StorefrontRequest = Pick<Request, \"headers\"> &\n Partial<Pick<Request, \"method\" | \"signal\" | \"url\">>;\n\nexport type ShopifyLanguageCode = Extract<StorefrontLanguageCode, CustomerAccountLanguageCode>;\nexport type ShopifyCountryCode = Extract<StorefrontCountryCode, CustomerAccountCountryCode>;\n\nexport type I18nConfig = {\n language: ShopifyLanguageCode;\n country: ShopifyCountryCode;\n /** Optional app route prefix for localized paths, for example \"/es-es\". */\n pathPrefix?: string;\n};\n\ntype NormalizedI18nConfig<I18n extends I18nConfig = I18nConfig> = Omit<I18n, \"pathPrefix\"> & {\n pathPrefix: string;\n};\n\ntype ShopifyRequestContextInputBase<I18n extends I18nConfig = I18nConfig> = {\n request: StorefrontRequest;\n i18n: I18n;\n};\n\ntype ShopifyRequestContextInput<I18n extends I18nConfig = I18nConfig> =\n ShopifyRequestContextInputBase<I18n> & { buyerIp?: never };\n\ntype ShopifyRequestContextWithBuyerIpInput<I18n extends I18nConfig = I18nConfig> =\n ShopifyRequestContextInputBase<I18n> & { buyerIp: string };\n\ntype ShopifyRequestContextBase = {\n // -- Private fields --\n /**\n * Compile-time brand so callers use createShopifyRequestContext().\n * @internal\n */\n readonly __hydrogenShopifyRequestContextBrand: never;\n /** @internal */\n cookie?: string;\n /** @internal */\n uniqueToken?: string;\n /** @internal */\n visitToken?: string;\n /** @internal */\n legacyTokens?: boolean;\n /** @internal */\n readonly buyerIp?: string;\n /** @internal */\n requestGroupId: string;\n /** @internal */\n signal?: AbortSignal;\n /** @internal */\n url?: string;\n /** @internal */\n storefrontOrigin?: string;\n /**\n * Apply request-scoped headers required by every Shopify storefront subrequest.\n * @internal\n */\n applyStorefrontRequestHeaders(headers: Headers): void;\n /**\n * Capture the first fresh SFAPI response headers for replay onto the final app response.\n * @internal\n */\n captureSubrequestHeaders(headers: Headers): void;\n /**\n * Mark the final app response as influenced by private customer state.\n * @internal\n */\n markResponseAsPersonalized(reason: string): void;\n\n // -- Public fields --\n i18n: NormalizedI18nConfig;\n /** Return incoming request headers plus request lifecycle headers for proxy/origin handoff. */\n getForwardedRequestHeaders(): Headers;\n /** Apply important response headers for the correct functioning of Hydrogen storefronts. */\n applyResponseHeaders(headers: Headers): void;\n};\n\nexport type ShopifyRequestContext<I18n extends I18nConfig = I18nConfig> =\n ShopifyRequestContextBase & {\n i18n: NormalizedI18nConfig<I18n>;\n };\n\nexport type ShopifyRequestContextWithBuyerIp<I18n extends I18nConfig = I18nConfig> =\n ShopifyRequestContext<I18n> & { readonly buyerIp: string };\n\ntype Context<I18n extends I18nConfig = I18nConfig> = {\n cookie?: string;\n uniqueToken?: string;\n visitToken?: string;\n legacyTokens?: boolean;\n buyerIp?: string;\n requestGroupId: string;\n signal?: AbortSignal;\n url?: string;\n storefrontOrigin?: string;\n i18n: NormalizedI18nConfig<I18n>;\n documentRequest?: boolean;\n};\n\nexport function createShopifyRequestContext<const I18n extends I18nConfig>(\n input: ShopifyRequestContextWithBuyerIpInput<I18n>,\n): ShopifyRequestContextWithBuyerIp<I18n>;\nexport function createShopifyRequestContext<const I18n extends I18nConfig>(\n input: ShopifyRequestContextInput<I18n>,\n): ShopifyRequestContext<I18n>;\nexport function createShopifyRequestContext<const I18n extends I18nConfig>(\n input: ShopifyRequestContextInputBase<I18n> & { buyerIp?: string },\n): ShopifyRequestContext<I18n> {\n const { request } = input;\n\n if (!input.i18n?.country || !input.i18n?.language) {\n throw new Error(\"i18n with country and language is required for Shopify request contexts.\");\n }\n\n if (input.buyerIp !== undefined && !input.buyerIp) {\n throw new Error(\"buyerIp must be non-empty when provided\");\n }\n\n const i18n = normalizeI18n(input.i18n);\n const cookie = request.headers.get(\"cookie\") || undefined;\n const url = request.url ?? request.headers.get(STOREFRONT_URL_HEADER) ?? undefined;\n const storefrontOrigin = getUrlOrigin(url);\n const context = {\n ...(cookie && { cookie }),\n i18n,\n ...(url && { url }),\n ...(storefrontOrigin && { storefrontOrigin }),\n ...(input.buyerIp && { buyerIp: input.buyerIp }),\n requestGroupId:\n request.headers.get(REQUEST_GROUP_ID_HEADER) ??\n request.headers.get(\"x-request-id\") ??\n request.headers.get(\"request-id\") ??\n crypto.randomUUID(),\n ...(isDocumentRequest(request) && { documentRequest: true }),\n ...(request.signal && { signal: request.signal }),\n } as Context<I18n>;\n\n let capturedSubrequestHeaders:\n | {\n serverTiming: string;\n setCookie: string[];\n }\n | undefined;\n let personalizedResponseReason: string | undefined;\n\n if (!cookie || !/\\b_shopify_(analytics|marketing)=/.test(cookie)) {\n const legacyUniqueToken = cookie?.match(/\\b_shopify_y=([^;]+)/)?.[1];\n const legacyVisitToken = cookie?.match(/\\b_shopify_s=([^;]+)/)?.[1];\n const headerUniqueToken = request.headers.get(SHOPIFY_UNIQUE_TOKEN_HEADER) ?? undefined;\n const headerVisitToken = request.headers.get(SHOPIFY_VISIT_TOKEN_HEADER) ?? undefined;\n\n if (legacyUniqueToken || legacyVisitToken) context.legacyTokens = true;\n\n context.uniqueToken = legacyUniqueToken ?? headerUniqueToken ?? crypto.randomUUID();\n context.visitToken = legacyVisitToken ?? headerVisitToken ?? crypto.randomUUID();\n }\n\n return {\n ...context,\n getForwardedRequestHeaders() {\n const headers = new Headers(request.headers);\n applyStorefrontRequestHeaders(context, headers);\n if (context.url) headers.set(STOREFRONT_URL_HEADER, context.url);\n return headers;\n },\n applyStorefrontRequestHeaders(headers) {\n applyStorefrontRequestHeaders(context, headers);\n },\n captureSubrequestHeaders(headers) {\n // Capture this the first time we get a fresh response to increase the\n // chance of returning it from the main server response. The main response\n // needs headers set at send time, while the body can stream later, so this\n // may not be used if subrequests finish after the main response is sent.\n capturedSubrequestHeaders ??= {\n serverTiming: headers.get(SERVER_TIMING_HEADER) ?? \"\",\n setCookie: headers.getSetCookie(),\n };\n },\n markResponseAsPersonalized(reason) {\n personalizedResponseReason ??= reason;\n },\n applyResponseHeaders(headers) {\n headers.set(\"powered-by\", \"Shopify, Hydrogen\");\n\n if (capturedSubrequestHeaders) {\n const existingSetCookies = headers.getSetCookie();\n for (const value of capturedSubrequestHeaders.setCookie) {\n if (existingSetCookies.includes(value)) continue;\n headers.append(\"set-cookie\", value);\n }\n const existingServerTiming = headers.get(SERVER_TIMING_HEADER) ?? \"\";\n if (\n capturedSubrequestHeaders.serverTiming &&\n !hasServerTimingValue(existingServerTiming, capturedSubrequestHeaders.serverTiming)\n ) {\n headers.append(SERVER_TIMING_HEADER, capturedSubrequestHeaders.serverTiming);\n }\n }\n\n if (personalizedResponseReason) {\n applyPrivateResponseCacheHeaders(headers);\n }\n\n // Generated fallback tokens are only for document navigation bootstrap.\n const isHtmlResponse = headers.get(\"content-type\")?.startsWith(\"text/html\") ?? false;\n if (!isHtmlResponse && !context.documentRequest) return;\n\n const existing = headers.get(SERVER_TIMING_HEADER) ?? \"\";\n if (context.uniqueToken && !hasServerTimingMetric(existing, UNIQUE_TOKEN_MARKER)) {\n headers.append(SERVER_TIMING_HEADER, `${UNIQUE_TOKEN_MARKER};desc=${context.uniqueToken}`);\n }\n if (context.visitToken && !hasServerTimingMetric(existing, VISIT_TOKEN_MARKER)) {\n headers.append(SERVER_TIMING_HEADER, `${VISIT_TOKEN_MARKER};desc=${context.visitToken}`);\n }\n },\n } as ShopifyRequestContext<I18n>;\n}\n\nfunction normalizeI18n<I18n extends I18nConfig>(i18n: I18n): NormalizedI18nConfig<I18n> {\n return {\n ...i18n,\n pathPrefix: normalizePathPrefix(i18n.pathPrefix),\n } as NormalizedI18nConfig<I18n>;\n}\n\nfunction applyStorefrontRequestHeaders(context: Context, headers: Headers): void {\n headers.set(SDK_VARIANT_HEADER, \"hydrogen\");\n headers.set(SDK_VARIANT_SOURCE_HEADER, \"kit\");\n headers.set(SDK_VERSION_HEADER, STOREFRONT_API_VERSION);\n headers.set(HYDROGEN_VERSION_HEADER, __HYDROGEN_VERSION__);\n headers.set(REQUEST_GROUP_ID_HEADER, context.requestGroupId);\n\n if (context.cookie) headers.set(\"cookie\", context.cookie);\n else headers.delete(\"cookie\");\n if (context.storefrontOrigin) {\n headers.set(SHOPIFY_STOREFRONT_ORIGIN_HEADER, context.storefrontOrigin);\n } else headers.delete(SHOPIFY_STOREFRONT_ORIGIN_HEADER);\n\n if (context.uniqueToken) headers.set(SHOPIFY_UNIQUE_TOKEN_HEADER, context.uniqueToken);\n if (context.visitToken) headers.set(SHOPIFY_VISIT_TOKEN_HEADER, context.visitToken);\n if (context.legacyTokens && context.uniqueToken) {\n headers.set(SHOPIFY_STOREFRONT_Y_HEADER, context.uniqueToken);\n }\n if (context.legacyTokens && context.visitToken) {\n headers.set(SHOPIFY_STOREFRONT_S_HEADER, context.visitToken);\n }\n}\n\nfunction getUrlOrigin(url: string | undefined): string | undefined {\n if (!url) return undefined;\n try {\n return new URL(url).origin;\n } catch {\n return undefined;\n }\n}\n\nfunction isDocumentRequest(request: StorefrontRequest): boolean {\n if (request.method && request.method !== \"GET\" && request.method !== \"HEAD\") return false;\n\n const destination = request.headers.get(\"sec-fetch-dest\");\n if (destination === \"document\") return true;\n\n return request.headers.get(\"accept\")?.includes(\"text/html\") ?? false;\n}\n\nfunction hasServerTimingMetric(value: string, name: string): boolean {\n return value.split(\",\").some((part) => part.trim().startsWith(`${name};`));\n}\n\nfunction hasServerTimingValue(existing: string, next: string): boolean {\n const existingParts = new Set(existing.split(\",\").map((part) => part.trim()));\n return next.split(\",\").every((part) => existingParts.has(part.trim()));\n}\n"],"mappings":";;;;;AA0BA,MAAM,sBAAsB;AAC5B,MAAM,qBAAqB;AA2G3B,SAAgB,4BACd,OAC6B;CAC7B,MAAM,EAAE,YAAY;AAEpB,KAAI,CAAC,MAAM,MAAM,WAAW,CAAC,MAAM,MAAM,SACvC,OAAM,IAAI,MAAM,2EAA2E;AAG7F,KAAI,MAAM,YAAY,UAAa,CAAC,MAAM,QACxC,OAAM,IAAI,MAAM,0CAA0C;CAG5D,MAAM,OAAO,cAAc,MAAM,KAAK;CACtC,MAAM,SAAS,QAAQ,QAAQ,IAAI,SAAS,IAAI;CAChD,MAAM,MAAM,QAAQ,OAAO,QAAQ,QAAQ,uBAA0B,IAAI;CACzE,MAAM,mBAAmB,aAAa,IAAI;CAC1C,MAAM,UAAU;EACd,GAAI,UAAU,EAAE,QAAQ;EACxB;EACA,GAAI,OAAO,EAAE,KAAK;EAClB,GAAI,oBAAoB,EAAE,kBAAkB;EAC5C,GAAI,MAAM,WAAW,EAAE,SAAS,MAAM,SAAS;EAC/C,gBACE,QAAQ,QAAQ,yCAA4B,IAC5C,QAAQ,QAAQ,IAAI,eAAe,IACnC,QAAQ,QAAQ,IAAI,aAAa,IACjC,OAAO,YAAY;EACrB,GAAI,kBAAkB,QAAQ,IAAI,EAAE,iBAAiB,MAAM;EAC3D,GAAI,QAAQ,UAAU,EAAE,QAAQ,QAAQ,QAAQ;EACjD;CAED,IAAI;CAMJ,IAAI;AAEJ,KAAI,CAAC,UAAU,CAAC,oCAAoC,KAAK,OAAO,EAAE;EAChE,MAAM,oBAAoB,QAAQ,MAAM,uBAAuB,GAAG;EAClE,MAAM,mBAAmB,QAAQ,MAAM,uBAAuB,GAAG;EACjE,MAAM,oBAAoB,QAAQ,QAAQ,4BAAgC,IAAI;EAC9E,MAAM,mBAAmB,QAAQ,QAAQ,2BAA+B,IAAI;AAE5E,MAAI,qBAAqB,iBAAkB,SAAQ,eAAe;AAElE,UAAQ,cAAc,qBAAqB,qBAAqB,OAAO,YAAY;AACnF,UAAQ,aAAa,oBAAoB,oBAAoB,OAAO,YAAY;;AAGlF,QAAO;EACL,GAAG;EACH,6BAA6B;GAC3B,MAAM,UAAU,IAAI,QAAQ,QAAQ,QAAQ;AAC5C,iCAA8B,SAAS,QAAQ;AAC/C,OAAI,QAAQ,IAAK,SAAQ,IAAI,uBAAuB,QAAQ,IAAI;AAChE,UAAO;;EAET,8BAA8B,SAAS;AACrC,iCAA8B,SAAS,QAAQ;;EAEjD,yBAAyB,SAAS;AAKhC,iCAA8B;IAC5B,cAAc,QAAQ,oBAAyB,IAAI;IACnD,WAAW,QAAQ,cAAc;IAClC;;EAEH,2BAA2B,QAAQ;AACjC,kCAA+B;;EAEjC,qBAAqB,SAAS;AAC5B,WAAQ,IAAI,cAAc,oBAAoB;AAE9C,OAAI,2BAA2B;IAC7B,MAAM,qBAAqB,QAAQ,cAAc;AACjD,SAAK,MAAM,SAAS,0BAA0B,WAAW;AACvD,SAAI,mBAAmB,SAAS,MAAM,CAAE;AACxC,aAAQ,OAAO,cAAc,MAAM;;IAErC,MAAM,uBAAuB,QAAQ,oBAAyB,IAAI;AAClE,QACE,0BAA0B,gBAC1B,CAAC,qBAAqB,sBAAsB,0BAA0B,aAAa,CAEnF,SAAQ,OAAO,sBAAsB,0BAA0B,aAAa;;AAIhF,OAAI,2BACF,kCAAiC,QAAQ;AAK3C,OAAI,EADmB,QAAQ,IAAI,eAAe,EAAE,WAAW,YAAY,IAAI,UACxD,CAAC,QAAQ,gBAAiB;GAEjD,MAAM,WAAW,QAAQ,oBAAyB,IAAI;AACtD,OAAI,QAAQ,eAAe,CAAC,sBAAsB,UAAU,oBAAoB,CAC9E,SAAQ,OAAO,sBAAsB,GAAG,oBAAoB,QAAQ,QAAQ,cAAc;AAE5F,OAAI,QAAQ,cAAc,CAAC,sBAAsB,UAAU,mBAAmB,CAC5E,SAAQ,OAAO,sBAAsB,GAAG,mBAAmB,QAAQ,QAAQ,aAAa;;EAG7F;;AAGH,SAAS,cAAuC,MAAwC;AACtF,QAAO;EACL,GAAG;EACH,YAAY,oBAAoB,KAAK,WAAW;EACjD;;AAGH,SAAS,8BAA8B,SAAkB,SAAwB;AAC/E,SAAQ,IAAI,oBAAoB,WAAW;AAC3C,SAAQ,IAAI,2BAA2B,MAAM;AAC7C,SAAQ,IAAI,oBAAoB,uBAAuB;AACvD,SAAQ,IAAI,+CAA8C;AAC1D,SAAQ,IAAI,yBAAyB,QAAQ,eAAe;AAE5D,KAAI,QAAQ,OAAQ,SAAQ,IAAI,UAAU,QAAQ,OAAO;KACpD,SAAQ,OAAO,SAAS;AAC7B,KAAI,QAAQ,iBACV,SAAQ,IAAI,kCAAkC,QAAQ,iBAAiB;KAClE,SAAQ,OAAO,iCAAiC;AAEvD,KAAI,QAAQ,YAAa,SAAQ,IAAI,6BAA6B,QAAQ,YAAY;AACtF,KAAI,QAAQ,WAAY,SAAQ,IAAI,4BAA4B,QAAQ,WAAW;AACnF,KAAI,QAAQ,gBAAgB,QAAQ,YAClC,SAAQ,IAAI,6BAA6B,QAAQ,YAAY;AAE/D,KAAI,QAAQ,gBAAgB,QAAQ,WAClC,SAAQ,IAAI,6BAA6B,QAAQ,WAAW;;AAIhE,SAAS,aAAa,KAA6C;AACjE,KAAI,CAAC,IAAK,QAAO;AACjB,KAAI;AACF,SAAO,IAAI,IAAI,IAAI,CAAC;SACd;AACN;;;AAIJ,SAAS,kBAAkB,SAAqC;AAC9D,KAAI,QAAQ,UAAU,QAAQ,WAAW,SAAS,QAAQ,WAAW,OAAQ,QAAO;AAGpF,KADoB,QAAQ,QAAQ,IAAI,iBACzB,KAAK,WAAY,QAAO;AAEvC,QAAO,QAAQ,QAAQ,IAAI,SAAS,EAAE,SAAS,YAAY,IAAI;;AAGjE,SAAS,sBAAsB,OAAe,MAAuB;AACnE,QAAO,MAAM,MAAM,IAAI,CAAC,MAAM,SAAS,KAAK,MAAM,CAAC,WAAW,GAAG,KAAK,GAAG,CAAC;;AAG5E,SAAS,qBAAqB,UAAkB,MAAuB;CACrE,MAAM,gBAAgB,IAAI,IAAI,SAAS,MAAM,IAAI,CAAC,KAAK,SAAS,KAAK,MAAM,CAAC,CAAC;AAC7E,QAAO,KAAK,MAAM,IAAI,CAAC,OAAO,SAAS,cAAc,IAAI,KAAK,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { StorefrontClient } from "../../client/types.mjs";
|
|
2
|
+
import { ShopifyRouteTemplates } from "../standard-routes/types.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/core/request-routing/handle-shopify-redirects.d.ts
|
|
5
|
+
type RedirectOptions = {
|
|
6
|
+
request: Request;
|
|
7
|
+
storefrontClient: StorefrontClient;
|
|
8
|
+
routeTemplates: ShopifyRouteTemplates;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Resolves Shopify redirects after framework routing returns a 404. Matched
|
|
12
|
+
* responses already include request-context response headers.
|
|
13
|
+
*/
|
|
14
|
+
declare function handleShopifyRedirects(options: RedirectOptions): Promise<Response | null>;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { RedirectOptions, handleShopifyRedirects };
|
|
17
|
+
//# sourceMappingURL=handle-shopify-redirects.d.mts.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { getLogger } from "../logging/logging.mjs";
|
|
2
|
+
import { handleAdminRedirect } from "./interceptors/admin-redirect.mjs";
|
|
3
|
+
import { handleQueryParamRedirect } from "./interceptors/query-param-redirect.mjs";
|
|
4
|
+
import { handleUrlRedirects } from "./interceptors/url-redirects.mjs";
|
|
5
|
+
import { handleStandardRouteRedirects } from "./interceptors/standard-routes.mjs";
|
|
6
|
+
import { safeApplyResponseHeaders } from "./safe-apply-response-headers.mjs";
|
|
7
|
+
|
|
8
|
+
//#region src/core/request-routing/handle-shopify-redirects.ts
|
|
9
|
+
const log = getLogger("redirects");
|
|
10
|
+
/**
|
|
11
|
+
* Resolves Shopify redirects after framework routing returns a 404. Matched
|
|
12
|
+
* responses already include request-context response headers.
|
|
13
|
+
*/
|
|
14
|
+
async function handleShopifyRedirects(options) {
|
|
15
|
+
const { request, storefrontClient } = options;
|
|
16
|
+
let redirect = null;
|
|
17
|
+
try {
|
|
18
|
+
redirect = handleAdminRedirect(options);
|
|
19
|
+
redirect ??= handleStandardRouteRedirects(options);
|
|
20
|
+
redirect ??= handleQueryParamRedirect(request);
|
|
21
|
+
redirect ??= await handleUrlRedirects(options);
|
|
22
|
+
} catch (error) {
|
|
23
|
+
const url = new URL(request.url);
|
|
24
|
+
log.error(`failed to resolve Shopify redirects for route ${url.pathname}`, { error });
|
|
25
|
+
}
|
|
26
|
+
return redirect ? safeApplyResponseHeaders(redirect, storefrontClient.requestContext) : null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
//#endregion
|
|
30
|
+
export { handleShopifyRedirects };
|
|
31
|
+
//# sourceMappingURL=handle-shopify-redirects.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle-shopify-redirects.mjs","names":[],"sources":["../../../../src/core/request-routing/handle-shopify-redirects.ts"],"sourcesContent":["import type { StorefrontClient } from \"../../client\";\nimport { getLogger } from \"../logging\";\nimport type { ShopifyRouteTemplates } from \"../standard-routes/index\";\nimport { handleAdminRedirect } from \"./interceptors/admin-redirect\";\nimport { handleQueryParamRedirect } from \"./interceptors/query-param-redirect\";\nimport { handleStandardRouteRedirects } from \"./interceptors/standard-routes\";\nimport { handleUrlRedirects } from \"./interceptors/url-redirects\";\nimport { safeApplyResponseHeaders } from \"./safe-apply-response-headers\";\n\nconst log = getLogger(\"redirects\");\n\nexport type RedirectOptions = {\n request: Request;\n storefrontClient: StorefrontClient;\n routeTemplates: ShopifyRouteTemplates;\n};\n\n/**\n * Resolves Shopify redirects after framework routing returns a 404. Matched\n * responses already include request-context response headers.\n */\nexport async function handleShopifyRedirects(options: RedirectOptions): Promise<Response | null> {\n const { request, storefrontClient } = options;\n let redirect: Response | null = null;\n\n try {\n redirect = handleAdminRedirect(options);\n redirect ??= handleStandardRouteRedirects(options);\n redirect ??= handleQueryParamRedirect(request);\n redirect ??= await handleUrlRedirects(options);\n } catch (error) {\n const url = new URL(request.url);\n log.error(`failed to resolve Shopify redirects for route ${url.pathname}`, { error });\n }\n\n return redirect ? safeApplyResponseHeaders(redirect, storefrontClient.requestContext) : null;\n}\n"],"mappings":";;;;;;;;AASA,MAAM,MAAM,UAAU,YAAY;;;;;AAYlC,eAAsB,uBAAuB,SAAoD;CAC/F,MAAM,EAAE,SAAS,qBAAqB;CACtC,IAAI,WAA4B;AAEhC,KAAI;AACF,aAAW,oBAAoB,QAAQ;AACvC,eAAa,6BAA6B,QAAQ;AAClD,eAAa,yBAAyB,QAAQ;AAC9C,eAAa,MAAM,mBAAmB,QAAQ;UACvC,OAAO;EACd,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;AAChC,MAAI,MAAM,iDAAiD,IAAI,YAAY,EAAE,OAAO,CAAC;;AAGvF,QAAO,WAAW,yBAAyB,UAAU,iBAAiB,eAAe,GAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { HydrogenRouteHandler } from "./route-types.mjs";
|
|
2
|
+
import { GraphiQLOptions } from "../types.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/core/request-routing/handle-shopify-routes.development.d.ts
|
|
5
|
+
type HydrogenRoutesDevOptions = {
|
|
6
|
+
graphiql?: GraphiQLOptions;
|
|
7
|
+
};
|
|
8
|
+
declare const handleShopifyRoutesDev: HydrogenRouteHandler<HydrogenRoutesDevOptions>;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { handleShopifyRoutesDev };
|
|
11
|
+
//# sourceMappingURL=handle-shopify-routes.development.d.mts.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { safeApplyResponseHeaders } from "./safe-apply-response-headers.mjs";
|
|
2
|
+
import { handleShopifyRoutes } from "./handle-shopify-routes.mjs";
|
|
3
|
+
import { handleGraphiql } from "./interceptors/graphiql.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/core/request-routing/handle-shopify-routes.development.ts
|
|
6
|
+
const handleShopifyRoutesDev = (options) => {
|
|
7
|
+
const productionResult = handleShopifyRoutes(options);
|
|
8
|
+
if (productionResult) return productionResult;
|
|
9
|
+
const graphiqlResult = handleGraphiql(new URL(options.request.url), options);
|
|
10
|
+
if (!graphiqlResult) return null;
|
|
11
|
+
return graphiqlResult.then((response) => safeApplyResponseHeaders(response, options.requestContext));
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
//#endregion
|
|
15
|
+
export { handleShopifyRoutesDev };
|
|
16
|
+
//# sourceMappingURL=handle-shopify-routes.development.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle-shopify-routes.development.mjs","names":[],"sources":["../../../../src/core/request-routing/handle-shopify-routes.development.ts"],"sourcesContent":["import type { GraphiQLOptions } from \"../types\";\nimport { handleShopifyRoutes } from \"./handle-shopify-routes\";\nimport { handleGraphiql } from \"./interceptors/graphiql\";\nimport type { HydrogenRouteHandler } from \"./route-types\";\nimport { safeApplyResponseHeaders } from \"./safe-apply-response-headers\";\n\ntype HydrogenRoutesDevOptions = {\n graphiql?: GraphiQLOptions;\n};\n\nexport const handleShopifyRoutesDev: HydrogenRouteHandler<HydrogenRoutesDevOptions> = (options) => {\n const productionResult = handleShopifyRoutes(options);\n if (productionResult) return productionResult;\n\n const graphiqlResult = handleGraphiql(new URL(options.request.url), options);\n if (!graphiqlResult) return null;\n\n return graphiqlResult.then((response) =>\n safeApplyResponseHeaders(response, options.requestContext),\n );\n};\n"],"mappings":";;;;;AAUA,MAAa,0BAA0E,YAAY;CACjG,MAAM,mBAAmB,oBAAoB,QAAQ;AACrD,KAAI,iBAAkB,QAAO;CAE7B,MAAM,iBAAiB,eAAe,IAAI,IAAI,QAAQ,QAAQ,IAAI,EAAE,QAAQ;AAC5E,KAAI,CAAC,eAAgB,QAAO;AAE5B,QAAO,eAAe,MAAM,aAC1B,yBAAyB,UAAU,QAAQ,eAAe,CAC3D"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { safeApplyResponseHeaders } from "./safe-apply-response-headers.mjs";
|
|
2
|
+
import { handleAgentProxy } from "./interceptors/agent-proxy.mjs";
|
|
3
|
+
import { handleAjaxApi } from "./interceptors/ajax-api.mjs";
|
|
4
|
+
import { handleShopifyApiProxy } from "./interceptors/api-proxy.mjs";
|
|
5
|
+
import { handleCheckoutRedirect } from "./interceptors/checkout.mjs";
|
|
6
|
+
import { handleMcpProxy } from "./interceptors/mcp-proxy.mjs";
|
|
7
|
+
import { handleSfapiProxy } from "./interceptors/sfapi-proxy.mjs";
|
|
8
|
+
import { handleWellKnownProxy } from "./interceptors/well-known.mjs";
|
|
9
|
+
import { handleShopifyRouteHandlers } from "./registered-routes.mjs";
|
|
10
|
+
|
|
11
|
+
//#region src/core/request-routing/handle-shopify-routes.ts
|
|
12
|
+
const SHOPIFY_ROUTE_INTERCEPTORS = [
|
|
13
|
+
handleShopifyApiProxy,
|
|
14
|
+
handleSfapiProxy,
|
|
15
|
+
handleShopifyRouteHandlers,
|
|
16
|
+
handleCheckoutRedirect,
|
|
17
|
+
handleWellKnownProxy,
|
|
18
|
+
handleMcpProxy,
|
|
19
|
+
handleAgentProxy,
|
|
20
|
+
handleAjaxApi
|
|
21
|
+
];
|
|
22
|
+
/**
|
|
23
|
+
* Matches a request against Shopify standard routes and any registered handler
|
|
24
|
+
* groups, returning a raw `Response` (redirect or JSON) when one matches, or
|
|
25
|
+
* `null` when none do. Use it as the first step of request handling, before
|
|
26
|
+
* framework routing. Matched responses already include request-context
|
|
27
|
+
* response headers.
|
|
28
|
+
*/
|
|
29
|
+
const handleShopifyRoutes = (options) => {
|
|
30
|
+
if (options.requestContext !== options.storefrontClient.requestContext) throw new Error("handleShopifyRoutes must receive the same requestContext used by storefrontClient.");
|
|
31
|
+
const url = new URL(options.request.url);
|
|
32
|
+
for (const interceptor of SHOPIFY_ROUTE_INTERCEPTORS) {
|
|
33
|
+
const responsePromise = interceptor(url, options);
|
|
34
|
+
if (!responsePromise) continue;
|
|
35
|
+
return responsePromise.then((response) => safeApplyResponseHeaders(response, options.requestContext));
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
//#endregion
|
|
41
|
+
export { handleShopifyRoutes };
|
|
42
|
+
//# sourceMappingURL=handle-shopify-routes.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle-shopify-routes.mjs","names":[],"sources":["../../../../src/core/request-routing/handle-shopify-routes.ts"],"sourcesContent":["import { handleAgentProxy } from \"./interceptors/agent-proxy\";\nimport { handleAjaxApi } from \"./interceptors/ajax-api\";\nimport { handleShopifyApiProxy } from \"./interceptors/api-proxy\";\nimport { handleCheckoutRedirect } from \"./interceptors/checkout\";\nimport { handleMcpProxy } from \"./interceptors/mcp-proxy\";\nimport { handleSfapiProxy } from \"./interceptors/sfapi-proxy\";\nimport { handleWellKnownProxy } from \"./interceptors/well-known\";\nimport { handleShopifyRouteHandlers } from \"./registered-routes\";\nimport type { HydrogenRouteHandler, HydrogenRouteInterceptor } from \"./route-types\";\nimport { safeApplyResponseHeaders } from \"./safe-apply-response-headers\";\n\nconst SHOPIFY_ROUTE_INTERCEPTORS = [\n handleShopifyApiProxy,\n handleSfapiProxy,\n handleShopifyRouteHandlers,\n handleCheckoutRedirect,\n handleWellKnownProxy,\n handleMcpProxy,\n handleAgentProxy,\n handleAjaxApi,\n] satisfies readonly HydrogenRouteInterceptor[];\n\n/**\n * Matches a request against Shopify standard routes and any registered handler\n * groups, returning a raw `Response` (redirect or JSON) when one matches, or\n * `null` when none do. Use it as the first step of request handling, before\n * framework routing. Matched responses already include request-context\n * response headers.\n */\nexport const handleShopifyRoutes: HydrogenRouteHandler = (options) => {\n if (options.requestContext !== options.storefrontClient.requestContext) {\n throw new Error(\n \"handleShopifyRoutes must receive the same requestContext used by storefrontClient.\",\n );\n }\n\n const url = new URL(options.request.url);\n\n for (const interceptor of SHOPIFY_ROUTE_INTERCEPTORS) {\n const responsePromise = interceptor(url, options);\n if (!responsePromise) continue;\n\n return responsePromise.then((response) =>\n safeApplyResponseHeaders(response, options.requestContext),\n );\n }\n\n return null;\n};\n"],"mappings":";;;;;;;;;;;AAWA,MAAM,6BAA6B;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;;;AASD,MAAa,uBAA6C,YAAY;AACpE,KAAI,QAAQ,mBAAmB,QAAQ,iBAAiB,eACtD,OAAM,IAAI,MACR,qFACD;CAGH,MAAM,MAAM,IAAI,IAAI,QAAQ,QAAQ,IAAI;AAExC,MAAK,MAAM,eAAe,4BAA4B;EACpD,MAAM,kBAAkB,YAAY,KAAK,QAAQ;AACjD,MAAI,CAAC,gBAAiB;AAEtB,SAAO,gBAAgB,MAAM,aAC3B,yBAAyB,UAAU,QAAQ,eAAe,CAC3D;;AAGH,QAAO"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/core/request-routing/interceptors/admin-redirect.ts
|
|
2
|
+
function handleAdminRedirect({ request, storefrontClient }) {
|
|
3
|
+
if (new URL(request.url).pathname !== "/admin") return null;
|
|
4
|
+
return new Response(null, {
|
|
5
|
+
status: 301,
|
|
6
|
+
headers: { location: new URL("/admin", storefrontClient.storeUrl).toString() }
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
//#endregion
|
|
11
|
+
export { handleAdminRedirect };
|
|
12
|
+
//# sourceMappingURL=admin-redirect.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-redirect.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/admin-redirect.ts"],"sourcesContent":["import type { RedirectOptions } from \"../handle-shopify-redirects\";\n\ntype AdminRedirectOptions = Pick<RedirectOptions, \"request\" | \"storefrontClient\">;\n\nexport function handleAdminRedirect({\n request,\n storefrontClient,\n}: AdminRedirectOptions): Response | null {\n const url = new URL(request.url);\n if (url.pathname !== \"/admin\") return null;\n\n return new Response(null, {\n status: 301,\n headers: { location: new URL(\"/admin\", storefrontClient.storeUrl).toString() },\n });\n}\n"],"mappings":";AAIA,SAAgB,oBAAoB,EAClC,SACA,oBACwC;AAExC,KAAI,IADY,IAAI,QAAQ,IACrB,CAAC,aAAa,SAAU,QAAO;AAEtC,QAAO,IAAI,SAAS,MAAM;EACxB,QAAQ;EACR,SAAS,EAAE,UAAU,IAAI,IAAI,UAAU,iBAAiB,SAAS,CAAC,UAAU,EAAE;EAC/E,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AGENT_REQUEST_HEADER_ALLOWLIST, SHOPIFY_CHAT_FRAME_ORIGIN_HEADER } from "../../headers.mjs";
|
|
2
|
+
import { AGENT_BUYER_CLAIMS_RE } from "../../url.mjs";
|
|
3
|
+
import { createProxyInterceptor } from "./proxy.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/core/request-routing/interceptors/agent-proxy.ts
|
|
6
|
+
const handleAgentProxy = createProxyInterceptor({
|
|
7
|
+
match: AGENT_BUYER_CLAIMS_RE,
|
|
8
|
+
headers: {
|
|
9
|
+
allow: AGENT_REQUEST_HEADER_ALLOWLIST,
|
|
10
|
+
prepare(headers, _options, url) {
|
|
11
|
+
headers.set(SHOPIFY_CHAT_FRAME_ORIGIN_HEADER, url.origin);
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
scope: "agent-proxy"
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
//#endregion
|
|
18
|
+
export { handleAgentProxy };
|
|
19
|
+
//# sourceMappingURL=agent-proxy.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-proxy.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/agent-proxy.ts"],"sourcesContent":["import { AGENT_REQUEST_HEADER_ALLOWLIST, SHOPIFY_CHAT_FRAME_ORIGIN_HEADER } from \"../../headers\";\nimport { AGENT_BUYER_CLAIMS_RE } from \"../../url\";\nimport { createProxyInterceptor } from \"./proxy\";\n\nexport const handleAgentProxy = createProxyInterceptor({\n match: AGENT_BUYER_CLAIMS_RE,\n headers: {\n allow: AGENT_REQUEST_HEADER_ALLOWLIST,\n prepare(headers, _options, url) {\n headers.set(SHOPIFY_CHAT_FRAME_ORIGIN_HEADER, url.origin);\n },\n },\n scope: \"agent-proxy\",\n});\n"],"mappings":";;;;;AAIA,MAAa,mBAAmB,uBAAuB;CACrD,OAAO;CACP,SAAS;EACP,OAAO;EACP,QAAQ,SAAS,UAAU,KAAK;AAC9B,WAAQ,IAAI,kCAAkC,IAAI,OAAO;;EAE5D;CACD,OAAO;CACR,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AJAX_API_REQUEST_HEADER_ALLOWLIST } from "../../headers.mjs";
|
|
2
|
+
import { AJAX_CART_RE } from "../../url.mjs";
|
|
3
|
+
import { createProxyInterceptor } from "./proxy.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/core/request-routing/interceptors/ajax-api.ts
|
|
6
|
+
const rewriteShopifyJsPathname = (pathname) => pathname.replace(/\.js$/i, ".json");
|
|
7
|
+
const handleAjaxApi = createProxyInterceptor({
|
|
8
|
+
match: AJAX_CART_RE,
|
|
9
|
+
headers: { allow: AJAX_API_REQUEST_HEADER_ALLOWLIST },
|
|
10
|
+
rewritePathname: rewriteShopifyJsPathname,
|
|
11
|
+
scope: "ajax-api"
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
//#endregion
|
|
15
|
+
export { handleAjaxApi, rewriteShopifyJsPathname };
|
|
16
|
+
//# sourceMappingURL=ajax-api.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ajax-api.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/ajax-api.ts"],"sourcesContent":["import { AJAX_API_REQUEST_HEADER_ALLOWLIST } from \"../../headers\";\nimport { AJAX_CART_RE } from \"../../url\";\nimport { createProxyInterceptor } from \"./proxy\";\n\n// Known workaround for Shopify server redirects on `.js` endpoints.\nexport const rewriteShopifyJsPathname = (pathname: string): string =>\n pathname.replace(/\\.js$/i, \".json\");\n\nexport const handleAjaxApi = createProxyInterceptor({\n match: AJAX_CART_RE,\n headers: { allow: AJAX_API_REQUEST_HEADER_ALLOWLIST },\n rewritePathname: rewriteShopifyJsPathname,\n scope: \"ajax-api\",\n});\n"],"mappings":";;;;;AAKA,MAAa,4BAA4B,aACvC,SAAS,QAAQ,UAAU,QAAQ;AAErC,MAAa,gBAAgB,uBAAuB;CAClD,OAAO;CACP,SAAS,EAAE,OAAO,mCAAmC;CACrD,iBAAiB;CACjB,OAAO;CACR,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { PROXY_REQUEST_HEADER_DENYLIST } from "../../headers.mjs";
|
|
2
|
+
import { SHOPIFY_API_PROXY_PREFIX, SHOPIFY_API_PROXY_RE } from "../../url.mjs";
|
|
3
|
+
import { createProxyInterceptor } from "./proxy.mjs";
|
|
4
|
+
import { rewriteShopifyJsPathname } from "./ajax-api.mjs";
|
|
5
|
+
|
|
6
|
+
//#region src/core/request-routing/interceptors/api-proxy.ts
|
|
7
|
+
const handleShopifyApiProxy = createProxyInterceptor({
|
|
8
|
+
match: SHOPIFY_API_PROXY_RE,
|
|
9
|
+
headers: { deny: PROXY_REQUEST_HEADER_DENYLIST },
|
|
10
|
+
rewritePathname: (pathname) => {
|
|
11
|
+
const upstreamPathname = "/" + pathname.slice(SHOPIFY_API_PROXY_PREFIX.length).replace(/^\/+/, "");
|
|
12
|
+
if (upstreamPathname.startsWith("/cdn/")) throw new Error("CDN proxy is not supported.");
|
|
13
|
+
return rewriteShopifyJsPathname(upstreamPathname);
|
|
14
|
+
},
|
|
15
|
+
scope: "shopify-api-proxy"
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
//#endregion
|
|
19
|
+
export { handleShopifyApiProxy };
|
|
20
|
+
//# sourceMappingURL=api-proxy.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-proxy.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/api-proxy.ts"],"sourcesContent":["import { PROXY_REQUEST_HEADER_DENYLIST } from \"../../headers\";\nimport { SHOPIFY_API_PROXY_PREFIX, SHOPIFY_API_PROXY_RE } from \"../../url\";\nimport { rewriteShopifyJsPathname } from \"./ajax-api\";\nimport { createProxyInterceptor } from \"./proxy\";\n\nexport const handleShopifyApiProxy = createProxyInterceptor({\n match: SHOPIFY_API_PROXY_RE,\n headers: { deny: PROXY_REQUEST_HEADER_DENYLIST },\n rewritePathname: (pathname) => {\n const upstreamPathname =\n \"/\" + pathname.slice(SHOPIFY_API_PROXY_PREFIX.length).replace(/^\\/+/, \"\");\n\n if (upstreamPathname.startsWith(\"/cdn/\")) {\n throw new Error(\"CDN proxy is not supported.\");\n }\n\n return rewriteShopifyJsPathname(upstreamPathname);\n },\n scope: \"shopify-api-proxy\",\n});\n"],"mappings":";;;;;;AAKA,MAAa,wBAAwB,uBAAuB;CAC1D,OAAO;CACP,SAAS,EAAE,MAAM,+BAA+B;CAChD,kBAAkB,aAAa;EAC7B,MAAM,mBACJ,MAAM,SAAS,MAAM,yBAAyB,OAAO,CAAC,QAAQ,QAAQ,GAAG;AAE3E,MAAI,iBAAiB,WAAW,QAAQ,CACtC,OAAM,IAAI,MAAM,8BAA8B;AAGhD,SAAO,yBAAyB,iBAAiB;;CAEnD,OAAO;CACR,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { getLogger } from "../../logging/logging.mjs";
|
|
2
|
+
import { CHECKOUT_RE, isHydrogenServerHandoffPath } from "../../url.mjs";
|
|
3
|
+
import { getCart, getCartId } from "../../cart/get-cart.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/core/request-routing/interceptors/checkout.ts
|
|
6
|
+
const log = getLogger("checkout");
|
|
7
|
+
const MOCK_SHOP_CART_PERMALINK_ORIGIN = "https://demostore.mock.shop";
|
|
8
|
+
const handleCheckoutRedirect = (url, { request, storefrontClient }) => {
|
|
9
|
+
if (!isHydrogenServerHandoffPath(url.pathname)) return null;
|
|
10
|
+
if (request.method !== "GET" && request.method !== "HEAD") return Promise.resolve(new Response("Method Not Allowed", { status: 405 }));
|
|
11
|
+
return (CHECKOUT_RE.test(url.pathname) ? getCheckoutRedirectUrl(request, storefrontClient) : getCartRedirectUrl(request, storefrontClient)).then((redirectUrl) => {
|
|
12
|
+
if (redirectUrl.pathname !== "/") {
|
|
13
|
+
mergeSearchParams(redirectUrl, url.searchParams);
|
|
14
|
+
redirectUrl.searchParams.set("payment", url.searchParams.get("payment") ?? "shop_pay");
|
|
15
|
+
}
|
|
16
|
+
return new Response(null, {
|
|
17
|
+
status: 302,
|
|
18
|
+
headers: { location: redirectUrl.toString() }
|
|
19
|
+
});
|
|
20
|
+
}).catch((error) => {
|
|
21
|
+
log.error("checkout redirect request failed", { error });
|
|
22
|
+
const message = error instanceof Error ? error.message : "Internal redirect error";
|
|
23
|
+
return new Response(JSON.stringify({ error: message }), {
|
|
24
|
+
status: 502,
|
|
25
|
+
headers: { "content-type": "application/json" }
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
async function getCheckoutRedirectUrl(request, storefrontClient) {
|
|
30
|
+
const cartId = getCartId(request);
|
|
31
|
+
if (!cartId) return new URL("/", request.url);
|
|
32
|
+
const result = await getCart(cartId, storefrontClient);
|
|
33
|
+
return result.cart?.checkoutUrl ? new URL(result.cart.checkoutUrl) : new URL("/", request.url);
|
|
34
|
+
}
|
|
35
|
+
async function getCartRedirectUrl(request, storefrontClient) {
|
|
36
|
+
const sourceUrl = new URL(request.url);
|
|
37
|
+
const redirectUrl = new URL(sourceUrl.pathname, getCartPermalinkOrigin(storefrontClient.storeUrl));
|
|
38
|
+
const cartId = getCartId(request);
|
|
39
|
+
if (!cartId) return redirectUrl;
|
|
40
|
+
try {
|
|
41
|
+
const result = await getCart(cartId, storefrontClient);
|
|
42
|
+
if (result.cart?.checkoutUrl) mergeSearchParams(redirectUrl, new URL(result.cart.checkoutUrl).searchParams);
|
|
43
|
+
} catch (error) {
|
|
44
|
+
log.warn("checkout redirect could not load cart permalink tracking params", { error });
|
|
45
|
+
}
|
|
46
|
+
return redirectUrl;
|
|
47
|
+
}
|
|
48
|
+
function getCartPermalinkOrigin(storeUrl) {
|
|
49
|
+
const url = new URL(storeUrl);
|
|
50
|
+
return url.hostname === "mock.shop" ? MOCK_SHOP_CART_PERMALINK_ORIGIN : url.origin;
|
|
51
|
+
}
|
|
52
|
+
function mergeSearchParams(target, source) {
|
|
53
|
+
for (const [key, value] of source) if (!target.searchParams.has(key)) target.searchParams.append(key, value);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
//#endregion
|
|
57
|
+
export { handleCheckoutRedirect };
|
|
58
|
+
//# sourceMappingURL=checkout.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkout.mjs","names":[],"sources":["../../../../../src/core/request-routing/interceptors/checkout.ts"],"sourcesContent":["import type { StorefrontClient } from \"../../../client\";\nimport { getCart, getCartId } from \"../../cart/get-cart\";\nimport { getLogger } from \"../../logging\";\nimport { CHECKOUT_RE, isHydrogenServerHandoffPath } from \"../../url\";\nimport type { HydrogenRouteInterceptor } from \"../route-types\";\n\nconst log = getLogger(\"checkout\");\nconst MOCK_SHOP_CART_PERMALINK_ORIGIN = \"https://demostore.mock.shop\";\n\nexport const handleCheckoutRedirect: HydrogenRouteInterceptor = (\n url,\n { request, storefrontClient },\n) => {\n if (!isHydrogenServerHandoffPath(url.pathname)) {\n return null;\n }\n\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return Promise.resolve(new Response(\"Method Not Allowed\", { status: 405 }));\n }\n\n const redirectUrlPromise = CHECKOUT_RE.test(url.pathname)\n ? getCheckoutRedirectUrl(request, storefrontClient)\n : getCartRedirectUrl(request, storefrontClient);\n\n return redirectUrlPromise\n .then((redirectUrl) => {\n if (redirectUrl.pathname !== \"/\") {\n mergeSearchParams(redirectUrl, url.searchParams);\n redirectUrl.searchParams.set(\"payment\", url.searchParams.get(\"payment\") ?? \"shop_pay\");\n }\n\n return new Response(null, {\n status: 302,\n headers: { location: redirectUrl.toString() },\n });\n })\n .catch((error) => {\n log.error(\"checkout redirect request failed\", { error });\n const message = error instanceof Error ? error.message : \"Internal redirect error\";\n\n return new Response(JSON.stringify({ error: message }), {\n status: 502,\n headers: { \"content-type\": \"application/json\" },\n });\n });\n};\n\nasync function getCheckoutRedirectUrl(\n request: Request,\n storefrontClient: StorefrontClient,\n): Promise<URL> {\n const cartId = getCartId(request);\n if (!cartId) return new URL(\"/\", request.url);\n\n const result = await getCart(cartId, storefrontClient);\n return result.cart?.checkoutUrl ? new URL(result.cart.checkoutUrl) : new URL(\"/\", request.url);\n}\n\nasync function getCartRedirectUrl(\n request: Request,\n storefrontClient: StorefrontClient,\n): Promise<URL> {\n const sourceUrl = new URL(request.url);\n const redirectUrl = new URL(\n sourceUrl.pathname,\n getCartPermalinkOrigin(storefrontClient.storeUrl),\n );\n\n const cartId = getCartId(request);\n if (!cartId) return redirectUrl;\n\n try {\n const result = await getCart(cartId, storefrontClient);\n if (result.cart?.checkoutUrl) {\n mergeSearchParams(redirectUrl, new URL(result.cart.checkoutUrl).searchParams);\n }\n } catch (error) {\n log.warn(\"checkout redirect could not load cart permalink tracking params\", { error });\n }\n\n return redirectUrl;\n}\n\nfunction getCartPermalinkOrigin(storeUrl: string): string {\n const url = new URL(storeUrl);\n return url.hostname === \"mock.shop\" ? MOCK_SHOP_CART_PERMALINK_ORIGIN : url.origin;\n}\n\nfunction mergeSearchParams(target: URL, source: URLSearchParams): void {\n for (const [key, value] of source) {\n if (!target.searchParams.has(key)) target.searchParams.append(key, value);\n }\n}\n"],"mappings":";;;;;AAMA,MAAM,MAAM,UAAU,WAAW;AACjC,MAAM,kCAAkC;AAExC,MAAa,0BACX,KACA,EAAE,SAAS,uBACR;AACH,KAAI,CAAC,4BAA4B,IAAI,SAAS,CAC5C,QAAO;AAGT,KAAI,QAAQ,WAAW,SAAS,QAAQ,WAAW,OACjD,QAAO,QAAQ,QAAQ,IAAI,SAAS,sBAAsB,EAAE,QAAQ,KAAK,CAAC,CAAC;AAO7E,SAJ2B,YAAY,KAAK,IAAI,SAAS,GACrD,uBAAuB,SAAS,iBAAiB,GACjD,mBAAmB,SAAS,iBAAiB,EAG9C,MAAM,gBAAgB;AACrB,MAAI,YAAY,aAAa,KAAK;AAChC,qBAAkB,aAAa,IAAI,aAAa;AAChD,eAAY,aAAa,IAAI,WAAW,IAAI,aAAa,IAAI,UAAU,IAAI,WAAW;;AAGxF,SAAO,IAAI,SAAS,MAAM;GACxB,QAAQ;GACR,SAAS,EAAE,UAAU,YAAY,UAAU,EAAE;GAC9C,CAAC;GACF,CACD,OAAO,UAAU;AAChB,MAAI,MAAM,oCAAoC,EAAE,OAAO,CAAC;EACxD,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AAEzD,SAAO,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,SAAS,CAAC,EAAE;GACtD,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAChD,CAAC;GACF;;AAGN,eAAe,uBACb,SACA,kBACc;CACd,MAAM,SAAS,UAAU,QAAQ;AACjC,KAAI,CAAC,OAAQ,QAAO,IAAI,IAAI,KAAK,QAAQ,IAAI;CAE7C,MAAM,SAAS,MAAM,QAAQ,QAAQ,iBAAiB;AACtD,QAAO,OAAO,MAAM,cAAc,IAAI,IAAI,OAAO,KAAK,YAAY,GAAG,IAAI,IAAI,KAAK,QAAQ,IAAI;;AAGhG,eAAe,mBACb,SACA,kBACc;CACd,MAAM,YAAY,IAAI,IAAI,QAAQ,IAAI;CACtC,MAAM,cAAc,IAAI,IACtB,UAAU,UACV,uBAAuB,iBAAiB,SAAS,CAClD;CAED,MAAM,SAAS,UAAU,QAAQ;AACjC,KAAI,CAAC,OAAQ,QAAO;AAEpB,KAAI;EACF,MAAM,SAAS,MAAM,QAAQ,QAAQ,iBAAiB;AACtD,MAAI,OAAO,MAAM,YACf,mBAAkB,aAAa,IAAI,IAAI,OAAO,KAAK,YAAY,CAAC,aAAa;UAExE,OAAO;AACd,MAAI,KAAK,mEAAmE,EAAE,OAAO,CAAC;;AAGxF,QAAO;;AAGT,SAAS,uBAAuB,UAA0B;CACxD,MAAM,MAAM,IAAI,IAAI,SAAS;AAC7B,QAAO,IAAI,aAAa,cAAc,kCAAkC,IAAI;;AAG9E,SAAS,kBAAkB,QAAa,QAA+B;AACrE,MAAK,MAAM,CAAC,KAAK,UAAU,OACzB,KAAI,CAAC,OAAO,aAAa,IAAI,IAAI,CAAE,QAAO,aAAa,OAAO,KAAK,MAAM"}
|