@shopify/hydrogen 2026.4.5 → 2026.10.0-preview.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -13
- package/bin/hydrogen.mjs +7 -0
- package/dist/cli/index.mjs +647 -0
- package/dist/client/client.d.mts +34 -0
- package/dist/client/client.mjs +206 -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 +37 -0
- package/dist/core/cart/cart.mjs +1707 -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 +71 -0
- package/dist/core/collection/url.mjs +376 -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 +43 -0
- package/dist/core/headers.mjs.map +1 -0
- package/dist/core/index.d.mts +56 -0
- package/dist/core/index.mjs +45 -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/accept-variant-id.mjs +98 -0
- package/dist/core/product/accept-variant-id.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 +5 -0
- package/dist/core/product/options.d.mts +43 -0
- package/dist/core/product/options.mjs +296 -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/product/url.d.mts +47 -0
- package/dist/core/product/url.mjs +69 -0
- package/dist/core/product/url.mjs.map +1 -0
- package/dist/core/request-context.d.mts +75 -0
- package/dist/core/request-context.mjs +141 -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/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 +73 -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 +22 -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 +72 -0
- package/dist/core/request-routing/registered-routes.mjs.map +1 -0
- package/dist/core/request-routing/route-types.d.mts +56 -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 +42 -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 +206 -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 +37 -0
- package/dist/development/core/cart/cart.mjs +1707 -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 +71 -0
- package/dist/development/core/collection/url.mjs +376 -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 +56 -0
- package/dist/development/core/development.mjs +45 -0
- package/dist/development/core/headers.mjs +43 -0
- package/dist/development/core/headers.mjs.map +1 -0
- package/dist/development/core/index.d.mts +54 -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/accept-variant-id.mjs +98 -0
- package/dist/development/core/product/accept-variant-id.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 +5 -0
- package/dist/development/core/product/options.d.mts +43 -0
- package/dist/development/core/product/options.mjs +296 -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/product/url.d.mts +47 -0
- package/dist/development/core/product/url.mjs +69 -0
- package/dist/development/core/product/url.mjs.map +1 -0
- package/dist/development/core/request-context.d.mts +75 -0
- package/dist/development/core/request-context.mjs +141 -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/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 +73 -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 +22 -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 +72 -0
- package/dist/development/core/request-routing/registered-routes.mjs.map +1 -0
- package/dist/development/core/request-routing/route-types.d.mts +56 -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 +42 -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 +44 -0
- package/dist/development/react/cart.mjs +155 -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 +46 -0
- package/dist/development/vue/cart.mjs +122 -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 +44 -0
- package/dist/react/cart.mjs +155 -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/certificate-prompt.mjs +24 -0
- package/dist/vite/certificate-prompt.mjs.map +1 -0
- package/dist/vite/index.d.mts +2 -0
- package/dist/vite/index.mjs +3 -0
- package/dist/vite/local-https.d.mts +47 -0
- package/dist/vite/local-https.mjs +276 -0
- package/dist/vite/local-https.mjs.map +1 -0
- package/dist/vite/mkcert.mjs +141 -0
- package/dist/vite/mkcert.mjs.map +1 -0
- package/dist/vue/cart.d.mts +46 -0
- package/dist/vue/cart.mjs +122 -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 +224 -0
- package/skills/hydrogen-cart-ui/references/nextjs.md +89 -0
- package/skills/hydrogen-cart-ui/references/react.md +285 -0
- package/skills/hydrogen-cart-ui/references/vue.md +228 -0
- package/skills/hydrogen-collection-browser/SKILL.md +83 -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 +301 -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 +142 -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 +107 -0
- package/skills/hydrogen-request-handlers/references/frameworks.md +179 -0
- package/skills/hydrogen-request-handlers/references/nextjs.md +137 -0
- package/skills/hydrogen-request-handlers/references/nuxt.md +215 -0
- package/skills/hydrogen-routing/SKILL.md +171 -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 +14 -0
- package/skills/hydrogen-setup/steps/5-cart.md +10 -0
- package/skills/hydrogen-setup/steps/6-product-detail-page.md +416 -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 +205 -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 +267 -0
- package/skills/hydrogen-variant-form/references/nextjs.md +207 -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 -6978
- package/dist/development/index.cjs.map +0 -1
- package/dist/development/index.js +0 -6631
- 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,76 @@
|
|
|
1
|
+
import { I18nConfig } from "../request-context.mjs";
|
|
2
|
+
import { ShopifyRouteTemplates } from "../standard-routes/types.mjs";
|
|
3
|
+
import { ShopifyGlobal } from "../../globals.mjs";
|
|
4
|
+
import { ConsentConfig, ShopAnalyticsChannel, StorefrontAnalyticsConfig } from "../analytics/types.mjs";
|
|
5
|
+
|
|
6
|
+
//#region src/core/shopify-scripts/types.d.ts
|
|
7
|
+
type ShopifyScriptsAnalyticsConfig = {
|
|
8
|
+
channel?: ShopAnalyticsChannel;
|
|
9
|
+
customData?: StorefrontAnalyticsConfig["customData"];
|
|
10
|
+
};
|
|
11
|
+
type ShopifyScriptsI18n = Pick<I18nConfig, "country" | "language"> & Partial<Pick<I18nConfig, "pathPrefix">> & {
|
|
12
|
+
currency?: string;
|
|
13
|
+
};
|
|
14
|
+
type ShopifyCrossOrigin = "" | "anonymous" | "use-credentials";
|
|
15
|
+
type ShopifyDataAttributes = {
|
|
16
|
+
[name: `data-${string}`]: string;
|
|
17
|
+
};
|
|
18
|
+
type ShopifyScriptTagAttributes = ShopifyDataAttributes & Partial<{
|
|
19
|
+
async: boolean;
|
|
20
|
+
crossorigin: ShopifyCrossOrigin;
|
|
21
|
+
defer: boolean;
|
|
22
|
+
id: string;
|
|
23
|
+
nonce: string;
|
|
24
|
+
src: string;
|
|
25
|
+
type: string;
|
|
26
|
+
}>;
|
|
27
|
+
type ShopifyLinkTagAttributes = Partial<{
|
|
28
|
+
as: "script";
|
|
29
|
+
crossorigin: ShopifyCrossOrigin;
|
|
30
|
+
href: string;
|
|
31
|
+
rel: "preconnect" | "prefetch";
|
|
32
|
+
}>;
|
|
33
|
+
type ShopifyScriptDescriptor = {
|
|
34
|
+
tagName: "script";
|
|
35
|
+
attributes?: ShopifyScriptTagAttributes;
|
|
36
|
+
innerHTML?: string;
|
|
37
|
+
};
|
|
38
|
+
type ShopifyLinkDescriptor = {
|
|
39
|
+
tagName: "link";
|
|
40
|
+
attributes: ShopifyLinkTagAttributes;
|
|
41
|
+
innerHTML?: never;
|
|
42
|
+
};
|
|
43
|
+
type ShopifyScriptTagDescriptor = ShopifyScriptDescriptor | ShopifyLinkDescriptor;
|
|
44
|
+
type ShopifyScriptTagDescriptors = {
|
|
45
|
+
/** Link descriptors for framework head APIs that split links from scripts. */readonly links: readonly ShopifyLinkDescriptor[]; /** Script descriptors for framework head APIs that split scripts from links. */
|
|
46
|
+
readonly scripts: readonly ShopifyScriptDescriptor[]; /** All generated descriptors as a mixed list, with links before scripts. */
|
|
47
|
+
readonly tags: readonly ShopifyScriptTagDescriptor[];
|
|
48
|
+
};
|
|
49
|
+
type ShopifyScriptsShop = {
|
|
50
|
+
shopId: string;
|
|
51
|
+
storefrontId: string; /** The shop's permanent `*.myshopify.com` domain, exposed as `window.Shopify.shop`. */
|
|
52
|
+
myshopifyDomain: string;
|
|
53
|
+
};
|
|
54
|
+
type ShopifyScriptTagsOptions = {
|
|
55
|
+
analytics?: ShopifyScriptsAnalyticsConfig;
|
|
56
|
+
consent?: ConsentConfig;
|
|
57
|
+
debug?: {
|
|
58
|
+
/** Loads Shopify's standard events inspector in development builds. */standardEventsInspector?: boolean;
|
|
59
|
+
};
|
|
60
|
+
i18n?: ShopifyScriptsI18n; /** Loads Inbox. Render `<shopify-chat>` where you want the chat UI to appear. */
|
|
61
|
+
inbox?: boolean;
|
|
62
|
+
nonce?: string;
|
|
63
|
+
shop: ShopifyScriptsShop;
|
|
64
|
+
shopifyAnalytics?: boolean;
|
|
65
|
+
};
|
|
66
|
+
type ShopifyRoutesOptions = {
|
|
67
|
+
navigate?: ShopifyGlobal["routes"]["navigate"];
|
|
68
|
+
routes?: ShopifyRouteTemplates;
|
|
69
|
+
};
|
|
70
|
+
type InitializeShopifyScriptsOptions = ShopifyRoutesOptions & {
|
|
71
|
+
webMcp?: boolean;
|
|
72
|
+
};
|
|
73
|
+
type ShopifyScriptsOptions = ShopifyScriptTagsOptions & InitializeShopifyScriptsOptions;
|
|
74
|
+
//#endregion
|
|
75
|
+
export { InitializeShopifyScriptsOptions, ShopifyRoutesOptions, ShopifyScriptTagDescriptor, ShopifyScriptTagDescriptors, ShopifyScriptTagsOptions, ShopifyScriptsAnalyticsConfig, ShopifyScriptsI18n, ShopifyScriptsOptions, ShopifyScriptsShop };
|
|
76
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//#region src/core/shopify-scripts/utils/cookie-domain.ts
|
|
2
|
+
function normalizeHost(host) {
|
|
3
|
+
return host.replace(/^https?:\/\//, "").split("/")[0]?.split(":")[0]?.replace(/^\./, "").toLowerCase() ?? "";
|
|
4
|
+
}
|
|
5
|
+
function isIpAddress(host) {
|
|
6
|
+
return /^\d{1,3}(?:\.\d{1,3}){3}$/.test(host) || host.includes(":");
|
|
7
|
+
}
|
|
8
|
+
function canUseDomainCookie(domain) {
|
|
9
|
+
if (typeof document === "undefined") return false;
|
|
10
|
+
const name = `hydrogen_domain_probe_${Math.random().toString(36).slice(2)}`;
|
|
11
|
+
const nameValuePair = `${name}=1`;
|
|
12
|
+
const cookie = `${nameValuePair}; domain=${domain}; path=/; SameSite=Lax`;
|
|
13
|
+
const cleanup = `${name}=; domain=${domain}; path=/; max-age=0; SameSite=Lax`;
|
|
14
|
+
try {
|
|
15
|
+
document.cookie = cookie;
|
|
16
|
+
const found = document.cookie.split(";").some((part) => part.trim() === nameValuePair);
|
|
17
|
+
document.cookie = cleanup;
|
|
18
|
+
return found;
|
|
19
|
+
} catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Finds the broadest wildcard cookie domain the current document can set for a
|
|
25
|
+
* host. Browsers reject public suffixes like `.com` and `.co.uk`, so probing is
|
|
26
|
+
* the only reliable way to find the earliest usable wildcard without shipping a
|
|
27
|
+
* public suffix list.
|
|
28
|
+
*/
|
|
29
|
+
function findWritableCookieDomain(host, probe = canUseDomainCookie) {
|
|
30
|
+
const normalizedHost = normalizeHost(host);
|
|
31
|
+
if (!normalizedHost || normalizedHost === "localhost" || isIpAddress(normalizedHost)) return "";
|
|
32
|
+
const parts = normalizedHost.split(".").filter(Boolean);
|
|
33
|
+
if (parts.length < 2) return "";
|
|
34
|
+
for (let index = parts.length - 2; index >= 0; index--) {
|
|
35
|
+
const domain = `.${parts.slice(index).join(".")}`;
|
|
36
|
+
if (probe(domain)) return domain;
|
|
37
|
+
}
|
|
38
|
+
return "";
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
//#endregion
|
|
42
|
+
export { findWritableCookieDomain };
|
|
43
|
+
//# sourceMappingURL=cookie-domain.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookie-domain.mjs","names":[],"sources":["../../../../src/core/shopify-scripts/utils/cookie-domain.ts"],"sourcesContent":["function normalizeHost(host: string): string {\n const withoutProtocol = host.replace(/^https?:\\/\\//, \"\");\n return withoutProtocol.split(\"/\")[0]?.split(\":\")[0]?.replace(/^\\./, \"\").toLowerCase() ?? \"\";\n}\n\nfunction isIpAddress(host: string): boolean {\n return /^\\d{1,3}(?:\\.\\d{1,3}){3}$/.test(host) || host.includes(\":\");\n}\n\nfunction canUseDomainCookie(domain: string): boolean {\n if (typeof document === \"undefined\") return false;\n\n const name = `hydrogen_domain_probe_${Math.random().toString(36).slice(2)}`;\n const value = \"1\";\n const nameValuePair = `${name}=${value}`;\n const cookie = `${nameValuePair}; domain=${domain}; path=/; SameSite=Lax`;\n const cleanup = `${name}=; domain=${domain}; path=/; max-age=0; SameSite=Lax`;\n\n try {\n document.cookie = cookie;\n const found = document.cookie.split(\";\").some((part) => part.trim() === nameValuePair);\n document.cookie = cleanup;\n return found;\n } catch {\n return false;\n }\n}\n\n/**\n * Finds the broadest wildcard cookie domain the current document can set for a\n * host. Browsers reject public suffixes like `.com` and `.co.uk`, so probing is\n * the only reliable way to find the earliest usable wildcard without shipping a\n * public suffix list.\n */\nexport function findWritableCookieDomain(\n host: string,\n probe: (domain: string) => boolean = canUseDomainCookie,\n): string {\n const normalizedHost = normalizeHost(host);\n if (!normalizedHost || normalizedHost === \"localhost\" || isIpAddress(normalizedHost)) return \"\";\n\n const parts = normalizedHost.split(\".\").filter(Boolean);\n if (parts.length < 2) return \"\";\n\n for (let index = parts.length - 2; index >= 0; index--) {\n const domain = `.${parts.slice(index).join(\".\")}`;\n if (probe(domain)) return domain;\n }\n\n return \"\";\n}\n"],"mappings":";AAAA,SAAS,cAAc,MAAsB;AAE3C,QADwB,KAAK,QAAQ,gBAAgB,GAC/B,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,QAAQ,OAAO,GAAG,CAAC,aAAa,IAAI;;AAG3F,SAAS,YAAY,MAAuB;AAC1C,QAAO,4BAA4B,KAAK,KAAK,IAAI,KAAK,SAAS,IAAI;;AAGrE,SAAS,mBAAmB,QAAyB;AACnD,KAAI,OAAO,aAAa,YAAa,QAAO;CAE5C,MAAM,OAAO,yBAAyB,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE;CAEzE,MAAM,gBAAgB,GAAG,KAAK;CAC9B,MAAM,SAAS,GAAG,cAAc,WAAW,OAAO;CAClD,MAAM,UAAU,GAAG,KAAK,YAAY,OAAO;AAE3C,KAAI;AACF,WAAS,SAAS;EAClB,MAAM,QAAQ,SAAS,OAAO,MAAM,IAAI,CAAC,MAAM,SAAS,KAAK,MAAM,KAAK,cAAc;AACtF,WAAS,SAAS;AAClB,SAAO;SACD;AACN,SAAO;;;;;;;;;AAUX,SAAgB,yBACd,MACA,QAAqC,oBAC7B;CACR,MAAM,iBAAiB,cAAc,KAAK;AAC1C,KAAI,CAAC,kBAAkB,mBAAmB,eAAe,YAAY,eAAe,CAAE,QAAO;CAE7F,MAAM,QAAQ,eAAe,MAAM,IAAI,CAAC,OAAO,QAAQ;AACvD,KAAI,MAAM,SAAS,EAAG,QAAO;AAE7B,MAAK,IAAI,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS;EACtD,MAAM,SAAS,IAAI,MAAM,MAAM,MAAM,CAAC,KAAK,IAAI;AAC/C,MAAI,MAAM,OAAO,CAAE,QAAO;;AAG5B,QAAO"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-script.mjs","names":[],"sources":["../../../../src/core/shopify-scripts/utils/inline-script.ts"],"sourcesContent":["type InlineScriptSource = (...args: never[]) => unknown;\n\ntype InlineScriptFactory<T extends InlineScriptSource> = (...args: Parameters<T>) => string;\n\nexport function asInlineScript<T extends InlineScriptSource>(script: T): InlineScriptFactory<T>;\nexport function asInlineScript(script: InlineScriptSource) {\n return script;\n}\n"],"mappings":";AAKA,SAAgB,eAAe,QAA4B;AACzD,QAAO"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
//#region src/core/shopify-scripts/utils/navigation.ts
|
|
2
|
+
const navigationCallbacks = /* @__PURE__ */ new Set();
|
|
3
|
+
let stopObservingNavigation;
|
|
4
|
+
function observeNavigation(callback) {
|
|
5
|
+
navigationCallbacks.add(callback);
|
|
6
|
+
stopObservingNavigation ??= startObservingNavigation();
|
|
7
|
+
return () => {
|
|
8
|
+
navigationCallbacks.delete(callback);
|
|
9
|
+
if (navigationCallbacks.size > 0) return;
|
|
10
|
+
stopObservingNavigation?.();
|
|
11
|
+
stopObservingNavigation = void 0;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function startObservingNavigation() {
|
|
15
|
+
const navigation = Reflect.get(window, "navigation");
|
|
16
|
+
if (navigation instanceof EventTarget) {
|
|
17
|
+
navigation.addEventListener("currententrychange", notifyNavigationCallbacks);
|
|
18
|
+
return () => navigation.removeEventListener("currententrychange", notifyNavigationCallbacks);
|
|
19
|
+
}
|
|
20
|
+
const restorePushState = patchHistoryMethod("pushState");
|
|
21
|
+
const restoreReplaceState = patchHistoryMethod("replaceState");
|
|
22
|
+
window.addEventListener("popstate", notifyNavigationCallbacks);
|
|
23
|
+
return () => {
|
|
24
|
+
restorePushState();
|
|
25
|
+
restoreReplaceState();
|
|
26
|
+
window.removeEventListener("popstate", notifyNavigationCallbacks);
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function notifyNavigationCallbacks() {
|
|
30
|
+
for (const callback of navigationCallbacks) callback();
|
|
31
|
+
}
|
|
32
|
+
function patchHistoryMethod(method) {
|
|
33
|
+
const original = window.history[method];
|
|
34
|
+
const patched = function(data, unused, url) {
|
|
35
|
+
original.call(this, data, unused, url);
|
|
36
|
+
notifyNavigationCallbacks();
|
|
37
|
+
};
|
|
38
|
+
window.history[method] = patched;
|
|
39
|
+
return () => {
|
|
40
|
+
if (window.history[method] === patched) window.history[method] = original;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
export { observeNavigation };
|
|
46
|
+
//# sourceMappingURL=navigation.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation.mjs","names":[],"sources":["../../../../src/core/shopify-scripts/utils/navigation.ts"],"sourcesContent":["const navigationCallbacks = new Set<() => void>();\nlet stopObservingNavigation: (() => void) | undefined;\n\nexport function observeNavigation(callback: () => void) {\n navigationCallbacks.add(callback);\n stopObservingNavigation ??= startObservingNavigation();\n\n return () => {\n navigationCallbacks.delete(callback);\n if (navigationCallbacks.size > 0) return;\n\n stopObservingNavigation?.();\n stopObservingNavigation = undefined;\n };\n}\n\nfunction startObservingNavigation() {\n const navigation = Reflect.get(window, \"navigation\");\n if (navigation instanceof EventTarget) {\n navigation.addEventListener(\"currententrychange\", notifyNavigationCallbacks);\n return () => navigation.removeEventListener(\"currententrychange\", notifyNavigationCallbacks);\n }\n\n const restorePushState = patchHistoryMethod(\"pushState\");\n const restoreReplaceState = patchHistoryMethod(\"replaceState\");\n window.addEventListener(\"popstate\", notifyNavigationCallbacks);\n\n return () => {\n restorePushState();\n restoreReplaceState();\n window.removeEventListener(\"popstate\", notifyNavigationCallbacks);\n };\n}\n\nfunction notifyNavigationCallbacks() {\n for (const callback of navigationCallbacks) callback();\n}\n\nfunction patchHistoryMethod(method: \"pushState\" | \"replaceState\") {\n const original = window.history[method];\n const patched: History[typeof method] = function (this: History, data, unused, url) {\n original.call(this, data, unused, url);\n notifyNavigationCallbacks();\n };\n\n window.history[method] = patched;\n\n return () => {\n if (window.history[method] === patched) window.history[method] = original;\n };\n}\n"],"mappings":";AAAA,MAAM,sCAAsB,IAAI,KAAiB;AACjD,IAAI;AAEJ,SAAgB,kBAAkB,UAAsB;AACtD,qBAAoB,IAAI,SAAS;AACjC,6BAA4B,0BAA0B;AAEtD,cAAa;AACX,sBAAoB,OAAO,SAAS;AACpC,MAAI,oBAAoB,OAAO,EAAG;AAElC,6BAA2B;AAC3B,4BAA0B;;;AAI9B,SAAS,2BAA2B;CAClC,MAAM,aAAa,QAAQ,IAAI,QAAQ,aAAa;AACpD,KAAI,sBAAsB,aAAa;AACrC,aAAW,iBAAiB,sBAAsB,0BAA0B;AAC5E,eAAa,WAAW,oBAAoB,sBAAsB,0BAA0B;;CAG9F,MAAM,mBAAmB,mBAAmB,YAAY;CACxD,MAAM,sBAAsB,mBAAmB,eAAe;AAC9D,QAAO,iBAAiB,YAAY,0BAA0B;AAE9D,cAAa;AACX,oBAAkB;AAClB,uBAAqB;AACrB,SAAO,oBAAoB,YAAY,0BAA0B;;;AAIrE,SAAS,4BAA4B;AACnC,MAAK,MAAM,YAAY,oBAAqB,WAAU;;AAGxD,SAAS,mBAAmB,QAAsC;CAChE,MAAM,WAAW,OAAO,QAAQ;CAChC,MAAM,UAAkC,SAAyB,MAAM,QAAQ,KAAK;AAClF,WAAS,KAAK,MAAM,MAAM,QAAQ,IAAI;AACtC,6BAA2B;;AAG7B,QAAO,QAAQ,UAAU;AAEzB,cAAa;AACX,MAAI,OAAO,QAAQ,YAAY,QAAS,QAAO,QAAQ,UAAU"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
//#region src/core/shopify-scripts/utils/tracking-values.ts
|
|
2
|
+
const cachedTrackingValues = { current: null };
|
|
3
|
+
function getTrackingValues() {
|
|
4
|
+
let trackingValues;
|
|
5
|
+
if (typeof window !== "undefined" && typeof window.performance !== "undefined") try {
|
|
6
|
+
const resourceRE = /^https?:\/\/([^/]+)(\/api\/(?:unstable|2\d{3}-\d{2})\/graphql\.json(?=$|\?))?/;
|
|
7
|
+
const entries = performance.getEntriesByType("resource");
|
|
8
|
+
let matchedValues;
|
|
9
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
10
|
+
const entry = entries[i];
|
|
11
|
+
if (entry.initiatorType !== "fetch") continue;
|
|
12
|
+
const currentHost = window.location.host;
|
|
13
|
+
const match = entry.name.match(resourceRE);
|
|
14
|
+
if (!match) continue;
|
|
15
|
+
const [, matchedHost, sfapiPath] = match;
|
|
16
|
+
if (matchedHost === currentHost || sfapiPath && matchedHost?.endsWith(`.${currentHost}`)) {
|
|
17
|
+
const values = extractFromPerformanceEntry(entry);
|
|
18
|
+
if (values) {
|
|
19
|
+
matchedValues = values;
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (matchedValues) trackingValues = matchedValues;
|
|
25
|
+
if (trackingValues) cachedTrackingValues.current = trackingValues;
|
|
26
|
+
else if (cachedTrackingValues.current) trackingValues = cachedTrackingValues.current;
|
|
27
|
+
if (!trackingValues) {
|
|
28
|
+
const navigationEntries = performance.getEntriesByType("navigation")[0];
|
|
29
|
+
trackingValues = extractFromPerformanceEntry(navigationEntries, false);
|
|
30
|
+
}
|
|
31
|
+
} catch {}
|
|
32
|
+
if (!trackingValues) {
|
|
33
|
+
const cookie = typeof document !== "undefined" ? document.cookie : "";
|
|
34
|
+
trackingValues = {
|
|
35
|
+
uniqueToken: cookie.match(/\b_shopify_y=([^;]+)/)?.[1] || "",
|
|
36
|
+
visitToken: cookie.match(/\b_shopify_s=([^;]+)/)?.[1] || "",
|
|
37
|
+
consent: cookie.match(/\b_tracking_consent=([^;]+)/)?.[1] || ""
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return trackingValues;
|
|
41
|
+
}
|
|
42
|
+
function extractFromPerformanceEntry(entry, isConsentRequired = true) {
|
|
43
|
+
let uniqueToken = "";
|
|
44
|
+
let visitToken = "";
|
|
45
|
+
let consent = "";
|
|
46
|
+
const serverTiming = entry.serverTiming;
|
|
47
|
+
const minimumEntries = isConsentRequired ? 3 : 2;
|
|
48
|
+
if (serverTiming && serverTiming.length >= minimumEntries) for (let i = serverTiming.length - 1; i >= 0; i--) {
|
|
49
|
+
const { name, description } = serverTiming[i];
|
|
50
|
+
if (!name || !description) continue;
|
|
51
|
+
if (name === "_y") uniqueToken = description;
|
|
52
|
+
else if (name === "_s") visitToken = description;
|
|
53
|
+
else if (name === "_cmp") consent = description;
|
|
54
|
+
if (uniqueToken && visitToken && consent) break;
|
|
55
|
+
}
|
|
56
|
+
return uniqueToken && visitToken && (isConsentRequired ? consent : true) ? {
|
|
57
|
+
uniqueToken,
|
|
58
|
+
visitToken,
|
|
59
|
+
consent
|
|
60
|
+
} : void 0;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
//#endregion
|
|
64
|
+
export { getTrackingValues };
|
|
65
|
+
//# sourceMappingURL=tracking-values.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracking-values.mjs","names":[],"sources":["../../../../src/core/shopify-scripts/utils/tracking-values.ts"],"sourcesContent":["/**\n * Inlined from @shopify/hydrogen-react/tracking-utils.\n * Retrieves user session tracking values from Server-Timing headers\n * and the Performance API.\n */\n\ntype TrackingValues = {\n uniqueToken: string;\n visitToken: string;\n consent: string;\n};\n\nconst cachedTrackingValues: { current: null | TrackingValues } = { current: null };\n\nexport function getTrackingValues(): TrackingValues {\n // Tracking values are returned in Server-Timing headers from SFAPI responses.\n // Prefer recent fetch/resource entries, then cached values, then the initial\n // navigation entry, and finally the deprecated JS-visible cookies.\n let trackingValues: TrackingValues | undefined;\n\n if (typeof window !== \"undefined\" && typeof window.performance !== \"undefined\") {\n try {\n // Extract host and optionally match the SFAPI GraphQL pathname.\n const resourceRE =\n /^https?:\\/\\/([^/]+)(\\/api\\/(?:unstable|2\\d{3}-\\d{2})\\/graphql\\.json(?=$|\\?))?/;\n\n // Search backwards so the latest matching fetch with complete tracking\n // values wins. Same-origin fetches cover Hydrogen proxy/server responses;\n // subdomain SFAPI requests cover direct Storefront API calls.\n const entries = performance.getEntriesByType(\"resource\") as PerformanceResourceTiming[];\n\n let matchedValues: TrackingValues | undefined;\n\n for (let i = entries.length - 1; i >= 0; i--) {\n const entry = entries[i];\n if (entry.initiatorType !== \"fetch\") continue;\n\n const currentHost = window.location.host;\n const match = entry.name.match(resourceRE);\n if (!match) continue;\n\n const [, matchedHost, sfapiPath] = match;\n const isMatch =\n matchedHost === currentHost || (sfapiPath && matchedHost?.endsWith(`.${currentHost}`));\n\n if (isMatch) {\n const values = extractFromPerformanceEntry(entry);\n if (values) {\n matchedValues = values;\n break;\n }\n }\n }\n\n if (matchedValues) {\n trackingValues = matchedValues;\n }\n\n // Resource entries have a limited buffer and can be removed over time.\n // A cached resource entry is newer than the navigation entry.\n if (trackingValues) {\n cachedTrackingValues.current = trackingValues;\n } else if (cachedTrackingValues.current) {\n trackingValues = cachedTrackingValues.current;\n }\n\n if (!trackingValues) {\n // The document navigation entry can omit _cmp when the server generated\n // tracking tokens, so only _y and _s are required for this fallback.\n const navigationEntries = performance.getEntriesByType(\n \"navigation\",\n )[0] as PerformanceNavigationTiming;\n trackingValues = extractFromPerformanceEntry(navigationEntries, false);\n }\n } catch {}\n }\n\n if (!trackingValues) {\n const cookie = typeof document !== \"undefined\" ? document.cookie : \"\";\n\n trackingValues = {\n uniqueToken: cookie.match(/\\b_shopify_y=([^;]+)/)?.[1] || \"\",\n visitToken: cookie.match(/\\b_shopify_s=([^;]+)/)?.[1] || \"\",\n consent: cookie.match(/\\b_tracking_consent=([^;]+)/)?.[1] || \"\",\n };\n }\n\n return trackingValues;\n}\n\nfunction extractFromPerformanceEntry(\n entry: PerformanceNavigationTiming | PerformanceResourceTiming,\n isConsentRequired = true,\n): TrackingValues | undefined {\n let uniqueToken = \"\";\n let visitToken = \"\";\n let consent = \"\";\n\n const serverTiming = entry.serverTiming;\n const minimumEntries = isConsentRequired ? 3 : 2;\n if (serverTiming && serverTiming.length >= minimumEntries) {\n // Iterate backwards since Shopify tracking metrics are usually appended\n // after framework/server metrics.\n for (let i = serverTiming.length - 1; i >= 0; i--) {\n const { name, description } = serverTiming[i];\n if (!name || !description) continue;\n\n if (name === \"_y\") uniqueToken = description;\n else if (name === \"_s\") visitToken = description;\n else if (name === \"_cmp\") {\n // Consent value used by consent-tracking-api and privacy-banner scripts.\n consent = description;\n }\n\n if (uniqueToken && visitToken && consent) break;\n }\n }\n\n return uniqueToken && visitToken && (isConsentRequired ? consent : true)\n ? { uniqueToken, visitToken, consent }\n : undefined;\n}\n"],"mappings":";AAYA,MAAM,uBAA2D,EAAE,SAAS,MAAM;AAElF,SAAgB,oBAAoC;CAIlD,IAAI;AAEJ,KAAI,OAAO,WAAW,eAAe,OAAO,OAAO,gBAAgB,YACjE,KAAI;EAEF,MAAM,aACJ;EAKF,MAAM,UAAU,YAAY,iBAAiB,WAAW;EAExD,IAAI;AAEJ,OAAK,IAAI,IAAI,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;GAC5C,MAAM,QAAQ,QAAQ;AACtB,OAAI,MAAM,kBAAkB,QAAS;GAErC,MAAM,cAAc,OAAO,SAAS;GACpC,MAAM,QAAQ,MAAM,KAAK,MAAM,WAAW;AAC1C,OAAI,CAAC,MAAO;GAEZ,MAAM,GAAG,aAAa,aAAa;AAInC,OAFE,gBAAgB,eAAgB,aAAa,aAAa,SAAS,IAAI,cAAc,EAE1E;IACX,MAAM,SAAS,4BAA4B,MAAM;AACjD,QAAI,QAAQ;AACV,qBAAgB;AAChB;;;;AAKN,MAAI,cACF,kBAAiB;AAKnB,MAAI,eACF,sBAAqB,UAAU;WACtB,qBAAqB,QAC9B,kBAAiB,qBAAqB;AAGxC,MAAI,CAAC,gBAAgB;GAGnB,MAAM,oBAAoB,YAAY,iBACpC,aACD,CAAC;AACF,oBAAiB,4BAA4B,mBAAmB,MAAM;;SAElE;AAGV,KAAI,CAAC,gBAAgB;EACnB,MAAM,SAAS,OAAO,aAAa,cAAc,SAAS,SAAS;AAEnE,mBAAiB;GACf,aAAa,OAAO,MAAM,uBAAuB,GAAG,MAAM;GAC1D,YAAY,OAAO,MAAM,uBAAuB,GAAG,MAAM;GACzD,SAAS,OAAO,MAAM,8BAA8B,GAAG,MAAM;GAC9D;;AAGH,QAAO;;AAGT,SAAS,4BACP,OACA,oBAAoB,MACQ;CAC5B,IAAI,cAAc;CAClB,IAAI,aAAa;CACjB,IAAI,UAAU;CAEd,MAAM,eAAe,MAAM;CAC3B,MAAM,iBAAiB,oBAAoB,IAAI;AAC/C,KAAI,gBAAgB,aAAa,UAAU,eAGzC,MAAK,IAAI,IAAI,aAAa,SAAS,GAAG,KAAK,GAAG,KAAK;EACjD,MAAM,EAAE,MAAM,gBAAgB,aAAa;AAC3C,MAAI,CAAC,QAAQ,CAAC,YAAa;AAE3B,MAAI,SAAS,KAAM,eAAc;WACxB,SAAS,KAAM,cAAa;WAC5B,SAAS,OAEhB,WAAU;AAGZ,MAAI,eAAe,cAAc,QAAS;;AAI9C,QAAO,eAAe,eAAe,oBAAoB,UAAU,QAC/D;EAAE;EAAa;EAAY;EAAS,GACpC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//#region src/core/shopify-scripts/utils/uuid.ts
|
|
2
|
+
/**
|
|
3
|
+
* Inlined from @shopify/hydrogen-react/analytics-utils.
|
|
4
|
+
* UUID v4 generator for analytics event IDs.
|
|
5
|
+
*/
|
|
6
|
+
const UUID_V4_REPLACE_REGEX = /[018]/g;
|
|
7
|
+
const CRYPTO_RANDOM_VALUES_ARRAY = new Uint8Array(1);
|
|
8
|
+
function buildUUID() {
|
|
9
|
+
return "10000000-1000-4000-8000-100000000000".replace(UUID_V4_REPLACE_REGEX, (c) => {
|
|
10
|
+
const randomValue = crypto.getRandomValues(CRYPTO_RANDOM_VALUES_ARRAY)[0];
|
|
11
|
+
return (+c ^ randomValue & 15 >> +c / 4).toString(16);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
//#endregion
|
|
16
|
+
export { buildUUID };
|
|
17
|
+
//# sourceMappingURL=uuid.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.mjs","names":[],"sources":["../../../../src/core/shopify-scripts/utils/uuid.ts"],"sourcesContent":["/**\n * Inlined from @shopify/hydrogen-react/analytics-utils.\n * UUID v4 generator for analytics event IDs.\n */\n\nconst UUID_V4_REPLACE_REGEX = /[018]/g;\nconst CRYPTO_RANDOM_VALUES_ARRAY = new Uint8Array(1);\n\nexport function buildUUID(): string {\n return \"10000000-1000-4000-8000-100000000000\".replace(UUID_V4_REPLACE_REGEX, (c) => {\n const randomValue = crypto.getRandomValues(CRYPTO_RANDOM_VALUES_ARRAY)[0];\n return (+c ^ (randomValue & (15 >> (+c / 4)))).toString(16);\n });\n}\n"],"mappings":";;;;;AAKA,MAAM,wBAAwB;AAC9B,MAAM,6BAA6B,IAAI,WAAW,EAAE;AAEpD,SAAgB,YAAoB;AAClC,QAAO,uCAAuC,QAAQ,wBAAwB,MAAM;EAClF,MAAM,cAAc,OAAO,gBAAgB,2BAA2B,CAAC;AACvE,UAAQ,CAAC,IAAK,cAAe,MAAO,CAAC,IAAI,GAAM,SAAS,GAAG;GAC3D"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { getLogger } from "../logging/logging.mjs";
|
|
2
|
+
import { SHOPIFY_STOREFRONT_WEBMCP_SCRIPT } from "./constants.mjs";
|
|
3
|
+
import { loadScript } from "../utils/load-script.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/core/shopify-scripts/webmcp.ts
|
|
6
|
+
const log = getLogger("webmcp");
|
|
7
|
+
function loadShopifyWebMcpTools() {
|
|
8
|
+
if (typeof document !== "undefined" && "modelContext" in document || typeof navigator !== "undefined" && "modelContext" in navigator) return loadScript(SHOPIFY_STOREFRONT_WEBMCP_SCRIPT, {
|
|
9
|
+
in: "head",
|
|
10
|
+
attributes: {
|
|
11
|
+
id: "shopify-webmcp",
|
|
12
|
+
crossorigin: "anonymous"
|
|
13
|
+
}
|
|
14
|
+
}).catch((error) => {
|
|
15
|
+
log.warn("failed to load Shopify WebMCP", { error });
|
|
16
|
+
});
|
|
17
|
+
return Promise.resolve();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
//#endregion
|
|
21
|
+
export { loadShopifyWebMcpTools };
|
|
22
|
+
//# sourceMappingURL=webmcp.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webmcp.mjs","names":[],"sources":["../../../src/core/shopify-scripts/webmcp.ts"],"sourcesContent":["import { getLogger } from \"../logging\";\nimport { loadScript } from \"../utils/load-script\";\nimport { SHOPIFY_STOREFRONT_WEBMCP_SCRIPT } from \"./constants\";\n\nconst log = getLogger(\"webmcp\");\n\nexport function loadShopifyWebMcpTools(): Promise<boolean | void> {\n if (\n (typeof document !== \"undefined\" && \"modelContext\" in document) ||\n (typeof navigator !== \"undefined\" && \"modelContext\" in navigator)\n ) {\n return loadScript(SHOPIFY_STOREFRONT_WEBMCP_SCRIPT, {\n in: \"head\",\n attributes: { id: \"shopify-webmcp\", crossorigin: \"anonymous\" },\n }).catch((error) => {\n log.warn(\"failed to load Shopify WebMCP\", { error });\n });\n }\n\n return Promise.resolve();\n}\n"],"mappings":";;;;;AAIA,MAAM,MAAM,UAAU,SAAS;AAE/B,SAAgB,yBAAkD;AAChE,KACG,OAAO,aAAa,eAAe,kBAAkB,YACrD,OAAO,cAAc,eAAe,kBAAkB,UAEvD,QAAO,WAAW,kCAAkC;EAClD,IAAI;EACJ,YAAY;GAAE,IAAI;GAAkB,aAAa;GAAa;EAC/D,CAAC,CAAC,OAAO,UAAU;AAClB,MAAI,KAAK,iCAAiC,EAAE,OAAO,CAAC;GACpD;AAGJ,QAAO,QAAQ,SAAS"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ShopifyRouteTemplates } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/standard-routes/build.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Creates a typed map of custom route templates for Shopify standard storefront routes.
|
|
6
|
+
*
|
|
7
|
+
* Use the returned object anywhere Hydrogen needs to understand the app's URL shape for
|
|
8
|
+
* Shopify resources and utility pages: `handleShopifyRedirects({routeTemplates})`, `ShopifyScripts`
|
|
9
|
+
* `routes={routeTemplates}`, and predictive search URL helpers.
|
|
10
|
+
*
|
|
11
|
+
* Each key represents a Shopify standard route identity, while each value is the app's custom
|
|
12
|
+
* pathname template. Templates must start with `/` and include the required named handle
|
|
13
|
+
* placeholders for routes that identify a resource. Do not include an i18n path prefix in the
|
|
14
|
+
* template; Hydrogen applies `i18n.pathPrefix` separately when resolving routes. Pass an empty
|
|
15
|
+
* object when the app uses standard storefront routes so there is still one app-owned routing
|
|
16
|
+
* manifest to update if routes change later. When matching the current page, standard storefront
|
|
17
|
+
* routes retain their page-template identities even if a configured template resolves another
|
|
18
|
+
* route to the same pathname.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* const routeTemplates = createShopifyRouteTemplates({
|
|
23
|
+
* product: "/p/:productHandle",
|
|
24
|
+
* collection: "/c/:collectionHandle",
|
|
25
|
+
* article: "/journal/:blogHandle/:articleHandle",
|
|
26
|
+
* cart: "/basket",
|
|
27
|
+
* policy: "/legal/:policyHandle",
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
declare function createShopifyRouteTemplates<const TRoutes extends ShopifyRouteTemplates>(routes: TRoutes): TRoutes;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { createShopifyRouteTemplates };
|
|
34
|
+
//# sourceMappingURL=build.d.mts.map
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { DEFAULT_STANDARD_ROUTES, isStandardRouteParamName } from "./defaults.mjs";
|
|
2
|
+
import { prependPathPrefix } from "./path.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/core/standard-routes/build.ts
|
|
5
|
+
/**
|
|
6
|
+
* Creates a typed map of custom route templates for Shopify standard storefront routes.
|
|
7
|
+
*
|
|
8
|
+
* Use the returned object anywhere Hydrogen needs to understand the app's URL shape for
|
|
9
|
+
* Shopify resources and utility pages: `handleShopifyRedirects({routeTemplates})`, `ShopifyScripts`
|
|
10
|
+
* `routes={routeTemplates}`, and predictive search URL helpers.
|
|
11
|
+
*
|
|
12
|
+
* Each key represents a Shopify standard route identity, while each value is the app's custom
|
|
13
|
+
* pathname template. Templates must start with `/` and include the required named handle
|
|
14
|
+
* placeholders for routes that identify a resource. Do not include an i18n path prefix in the
|
|
15
|
+
* template; Hydrogen applies `i18n.pathPrefix` separately when resolving routes. Pass an empty
|
|
16
|
+
* object when the app uses standard storefront routes so there is still one app-owned routing
|
|
17
|
+
* manifest to update if routes change later. When matching the current page, standard storefront
|
|
18
|
+
* routes retain their page-template identities even if a configured template resolves another
|
|
19
|
+
* route to the same pathname.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* const routeTemplates = createShopifyRouteTemplates({
|
|
24
|
+
* product: "/p/:productHandle",
|
|
25
|
+
* collection: "/c/:collectionHandle",
|
|
26
|
+
* article: "/journal/:blogHandle/:articleHandle",
|
|
27
|
+
* cart: "/basket",
|
|
28
|
+
* policy: "/legal/:policyHandle",
|
|
29
|
+
* });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
function createShopifyRouteTemplates(routes) {
|
|
33
|
+
return routes;
|
|
34
|
+
}
|
|
35
|
+
function getStandardRoute(routeTemplates, route, params, options = {}) {
|
|
36
|
+
return buildStandardRouteTarget(routeTemplates[route] ?? DEFAULT_STANDARD_ROUTES[route][0], params, options.pathPrefix);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Builds a pathname from a route template, handle params, and optional i18n path prefix.
|
|
40
|
+
*/
|
|
41
|
+
function buildStandardRouteTarget(template, params, pathPrefix) {
|
|
42
|
+
return prependPathPrefix(interpolateRouteTemplate(template, params), pathPrefix);
|
|
43
|
+
}
|
|
44
|
+
function interpolateRouteTemplate(template, params) {
|
|
45
|
+
return template.replace(/:([A-Za-z][A-Za-z0-9_]*)/g, (placeholder, name) => {
|
|
46
|
+
if (!isStandardRouteParamName(name)) return placeholder;
|
|
47
|
+
const value = params[name];
|
|
48
|
+
return value === void 0 ? placeholder : encodeURIComponent(value);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
//#endregion
|
|
53
|
+
export { buildStandardRouteTarget, createShopifyRouteTemplates, getStandardRoute };
|
|
54
|
+
//# sourceMappingURL=build.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.mjs","names":[],"sources":["../../../src/core/standard-routes/build.ts"],"sourcesContent":["import { DEFAULT_STANDARD_ROUTES, isStandardRouteParamName } from \"./defaults\";\nimport { prependPathPrefix } from \"./path\";\nimport type {\n ShopifyRouteTemplates,\n StandardRouteName,\n StandardRouteOptions,\n StandardRouteParams,\n StandardRouteParamsByName,\n} from \"./types\";\n\n/**\n * Creates a typed map of custom route templates for Shopify standard storefront routes.\n *\n * Use the returned object anywhere Hydrogen needs to understand the app's URL shape for\n * Shopify resources and utility pages: `handleShopifyRedirects({routeTemplates})`, `ShopifyScripts`\n * `routes={routeTemplates}`, and predictive search URL helpers.\n *\n * Each key represents a Shopify standard route identity, while each value is the app's custom\n * pathname template. Templates must start with `/` and include the required named handle\n * placeholders for routes that identify a resource. Do not include an i18n path prefix in the\n * template; Hydrogen applies `i18n.pathPrefix` separately when resolving routes. Pass an empty\n * object when the app uses standard storefront routes so there is still one app-owned routing\n * manifest to update if routes change later. When matching the current page, standard storefront\n * routes retain their page-template identities even if a configured template resolves another\n * route to the same pathname.\n *\n * @example\n * ```ts\n * const routeTemplates = createShopifyRouteTemplates({\n * product: \"/p/:productHandle\",\n * collection: \"/c/:collectionHandle\",\n * article: \"/journal/:blogHandle/:articleHandle\",\n * cart: \"/basket\",\n * policy: \"/legal/:policyHandle\",\n * });\n * ```\n */\nexport function createShopifyRouteTemplates<const TRoutes extends ShopifyRouteTemplates>(\n routes: TRoutes,\n): TRoutes {\n return routes;\n}\n\nexport function getStandardRoute<const TRoute extends StandardRouteName>(\n routeTemplates: ShopifyRouteTemplates,\n route: TRoute,\n params: StandardRouteParamsByName[TRoute],\n options: StandardRouteOptions = {},\n): string {\n const target = routeTemplates[route] ?? DEFAULT_STANDARD_ROUTES[route][0];\n\n return buildStandardRouteTarget(target, params, options.pathPrefix);\n}\n\n/**\n * Builds a pathname from a route template, handle params, and optional i18n path prefix.\n */\nexport function buildStandardRouteTarget(\n template: string,\n params: StandardRouteParams,\n pathPrefix: string | undefined,\n): string {\n return prependPathPrefix(interpolateRouteTemplate(template, params), pathPrefix);\n}\n\nfunction interpolateRouteTemplate(template: string, params: StandardRouteParams): string {\n return template.replace(/:([A-Za-z][A-Za-z0-9_]*)/g, (placeholder, name: string) => {\n if (!isStandardRouteParamName(name)) return placeholder;\n\n const value = params[name];\n return value === undefined ? placeholder : encodeURIComponent(value);\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,SAAgB,4BACd,QACS;AACT,QAAO;;AAGT,SAAgB,iBACd,gBACA,OACA,QACA,UAAgC,EAAE,EAC1B;AAGR,QAAO,yBAFQ,eAAe,UAAU,wBAAwB,OAAO,IAE/B,QAAQ,QAAQ,WAAW;;;;;AAMrE,SAAgB,yBACd,UACA,QACA,YACQ;AACR,QAAO,kBAAkB,yBAAyB,UAAU,OAAO,EAAE,WAAW;;AAGlF,SAAS,yBAAyB,UAAkB,QAAqC;AACvF,QAAO,SAAS,QAAQ,8BAA8B,aAAa,SAAiB;AAClF,MAAI,CAAC,yBAAyB,KAAK,CAAE,QAAO;EAE5C,MAAM,QAAQ,OAAO;AACrB,SAAO,UAAU,SAAY,cAAc,mBAAmB,MAAM;GACpE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//#region src/core/standard-routes/defaults.ts
|
|
2
|
+
const STANDARD_ROUTE_PARAM_NAMES = [
|
|
3
|
+
"articleHandle",
|
|
4
|
+
"blogHandle",
|
|
5
|
+
"collectionHandle",
|
|
6
|
+
"pageHandle",
|
|
7
|
+
"policyHandle",
|
|
8
|
+
"productHandle"
|
|
9
|
+
];
|
|
10
|
+
const DEFAULT_STANDARD_ROUTES = {
|
|
11
|
+
product: ["/products/:productHandle"],
|
|
12
|
+
collection: ["/collections/:collectionHandle"],
|
|
13
|
+
collectionList: ["/collections", "/products"],
|
|
14
|
+
page: ["/pages/:pageHandle"],
|
|
15
|
+
policy: ["/policies/:policyHandle"],
|
|
16
|
+
blog: ["/blogs/:blogHandle"],
|
|
17
|
+
article: ["/blogs/:blogHandle/:articleHandle"],
|
|
18
|
+
productInCollection: ["/collections/:collectionHandle/products/:productHandle"],
|
|
19
|
+
cart: ["/cart"],
|
|
20
|
+
search: ["/search"]
|
|
21
|
+
};
|
|
22
|
+
function isStandardRouteParamName(name) {
|
|
23
|
+
return STANDARD_ROUTE_PARAM_NAMES.some((paramName) => paramName === name);
|
|
24
|
+
}
|
|
25
|
+
function isStandardRouteName(name) {
|
|
26
|
+
return Object.hasOwn(DEFAULT_STANDARD_ROUTES, name);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
//#endregion
|
|
30
|
+
export { DEFAULT_STANDARD_ROUTES, isStandardRouteName, isStandardRouteParamName };
|
|
31
|
+
//# sourceMappingURL=defaults.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.mjs","names":[],"sources":["../../../src/core/standard-routes/defaults.ts"],"sourcesContent":["import type { ShopifyRouteTemplates, StandardRouteName, StandardRouteParamName } from \"./types\";\n\ntype DefaultStandardRoutes = {\n [Route in StandardRouteName]: readonly [\n NonNullable<ShopifyRouteTemplates[Route]>,\n ...NonNullable<ShopifyRouteTemplates[Route]>[],\n ];\n};\n\nconst STANDARD_ROUTE_PARAM_NAMES = [\n \"articleHandle\",\n \"blogHandle\",\n \"collectionHandle\",\n \"pageHandle\",\n \"policyHandle\",\n \"productHandle\",\n] as const satisfies readonly StandardRouteParamName[];\n\nexport const DEFAULT_STANDARD_ROUTES = {\n product: [\"/products/:productHandle\"],\n collection: [\"/collections/:collectionHandle\"],\n collectionList: [\"/collections\", \"/products\"],\n page: [\"/pages/:pageHandle\"],\n policy: [\"/policies/:policyHandle\"],\n blog: [\"/blogs/:blogHandle\"],\n article: [\"/blogs/:blogHandle/:articleHandle\"],\n productInCollection: [\"/collections/:collectionHandle/products/:productHandle\"],\n cart: [\"/cart\"],\n search: [\"/search\"],\n} as const satisfies DefaultStandardRoutes;\n\nexport function isStandardRouteParamName(name: string): name is StandardRouteParamName {\n return STANDARD_ROUTE_PARAM_NAMES.some((paramName) => paramName === name);\n}\n\nexport function isStandardRouteName(name: string): name is StandardRouteName {\n return Object.hasOwn(DEFAULT_STANDARD_ROUTES, name);\n}\n"],"mappings":";AASA,MAAM,6BAA6B;CACjC;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,0BAA0B;CACrC,SAAS,CAAC,2BAA2B;CACrC,YAAY,CAAC,iCAAiC;CAC9C,gBAAgB,CAAC,gBAAgB,YAAY;CAC7C,MAAM,CAAC,qBAAqB;CAC5B,QAAQ,CAAC,0BAA0B;CACnC,MAAM,CAAC,qBAAqB;CAC5B,SAAS,CAAC,oCAAoC;CAC9C,qBAAqB,CAAC,yDAAyD;CAC/E,MAAM,CAAC,QAAQ;CACf,QAAQ,CAAC,UAAU;CACpB;AAED,SAAgB,yBAAyB,MAA8C;AACrF,QAAO,2BAA2B,MAAM,cAAc,cAAc,KAAK;;AAG3E,SAAgB,oBAAoB,MAAyC;AAC3E,QAAO,OAAO,OAAO,yBAAyB,KAAK"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { DEFAULT_STANDARD_ROUTES, isStandardRouteName, isStandardRouteParamName } from "./defaults.mjs";
|
|
2
|
+
import { parseSameOriginUrl, stripI18nPathPrefix, stripTrailingSlash } from "./path.mjs";
|
|
3
|
+
import { buildStandardRouteTarget } from "./build.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/core/standard-routes/match.ts
|
|
6
|
+
/**
|
|
7
|
+
* Matches a URL against both configured app route templates and standard storefront routes.
|
|
8
|
+
*
|
|
9
|
+
* This powers browser current-page detection, where consumers need to recognize the standard
|
|
10
|
+
* Shopify resource represented by either a custom app URL like `/p/snowboard` or a standard URL
|
|
11
|
+
* like `/products/snowboard`. The root and standard storefront routes retain their page-template
|
|
12
|
+
* identities; configured templates identify otherwise non-standard app paths.
|
|
13
|
+
*/
|
|
14
|
+
function matchStandardRouteUrl({ baseUrl, pathPrefix, routeTemplates, url }) {
|
|
15
|
+
const parsedUrl = parseSameOriginUrl(url, baseUrl);
|
|
16
|
+
if (!parsedUrl) return null;
|
|
17
|
+
if (stripI18nPathPrefix(stripTrailingSlash(parsedUrl.pathname), pathPrefix) === "/") return addStandardRouteContext({
|
|
18
|
+
route: "index",
|
|
19
|
+
pageTemplateName: "index",
|
|
20
|
+
params: {}
|
|
21
|
+
}, pathPrefix, routeTemplates);
|
|
22
|
+
const match = matchStandardRouteTemplates(parsedUrl.pathname, pathPrefix, (route) => DEFAULT_STANDARD_ROUTES[route]) ?? matchStandardRouteTemplates(parsedUrl.pathname, pathPrefix, (route) => [routeTemplates[route]]);
|
|
23
|
+
return match ? addStandardRouteContext(match, pathPrefix, routeTemplates) : null;
|
|
24
|
+
}
|
|
25
|
+
function addStandardRouteContext(match, pathPrefix, routeTemplates) {
|
|
26
|
+
const standardTemplate = match.route === "index" ? "/" : DEFAULT_STANDARD_ROUTES[match.route][0];
|
|
27
|
+
const customTemplate = match.route === "index" ? standardTemplate : routeTemplates[match.route] ?? standardTemplate;
|
|
28
|
+
return {
|
|
29
|
+
...match,
|
|
30
|
+
standardPathname: buildStandardRouteTarget(standardTemplate, match.params, pathPrefix),
|
|
31
|
+
templates: {
|
|
32
|
+
standard: standardTemplate,
|
|
33
|
+
custom: customTemplate
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Iterates over known Shopify route names and tries the templates supplied by the caller.
|
|
39
|
+
*
|
|
40
|
+
* Different callers choose different template sets: redirects only match default Shopify templates
|
|
41
|
+
* for resources with custom app templates, while browser matching tries Shopify defaults before
|
|
42
|
+
* configured app templates.
|
|
43
|
+
*/
|
|
44
|
+
function matchStandardRouteTemplates(pathname, pathPrefix, getTemplatesForRoute) {
|
|
45
|
+
const normalizedPathname = stripI18nPathPrefix(stripTrailingSlash(pathname), pathPrefix);
|
|
46
|
+
for (const route in DEFAULT_STANDARD_ROUTES) {
|
|
47
|
+
if (!isStandardRouteName(route)) continue;
|
|
48
|
+
for (const template of getTemplatesForRoute(route)) {
|
|
49
|
+
if (!template) continue;
|
|
50
|
+
const match = matchRouteTemplate(normalizedPathname, template);
|
|
51
|
+
if (match) return {
|
|
52
|
+
route,
|
|
53
|
+
params: match,
|
|
54
|
+
pageTemplateName: normalizeStandardRouteTemplateName(route)
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
function normalizeStandardRouteTemplateName(route) {
|
|
61
|
+
if (route === "productInCollection") return "product";
|
|
62
|
+
if (route === "collectionList") return "list-collections";
|
|
63
|
+
return route;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Matches a normalized pathname against one route template and returns decoded handle params.
|
|
67
|
+
*/
|
|
68
|
+
function matchRouteTemplate(pathname, template) {
|
|
69
|
+
const match = templateToPattern(template).exec(pathname);
|
|
70
|
+
if (!match) return null;
|
|
71
|
+
const params = {};
|
|
72
|
+
for (const [name, value] of Object.entries(match.groups ?? {})) {
|
|
73
|
+
if (!isStandardRouteParamName(name)) continue;
|
|
74
|
+
params[name] = decodePathSegment(value);
|
|
75
|
+
}
|
|
76
|
+
return params;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Converts a route template into a regular expression with named capture groups.
|
|
80
|
+
*
|
|
81
|
+
* Static path text is escaped first so regex metacharacters in templates are treated literally.
|
|
82
|
+
* Then known placeholders such as `:productHandle` become segment-safe captures like
|
|
83
|
+
* `(?<productHandle>[^/]+)`.
|
|
84
|
+
*/
|
|
85
|
+
function templateToPattern(template) {
|
|
86
|
+
const source = escapeRegExp(stripTrailingSlash(template)).replace(/:([A-Za-z][A-Za-z0-9_]*)/g, (placeholder, name) => isStandardRouteParamName(name) ? `(?<${name}>[^/]+)` : placeholder);
|
|
87
|
+
return new RegExp(`^${source}$`);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Escapes regex metacharacters so template text can be embedded in a `RegExp` literally.
|
|
91
|
+
*
|
|
92
|
+
* For example, `/products/:productHandle.json` must match a literal `.json` suffix; without
|
|
93
|
+
* escaping, `.` would mean "any character" in the generated regex.
|
|
94
|
+
*/
|
|
95
|
+
function escapeRegExp(value) {
|
|
96
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
97
|
+
}
|
|
98
|
+
function decodePathSegment(segment) {
|
|
99
|
+
try {
|
|
100
|
+
return decodeURIComponent(segment);
|
|
101
|
+
} catch {
|
|
102
|
+
return segment;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
//#endregion
|
|
107
|
+
export { matchStandardRouteTemplates, matchStandardRouteUrl };
|
|
108
|
+
//# sourceMappingURL=match.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match.mjs","names":[],"sources":["../../../src/core/standard-routes/match.ts"],"sourcesContent":["import { buildStandardRouteTarget } from \"./build\";\nimport { DEFAULT_STANDARD_ROUTES, isStandardRouteName, isStandardRouteParamName } from \"./defaults\";\nimport { parseSameOriginUrl, stripI18nPathPrefix, stripTrailingSlash } from \"./path\";\nimport type {\n ShopifyRouteTemplates,\n ShopifyPageTemplateName,\n ShopifyStandardRouteMatch,\n ShopifyStandardRouteName,\n StandardRouteName,\n StandardRouteParams,\n} from \"./types\";\n\n/**\n * Matches a URL against both configured app route templates and standard storefront routes.\n *\n * This powers browser current-page detection, where consumers need to recognize the standard\n * Shopify resource represented by either a custom app URL like `/p/snowboard` or a standard URL\n * like `/products/snowboard`. The root and standard storefront routes retain their page-template\n * identities; configured templates identify otherwise non-standard app paths.\n */\nexport function matchStandardRouteUrl({\n baseUrl,\n pathPrefix,\n routeTemplates,\n url,\n}: {\n baseUrl?: string;\n pathPrefix?: string;\n routeTemplates: ShopifyRouteTemplates;\n url: string;\n}): ShopifyStandardRouteMatch | null {\n const parsedUrl = parseSameOriginUrl(url, baseUrl);\n if (!parsedUrl) return null;\n\n const pathname = stripI18nPathPrefix(stripTrailingSlash(parsedUrl.pathname), pathPrefix);\n if (pathname === \"/\") {\n return addStandardRouteContext(\n { route: \"index\", pageTemplateName: \"index\", params: {} },\n pathPrefix,\n routeTemplates,\n );\n }\n\n const match =\n matchStandardRouteTemplates(\n parsedUrl.pathname,\n pathPrefix,\n (route) => DEFAULT_STANDARD_ROUTES[route],\n ) ??\n matchStandardRouteTemplates(parsedUrl.pathname, pathPrefix, (route) => [routeTemplates[route]]);\n\n return match ? addStandardRouteContext(match, pathPrefix, routeTemplates) : null;\n}\n\nfunction addStandardRouteContext(\n match: Pick<ShopifyStandardRouteMatch, \"pageTemplateName\" | \"params\" | \"route\">,\n pathPrefix: string | undefined,\n routeTemplates: ShopifyRouteTemplates,\n): ShopifyStandardRouteMatch {\n const standardTemplate = match.route === \"index\" ? \"/\" : DEFAULT_STANDARD_ROUTES[match.route][0];\n const customTemplate =\n match.route === \"index\" ? standardTemplate : (routeTemplates[match.route] ?? standardTemplate);\n\n return {\n ...match,\n standardPathname: buildStandardRouteTarget(standardTemplate, match.params, pathPrefix),\n templates: {\n standard: standardTemplate,\n custom: customTemplate,\n },\n };\n}\n\n/**\n * Iterates over known Shopify route names and tries the templates supplied by the caller.\n *\n * Different callers choose different template sets: redirects only match default Shopify templates\n * for resources with custom app templates, while browser matching tries Shopify defaults before\n * configured app templates.\n */\nexport function matchStandardRouteTemplates(\n pathname: string,\n pathPrefix: string | undefined,\n getTemplatesForRoute: (route: StandardRouteName) => ReadonlyArray<string | undefined>,\n): Pick<\n ShopifyStandardRouteMatch<StandardRouteName>,\n \"pageTemplateName\" | \"params\" | \"route\"\n> | null {\n const normalizedPathname = stripI18nPathPrefix(stripTrailingSlash(pathname), pathPrefix);\n\n for (const route in DEFAULT_STANDARD_ROUTES) {\n if (!isStandardRouteName(route)) continue;\n\n for (const template of getTemplatesForRoute(route)) {\n if (!template) continue;\n\n const match = matchRouteTemplate(normalizedPathname, template);\n if (match) {\n return {\n route,\n params: match,\n pageTemplateName: normalizeStandardRouteTemplateName(route),\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Converts a standard route identity to the corresponding page template name.\n * Collection-scoped product URLs still render the `product` template, while\n * the collection-listing route uses the hyphenated `list-collections` name.\n */\nfunction normalizeStandardRouteTemplateName<TRoute extends ShopifyStandardRouteName>(\n route: TRoute,\n): ShopifyPageTemplateName<TRoute>;\nfunction normalizeStandardRouteTemplateName(\n route: ShopifyStandardRouteName,\n): ShopifyPageTemplateName {\n if (route === \"productInCollection\") return \"product\";\n if (route === \"collectionList\") return \"list-collections\";\n return route;\n}\n\n/**\n * Matches a normalized pathname against one route template and returns decoded handle params.\n */\nfunction matchRouteTemplate(pathname: string, template: string): StandardRouteParams | null {\n const match = templateToPattern(template).exec(pathname);\n if (!match) return null;\n\n const params: StandardRouteParams = {};\n for (const [name, value] of Object.entries(match.groups ?? {})) {\n if (!isStandardRouteParamName(name)) continue;\n\n params[name] = decodePathSegment(value);\n }\n\n return params;\n}\n\n/**\n * Converts a route template into a regular expression with named capture groups.\n *\n * Static path text is escaped first so regex metacharacters in templates are treated literally.\n * Then known placeholders such as `:productHandle` become segment-safe captures like\n * `(?<productHandle>[^/]+)`.\n */\nfunction templateToPattern(template: string): RegExp {\n const source = escapeRegExp(stripTrailingSlash(template)).replace(\n /:([A-Za-z][A-Za-z0-9_]*)/g,\n (placeholder, name: string) =>\n isStandardRouteParamName(name) ? `(?<${name}>[^/]+)` : placeholder,\n );\n\n return new RegExp(`^${source}$`);\n}\n\n/**\n * Escapes regex metacharacters so template text can be embedded in a `RegExp` literally.\n *\n * For example, `/products/:productHandle.json` must match a literal `.json` suffix; without\n * escaping, `.` would mean \"any character\" in the generated regex.\n */\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction decodePathSegment(segment: string): string {\n try {\n return decodeURIComponent(segment);\n } catch {\n return segment;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAoBA,SAAgB,sBAAsB,EACpC,SACA,YACA,gBACA,OAMmC;CACnC,MAAM,YAAY,mBAAmB,KAAK,QAAQ;AAClD,KAAI,CAAC,UAAW,QAAO;AAGvB,KADiB,oBAAoB,mBAAmB,UAAU,SAAS,EAAE,WACjE,KAAK,IACf,QAAO,wBACL;EAAE,OAAO;EAAS,kBAAkB;EAAS,QAAQ,EAAE;EAAE,EACzD,YACA,eACD;CAGH,MAAM,QACJ,4BACE,UAAU,UACV,aACC,UAAU,wBAAwB,OACpC,IACD,4BAA4B,UAAU,UAAU,aAAa,UAAU,CAAC,eAAe,OAAO,CAAC;AAEjG,QAAO,QAAQ,wBAAwB,OAAO,YAAY,eAAe,GAAG;;AAG9E,SAAS,wBACP,OACA,YACA,gBAC2B;CAC3B,MAAM,mBAAmB,MAAM,UAAU,UAAU,MAAM,wBAAwB,MAAM,OAAO;CAC9F,MAAM,iBACJ,MAAM,UAAU,UAAU,mBAAoB,eAAe,MAAM,UAAU;AAE/E,QAAO;EACL,GAAG;EACH,kBAAkB,yBAAyB,kBAAkB,MAAM,QAAQ,WAAW;EACtF,WAAW;GACT,UAAU;GACV,QAAQ;GACT;EACF;;;;;;;;;AAUH,SAAgB,4BACd,UACA,YACA,sBAIO;CACP,MAAM,qBAAqB,oBAAoB,mBAAmB,SAAS,EAAE,WAAW;AAExF,MAAK,MAAM,SAAS,yBAAyB;AAC3C,MAAI,CAAC,oBAAoB,MAAM,CAAE;AAEjC,OAAK,MAAM,YAAY,qBAAqB,MAAM,EAAE;AAClD,OAAI,CAAC,SAAU;GAEf,MAAM,QAAQ,mBAAmB,oBAAoB,SAAS;AAC9D,OAAI,MACF,QAAO;IACL;IACA,QAAQ;IACR,kBAAkB,mCAAmC,MAAM;IAC5D;;;AAKP,QAAO;;AAWT,SAAS,mCACP,OACyB;AACzB,KAAI,UAAU,sBAAuB,QAAO;AAC5C,KAAI,UAAU,iBAAkB,QAAO;AACvC,QAAO;;;;;AAMT,SAAS,mBAAmB,UAAkB,UAA8C;CAC1F,MAAM,QAAQ,kBAAkB,SAAS,CAAC,KAAK,SAAS;AACxD,KAAI,CAAC,MAAO,QAAO;CAEnB,MAAM,SAA8B,EAAE;AACtC,MAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,MAAM,UAAU,EAAE,CAAC,EAAE;AAC9D,MAAI,CAAC,yBAAyB,KAAK,CAAE;AAErC,SAAO,QAAQ,kBAAkB,MAAM;;AAGzC,QAAO;;;;;;;;;AAUT,SAAS,kBAAkB,UAA0B;CACnD,MAAM,SAAS,aAAa,mBAAmB,SAAS,CAAC,CAAC,QACxD,8BACC,aAAa,SACZ,yBAAyB,KAAK,GAAG,MAAM,KAAK,WAAW,YAC1D;AAED,QAAO,IAAI,OAAO,IAAI,OAAO,GAAG;;;;;;;;AASlC,SAAS,aAAa,OAAuB;AAC3C,QAAO,MAAM,QAAQ,uBAAuB,OAAO;;AAGrD,SAAS,kBAAkB,SAAyB;AAClD,KAAI;AACF,SAAO,mBAAmB,QAAQ;SAC5B;AACN,SAAO"}
|