@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,137 @@
|
|
|
1
|
+
import { CartErrorCode, CartWarningCode } from "../../graphql/generated/storefront-api-types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/cart/state.d.ts
|
|
4
|
+
interface Money {
|
|
5
|
+
amount: string;
|
|
6
|
+
currencyCode: string;
|
|
7
|
+
}
|
|
8
|
+
interface CartCost {
|
|
9
|
+
subtotalAmount: Money;
|
|
10
|
+
totalAmount: Money;
|
|
11
|
+
checkoutChargeAmount: Money;
|
|
12
|
+
}
|
|
13
|
+
interface CartLineCost {
|
|
14
|
+
totalAmount: Money;
|
|
15
|
+
subtotalAmount: Money;
|
|
16
|
+
amountPerQuantity: Money;
|
|
17
|
+
compareAtAmountPerQuantity: Money | null;
|
|
18
|
+
}
|
|
19
|
+
interface CartLineMerchandise {
|
|
20
|
+
id: string;
|
|
21
|
+
title?: string;
|
|
22
|
+
selectedOptions?: Array<{
|
|
23
|
+
name: string;
|
|
24
|
+
value: string;
|
|
25
|
+
}>;
|
|
26
|
+
product: {
|
|
27
|
+
title: string;
|
|
28
|
+
handle?: string;
|
|
29
|
+
[key: string]: unknown;
|
|
30
|
+
};
|
|
31
|
+
image?: {
|
|
32
|
+
id?: string | null;
|
|
33
|
+
url: string;
|
|
34
|
+
altText?: string | null;
|
|
35
|
+
width?: number | null;
|
|
36
|
+
height?: number | null;
|
|
37
|
+
[key: string]: unknown;
|
|
38
|
+
} | null;
|
|
39
|
+
quantityAvailable?: number | null;
|
|
40
|
+
[key: string]: unknown;
|
|
41
|
+
}
|
|
42
|
+
interface CartLine {
|
|
43
|
+
id: string;
|
|
44
|
+
quantity: number;
|
|
45
|
+
attributes?: Attribute[];
|
|
46
|
+
cost: CartLineCost;
|
|
47
|
+
merchandise?: CartLineMerchandise;
|
|
48
|
+
sellingPlanAllocation?: {
|
|
49
|
+
sellingPlan: {
|
|
50
|
+
id: string;
|
|
51
|
+
};
|
|
52
|
+
} | null;
|
|
53
|
+
parentRelationship?: {
|
|
54
|
+
parent: {
|
|
55
|
+
id: string;
|
|
56
|
+
};
|
|
57
|
+
} | null;
|
|
58
|
+
lineComponents?: CartLine[];
|
|
59
|
+
}
|
|
60
|
+
interface CartLineConnection {
|
|
61
|
+
nodes: CartLine[];
|
|
62
|
+
[key: string]: unknown;
|
|
63
|
+
}
|
|
64
|
+
interface DiscountCode {
|
|
65
|
+
code: string;
|
|
66
|
+
applicable: boolean;
|
|
67
|
+
}
|
|
68
|
+
interface CartUserError {
|
|
69
|
+
code: CartErrorCode | null;
|
|
70
|
+
message: string;
|
|
71
|
+
field?: string[];
|
|
72
|
+
}
|
|
73
|
+
interface CartWarning {
|
|
74
|
+
code: CartWarningCode;
|
|
75
|
+
message: string;
|
|
76
|
+
}
|
|
77
|
+
interface CartErrorGroup {
|
|
78
|
+
userErrors: CartUserError[];
|
|
79
|
+
warnings: CartWarning[];
|
|
80
|
+
}
|
|
81
|
+
interface CartNetworkEntry {
|
|
82
|
+
message: string;
|
|
83
|
+
status?: number;
|
|
84
|
+
}
|
|
85
|
+
interface Attribute {
|
|
86
|
+
key: string;
|
|
87
|
+
value: string | null;
|
|
88
|
+
}
|
|
89
|
+
interface CartPending {
|
|
90
|
+
lines: Set<string>;
|
|
91
|
+
note: boolean;
|
|
92
|
+
attributes: boolean;
|
|
93
|
+
discountCodes: Set<string>;
|
|
94
|
+
cost?: boolean;
|
|
95
|
+
}
|
|
96
|
+
interface CartErrorState {
|
|
97
|
+
cart: CartErrorGroup;
|
|
98
|
+
lines: Map<string, CartErrorGroup>;
|
|
99
|
+
note: CartErrorGroup;
|
|
100
|
+
attributes: Map<string, CartErrorGroup>;
|
|
101
|
+
discountCodes: Map<string, CartErrorGroup>;
|
|
102
|
+
network: CartNetworkEntry[];
|
|
103
|
+
lastUpdatedAt: number;
|
|
104
|
+
cartUpdatedAt: number;
|
|
105
|
+
linesUpdatedAt: number;
|
|
106
|
+
noteUpdatedAt: number;
|
|
107
|
+
attributesUpdatedAt: number;
|
|
108
|
+
discountCodesUpdatedAt: number;
|
|
109
|
+
networkUpdatedAt: number;
|
|
110
|
+
}
|
|
111
|
+
interface CartData {
|
|
112
|
+
id: string | null;
|
|
113
|
+
checkoutUrl?: string | null;
|
|
114
|
+
totalQuantity: number;
|
|
115
|
+
cost: CartCost;
|
|
116
|
+
note?: string | null;
|
|
117
|
+
attributes: Attribute[];
|
|
118
|
+
lines: CartLineConnection;
|
|
119
|
+
discountCodes: DiscountCode[];
|
|
120
|
+
[key: string]: unknown;
|
|
121
|
+
}
|
|
122
|
+
interface CartState<TData extends CartData = CartData> {
|
|
123
|
+
data: TData;
|
|
124
|
+
loading: boolean;
|
|
125
|
+
/** Non-rejecting signal that resolves when the current full-cart load settles or is invalidated. */
|
|
126
|
+
readonly readyPromise?: PromiseLike<void>;
|
|
127
|
+
pending: CartPending;
|
|
128
|
+
revalidating?: boolean;
|
|
129
|
+
errors: CartErrorState;
|
|
130
|
+
}
|
|
131
|
+
declare function createEmptyErrorGroup(): CartErrorGroup;
|
|
132
|
+
declare function createEmptyCartErrors(): CartErrorState;
|
|
133
|
+
declare const EMPTY_CART_DATA: CartData;
|
|
134
|
+
declare const EMPTY_CART_STATE: CartState;
|
|
135
|
+
//#endregion
|
|
136
|
+
export { Attribute, CartCost, CartData, CartErrorGroup, CartErrorState, CartLine, CartLineConnection, CartLineCost, CartLineMerchandise, CartNetworkEntry, CartPending, CartState, CartUserError, CartWarning, DiscountCode, EMPTY_CART_DATA, EMPTY_CART_STATE, createEmptyCartErrors, createEmptyErrorGroup };
|
|
137
|
+
//# sourceMappingURL=state.d.mts.map
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
//#region src/core/cart/state.ts
|
|
2
|
+
function createEmptyPending() {
|
|
3
|
+
return {
|
|
4
|
+
lines: /* @__PURE__ */ new Set(),
|
|
5
|
+
note: false,
|
|
6
|
+
attributes: false,
|
|
7
|
+
discountCodes: /* @__PURE__ */ new Set(),
|
|
8
|
+
cost: false
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function createEmptyErrorGroup() {
|
|
12
|
+
return {
|
|
13
|
+
userErrors: [],
|
|
14
|
+
warnings: []
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function createEmptyCartErrors() {
|
|
18
|
+
return {
|
|
19
|
+
cart: createEmptyErrorGroup(),
|
|
20
|
+
lines: /* @__PURE__ */ new Map(),
|
|
21
|
+
note: createEmptyErrorGroup(),
|
|
22
|
+
attributes: /* @__PURE__ */ new Map(),
|
|
23
|
+
discountCodes: /* @__PURE__ */ new Map(),
|
|
24
|
+
network: [],
|
|
25
|
+
lastUpdatedAt: 0,
|
|
26
|
+
cartUpdatedAt: 0,
|
|
27
|
+
linesUpdatedAt: 0,
|
|
28
|
+
noteUpdatedAt: 0,
|
|
29
|
+
attributesUpdatedAt: 0,
|
|
30
|
+
discountCodesUpdatedAt: 0,
|
|
31
|
+
networkUpdatedAt: 0
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const EMPTY_CART_DATA = Object.freeze({
|
|
35
|
+
id: null,
|
|
36
|
+
checkoutUrl: null,
|
|
37
|
+
totalQuantity: 0,
|
|
38
|
+
cost: Object.freeze({
|
|
39
|
+
subtotalAmount: Object.freeze({
|
|
40
|
+
amount: "0",
|
|
41
|
+
currencyCode: ""
|
|
42
|
+
}),
|
|
43
|
+
totalAmount: Object.freeze({
|
|
44
|
+
amount: "0",
|
|
45
|
+
currencyCode: ""
|
|
46
|
+
}),
|
|
47
|
+
checkoutChargeAmount: Object.freeze({
|
|
48
|
+
amount: "0",
|
|
49
|
+
currencyCode: ""
|
|
50
|
+
})
|
|
51
|
+
}),
|
|
52
|
+
note: "",
|
|
53
|
+
attributes: [],
|
|
54
|
+
lines: Object.freeze({ nodes: [] }),
|
|
55
|
+
discountCodes: []
|
|
56
|
+
});
|
|
57
|
+
function createCartState(data, { loading = false } = {}) {
|
|
58
|
+
return {
|
|
59
|
+
data,
|
|
60
|
+
loading,
|
|
61
|
+
pending: createEmptyPending(),
|
|
62
|
+
errors: createEmptyCartErrors()
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function createEmptyCartState({ loading = true } = {}) {
|
|
66
|
+
return createCartState({
|
|
67
|
+
...EMPTY_CART_DATA,
|
|
68
|
+
lines: { nodes: [] },
|
|
69
|
+
discountCodes: []
|
|
70
|
+
}, { loading });
|
|
71
|
+
}
|
|
72
|
+
const EMPTY_CART_STATE = createEmptyCartState();
|
|
73
|
+
|
|
74
|
+
//#endregion
|
|
75
|
+
export { EMPTY_CART_DATA, EMPTY_CART_STATE, createCartState, createEmptyCartErrors, createEmptyCartState, createEmptyErrorGroup };
|
|
76
|
+
//# sourceMappingURL=state.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.mjs","names":[],"sources":["../../../../src/core/cart/state.ts"],"sourcesContent":["import type { CartErrorCode, CartWarningCode } from \"../../graphql/generated/storefront-api-types\";\n\nexport interface Money {\n amount: string;\n currencyCode: string;\n}\n\nexport interface CartCost {\n subtotalAmount: Money;\n totalAmount: Money;\n checkoutChargeAmount: Money;\n}\n\nexport interface CartLineCost {\n totalAmount: Money;\n subtotalAmount: Money;\n amountPerQuantity: Money;\n compareAtAmountPerQuantity: Money | null;\n}\n\nexport interface CartLineMerchandise {\n id: string;\n title?: string;\n selectedOptions?: Array<{ name: string; value: string }>;\n product: {\n title: string;\n handle?: string;\n [key: string]: unknown;\n };\n image?: {\n id?: string | null;\n url: string;\n altText?: string | null;\n width?: number | null;\n height?: number | null;\n [key: string]: unknown;\n } | null;\n quantityAvailable?: number | null;\n [key: string]: unknown;\n}\n\nexport interface CartLine {\n id: string;\n quantity: number;\n attributes?: Attribute[];\n cost: CartLineCost;\n merchandise?: CartLineMerchandise;\n sellingPlanAllocation?: { sellingPlan: { id: string } } | null;\n parentRelationship?: { parent: { id: string } } | null;\n lineComponents?: CartLine[];\n}\n\nexport interface CartLineConnection {\n nodes: CartLine[];\n [key: string]: unknown;\n}\n\nexport interface DiscountCode {\n code: string;\n applicable: boolean;\n}\n\nexport interface CartUserError {\n code: CartErrorCode | null;\n message: string;\n field?: string[];\n}\n\nexport interface CartWarning {\n code: CartWarningCode;\n message: string;\n}\n\nexport interface CartErrorGroup {\n userErrors: CartUserError[];\n warnings: CartWarning[];\n}\n\nexport interface CartNetworkEntry {\n message: string;\n status?: number;\n}\n\nexport interface Attribute {\n key: string;\n value: string | null;\n}\n\nexport interface CartPending {\n lines: Set<string>;\n note: boolean;\n attributes: boolean;\n discountCodes: Set<string>;\n cost?: boolean;\n}\n\nexport interface CartErrorState {\n cart: CartErrorGroup;\n lines: Map<string, CartErrorGroup>;\n note: CartErrorGroup;\n attributes: Map<string, CartErrorGroup>;\n discountCodes: Map<string, CartErrorGroup>;\n network: CartNetworkEntry[];\n lastUpdatedAt: number;\n cartUpdatedAt: number;\n linesUpdatedAt: number;\n noteUpdatedAt: number;\n attributesUpdatedAt: number;\n discountCodesUpdatedAt: number;\n networkUpdatedAt: number;\n}\n\nexport interface CartData {\n id: string | null;\n checkoutUrl?: string | null;\n totalQuantity: number;\n cost: CartCost;\n note?: string | null;\n attributes: Attribute[];\n lines: CartLineConnection;\n discountCodes: DiscountCode[];\n [key: string]: unknown;\n}\n\nexport interface CartState<TData extends CartData = CartData> {\n data: TData;\n loading: boolean;\n /** Non-rejecting signal that resolves when the current full-cart load settles or is invalidated. */\n readonly readyPromise?: PromiseLike<void>;\n pending: CartPending;\n revalidating?: boolean;\n errors: CartErrorState;\n}\n\nexport function createEmptyPending(): CartPending {\n return {\n lines: new Set(),\n note: false,\n attributes: false,\n discountCodes: new Set(),\n cost: false,\n };\n}\n\nexport function createEmptyErrorGroup(): CartErrorGroup {\n return { userErrors: [], warnings: [] };\n}\n\nexport function createEmptyCartErrors(): CartErrorState {\n return {\n cart: createEmptyErrorGroup(),\n lines: new Map(),\n note: createEmptyErrorGroup(),\n attributes: new Map(),\n discountCodes: new Map(),\n network: [],\n lastUpdatedAt: 0,\n cartUpdatedAt: 0,\n linesUpdatedAt: 0,\n noteUpdatedAt: 0,\n attributesUpdatedAt: 0,\n discountCodesUpdatedAt: 0,\n networkUpdatedAt: 0,\n };\n}\n\nexport const EMPTY_CART_DATA: CartData = Object.freeze({\n id: null,\n checkoutUrl: null,\n totalQuantity: 0,\n cost: Object.freeze({\n subtotalAmount: Object.freeze({ amount: \"0\", currencyCode: \"\" }),\n totalAmount: Object.freeze({ amount: \"0\", currencyCode: \"\" }),\n checkoutChargeAmount: Object.freeze({ amount: \"0\", currencyCode: \"\" }),\n }),\n note: \"\",\n attributes: [] as Attribute[],\n lines: Object.freeze({ nodes: [] as CartLine[] }),\n discountCodes: [] as DiscountCode[],\n});\n\nexport function createCartState<TData extends CartData>(\n data: TData,\n { loading = false }: { loading?: boolean } = {},\n): CartState<TData> {\n return {\n data,\n loading,\n pending: createEmptyPending(),\n errors: createEmptyCartErrors(),\n };\n}\n\nexport function createEmptyCartState({ loading = true }: { loading?: boolean } = {}): CartState {\n return createCartState(\n {\n ...EMPTY_CART_DATA,\n lines: { nodes: [] },\n discountCodes: [],\n },\n { loading },\n );\n}\n\nexport const EMPTY_CART_STATE: CartState = createEmptyCartState();\n"],"mappings":";AAsIA,SAAgB,qBAAkC;AAChD,QAAO;EACL,uBAAO,IAAI,KAAK;EAChB,MAAM;EACN,YAAY;EACZ,+BAAe,IAAI,KAAK;EACxB,MAAM;EACP;;AAGH,SAAgB,wBAAwC;AACtD,QAAO;EAAE,YAAY,EAAE;EAAE,UAAU,EAAE;EAAE;;AAGzC,SAAgB,wBAAwC;AACtD,QAAO;EACL,MAAM,uBAAuB;EAC7B,uBAAO,IAAI,KAAK;EAChB,MAAM,uBAAuB;EAC7B,4BAAY,IAAI,KAAK;EACrB,+BAAe,IAAI,KAAK;EACxB,SAAS,EAAE;EACX,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,eAAe;EACf,qBAAqB;EACrB,wBAAwB;EACxB,kBAAkB;EACnB;;AAGH,MAAa,kBAA4B,OAAO,OAAO;CACrD,IAAI;CACJ,aAAa;CACb,eAAe;CACf,MAAM,OAAO,OAAO;EAClB,gBAAgB,OAAO,OAAO;GAAE,QAAQ;GAAK,cAAc;GAAI,CAAC;EAChE,aAAa,OAAO,OAAO;GAAE,QAAQ;GAAK,cAAc;GAAI,CAAC;EAC7D,sBAAsB,OAAO,OAAO;GAAE,QAAQ;GAAK,cAAc;GAAI,CAAC;EACvE,CAAC;CACF,MAAM;CACN,YAAY,EAAE;CACd,OAAO,OAAO,OAAO,EAAE,OAAO,EAAE,EAAgB,CAAC;CACjD,eAAe,EAAE;CAClB,CAAC;AAEF,SAAgB,gBACd,MACA,EAAE,UAAU,UAAiC,EAAE,EAC7B;AAClB,QAAO;EACL;EACA;EACA,SAAS,oBAAoB;EAC7B,QAAQ,uBAAuB;EAChC;;AAGH,SAAgB,qBAAqB,EAAE,UAAU,SAAgC,EAAE,EAAa;AAC9F,QAAO,gBACL;EACE,GAAG;EACH,OAAO,EAAE,OAAO,EAAE,EAAE;EACpB,eAAe,EAAE;EAClB,EACD,EAAE,SAAS,CACZ;;AAGH,MAAa,mBAA8B,sBAAsB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/core/cart/sync-quantity-inputs.ts
|
|
2
|
+
function syncQuantityInputs(updates, cartEndpoint) {
|
|
3
|
+
const forms = document.querySelectorAll(`form[action="${CSS.escape(cartEndpoint)}"]`);
|
|
4
|
+
for (const form of forms) for (const { id, quantity } of updates) {
|
|
5
|
+
if (!form.querySelector(`input[name="lineId"][value="${CSS.escape(id)}"]`)) continue;
|
|
6
|
+
const quantityInput = form.querySelector("input[name=\"quantity\"]");
|
|
7
|
+
if (!quantityInput) continue;
|
|
8
|
+
if (quantityInput.type === "hidden") continue;
|
|
9
|
+
if (document.activeElement === quantityInput) continue;
|
|
10
|
+
quantityInput.value = String(quantity);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
//#endregion
|
|
15
|
+
export { syncQuantityInputs };
|
|
16
|
+
//# sourceMappingURL=sync-quantity-inputs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-quantity-inputs.mjs","names":[],"sources":["../../../../src/core/cart/sync-quantity-inputs.ts"],"sourcesContent":["export function syncQuantityInputs(\n updates: Array<{ id: string; quantity: number }>,\n cartEndpoint: string,\n): void {\n const forms = document.querySelectorAll<HTMLFormElement>(\n `form[action=\"${CSS.escape(cartEndpoint)}\"]`,\n );\n\n for (const form of forms) {\n for (const { id, quantity } of updates) {\n const lineIdInput = form.querySelector<HTMLInputElement>(\n `input[name=\"lineId\"][value=\"${CSS.escape(id)}\"]`,\n );\n if (!lineIdInput) continue;\n\n const quantityInput = form.querySelector<HTMLInputElement>('input[name=\"quantity\"]');\n if (!quantityInput) continue;\n if (quantityInput.type === \"hidden\") continue;\n if (document.activeElement === quantityInput) continue;\n\n quantityInput.value = String(quantity);\n }\n }\n}\n"],"mappings":";AAAA,SAAgB,mBACd,SACA,cACM;CACN,MAAM,QAAQ,SAAS,iBACrB,gBAAgB,IAAI,OAAO,aAAa,CAAC,IAC1C;AAED,MAAK,MAAM,QAAQ,MACjB,MAAK,MAAM,EAAE,IAAI,cAAc,SAAS;AAItC,MAAI,CAHgB,KAAK,cACvB,+BAA+B,IAAI,OAAO,GAAG,CAAC,IAEhC,CAAE;EAElB,MAAM,gBAAgB,KAAK,cAAgC,2BAAyB;AACpF,MAAI,CAAC,cAAe;AACpB,MAAI,cAAc,SAAS,SAAU;AACrC,MAAI,SAAS,kBAAkB,cAAe;AAE9C,gBAAc,QAAQ,OAAO,SAAS"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { ProductCollectionSortKeys } from "../../graphql/generated/storefront-api-types.mjs";
|
|
2
|
+
import { ProductFilter } from "../../vendor/standard-events.mjs";
|
|
3
|
+
import { CollectionState } from "./state.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/core/collection/collection.d.ts
|
|
6
|
+
/** Snapshot from the framework loader for a single collection fetch. */
|
|
7
|
+
type CollectionData = {
|
|
8
|
+
/** URL-safe collection slug (e.g. `"shoes"`). */handle: string;
|
|
9
|
+
/**
|
|
10
|
+
* Search string this data snapshot was fetched for (with or without leading `?`).
|
|
11
|
+
* Compared against live {@link CreateCollectionStoreOptions.urlSearch} before settling.
|
|
12
|
+
*/
|
|
13
|
+
dataSearch: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* A reactive, framework-agnostic store for collection browse state.
|
|
17
|
+
*
|
|
18
|
+
* Manages filters and sorting — the user's *intent*. Server response
|
|
19
|
+
* data (products, productsCount, availableFilters) lives in the framework's
|
|
20
|
+
* loader data, not here.
|
|
21
|
+
*
|
|
22
|
+
* Mutations are synchronous state changes that set `status: "loading"`.
|
|
23
|
+
* The framework adapter navigates (URL change), the framework loader re-runs,
|
|
24
|
+
* and the adapter calls {@link settle} when fresh data arrives.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* const store = createCollectionStore({
|
|
29
|
+
* data: { handle: "shoes", dataSearch: "" },
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* store.setFilters([{ tag: "sale" }]); // status → "loading"
|
|
33
|
+
* // ...framework fetches...
|
|
34
|
+
* store.settle(); // status → "idle"
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
type CollectionStore = {
|
|
38
|
+
/** Returns the current snapshot of collection browse state. */getState(): CollectionState;
|
|
39
|
+
/**
|
|
40
|
+
* Registers a listener invoked on every state change. Returns an unsubscribe function.
|
|
41
|
+
* @param listener - Callback receiving the new state snapshot
|
|
42
|
+
*/
|
|
43
|
+
subscribe(listener: (state: CollectionState) => void): () => void;
|
|
44
|
+
/**
|
|
45
|
+
* Replaces the active product filters.
|
|
46
|
+
* Sets `status: "loading"` — call {@link settle} when the framework fetch completes.
|
|
47
|
+
*/
|
|
48
|
+
setFilters(filters: ProductFilter[]): void;
|
|
49
|
+
/**
|
|
50
|
+
* Adds the filter if not active, removes it if already active.
|
|
51
|
+
* Sets `status: "loading"` — call {@link settle} when the framework fetch completes.
|
|
52
|
+
*/
|
|
53
|
+
toggleFilter(filter: ProductFilter): void;
|
|
54
|
+
/**
|
|
55
|
+
* Changes the sort order.
|
|
56
|
+
* Sets `status: "loading"` — call {@link settle} when the framework fetch completes.
|
|
57
|
+
*/
|
|
58
|
+
setSortKey(sortKey: ProductCollectionSortKeys, reverse?: boolean): void;
|
|
59
|
+
/**
|
|
60
|
+
* Resets filters and sort to defaults.
|
|
61
|
+
* Sets `status: "loading"` — call {@link settle} when the framework fetch completes.
|
|
62
|
+
*/
|
|
63
|
+
reset(): void;
|
|
64
|
+
/**
|
|
65
|
+
* Returns `true` when URL params and current browse state describe the same filters and sort.
|
|
66
|
+
*/
|
|
67
|
+
matchesParams(searchParams: URLSearchParams): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Applies URL search params to the store when they differ from current state.
|
|
70
|
+
* Used when the framework router reports an external URL change (back/forward).
|
|
71
|
+
*/
|
|
72
|
+
syncFromParams(searchParams: URLSearchParams): void;
|
|
73
|
+
/**
|
|
74
|
+
* Signals that the framework fetch completed and fresh data is available.
|
|
75
|
+
* Resets `status` to `"idle"`.
|
|
76
|
+
*/
|
|
77
|
+
settle(): void;
|
|
78
|
+
/**
|
|
79
|
+
* Serializes the store's current filter/sort state into URL search params.
|
|
80
|
+
* Only includes store-owned keys (`filter.*`, `sort_by`).
|
|
81
|
+
*/
|
|
82
|
+
serializeToParams(): URLSearchParams;
|
|
83
|
+
/**
|
|
84
|
+
* Builds a URL string that removes the given filter from the current params.
|
|
85
|
+
* Useful for rendering "remove filter" links/buttons.
|
|
86
|
+
*/
|
|
87
|
+
getFilterRemovalUrl(filter: ProductFilter): string;
|
|
88
|
+
/**
|
|
89
|
+
* Parses `FormData` from the submitted form into collection params and applies them.
|
|
90
|
+
* Callers must call `event.preventDefault()` before invoking this method.
|
|
91
|
+
*/
|
|
92
|
+
handleFormSubmit(event: SubmitEvent): void;
|
|
93
|
+
/**
|
|
94
|
+
* Replaces the callback that runs after user filter/sort changes. Framework
|
|
95
|
+
* adapters use this to trigger navigation. Pass `null` to remove.
|
|
96
|
+
*/
|
|
97
|
+
setOnBrowseChange(callback: (() => void) | null): void;
|
|
98
|
+
/**
|
|
99
|
+
* Parses a Storefront API filter input JSON string (e.g. from
|
|
100
|
+
* `FilterValue.input`) and toggles the resulting filter.
|
|
101
|
+
* No-op if `input` is not valid JSON.
|
|
102
|
+
*/
|
|
103
|
+
toggleFilterInput(input: string): void;
|
|
104
|
+
/**
|
|
105
|
+
* Parses a Liquid-compatible `sort_by` value (e.g. `"price-ascending"`) and
|
|
106
|
+
* applies the corresponding sort key and direction.
|
|
107
|
+
*/
|
|
108
|
+
setSortByValue(sortByValue: string): void;
|
|
109
|
+
};
|
|
110
|
+
/** Options for creating a new {@link CollectionStore}. */
|
|
111
|
+
type CreateCollectionStoreOptions = {
|
|
112
|
+
/** Collection metadata from the framework loader. */data: CollectionData;
|
|
113
|
+
/**
|
|
114
|
+
* Live URL search string from the framework router (with or without leading `?`).
|
|
115
|
+
* Falls back to `data.dataSearch` when omitted.
|
|
116
|
+
*/
|
|
117
|
+
urlSearch?: string;
|
|
118
|
+
/**
|
|
119
|
+
* Called after user-initiated filter/sort changes.
|
|
120
|
+
* Framework adapters use this to trigger navigation. Not called by
|
|
121
|
+
* {@link CollectionStore.syncFromParams} or {@link CollectionStore.settle}.
|
|
122
|
+
*/
|
|
123
|
+
onBrowseChange?: () => void;
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Creates a new collection store for the given collection handle.
|
|
127
|
+
*
|
|
128
|
+
* The store manages browse intent (filters, sort) only.
|
|
129
|
+
* Server response data lives in the framework's loader.
|
|
130
|
+
*/
|
|
131
|
+
declare function createCollectionStore(options: CreateCollectionStoreOptions): CollectionStore;
|
|
132
|
+
//#endregion
|
|
133
|
+
export { CollectionData, CollectionStore, CreateCollectionStoreOptions, createCollectionStore };
|
|
134
|
+
//# sourceMappingURL=collection.d.mts.map
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { createObservable } from "../observable.mjs";
|
|
2
|
+
import { createInitialCollectionState } from "./state.mjs";
|
|
3
|
+
import { collectionParamsMatchState, filterEquals, getFilterRemovalUrl, isDirectionalSortKey, parseCollectionParams, parseSortByValue, serializeCollectionParams } from "./url.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/core/collection/collection.ts
|
|
6
|
+
/**
|
|
7
|
+
* Creates a new collection store for the given collection handle.
|
|
8
|
+
*
|
|
9
|
+
* The store manages browse intent (filters, sort) only.
|
|
10
|
+
* Server response data lives in the framework's loader.
|
|
11
|
+
*/
|
|
12
|
+
function createCollectionStore(options) {
|
|
13
|
+
const context = {
|
|
14
|
+
observable: createObservable(buildInitialState(options)),
|
|
15
|
+
handle: options.data.handle,
|
|
16
|
+
onBrowseChange: options.onBrowseChange ?? null
|
|
17
|
+
};
|
|
18
|
+
return {
|
|
19
|
+
getState: () => context.observable.state,
|
|
20
|
+
subscribe: (listener) => context.observable.subscribe(listener),
|
|
21
|
+
setFilters: (filters) => applyBrowseChange(context, { filters: normalizeFilters(filters) }),
|
|
22
|
+
toggleFilter: (filter) => toggleFilter(context, filter),
|
|
23
|
+
setSortKey: (sortKey, reverse) => applyBrowseChange(context, {
|
|
24
|
+
sortKey,
|
|
25
|
+
reverse: reverse ?? false
|
|
26
|
+
}),
|
|
27
|
+
reset: () => resetStore(context),
|
|
28
|
+
matchesParams: (searchParams) => matchesParams(context, searchParams),
|
|
29
|
+
syncFromParams: (searchParams) => syncFromParams(context, searchParams),
|
|
30
|
+
settle: () => settleStore(context),
|
|
31
|
+
serializeToParams: () => serializeCollectionParams(context.observable.state),
|
|
32
|
+
getFilterRemovalUrl: (filter) => getFilterRemovalUrl(serializeCollectionParams(context.observable.state), filter),
|
|
33
|
+
handleFormSubmit: (event) => handleFormSubmit(context, event),
|
|
34
|
+
setOnBrowseChange: (callback) => {
|
|
35
|
+
context.onBrowseChange = callback;
|
|
36
|
+
},
|
|
37
|
+
toggleFilterInput: (input) => toggleFilterInput(context, input),
|
|
38
|
+
setSortByValue: (sortByValue) => setSortByValue(context, sortByValue)
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function buildInitialState(options) {
|
|
42
|
+
const base = createInitialCollectionState(options.data.handle);
|
|
43
|
+
const search = options.urlSearch ?? options.data.dataSearch;
|
|
44
|
+
if (search) {
|
|
45
|
+
const parsed = parseCollectionParams(new URLSearchParams(search));
|
|
46
|
+
base.filters = parsed.filters;
|
|
47
|
+
base.sortKey = parsed.sortKey;
|
|
48
|
+
base.reverse = normalizeReverse(parsed.sortKey, parsed.reverse);
|
|
49
|
+
}
|
|
50
|
+
return base;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Drops `reverse` for sort keys that do not support direction.
|
|
54
|
+
* Only `PRICE`, `TITLE`, `CREATED`, and `ID` honor ascending/descending.
|
|
55
|
+
*
|
|
56
|
+
* @example normalizeReverse("BEST_SELLING", true) // → false
|
|
57
|
+
* @example normalizeReverse("PRICE", true) // → true
|
|
58
|
+
*/
|
|
59
|
+
function normalizeReverse(sortKey, reverse) {
|
|
60
|
+
if (!sortKey || !isDirectionalSortKey(sortKey)) return false;
|
|
61
|
+
return reverse;
|
|
62
|
+
}
|
|
63
|
+
function applyBrowseChange(context, change, notify = true) {
|
|
64
|
+
context.observable.setState((prev) => {
|
|
65
|
+
const merged = {
|
|
66
|
+
...prev,
|
|
67
|
+
...change,
|
|
68
|
+
status: "loading"
|
|
69
|
+
};
|
|
70
|
+
merged.reverse = normalizeReverse(merged.sortKey, merged.reverse);
|
|
71
|
+
return merged;
|
|
72
|
+
});
|
|
73
|
+
if (notify) context.onBrowseChange?.();
|
|
74
|
+
}
|
|
75
|
+
function toggleFilter(context, filter) {
|
|
76
|
+
const current = context.observable.state.filters;
|
|
77
|
+
applyBrowseChange(context, { filters: current.some((f) => filterEquals(f, filter)) ? current.filter((f) => !filterEquals(f, filter)) : normalizeFilters([...current, filter]) });
|
|
78
|
+
}
|
|
79
|
+
function normalizeFilters(filters) {
|
|
80
|
+
const normalized = [];
|
|
81
|
+
for (const filter of filters) {
|
|
82
|
+
if (filter.available != null) {
|
|
83
|
+
const existingAvailabilityIndex = normalized.findIndex((candidate) => {
|
|
84
|
+
return candidate.available != null;
|
|
85
|
+
});
|
|
86
|
+
if (existingAvailabilityIndex !== -1) {
|
|
87
|
+
normalized.splice(existingAvailabilityIndex, 1);
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
normalized.push(filter);
|
|
92
|
+
}
|
|
93
|
+
return normalized;
|
|
94
|
+
}
|
|
95
|
+
function resetStore(context) {
|
|
96
|
+
const initial = createInitialCollectionState(context.handle);
|
|
97
|
+
applyBrowseChange(context, {
|
|
98
|
+
filters: initial.filters,
|
|
99
|
+
sortKey: initial.sortKey,
|
|
100
|
+
reverse: initial.reverse
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
function matchesParams(context, searchParams) {
|
|
104
|
+
return collectionParamsMatchState(searchParams, context.observable.state);
|
|
105
|
+
}
|
|
106
|
+
function syncFromParams(context, searchParams) {
|
|
107
|
+
if (matchesParams(context, searchParams)) return;
|
|
108
|
+
const parsed = parseCollectionParams(searchParams);
|
|
109
|
+
if (context.observable.state.status === "loading") {
|
|
110
|
+
context.observable.setState((prev) => ({
|
|
111
|
+
...prev,
|
|
112
|
+
filters: parsed.filters,
|
|
113
|
+
sortKey: parsed.sortKey,
|
|
114
|
+
reverse: normalizeReverse(parsed.sortKey, parsed.reverse),
|
|
115
|
+
status: "loading"
|
|
116
|
+
}));
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* URL already changes, so we don't need to notify to call onBrowseChange
|
|
121
|
+
* again which would cause a double navigate.
|
|
122
|
+
*/
|
|
123
|
+
applyBrowseChange(context, {
|
|
124
|
+
filters: parsed.filters,
|
|
125
|
+
sortKey: parsed.sortKey,
|
|
126
|
+
reverse: parsed.reverse
|
|
127
|
+
}, false);
|
|
128
|
+
}
|
|
129
|
+
function settleStore(context) {
|
|
130
|
+
context.observable.setState((prev) => {
|
|
131
|
+
if (prev.status === "idle") return prev;
|
|
132
|
+
return {
|
|
133
|
+
...prev,
|
|
134
|
+
status: "idle"
|
|
135
|
+
};
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
function handleFormSubmit(context, event) {
|
|
139
|
+
if (!(event.target instanceof HTMLFormElement)) throw new TypeError(`Expected event.target to be an HTMLFormElement, got ${event.target}`);
|
|
140
|
+
const formData = new FormData(event.target);
|
|
141
|
+
const formParams = new URLSearchParams();
|
|
142
|
+
for (const [key, value] of formData.entries()) if (typeof value === "string") formParams.append(key, value);
|
|
143
|
+
const parsed = parseCollectionParams(formParams);
|
|
144
|
+
const change = { filters: normalizeFilters(parsed.filters) };
|
|
145
|
+
if (formParams.has("sort_by")) {
|
|
146
|
+
change.sortKey = parsed.sortKey;
|
|
147
|
+
change.reverse = parsed.reverse;
|
|
148
|
+
}
|
|
149
|
+
applyBrowseChange(context, change);
|
|
150
|
+
}
|
|
151
|
+
function toggleFilterInput(context, input) {
|
|
152
|
+
let parsed;
|
|
153
|
+
try {
|
|
154
|
+
parsed = JSON.parse(input);
|
|
155
|
+
} catch {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
toggleFilter(context, parsed);
|
|
159
|
+
}
|
|
160
|
+
function setSortByValue(context, sortByValue) {
|
|
161
|
+
const { sortKey, reverse } = parseSortByValue(sortByValue);
|
|
162
|
+
applyBrowseChange(context, {
|
|
163
|
+
sortKey: sortKey ?? "COLLECTION_DEFAULT",
|
|
164
|
+
reverse: reverse ?? false
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
//#endregion
|
|
169
|
+
export { createCollectionStore };
|
|
170
|
+
//# sourceMappingURL=collection.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection.mjs","names":[],"sources":["../../../../src/core/collection/collection.ts"],"sourcesContent":["import type { ProductCollectionSortKeys } from \"../../graphql/generated/storefront-api-types\";\nimport { createObservable } from \"../observable\";\nimport type { CollectionState, ProductFilter } from \"./state\";\nimport { createInitialCollectionState } from \"./state\";\nimport {\n collectionParamsMatchState,\n filterEquals,\n getFilterRemovalUrl,\n isDirectionalSortKey,\n parseCollectionParams,\n parseSortByValue,\n serializeCollectionParams,\n} from \"./url\";\n\n/** Snapshot from the framework loader for a single collection fetch. */\nexport type CollectionData = {\n /** URL-safe collection slug (e.g. `\"shoes\"`). */\n handle: string;\n /**\n * Search string this data snapshot was fetched for (with or without leading `?`).\n * Compared against live {@link CreateCollectionStoreOptions.urlSearch} before settling.\n */\n dataSearch: string;\n};\n\n/**\n * A reactive, framework-agnostic store for collection browse state.\n *\n * Manages filters and sorting — the user's *intent*. Server response\n * data (products, productsCount, availableFilters) lives in the framework's\n * loader data, not here.\n *\n * Mutations are synchronous state changes that set `status: \"loading\"`.\n * The framework adapter navigates (URL change), the framework loader re-runs,\n * and the adapter calls {@link settle} when fresh data arrives.\n *\n * @example\n * ```ts\n * const store = createCollectionStore({\n * data: { handle: \"shoes\", dataSearch: \"\" },\n * });\n *\n * store.setFilters([{ tag: \"sale\" }]); // status → \"loading\"\n * // ...framework fetches...\n * store.settle(); // status → \"idle\"\n * ```\n */\nexport type CollectionStore = {\n /** Returns the current snapshot of collection browse state. */\n getState(): CollectionState;\n\n /**\n * Registers a listener invoked on every state change. Returns an unsubscribe function.\n * @param listener - Callback receiving the new state snapshot\n */\n subscribe(listener: (state: CollectionState) => void): () => void;\n\n /**\n * Replaces the active product filters.\n * Sets `status: \"loading\"` — call {@link settle} when the framework fetch completes.\n */\n setFilters(filters: ProductFilter[]): void;\n\n /**\n * Adds the filter if not active, removes it if already active.\n * Sets `status: \"loading\"` — call {@link settle} when the framework fetch completes.\n */\n toggleFilter(filter: ProductFilter): void;\n\n /**\n * Changes the sort order.\n * Sets `status: \"loading\"` — call {@link settle} when the framework fetch completes.\n */\n setSortKey(sortKey: ProductCollectionSortKeys, reverse?: boolean): void;\n\n /**\n * Resets filters and sort to defaults.\n * Sets `status: \"loading\"` — call {@link settle} when the framework fetch completes.\n */\n reset(): void;\n\n /**\n * Returns `true` when URL params and current browse state describe the same filters and sort.\n */\n matchesParams(searchParams: URLSearchParams): boolean;\n\n /**\n * Applies URL search params to the store when they differ from current state.\n * Used when the framework router reports an external URL change (back/forward).\n */\n syncFromParams(searchParams: URLSearchParams): void;\n\n /**\n * Signals that the framework fetch completed and fresh data is available.\n * Resets `status` to `\"idle\"`.\n */\n settle(): void;\n\n /**\n * Serializes the store's current filter/sort state into URL search params.\n * Only includes store-owned keys (`filter.*`, `sort_by`).\n */\n serializeToParams(): URLSearchParams;\n\n /**\n * Builds a URL string that removes the given filter from the current params.\n * Useful for rendering \"remove filter\" links/buttons.\n */\n getFilterRemovalUrl(filter: ProductFilter): string;\n\n /**\n * Parses `FormData` from the submitted form into collection params and applies them.\n * Callers must call `event.preventDefault()` before invoking this method.\n */\n handleFormSubmit(event: SubmitEvent): void;\n\n /**\n * Replaces the callback that runs after user filter/sort changes. Framework\n * adapters use this to trigger navigation. Pass `null` to remove.\n */\n setOnBrowseChange(callback: (() => void) | null): void;\n\n /**\n * Parses a Storefront API filter input JSON string (e.g. from\n * `FilterValue.input`) and toggles the resulting filter.\n * No-op if `input` is not valid JSON.\n */\n toggleFilterInput(input: string): void;\n\n /**\n * Parses a Liquid-compatible `sort_by` value (e.g. `\"price-ascending\"`) and\n * applies the corresponding sort key and direction.\n */\n setSortByValue(sortByValue: string): void;\n};\n\n/** Options for creating a new {@link CollectionStore}. */\nexport type CreateCollectionStoreOptions = {\n /** Collection metadata from the framework loader. */\n data: CollectionData;\n /**\n * Live URL search string from the framework router (with or without leading `?`).\n * Falls back to `data.dataSearch` when omitted.\n */\n urlSearch?: string;\n /**\n * Called after user-initiated filter/sort changes.\n * Framework adapters use this to trigger navigation. Not called by\n * {@link CollectionStore.syncFromParams} or {@link CollectionStore.settle}.\n */\n onBrowseChange?: () => void;\n};\n\ntype CollectionStoreContext = {\n observable: ReturnType<typeof createObservable<CollectionState>>;\n handle: string;\n onBrowseChange: (() => void) | null;\n};\n\n/**\n * Creates a new collection store for the given collection handle.\n *\n * The store manages browse intent (filters, sort) only.\n * Server response data lives in the framework's loader.\n */\nexport function createCollectionStore(options: CreateCollectionStoreOptions): CollectionStore {\n const initialState = buildInitialState(options);\n\n const context: CollectionStoreContext = {\n observable: createObservable<CollectionState>(initialState),\n handle: options.data.handle,\n onBrowseChange: options.onBrowseChange ?? null,\n };\n\n return {\n getState: () => context.observable.state,\n subscribe: (listener) => context.observable.subscribe(listener),\n setFilters: (filters) => applyBrowseChange(context, { filters: normalizeFilters(filters) }),\n toggleFilter: (filter) => toggleFilter(context, filter),\n setSortKey: (sortKey, reverse) =>\n applyBrowseChange(context, { sortKey, reverse: reverse ?? false }),\n reset: () => resetStore(context),\n matchesParams: (searchParams) => matchesParams(context, searchParams),\n syncFromParams: (searchParams) => syncFromParams(context, searchParams),\n settle: () => settleStore(context),\n serializeToParams: () => serializeCollectionParams(context.observable.state),\n getFilterRemovalUrl: (filter) =>\n getFilterRemovalUrl(serializeCollectionParams(context.observable.state), filter),\n handleFormSubmit: (event) => handleFormSubmit(context, event),\n setOnBrowseChange: (callback) => {\n context.onBrowseChange = callback;\n },\n toggleFilterInput: (input) => toggleFilterInput(context, input),\n setSortByValue: (sortByValue) => setSortByValue(context, sortByValue),\n };\n}\n\nfunction buildInitialState(options: CreateCollectionStoreOptions): CollectionState {\n const base = createInitialCollectionState(options.data.handle);\n\n const search = options.urlSearch ?? options.data.dataSearch;\n if (search) {\n const parsed = parseCollectionParams(new URLSearchParams(search));\n base.filters = parsed.filters;\n base.sortKey = parsed.sortKey;\n base.reverse = normalizeReverse(parsed.sortKey, parsed.reverse);\n }\n\n return base;\n}\n\ntype BrowseChange = Partial<Pick<CollectionState, \"filters\" | \"sortKey\" | \"reverse\">>;\n\n/**\n * Drops `reverse` for sort keys that do not support direction.\n * Only `PRICE`, `TITLE`, `CREATED`, and `ID` honor ascending/descending.\n *\n * @example normalizeReverse(\"BEST_SELLING\", true) // → false\n * @example normalizeReverse(\"PRICE\", true) // → true\n */\nfunction normalizeReverse(\n sortKey: ProductCollectionSortKeys | undefined,\n reverse: boolean,\n): boolean {\n if (!sortKey || !isDirectionalSortKey(sortKey)) return false;\n return reverse;\n}\n\nfunction applyBrowseChange(\n context: CollectionStoreContext,\n change: BrowseChange,\n notify = true,\n): void {\n context.observable.setState((prev) => {\n const merged = { ...prev, ...change, status: \"loading\" as const };\n merged.reverse = normalizeReverse(merged.sortKey, merged.reverse);\n return merged;\n });\n if (notify) {\n context.onBrowseChange?.();\n }\n}\n\nfunction toggleFilter(context: CollectionStoreContext, filter: ProductFilter): void {\n const current = context.observable.state.filters;\n const isActive = current.some((f) => filterEquals(f, filter));\n\n const next = isActive\n ? current.filter((f) => !filterEquals(f, filter))\n : normalizeFilters([...current, filter]);\n\n applyBrowseChange(context, { filters: next });\n}\n\nfunction normalizeFilters(filters: ProductFilter[]): ProductFilter[] {\n const normalized: ProductFilter[] = [];\n\n for (const filter of filters) {\n if (filter.available != null) {\n // Availability is a single boolean facet. Duplicate availability params\n // (filter.v.availability=1&filter.v.availability=0) mean no filter, so\n // keeping both values here prevents the provider from settling navigation.\n const existingAvailabilityIndex = normalized.findIndex((candidate) => {\n return candidate.available != null;\n });\n\n if (existingAvailabilityIndex !== -1) {\n normalized.splice(existingAvailabilityIndex, 1);\n continue;\n }\n }\n\n normalized.push(filter);\n }\n\n return normalized;\n}\n\nfunction resetStore(context: CollectionStoreContext): void {\n const initial = createInitialCollectionState(context.handle);\n applyBrowseChange(context, {\n filters: initial.filters,\n sortKey: initial.sortKey,\n reverse: initial.reverse,\n });\n}\n\nfunction matchesParams(context: CollectionStoreContext, searchParams: URLSearchParams): boolean {\n return collectionParamsMatchState(searchParams, context.observable.state);\n}\n\nfunction syncFromParams(context: CollectionStoreContext, searchParams: URLSearchParams): void {\n if (matchesParams(context, searchParams)) return;\n\n const parsed = parseCollectionParams(searchParams);\n\n // URL caught up to an in-flight browse change — align state without re-entering loading.\n if (context.observable.state.status === \"loading\") {\n context.observable.setState((prev) => ({\n ...prev,\n filters: parsed.filters,\n sortKey: parsed.sortKey,\n reverse: normalizeReverse(parsed.sortKey, parsed.reverse),\n status: \"loading\",\n }));\n return;\n }\n\n /**\n * URL already changes, so we don't need to notify to call onBrowseChange\n * again which would cause a double navigate.\n */\n applyBrowseChange(\n context,\n {\n filters: parsed.filters,\n sortKey: parsed.sortKey,\n reverse: parsed.reverse,\n },\n false,\n );\n}\n\nfunction settleStore(context: CollectionStoreContext): void {\n context.observable.setState((prev) => {\n if (prev.status === \"idle\") return prev;\n return { ...prev, status: \"idle\" };\n });\n}\n\nfunction handleFormSubmit(context: CollectionStoreContext, event: SubmitEvent): void {\n if (!(event.target instanceof HTMLFormElement)) {\n throw new TypeError(`Expected event.target to be an HTMLFormElement, got ${event.target}`);\n }\n\n const formData = new FormData(event.target);\n const formParams = new URLSearchParams();\n\n for (const [key, value] of formData.entries()) {\n if (typeof value === \"string\") {\n formParams.append(key, value);\n }\n }\n\n const parsed = parseCollectionParams(formParams);\n\n const change: BrowseChange = {\n filters: normalizeFilters(parsed.filters),\n };\n\n if (formParams.has(\"sort_by\")) {\n change.sortKey = parsed.sortKey;\n change.reverse = parsed.reverse;\n }\n\n applyBrowseChange(context, change);\n}\n\nfunction toggleFilterInput(context: CollectionStoreContext, input: string): void {\n let parsed: ProductFilter;\n try {\n parsed = JSON.parse(input) as ProductFilter;\n } catch {\n return;\n }\n toggleFilter(context, parsed);\n}\n\nfunction setSortByValue(context: CollectionStoreContext, sortByValue: string): void {\n const { sortKey, reverse } = parseSortByValue(sortByValue);\n applyBrowseChange(context, {\n sortKey: sortKey ?? \"COLLECTION_DEFAULT\",\n reverse: reverse ?? false,\n });\n}\n"],"mappings":";;;;;;;;;;;AAqKA,SAAgB,sBAAsB,SAAwD;CAG5F,MAAM,UAAkC;EACtC,YAAY,iBAHO,kBAAkB,QAGqB,CAAC;EAC3D,QAAQ,QAAQ,KAAK;EACrB,gBAAgB,QAAQ,kBAAkB;EAC3C;AAED,QAAO;EACL,gBAAgB,QAAQ,WAAW;EACnC,YAAY,aAAa,QAAQ,WAAW,UAAU,SAAS;EAC/D,aAAa,YAAY,kBAAkB,SAAS,EAAE,SAAS,iBAAiB,QAAQ,EAAE,CAAC;EAC3F,eAAe,WAAW,aAAa,SAAS,OAAO;EACvD,aAAa,SAAS,YACpB,kBAAkB,SAAS;GAAE;GAAS,SAAS,WAAW;GAAO,CAAC;EACpE,aAAa,WAAW,QAAQ;EAChC,gBAAgB,iBAAiB,cAAc,SAAS,aAAa;EACrE,iBAAiB,iBAAiB,eAAe,SAAS,aAAa;EACvE,cAAc,YAAY,QAAQ;EAClC,yBAAyB,0BAA0B,QAAQ,WAAW,MAAM;EAC5E,sBAAsB,WACpB,oBAAoB,0BAA0B,QAAQ,WAAW,MAAM,EAAE,OAAO;EAClF,mBAAmB,UAAU,iBAAiB,SAAS,MAAM;EAC7D,oBAAoB,aAAa;AAC/B,WAAQ,iBAAiB;;EAE3B,oBAAoB,UAAU,kBAAkB,SAAS,MAAM;EAC/D,iBAAiB,gBAAgB,eAAe,SAAS,YAAY;EACtE;;AAGH,SAAS,kBAAkB,SAAwD;CACjF,MAAM,OAAO,6BAA6B,QAAQ,KAAK,OAAO;CAE9D,MAAM,SAAS,QAAQ,aAAa,QAAQ,KAAK;AACjD,KAAI,QAAQ;EACV,MAAM,SAAS,sBAAsB,IAAI,gBAAgB,OAAO,CAAC;AACjE,OAAK,UAAU,OAAO;AACtB,OAAK,UAAU,OAAO;AACtB,OAAK,UAAU,iBAAiB,OAAO,SAAS,OAAO,QAAQ;;AAGjE,QAAO;;;;;;;;;AAYT,SAAS,iBACP,SACA,SACS;AACT,KAAI,CAAC,WAAW,CAAC,qBAAqB,QAAQ,CAAE,QAAO;AACvD,QAAO;;AAGT,SAAS,kBACP,SACA,QACA,SAAS,MACH;AACN,SAAQ,WAAW,UAAU,SAAS;EACpC,MAAM,SAAS;GAAE,GAAG;GAAM,GAAG;GAAQ,QAAQ;GAAoB;AACjE,SAAO,UAAU,iBAAiB,OAAO,SAAS,OAAO,QAAQ;AACjE,SAAO;GACP;AACF,KAAI,OACF,SAAQ,kBAAkB;;AAI9B,SAAS,aAAa,SAAiC,QAA6B;CAClF,MAAM,UAAU,QAAQ,WAAW,MAAM;AAOzC,mBAAkB,SAAS,EAAE,SANZ,QAAQ,MAAM,MAAM,aAAa,GAAG,OAAO,CAEvC,GACjB,QAAQ,QAAQ,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,GAC/C,iBAAiB,CAAC,GAAG,SAAS,OAAO,CAAC,EAEE,CAAC;;AAG/C,SAAS,iBAAiB,SAA2C;CACnE,MAAM,aAA8B,EAAE;AAEtC,MAAK,MAAM,UAAU,SAAS;AAC5B,MAAI,OAAO,aAAa,MAAM;GAI5B,MAAM,4BAA4B,WAAW,WAAW,cAAc;AACpE,WAAO,UAAU,aAAa;KAC9B;AAEF,OAAI,8BAA8B,IAAI;AACpC,eAAW,OAAO,2BAA2B,EAAE;AAC/C;;;AAIJ,aAAW,KAAK,OAAO;;AAGzB,QAAO;;AAGT,SAAS,WAAW,SAAuC;CACzD,MAAM,UAAU,6BAA6B,QAAQ,OAAO;AAC5D,mBAAkB,SAAS;EACzB,SAAS,QAAQ;EACjB,SAAS,QAAQ;EACjB,SAAS,QAAQ;EAClB,CAAC;;AAGJ,SAAS,cAAc,SAAiC,cAAwC;AAC9F,QAAO,2BAA2B,cAAc,QAAQ,WAAW,MAAM;;AAG3E,SAAS,eAAe,SAAiC,cAAqC;AAC5F,KAAI,cAAc,SAAS,aAAa,CAAE;CAE1C,MAAM,SAAS,sBAAsB,aAAa;AAGlD,KAAI,QAAQ,WAAW,MAAM,WAAW,WAAW;AACjD,UAAQ,WAAW,UAAU,UAAU;GACrC,GAAG;GACH,SAAS,OAAO;GAChB,SAAS,OAAO;GAChB,SAAS,iBAAiB,OAAO,SAAS,OAAO,QAAQ;GACzD,QAAQ;GACT,EAAE;AACH;;;;;;AAOF,mBACE,SACA;EACE,SAAS,OAAO;EAChB,SAAS,OAAO;EAChB,SAAS,OAAO;EACjB,EACD,MACD;;AAGH,SAAS,YAAY,SAAuC;AAC1D,SAAQ,WAAW,UAAU,SAAS;AACpC,MAAI,KAAK,WAAW,OAAQ,QAAO;AACnC,SAAO;GAAE,GAAG;GAAM,QAAQ;GAAQ;GAClC;;AAGJ,SAAS,iBAAiB,SAAiC,OAA0B;AACnF,KAAI,EAAE,MAAM,kBAAkB,iBAC5B,OAAM,IAAI,UAAU,uDAAuD,MAAM,SAAS;CAG5F,MAAM,WAAW,IAAI,SAAS,MAAM,OAAO;CAC3C,MAAM,aAAa,IAAI,iBAAiB;AAExC,MAAK,MAAM,CAAC,KAAK,UAAU,SAAS,SAAS,CAC3C,KAAI,OAAO,UAAU,SACnB,YAAW,OAAO,KAAK,MAAM;CAIjC,MAAM,SAAS,sBAAsB,WAAW;CAEhD,MAAM,SAAuB,EAC3B,SAAS,iBAAiB,OAAO,QAAQ,EAC1C;AAED,KAAI,WAAW,IAAI,UAAU,EAAE;AAC7B,SAAO,UAAU,OAAO;AACxB,SAAO,UAAU,OAAO;;AAG1B,mBAAkB,SAAS,OAAO;;AAGpC,SAAS,kBAAkB,SAAiC,OAAqB;CAC/E,IAAI;AACJ,KAAI;AACF,WAAS,KAAK,MAAM,MAAM;SACpB;AACN;;AAEF,cAAa,SAAS,OAAO;;AAG/B,SAAS,eAAe,SAAiC,aAA2B;CAClF,MAAM,EAAE,SAAS,YAAY,iBAAiB,YAAY;AAC1D,mBAAkB,SAAS;EACzB,SAAS,WAAW;EACpB,SAAS,WAAW;EACrB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ProductCollectionSortKeys } from "../../graphql/generated/storefront-api-types.mjs";
|
|
2
|
+
import { ProductFilter } from "../../vendor/standard-events.mjs";
|
|
3
|
+
import { AvailableFilter, AvailableFilterValue, CollectionState, FilterPresentation, FilterType, createInitialCollectionState } from "./state.mjs";
|
|
4
|
+
import { CollectionData, CollectionStore, CreateCollectionStoreOptions, createCollectionStore } from "./collection.mjs";
|
|
5
|
+
import { CollectionReconciler, ReconcilerCallbacks, createCollectionReconciler } from "./reconciler.mjs";
|
|
6
|
+
import { CollectionParams, filterEquals, getFilterRemovalUrl, getSortByValue, isFilterInputActive, normalizeCollectionSearch, parseCollectionParams, parseSortByValue, serializeCollectionParams } from "./url.mjs";
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { CollectionStore } from "./collection.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/collection/reconciler.d.ts
|
|
4
|
+
type ReconcilerCallbacks = {
|
|
5
|
+
getStore: () => CollectionStore;
|
|
6
|
+
readUrlSearch: () => string;
|
|
7
|
+
emitChange: (searchString: string) => void;
|
|
8
|
+
};
|
|
9
|
+
type CollectionReconciler = {
|
|
10
|
+
/**
|
|
11
|
+
* URL ↔ store reconciliation state machine. Call whenever urlSearch,
|
|
12
|
+
* dataSearch, or store state changes.
|
|
13
|
+
*/
|
|
14
|
+
reconcile(urlSearch: string, dataSearch: string): void;
|
|
15
|
+
/**
|
|
16
|
+
* Callback for {@link CollectionStore.setOnBrowseChange}. Merges current
|
|
17
|
+
* URL params with store state, tracks the pending navigation, and emits.
|
|
18
|
+
*/
|
|
19
|
+
handleBrowseChange(): void; /** Clears pending navigation state (call when the store is recreated). */
|
|
20
|
+
reset(newPrevUrlSearch: string): void;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Creates a framework-agnostic reconciler that manages the state machine for
|
|
24
|
+
* keeping the URL, server data, and store in sync during browse-change chains.
|
|
25
|
+
*
|
|
26
|
+
* Framework adapters delegate to this so the reconciliation logic
|
|
27
|
+
* lives in one place.
|
|
28
|
+
*/
|
|
29
|
+
declare function createCollectionReconciler(callbacks: ReconcilerCallbacks, initialPrevUrlSearch?: string): CollectionReconciler;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { CollectionReconciler, ReconcilerCallbacks, createCollectionReconciler };
|
|
32
|
+
//# sourceMappingURL=reconciler.d.mts.map
|