@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,322 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hydrogen-storefront-client
|
|
3
|
+
description: >
|
|
4
|
+
Guide for @shopify/hydrogen — the type-safe Storefront API
|
|
5
|
+
GraphQL client. Use when writing, modifying, or reviewing code that
|
|
6
|
+
creates a storefront client, writes GraphQL queries with gql(), handles SFAPI errors,
|
|
7
|
+
or wires up storefront data fetching in any framework.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# `@shopify/hydrogen`
|
|
11
|
+
|
|
12
|
+
Type-safe GraphQL client for Shopify's Storefront API. Works anywhere you can call `fetch`.
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
import { createStorefrontClient, gql } from '@shopify/hydrogen'
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Environment Names
|
|
19
|
+
|
|
20
|
+
Use these canonical environment variable names in app code and docs:
|
|
21
|
+
|
|
22
|
+
- `PUBLIC_STORE_DOMAIN` for the Shopify store domain.
|
|
23
|
+
- `PUBLIC_STOREFRONT_API_TOKEN` for the public Storefront API token.
|
|
24
|
+
- `PRIVATE_STOREFRONT_API_TOKEN` for the private Storefront API token.
|
|
25
|
+
- `PUBLIC_STOREFRONT_ID` for analytics `storefrontId`; use `"0"` when the app does not have a storefront ID.
|
|
26
|
+
- `PUBLIC_CHECKOUT_DOMAIN` for app-level checkout-domain configuration such as CSP setup. Checkout links should come from cart data, usually `cart.checkoutUrl`.
|
|
27
|
+
|
|
28
|
+
If the framework requires a prefix to expose client-side variables, preserve the canonical suffix and add only that framework prefix. For example: `NEXT_PUBLIC_STORE_DOMAIN`, `VITE_PUBLIC_STORE_DOMAIN`, or `PUBLIC_STORE_DOMAIN` depending on the framework. Never expose `PRIVATE_STOREFRONT_API_TOKEN` to the client.
|
|
29
|
+
|
|
30
|
+
Environment variables are still a **server-side input boundary**. Do not read `process.env`, `import.meta.env`, or framework env modules from client components or modules imported by client components. Public-prefixed names mean a value is safe to serialize when needed; they are not permission to read env APIs in browser code. Browser UI should normally call same-origin Hydrogen endpoints/handlers. If a public value is genuinely needed in the browser, pass it from a server route/layout boundary as explicit data.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Picking a client type
|
|
35
|
+
|
|
36
|
+
`createStorefrontClient({type, requestContext, config})` takes a client type, a request context, and a client config object. Pick the type based on where the code runs, which token is safe there, and whether buyer context is available:
|
|
37
|
+
|
|
38
|
+
| Type | Access | Best for |
|
|
39
|
+
|------|--------|----------|
|
|
40
|
+
| `"public"` | Public token, or tokenless | Default scaffold; browser-side fetches; tokenless mock.shop |
|
|
41
|
+
| `"private"` | Private token with trusted `buyerIp` | SSR with buyer context |
|
|
42
|
+
| `"private_no_buyer_context"` | Private token without buyer context | Prerendering, background jobs, webhooks |
|
|
43
|
+
|
|
44
|
+
Default to a public client. `publicStorefrontToken` accepts `undefined`, which means tokenless access — there is no rate limit for tokenless clients, and it is all mock.shop supports. Always recommend a token-backed client (public or private) once the app targets a real store: token-based Storefront API access is required for product tags, metaobjects, metafields, menus, and customers. Public and private tokens can query the same token-required fields; the difference is whether the token is safe to expose and whether the request has trusted buyer context.
|
|
45
|
+
|
|
46
|
+
### Public client (default)
|
|
47
|
+
|
|
48
|
+
Wire `publicStorefrontToken` from the canonical env variable without asserting it exists. When `PUBLIC_STOREFRONT_API_TOKEN` is unset the client runs tokenless, so the same scaffold works against mock.shop before the user has tokens and upgrades in place when they add one. In env example files list the variable commented out (`# PUBLIC_STOREFRONT_API_TOKEN=`) rather than as an empty assignment: env loaders parse `PUBLIC_STOREFRONT_API_TOKEN=` as an empty string, and the client rejects empty tokens.
|
|
49
|
+
|
|
50
|
+
This example belongs in a server-only module unless the config values are explicitly passed into browser code by a server boundary.
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
import { createStorefrontClient, createShopifyRequestContext } from "@shopify/hydrogen";
|
|
54
|
+
|
|
55
|
+
const requestContext = createShopifyRequestContext({
|
|
56
|
+
request: { headers: new Headers() },
|
|
57
|
+
i18n: { country: "US", language: "EN" },
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const client = createStorefrontClient({
|
|
61
|
+
type: "public",
|
|
62
|
+
requestContext,
|
|
63
|
+
config: {
|
|
64
|
+
storeDomain: process.env.PUBLIC_STORE_DOMAIN!,
|
|
65
|
+
publicStorefrontToken: process.env.PUBLIC_STOREFRONT_API_TOKEN,
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Private client (SSR upgrade)
|
|
71
|
+
|
|
72
|
+
Use when the app has a private token and trusted buyer context. Requires `buyerIp` to forward trusted buyer context. Resolve request-derived values before creating the client:
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
import { createStorefrontClient, createShopifyRequestContext } from "@shopify/hydrogen";
|
|
76
|
+
|
|
77
|
+
function getBuyerIp(headers: Headers) {
|
|
78
|
+
const buyerIp = headers.get("oxygen-buyer-ip");
|
|
79
|
+
if (!buyerIp) throw new Error("oxygen-buyer-ip is required for private SFAPI clients");
|
|
80
|
+
return buyerIp;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const buyerIp = getBuyerIp(request.headers);
|
|
84
|
+
const requestContext = createShopifyRequestContext({
|
|
85
|
+
request,
|
|
86
|
+
i18n: getLocaleFromRequest(request),
|
|
87
|
+
buyerIp,
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
const client = createStorefrontClient({
|
|
91
|
+
type: "private",
|
|
92
|
+
requestContext,
|
|
93
|
+
config: {
|
|
94
|
+
storeDomain: process.env.PUBLIC_STORE_DOMAIN!,
|
|
95
|
+
privateStorefrontToken: process.env.PRIVATE_STOREFRONT_API_TOKEN!,
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Hydrogen does not infer buyer IP headers. Apps decide how to build `buyerIp` based on their deployment and trusted request data. Common provider defaults:
|
|
101
|
+
|
|
102
|
+
- Oxygen: `oxygen-buyer-ip`
|
|
103
|
+
- Cloudflare: `CF-Connecting-IP`
|
|
104
|
+
- Vercel: `x-forwarded-for`
|
|
105
|
+
- Fly.io: `Fly-Client-IP` (parse `X-Forwarded-For` only when another reverse proxy sits in front)
|
|
106
|
+
|
|
107
|
+
Use the same request-scoped Storefront client for Hydrogen route handlers, cart server handlers, and server data loaders when they share the same request data. Route, cart, and redirect handlers all accept any provided Storefront client.
|
|
108
|
+
|
|
109
|
+
When using `handleShopifyRoutes`, pass the trusted `buyerIp` into `createShopifyRequestContext`. Both the SFAPI proxy and direct `client.graphql()` calls source buyer identity from that request context.
|
|
110
|
+
|
|
111
|
+
### Private client without buyer context
|
|
112
|
+
|
|
113
|
+
For queries not on behalf of a specific buyer (pre-rendering, static site generation). No buyer IP is forwarded.
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
const requestContext = createShopifyRequestContext({
|
|
117
|
+
request: { headers: new Headers() },
|
|
118
|
+
i18n: { country: "US", language: "EN" },
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
const client = createStorefrontClient({
|
|
122
|
+
type: "private_no_buyer_context",
|
|
123
|
+
requestContext,
|
|
124
|
+
config: {
|
|
125
|
+
storeDomain: process.env.PUBLIC_STORE_DOMAIN!,
|
|
126
|
+
privateStorefrontToken: process.env.PRIVATE_STOREFRONT_API_TOKEN!,
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Writing queries with `gql`
|
|
134
|
+
|
|
135
|
+
`gql` is a pre-configured tag with baked-in SFAPI introspection. No codegen, no graphql-config — types are inferred at the type level from the query string.
|
|
136
|
+
|
|
137
|
+
Customer Account API documents use `gql` from `@shopify/hydrogen/customer-account` instead. Keep the two helpers separate so Storefront API documents and Customer Account API documents cannot be mixed.
|
|
138
|
+
|
|
139
|
+
```ts
|
|
140
|
+
const SHOP_QUERY = gql(`query { shop { name description } }`);
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Fragments compose via a second argument:
|
|
144
|
+
|
|
145
|
+
```ts
|
|
146
|
+
const PRODUCT_FIELDS = gql(`fragment ProductFields on Product { title handle }`);
|
|
147
|
+
const QUERY = gql(`query { products(first: 10) { nodes { ...ProductFields } } }`, [PRODUCT_FIELDS]);
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Predictive search fragments
|
|
151
|
+
|
|
152
|
+
When customizing predictive search, prefer Hydrogen's additive fragments instead of replacing the full query. This keeps base fields such as `trackingParameters`, handles, titles, images, and prices available to helpers and result links:
|
|
153
|
+
|
|
154
|
+
```ts
|
|
155
|
+
import { gql, makePredictiveSearchQueries } from "@shopify/hydrogen";
|
|
156
|
+
|
|
157
|
+
const queries = makePredictiveSearchQueries({
|
|
158
|
+
fragments: {
|
|
159
|
+
product: gql(`
|
|
160
|
+
fragment PredictiveSearchProductFragment on Product {
|
|
161
|
+
vendor
|
|
162
|
+
}
|
|
163
|
+
`),
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Use the fragments with `createPredictiveSearchServerHandlers({ fragments })`, or use the generated query with `queryPredictiveSearch()`. Read the predictive search skill when wiring autocomplete UI or result URLs.
|
|
169
|
+
|
|
170
|
+
### GraphQL type setup
|
|
171
|
+
|
|
172
|
+
When adding Storefront API `gql()` documents to a TypeScript app, add Hydrogen's packed TypeScript plugin to the app's `tsconfig.json`:
|
|
173
|
+
|
|
174
|
+
```jsonc
|
|
175
|
+
// tsconfig.json
|
|
176
|
+
{
|
|
177
|
+
"compilerOptions": {
|
|
178
|
+
"plugins": [
|
|
179
|
+
{
|
|
180
|
+
"name": "@shopify/hydrogen/ts-plugin"
|
|
181
|
+
}
|
|
182
|
+
]
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
If the app already has TypeScript plugins, append this plugin without removing framework plugins such as Next.js `name: "next"`. If the app's `tsconfig.json` extends a generated framework config, add `compilerOptions.plugins` in the extending `tsconfig.json`.
|
|
188
|
+
|
|
189
|
+
The plugin uses the Storefront and Customer Account API schemas shipped by `@shopify/hydrogen` and writes their generated environments at the project root.
|
|
190
|
+
|
|
191
|
+
Keep `gql(\`...\`)` calls in server/route modules, not client/browser files or barrel files (e.g. an `index.ts` that re-exports everything). Bundlers can't tell whether a `gql()` call has side effects, so any `gql()` reachable from browser code gets bundled into the browser.
|
|
192
|
+
|
|
193
|
+
If the app also authors Customer Account API documents, use `@shopify/hydrogen/customer-account`; the same plugin validates both APIs.
|
|
194
|
+
|
|
195
|
+
This plugin provides inline GraphQL autocompletion, validation, and hover docs inside `gql()` calls. The editor must be configured to use the workspace TypeScript version (not the bundled one) — the bundled TS server does not load plugins.
|
|
196
|
+
|
|
197
|
+
### Headless query validation
|
|
198
|
+
|
|
199
|
+
Read `references/query-validation.md` when adding or changing `gql()` documents. The editor plugin does not run during `tsc`; add `hydrogen gql check` to a package script and run that script so invalid Storefront API fields fail in CI instead of surfacing as runtime GraphQL errors.
|
|
200
|
+
|
|
201
|
+
### Typing query and fragment results
|
|
202
|
+
|
|
203
|
+
`gql()` returns a **branded query string**, not a `gql.tada` document. Derive result and variable types from the `StorefrontApi` namespace exported by `@shopify/hydrogen`:
|
|
204
|
+
|
|
205
|
+
```ts
|
|
206
|
+
import { gql, type StorefrontApi } from "@shopify/hydrogen";
|
|
207
|
+
|
|
208
|
+
const SHOP_QUERY = gql(`query { shop { name } }`);
|
|
209
|
+
type ShopResult = StorefrontApi.ResultOf<typeof SHOP_QUERY>;
|
|
210
|
+
type ShopVars = StorefrontApi.VariablesOf<typeof SHOP_QUERY>;
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Because `gql()` is a branded string and not a `gql.tada` document, `gql.tada`'s `FragmentOf` does **not** apply (it will not compile). To get a standalone fragment's result type, compose it into a throwaway shape query and read `ResultOf` off that:
|
|
214
|
+
|
|
215
|
+
```ts
|
|
216
|
+
const PRODUCT_CARD = gql(`fragment ProductCard on Product { handle title }`);
|
|
217
|
+
const PRODUCT_CARD_SHAPE = gql(
|
|
218
|
+
`query { products(first: 1) { nodes { ...ProductCard } } }`,
|
|
219
|
+
[PRODUCT_CARD],
|
|
220
|
+
);
|
|
221
|
+
export type ProductCardData =
|
|
222
|
+
StorefrontApi.ResultOf<typeof PRODUCT_CARD_SHAPE>["products"]["nodes"][number];
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Fetching data
|
|
228
|
+
|
|
229
|
+
### Variables and i18n auto-injection
|
|
230
|
+
|
|
231
|
+
`$country` and `$language` variables are auto-injected from `requestContext.i18n` when declared in the query. Static clients still create a request context, usually with empty headers plus the resolved locale. You only pass the variables you own:
|
|
232
|
+
|
|
233
|
+
```ts
|
|
234
|
+
const PRODUCTS = gql(`
|
|
235
|
+
query Products($handle: String!, $country: CountryCode, $language: LanguageCode)
|
|
236
|
+
@inContext(country: $country, language: $language) {
|
|
237
|
+
collection(handle: $handle) { products(first: 10) { nodes { title } } }
|
|
238
|
+
}
|
|
239
|
+
`);
|
|
240
|
+
|
|
241
|
+
const { data } = await client.graphql(PRODUCTS, {
|
|
242
|
+
variables: { handle: "summer-sale" },
|
|
243
|
+
});
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
User-provided values take precedence over auto-injected ones.
|
|
247
|
+
|
|
248
|
+
### Request state storage
|
|
249
|
+
|
|
250
|
+
`requestContext` is passed at client creation so request-scoped cookies, request-group IDs, response-header capture, personalized-response cache safety, and request aborts are centralized. Use one Shopify request context for Storefront and Customer Account clients in the same request. Per-call `signal` is optional when you need additional cancellation:
|
|
251
|
+
|
|
252
|
+
```ts
|
|
253
|
+
const { data } = await client.graphql(QUERY);
|
|
254
|
+
const { data } = await client.graphql(QUERY, { signal });
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
`requestContext.signal`, per-call `signal`, and the client's timeout signal are raced automatically. At the final response boundary, append committed session headers first, then call `requestContext.applyResponseHeaders(response.headers)`.
|
|
258
|
+
|
|
259
|
+
Read `references/caching.md` to cache catalog reads across sub-requests on Oxygen-style runtimes.
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## Error handling
|
|
264
|
+
|
|
265
|
+
**Transport errors throw. GraphQL errors are returned.**
|
|
266
|
+
|
|
267
|
+
```ts
|
|
268
|
+
import { StorefrontApiError, StorefrontTimeoutError } from "@shopify/hydrogen";
|
|
269
|
+
|
|
270
|
+
try {
|
|
271
|
+
const { data, errors, headers } = await client.graphql(QUERY);
|
|
272
|
+
if (errors) { /* partial GraphQL errors — query succeeded but some fields failed */ }
|
|
273
|
+
} catch (error) {
|
|
274
|
+
if (error instanceof StorefrontTimeoutError) { /* timed out */ }
|
|
275
|
+
if (error instanceof StorefrontApiError) { /* non-200, network failure, or JSON parse error */ }
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
Every successful result includes `headers` (the raw `Headers` object from the response) — useful for forwarding `Set-Cookie` headers in SSR or reading rate-limit metadata.
|
|
280
|
+
|
|
281
|
+
A 200 response with GraphQL `errors` does NOT throw — partial success is valid in GraphQL. Non-200 responses, timeouts, network failures, and JSON parse errors all throw `StorefrontApiError` (or the `StorefrontTimeoutError` subclass).
|
|
282
|
+
|
|
283
|
+
`StorefrontApiError` carries GraphQL error context (`locations`, `path`, `extensions`) when available. `extensions.code` enables programmatic branching (e.g. retry on `"THROTTLED"`). `toJSON()` strips dev-only fields (`queryText`, `variables`, `stack`) — safe for error reporters.
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## Testing
|
|
288
|
+
|
|
289
|
+
Inject a mock `fetch` at construction — the client calls it instead of the global:
|
|
290
|
+
|
|
291
|
+
```ts
|
|
292
|
+
const mockFetch = vi.fn().mockResolvedValue(
|
|
293
|
+
new Response(JSON.stringify({ data: { shop: { name: "Test" } } })),
|
|
294
|
+
);
|
|
295
|
+
|
|
296
|
+
const client = createStorefrontClient({
|
|
297
|
+
type: "public",
|
|
298
|
+
requestContext: createShopifyRequestContext({
|
|
299
|
+
request: { headers: new Headers() },
|
|
300
|
+
i18n: { country: "US", language: "EN" },
|
|
301
|
+
}),
|
|
302
|
+
config: {
|
|
303
|
+
storeDomain: "test.myshopify.com",
|
|
304
|
+
publicStorefrontToken: "test-token",
|
|
305
|
+
fetch: mockFetch,
|
|
306
|
+
},
|
|
307
|
+
});
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## Gotchas
|
|
313
|
+
|
|
314
|
+
- **Private tokens throw in browser** — a `typeof document !== "undefined"` guard fires at construction.
|
|
315
|
+
- **Env APIs are server-only** — examples that use `process.env` belong in server-only modules. Browser bundles may leave `process.env` undefined, inline stale build-time values, or accidentally expose config. Pass safe public values through server data when browser code needs them.
|
|
316
|
+
- **Module-scope only for request-independent clients** — static public clients and `private_no_buyer_context` clients can be module-scoped when their `requestContext` uses static headers and static `i18n`. Private per-buyer clients and clients with a real incoming request context must be created per request.
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## Framework recipes
|
|
321
|
+
|
|
322
|
+
Before wiring a client into an app, check whether this skill has a reference file for the app's framework in `references/`. If one exists, read it and preserve that framework's request context, server data, and buyer-IP conventions. If there is no matching reference, use the core rules above: create request-scoped private clients only inside the server request lifecycle when buyer context exists, keep static public or no-buyer-context clients module-scoped only when they do not depend on request state, and forward captured response headers where the framework allows it.
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Astro
|
|
2
|
+
|
|
3
|
+
Astro pages run their frontmatter on the server, so `Astro.request` and `Astro.clientAddress` are available — but only on **server-rendered** pages. Prerendered pages have no request at all.
|
|
4
|
+
|
|
5
|
+
## SSR
|
|
6
|
+
|
|
7
|
+
Use `Astro.locals` to pass the storefront client from middleware to pages. The middleware creates the client once per request. The scaffold defaults to a public client; `PUBLIC_STOREFRONT_API_TOKEN` may be unset, which means tokenless access (all mock.shop supports). Once the app has a private token and trusted buyer context, switch to `type: "private"` and resolve `buyerIp` (e.g. from `Astro.clientAddress`) per the `hydrogen-storefront-client` buyer-IP guidance.
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
// src/middleware.ts
|
|
11
|
+
import { defineMiddleware } from "astro:middleware";
|
|
12
|
+
import {
|
|
13
|
+
createStorefrontClient,
|
|
14
|
+
createShopifyRequestContext,
|
|
15
|
+
} from "@shopify/hydrogen";
|
|
16
|
+
|
|
17
|
+
export const onRequest = defineMiddleware(async (context, next) => {
|
|
18
|
+
const requestContext = createShopifyRequestContext({
|
|
19
|
+
request: context.request,
|
|
20
|
+
i18n: { country: "US", language: "EN" },
|
|
21
|
+
});
|
|
22
|
+
const client = createStorefrontClient({
|
|
23
|
+
type: "public",
|
|
24
|
+
requestContext,
|
|
25
|
+
config: {
|
|
26
|
+
storeDomain: import.meta.env.PUBLIC_STORE_DOMAIN,
|
|
27
|
+
publicStorefrontToken: import.meta.env.PUBLIC_STOREFRONT_API_TOKEN,
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
context.locals.storefront = client;
|
|
32
|
+
|
|
33
|
+
const response = await next();
|
|
34
|
+
requestContext.applyResponseHeaders(response.headers);
|
|
35
|
+
return response;
|
|
36
|
+
});
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
// src/env.d.ts — type the locals object
|
|
41
|
+
import type { StorefrontClient } from "@shopify/hydrogen";
|
|
42
|
+
|
|
43
|
+
declare namespace App {
|
|
44
|
+
interface Locals {
|
|
45
|
+
storefront: StorefrontClient;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
```astro
|
|
51
|
+
---
|
|
52
|
+
// src/pages/products/[handle].astro — server-rendered page
|
|
53
|
+
import { gql } from "@shopify/hydrogen";
|
|
54
|
+
|
|
55
|
+
const PRODUCT_QUERY = gql(`
|
|
56
|
+
query Product($handle: String!) {
|
|
57
|
+
product(handle: $handle) { title description }
|
|
58
|
+
}
|
|
59
|
+
`);
|
|
60
|
+
|
|
61
|
+
const { handle } = Astro.params;
|
|
62
|
+
const { data } = await Astro.locals.storefront.graphql(PRODUCT_QUERY, {
|
|
63
|
+
variables: { handle: handle! },
|
|
64
|
+
});
|
|
65
|
+
---
|
|
66
|
+
<h1>{data?.product?.title}</h1>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
This requires `output: "server"` in `astro.config.mjs` (all pages SSR by default). Individual pages that don't need request-time data can opt into static prerendering with `export const prerender = true`.
|
|
70
|
+
|
|
71
|
+
## Static pages (no buyer IP)
|
|
72
|
+
|
|
73
|
+
For prerendered pages — marketing, collection listings — use a module-scoped `private_no_buyer_context` client. No middleware needed since there's no request to read from.
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
// src/lib/storefront-static.ts
|
|
77
|
+
import { createStorefrontClient, createShopifyRequestContext } from "@shopify/hydrogen";
|
|
78
|
+
|
|
79
|
+
const requestContext = createShopifyRequestContext({
|
|
80
|
+
request: { headers: new Headers() },
|
|
81
|
+
i18n: { country: "US", language: "EN" },
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
export const staticStorefrontClient = createStorefrontClient({
|
|
85
|
+
type: "private_no_buyer_context",
|
|
86
|
+
requestContext,
|
|
87
|
+
config: {
|
|
88
|
+
storeDomain: import.meta.env.PUBLIC_STORE_DOMAIN,
|
|
89
|
+
privateStorefrontToken: import.meta.env.PRIVATE_STOREFRONT_API_TOKEN,
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```astro
|
|
95
|
+
---
|
|
96
|
+
// src/pages/collections/[handle].astro
|
|
97
|
+
export const prerender = true;
|
|
98
|
+
|
|
99
|
+
import { gql } from "@shopify/hydrogen";
|
|
100
|
+
import { staticStorefrontClient } from "../../lib/storefront-static";
|
|
101
|
+
|
|
102
|
+
const COLLECTION_QUERY = gql(`
|
|
103
|
+
query Collection($handle: String!) {
|
|
104
|
+
collection(handle: $handle) {
|
|
105
|
+
title
|
|
106
|
+
products(first: 20) { nodes { title handle } }
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
`);
|
|
110
|
+
|
|
111
|
+
const { handle } = Astro.params;
|
|
112
|
+
const { data } = await staticStorefrontClient.graphql(COLLECTION_QUERY, {
|
|
113
|
+
variables: { handle: handle! },
|
|
114
|
+
});
|
|
115
|
+
---
|
|
116
|
+
<ul>
|
|
117
|
+
{data?.collection?.products?.nodes?.map((p) => <li>{p.title}</li>)}
|
|
118
|
+
</ul>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Footguns
|
|
122
|
+
|
|
123
|
+
- **`Astro.clientAddress` crashes prerendered pages** — it's only available during server rendering. Never access it (or `Astro.request`) in a page with `export const prerender = true`.
|
|
124
|
+
- **Middleware runs on every request, including prerendered** — the `handle` hook fires even for prerendered routes. Guard buyer-context logic with a check if needed, or accept that the middleware sets up a client that simply won't be used on static pages.
|
|
125
|
+
- **Astro v5 merged `hybrid` into `static`** — use `output: "server"` for SSR-by-default with static opt-in, or `output: "static"` (default) with `export const prerender = false` per-route for on-demand rendering.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Sub-Request Caching
|
|
2
|
+
|
|
3
|
+
`Cache`, `createRunWithCache`, `createFetchWithCache`, and `CachingStrategy` are public exports of `@shopify/hydrogen` — the sub-request cache for catalog reads (products, collections, pages) on Oxygen-style runtimes that expose a `cache` store and `waitUntil`. Strategies are `Cache.long()`, `Cache.short()`, and `Cache.none()`. Pass `cache` (+ optional `waitUntil`) to `createStorefrontClient` and it builds `fetchWithCache` for you; reach for `createFetchWithCache` directly only when injecting a custom cached `fetch`.
|
|
4
|
+
|
|
5
|
+
## Cache catalog reads through the client
|
|
6
|
+
|
|
7
|
+
Pass `cache` (and optional `waitUntil`) to `createStorefrontClient` and opt in per query with `cache`. The client builds the cache key and skips caching GraphQL errors for you:
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import { Cache, createStorefrontClient } from "@shopify/hydrogen";
|
|
11
|
+
|
|
12
|
+
const client = createStorefrontClient({
|
|
13
|
+
type: "public",
|
|
14
|
+
requestContext,
|
|
15
|
+
config: { storeDomain, publicStorefrontToken, cache, waitUntil },
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
const { data, errors } = await client.graphql(PRODUCTS, { variables, cache: Cache.long() });
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Caching only engages when you pass `cache` per query.** Configuring `cache` on the client alone caches nothing — queries without a `cache` strategy (and all mutations) are never cached.
|
|
22
|
+
|
|
23
|
+
## Never cache private data
|
|
24
|
+
|
|
25
|
+
Do not pass a `cache` strategy to personalized reads (cart, customer); keep them on a request-scoped client. Cache mode `private` is unsupported — for buyer-specific caching use `createRunWithCache` with an explicit private key.
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Next.js App Router
|
|
2
|
+
|
|
3
|
+
## Dynamic pages
|
|
4
|
+
|
|
5
|
+
Next.js server components don't receive a `Request` object. The pattern: a server-only cached factory that reads `headers()`, creates a request context from those headers, and creates a request-scoped client for that RSC request. The scaffold defaults to a public client; `NEXT_PUBLIC_STOREFRONT_API_TOKEN` may be unset, which means tokenless access (all mock.shop supports). Once the app has a private token and trusted buyer context, switch to `type: "private"` and resolve `buyerIp` per the `hydrogen-storefront-client` buyer-IP guidance (e.g. from trusted `x-forwarded-for` data).
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
// lib/storefront.ts
|
|
9
|
+
import { headers } from "next/headers";
|
|
10
|
+
import { cache } from "react";
|
|
11
|
+
import {
|
|
12
|
+
createStorefrontClient,
|
|
13
|
+
createShopifyRequestContext,
|
|
14
|
+
} from "@shopify/hydrogen";
|
|
15
|
+
|
|
16
|
+
export const getStorefrontClient = cache(async () => {
|
|
17
|
+
const requestHeaders = await headers();
|
|
18
|
+
const requestContext = createShopifyRequestContext({
|
|
19
|
+
request: { headers: requestHeaders },
|
|
20
|
+
i18n: { country: "US", language: "EN" },
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
return createStorefrontClient({
|
|
24
|
+
type: "public",
|
|
25
|
+
requestContext,
|
|
26
|
+
config: {
|
|
27
|
+
storeDomain: process.env.NEXT_PUBLIC_STORE_DOMAIN!,
|
|
28
|
+
publicStorefrontToken: process.env.NEXT_PUBLIC_STOREFRONT_API_TOKEN,
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
// app/products/[handle]/page.tsx
|
|
36
|
+
import { getStorefrontClient } from "@/lib/storefront";
|
|
37
|
+
import { gql } from "@shopify/hydrogen";
|
|
38
|
+
|
|
39
|
+
const PRODUCT_QUERY = gql(`
|
|
40
|
+
query Product($handle: String!) {
|
|
41
|
+
product(handle: $handle) { title description }
|
|
42
|
+
}
|
|
43
|
+
`);
|
|
44
|
+
|
|
45
|
+
export default async function ProductPage({ params }: { params: Promise<{ handle: string }> }) {
|
|
46
|
+
const { handle } = await params;
|
|
47
|
+
const storefront = await getStorefrontClient();
|
|
48
|
+
const { data } = await storefront.graphql(PRODUCT_QUERY, {
|
|
49
|
+
variables: { handle },
|
|
50
|
+
});
|
|
51
|
+
return <h1>{data?.product?.title}</h1>;
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
The client is created inside the request path because `requestContext` is static on the client. Calling `headers()` makes this page dynamic. Route handlers and proxy files receive the actual `Request`; pass that request to `createShopifyRequestContext({ request, i18n })` there so the request URL and `request.signal` are preserved. When upgrading to a private client, also pass the trusted `buyerIp` (`createShopifyRequestContext({ request, i18n, buyerIp })`).
|
|
56
|
+
|
|
57
|
+
## Static pages (no buyer IP)
|
|
58
|
+
|
|
59
|
+
Pages that don't need buyer context — product listings, collection grids, marketing pages — can use `private_no_buyer_context` with a static request context. Because the component never calls `headers()`, `cookies()`, or reads `searchParams`, Next.js treats it as statically renderable and caches it at build time or via ISR.
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
// lib/storefront-static.ts - private client, no buyer context
|
|
63
|
+
import { createStorefrontClient, createShopifyRequestContext } from "@shopify/hydrogen";
|
|
64
|
+
|
|
65
|
+
const requestContext = createShopifyRequestContext({
|
|
66
|
+
request: { headers: new Headers() },
|
|
67
|
+
i18n: { country: "US", language: "EN" },
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
export const staticStorefrontClient = createStorefrontClient({
|
|
71
|
+
type: "private_no_buyer_context",
|
|
72
|
+
requestContext,
|
|
73
|
+
config: {
|
|
74
|
+
storeDomain: process.env.NEXT_PUBLIC_STORE_DOMAIN!,
|
|
75
|
+
privateStorefrontToken: process.env.PRIVATE_STOREFRONT_API_TOKEN!,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
// app/collections/[handle]/page.tsx — statically rendered
|
|
82
|
+
import { staticStorefrontClient } from "@/lib/storefront-static";
|
|
83
|
+
import { gql } from "@shopify/hydrogen";
|
|
84
|
+
|
|
85
|
+
const COLLECTION_QUERY = gql(`
|
|
86
|
+
query Collection($handle: String!) {
|
|
87
|
+
collection(handle: $handle) {
|
|
88
|
+
title
|
|
89
|
+
products(first: 20) { nodes { title handle } }
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
`);
|
|
93
|
+
|
|
94
|
+
export default async function CollectionPage({ params }: { params: Promise<{ handle: string }> }) {
|
|
95
|
+
const { handle } = await params;
|
|
96
|
+
const { data } = await staticStorefrontClient.graphql(COLLECTION_QUERY, {
|
|
97
|
+
variables: { handle },
|
|
98
|
+
});
|
|
99
|
+
return (
|
|
100
|
+
<ul>
|
|
101
|
+
{data?.collection?.products?.nodes?.map((p) => (
|
|
102
|
+
<li key={p.handle}>{p.title}</li>
|
|
103
|
+
))}
|
|
104
|
+
</ul>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
This component never touches request-time APIs (`headers()`, `cookies()`, `searchParams`). With Cache Components, wrap catalog reads in explicit `"use cache"` functions and choose a `cacheLife` / `cacheTag`; do not use route-segment `revalidate`. All requests share one throttle bucket - fine for pages that serve the same data to every visitor. Use a per-request client from `getStorefrontClient()` (upgraded to `private`) when you need per-buyer isolation or personalized data.
|
|
110
|
+
|
|
111
|
+
## `use cache` does not serialize `URLSearchParams`
|
|
112
|
+
|
|
113
|
+
`use cache` serializes its arguments, so a `URLSearchParams` loses `.get` across the boundary. Pass a plain `string` and reconstruct `new URLSearchParams(string)` inside the cache-point:
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
// "use cache" cache-point
|
|
117
|
+
async function fetchCollection(handle: string, searchString: string) {
|
|
118
|
+
const parsed = parseCollectionParams(new URLSearchParams(searchString));
|
|
119
|
+
// ...
|
|
120
|
+
}
|
|
121
|
+
```
|