@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,81 @@
|
|
|
1
|
+
import { gql } from "../../graphql/graphql.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/predictive-search/queries.ts
|
|
4
|
+
const PRODUCT_FRAGMENT_NAME = "PredictiveSearchProductFragment";
|
|
5
|
+
const COLLECTION_FRAGMENT_NAME = "PredictiveSearchCollectionFragment";
|
|
6
|
+
const PAGE_FRAGMENT_NAME = "PredictiveSearchPageFragment";
|
|
7
|
+
const ARTICLE_FRAGMENT_NAME = "PredictiveSearchArticleFragment";
|
|
8
|
+
const QUERY_FRAGMENT_NAME = "PredictiveSearchQueryFragment";
|
|
9
|
+
const PRODUCT_TYPE_NAME = "Product";
|
|
10
|
+
const COLLECTION_TYPE_NAME = "Collection";
|
|
11
|
+
const PAGE_TYPE_NAME = "Page";
|
|
12
|
+
const ARTICLE_TYPE_NAME = "Article";
|
|
13
|
+
const QUERY_TYPE_NAME = "SearchQuerySuggestion";
|
|
14
|
+
const PRODUCT_CONTRACT = {
|
|
15
|
+
label: "product",
|
|
16
|
+
name: PRODUCT_FRAGMENT_NAME,
|
|
17
|
+
typeName: PRODUCT_TYPE_NAME
|
|
18
|
+
};
|
|
19
|
+
const COLLECTION_CONTRACT = {
|
|
20
|
+
label: "collection",
|
|
21
|
+
name: COLLECTION_FRAGMENT_NAME,
|
|
22
|
+
typeName: COLLECTION_TYPE_NAME
|
|
23
|
+
};
|
|
24
|
+
const PAGE_CONTRACT = {
|
|
25
|
+
label: "page",
|
|
26
|
+
name: PAGE_FRAGMENT_NAME,
|
|
27
|
+
typeName: PAGE_TYPE_NAME
|
|
28
|
+
};
|
|
29
|
+
const ARTICLE_CONTRACT = {
|
|
30
|
+
label: "article",
|
|
31
|
+
name: ARTICLE_FRAGMENT_NAME,
|
|
32
|
+
typeName: ARTICLE_TYPE_NAME
|
|
33
|
+
};
|
|
34
|
+
const QUERY_CONTRACT = {
|
|
35
|
+
label: "query",
|
|
36
|
+
name: QUERY_FRAGMENT_NAME,
|
|
37
|
+
typeName: QUERY_TYPE_NAME
|
|
38
|
+
};
|
|
39
|
+
const HYDROGEN_PRODUCT_FRAGMENT = gql(`fragment HydrogenPredictiveSearchProductFragment on Product{__typename id title handle trackingParameters selectedOrFirstAvailableVariant(selectedOptions:[]ignoreUnknownOptions:true caseInsensitiveMatch:true){id image{url altText width height}price{amount currencyCode}}}`);
|
|
40
|
+
const HYDROGEN_COLLECTION_FRAGMENT = gql(`fragment HydrogenPredictiveSearchCollectionFragment on Collection{__typename id title handle image{url altText width height}trackingParameters}`);
|
|
41
|
+
const HYDROGEN_PAGE_FRAGMENT = gql(`fragment HydrogenPredictiveSearchPageFragment on Page{__typename id title handle trackingParameters}`);
|
|
42
|
+
const HYDROGEN_ARTICLE_FRAGMENT = gql(`fragment HydrogenPredictiveSearchArticleFragment on Article{__typename id title handle blog{handle}image{url altText width height}trackingParameters}`);
|
|
43
|
+
const HYDROGEN_QUERY_FRAGMENT = gql(`fragment HydrogenPredictiveSearchQueryFragment on SearchQuerySuggestion{__typename text styledText trackingParameters}`);
|
|
44
|
+
const PREDICTIVE_SEARCH_QUERY = gql(`query PredictiveSearch($country:CountryCode$language:LanguageCode$limit:Int$limitScope:PredictiveSearchLimitScope$term:String!$types:[PredictiveSearchType!]$searchableFields:[SearchableField!]$unavailableProducts:SearchUnavailableProductsType)@inContext(country:$country language:$language){predictiveSearch(limit:$limit limitScope:$limitScope query:$term types:$types searchableFields:$searchableFields unavailableProducts:$unavailableProducts){articles{...HydrogenPredictiveSearchArticleFragment ...${ARTICLE_FRAGMENT_NAME}}collections{...HydrogenPredictiveSearchCollectionFragment ...${COLLECTION_FRAGMENT_NAME}}pages{...HydrogenPredictiveSearchPageFragment ...${PAGE_FRAGMENT_NAME}}products{...HydrogenPredictiveSearchProductFragment ...${PRODUCT_FRAGMENT_NAME}}queries{...HydrogenPredictiveSearchQueryFragment ...${QUERY_FRAGMENT_NAME}}}}`, [
|
|
45
|
+
HYDROGEN_PRODUCT_FRAGMENT,
|
|
46
|
+
HYDROGEN_COLLECTION_FRAGMENT,
|
|
47
|
+
HYDROGEN_PAGE_FRAGMENT,
|
|
48
|
+
HYDROGEN_ARTICLE_FRAGMENT,
|
|
49
|
+
HYDROGEN_QUERY_FRAGMENT
|
|
50
|
+
]);
|
|
51
|
+
const DEFAULT_PRODUCT_FRAGMENT = gql(`fragment PredictiveSearchProductFragment on Product{id}`);
|
|
52
|
+
const DEFAULT_COLLECTION_FRAGMENT = gql(`fragment PredictiveSearchCollectionFragment on Collection{id}`);
|
|
53
|
+
const DEFAULT_PAGE_FRAGMENT = gql(`fragment PredictiveSearchPageFragment on Page{id}`);
|
|
54
|
+
const DEFAULT_ARTICLE_FRAGMENT = gql(`fragment PredictiveSearchArticleFragment on Article{id}`);
|
|
55
|
+
const DEFAULT_QUERY_FRAGMENT = gql(`fragment PredictiveSearchQueryFragment on SearchQuerySuggestion{text}`);
|
|
56
|
+
function assertFragmentContract(fragment, contract) {
|
|
57
|
+
if (new RegExp(`fragment\\s+${contract.name}\\s+on\\s+${contract.typeName}`).test(fragment)) return;
|
|
58
|
+
throw new Error(`Predictive search ${contract.label} fragment must be named ${contract.name} and target ${contract.typeName}`);
|
|
59
|
+
}
|
|
60
|
+
function resolveFragments(fragments) {
|
|
61
|
+
if (fragments?.product) assertFragmentContract(fragments.product, PRODUCT_CONTRACT);
|
|
62
|
+
if (fragments?.collection) assertFragmentContract(fragments.collection, COLLECTION_CONTRACT);
|
|
63
|
+
if (fragments?.page) assertFragmentContract(fragments.page, PAGE_CONTRACT);
|
|
64
|
+
if (fragments?.article) assertFragmentContract(fragments.article, ARTICLE_CONTRACT);
|
|
65
|
+
if (fragments?.query) assertFragmentContract(fragments.query, QUERY_CONTRACT);
|
|
66
|
+
return [
|
|
67
|
+
fragments?.product ?? DEFAULT_PRODUCT_FRAGMENT,
|
|
68
|
+
fragments?.collection ?? DEFAULT_COLLECTION_FRAGMENT,
|
|
69
|
+
fragments?.page ?? DEFAULT_PAGE_FRAGMENT,
|
|
70
|
+
fragments?.article ?? DEFAULT_ARTICLE_FRAGMENT,
|
|
71
|
+
fragments?.query ?? DEFAULT_QUERY_FRAGMENT
|
|
72
|
+
];
|
|
73
|
+
}
|
|
74
|
+
function makePredictiveSearchQueries(options) {
|
|
75
|
+
return { predictiveSearch: gql(PREDICTIVE_SEARCH_QUERY, resolveFragments(options?.fragments)) };
|
|
76
|
+
}
|
|
77
|
+
const predictiveSearchQueries = makePredictiveSearchQueries();
|
|
78
|
+
|
|
79
|
+
//#endregion
|
|
80
|
+
export { makePredictiveSearchQueries, predictiveSearchQueries };
|
|
81
|
+
//# sourceMappingURL=queries.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.mjs","names":[],"sources":["../../../../src/core/predictive-search/queries.ts"],"sourcesContent":["import {\n gql,\n type AnyStorefrontQueryString,\n type ComposedSource,\n type SourceOf,\n type StorefrontQueryString,\n} from \"../../graphql\";\nimport type { InferResult, InferVariables } from \"../../graphql\";\n\nconst PRODUCT_FRAGMENT_NAME = \"PredictiveSearchProductFragment\";\nconst COLLECTION_FRAGMENT_NAME = \"PredictiveSearchCollectionFragment\";\nconst PAGE_FRAGMENT_NAME = \"PredictiveSearchPageFragment\";\nconst ARTICLE_FRAGMENT_NAME = \"PredictiveSearchArticleFragment\";\nconst QUERY_FRAGMENT_NAME = \"PredictiveSearchQueryFragment\";\n\nconst PRODUCT_TYPE_NAME = \"Product\";\nconst COLLECTION_TYPE_NAME = \"Collection\";\nconst PAGE_TYPE_NAME = \"Page\";\nconst ARTICLE_TYPE_NAME = \"Article\";\nconst QUERY_TYPE_NAME = \"SearchQuerySuggestion\";\n\ntype FragmentContract = {\n readonly label: string;\n readonly name: string;\n readonly typeName: string;\n};\n\nconst PRODUCT_CONTRACT = {\n label: \"product\",\n name: PRODUCT_FRAGMENT_NAME,\n typeName: PRODUCT_TYPE_NAME,\n} as const satisfies FragmentContract;\n\nconst COLLECTION_CONTRACT = {\n label: \"collection\",\n name: COLLECTION_FRAGMENT_NAME,\n typeName: COLLECTION_TYPE_NAME,\n} as const satisfies FragmentContract;\n\nconst PAGE_CONTRACT = {\n label: \"page\",\n name: PAGE_FRAGMENT_NAME,\n typeName: PAGE_TYPE_NAME,\n} as const satisfies FragmentContract;\n\nconst ARTICLE_CONTRACT = {\n label: \"article\",\n name: ARTICLE_FRAGMENT_NAME,\n typeName: ARTICLE_TYPE_NAME,\n} as const satisfies FragmentContract;\n\nconst QUERY_CONTRACT = {\n label: \"query\",\n name: QUERY_FRAGMENT_NAME,\n typeName: QUERY_TYPE_NAME,\n} as const satisfies FragmentContract;\n\nconst HYDROGEN_PRODUCT_FRAGMENT = gql(`\n fragment HydrogenPredictiveSearchProductFragment on Product {\n __typename\n id\n title\n handle\n trackingParameters\n selectedOrFirstAvailableVariant(\n selectedOptions: []\n ignoreUnknownOptions: true\n caseInsensitiveMatch: true\n ) {\n id\n image {\n url\n altText\n width\n height\n }\n price {\n amount\n currencyCode\n }\n }\n }\n`);\n\nconst HYDROGEN_COLLECTION_FRAGMENT = gql(`\n fragment HydrogenPredictiveSearchCollectionFragment on Collection {\n __typename\n id\n title\n handle\n image {\n url\n altText\n width\n height\n }\n trackingParameters\n }\n`);\n\nconst HYDROGEN_PAGE_FRAGMENT = gql(`\n fragment HydrogenPredictiveSearchPageFragment on Page {\n __typename\n id\n title\n handle\n trackingParameters\n }\n`);\n\nconst HYDROGEN_ARTICLE_FRAGMENT = gql(`\n fragment HydrogenPredictiveSearchArticleFragment on Article {\n __typename\n id\n title\n handle\n blog {\n handle\n }\n image {\n url\n altText\n width\n height\n }\n trackingParameters\n }\n`);\n\nconst HYDROGEN_QUERY_FRAGMENT = gql(`\n fragment HydrogenPredictiveSearchQueryFragment on SearchQuerySuggestion {\n __typename\n text\n styledText\n trackingParameters\n }\n`);\n\n// The consumer-overridable fragment spreads (e.g. PredictiveSearchProductFragment)\n// are interpolated on purpose: those fragments only exist at runtime, and the\n// gql.tada plugin skips documents containing interpolations instead of flagging\n// unknown fragments, while TypeScript still resolves the full literal source type.\n// The resolved fragments are composed in at runtime by `makePredictiveSearchQueries`.\nconst PREDICTIVE_SEARCH_QUERY = gql(\n `query PredictiveSearch(\n $country: CountryCode\n $language: LanguageCode\n $limit: Int\n $limitScope: PredictiveSearchLimitScope\n $term: String!\n $types: [PredictiveSearchType!]\n $searchableFields: [SearchableField!]\n $unavailableProducts: SearchUnavailableProductsType\n ) @inContext(country: $country, language: $language) {\n predictiveSearch(\n limit: $limit\n limitScope: $limitScope\n query: $term\n types: $types\n searchableFields: $searchableFields\n unavailableProducts: $unavailableProducts\n ) {\n articles {\n ...HydrogenPredictiveSearchArticleFragment\n ...${ARTICLE_FRAGMENT_NAME}\n }\n collections {\n ...HydrogenPredictiveSearchCollectionFragment\n ...${COLLECTION_FRAGMENT_NAME}\n }\n pages {\n ...HydrogenPredictiveSearchPageFragment\n ...${PAGE_FRAGMENT_NAME}\n }\n products {\n ...HydrogenPredictiveSearchProductFragment\n ...${PRODUCT_FRAGMENT_NAME}\n }\n queries {\n ...HydrogenPredictiveSearchQueryFragment\n ...${QUERY_FRAGMENT_NAME}\n }\n }\n }`,\n [\n HYDROGEN_PRODUCT_FRAGMENT,\n HYDROGEN_COLLECTION_FRAGMENT,\n HYDROGEN_PAGE_FRAGMENT,\n HYDROGEN_ARTICLE_FRAGMENT,\n HYDROGEN_QUERY_FRAGMENT,\n ],\n);\n\nconst DEFAULT_PRODUCT_FRAGMENT = gql(`\n fragment PredictiveSearchProductFragment on Product {\n id\n }\n`);\n\nconst DEFAULT_COLLECTION_FRAGMENT = gql(`\n fragment PredictiveSearchCollectionFragment on Collection {\n id\n }\n`);\n\nconst DEFAULT_PAGE_FRAGMENT = gql(`\n fragment PredictiveSearchPageFragment on Page {\n id\n }\n`);\n\nconst DEFAULT_ARTICLE_FRAGMENT = gql(`\n fragment PredictiveSearchArticleFragment on Article {\n id\n }\n`);\n\nconst DEFAULT_QUERY_FRAGMENT = gql(`\n fragment PredictiveSearchQueryFragment on SearchQuerySuggestion {\n text\n }\n`);\n\nexport type PredictiveSearchFragments = {\n readonly product?: AnyStorefrontQueryString;\n readonly collection?: AnyStorefrontQueryString;\n readonly page?: AnyStorefrontQueryString;\n readonly article?: AnyStorefrontQueryString;\n readonly query?: AnyStorefrontQueryString;\n};\n\nexport type CreatePredictiveSearchQueriesOptions<\n TFragments extends PredictiveSearchFragments = PredictiveSearchFragments,\n> = {\n readonly fragments?: TFragments;\n};\n\ntype FragmentForOptions<\n TOptions,\n TKey extends keyof PredictiveSearchFragments,\n TDefault extends AnyStorefrontQueryString,\n> = TOptions extends { readonly fragments: infer TFragments }\n ? TFragments extends Record<TKey, infer TFragment extends AnyStorefrontQueryString>\n ? TFragment\n : TDefault\n : TDefault;\n\ntype PredictiveSearchQueryFragmentsForOptions<TOptions> = [\n FragmentForOptions<TOptions, \"product\", typeof DEFAULT_PRODUCT_FRAGMENT>,\n FragmentForOptions<TOptions, \"collection\", typeof DEFAULT_COLLECTION_FRAGMENT>,\n FragmentForOptions<TOptions, \"page\", typeof DEFAULT_PAGE_FRAGMENT>,\n FragmentForOptions<TOptions, \"article\", typeof DEFAULT_ARTICLE_FRAGMENT>,\n FragmentForOptions<TOptions, \"query\", typeof DEFAULT_QUERY_FRAGMENT>,\n];\n\ntype PredictiveSearchQuerySourceForOptions<TOptions> = ComposedSource<\n SourceOf<typeof PREDICTIVE_SEARCH_QUERY>,\n PredictiveSearchQueryFragmentsForOptions<TOptions>\n>;\n\ntype PredictiveSearchQueryForOptions<TOptions> = StorefrontQueryString<\n InferResult<PredictiveSearchQuerySourceForOptions<TOptions>>,\n InferVariables<PredictiveSearchQuerySourceForOptions<TOptions>>,\n PredictiveSearchQuerySourceForOptions<TOptions>\n>;\n\nexport type PredictiveSearchQueriesForOptions<TOptions> = {\n readonly predictiveSearch: PredictiveSearchQueryForOptions<TOptions>;\n};\n\nfunction assertFragmentContract(fragment: string, contract: FragmentContract): void {\n const pattern = new RegExp(`fragment\\\\s+${contract.name}\\\\s+on\\\\s+${contract.typeName}`);\n if (pattern.test(fragment)) return;\n\n throw new Error(\n `Predictive search ${contract.label} fragment must be named ${contract.name} and target ${contract.typeName}`,\n );\n}\n\nfunction resolveFragments(fragments: PredictiveSearchFragments | undefined) {\n if (fragments?.product) assertFragmentContract(fragments.product, PRODUCT_CONTRACT);\n if (fragments?.collection) assertFragmentContract(fragments.collection, COLLECTION_CONTRACT);\n if (fragments?.page) assertFragmentContract(fragments.page, PAGE_CONTRACT);\n if (fragments?.article) assertFragmentContract(fragments.article, ARTICLE_CONTRACT);\n if (fragments?.query) assertFragmentContract(fragments.query, QUERY_CONTRACT);\n\n return [\n fragments?.product ?? DEFAULT_PRODUCT_FRAGMENT,\n fragments?.collection ?? DEFAULT_COLLECTION_FRAGMENT,\n fragments?.page ?? DEFAULT_PAGE_FRAGMENT,\n fragments?.article ?? DEFAULT_ARTICLE_FRAGMENT,\n fragments?.query ?? DEFAULT_QUERY_FRAGMENT,\n ] as const;\n}\n\nexport function makePredictiveSearchQueries<\n const TOptions extends CreatePredictiveSearchQueriesOptions,\n>(options: TOptions): PredictiveSearchQueriesForOptions<TOptions>;\nexport function makePredictiveSearchQueries(): PredictiveSearchQueriesForOptions<undefined>;\nexport function makePredictiveSearchQueries(options?: CreatePredictiveSearchQueriesOptions) {\n return {\n predictiveSearch: gql(PREDICTIVE_SEARCH_QUERY, resolveFragments(options?.fragments)),\n } as PredictiveSearchQueriesForOptions<typeof options>;\n}\n\nexport const predictiveSearchQueries = makePredictiveSearchQueries();\n"],"mappings":";;;AASA,MAAA,wBAAA;AACA,MAAA,2BAAA;AACA,MAAA,qBAAA;AACA,MAAA,wBAAA;AACA,MAAA,sBAAA;AAEA,MAAA,oBAAA;AACA,MAAA,uBAAA;AACA,MAAA,iBAAA;AACA,MAAA,oBAAA;AACA,MAAA,kBAAA;AAQA,MAAA,mBAAA;CACA,OAAA;CACA,MAAA;CACA,UAAA;CACA;AAEA,MAAA,sBAAA;CACA,OAAA;CACA,MAAA;CACA,UAAA;CACA;AAEA,MAAA,gBAAA;CACA,OAAA;CACA,MAAA;CACA,UAAA;CACA;AAEA,MAAA,mBAAA;CACA,OAAA;CACA,MAAA;CACA,UAAA;CACA;AAEA,MAAA,iBAAA;CACA,OAAA;CACA,MAAA;CACA,UAAA;CACA;AAEA,MAAA,4BAAA,IAAA,kRAyBA;AAEA,MAAA,+BAAA,IAAA,kJAcA;AAEA,MAAA,yBAAA,IAAA,uGAQA;AAEA,MAAA,4BAAA,IAAA,wJAiBA;AAEA,MAAA,0BAAA,IAAA,yHAOA;AAOA,MAAA,0BAAA,IACA,wfAoBW,sBAAwB,gEAIxB,yBAA2B,oDAI3B,mBAAqB,0DAIrB,sBAAwB,uDAIxB,oBAAsB,MAIjC;CACA;CACA;CACA;CACA;CACA;CACA,CACA;AAEA,MAAA,2BAAA,IAAA,0DAIA;AAEA,MAAA,8BAAA,IAAA,gEAIA;AAEA,MAAA,wBAAA,IAAA,oDAIA;AAEA,MAAA,2BAAA,IAAA,0DAIA;AAEA,MAAA,yBAAA,IAAA,wEAIA;AAiDA,SAAA,uBAAA,UAAA,UAAA;AAEA,KAAA,IADA,OAAA,eAAA,SAAA,KAAA,YAAA,SAAA,WACA,CAAA,KAAA,SAAA,CAAA;AAEA,OAAA,IAAA,MACA,qBAAA,SAAA,MAAA,0BAAA,SAAA,KAAA,cAAA,SAAA,WACA;;AAGA,SAAA,iBAAA,WAAA;AACA,KAAA,WAAA,QAAA,wBAAA,UAAA,SAAA,iBAAA;AACA,KAAA,WAAA,WAAA,wBAAA,UAAA,YAAA,oBAAA;AACA,KAAA,WAAA,KAAA,wBAAA,UAAA,MAAA,cAAA;AACA,KAAA,WAAA,QAAA,wBAAA,UAAA,SAAA,iBAAA;AACA,KAAA,WAAA,MAAA,wBAAA,UAAA,OAAA,eAAA;AAEA,QAAA;EACA,WAAA,WAAA;EACA,WAAA,cAAA;EACA,WAAA,QAAA;EACA,WAAA,WAAA;EACA,WAAA,SAAA;EACA;;AAOA,SAAA,4BAAA,SAAA;AACA,QAAA,EACA,kBAAA,IAAA,yBAAA,iBAAA,SAAA,UAAA,CAAA,EACA;;AAGA,MAAA,0BAAA,6BAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { PredictiveSearchLimitScope, PredictiveSearchType, SearchUnavailableProductsType, SearchableField } from "../../graphql/generated/storefront-api-types.mjs";
|
|
2
|
+
import { AnyStorefrontQueryString, StorefrontQueryString } from "../../graphql/graphql.mjs";
|
|
3
|
+
import { StorefrontClient } from "../../client/types.mjs";
|
|
4
|
+
import { CreatePredictiveSearchQueriesOptions, PredictiveSearchQueriesForOptions, predictiveSearchQueries } from "./queries.mjs";
|
|
5
|
+
|
|
6
|
+
//#region src/core/predictive-search/search.d.ts
|
|
7
|
+
type PredictiveSearchGraphqlResult<TQuery extends AnyStorefrontQueryString> = TQuery extends StorefrontQueryString<infer TResult, infer _Variables, string> ? TResult : never;
|
|
8
|
+
type PredictiveSearchItemsForQuery<TQuery extends AnyStorefrontQueryString> = NonNullable<PredictiveSearchGraphqlResult<TQuery> extends {
|
|
9
|
+
predictiveSearch?: (infer TItems) | null;
|
|
10
|
+
} ? TItems : never>;
|
|
11
|
+
type PredictiveSearchData<TItems = PredictiveSearchItemsForQuery<typeof predictiveSearchQueries.predictiveSearch>> = {
|
|
12
|
+
term: string;
|
|
13
|
+
total: number;
|
|
14
|
+
items: TItems;
|
|
15
|
+
};
|
|
16
|
+
type PredictiveSearchDataForQuery<TQuery extends AnyStorefrontQueryString> = PredictiveSearchData<PredictiveSearchItemsForQuery<TQuery>>;
|
|
17
|
+
type PredictiveSearchDataForOptions<TOptions extends CreatePredictiveSearchQueriesOptions> = PredictiveSearchDataForQuery<PredictiveSearchQueriesForOptions<TOptions>["predictiveSearch"]>;
|
|
18
|
+
type QueryPredictiveSearchOptions<TQuery extends AnyStorefrontQueryString = typeof predictiveSearchQueries.predictiveSearch> = {
|
|
19
|
+
storefrontClient: Pick<StorefrontClient, "graphql">;
|
|
20
|
+
term: string;
|
|
21
|
+
query?: TQuery;
|
|
22
|
+
limit?: number;
|
|
23
|
+
limitScope?: PredictiveSearchLimitScope;
|
|
24
|
+
types?: PredictiveSearchType[];
|
|
25
|
+
searchableFields?: SearchableField[];
|
|
26
|
+
unavailableProducts?: SearchUnavailableProductsType;
|
|
27
|
+
signal?: AbortSignal;
|
|
28
|
+
};
|
|
29
|
+
declare function queryPredictiveSearch<const TQuery extends AnyStorefrontQueryString = typeof predictiveSearchQueries.predictiveSearch>(options: QueryPredictiveSearchOptions<TQuery>): Promise<PredictiveSearchDataForQuery<TQuery>>;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { PredictiveSearchData, PredictiveSearchDataForOptions, QueryPredictiveSearchOptions, queryPredictiveSearch };
|
|
32
|
+
//# sourceMappingURL=search.d.mts.map
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { predictiveSearchQueries } from "./queries.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/predictive-search/search.ts
|
|
4
|
+
const MIN_PREDICTIVE_SEARCH_LIMIT = 1;
|
|
5
|
+
const MAX_PREDICTIVE_SEARCH_LIMIT = 10;
|
|
6
|
+
const DEFAULT_PREDICTIVE_SEARCH_LIMIT = 5;
|
|
7
|
+
const DEFAULT_PREDICTIVE_SEARCH_LIMIT_SCOPE = "EACH";
|
|
8
|
+
const DEFAULT_PREDICTIVE_SEARCH_UNAVAILABLE_PRODUCTS = "HIDE";
|
|
9
|
+
function getEmptyPredictiveSearchResult(term = "") {
|
|
10
|
+
return {
|
|
11
|
+
term,
|
|
12
|
+
total: 0,
|
|
13
|
+
items: {
|
|
14
|
+
products: [],
|
|
15
|
+
collections: [],
|
|
16
|
+
pages: [],
|
|
17
|
+
articles: [],
|
|
18
|
+
queries: []
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
async function queryPredictiveSearch(options) {
|
|
23
|
+
return (await fetchPredictiveSearch(options)).data;
|
|
24
|
+
}
|
|
25
|
+
async function fetchPredictiveSearch({ storefrontClient, term, query, limit, limitScope = DEFAULT_PREDICTIVE_SEARCH_LIMIT_SCOPE, types, searchableFields, unavailableProducts = DEFAULT_PREDICTIVE_SEARCH_UNAVAILABLE_PRODUCTS, signal }) {
|
|
26
|
+
const trimmedTerm = term.trim();
|
|
27
|
+
if (!trimmedTerm) return {
|
|
28
|
+
data: getEmptyPredictiveSearchResult(trimmedTerm),
|
|
29
|
+
headers: new Headers()
|
|
30
|
+
};
|
|
31
|
+
const document = query ?? predictiveSearchQueries.predictiveSearch;
|
|
32
|
+
const graphql = storefrontClient.graphql;
|
|
33
|
+
const result = await graphql(document, {
|
|
34
|
+
variables: {
|
|
35
|
+
limit: clampPredictiveSearchLimit(limit),
|
|
36
|
+
limitScope,
|
|
37
|
+
term: trimmedTerm,
|
|
38
|
+
types,
|
|
39
|
+
searchableFields,
|
|
40
|
+
unavailableProducts
|
|
41
|
+
},
|
|
42
|
+
...signal ? { signal } : {}
|
|
43
|
+
});
|
|
44
|
+
if (result.errors) throw new Error(`Shopify API errors: ${formatGraphQLErrors(result.errors)}`);
|
|
45
|
+
const items = result.data?.predictiveSearch;
|
|
46
|
+
if (!items) throw new Error("No predictive search data returned from Shopify API");
|
|
47
|
+
return {
|
|
48
|
+
data: {
|
|
49
|
+
term: trimmedTerm,
|
|
50
|
+
total: countPredictiveSearchItems(items),
|
|
51
|
+
items
|
|
52
|
+
},
|
|
53
|
+
headers: result.headers
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function clampPredictiveSearchLimit(limit) {
|
|
57
|
+
if (typeof limit !== "number") return 5;
|
|
58
|
+
if (!Number.isFinite(limit)) return 5;
|
|
59
|
+
return Math.min(10, Math.max(1, Math.trunc(limit)));
|
|
60
|
+
}
|
|
61
|
+
function countPredictiveSearchItems(items) {
|
|
62
|
+
if (!items || typeof items !== "object") return 0;
|
|
63
|
+
return Object.values(items).reduce((total, value) => {
|
|
64
|
+
if (!Array.isArray(value)) return total;
|
|
65
|
+
return total + value.length;
|
|
66
|
+
}, 0);
|
|
67
|
+
}
|
|
68
|
+
function formatGraphQLErrors(errors) {
|
|
69
|
+
return errors.map(({ message }) => message).join(", ");
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
//#endregion
|
|
73
|
+
export { DEFAULT_PREDICTIVE_SEARCH_LIMIT_SCOPE, DEFAULT_PREDICTIVE_SEARCH_UNAVAILABLE_PRODUCTS, fetchPredictiveSearch, getEmptyPredictiveSearchResult, queryPredictiveSearch };
|
|
74
|
+
//# sourceMappingURL=search.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.mjs","names":[],"sources":["../../../../src/core/predictive-search/search.ts"],"sourcesContent":["import type { GraphQLFormattedError, StorefrontClient } from \"../../client\";\nimport type { AnyStorefrontQueryString, StorefrontQueryString } from \"../../graphql\";\nimport type {\n PredictiveSearchLimitScope,\n PredictiveSearchType,\n SearchUnavailableProductsType,\n SearchableField,\n} from \"../../graphql/generated/storefront-api-types\";\nimport {\n predictiveSearchQueries,\n type CreatePredictiveSearchQueriesOptions,\n type PredictiveSearchQueriesForOptions,\n} from \"./queries\";\n\nexport const MIN_PREDICTIVE_SEARCH_LIMIT = 1;\nexport const MAX_PREDICTIVE_SEARCH_LIMIT = 10;\nexport const DEFAULT_PREDICTIVE_SEARCH_LIMIT = 5;\nexport const DEFAULT_PREDICTIVE_SEARCH_LIMIT_SCOPE = \"EACH\" satisfies PredictiveSearchLimitScope;\nexport const DEFAULT_PREDICTIVE_SEARCH_UNAVAILABLE_PRODUCTS =\n \"HIDE\" satisfies SearchUnavailableProductsType;\n\ntype PredictiveSearchGraphqlResult<TQuery extends AnyStorefrontQueryString> =\n TQuery extends StorefrontQueryString<infer TResult, infer _Variables, string> ? TResult : never;\n\ntype PredictiveSearchItemsForQuery<TQuery extends AnyStorefrontQueryString> = NonNullable<\n PredictiveSearchGraphqlResult<TQuery> extends { predictiveSearch?: (infer TItems) | null }\n ? TItems\n : never\n>;\n\nexport type PredictiveSearchData<\n TItems = PredictiveSearchItemsForQuery<typeof predictiveSearchQueries.predictiveSearch>,\n> = {\n term: string;\n total: number;\n items: TItems;\n};\n\nexport type PredictiveSearchDataForQuery<TQuery extends AnyStorefrontQueryString> =\n PredictiveSearchData<PredictiveSearchItemsForQuery<TQuery>>;\n\nexport type PredictiveSearchDataForOptions<TOptions extends CreatePredictiveSearchQueriesOptions> =\n PredictiveSearchDataForQuery<PredictiveSearchQueriesForOptions<TOptions>[\"predictiveSearch\"]>;\n\nexport type QueryPredictiveSearchOptions<\n TQuery extends AnyStorefrontQueryString = typeof predictiveSearchQueries.predictiveSearch,\n> = {\n storefrontClient: Pick<StorefrontClient, \"graphql\">;\n term: string;\n query?: TQuery;\n limit?: number;\n limitScope?: PredictiveSearchLimitScope;\n types?: PredictiveSearchType[];\n searchableFields?: SearchableField[];\n unavailableProducts?: SearchUnavailableProductsType;\n signal?: AbortSignal;\n};\n\ntype FetchPredictiveSearchResult<TQuery extends AnyStorefrontQueryString> = {\n data: PredictiveSearchDataForQuery<TQuery>;\n headers: Headers;\n};\n\ntype PredictiveSearchQueryDocument = AnyStorefrontQueryString;\n\ntype PredictiveSearchVariables = {\n term: string;\n limit: number;\n limitScope: PredictiveSearchLimitScope;\n types: PredictiveSearchType[] | undefined;\n searchableFields: SearchableField[] | undefined;\n unavailableProducts: SearchUnavailableProductsType;\n};\n\ntype PredictiveSearchQueryResult<TItems> = {\n data: { predictiveSearch?: TItems | null } | null;\n errors?: GraphQLFormattedError[];\n headers: Headers;\n};\n\ntype PredictiveSearchGraphql<TItems> = (\n query: PredictiveSearchQueryDocument,\n options: { variables: PredictiveSearchVariables; signal?: AbortSignal },\n) => Promise<PredictiveSearchQueryResult<TItems>>;\n\nexport function getEmptyPredictiveSearchResult(term = \"\"): PredictiveSearchData {\n return {\n term,\n total: 0,\n items: {\n products: [],\n collections: [],\n pages: [],\n articles: [],\n queries: [],\n },\n };\n}\n\nexport async function queryPredictiveSearch<\n const TQuery extends AnyStorefrontQueryString = typeof predictiveSearchQueries.predictiveSearch,\n>(options: QueryPredictiveSearchOptions<TQuery>): Promise<PredictiveSearchDataForQuery<TQuery>> {\n const result = await fetchPredictiveSearch(options);\n return result.data;\n}\n\nexport async function fetchPredictiveSearch<\n const TQuery extends AnyStorefrontQueryString = typeof predictiveSearchQueries.predictiveSearch,\n>({\n storefrontClient,\n term,\n query,\n limit,\n limitScope = DEFAULT_PREDICTIVE_SEARCH_LIMIT_SCOPE,\n types,\n searchableFields,\n unavailableProducts = DEFAULT_PREDICTIVE_SEARCH_UNAVAILABLE_PRODUCTS,\n signal,\n}: QueryPredictiveSearchOptions<TQuery>): Promise<FetchPredictiveSearchResult<TQuery>> {\n const trimmedTerm = term.trim();\n if (!trimmedTerm) {\n return {\n data: getEmptyPredictiveSearchResult(\n trimmedTerm,\n ) as unknown as PredictiveSearchDataForQuery<TQuery>,\n headers: new Headers(),\n };\n }\n\n const document = query ?? predictiveSearchQueries.predictiveSearch;\n const graphql = storefrontClient.graphql as PredictiveSearchGraphql<\n PredictiveSearchItemsForQuery<TQuery>\n >;\n const result = await graphql(document, {\n variables: {\n limit: clampPredictiveSearchLimit(limit),\n limitScope,\n term: trimmedTerm,\n types,\n searchableFields,\n unavailableProducts,\n },\n ...(signal ? { signal } : {}),\n });\n\n if (result.errors) {\n throw new Error(`Shopify API errors: ${formatGraphQLErrors(result.errors)}`);\n }\n\n const items = result.data?.predictiveSearch;\n if (!items) {\n throw new Error(\"No predictive search data returned from Shopify API\");\n }\n\n return {\n data: {\n term: trimmedTerm,\n total: countPredictiveSearchItems(items),\n items,\n } as PredictiveSearchDataForQuery<TQuery>,\n headers: result.headers,\n };\n}\n\nfunction clampPredictiveSearchLimit(limit: number | undefined): number {\n if (typeof limit !== \"number\") return DEFAULT_PREDICTIVE_SEARCH_LIMIT;\n if (!Number.isFinite(limit)) return DEFAULT_PREDICTIVE_SEARCH_LIMIT;\n\n const integerLimit = Math.trunc(limit);\n return Math.min(MAX_PREDICTIVE_SEARCH_LIMIT, Math.max(MIN_PREDICTIVE_SEARCH_LIMIT, integerLimit));\n}\n\nfunction countPredictiveSearchItems(items: unknown): number {\n if (!items || typeof items !== \"object\") return 0;\n\n return Object.values(items).reduce((total, value) => {\n if (!Array.isArray(value)) return total;\n return total + value.length;\n }, 0);\n}\n\nfunction formatGraphQLErrors(errors: GraphQLFormattedError[]): string {\n return errors.map(({ message }) => message).join(\", \");\n}\n"],"mappings":";;;AAcA,MAAa,8BAA8B;AAC3C,MAAa,8BAA8B;AAC3C,MAAa,kCAAkC;AAC/C,MAAa,wCAAwC;AACrD,MAAa,iDACX;AAkEF,SAAgB,+BAA+B,OAAO,IAA0B;AAC9E,QAAO;EACL;EACA,OAAO;EACP,OAAO;GACL,UAAU,EAAE;GACZ,aAAa,EAAE;GACf,OAAO,EAAE;GACT,UAAU,EAAE;GACZ,SAAS,EAAE;GACZ;EACF;;AAGH,eAAsB,sBAEpB,SAA8F;AAE9F,SAAO,MADc,sBAAsB,QAAQ,EACrC;;AAGhB,eAAsB,sBAEpB,EACA,kBACA,MACA,OACA,OACA,aAAa,uCACb,OACA,kBACA,sBAAsB,gDACtB,UACqF;CACrF,MAAM,cAAc,KAAK,MAAM;AAC/B,KAAI,CAAC,YACH,QAAO;EACL,MAAM,+BACJ,YACD;EACD,SAAS,IAAI,SAAS;EACvB;CAGH,MAAM,WAAW,SAAS,wBAAwB;CAClD,MAAM,UAAU,iBAAiB;CAGjC,MAAM,SAAS,MAAM,QAAQ,UAAU;EACrC,WAAW;GACT,OAAO,2BAA2B,MAAM;GACxC;GACA,MAAM;GACN;GACA;GACA;GACD;EACD,GAAI,SAAS,EAAE,QAAQ,GAAG,EAAE;EAC7B,CAAC;AAEF,KAAI,OAAO,OACT,OAAM,IAAI,MAAM,uBAAuB,oBAAoB,OAAO,OAAO,GAAG;CAG9E,MAAM,QAAQ,OAAO,MAAM;AAC3B,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,sDAAsD;AAGxE,QAAO;EACL,MAAM;GACJ,MAAM;GACN,OAAO,2BAA2B,MAAM;GACxC;GACD;EACD,SAAS,OAAO;EACjB;;AAGH,SAAS,2BAA2B,OAAmC;AACrE,KAAI,OAAO,UAAU,SAAU;AAC/B,KAAI,CAAC,OAAO,SAAS,MAAM,CAAE;AAG7B,QAAO,KAAK,QAAiC,KAAK,OAD7B,KAAK,MAAM,MAC+D,CAAC,CAAC;;AAGnG,SAAS,2BAA2B,OAAwB;AAC1D,KAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAEhD,QAAO,OAAO,OAAO,MAAM,CAAC,QAAQ,OAAO,UAAU;AACnD,MAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,QAAO;AAClC,SAAO,QAAQ,MAAM;IACpB,EAAE;;AAGP,SAAS,oBAAoB,QAAyC;AACpE,QAAO,OAAO,KAAK,EAAE,cAAc,QAAQ,CAAC,KAAK,KAAK"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { PredictiveSearchLimitScope, PredictiveSearchType, SearchUnavailableProductsType, SearchableField } from "../../graphql/generated/storefront-api-types.mjs";
|
|
2
|
+
import { CallableRouteHandler, ShopifyRouteError, ShopifyRouteErrorResult, ShopifyRouteJsonResult } from "../request-routing/route-types.mjs";
|
|
3
|
+
import { CreatePredictiveSearchQueriesOptions, PredictiveSearchQueriesForOptions } from "./queries.mjs";
|
|
4
|
+
import { PredictiveSearchDataForOptions, QueryPredictiveSearchOptions } from "./search.mjs";
|
|
5
|
+
import { PREDICTIVE_SEARCH_GET_METHOD } from "./constants.mjs";
|
|
6
|
+
|
|
7
|
+
//#region src/core/predictive-search/server-handlers.d.ts
|
|
8
|
+
declare const predictiveSearchServerHandlersQuery: unique symbol;
|
|
9
|
+
type PredictiveSearchHandlerContext = {
|
|
10
|
+
request: Request;
|
|
11
|
+
storefrontClient: QueryPredictiveSearchOptions["storefrontClient"];
|
|
12
|
+
};
|
|
13
|
+
type PredictiveSearchGetData<TData = PredictiveSearchDataForOptions<{}>> = TData;
|
|
14
|
+
type PredictiveSearchGetResult<TData = PredictiveSearchDataForOptions<{}>> = ShopifyRouteJsonResult<PredictiveSearchGetData<TData>> | ShopifyRouteErrorResult<PredictiveSearchError>;
|
|
15
|
+
type PredictiveSearchErrorCode = "invalid_predictive_search_request";
|
|
16
|
+
type PredictiveSearchError = ShopifyRouteError & {
|
|
17
|
+
code: PredictiveSearchErrorCode;
|
|
18
|
+
};
|
|
19
|
+
type PredictiveSearchGetHandler<TData = PredictiveSearchDataForOptions<{}>> = CallableRouteHandler<PredictiveSearchHandlerContext, PredictiveSearchGetResult<TData>, string, typeof PREDICTIVE_SEARCH_GET_METHOD>;
|
|
20
|
+
type PredictiveSearchServerHandlers<TOptions extends CreatePredictiveSearchServerHandlersOptions = {}, TData = PredictiveSearchDataForOptions<TOptions>> = {
|
|
21
|
+
readonly [predictiveSearchServerHandlersQuery]: PredictiveSearchQueriesForOptions<TOptions>["predictiveSearch"];
|
|
22
|
+
get: PredictiveSearchGetHandler<TData>;
|
|
23
|
+
};
|
|
24
|
+
type CreatePredictiveSearchServerHandlersOptions = CreatePredictiveSearchQueriesOptions & {
|
|
25
|
+
path?: string;
|
|
26
|
+
limit?: number;
|
|
27
|
+
limitScope?: PredictiveSearchLimitScope;
|
|
28
|
+
types?: PredictiveSearchType[];
|
|
29
|
+
searchableFields?: SearchableField[];
|
|
30
|
+
unavailableProducts?: SearchUnavailableProductsType;
|
|
31
|
+
};
|
|
32
|
+
declare function createPredictiveSearchServerHandlers(): PredictiveSearchServerHandlers;
|
|
33
|
+
declare function createPredictiveSearchServerHandlers<const TOptions extends CreatePredictiveSearchServerHandlersOptions>(options: TOptions): PredictiveSearchServerHandlers<TOptions>;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { CreatePredictiveSearchServerHandlersOptions, createPredictiveSearchServerHandlers };
|
|
36
|
+
//# sourceMappingURL=server-handlers.d.mts.map
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { createProxyResponseHeaders } from "../request-routing/interceptors/proxy.mjs";
|
|
2
|
+
import { createCallableRouteHandler } from "../request-routing/registered-routes.mjs";
|
|
3
|
+
import { PREDICTIVE_SEARCH_API_PATH } from "./constants.mjs";
|
|
4
|
+
import { makePredictiveSearchQueries, predictiveSearchQueries } from "./queries.mjs";
|
|
5
|
+
import { DEFAULT_PREDICTIVE_SEARCH_LIMIT_SCOPE, DEFAULT_PREDICTIVE_SEARCH_UNAVAILABLE_PRODUCTS, fetchPredictiveSearch } from "./search.mjs";
|
|
6
|
+
|
|
7
|
+
//#region src/core/predictive-search/server-handlers.ts
|
|
8
|
+
const predictiveSearchServerHandlersQuery = Symbol("hydrogen.predictiveSearchQuery");
|
|
9
|
+
const VALID_LIMIT_SCOPES = ["ALL", "EACH"];
|
|
10
|
+
const VALID_PREDICTIVE_SEARCH_TYPES = [
|
|
11
|
+
"ARTICLE",
|
|
12
|
+
"COLLECTION",
|
|
13
|
+
"PAGE",
|
|
14
|
+
"PRODUCT",
|
|
15
|
+
"QUERY"
|
|
16
|
+
];
|
|
17
|
+
const VALID_SEARCHABLE_FIELDS = [
|
|
18
|
+
"AUTHOR",
|
|
19
|
+
"BODY",
|
|
20
|
+
"PRODUCT_TYPE",
|
|
21
|
+
"TAG",
|
|
22
|
+
"TITLE",
|
|
23
|
+
"VARIANTS_BARCODE",
|
|
24
|
+
"VARIANTS_SKU",
|
|
25
|
+
"VARIANTS_TITLE",
|
|
26
|
+
"VENDOR"
|
|
27
|
+
];
|
|
28
|
+
const VALID_UNAVAILABLE_PRODUCTS = [
|
|
29
|
+
"HIDE",
|
|
30
|
+
"LAST",
|
|
31
|
+
"SHOW"
|
|
32
|
+
];
|
|
33
|
+
function createPredictiveSearchServerHandlers(options = {}) {
|
|
34
|
+
const queries = options.fragments ? makePredictiveSearchQueries(options) : predictiveSearchQueries;
|
|
35
|
+
const handlers = { get: createCallableRouteHandler(options.path ?? "/api/predictive-search", "GET", (context) => handleGet(context, options, queries)) };
|
|
36
|
+
Object.defineProperty(handlers, predictiveSearchServerHandlersQuery, { value: queries.predictiveSearch });
|
|
37
|
+
return handlers;
|
|
38
|
+
}
|
|
39
|
+
async function handleGet({ request, storefrontClient }, options, queries) {
|
|
40
|
+
let searchOptions;
|
|
41
|
+
try {
|
|
42
|
+
searchOptions = parsePredictiveSearchRequest(request, options);
|
|
43
|
+
} catch (error) {
|
|
44
|
+
return errorResult(getErrorMessage(error, "Invalid predictive search request"));
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
const result = await fetchPredictiveSearch({
|
|
48
|
+
storefrontClient,
|
|
49
|
+
query: queries.predictiveSearch,
|
|
50
|
+
...searchOptions
|
|
51
|
+
});
|
|
52
|
+
return {
|
|
53
|
+
type: "json",
|
|
54
|
+
data: result.data,
|
|
55
|
+
headers: createProxyResponseHeaders(result.headers)
|
|
56
|
+
};
|
|
57
|
+
} catch (error) {
|
|
58
|
+
return errorResult(getErrorMessage(error, "Predictive search request failed"));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function parsePredictiveSearchRequest(request, options) {
|
|
62
|
+
const searchParams = new URL(request.url).searchParams;
|
|
63
|
+
return {
|
|
64
|
+
term: searchParams.get("q") ?? "",
|
|
65
|
+
limit: parseLimit(searchParams, options),
|
|
66
|
+
limitScope: parseOne(searchParams, "limitScope", VALID_LIMIT_SCOPES) ?? options.limitScope ?? "EACH",
|
|
67
|
+
types: parseMany(searchParams, "types", VALID_PREDICTIVE_SEARCH_TYPES) ?? options.types,
|
|
68
|
+
searchableFields: parseMany(searchParams, "searchableFields", VALID_SEARCHABLE_FIELDS) ?? options.searchableFields,
|
|
69
|
+
unavailableProducts: parseOne(searchParams, "unavailableProducts", VALID_UNAVAILABLE_PRODUCTS) ?? options.unavailableProducts ?? "HIDE"
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function parseLimit(searchParams, options) {
|
|
73
|
+
const rawLimit = searchParams.get("limit");
|
|
74
|
+
if (rawLimit === null) return options.limit ?? 5;
|
|
75
|
+
return Number(rawLimit);
|
|
76
|
+
}
|
|
77
|
+
function parseOne(searchParams, name, allowedValues) {
|
|
78
|
+
const value = searchParams.get(name);
|
|
79
|
+
if (value === null || value === "") return void 0;
|
|
80
|
+
if (isAllowedValue(value, allowedValues)) return value;
|
|
81
|
+
throw new Error(`Invalid ${name} value "${value}".`);
|
|
82
|
+
}
|
|
83
|
+
function parseMany(searchParams, name, allowedValues) {
|
|
84
|
+
const values = splitParamValues(searchParams, name);
|
|
85
|
+
if (values.length === 0) return void 0;
|
|
86
|
+
return values.map((value) => parseAllowedValue(name, value, allowedValues));
|
|
87
|
+
}
|
|
88
|
+
function splitParamValues(searchParams, name) {
|
|
89
|
+
return searchParams.getAll(name).flatMap((value) => value.split(",")).map((value) => value.trim()).filter(Boolean);
|
|
90
|
+
}
|
|
91
|
+
function parseAllowedValue(name, value, allowedValues) {
|
|
92
|
+
if (isAllowedValue(value, allowedValues)) return value;
|
|
93
|
+
throw new Error(`Invalid ${name} value "${value}".`);
|
|
94
|
+
}
|
|
95
|
+
function isAllowedValue(value, allowedValues) {
|
|
96
|
+
return allowedValues.some((allowedValue) => allowedValue === value);
|
|
97
|
+
}
|
|
98
|
+
function errorResult(message) {
|
|
99
|
+
return {
|
|
100
|
+
type: "error",
|
|
101
|
+
error: {
|
|
102
|
+
code: "invalid_predictive_search_request",
|
|
103
|
+
message
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function getErrorMessage(error, fallback) {
|
|
108
|
+
return error instanceof Error ? error.message : fallback;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
//#endregion
|
|
112
|
+
export { createPredictiveSearchServerHandlers };
|
|
113
|
+
//# sourceMappingURL=server-handlers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-handlers.mjs","names":[],"sources":["../../../../src/core/predictive-search/server-handlers.ts"],"sourcesContent":["import type {\n PredictiveSearchLimitScope,\n PredictiveSearchType,\n SearchUnavailableProductsType,\n SearchableField,\n} from \"../../graphql/generated/storefront-api-types\";\nimport { createProxyResponseHeaders } from \"../request-routing/interceptors/proxy\";\nimport type {\n CallableRouteHandler,\n ShopifyRouteError,\n ShopifyRouteErrorResult,\n ShopifyRouteJsonResult,\n} from \"../request-routing/registered-routes\";\nimport { createCallableRouteHandler } from \"../request-routing/registered-routes\";\nimport { PREDICTIVE_SEARCH_API_PATH, PREDICTIVE_SEARCH_GET_METHOD } from \"./constants\";\nimport {\n makePredictiveSearchQueries,\n predictiveSearchQueries,\n type CreatePredictiveSearchQueriesOptions,\n type PredictiveSearchQueriesForOptions,\n} from \"./queries\";\nimport {\n DEFAULT_PREDICTIVE_SEARCH_LIMIT,\n DEFAULT_PREDICTIVE_SEARCH_LIMIT_SCOPE,\n DEFAULT_PREDICTIVE_SEARCH_UNAVAILABLE_PRODUCTS,\n fetchPredictiveSearch,\n type PredictiveSearchDataForOptions,\n type QueryPredictiveSearchOptions,\n} from \"./search\";\n\nconst predictiveSearchServerHandlersQuery: unique symbol = Symbol(\"hydrogen.predictiveSearchQuery\");\n\nconst VALID_LIMIT_SCOPES: readonly PredictiveSearchLimitScope[] = [\"ALL\", \"EACH\"];\nconst VALID_PREDICTIVE_SEARCH_TYPES: readonly PredictiveSearchType[] = [\n \"ARTICLE\",\n \"COLLECTION\",\n \"PAGE\",\n \"PRODUCT\",\n \"QUERY\",\n];\nconst VALID_SEARCHABLE_FIELDS: readonly SearchableField[] = [\n \"AUTHOR\",\n \"BODY\",\n \"PRODUCT_TYPE\",\n \"TAG\",\n \"TITLE\",\n \"VARIANTS_BARCODE\",\n \"VARIANTS_SKU\",\n \"VARIANTS_TITLE\",\n \"VENDOR\",\n];\nconst VALID_UNAVAILABLE_PRODUCTS: readonly SearchUnavailableProductsType[] = [\n \"HIDE\",\n \"LAST\",\n \"SHOW\",\n];\n\ntype PredictiveSearchHandlerContext = {\n request: Request;\n storefrontClient: QueryPredictiveSearchOptions[\"storefrontClient\"];\n};\n\ntype PredictiveSearchGetData<TData = PredictiveSearchDataForOptions<{}>> = TData;\ntype PredictiveSearchGetResult<TData = PredictiveSearchDataForOptions<{}>> =\n | ShopifyRouteJsonResult<PredictiveSearchGetData<TData>>\n | ShopifyRouteErrorResult<PredictiveSearchError>;\n\ntype PredictiveSearchErrorCode = \"invalid_predictive_search_request\";\ntype PredictiveSearchError = ShopifyRouteError & {\n code: PredictiveSearchErrorCode;\n};\n\ntype PredictiveSearchGetHandler<TData = PredictiveSearchDataForOptions<{}>> = CallableRouteHandler<\n PredictiveSearchHandlerContext,\n PredictiveSearchGetResult<TData>,\n string,\n typeof PREDICTIVE_SEARCH_GET_METHOD\n>;\n\ntype PredictiveSearchServerHandlers<\n TOptions extends CreatePredictiveSearchServerHandlersOptions = {},\n TData = PredictiveSearchDataForOptions<TOptions>,\n> = {\n readonly [predictiveSearchServerHandlersQuery]: PredictiveSearchQueriesForOptions<TOptions>[\"predictiveSearch\"];\n get: PredictiveSearchGetHandler<TData>;\n};\n\nexport type CreatePredictiveSearchServerHandlersOptions = CreatePredictiveSearchQueriesOptions & {\n path?: string;\n limit?: number;\n limitScope?: PredictiveSearchLimitScope;\n types?: PredictiveSearchType[];\n searchableFields?: SearchableField[];\n unavailableProducts?: SearchUnavailableProductsType;\n};\n\nexport function createPredictiveSearchServerHandlers(): PredictiveSearchServerHandlers;\nexport function createPredictiveSearchServerHandlers<\n const TOptions extends CreatePredictiveSearchServerHandlersOptions,\n>(options: TOptions): PredictiveSearchServerHandlers<TOptions>;\nexport function createPredictiveSearchServerHandlers(\n options: CreatePredictiveSearchServerHandlersOptions = {},\n): PredictiveSearchServerHandlers<CreatePredictiveSearchServerHandlersOptions> {\n const queries = options.fragments\n ? makePredictiveSearchQueries(options)\n : predictiveSearchQueries;\n const handler = createCallableRouteHandler(\n options.path ?? PREDICTIVE_SEARCH_API_PATH,\n PREDICTIVE_SEARCH_GET_METHOD,\n (context: PredictiveSearchHandlerContext) => handleGet(context, options, queries),\n );\n const handlers = {\n get: handler,\n } as PredictiveSearchServerHandlers<CreatePredictiveSearchServerHandlersOptions>;\n\n Object.defineProperty(handlers, predictiveSearchServerHandlersQuery, {\n value: queries.predictiveSearch,\n });\n return handlers;\n}\n\nasync function handleGet(\n { request, storefrontClient }: PredictiveSearchHandlerContext,\n options: CreatePredictiveSearchServerHandlersOptions,\n queries: PredictiveSearchQueriesForOptions<CreatePredictiveSearchServerHandlersOptions>,\n): Promise<PredictiveSearchGetResult> {\n let searchOptions: ParsedPredictiveSearchRequest;\n try {\n searchOptions = parsePredictiveSearchRequest(request, options);\n } catch (error) {\n return errorResult(getErrorMessage(error, \"Invalid predictive search request\"));\n }\n\n try {\n const result = await fetchPredictiveSearch({\n storefrontClient,\n query: queries.predictiveSearch,\n ...searchOptions,\n });\n return {\n type: \"json\",\n data: result.data,\n headers: createProxyResponseHeaders(result.headers),\n };\n } catch (error) {\n return errorResult(getErrorMessage(error, \"Predictive search request failed\"));\n }\n}\n\ntype ParsedPredictiveSearchRequest = Omit<\n QueryPredictiveSearchOptions,\n \"storefrontClient\" | \"query\" | \"signal\"\n>;\n\nfunction parsePredictiveSearchRequest(\n request: Request,\n options: CreatePredictiveSearchServerHandlersOptions,\n): ParsedPredictiveSearchRequest {\n const searchParams = new URL(request.url).searchParams;\n return {\n term: searchParams.get(\"q\") ?? \"\",\n limit: parseLimit(searchParams, options),\n limitScope:\n parseOne(searchParams, \"limitScope\", VALID_LIMIT_SCOPES) ??\n options.limitScope ??\n DEFAULT_PREDICTIVE_SEARCH_LIMIT_SCOPE,\n types: parseMany(searchParams, \"types\", VALID_PREDICTIVE_SEARCH_TYPES) ?? options.types,\n searchableFields:\n parseMany(searchParams, \"searchableFields\", VALID_SEARCHABLE_FIELDS) ??\n options.searchableFields,\n unavailableProducts:\n parseOne(searchParams, \"unavailableProducts\", VALID_UNAVAILABLE_PRODUCTS) ??\n options.unavailableProducts ??\n DEFAULT_PREDICTIVE_SEARCH_UNAVAILABLE_PRODUCTS,\n };\n}\n\nfunction parseLimit(\n searchParams: URLSearchParams,\n options: CreatePredictiveSearchServerHandlersOptions,\n): number {\n const rawLimit = searchParams.get(\"limit\");\n if (rawLimit === null) return options.limit ?? DEFAULT_PREDICTIVE_SEARCH_LIMIT;\n return Number(rawLimit);\n}\n\nfunction parseOne<TValue extends string>(\n searchParams: URLSearchParams,\n name: string,\n allowedValues: readonly TValue[],\n): TValue | undefined {\n const value = searchParams.get(name);\n if (value === null || value === \"\") return undefined;\n if (isAllowedValue(value, allowedValues)) return value;\n throw new Error(`Invalid ${name} value \"${value}\".`);\n}\n\nfunction parseMany<TValue extends string>(\n searchParams: URLSearchParams,\n name: string,\n allowedValues: readonly TValue[],\n): TValue[] | undefined {\n const values = splitParamValues(searchParams, name);\n if (values.length === 0) return undefined;\n return values.map((value) => parseAllowedValue(name, value, allowedValues));\n}\n\nfunction splitParamValues(searchParams: URLSearchParams, name: string): string[] {\n return searchParams\n .getAll(name)\n .flatMap((value) => value.split(\",\"))\n .map((value) => value.trim())\n .filter(Boolean);\n}\n\nfunction parseAllowedValue<TValue extends string>(\n name: string,\n value: string,\n allowedValues: readonly TValue[],\n): TValue {\n if (isAllowedValue(value, allowedValues)) return value;\n throw new Error(`Invalid ${name} value \"${value}\".`);\n}\n\nfunction isAllowedValue<TValue extends string>(\n value: string,\n allowedValues: readonly TValue[],\n): value is TValue {\n return allowedValues.some((allowedValue) => allowedValue === value);\n}\n\nfunction errorResult(message: string): ShopifyRouteErrorResult<PredictiveSearchError> {\n return {\n type: \"error\",\n error: {\n code: \"invalid_predictive_search_request\",\n message,\n },\n };\n}\n\nfunction getErrorMessage(error: unknown, fallback: string): string {\n return error instanceof Error ? error.message : fallback;\n}\n"],"mappings":";;;;;;;AA8BA,MAAM,sCAAqD,OAAO,iCAAiC;AAEnG,MAAM,qBAA4D,CAAC,OAAO,OAAO;AACjF,MAAM,gCAAiE;CACrE;CACA;CACA;CACA;CACA;CACD;AACD,MAAM,0BAAsD;CAC1D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AACD,MAAM,6BAAuE;CAC3E;CACA;CACA;CACD;AA6CD,SAAgB,qCACd,UAAuD,EAAE,EACoB;CAC7E,MAAM,UAAU,QAAQ,YACpB,4BAA4B,QAAQ,GACpC;CAMJ,MAAM,WAAW,EACf,KANc,2BACd,QAAQ,0CAEP,YAA4C,UAAU,SAAS,SAAS,QAAQ,CAGrE,EACb;AAED,QAAO,eAAe,UAAU,qCAAqC,EACnE,OAAO,QAAQ,kBAChB,CAAC;AACF,QAAO;;AAGT,eAAe,UACb,EAAE,SAAS,oBACX,SACA,SACoC;CACpC,IAAI;AACJ,KAAI;AACF,kBAAgB,6BAA6B,SAAS,QAAQ;UACvD,OAAO;AACd,SAAO,YAAY,gBAAgB,OAAO,oCAAoC,CAAC;;AAGjF,KAAI;EACF,MAAM,SAAS,MAAM,sBAAsB;GACzC;GACA,OAAO,QAAQ;GACf,GAAG;GACJ,CAAC;AACF,SAAO;GACL,MAAM;GACN,MAAM,OAAO;GACb,SAAS,2BAA2B,OAAO,QAAQ;GACpD;UACM,OAAO;AACd,SAAO,YAAY,gBAAgB,OAAO,mCAAmC,CAAC;;;AASlF,SAAS,6BACP,SACA,SAC+B;CAC/B,MAAM,eAAe,IAAI,IAAI,QAAQ,IAAI,CAAC;AAC1C,QAAO;EACL,MAAM,aAAa,IAAI,IAAI,IAAI;EAC/B,OAAO,WAAW,cAAc,QAAQ;EACxC,YACE,SAAS,cAAc,cAAc,mBAAmB,IACxD,QAAQ;EAEV,OAAO,UAAU,cAAc,SAAS,8BAA8B,IAAI,QAAQ;EAClF,kBACE,UAAU,cAAc,oBAAoB,wBAAwB,IACpE,QAAQ;EACV,qBACE,SAAS,cAAc,uBAAuB,2BAA2B,IACzE,QAAQ;EAEX;;AAGH,SAAS,WACP,cACA,SACQ;CACR,MAAM,WAAW,aAAa,IAAI,QAAQ;AAC1C,KAAI,aAAa,KAAM,QAAO,QAAQ;AACtC,QAAO,OAAO,SAAS;;AAGzB,SAAS,SACP,cACA,MACA,eACoB;CACpB,MAAM,QAAQ,aAAa,IAAI,KAAK;AACpC,KAAI,UAAU,QAAQ,UAAU,GAAI,QAAO;AAC3C,KAAI,eAAe,OAAO,cAAc,CAAE,QAAO;AACjD,OAAM,IAAI,MAAM,WAAW,KAAK,UAAU,MAAM,IAAI;;AAGtD,SAAS,UACP,cACA,MACA,eACsB;CACtB,MAAM,SAAS,iBAAiB,cAAc,KAAK;AACnD,KAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAO,OAAO,KAAK,UAAU,kBAAkB,MAAM,OAAO,cAAc,CAAC;;AAG7E,SAAS,iBAAiB,cAA+B,MAAwB;AAC/E,QAAO,aACJ,OAAO,KAAK,CACZ,SAAS,UAAU,MAAM,MAAM,IAAI,CAAC,CACpC,KAAK,UAAU,MAAM,MAAM,CAAC,CAC5B,OAAO,QAAQ;;AAGpB,SAAS,kBACP,MACA,OACA,eACQ;AACR,KAAI,eAAe,OAAO,cAAc,CAAE,QAAO;AACjD,OAAM,IAAI,MAAM,WAAW,KAAK,UAAU,MAAM,IAAI;;AAGtD,SAAS,eACP,OACA,eACiB;AACjB,QAAO,cAAc,MAAM,iBAAiB,iBAAiB,MAAM;;AAGrE,SAAS,YAAY,SAAiE;AACpF,QAAO;EACL,MAAM;EACN,OAAO;GACL,MAAM;GACN;GACD;EACF;;AAGH,SAAS,gBAAgB,OAAgB,UAA0B;AACjE,QAAO,iBAAiB,QAAQ,MAAM,UAAU"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { PredictiveSearchLimitScope, PredictiveSearchType, SearchUnavailableProductsType, SearchableField } from "../../graphql/generated/storefront-api-types.mjs";
|
|
2
|
+
import { PredictiveSearchData } from "./search.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/core/predictive-search/store.d.ts
|
|
5
|
+
/** Lifecycle state for the predictive search client store. */
|
|
6
|
+
type PredictiveSearchStatus = "idle" | "loading" | "success" | "error";
|
|
7
|
+
/** Current predictive search snapshot exposed to UI bindings. */
|
|
8
|
+
type PredictiveSearchState<TData extends PredictiveSearchData = PredictiveSearchData> = {
|
|
9
|
+
/** Latest trimmed search term known to the store. */term: string; /** Request lifecycle state for the current term. */
|
|
10
|
+
status: PredictiveSearchStatus; /** Predictive search data for the current term, or an empty result while idle. */
|
|
11
|
+
result: TData; /** Error message for the latest failed request, or null when there is no active error. */
|
|
12
|
+
error: string | null;
|
|
13
|
+
};
|
|
14
|
+
/** Options for creating a framework-neutral predictive search client store. */
|
|
15
|
+
type CreatePredictiveSearchStoreOptions = {
|
|
16
|
+
/**
|
|
17
|
+
* Same-origin JSON endpoint used for browser predictive-search requests.
|
|
18
|
+
*
|
|
19
|
+
* The endpoint must return JSON matching the data payload from
|
|
20
|
+
* `await predictiveSearchHandlers.get(...)`.
|
|
21
|
+
*/
|
|
22
|
+
predictiveSearchEndpoint?: string; /** Delay before sending a request after the term changes. */
|
|
23
|
+
debounceInMs?: number; /** Minimum trimmed term length required before searching. */
|
|
24
|
+
minTermLength?: number; /** Fetch implementation, injectable for tests and non-browser runtimes. */
|
|
25
|
+
fetch?: typeof globalThis.fetch; /** Maximum result count requested from the Storefront API. */
|
|
26
|
+
limit?: number; /** Whether `limit` applies to each result type or all result types combined. */
|
|
27
|
+
limitScope?: PredictiveSearchLimitScope; /** Storefront API result types to include in predictive search. */
|
|
28
|
+
types?: PredictiveSearchType[]; /** Storefront API fields to search. */
|
|
29
|
+
searchableFields?: SearchableField[]; /** Storefront API unavailable-product behavior. */
|
|
30
|
+
unavailableProducts?: SearchUnavailableProductsType;
|
|
31
|
+
};
|
|
32
|
+
/** Framework-neutral predictive search store used by UI bindings. */
|
|
33
|
+
type PredictiveSearchStore<TData extends PredictiveSearchData = PredictiveSearchData> = {
|
|
34
|
+
/** Reactivates store updates after destroy(). */connect(): void; /** Returns the current predictive search state snapshot. */
|
|
35
|
+
getState(): PredictiveSearchState<TData>; /** Subscribes to state changes and returns an unsubscribe callback. */
|
|
36
|
+
subscribe(listener: (state: PredictiveSearchState<TData>) => void): () => void; /** Searches for a term using the configured debounce and request lifecycle. */
|
|
37
|
+
search(term: string): Promise<void>; /** Cancels pending work and resets the store to an empty state. */
|
|
38
|
+
clear(): void; /** Cancels pending work and pauses store updates until reconnect. */
|
|
39
|
+
destroy(): void;
|
|
40
|
+
};
|
|
41
|
+
declare function createPredictiveSearchStore<TData extends PredictiveSearchData = PredictiveSearchData>(options?: CreatePredictiveSearchStoreOptions): PredictiveSearchStore<TData>;
|
|
42
|
+
//#endregion
|
|
43
|
+
export { CreatePredictiveSearchStoreOptions, PredictiveSearchState, PredictiveSearchStatus, PredictiveSearchStore, createPredictiveSearchStore };
|
|
44
|
+
//# sourceMappingURL=store.d.mts.map
|