@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,144 @@
|
|
|
1
|
+
import { AnalyticsEvent } from "./events.mjs";
|
|
2
|
+
import { flattenConnection } from "./utils/flatten-connection.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/core/analytics/cart-tracker.ts
|
|
5
|
+
function trackCartAnalytics(store) {
|
|
6
|
+
const analytics = getGlobalAnalytics();
|
|
7
|
+
const state = {
|
|
8
|
+
prevCart: toAnalyticsCart(store.getState()),
|
|
9
|
+
lastEventId: null
|
|
10
|
+
};
|
|
11
|
+
if (state.prevCart) syncShopifyCurrency(state.prevCart);
|
|
12
|
+
return store.subscribe((cartState) => {
|
|
13
|
+
const cart = toAnalyticsCart(cartState);
|
|
14
|
+
if (!cart) return;
|
|
15
|
+
trackCartChange(analytics, state, cart);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
function trackCartChange(analytics, state, cart) {
|
|
19
|
+
if (!cart || !cart.updatedAt) return;
|
|
20
|
+
syncShopifyCurrency(cart);
|
|
21
|
+
if (cart.updatedAt === state.prevCart?.updatedAt) return;
|
|
22
|
+
let cartLastUpdatedAt;
|
|
23
|
+
try {
|
|
24
|
+
cartLastUpdatedAt = JSON.parse(localStorage.getItem("cartLastUpdatedAt") || "");
|
|
25
|
+
} catch {
|
|
26
|
+
cartLastUpdatedAt = null;
|
|
27
|
+
}
|
|
28
|
+
if (cart.id === cartLastUpdatedAt?.id && cart.updatedAt === cartLastUpdatedAt?.updatedAt) {
|
|
29
|
+
state.prevCart = cart;
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (cart.updatedAt === state.lastEventId) return;
|
|
33
|
+
state.lastEventId = cart.updatedAt;
|
|
34
|
+
const config = analytics.getConfig();
|
|
35
|
+
const payload = {
|
|
36
|
+
eventTimestamp: Date.now(),
|
|
37
|
+
cart,
|
|
38
|
+
prevCart: state.prevCart,
|
|
39
|
+
shop: config.shop,
|
|
40
|
+
customData: config.customData
|
|
41
|
+
};
|
|
42
|
+
analytics.publish(AnalyticsEvent.CART_UPDATED, payload);
|
|
43
|
+
try {
|
|
44
|
+
localStorage.setItem("cartLastUpdatedAt", JSON.stringify({
|
|
45
|
+
id: cart.id,
|
|
46
|
+
updatedAt: cart.updatedAt
|
|
47
|
+
}));
|
|
48
|
+
} catch {}
|
|
49
|
+
const previousCartLines = flattenConnection(state.prevCart?.lines);
|
|
50
|
+
const currentCartLines = flattenConnection(cart.lines);
|
|
51
|
+
previousCartLines.forEach((prevLine) => {
|
|
52
|
+
const matchedLineId = currentCartLines.filter((line) => prevLine.id === line.id);
|
|
53
|
+
if (matchedLineId.length === 1) {
|
|
54
|
+
const matchedLine = matchedLineId[0];
|
|
55
|
+
if (prevLine.quantity < matchedLine.quantity) analytics.publish(AnalyticsEvent.PRODUCT_ADD_TO_CART, {
|
|
56
|
+
...payload,
|
|
57
|
+
prevLine,
|
|
58
|
+
currentLine: matchedLine
|
|
59
|
+
});
|
|
60
|
+
else if (prevLine.quantity > matchedLine.quantity) analytics.publish(AnalyticsEvent.PRODUCT_REMOVED_FROM_CART, {
|
|
61
|
+
...payload,
|
|
62
|
+
prevLine,
|
|
63
|
+
currentLine: matchedLine
|
|
64
|
+
});
|
|
65
|
+
} else analytics.publish(AnalyticsEvent.PRODUCT_REMOVED_FROM_CART, {
|
|
66
|
+
...payload,
|
|
67
|
+
prevLine
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
currentCartLines.forEach((line) => {
|
|
71
|
+
const matchedLineId = previousCartLines.filter((previousLine) => line.id === previousLine.id);
|
|
72
|
+
if (!matchedLineId || matchedLineId.length === 0) analytics.publish(AnalyticsEvent.PRODUCT_ADD_TO_CART, {
|
|
73
|
+
...payload,
|
|
74
|
+
currentLine: line
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
state.prevCart = cart;
|
|
78
|
+
}
|
|
79
|
+
function getGlobalAnalytics() {
|
|
80
|
+
const analytics = typeof window !== "undefined" ? window.Shopify?.analytics : void 0;
|
|
81
|
+
if (!analytics) throw new Error("Shopify analytics bus is not available. Render ShopifyScripts before calling trackCartAnalytics().");
|
|
82
|
+
return analytics;
|
|
83
|
+
}
|
|
84
|
+
function toAnalyticsCart(state) {
|
|
85
|
+
const cart = state.data;
|
|
86
|
+
if (!cart.id || hasPendingCartWork(state)) return null;
|
|
87
|
+
return {
|
|
88
|
+
id: cart.id,
|
|
89
|
+
updatedAt: getCartUpdatedAt(cart),
|
|
90
|
+
cost: cart.cost,
|
|
91
|
+
lines: { nodes: cart.lines.nodes.flatMap((line) => {
|
|
92
|
+
const merchandise = line.merchandise;
|
|
93
|
+
if (!merchandise) return [];
|
|
94
|
+
const product = merchandise.product;
|
|
95
|
+
const productId = typeof product.id === "string" ? product.id : "";
|
|
96
|
+
const vendor = typeof product.vendor === "string" ? product.vendor : "";
|
|
97
|
+
const productType = typeof product.productType === "string" ? product.productType : void 0;
|
|
98
|
+
return [{
|
|
99
|
+
id: line.id,
|
|
100
|
+
quantity: line.quantity,
|
|
101
|
+
merchandise: {
|
|
102
|
+
id: merchandise.id,
|
|
103
|
+
title: merchandise.title ?? product.title,
|
|
104
|
+
price: line.cost.amountPerQuantity,
|
|
105
|
+
sku: typeof merchandise.sku === "string" ? merchandise.sku : null,
|
|
106
|
+
product: {
|
|
107
|
+
id: productId,
|
|
108
|
+
title: product.title,
|
|
109
|
+
vendor,
|
|
110
|
+
productType,
|
|
111
|
+
handle: product.handle
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}];
|
|
115
|
+
}) }
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function hasPendingCartWork({ pending, revalidating }) {
|
|
119
|
+
const hasPendingCost = pending.cost ?? (pending.lines.size > 0 || pending.discountCodes.size > 0);
|
|
120
|
+
return revalidating === true || hasPendingCost || pending.note || pending.attributes;
|
|
121
|
+
}
|
|
122
|
+
function getCartUpdatedAt(cart) {
|
|
123
|
+
return typeof cart.updatedAt === "string" ? cart.updatedAt : (/* @__PURE__ */ new Date()).toISOString();
|
|
124
|
+
}
|
|
125
|
+
function syncShopifyCurrency(cart) {
|
|
126
|
+
if (typeof window === "undefined") return;
|
|
127
|
+
const currencyCode = getCartCurrencyCode(cart);
|
|
128
|
+
if (!currencyCode) return;
|
|
129
|
+
const normalizedCurrencyCode = currencyCode.toUpperCase();
|
|
130
|
+
const shopifyWindow = window;
|
|
131
|
+
const shopify = shopifyWindow.Shopify ??= {};
|
|
132
|
+
if (shopify.currency?.active === normalizedCurrencyCode) return;
|
|
133
|
+
shopify.currency = { active: normalizedCurrencyCode };
|
|
134
|
+
}
|
|
135
|
+
function getCartCurrencyCode(cart) {
|
|
136
|
+
return nonEmptyCurrencyCode(cart.cost?.totalAmount?.currencyCode) ?? nonEmptyCurrencyCode(cart.cost?.subtotalAmount?.currencyCode) ?? flattenConnection(cart.lines).find((line) => line.merchandise.price.currencyCode)?.merchandise.price.currencyCode;
|
|
137
|
+
}
|
|
138
|
+
function nonEmptyCurrencyCode(currencyCode) {
|
|
139
|
+
return currencyCode || void 0;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
//#endregion
|
|
143
|
+
export { trackCartAnalytics };
|
|
144
|
+
//# sourceMappingURL=cart-tracker.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cart-tracker.mjs","names":[],"sources":["../../../src/core/analytics/cart-tracker.ts"],"sourcesContent":["import type { CartStore } from \"../cart/cart\";\nimport type { CartData, CartState } from \"../cart/state\";\nimport { AnalyticsEvent } from \"./events\";\nimport type {\n AnalyticsCart,\n AnalyticsCartLine,\n CartUpdatePayload,\n StorefrontAnalytics,\n} from \"./types\";\nimport { flattenConnection } from \"./utils/flatten-connection\";\n\ntype CartTrackerAnalytics = Pick<StorefrontAnalytics, \"publish\" | \"getConfig\">;\ntype CartAnalyticsStore = Pick<CartStore, \"getState\" | \"subscribe\">;\n\ntype CartStorage = {\n updatedAt: string;\n id: string;\n};\n\ntype CartTrackerState = {\n prevCart: AnalyticsCart | null;\n lastEventId: string | null;\n};\n\nexport function trackCartAnalytics(store: CartAnalyticsStore): () => void {\n const analytics = getGlobalAnalytics();\n const state: CartTrackerState = {\n prevCart: toAnalyticsCart(store.getState()),\n lastEventId: null,\n };\n\n if (state.prevCart) syncShopifyCurrency(state.prevCart);\n\n return store.subscribe((cartState) => {\n const cart = toAnalyticsCart(cartState);\n if (!cart) return;\n\n trackCartChange(analytics, state, cart);\n });\n}\n\nfunction trackCartChange(\n analytics: CartTrackerAnalytics,\n state: CartTrackerState,\n cart: AnalyticsCart,\n): void {\n if (!cart || !cart.updatedAt) return;\n\n syncShopifyCurrency(cart);\n\n if (cart.updatedAt === state.prevCart?.updatedAt) return;\n\n let cartLastUpdatedAt: CartStorage | null;\n try {\n cartLastUpdatedAt = JSON.parse(localStorage.getItem(\"cartLastUpdatedAt\") || \"\");\n } catch {\n cartLastUpdatedAt = null;\n }\n\n if (cart.id === cartLastUpdatedAt?.id && cart.updatedAt === cartLastUpdatedAt?.updatedAt) {\n state.prevCart = cart;\n return;\n }\n\n if (cart.updatedAt === state.lastEventId) return;\n state.lastEventId = cart.updatedAt;\n\n const config = analytics.getConfig();\n const payload: CartUpdatePayload = {\n eventTimestamp: Date.now(),\n cart,\n prevCart: state.prevCart,\n shop: config.shop,\n customData: config.customData,\n };\n\n analytics.publish(AnalyticsEvent.CART_UPDATED, payload);\n\n try {\n localStorage.setItem(\n \"cartLastUpdatedAt\",\n JSON.stringify({ id: cart.id, updatedAt: cart.updatedAt }),\n );\n } catch {\n // Safari private browsing or storage quota exceeded; analytics\n // deduplication will rely on in-memory prevCart only for this session.\n }\n\n const previousCartLines = flattenConnection<AnalyticsCartLine>(state.prevCart?.lines);\n const currentCartLines = flattenConnection<AnalyticsCartLine>(cart.lines);\n\n previousCartLines.forEach((prevLine) => {\n const matchedLineId = currentCartLines.filter((line) => prevLine.id === line.id);\n if (matchedLineId.length === 1) {\n const matchedLine = matchedLineId[0];\n if (prevLine.quantity < matchedLine.quantity) {\n analytics.publish(AnalyticsEvent.PRODUCT_ADD_TO_CART, {\n ...payload,\n prevLine,\n currentLine: matchedLine,\n });\n } else if (prevLine.quantity > matchedLine.quantity) {\n analytics.publish(AnalyticsEvent.PRODUCT_REMOVED_FROM_CART, {\n ...payload,\n prevLine,\n currentLine: matchedLine,\n });\n }\n } else {\n analytics.publish(AnalyticsEvent.PRODUCT_REMOVED_FROM_CART, {\n ...payload,\n prevLine,\n });\n }\n });\n\n currentCartLines.forEach((line) => {\n const matchedLineId = previousCartLines.filter((previousLine) => line.id === previousLine.id);\n if (!matchedLineId || matchedLineId.length === 0) {\n analytics.publish(AnalyticsEvent.PRODUCT_ADD_TO_CART, {\n ...payload,\n currentLine: line,\n });\n }\n });\n\n state.prevCart = cart;\n}\n\nfunction getGlobalAnalytics(): CartTrackerAnalytics {\n const analytics = typeof window !== \"undefined\" ? window.Shopify?.analytics : undefined;\n if (!analytics) {\n throw new Error(\n \"Shopify analytics bus is not available. Render ShopifyScripts before calling trackCartAnalytics().\",\n );\n }\n\n return analytics;\n}\n\nfunction toAnalyticsCart(state: CartState): AnalyticsCart | null {\n const cart = state.data;\n if (!cart.id || hasPendingCartWork(state)) return null;\n\n return {\n id: cart.id,\n updatedAt: getCartUpdatedAt(cart),\n cost: cart.cost,\n lines: {\n nodes: cart.lines.nodes.flatMap((line): AnalyticsCartLine[] => {\n const merchandise = line.merchandise;\n if (!merchandise) return [];\n\n const product = merchandise.product;\n const productId = typeof product.id === \"string\" ? product.id : \"\";\n const vendor = typeof product.vendor === \"string\" ? product.vendor : \"\";\n const productType =\n typeof product.productType === \"string\" ? product.productType : undefined;\n\n return [\n {\n id: line.id,\n quantity: line.quantity,\n merchandise: {\n id: merchandise.id,\n title: merchandise.title ?? product.title,\n price: line.cost.amountPerQuantity,\n sku: typeof merchandise.sku === \"string\" ? merchandise.sku : null,\n product: {\n id: productId,\n title: product.title,\n vendor,\n productType,\n handle: product.handle,\n },\n },\n },\n ];\n }),\n },\n };\n}\n\nfunction hasPendingCartWork({ pending, revalidating }: CartState): boolean {\n const hasPendingCost = pending.cost ?? (pending.lines.size > 0 || pending.discountCodes.size > 0);\n return revalidating === true || hasPendingCost || pending.note || pending.attributes;\n}\n\nfunction getCartUpdatedAt(cart: CartData): string {\n return typeof cart.updatedAt === \"string\" ? cart.updatedAt : new Date().toISOString();\n}\n\nfunction syncShopifyCurrency(cart: AnalyticsCart): void {\n if (typeof window === \"undefined\") return;\n\n const currencyCode = getCartCurrencyCode(cart);\n if (!currencyCode) return;\n\n const normalizedCurrencyCode = currencyCode.toUpperCase();\n const shopifyWindow: { Shopify?: { currency?: { active: string } } } = window;\n const shopify = (shopifyWindow.Shopify ??= {});\n if (shopify.currency?.active === normalizedCurrencyCode) return;\n\n shopify.currency = { active: normalizedCurrencyCode };\n}\n\nfunction getCartCurrencyCode(cart: AnalyticsCart): string | undefined {\n return (\n nonEmptyCurrencyCode(cart.cost?.totalAmount?.currencyCode) ??\n nonEmptyCurrencyCode(cart.cost?.subtotalAmount?.currencyCode) ??\n flattenConnection<AnalyticsCartLine>(cart.lines).find(\n (line) => line.merchandise.price.currencyCode,\n )?.merchandise.price.currencyCode\n );\n}\n\nfunction nonEmptyCurrencyCode(currencyCode: string | undefined): string | undefined {\n return currencyCode || undefined;\n}\n"],"mappings":";;;;AAwBA,SAAgB,mBAAmB,OAAuC;CACxE,MAAM,YAAY,oBAAoB;CACtC,MAAM,QAA0B;EAC9B,UAAU,gBAAgB,MAAM,UAAU,CAAC;EAC3C,aAAa;EACd;AAED,KAAI,MAAM,SAAU,qBAAoB,MAAM,SAAS;AAEvD,QAAO,MAAM,WAAW,cAAc;EACpC,MAAM,OAAO,gBAAgB,UAAU;AACvC,MAAI,CAAC,KAAM;AAEX,kBAAgB,WAAW,OAAO,KAAK;GACvC;;AAGJ,SAAS,gBACP,WACA,OACA,MACM;AACN,KAAI,CAAC,QAAQ,CAAC,KAAK,UAAW;AAE9B,qBAAoB,KAAK;AAEzB,KAAI,KAAK,cAAc,MAAM,UAAU,UAAW;CAElD,IAAI;AACJ,KAAI;AACF,sBAAoB,KAAK,MAAM,aAAa,QAAQ,oBAAoB,IAAI,GAAG;SACzE;AACN,sBAAoB;;AAGtB,KAAI,KAAK,OAAO,mBAAmB,MAAM,KAAK,cAAc,mBAAmB,WAAW;AACxF,QAAM,WAAW;AACjB;;AAGF,KAAI,KAAK,cAAc,MAAM,YAAa;AAC1C,OAAM,cAAc,KAAK;CAEzB,MAAM,SAAS,UAAU,WAAW;CACpC,MAAM,UAA6B;EACjC,gBAAgB,KAAK,KAAK;EAC1B;EACA,UAAU,MAAM;EAChB,MAAM,OAAO;EACb,YAAY,OAAO;EACpB;AAED,WAAU,QAAQ,eAAe,cAAc,QAAQ;AAEvD,KAAI;AACF,eAAa,QACX,qBACA,KAAK,UAAU;GAAE,IAAI,KAAK;GAAI,WAAW,KAAK;GAAW,CAAC,CAC3D;SACK;CAKR,MAAM,oBAAoB,kBAAqC,MAAM,UAAU,MAAM;CACrF,MAAM,mBAAmB,kBAAqC,KAAK,MAAM;AAEzE,mBAAkB,SAAS,aAAa;EACtC,MAAM,gBAAgB,iBAAiB,QAAQ,SAAS,SAAS,OAAO,KAAK,GAAG;AAChF,MAAI,cAAc,WAAW,GAAG;GAC9B,MAAM,cAAc,cAAc;AAClC,OAAI,SAAS,WAAW,YAAY,SAClC,WAAU,QAAQ,eAAe,qBAAqB;IACpD,GAAG;IACH;IACA,aAAa;IACd,CAAC;YACO,SAAS,WAAW,YAAY,SACzC,WAAU,QAAQ,eAAe,2BAA2B;IAC1D,GAAG;IACH;IACA,aAAa;IACd,CAAC;QAGJ,WAAU,QAAQ,eAAe,2BAA2B;GAC1D,GAAG;GACH;GACD,CAAC;GAEJ;AAEF,kBAAiB,SAAS,SAAS;EACjC,MAAM,gBAAgB,kBAAkB,QAAQ,iBAAiB,KAAK,OAAO,aAAa,GAAG;AAC7F,MAAI,CAAC,iBAAiB,cAAc,WAAW,EAC7C,WAAU,QAAQ,eAAe,qBAAqB;GACpD,GAAG;GACH,aAAa;GACd,CAAC;GAEJ;AAEF,OAAM,WAAW;;AAGnB,SAAS,qBAA2C;CAClD,MAAM,YAAY,OAAO,WAAW,cAAc,OAAO,SAAS,YAAY;AAC9E,KAAI,CAAC,UACH,OAAM,IAAI,MACR,qGACD;AAGH,QAAO;;AAGT,SAAS,gBAAgB,OAAwC;CAC/D,MAAM,OAAO,MAAM;AACnB,KAAI,CAAC,KAAK,MAAM,mBAAmB,MAAM,CAAE,QAAO;AAElD,QAAO;EACL,IAAI,KAAK;EACT,WAAW,iBAAiB,KAAK;EACjC,MAAM,KAAK;EACX,OAAO,EACL,OAAO,KAAK,MAAM,MAAM,SAAS,SAA8B;GAC7D,MAAM,cAAc,KAAK;AACzB,OAAI,CAAC,YAAa,QAAO,EAAE;GAE3B,MAAM,UAAU,YAAY;GAC5B,MAAM,YAAY,OAAO,QAAQ,OAAO,WAAW,QAAQ,KAAK;GAChE,MAAM,SAAS,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS;GACrE,MAAM,cACJ,OAAO,QAAQ,gBAAgB,WAAW,QAAQ,cAAc;AAElE,UAAO,CACL;IACE,IAAI,KAAK;IACT,UAAU,KAAK;IACf,aAAa;KACX,IAAI,YAAY;KAChB,OAAO,YAAY,SAAS,QAAQ;KACpC,OAAO,KAAK,KAAK;KACjB,KAAK,OAAO,YAAY,QAAQ,WAAW,YAAY,MAAM;KAC7D,SAAS;MACP,IAAI;MACJ,OAAO,QAAQ;MACf;MACA;MACA,QAAQ,QAAQ;MACjB;KACF;IACF,CACF;IACD,EACH;EACF;;AAGH,SAAS,mBAAmB,EAAE,SAAS,gBAAoC;CACzE,MAAM,iBAAiB,QAAQ,SAAS,QAAQ,MAAM,OAAO,KAAK,QAAQ,cAAc,OAAO;AAC/F,QAAO,iBAAiB,QAAQ,kBAAkB,QAAQ,QAAQ,QAAQ;;AAG5E,SAAS,iBAAiB,MAAwB;AAChD,QAAO,OAAO,KAAK,cAAc,WAAW,KAAK,6BAAY,IAAI,MAAM,EAAC,aAAa;;AAGvF,SAAS,oBAAoB,MAA2B;AACtD,KAAI,OAAO,WAAW,YAAa;CAEnC,MAAM,eAAe,oBAAoB,KAAK;AAC9C,KAAI,CAAC,aAAc;CAEnB,MAAM,yBAAyB,aAAa,aAAa;CACzD,MAAM,gBAAiE;CACvE,MAAM,UAAW,cAAc,YAAY,EAAE;AAC7C,KAAI,QAAQ,UAAU,WAAW,uBAAwB;AAEzD,SAAQ,WAAW,EAAE,QAAQ,wBAAwB;;AAGvD,SAAS,oBAAoB,MAAyC;AACpE,QACE,qBAAqB,KAAK,MAAM,aAAa,aAAa,IAC1D,qBAAqB,KAAK,MAAM,gBAAgB,aAAa,IAC7D,kBAAqC,KAAK,MAAM,CAAC,MAC9C,SAAS,KAAK,YAAY,MAAM,aAClC,EAAE,YAAY,MAAM;;AAIzB,SAAS,qBAAqB,cAAsD;AAClF,QAAO,gBAAgB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/core/analytics/events.d.ts
|
|
2
|
+
declare const AnalyticsEvent: {
|
|
3
|
+
PAGE_VIEWED: "page_viewed";
|
|
4
|
+
PRODUCT_VIEWED: "product_viewed";
|
|
5
|
+
COLLECTION_VIEWED: "collection_viewed";
|
|
6
|
+
CART_VIEWED: "cart_viewed";
|
|
7
|
+
SEARCH_VIEWED: "search_viewed";
|
|
8
|
+
CART_UPDATED: "cart_updated";
|
|
9
|
+
PRODUCT_ADD_TO_CART: "product_added_to_cart";
|
|
10
|
+
PRODUCT_REMOVED_FROM_CART: "product_removed_from_cart";
|
|
11
|
+
};
|
|
12
|
+
type AnalyticsEventName = (typeof AnalyticsEvent)[keyof typeof AnalyticsEvent];
|
|
13
|
+
//#endregion
|
|
14
|
+
export { AnalyticsEvent, AnalyticsEventName };
|
|
15
|
+
//# sourceMappingURL=events.d.mts.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/core/analytics/events.ts
|
|
2
|
+
const AnalyticsEvent = {
|
|
3
|
+
PAGE_VIEWED: "page_viewed",
|
|
4
|
+
PRODUCT_VIEWED: "product_viewed",
|
|
5
|
+
COLLECTION_VIEWED: "collection_viewed",
|
|
6
|
+
CART_VIEWED: "cart_viewed",
|
|
7
|
+
SEARCH_VIEWED: "search_viewed",
|
|
8
|
+
CART_UPDATED: "cart_updated",
|
|
9
|
+
PRODUCT_ADD_TO_CART: "product_added_to_cart",
|
|
10
|
+
PRODUCT_REMOVED_FROM_CART: "product_removed_from_cart"
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
//#endregion
|
|
14
|
+
export { AnalyticsEvent };
|
|
15
|
+
//# sourceMappingURL=events.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.mjs","names":[],"sources":["../../../src/core/analytics/events.ts"],"sourcesContent":["export const AnalyticsEvent = {\n PAGE_VIEWED: \"page_viewed\" as const,\n PRODUCT_VIEWED: \"product_viewed\" as const,\n COLLECTION_VIEWED: \"collection_viewed\" as const,\n CART_VIEWED: \"cart_viewed\" as const,\n SEARCH_VIEWED: \"search_viewed\" as const,\n\n CART_UPDATED: \"cart_updated\" as const,\n PRODUCT_ADD_TO_CART: \"product_added_to_cart\" as const,\n PRODUCT_REMOVED_FROM_CART: \"product_removed_from_cart\" as const,\n};\n\nexport type AnalyticsEventName = (typeof AnalyticsEvent)[keyof typeof AnalyticsEvent];\n"],"mappings":";AAAA,MAAa,iBAAiB;CAC5B,aAAa;CACb,gBAAgB;CAChB,mBAAmB;CACnB,aAAa;CACb,eAAe;CAEf,cAAc;CACd,qBAAqB;CACrB,2BAA2B;CAC5B"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { trackCartAnalytics } from "./cart-tracker.mjs";
|
|
2
|
+
import { AnalyticsEvent, AnalyticsEventName } from "./events.mjs";
|
|
3
|
+
import { AnalyticsCart, AnalyticsCartLine, AnalyticsEventMap, CartLineUpdatePayload, CartUpdatePayload, CartViewPayload, CollectionViewPayload, ConsentConfig, EventPayloads, OtherData, PageViewPayload, PayloadFor, ProductPayload, ProductViewPayload, SearchViewPayload, ShopAnalytics, StorefrontAnalytics, StorefrontAnalyticsConfig, StorefrontAnalyticsDestination, StorefrontAnalyticsDestinationSetupContext } from "./types.mjs";
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { AnalyticsEventName } from "./events.mjs";
|
|
2
|
+
import { ShopifyScriptsShop } from "../shopify-scripts/types.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/core/analytics/types.d.ts
|
|
5
|
+
type ShopAnalyticsBase = Pick<ShopifyScriptsShop, "shopId">;
|
|
6
|
+
type ShopAnalyticsChannel = "hydrogen" | "headless";
|
|
7
|
+
type ShopAnalytics = (ShopAnalyticsBase & {
|
|
8
|
+
channel: "hydrogen";
|
|
9
|
+
storefrontId: ShopifyScriptsShop["storefrontId"];
|
|
10
|
+
}) | (ShopAnalyticsBase & {
|
|
11
|
+
channel: "headless";
|
|
12
|
+
storefrontId?: never;
|
|
13
|
+
});
|
|
14
|
+
type ConsentConfig = {
|
|
15
|
+
mode?: "default-banner" | "custom-banner" | "no-banner";
|
|
16
|
+
};
|
|
17
|
+
type AnalyticsCartLine = {
|
|
18
|
+
id: string;
|
|
19
|
+
quantity: number;
|
|
20
|
+
merchandise: {
|
|
21
|
+
id: string;
|
|
22
|
+
title: string;
|
|
23
|
+
price: {
|
|
24
|
+
amount: string;
|
|
25
|
+
currencyCode?: string;
|
|
26
|
+
};
|
|
27
|
+
sku?: string | null;
|
|
28
|
+
product: {
|
|
29
|
+
id: string;
|
|
30
|
+
title: string;
|
|
31
|
+
vendor: string;
|
|
32
|
+
productType?: string;
|
|
33
|
+
handle?: string;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
type AnalyticsCart = {
|
|
38
|
+
id: string;
|
|
39
|
+
updatedAt: string;
|
|
40
|
+
cost?: {
|
|
41
|
+
subtotalAmount?: {
|
|
42
|
+
currencyCode?: string;
|
|
43
|
+
};
|
|
44
|
+
totalAmount?: {
|
|
45
|
+
currencyCode?: string;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
lines: {
|
|
49
|
+
nodes?: AnalyticsCartLine[];
|
|
50
|
+
edges?: Array<{
|
|
51
|
+
node: AnalyticsCartLine;
|
|
52
|
+
}>;
|
|
53
|
+
};
|
|
54
|
+
[key: string]: unknown;
|
|
55
|
+
};
|
|
56
|
+
type OtherData = {
|
|
57
|
+
[key: string]: unknown;
|
|
58
|
+
};
|
|
59
|
+
type BasePayload = {
|
|
60
|
+
shop?: ShopAnalytics | null;
|
|
61
|
+
customData?: Record<string, unknown>;
|
|
62
|
+
};
|
|
63
|
+
type UrlPayload = {
|
|
64
|
+
url?: string;
|
|
65
|
+
};
|
|
66
|
+
type ProductPayload = {
|
|
67
|
+
id: string;
|
|
68
|
+
title: string;
|
|
69
|
+
price: string;
|
|
70
|
+
vendor: string;
|
|
71
|
+
variantId: string;
|
|
72
|
+
variantTitle: string;
|
|
73
|
+
quantity: number;
|
|
74
|
+
sku?: string | null;
|
|
75
|
+
productType?: string;
|
|
76
|
+
};
|
|
77
|
+
type ProductsPayload = {
|
|
78
|
+
products: Array<ProductPayload & OtherData>;
|
|
79
|
+
};
|
|
80
|
+
type CollectionPayload = {
|
|
81
|
+
collection: {
|
|
82
|
+
id: string;
|
|
83
|
+
handle: string;
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
type SearchPayload = {
|
|
87
|
+
searchTerm: string;
|
|
88
|
+
searchResults?: unknown;
|
|
89
|
+
};
|
|
90
|
+
type CartPayload = {
|
|
91
|
+
cart: AnalyticsCart | null;
|
|
92
|
+
};
|
|
93
|
+
type CartChangePayload = CartPayload & {
|
|
94
|
+
prevCart: AnalyticsCart | null;
|
|
95
|
+
};
|
|
96
|
+
type CartLinePayload = {
|
|
97
|
+
prevLine?: AnalyticsCartLine;
|
|
98
|
+
currentLine?: AnalyticsCartLine;
|
|
99
|
+
};
|
|
100
|
+
type PageViewPayload = UrlPayload & BasePayload;
|
|
101
|
+
type ProductViewPayload = ProductsPayload & UrlPayload & BasePayload;
|
|
102
|
+
type CollectionViewPayload = CollectionPayload & UrlPayload & BasePayload;
|
|
103
|
+
type CartViewPayload = CartPayload & UrlPayload & BasePayload;
|
|
104
|
+
type SearchViewPayload = SearchPayload & UrlPayload & BasePayload;
|
|
105
|
+
type CartUpdatePayload = CartChangePayload & BasePayload & OtherData;
|
|
106
|
+
type CartLineUpdatePayload = CartLinePayload & CartChangePayload & BasePayload & OtherData;
|
|
107
|
+
type EventPayloads = PageViewPayload | ProductViewPayload | CollectionViewPayload | CartViewPayload | SearchViewPayload | CartUpdatePayload | CartLineUpdatePayload;
|
|
108
|
+
interface AnalyticsEventMap {
|
|
109
|
+
page_viewed: PageViewPayload;
|
|
110
|
+
product_viewed: ProductViewPayload;
|
|
111
|
+
collection_viewed: CollectionViewPayload;
|
|
112
|
+
cart_viewed: CartViewPayload;
|
|
113
|
+
search_viewed: SearchViewPayload;
|
|
114
|
+
cart_updated: CartUpdatePayload;
|
|
115
|
+
product_added_to_cart: CartLineUpdatePayload;
|
|
116
|
+
product_removed_from_cart: CartLineUpdatePayload;
|
|
117
|
+
}
|
|
118
|
+
/** Resolves the payload type for a supported analytics event name. */
|
|
119
|
+
type PayloadFor<E extends AnalyticsEventName> = AnalyticsEventMap[E];
|
|
120
|
+
type PublishPayloadArgs<E extends AnalyticsEventName> = {} extends PayloadFor<E> ? [payload?: PayloadFor<E>] : [payload: PayloadFor<E>];
|
|
121
|
+
type StorefrontAnalyticsConfig = {
|
|
122
|
+
shop: ShopAnalytics | null;
|
|
123
|
+
consent: ConsentConfig;
|
|
124
|
+
customData?: Record<string, unknown>;
|
|
125
|
+
};
|
|
126
|
+
type StorefrontAnalyticsDestinationSetupContext = {
|
|
127
|
+
subscribe: <E extends AnalyticsEventName>(event: E, callback: (payload: PayloadFor<E>) => void) => () => void;
|
|
128
|
+
getConfig: () => StorefrontAnalyticsConfig;
|
|
129
|
+
};
|
|
130
|
+
type StorefrontAnalyticsDestination = {
|
|
131
|
+
name: string;
|
|
132
|
+
setup: (context: StorefrontAnalyticsDestinationSetupContext) => void | (() => void) | Promise<void | (() => void)>;
|
|
133
|
+
};
|
|
134
|
+
type StorefrontAnalytics = {
|
|
135
|
+
publish: <E extends AnalyticsEventName>(event: E, ...payload: PublishPayloadArgs<E>) => void; /** Listen for live analytics events. Destination integrations should use `addDestination()`. */
|
|
136
|
+
subscribe: <E extends AnalyticsEventName>(event: E, callback: (payload: PayloadFor<E>) => void) => () => void;
|
|
137
|
+
addDestination: (destination: StorefrontAnalyticsDestination) => () => void;
|
|
138
|
+
destroy: () => void;
|
|
139
|
+
getConfig: () => StorefrontAnalyticsConfig;
|
|
140
|
+
};
|
|
141
|
+
//#endregion
|
|
142
|
+
export { AnalyticsCart, AnalyticsCartLine, AnalyticsEventMap, CartLineUpdatePayload, CartUpdatePayload, CartViewPayload, CollectionViewPayload, ConsentConfig, EventPayloads, OtherData, PageViewPayload, PayloadFor, ProductPayload, ProductViewPayload, SearchViewPayload, ShopAnalytics, ShopAnalyticsChannel, StorefrontAnalytics, StorefrontAnalyticsConfig, StorefrontAnalyticsDestination, StorefrontAnalyticsDestinationSetupContext };
|
|
143
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/core/analytics/utils/flatten-connection.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Normalizes Shopify's GraphQL connection format into a flat array.
|
|
4
|
+
*
|
|
5
|
+
* Shopify's Storefront API returns list fields (like cart `lines`) in a
|
|
6
|
+
* "connection" wrapper — either `{ nodes: [...] }` or `{ edges: [{ node: ... }] }`.
|
|
7
|
+
* Hydrogen queries typically use `nodes`, but queries written with the `edges`
|
|
8
|
+
* pattern are supported too.
|
|
9
|
+
*/
|
|
10
|
+
type Connection<T> = {
|
|
11
|
+
nodes?: T[];
|
|
12
|
+
edges?: Array<{
|
|
13
|
+
node: T;
|
|
14
|
+
}>;
|
|
15
|
+
};
|
|
16
|
+
declare function flattenConnection<T>(connection?: Connection<T> | null): T[];
|
|
17
|
+
//#endregion
|
|
18
|
+
export { flattenConnection };
|
|
19
|
+
//# sourceMappingURL=flatten-connection.d.mts.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { getLogger } from "../../logging/logging.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/analytics/utils/flatten-connection.ts
|
|
4
|
+
/**
|
|
5
|
+
* Normalizes Shopify's GraphQL connection format into a flat array.
|
|
6
|
+
*
|
|
7
|
+
* Shopify's Storefront API returns list fields (like cart `lines`) in a
|
|
8
|
+
* "connection" wrapper — either `{ nodes: [...] }` or `{ edges: [{ node: ... }] }`.
|
|
9
|
+
* Hydrogen queries typically use `nodes`, but queries written with the `edges`
|
|
10
|
+
* pattern are supported too.
|
|
11
|
+
*/
|
|
12
|
+
const log = getLogger("analytics");
|
|
13
|
+
function flattenConnection(connection) {
|
|
14
|
+
if (!connection) {
|
|
15
|
+
if (connection === null) log.warn("received null connection; expected an object with `nodes` or `edges`");
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
if ("nodes" in connection && connection.nodes) return connection.nodes;
|
|
19
|
+
if ("edges" in connection && Array.isArray(connection.edges)) return connection.edges.map((edge) => edge.node);
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
export { flattenConnection };
|
|
25
|
+
//# sourceMappingURL=flatten-connection.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatten-connection.mjs","names":[],"sources":["../../../../src/core/analytics/utils/flatten-connection.ts"],"sourcesContent":["/**\n * Normalizes Shopify's GraphQL connection format into a flat array.\n *\n * Shopify's Storefront API returns list fields (like cart `lines`) in a\n * \"connection\" wrapper — either `{ nodes: [...] }` or `{ edges: [{ node: ... }] }`.\n * Hydrogen queries typically use `nodes`, but queries written with the `edges`\n * pattern are supported too.\n */\n\nimport { getLogger } from \"../../logging\";\n\nconst log = getLogger(\"analytics\");\n\ntype Connection<T> = {\n nodes?: T[];\n edges?: Array<{ node: T }>;\n};\n\nexport function flattenConnection<T>(connection?: Connection<T> | null): T[] {\n if (!connection) {\n if (connection === null) {\n log.warn(\"received null connection; expected an object with `nodes` or `edges`\");\n }\n return [];\n }\n\n if (\"nodes\" in connection && connection.nodes) {\n return connection.nodes;\n }\n\n if (\"edges\" in connection && Array.isArray(connection.edges)) {\n return connection.edges.map((edge) => edge.node);\n }\n\n return [];\n}\n"],"mappings":";;;;;;;;;;;AAWA,MAAM,MAAM,UAAU,YAAY;AAOlC,SAAgB,kBAAqB,YAAwC;AAC3E,KAAI,CAAC,YAAY;AACf,MAAI,eAAe,KACjB,KAAI,KAAK,uEAAuE;AAElF,SAAO,EAAE;;AAGX,KAAI,WAAW,cAAc,WAAW,MACtC,QAAO,WAAW;AAGpB,KAAI,WAAW,cAAc,MAAM,QAAQ,WAAW,MAAM,CAC1D,QAAO,WAAW,MAAM,KAAK,SAAS,KAAK,KAAK;AAGlD,QAAO,EAAE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//#region src/core/cache/cache-status.ts
|
|
2
|
+
const HYDROGEN_CACHE_STATUS_PRODUCT = "Hydrogen";
|
|
3
|
+
function getHydrogenCacheStatus(headers) {
|
|
4
|
+
const cacheStatus = headers.get("cache-status");
|
|
5
|
+
if (!cacheStatus) return void 0;
|
|
6
|
+
for (const member of cacheStatus.split(",")) {
|
|
7
|
+
const [product, ...parameters] = member.split(";").map((part) => part.trim());
|
|
8
|
+
if (product !== "Hydrogen") continue;
|
|
9
|
+
if (parameters.includes("hit")) return "hit";
|
|
10
|
+
if (parameters.some((parameter) => parameter.startsWith("fwd=bypass"))) return "bypass";
|
|
11
|
+
if (parameters.some((parameter) => parameter.startsWith("fwd="))) return "miss";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
//#endregion
|
|
16
|
+
export { HYDROGEN_CACHE_STATUS_PRODUCT, getHydrogenCacheStatus };
|
|
17
|
+
//# sourceMappingURL=cache-status.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-status.mjs","names":[],"sources":["../../../src/core/cache/cache-status.ts"],"sourcesContent":["export const HYDROGEN_CACHE_STATUS_PRODUCT = \"Hydrogen\";\n\ntype HydrogenCacheStatus = \"hit\" | \"miss\" | \"bypass\";\n\nexport function getHydrogenCacheStatus(headers: Headers): HydrogenCacheStatus | undefined {\n const cacheStatus = headers.get(\"cache-status\");\n if (!cacheStatus) return undefined;\n\n for (const member of cacheStatus.split(\",\")) {\n const [product, ...parameters] = member.split(\";\").map((part) => part.trim());\n if (product !== HYDROGEN_CACHE_STATUS_PRODUCT) continue;\n\n if (parameters.includes(\"hit\")) return \"hit\";\n if (parameters.some((parameter) => parameter.startsWith(\"fwd=bypass\"))) return \"bypass\";\n if (parameters.some((parameter) => parameter.startsWith(\"fwd=\"))) return \"miss\";\n }\n\n return undefined;\n}\n"],"mappings":";AAAA,MAAa,gCAAgC;AAI7C,SAAgB,uBAAuB,SAAmD;CACxF,MAAM,cAAc,QAAQ,IAAI,eAAe;AAC/C,KAAI,CAAC,YAAa,QAAO;AAEzB,MAAK,MAAM,UAAU,YAAY,MAAM,IAAI,EAAE;EAC3C,MAAM,CAAC,SAAS,GAAG,cAAc,OAAO,MAAM,IAAI,CAAC,KAAK,SAAS,KAAK,MAAM,CAAC;AAC7E,MAAI,uBAA2C;AAE/C,MAAI,WAAW,SAAS,MAAM,CAAE,QAAO;AACvC,MAAI,WAAW,MAAM,cAAc,UAAU,WAAW,aAAa,CAAC,CAAE,QAAO;AAC/E,MAAI,WAAW,MAAM,cAAc,UAAU,WAAW,OAAO,CAAC,CAAE,QAAO"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { CacheKey } from "./key.mjs";
|
|
2
|
+
import { CachingStrategy } from "./strategies.mjs";
|
|
3
|
+
import { CreateRunWithCacheOptions, RunWithCache } from "./run-with-cache.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/core/cache/fetch-with-cache.d.ts
|
|
6
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
7
|
+
type FetchInput = Parameters<typeof fetch>[0];
|
|
8
|
+
type FetchInit = Parameters<typeof fetch>[1];
|
|
9
|
+
type FetchCacheResponseContext = {
|
|
10
|
+
ok: boolean;
|
|
11
|
+
status: number;
|
|
12
|
+
statusText: string;
|
|
13
|
+
headers: Headers;
|
|
14
|
+
url: string;
|
|
15
|
+
text(): Promise<string>;
|
|
16
|
+
json?: () => Promise<unknown>;
|
|
17
|
+
};
|
|
18
|
+
type FetchCacheOptions = {
|
|
19
|
+
key: CacheKey;
|
|
20
|
+
strategy: CachingStrategy;
|
|
21
|
+
annotateCacheStatus?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Runs only for OK responses with text-serializable bodies. Non-OK responses
|
|
24
|
+
* and binary/streaming responses are never cached.
|
|
25
|
+
*/
|
|
26
|
+
shouldCacheResponse?: (context: FetchCacheResponseContext) => MaybePromise<boolean>;
|
|
27
|
+
};
|
|
28
|
+
type FetchWithCache = {
|
|
29
|
+
(input: FetchInput, init?: FetchInit): Promise<Response>;
|
|
30
|
+
(input: FetchInput, init: FetchInit | undefined, options: FetchCacheOptions): Promise<Response>;
|
|
31
|
+
};
|
|
32
|
+
type CreateFetchWithCacheOptions = (CreateRunWithCacheOptions | {
|
|
33
|
+
runWithCache: RunWithCache;
|
|
34
|
+
}) & {
|
|
35
|
+
fetch?: typeof fetch;
|
|
36
|
+
};
|
|
37
|
+
declare function createFetchWithCache({
|
|
38
|
+
fetch: customFetch,
|
|
39
|
+
...options
|
|
40
|
+
}: CreateFetchWithCacheOptions): FetchWithCache;
|
|
41
|
+
//#endregion
|
|
42
|
+
export { createFetchWithCache };
|
|
43
|
+
//# sourceMappingURL=fetch-with-cache.d.mts.map
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { HYDROGEN_CACHE_STATUS_PRODUCT } from "./cache-status.mjs";
|
|
2
|
+
import { NO_STORE } from "./strategies.mjs";
|
|
3
|
+
import { StaleFallbackDisabledError, createRunWithCache } from "./run-with-cache.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/core/cache/fetch-with-cache.ts
|
|
6
|
+
const excludedCachedResponseHeaders = new Set(["set-cookie", "server-timing"]);
|
|
7
|
+
const staleIfErrorStatuses = new Set([
|
|
8
|
+
500,
|
|
9
|
+
502,
|
|
10
|
+
503,
|
|
11
|
+
504
|
|
12
|
+
]);
|
|
13
|
+
var UnserializableResponseError = class extends StaleFallbackDisabledError {
|
|
14
|
+
constructor() {
|
|
15
|
+
super("Response body is not serializable for cache.");
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
var StaleFallbackEligibleResponseError = class extends Error {
|
|
19
|
+
constructor() {
|
|
20
|
+
super("Origin returned an unserializable response eligible for stale-if-error fallback.");
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
var ServerResponseError = class extends Error {
|
|
24
|
+
response;
|
|
25
|
+
constructor(response) {
|
|
26
|
+
super("Origin returned a response eligible for stale-if-error fallback.");
|
|
27
|
+
this.response = response;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
function createFetchWithCache({ fetch: customFetch, ...options }) {
|
|
31
|
+
const resolvedFetch = customFetch ?? globalThis.fetch;
|
|
32
|
+
const runWithCache = "runWithCache" in options ? options.runWithCache : createRunWithCache(options);
|
|
33
|
+
return async function fetchWithCache(input, init, cacheOptions) {
|
|
34
|
+
if (!cacheOptions) return resolvedFetch(input, init);
|
|
35
|
+
if (cacheOptions.strategy.mode === "no-store") return annotateResponse(await resolvedFetch(input, init), getCacheStatusHeader("fwd=bypass"), cacheOptions);
|
|
36
|
+
let passthroughResponse;
|
|
37
|
+
let result;
|
|
38
|
+
try {
|
|
39
|
+
result = await runWithCache({
|
|
40
|
+
key: cacheOptions.key,
|
|
41
|
+
strategy: cacheOptions.strategy
|
|
42
|
+
}, async () => {
|
|
43
|
+
const response = await resolvedFetch(input, init);
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
if (isStaleIfErrorStatus(response.status)) {
|
|
46
|
+
if (!canSerializeBodyAsText(response)) {
|
|
47
|
+
passthroughResponse = response;
|
|
48
|
+
throw new StaleFallbackEligibleResponseError();
|
|
49
|
+
}
|
|
50
|
+
throw new ServerResponseError(await serializeResponse(response, {
|
|
51
|
+
cacheable: false,
|
|
52
|
+
fallbackOnError: true
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
data: await serializeResponse(response, {
|
|
57
|
+
cacheable: false,
|
|
58
|
+
fallbackOnError: true
|
|
59
|
+
}),
|
|
60
|
+
shouldCache: false
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (!canSerializeBodyAsText(response)) {
|
|
64
|
+
passthroughResponse = response;
|
|
65
|
+
throw new UnserializableResponseError();
|
|
66
|
+
}
|
|
67
|
+
const bodyReader = createBodyReader(response);
|
|
68
|
+
if (!await shouldCacheResponse(response, bodyReader, cacheOptions)) return {
|
|
69
|
+
data: await serializeResponse(response, {
|
|
70
|
+
bodyReader,
|
|
71
|
+
cacheable: false,
|
|
72
|
+
fallbackOnError: true
|
|
73
|
+
}),
|
|
74
|
+
shouldCache: false
|
|
75
|
+
};
|
|
76
|
+
const data = await serializeResponse(response, {
|
|
77
|
+
bodyReader,
|
|
78
|
+
cacheable: true,
|
|
79
|
+
fallbackOnError: true
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
data,
|
|
83
|
+
shouldCache: data.cacheable
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
} catch (error) {
|
|
87
|
+
if (error instanceof ServerResponseError) return annotateResponse(fromSerializableResponse(error.response), getCacheStatusHeader("fwd=bypass"), cacheOptions);
|
|
88
|
+
if (error instanceof UnserializableResponseError) return annotateResponse(passthroughResponse ?? await resolvedFetch(input, init), getCacheStatusHeader("fwd=bypass"), cacheOptions);
|
|
89
|
+
if (error instanceof StaleFallbackEligibleResponseError) return annotateResponse(passthroughResponse ?? await resolvedFetch(input, init), getCacheStatusHeader("fwd=bypass"), cacheOptions);
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
return annotateResponse(fromSerializableResponse(result.data), result.cacheStatus === "hit" ? getCacheStatusHeader("hit") : getNonHitCacheStatusHeader(result.data.cacheable, result.cacheStatus), cacheOptions);
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function shouldCacheResponse(response, bodyReader, options) {
|
|
96
|
+
const context = {
|
|
97
|
+
ok: response.ok,
|
|
98
|
+
status: response.status,
|
|
99
|
+
statusText: response.statusText,
|
|
100
|
+
headers: new Headers(response.headers),
|
|
101
|
+
url: response.url,
|
|
102
|
+
text: bodyReader.text
|
|
103
|
+
};
|
|
104
|
+
if (isJsonResponse(response)) context.json = bodyReader.json;
|
|
105
|
+
return options.shouldCacheResponse?.(context) ?? true;
|
|
106
|
+
}
|
|
107
|
+
function createBodyReader(response) {
|
|
108
|
+
let bodyText;
|
|
109
|
+
let bodyJson;
|
|
110
|
+
const text = () => {
|
|
111
|
+
bodyText ??= response.text();
|
|
112
|
+
return bodyText;
|
|
113
|
+
};
|
|
114
|
+
return {
|
|
115
|
+
text,
|
|
116
|
+
json() {
|
|
117
|
+
bodyJson ??= text().then((value) => JSON.parse(value));
|
|
118
|
+
return bodyJson;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
async function serializeResponse(response, { bodyReader, cacheable, fallbackOnError = false }) {
|
|
123
|
+
if (!canSerializeBodyAsText(response)) return emptySerializableResponse(response);
|
|
124
|
+
try {
|
|
125
|
+
return {
|
|
126
|
+
body: await (bodyReader ?? createBodyReader(response)).text(),
|
|
127
|
+
cacheable,
|
|
128
|
+
headers: getSerializableHeaders(response.headers, cacheable),
|
|
129
|
+
status: response.status,
|
|
130
|
+
statusText: response.statusText
|
|
131
|
+
};
|
|
132
|
+
} catch (error) {
|
|
133
|
+
if (!fallbackOnError) throw error;
|
|
134
|
+
return emptySerializableResponse(response);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function fromSerializableResponse(response) {
|
|
138
|
+
return new Response(response.body, {
|
|
139
|
+
headers: response.headers,
|
|
140
|
+
status: response.status,
|
|
141
|
+
statusText: response.statusText
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
function emptySerializableResponse(response) {
|
|
145
|
+
return {
|
|
146
|
+
body: "",
|
|
147
|
+
cacheable: false,
|
|
148
|
+
headers: [],
|
|
149
|
+
status: response.status,
|
|
150
|
+
statusText: response.statusText
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
function getSerializableHeaders(headers, cacheable) {
|
|
154
|
+
if (!cacheable) return [...headers];
|
|
155
|
+
return [...headers].filter(([key]) => !excludedCachedResponseHeaders.has(key.toLowerCase()));
|
|
156
|
+
}
|
|
157
|
+
function annotateResponse(response, cacheStatus, options) {
|
|
158
|
+
if (options.annotateCacheStatus === false) return response;
|
|
159
|
+
const headers = new Headers(response.headers);
|
|
160
|
+
headers.append("Cache-Status", cacheStatus);
|
|
161
|
+
return new Response(response.body, {
|
|
162
|
+
headers,
|
|
163
|
+
status: response.status,
|
|
164
|
+
statusText: response.statusText
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
function getNonHitCacheStatusHeader(shouldCache, cacheStatus) {
|
|
168
|
+
if (cacheStatus === "bypass") return getCacheStatusHeader("fwd=bypass");
|
|
169
|
+
return shouldCache ? getCacheStatusHeader("fwd=uri-miss; stored") : getCacheStatusHeader("fwd=bypass");
|
|
170
|
+
}
|
|
171
|
+
function getCacheStatusHeader(value) {
|
|
172
|
+
return `${HYDROGEN_CACHE_STATUS_PRODUCT}; ${value}`;
|
|
173
|
+
}
|
|
174
|
+
function isJsonResponse(response) {
|
|
175
|
+
return response.headers.get("content-type")?.toLowerCase().includes("json") ?? false;
|
|
176
|
+
}
|
|
177
|
+
function isStaleIfErrorStatus(status) {
|
|
178
|
+
return staleIfErrorStatuses.has(status);
|
|
179
|
+
}
|
|
180
|
+
function canSerializeBodyAsText(response) {
|
|
181
|
+
if (response.body == null) return true;
|
|
182
|
+
const contentType = response.headers.get("content-type");
|
|
183
|
+
return contentType != null && /\b(json|text|xml|html|graphql|javascript)\b/i.test(contentType);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
//#endregion
|
|
187
|
+
export { createFetchWithCache };
|
|
188
|
+
//# sourceMappingURL=fetch-with-cache.mjs.map
|