@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,43 @@
|
|
|
1
|
+
import { SelectedOption } from "./state.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/product/options.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Extracts selected product options from search params.
|
|
6
|
+
*
|
|
7
|
+
* Each query parameter is treated as an option name/value pair
|
|
8
|
+
* (e.g. `?Color=Red&Size=M` → `[{name:"Color",value:"Red"},{name:"Size",value:"M"}]`).
|
|
9
|
+
*
|
|
10
|
+
* The `variant` param is reserved for numeric variant ids (Liquid parity) and is
|
|
11
|
+
* never treated as an option name, even when listed in `allowedOptionNames`.
|
|
12
|
+
*
|
|
13
|
+
* When `allowedOptionNames` is provided, the search params are filtered to only
|
|
14
|
+
* entries whose decoded param name exactly matches a product option name.
|
|
15
|
+
* Passing an empty array filters out every option.
|
|
16
|
+
*
|
|
17
|
+
* Pass the result to `createProductFormStore` or `useProductForm` to pre-select
|
|
18
|
+
* the variant that matches the current URL.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* // Loader (React Router / Remix)
|
|
23
|
+
* const selectedOptions = getSelectedProductOptions({
|
|
24
|
+
* searchParams: new URL(request.url).searchParams,
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* // Filter to known product option names when product data is available
|
|
28
|
+
* const selectedOptions = getSelectedProductOptions({
|
|
29
|
+
* searchParams,
|
|
30
|
+
* allowedOptionNames: product.options.map((option) => option.name),
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
declare function getSelectedProductOptions({
|
|
35
|
+
searchParams,
|
|
36
|
+
allowedOptionNames
|
|
37
|
+
}: {
|
|
38
|
+
searchParams: URLSearchParams;
|
|
39
|
+
allowedOptionNames?: readonly string[];
|
|
40
|
+
}): SelectedOption[];
|
|
41
|
+
//#endregion
|
|
42
|
+
export { getSelectedProductOptions };
|
|
43
|
+
//# sourceMappingURL=options.d.mts.map
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { getLogger } from "../logging/logging.mjs";
|
|
2
|
+
import { VARIANT_SEARCH_PARAM } from "./url.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/core/product/options.ts
|
|
5
|
+
const log = getLogger("product");
|
|
6
|
+
const INCLUSIVE_RANGE_END_OFFSET = 1;
|
|
7
|
+
/**
|
|
8
|
+
* Extracts selected product options from search params.
|
|
9
|
+
*
|
|
10
|
+
* Each query parameter is treated as an option name/value pair
|
|
11
|
+
* (e.g. `?Color=Red&Size=M` → `[{name:"Color",value:"Red"},{name:"Size",value:"M"}]`).
|
|
12
|
+
*
|
|
13
|
+
* The `variant` param is reserved for numeric variant ids (Liquid parity) and is
|
|
14
|
+
* never treated as an option name, even when listed in `allowedOptionNames`.
|
|
15
|
+
*
|
|
16
|
+
* When `allowedOptionNames` is provided, the search params are filtered to only
|
|
17
|
+
* entries whose decoded param name exactly matches a product option name.
|
|
18
|
+
* Passing an empty array filters out every option.
|
|
19
|
+
*
|
|
20
|
+
* Pass the result to `createProductFormStore` or `useProductForm` to pre-select
|
|
21
|
+
* the variant that matches the current URL.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* // Loader (React Router / Remix)
|
|
26
|
+
* const selectedOptions = getSelectedProductOptions({
|
|
27
|
+
* searchParams: new URL(request.url).searchParams,
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* // Filter to known product option names when product data is available
|
|
31
|
+
* const selectedOptions = getSelectedProductOptions({
|
|
32
|
+
* searchParams,
|
|
33
|
+
* allowedOptionNames: product.options.map((option) => option.name),
|
|
34
|
+
* });
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
function getSelectedProductOptions({ searchParams, allowedOptionNames }) {
|
|
38
|
+
const allowedOptionNameSet = allowedOptionNames ? new Set(allowedOptionNames) : null;
|
|
39
|
+
const selectedOptions = [];
|
|
40
|
+
for (const [name, value] of searchParams.entries()) {
|
|
41
|
+
if (name === "variant") continue;
|
|
42
|
+
if (allowedOptionNameSet && !allowedOptionNameSet.has(name)) continue;
|
|
43
|
+
selectedOptions.push({
|
|
44
|
+
name,
|
|
45
|
+
value
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return selectedOptions;
|
|
49
|
+
}
|
|
50
|
+
function getAdjacentAndFirstSelectableVariants(product) {
|
|
51
|
+
const variants = /* @__PURE__ */ new Map();
|
|
52
|
+
for (const option of product.options) for (const value of option.optionValues) if (isConcreteProductVariant(value.firstSelectableVariant)) addVariant(variants, value.firstSelectableVariant, product.options);
|
|
53
|
+
for (const variant of product.adjacentVariants) if (isConcreteProductVariant(variant)) addVariant(variants, variant, product.options);
|
|
54
|
+
if (isConcreteProductVariant(product.selectedOrFirstAvailableVariant)) addVariant(variants, product.selectedOrFirstAvailableVariant, product.options);
|
|
55
|
+
return [...variants.values()];
|
|
56
|
+
}
|
|
57
|
+
function buildProductOptions(product, selectedOptions, cache) {
|
|
58
|
+
const selectedOptionMap = selectedOptionsToMap(selectedOptions);
|
|
59
|
+
const optionValueIndex = buildOptionValueIndex(product);
|
|
60
|
+
const selectableVariants = getAdjacentAndFirstSelectableVariants(product);
|
|
61
|
+
const encodedOptionIndexes = buildEncodedOptionIndexes(product, selectableVariants);
|
|
62
|
+
const variants = mapVariants(product, selectableVariants);
|
|
63
|
+
const currentProductOptionValues = buildCurrentProductOptionValues(product, selectableVariants);
|
|
64
|
+
return product.options.map((option) => ({
|
|
65
|
+
name: option.name,
|
|
66
|
+
values: option.optionValues.map((value) => buildProductOptionValue({
|
|
67
|
+
cache,
|
|
68
|
+
currentProductOptionValues,
|
|
69
|
+
encodedOptionIndexes,
|
|
70
|
+
option,
|
|
71
|
+
optionValueIndex,
|
|
72
|
+
product,
|
|
73
|
+
selectedOptionMap,
|
|
74
|
+
value,
|
|
75
|
+
variants
|
|
76
|
+
}))
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
function selectedOptionsToMap(selectedOptions) {
|
|
80
|
+
const map = Object.create(null);
|
|
81
|
+
for (const option of selectedOptions) map[option.name] = option.value;
|
|
82
|
+
return map;
|
|
83
|
+
}
|
|
84
|
+
function selectedOptionsKey(selectedOptions, productOptions) {
|
|
85
|
+
return JSON.stringify(selectedOptionsFromMap({ options: productOptions }, selectedOptionsToMap(selectedOptions)));
|
|
86
|
+
}
|
|
87
|
+
function selectedOptionsFromMap(product, selectedOptionMap) {
|
|
88
|
+
const selectedOptions = [];
|
|
89
|
+
for (const option of product.options) {
|
|
90
|
+
const value = selectedOptionMap[option.name];
|
|
91
|
+
if (value !== void 0) selectedOptions.push({
|
|
92
|
+
name: option.name,
|
|
93
|
+
value
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return selectedOptions;
|
|
97
|
+
}
|
|
98
|
+
function mapVariants(product, selectableVariants) {
|
|
99
|
+
const variants = /* @__PURE__ */ new Map();
|
|
100
|
+
for (const variant of selectableVariants) variants.set(selectedOptionsKey(variant.selectedOptions, product.options), variant);
|
|
101
|
+
return variants;
|
|
102
|
+
}
|
|
103
|
+
function addVariant(variants, variant, productOptions) {
|
|
104
|
+
variants.set(selectedOptionsKey(variant.selectedOptions, productOptions), variant);
|
|
105
|
+
}
|
|
106
|
+
function buildProductOptionValue({ cache, currentProductOptionValues, encodedOptionIndexes, option, optionValueIndex, product, selectedOptionMap, value, variants }) {
|
|
107
|
+
const firstSelectableVariant = isConcreteProductVariant(value.firstSelectableVariant) ? value.firstSelectableVariant : null;
|
|
108
|
+
const selected = selectedOptionMap[option.name] === value.name;
|
|
109
|
+
const crossProduct = isCrossProductOptionValue(product, option.name, value.name, firstSelectableVariant, currentProductOptionValues);
|
|
110
|
+
const targetOptionMap = buildTargetOptionMap({
|
|
111
|
+
currentProductOptionValues,
|
|
112
|
+
crossProduct,
|
|
113
|
+
firstSelectableVariant,
|
|
114
|
+
optionName: option.name,
|
|
115
|
+
selectedOptionMap,
|
|
116
|
+
valueName: value.name
|
|
117
|
+
});
|
|
118
|
+
const targetSelectedOptions = selectedOptionsFromMap(product, targetOptionMap);
|
|
119
|
+
const key = selectedOptionsKey(targetSelectedOptions, product.options);
|
|
120
|
+
const variant = variants.get(key) ?? null;
|
|
121
|
+
const targetProductHandle = getTargetProductHandle(product, crossProduct, firstSelectableVariant);
|
|
122
|
+
const encodingConstraints = buildEncodingConstraints(targetOptionMap, product, optionValueIndex, encodedOptionIndexes.get(targetProductHandle));
|
|
123
|
+
return {
|
|
124
|
+
name: value.name,
|
|
125
|
+
swatch: value.swatch,
|
|
126
|
+
selected,
|
|
127
|
+
exists: resolveEncodedStatus(product.encodedVariantExistence, encodingConstraints, true, cache),
|
|
128
|
+
available: resolveEncodedStatus(product.encodedVariantAvailability, encodingConstraints, variant?.availableForSale ?? false, cache),
|
|
129
|
+
variant,
|
|
130
|
+
selectedOptions: variant?.selectedOptions ?? targetSelectedOptions,
|
|
131
|
+
handle: getOptionValueHandle(selected, product.handle, variant, firstSelectableVariant)
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function getOptionValueHandle(selected, productHandle, variant, firstSelectableVariant) {
|
|
135
|
+
if (selected) return productHandle;
|
|
136
|
+
return variant?.product?.handle ?? firstSelectableVariant?.product?.handle ?? productHandle;
|
|
137
|
+
}
|
|
138
|
+
function buildOptionValueIndex(product) {
|
|
139
|
+
return new Map(product.options.map((option) => [option.name, new Map(option.optionValues.map((value, index) => [value.name, index]))]));
|
|
140
|
+
}
|
|
141
|
+
function getTargetProductHandle(product, crossProduct, firstSelectableVariant) {
|
|
142
|
+
if (crossProduct && firstSelectableVariant?.product?.handle) return firstSelectableVariant.product.handle;
|
|
143
|
+
return product.handle;
|
|
144
|
+
}
|
|
145
|
+
function buildEncodedOptionIndexes(product, selectableVariants) {
|
|
146
|
+
const indexes = /* @__PURE__ */ new Map();
|
|
147
|
+
for (const variant of selectableVariants) addEncodedOptionIndex(indexes, variant.product?.handle ?? product.handle, product.options, variant.selectedOptions);
|
|
148
|
+
return indexes;
|
|
149
|
+
}
|
|
150
|
+
function addEncodedOptionIndex(indexes, productHandle, productOptions, selectedOptions) {
|
|
151
|
+
const index = indexes.get(productHandle) ?? /* @__PURE__ */ new Map();
|
|
152
|
+
const selectedOptionNames = new Set(selectedOptions.map((option) => option.name));
|
|
153
|
+
for (const option of productOptions) {
|
|
154
|
+
if (!selectedOptionNames.has(option.name) || index.has(option.name)) continue;
|
|
155
|
+
index.set(option.name, index.size);
|
|
156
|
+
}
|
|
157
|
+
indexes.set(productHandle, index);
|
|
158
|
+
}
|
|
159
|
+
function buildCurrentProductOptionValues(product, selectableVariants) {
|
|
160
|
+
const optionValues = /* @__PURE__ */ new Map();
|
|
161
|
+
for (const variant of selectableVariants) {
|
|
162
|
+
if (!variantBelongsToProduct(product, variant)) continue;
|
|
163
|
+
for (const option of variant.selectedOptions) addCurrentProductOptionValue(optionValues, option.name, option.value);
|
|
164
|
+
}
|
|
165
|
+
return optionValues;
|
|
166
|
+
}
|
|
167
|
+
function addCurrentProductOptionValue(optionValues, optionName, valueName) {
|
|
168
|
+
const values = optionValues.get(optionName) ?? /* @__PURE__ */ new Set();
|
|
169
|
+
values.add(valueName);
|
|
170
|
+
optionValues.set(optionName, values);
|
|
171
|
+
}
|
|
172
|
+
function isCrossProductOptionValue(product, optionName, valueName, firstSelectableVariant, currentProductOptionValues) {
|
|
173
|
+
if (!firstSelectableVariant || variantBelongsToProduct(product, firstSelectableVariant)) return false;
|
|
174
|
+
return !currentProductOptionValues.get(optionName)?.has(valueName);
|
|
175
|
+
}
|
|
176
|
+
function variantBelongsToProduct(product, variant) {
|
|
177
|
+
return variant.product?.handle === void 0 || variant.product.handle === product.handle;
|
|
178
|
+
}
|
|
179
|
+
function buildTargetOptionMap({ currentProductOptionValues, crossProduct, firstSelectableVariant, optionName, selectedOptionMap, valueName }) {
|
|
180
|
+
if (crossProduct && firstSelectableVariant) return selectedOptionsToMap(firstSelectableVariant.selectedOptions);
|
|
181
|
+
const nextOptionMap = {
|
|
182
|
+
...selectedOptionMap,
|
|
183
|
+
[optionName]: valueName
|
|
184
|
+
};
|
|
185
|
+
if (currentProductOptionValues.size === 0) return nextOptionMap;
|
|
186
|
+
return filterOptionMap(nextOptionMap, currentProductOptionValues);
|
|
187
|
+
}
|
|
188
|
+
function filterOptionMap(selectedOptionMap, currentProductOptionValues) {
|
|
189
|
+
const filtered = Object.create(null);
|
|
190
|
+
for (const [optionName, values] of currentProductOptionValues) {
|
|
191
|
+
const value = selectedOptionMap[optionName];
|
|
192
|
+
if (value !== void 0 && values.has(value)) filtered[optionName] = value;
|
|
193
|
+
}
|
|
194
|
+
return filtered;
|
|
195
|
+
}
|
|
196
|
+
function buildEncodingConstraints(selectedOptionMap, product, optionValueIndex = buildOptionValueIndex(product), encodedOptionIndex) {
|
|
197
|
+
const constraints = [];
|
|
198
|
+
for (const [productOptionIndex, option] of product.options.entries()) {
|
|
199
|
+
const selectedValue = selectedOptionMap[option.name];
|
|
200
|
+
if (selectedValue === void 0) continue;
|
|
201
|
+
const optionIndex = encodedOptionIndex?.get(option.name) ?? productOptionIndex;
|
|
202
|
+
const valueIndex = optionValueIndex.get(option.name)?.get(selectedValue);
|
|
203
|
+
if (valueIndex === void 0) continue;
|
|
204
|
+
constraints.push({
|
|
205
|
+
optionIndex,
|
|
206
|
+
valueIndex
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
return constraints;
|
|
210
|
+
}
|
|
211
|
+
function resolveEncodedStatus(encodedField, constraints, fallback, cache) {
|
|
212
|
+
if (!encodedField) return fallback;
|
|
213
|
+
return isAnyEncodedVariantMatchingConstraints(constraints, encodedField, cache);
|
|
214
|
+
}
|
|
215
|
+
function isAnyEncodedVariantMatchingConstraints(constraints, encodedVariantField, cache) {
|
|
216
|
+
if (constraints.length === 0) return false;
|
|
217
|
+
return getDecodedVariantCombinations(encodedVariantField, cache).some((combination) => combinationMatchesConstraints(combination, constraints));
|
|
218
|
+
}
|
|
219
|
+
function getDecodedVariantCombinations(encodedVariantField, cache) {
|
|
220
|
+
const cached = cache?.get(encodedVariantField);
|
|
221
|
+
if (cached) return cached;
|
|
222
|
+
const decoded = decodeEncodedVariant(encodedVariantField);
|
|
223
|
+
cache?.set(encodedVariantField, decoded);
|
|
224
|
+
return decoded;
|
|
225
|
+
}
|
|
226
|
+
function combinationMatchesConstraints(combination, constraints) {
|
|
227
|
+
return constraints.every(({ optionIndex, valueIndex }) => combination[optionIndex] === valueIndex);
|
|
228
|
+
}
|
|
229
|
+
function decodeEncodedVariant(encodedVariantField) {
|
|
230
|
+
if (!encodedVariantField) return [];
|
|
231
|
+
if (!encodedVariantField.startsWith("v1_")) {
|
|
232
|
+
log.warn(`unsupported variant encoding: "${encodedVariantField}"`);
|
|
233
|
+
return [];
|
|
234
|
+
}
|
|
235
|
+
return decodeV1EncodedVariant(encodedVariantField.replace(/^v1_/, ""));
|
|
236
|
+
}
|
|
237
|
+
function decodeV1EncodedVariant(encodedVariantField) {
|
|
238
|
+
const tokenizer = /[ :,-]/g;
|
|
239
|
+
const state = {
|
|
240
|
+
currentOptionValue: [],
|
|
241
|
+
decodedOptions: [],
|
|
242
|
+
depth: 0,
|
|
243
|
+
index: 0,
|
|
244
|
+
rangeStart: null
|
|
245
|
+
};
|
|
246
|
+
let token;
|
|
247
|
+
while (token = tokenizer.exec(encodedVariantField)) processDecodeV1Token(encodedVariantField, state, token, tokenizer);
|
|
248
|
+
pushFinalDecodeV1Value(encodedVariantField, state);
|
|
249
|
+
return state.decodedOptions;
|
|
250
|
+
}
|
|
251
|
+
function isConcreteProductVariant(variant) {
|
|
252
|
+
return variant !== null && variant !== void 0;
|
|
253
|
+
}
|
|
254
|
+
function processDecodeV1Token(encodedVariantField, state, token, tokenizer) {
|
|
255
|
+
const operation = token[0];
|
|
256
|
+
const optionValueIndex = Number.parseInt(encodedVariantField.slice(state.index, token.index), 10) || 0;
|
|
257
|
+
pushDecodeV1Range(state, optionValueIndex);
|
|
258
|
+
state.currentOptionValue[state.depth] = optionValueIndex;
|
|
259
|
+
if (operation === "-") state.rangeStart = optionValueIndex;
|
|
260
|
+
else if (operation === ":") state.depth++;
|
|
261
|
+
else processDecodeV1Separator(encodedVariantField, state, token, operation);
|
|
262
|
+
state.index = tokenizer.lastIndex;
|
|
263
|
+
}
|
|
264
|
+
function processDecodeV1Separator(encodedVariantField, state, token, operation) {
|
|
265
|
+
if (shouldPushDecodeV1Option(encodedVariantField, token, operation)) state.decodedOptions.push([...state.currentOptionValue]);
|
|
266
|
+
if (operation !== ",") return;
|
|
267
|
+
state.currentOptionValue.pop();
|
|
268
|
+
state.depth--;
|
|
269
|
+
}
|
|
270
|
+
function shouldPushDecodeV1Option(encodedVariantField, token, operation) {
|
|
271
|
+
return operation === " " || operation === "," && encodedVariantField[token.index - 1] !== ",";
|
|
272
|
+
}
|
|
273
|
+
function pushFinalDecodeV1Value(encodedVariantField, state) {
|
|
274
|
+
const finalIndex = encodedVariantField.match(/\d+$/g)?.[0];
|
|
275
|
+
if (finalIndex === void 0) return;
|
|
276
|
+
const finalValueIndex = Number.parseInt(finalIndex, 10);
|
|
277
|
+
if (state.rangeStart !== null) {
|
|
278
|
+
pushDecodeV1Range(state, finalValueIndex + INCLUSIVE_RANGE_END_OFFSET);
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
state.currentOptionValue[state.depth] = finalValueIndex;
|
|
282
|
+
state.decodedOptions.push([...state.currentOptionValue]);
|
|
283
|
+
}
|
|
284
|
+
function pushDecodeV1Range(state, rangeEndExclusive) {
|
|
285
|
+
const rangeStart = state.rangeStart;
|
|
286
|
+
if (rangeStart === null) return;
|
|
287
|
+
for (let value = rangeStart; value < rangeEndExclusive; value++) {
|
|
288
|
+
state.currentOptionValue[state.depth] = value;
|
|
289
|
+
state.decodedOptions.push([...state.currentOptionValue]);
|
|
290
|
+
}
|
|
291
|
+
state.rangeStart = null;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
//#endregion
|
|
295
|
+
export { buildProductOptions, getSelectedProductOptions, selectedOptionsFromMap, selectedOptionsToMap };
|
|
296
|
+
//# sourceMappingURL=options.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.mjs","names":[],"sources":["../../../../src/core/product/options.ts"],"sourcesContent":["import { getLogger } from \"../logging\";\nimport type {\n ProductInput,\n ProductOptionValueFrom,\n ProductVariantFrom,\n ProductVariantInput,\n SelectedOption,\n VariantOptionState,\n VariantOptionValueState,\n} from \"./state\";\nimport { VARIANT_SEARCH_PARAM } from \"./url\";\n\nconst log = getLogger(\"product\");\n\nconst INCLUSIVE_RANGE_END_OFFSET = 1;\n\nexport type DecodedVariantCache = Map<string, number[][]>;\n\ntype EncodedVariantConstraint = {\n optionIndex: number;\n valueIndex: number;\n};\n\n/**\n * Extracts selected product options from search params.\n *\n * Each query parameter is treated as an option name/value pair\n * (e.g. `?Color=Red&Size=M` → `[{name:\"Color\",value:\"Red\"},{name:\"Size\",value:\"M\"}]`).\n *\n * The `variant` param is reserved for numeric variant ids (Liquid parity) and is\n * never treated as an option name, even when listed in `allowedOptionNames`.\n *\n * When `allowedOptionNames` is provided, the search params are filtered to only\n * entries whose decoded param name exactly matches a product option name.\n * Passing an empty array filters out every option.\n *\n * Pass the result to `createProductFormStore` or `useProductForm` to pre-select\n * the variant that matches the current URL.\n *\n * @example\n * ```ts\n * // Loader (React Router / Remix)\n * const selectedOptions = getSelectedProductOptions({\n * searchParams: new URL(request.url).searchParams,\n * });\n *\n * // Filter to known product option names when product data is available\n * const selectedOptions = getSelectedProductOptions({\n * searchParams,\n * allowedOptionNames: product.options.map((option) => option.name),\n * });\n * ```\n */\nexport function getSelectedProductOptions({\n searchParams,\n allowedOptionNames,\n}: {\n searchParams: URLSearchParams;\n allowedOptionNames?: readonly string[];\n}): SelectedOption[] {\n const allowedOptionNameSet = allowedOptionNames ? new Set(allowedOptionNames) : null;\n const selectedOptions: SelectedOption[] = [];\n\n for (const [name, value] of searchParams.entries()) {\n if (name === VARIANT_SEARCH_PARAM) continue;\n if (allowedOptionNameSet && !allowedOptionNameSet.has(name)) continue;\n selectedOptions.push({ name, value });\n }\n\n return selectedOptions;\n}\n\nfunction getAdjacentAndFirstSelectableVariants<TProduct extends ProductInput>(\n product: TProduct,\n): ProductVariantFrom<TProduct>[] {\n // Shopify returns a bounded set, not the whole matrix. Treat it as a concrete-variant cache.\n const variants = new Map<string, ProductVariantFrom<TProduct>>();\n\n for (const option of product.options) {\n for (const value of option.optionValues) {\n if (isConcreteProductVariant<TProduct>(value.firstSelectableVariant)) {\n addVariant(variants, value.firstSelectableVariant, product.options);\n }\n }\n }\n\n for (const variant of product.adjacentVariants) {\n if (isConcreteProductVariant<TProduct>(variant)) addVariant(variants, variant, product.options);\n }\n\n if (isConcreteProductVariant<TProduct>(product.selectedOrFirstAvailableVariant)) {\n addVariant(variants, product.selectedOrFirstAvailableVariant, product.options);\n }\n\n return [...variants.values()];\n}\n\nexport function buildProductOptions<TProduct extends ProductInput>(\n product: TProduct,\n selectedOptions: SelectedOption[],\n cache?: DecodedVariantCache,\n): VariantOptionState<ProductVariantFrom<TProduct>, ProductOptionValueFrom<TProduct>>[] {\n const selectedOptionMap = selectedOptionsToMap(selectedOptions);\n const optionValueIndex = buildOptionValueIndex(product);\n const selectableVariants = getAdjacentAndFirstSelectableVariants(product);\n const encodedOptionIndexes = buildEncodedOptionIndexes(product, selectableVariants);\n const variants = mapVariants(product, selectableVariants);\n const currentProductOptionValues = buildCurrentProductOptionValues(product, selectableVariants);\n\n return product.options.map((option) => ({\n name: option.name,\n values: option.optionValues.map((value) =>\n buildProductOptionValue({\n cache,\n currentProductOptionValues,\n encodedOptionIndexes,\n option,\n optionValueIndex,\n product,\n selectedOptionMap,\n value,\n variants,\n }),\n ),\n }));\n}\n\nexport function selectedOptionsToMap(selectedOptions: SelectedOption[]): Record<string, string> {\n const map: Record<string, string> = Object.create(null);\n for (const option of selectedOptions) {\n map[option.name] = option.value;\n }\n return map;\n}\n\nfunction selectedOptionsKey(\n selectedOptions: SelectedOption[],\n productOptions: Array<{ name: string }>,\n): string {\n return JSON.stringify(\n selectedOptionsFromMap({ options: productOptions }, selectedOptionsToMap(selectedOptions)),\n );\n}\n\nexport function selectedOptionsFromMap(\n product: { options: Array<{ name: string }> },\n selectedOptionMap: Record<string, string>,\n): SelectedOption[] {\n const selectedOptions: SelectedOption[] = [];\n for (const option of product.options) {\n const value = selectedOptionMap[option.name];\n if (value !== undefined) selectedOptions.push({ name: option.name, value });\n }\n return selectedOptions;\n}\n\nfunction mapVariants<TProduct extends ProductInput>(\n product: TProduct,\n selectableVariants: ProductVariantFrom<TProduct>[],\n): Map<string, ProductVariantFrom<TProduct>> {\n const variants = new Map<string, ProductVariantFrom<TProduct>>();\n for (const variant of selectableVariants) {\n variants.set(selectedOptionsKey(variant.selectedOptions, product.options), variant);\n }\n return variants;\n}\n\nfunction addVariant<TVariant extends ProductVariantInput>(\n variants: Map<string, TVariant>,\n variant: TVariant,\n productOptions: Array<{ name: string }>,\n): void {\n variants.set(selectedOptionsKey(variant.selectedOptions, productOptions), variant);\n}\n\nfunction buildProductOptionValue<TProduct extends ProductInput>({\n cache,\n currentProductOptionValues,\n encodedOptionIndexes,\n option,\n optionValueIndex,\n product,\n selectedOptionMap,\n value,\n variants,\n}: {\n cache?: DecodedVariantCache;\n currentProductOptionValues: Map<string, Set<string>>;\n encodedOptionIndexes: Map<string, Map<string, number>>;\n option: TProduct[\"options\"][number];\n optionValueIndex: Map<string, Map<string, number>>;\n product: TProduct;\n selectedOptionMap: Record<string, string>;\n value: ProductOptionValueFrom<TProduct>;\n variants: Map<string, ProductVariantFrom<TProduct>>;\n}): VariantOptionValueState<ProductVariantFrom<TProduct>, ProductOptionValueFrom<TProduct>> {\n const firstSelectableVariant = isConcreteProductVariant<TProduct>(value.firstSelectableVariant)\n ? value.firstSelectableVariant\n : null;\n const selected = selectedOptionMap[option.name] === value.name;\n const crossProduct = isCrossProductOptionValue(\n product,\n option.name,\n value.name,\n firstSelectableVariant,\n currentProductOptionValues,\n );\n const targetOptionMap = buildTargetOptionMap({\n currentProductOptionValues,\n crossProduct,\n firstSelectableVariant,\n optionName: option.name,\n selectedOptionMap,\n valueName: value.name,\n });\n const targetSelectedOptions = selectedOptionsFromMap(product, targetOptionMap);\n const key = selectedOptionsKey(targetSelectedOptions, product.options);\n const variant = variants.get(key) ?? null;\n const targetProductHandle = getTargetProductHandle(product, crossProduct, firstSelectableVariant);\n const encodingConstraints = buildEncodingConstraints(\n targetOptionMap,\n product,\n optionValueIndex,\n encodedOptionIndexes.get(targetProductHandle),\n );\n\n return {\n name: value.name,\n swatch: value.swatch,\n selected,\n exists: resolveEncodedStatus(product.encodedVariantExistence, encodingConstraints, true, cache),\n available: resolveEncodedStatus(\n product.encodedVariantAvailability,\n encodingConstraints,\n variant?.availableForSale ?? false,\n cache,\n ),\n variant,\n selectedOptions: variant?.selectedOptions ?? targetSelectedOptions,\n handle: getOptionValueHandle(selected, product.handle, variant, firstSelectableVariant),\n };\n}\n\nfunction getOptionValueHandle<TVariant extends ProductVariantInput>(\n selected: boolean,\n productHandle: string,\n variant: TVariant | null,\n firstSelectableVariant: TVariant | null,\n): string {\n if (selected) return productHandle;\n return variant?.product?.handle ?? firstSelectableVariant?.product?.handle ?? productHandle;\n}\n\nfunction buildOptionValueIndex<TProduct extends ProductInput>(\n product: TProduct,\n): Map<string, Map<string, number>> {\n return new Map(\n product.options.map((option) => [\n option.name,\n new Map(option.optionValues.map((value, index) => [value.name, index])),\n ]),\n );\n}\n\nfunction getTargetProductHandle<TVariant extends ProductVariantInput>(\n product: ProductInput,\n crossProduct: boolean,\n firstSelectableVariant: TVariant | null,\n): string {\n if (crossProduct && firstSelectableVariant?.product?.handle) {\n return firstSelectableVariant.product.handle;\n }\n return product.handle;\n}\n\nfunction buildEncodedOptionIndexes<TProduct extends ProductInput>(\n product: TProduct,\n selectableVariants: ProductVariantFrom<TProduct>[],\n): Map<string, Map<string, number>> {\n const indexes = new Map<string, Map<string, number>>();\n for (const variant of selectableVariants) {\n const productHandle = variant.product?.handle ?? product.handle;\n addEncodedOptionIndex(indexes, productHandle, product.options, variant.selectedOptions);\n }\n return indexes;\n}\n\nfunction addEncodedOptionIndex(\n indexes: Map<string, Map<string, number>>,\n productHandle: string,\n productOptions: Array<{ name: string }>,\n selectedOptions: SelectedOption[],\n): void {\n const index = indexes.get(productHandle) ?? new Map<string, number>();\n const selectedOptionNames = new Set(selectedOptions.map((option) => option.name));\n\n for (const option of productOptions) {\n if (!selectedOptionNames.has(option.name) || index.has(option.name)) continue;\n index.set(option.name, index.size);\n }\n\n indexes.set(productHandle, index);\n}\n\nfunction buildCurrentProductOptionValues<TProduct extends ProductInput>(\n product: TProduct,\n selectableVariants: ProductVariantFrom<TProduct>[],\n): Map<string, Set<string>> {\n const optionValues = new Map<string, Set<string>>();\n for (const variant of selectableVariants) {\n if (!variantBelongsToProduct(product, variant)) continue;\n for (const option of variant.selectedOptions) {\n addCurrentProductOptionValue(optionValues, option.name, option.value);\n }\n }\n return optionValues;\n}\n\nfunction addCurrentProductOptionValue(\n optionValues: Map<string, Set<string>>,\n optionName: string,\n valueName: string,\n): void {\n const values = optionValues.get(optionName) ?? new Set<string>();\n values.add(valueName);\n optionValues.set(optionName, values);\n}\n\nfunction isCrossProductOptionValue<TVariant extends ProductVariantInput>(\n product: ProductInput,\n optionName: string,\n valueName: string,\n firstSelectableVariant: TVariant | null,\n currentProductOptionValues: Map<string, Set<string>>,\n): boolean {\n if (!firstSelectableVariant || variantBelongsToProduct(product, firstSelectableVariant)) {\n return false;\n }\n return !currentProductOptionValues.get(optionName)?.has(valueName);\n}\n\nfunction variantBelongsToProduct<TVariant extends ProductVariantInput>(\n product: ProductInput,\n variant: TVariant,\n): boolean {\n return variant.product?.handle === undefined || variant.product.handle === product.handle;\n}\n\ntype TargetOptionMapInput<TVariant extends ProductVariantInput> = {\n currentProductOptionValues: Map<string, Set<string>>;\n crossProduct: boolean;\n firstSelectableVariant: TVariant | null;\n optionName: string;\n selectedOptionMap: Record<string, string>;\n valueName: string;\n};\n\nfunction buildTargetOptionMap<TVariant extends ProductVariantInput>({\n currentProductOptionValues,\n crossProduct,\n firstSelectableVariant,\n optionName,\n selectedOptionMap,\n valueName,\n}: TargetOptionMapInput<TVariant>): Record<string, string> {\n if (crossProduct && firstSelectableVariant) {\n return selectedOptionsToMap(firstSelectableVariant.selectedOptions);\n }\n\n const nextOptionMap = { ...selectedOptionMap, [optionName]: valueName };\n if (currentProductOptionValues.size === 0) return nextOptionMap;\n return filterOptionMap(nextOptionMap, currentProductOptionValues);\n}\n\nfunction filterOptionMap(\n selectedOptionMap: Record<string, string>,\n currentProductOptionValues: Map<string, Set<string>>,\n): Record<string, string> {\n const filtered: Record<string, string> = Object.create(null);\n for (const [optionName, values] of currentProductOptionValues) {\n const value = selectedOptionMap[optionName];\n if (value !== undefined && values.has(value)) filtered[optionName] = value;\n }\n return filtered;\n}\n\nfunction buildEncodingConstraints<TProduct extends ProductInput>(\n selectedOptionMap: Record<string, string>,\n product: TProduct,\n optionValueIndex = buildOptionValueIndex(product),\n encodedOptionIndex?: Map<string, number>,\n): EncodedVariantConstraint[] {\n const constraints: EncodedVariantConstraint[] = [];\n\n for (const [productOptionIndex, option] of product.options.entries()) {\n const selectedValue = selectedOptionMap[option.name];\n if (selectedValue === undefined) continue;\n const optionIndex = encodedOptionIndex?.get(option.name) ?? productOptionIndex;\n const valueIndex = optionValueIndex.get(option.name)?.get(selectedValue);\n if (valueIndex === undefined) continue;\n constraints.push({ optionIndex, valueIndex });\n }\n\n return constraints;\n}\n\nfunction resolveEncodedStatus(\n encodedField: string | null | undefined,\n constraints: EncodedVariantConstraint[],\n fallback: boolean,\n cache?: DecodedVariantCache,\n): boolean {\n if (!encodedField) return fallback;\n return isAnyEncodedVariantMatchingConstraints(constraints, encodedField, cache);\n}\n\nfunction isAnyEncodedVariantMatchingConstraints(\n constraints: EncodedVariantConstraint[],\n encodedVariantField: string,\n cache?: DecodedVariantCache,\n): boolean {\n if (constraints.length === 0) return false;\n\n return getDecodedVariantCombinations(encodedVariantField, cache).some((combination) =>\n combinationMatchesConstraints(combination, constraints),\n );\n}\n\nfunction getDecodedVariantCombinations(\n encodedVariantField: string,\n cache?: DecodedVariantCache,\n): number[][] {\n const cached = cache?.get(encodedVariantField);\n if (cached) return cached;\n\n const decoded = decodeEncodedVariant(encodedVariantField);\n cache?.set(encodedVariantField, decoded);\n return decoded;\n}\n\nfunction combinationMatchesConstraints(\n combination: number[],\n constraints: EncodedVariantConstraint[],\n): boolean {\n return constraints.every(\n ({ optionIndex, valueIndex }) => combination[optionIndex] === valueIndex,\n );\n}\n\nfunction decodeEncodedVariant(encodedVariantField: string | null | undefined): number[][] {\n if (!encodedVariantField) return [];\n if (!encodedVariantField.startsWith(\"v1_\")) {\n log.warn(`unsupported variant encoding: \"${encodedVariantField}\"`);\n return [];\n }\n return decodeV1EncodedVariant(encodedVariantField.replace(/^v1_/, \"\"));\n}\n\nfunction decodeV1EncodedVariant(encodedVariantField: string): number[][] {\n const tokenizer = /[ :,-]/g;\n const state: DecodeV1State = {\n currentOptionValue: [],\n decodedOptions: [],\n depth: 0,\n index: 0,\n rangeStart: null,\n };\n let token: RegExpExecArray | null;\n\n while ((token = tokenizer.exec(encodedVariantField))) {\n processDecodeV1Token(encodedVariantField, state, token, tokenizer);\n }\n\n pushFinalDecodeV1Value(encodedVariantField, state);\n\n return state.decodedOptions;\n}\n\ntype DecodeV1State = {\n currentOptionValue: number[];\n decodedOptions: number[][];\n depth: number;\n index: number;\n rangeStart: number | null;\n};\n\nfunction isConcreteProductVariant<TProduct extends ProductInput>(\n variant: ProductVariantInput | null | undefined,\n): variant is ProductVariantFrom<TProduct> {\n return variant !== null && variant !== undefined;\n}\n\nfunction processDecodeV1Token(\n encodedVariantField: string,\n state: DecodeV1State,\n token: RegExpExecArray,\n tokenizer: RegExp,\n): void {\n const operation = token[0];\n const optionValueIndex =\n Number.parseInt(encodedVariantField.slice(state.index, token.index), 10) || 0;\n\n pushDecodeV1Range(state, optionValueIndex);\n state.currentOptionValue[state.depth] = optionValueIndex;\n\n if (operation === \"-\") {\n state.rangeStart = optionValueIndex;\n } else if (operation === \":\") {\n state.depth++;\n } else {\n processDecodeV1Separator(encodedVariantField, state, token, operation);\n }\n\n state.index = tokenizer.lastIndex;\n}\n\nfunction processDecodeV1Separator(\n encodedVariantField: string,\n state: DecodeV1State,\n token: RegExpExecArray,\n operation: string,\n): void {\n if (shouldPushDecodeV1Option(encodedVariantField, token, operation)) {\n state.decodedOptions.push([...state.currentOptionValue]);\n }\n\n if (operation !== \",\") return;\n\n state.currentOptionValue.pop();\n state.depth--;\n}\n\nfunction shouldPushDecodeV1Option(\n encodedVariantField: string,\n token: RegExpExecArray,\n operation: string,\n): boolean {\n return operation === \" \" || (operation === \",\" && encodedVariantField[token.index - 1] !== \",\");\n}\n\nfunction pushFinalDecodeV1Value(encodedVariantField: string, state: DecodeV1State): void {\n const finalIndex = encodedVariantField.match(/\\d+$/g)?.[0];\n if (finalIndex === undefined) return;\n\n const finalValueIndex = Number.parseInt(finalIndex, 10);\n if (state.rangeStart !== null) {\n pushDecodeV1Range(state, finalValueIndex + INCLUSIVE_RANGE_END_OFFSET);\n return;\n }\n\n state.currentOptionValue[state.depth] = finalValueIndex;\n state.decodedOptions.push([...state.currentOptionValue]);\n}\n\nfunction pushDecodeV1Range(state: DecodeV1State, rangeEndExclusive: number): void {\n const rangeStart = state.rangeStart;\n if (rangeStart === null) return;\n\n for (let value = rangeStart; value < rangeEndExclusive; value++) {\n state.currentOptionValue[state.depth] = value;\n state.decodedOptions.push([...state.currentOptionValue]);\n }\n\n state.rangeStart = null;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { CartLine, CartNetworkEntry, CartUserError, CartWarning } from "../cart/state.mjs";
|
|
2
|
+
import { CartStore } from "../cart/cart.mjs";
|
|
3
|
+
import { ProductInput, ProductOptionValueFrom, ProductOptionValueInput, ProductVariantFrom, ProductVariantInput, SelectedOption, VariantOptionState } from "./state.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/core/product/product-form.d.ts
|
|
6
|
+
interface ProductFormErrors {
|
|
7
|
+
userErrors: CartUserError[];
|
|
8
|
+
warnings: CartWarning[];
|
|
9
|
+
networkErrors: CartNetworkEntry[];
|
|
10
|
+
}
|
|
11
|
+
/** Live state snapshot emitted by a {@link ProductFormStore}. */
|
|
12
|
+
interface ProductFormStoreState<TVariant extends ProductVariantInput = ProductVariantInput, TOptionValue extends ProductOptionValueInput = ProductOptionValueInput> {
|
|
13
|
+
options: VariantOptionState<TVariant, TOptionValue>[];
|
|
14
|
+
selectedOptions: SelectedOption[];
|
|
15
|
+
selectedVariant: TVariant | null;
|
|
16
|
+
errors: ProductFormErrors;
|
|
17
|
+
matchedLineItem: CartLine | null;
|
|
18
|
+
}
|
|
19
|
+
type ProductFormOptions<TProduct extends ProductInput = ProductInput> = ProductFormStoreState<ProductVariantFrom<TProduct>, ProductOptionValueFrom<TProduct>>["options"];
|
|
20
|
+
/**
|
|
21
|
+
* Result returned by {@link ProductFormStore.selectOption}.
|
|
22
|
+
*
|
|
23
|
+
* - `resolved` — a specific variant was matched for the full selection.
|
|
24
|
+
* - `unresolved` — the selection is valid but not yet complete.
|
|
25
|
+
* - `invalid` — the option name or value does not exist on the product.
|
|
26
|
+
*/
|
|
27
|
+
type VariantSelectionResult<TVariant extends ProductVariantInput = ProductVariantInput> = {
|
|
28
|
+
status: "resolved";
|
|
29
|
+
selectedOptions: SelectedOption[];
|
|
30
|
+
selectedVariant: TVariant;
|
|
31
|
+
} | {
|
|
32
|
+
status: "unresolved";
|
|
33
|
+
selectedOptions: SelectedOption[];
|
|
34
|
+
selectedVariant: null;
|
|
35
|
+
} | {
|
|
36
|
+
status: "invalid";
|
|
37
|
+
selectedOptions: SelectedOption[];
|
|
38
|
+
selectedVariant: null;
|
|
39
|
+
reason: string;
|
|
40
|
+
};
|
|
41
|
+
/** A selection result that is not invalid — either resolved or unresolved. */
|
|
42
|
+
type ValidProductSelectionResult<TProduct extends ProductInput = ProductInput> = Exclude<VariantSelectionResult<ProductVariantFrom<TProduct>>, {
|
|
43
|
+
status: "invalid";
|
|
44
|
+
}>;
|
|
45
|
+
type CreateProductFormStoreOptions = {
|
|
46
|
+
selectedOptions?: SelectedOption[];
|
|
47
|
+
};
|
|
48
|
+
/** Manages variant selection + cart integration for a product form. */
|
|
49
|
+
interface ProductFormStore<TProduct extends ProductInput = ProductInput, TVariant extends ProductVariantInput = ProductVariantFrom<TProduct>> {
|
|
50
|
+
getState(): ProductFormStoreState<TVariant, ProductOptionValueFrom<TProduct>>;
|
|
51
|
+
subscribe(listener: (state: ProductFormStoreState<TVariant, ProductOptionValueFrom<TProduct>>) => void): () => void;
|
|
52
|
+
selectOption(name: string, value: string): VariantSelectionResult<TVariant>;
|
|
53
|
+
hydrate(product: TProduct, opts?: {
|
|
54
|
+
selectedOptions?: SelectedOption[];
|
|
55
|
+
}): void;
|
|
56
|
+
reset(): void;
|
|
57
|
+
destroy(): void;
|
|
58
|
+
handleFormSubmit(event: SubmitEvent): Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
declare function getSelectedVariant<TVariant extends ProductVariantInput>(options: VariantOptionState<TVariant, ProductOptionValueInput>[]): TVariant | null;
|
|
61
|
+
declare function canAddToCart<TProduct extends ProductInput>(product: TProduct, options: VariantOptionState<ProductVariantFrom<TProduct>, ProductOptionValueFrom<TProduct>>[]): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Finds the first cart line whose merchandise ID matches.
|
|
64
|
+
* When selling plans are used, the same merchandise ID can appear on multiple
|
|
65
|
+
* cart lines — this returns the first match. Future attribute-based matching
|
|
66
|
+
* will narrow to the exact line.
|
|
67
|
+
*/
|
|
68
|
+
declare function findCartLineByMerchandiseId(lines: CartLine[], merchandiseId: string): CartLine | null;
|
|
69
|
+
declare function createProductFormStore<TProduct extends ProductInput>(product: TProduct, cartStore: CartStore, options?: CreateProductFormStoreOptions): ProductFormStore<TProduct, ProductVariantFrom<TProduct>>;
|
|
70
|
+
//#endregion
|
|
71
|
+
export { CreateProductFormStoreOptions, ProductFormErrors, ProductFormOptions, ProductFormStore, ProductFormStoreState, ValidProductSelectionResult, VariantSelectionResult, canAddToCart, createProductFormStore, findCartLineByMerchandiseId, getSelectedVariant };
|
|
72
|
+
//# sourceMappingURL=product-form.d.mts.map
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { createObservable } from "../observable.mjs";
|
|
2
|
+
import { buildProductOptions, selectedOptionsFromMap, selectedOptionsToMap } from "./options.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/core/product/product-form.ts
|
|
5
|
+
function getSelectedVariant(options) {
|
|
6
|
+
return options[0]?.values.find((v) => v.selected)?.variant ?? null;
|
|
7
|
+
}
|
|
8
|
+
function canAddToCart(product, options) {
|
|
9
|
+
if (product.requiresSellingPlan) return false;
|
|
10
|
+
const variant = getSelectedVariant(options);
|
|
11
|
+
return variant !== null && variant.availableForSale;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Finds the first cart line whose merchandise ID matches.
|
|
15
|
+
* When selling plans are used, the same merchandise ID can appear on multiple
|
|
16
|
+
* cart lines — this returns the first match. Future attribute-based matching
|
|
17
|
+
* will narrow to the exact line.
|
|
18
|
+
*/
|
|
19
|
+
function findCartLineByMerchandiseId(lines, merchandiseId) {
|
|
20
|
+
return lines.find((l) => l.merchandise?.id === merchandiseId) ?? null;
|
|
21
|
+
}
|
|
22
|
+
function createProductFormStore(product, cartStore, options = {}) {
|
|
23
|
+
const decodedVariantCache = /* @__PURE__ */ new Map();
|
|
24
|
+
const initialSelectedOptions = resolveSelectedOptions(product, options.selectedOptions);
|
|
25
|
+
const context = {
|
|
26
|
+
observable: createObservable(deriveFullState(buildVariantState(product, initialSelectedOptions, decodedVariantCache), cartStore.getState())),
|
|
27
|
+
cartStore,
|
|
28
|
+
currentProduct: product,
|
|
29
|
+
initialProduct: product,
|
|
30
|
+
initialSelectedOptions,
|
|
31
|
+
decodedVariantCache,
|
|
32
|
+
destroyed: false,
|
|
33
|
+
unsubCart: () => {}
|
|
34
|
+
};
|
|
35
|
+
context.unsubCart = cartStore.subscribe(() => {
|
|
36
|
+
if (context.destroyed) return;
|
|
37
|
+
syncFromCart(context);
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
getState: () => context.observable.state,
|
|
41
|
+
subscribe: (listener) => context.observable.subscribe(listener),
|
|
42
|
+
selectOption: (name, value) => selectOption(context, name, value),
|
|
43
|
+
hydrate: (nextProduct, opts) => hydrate(context, nextProduct, opts),
|
|
44
|
+
reset: () => reset(context),
|
|
45
|
+
destroy: () => destroy(context),
|
|
46
|
+
handleFormSubmit: (event) => handleFormSubmit(context, event)
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function buildVariantState(product, selectedOptions, cache) {
|
|
50
|
+
return {
|
|
51
|
+
options: buildProductOptions(product, selectedOptions, cache),
|
|
52
|
+
selectedOptions
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function deriveFullState(variant, cartState) {
|
|
56
|
+
const selectedVariant = getSelectedVariant(variant.options);
|
|
57
|
+
const matchedLineItem = selectedVariant ? findCartLineByMerchandiseId(cartState.data.lines.nodes, selectedVariant.id) : null;
|
|
58
|
+
const lineErrors = matchedLineItem ? cartState.errors.lines.get(matchedLineItem.id) : void 0;
|
|
59
|
+
return {
|
|
60
|
+
options: variant.options,
|
|
61
|
+
selectedOptions: variant.selectedOptions,
|
|
62
|
+
selectedVariant,
|
|
63
|
+
errors: {
|
|
64
|
+
userErrors: [...cartState.errors.cart.userErrors, ...lineErrors?.userErrors ?? []],
|
|
65
|
+
warnings: [...cartState.errors.cart.warnings, ...lineErrors?.warnings ?? []],
|
|
66
|
+
networkErrors: cartState.errors.network
|
|
67
|
+
},
|
|
68
|
+
matchedLineItem
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function resolveSelectedOptions(product, requested) {
|
|
72
|
+
return product.selectedOrFirstAvailableVariant?.selectedOptions ?? requested ?? [];
|
|
73
|
+
}
|
|
74
|
+
function selectOption(context, name, value) {
|
|
75
|
+
const { options, selectedOptions } = context.observable.state;
|
|
76
|
+
const option = options.find((o) => o.name === name);
|
|
77
|
+
const optionValue = option?.values.find((v) => v.name === value);
|
|
78
|
+
if (!option || !optionValue) return invalid(selectedOptions, `Unknown option "${name}" value "${value}".`);
|
|
79
|
+
if (!optionValue.exists) return invalid(selectedOptions, `Option "${name}" value "${value}" does not resolve to a product variant.`);
|
|
80
|
+
const nextSelectedOptionMap = {
|
|
81
|
+
...selectedOptionsToMap(selectedOptions),
|
|
82
|
+
[name]: value
|
|
83
|
+
};
|
|
84
|
+
const nextSelectedOptions = selectedOptionsFromMap(context.currentProduct, nextSelectedOptionMap);
|
|
85
|
+
return applySelection(context, optionValue.variant ? {
|
|
86
|
+
status: "resolved",
|
|
87
|
+
selectedOptions: optionValue.variant.selectedOptions,
|
|
88
|
+
selectedVariant: optionValue.variant
|
|
89
|
+
} : {
|
|
90
|
+
status: "unresolved",
|
|
91
|
+
selectedOptions: nextSelectedOptions,
|
|
92
|
+
selectedVariant: null
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function hydrate(context, product, opts = {}) {
|
|
96
|
+
context.currentProduct = product;
|
|
97
|
+
context.decodedVariantCache.clear();
|
|
98
|
+
const variantState = buildVariantState(product, product.selectedOrFirstAvailableVariant?.selectedOptions ?? opts.selectedOptions ?? context.observable.state.selectedOptions, context.decodedVariantCache);
|
|
99
|
+
context.observable.setState(deriveFullState(variantState, context.cartStore.getState()));
|
|
100
|
+
}
|
|
101
|
+
function reset(context) {
|
|
102
|
+
context.currentProduct = context.initialProduct;
|
|
103
|
+
context.decodedVariantCache.clear();
|
|
104
|
+
const variantState = buildVariantState(context.initialProduct, context.initialSelectedOptions, context.decodedVariantCache);
|
|
105
|
+
context.observable.setState(deriveFullState(variantState, context.cartStore.getState()));
|
|
106
|
+
}
|
|
107
|
+
function destroy(context) {
|
|
108
|
+
context.destroyed = true;
|
|
109
|
+
context.unsubCart();
|
|
110
|
+
context.decodedVariantCache.clear();
|
|
111
|
+
}
|
|
112
|
+
function buildAddToCartDetail(context) {
|
|
113
|
+
const { selectedVariant } = context.observable.state;
|
|
114
|
+
if (!selectedVariant) return void 0;
|
|
115
|
+
return { products: [{
|
|
116
|
+
id: selectedVariant.id,
|
|
117
|
+
title: selectedVariant.title,
|
|
118
|
+
product: selectedVariant.product ? {
|
|
119
|
+
title: selectedVariant.product.title,
|
|
120
|
+
handle: selectedVariant.product.handle
|
|
121
|
+
} : void 0,
|
|
122
|
+
selectedOptions: selectedVariant.selectedOptions,
|
|
123
|
+
image: selectedVariant.image,
|
|
124
|
+
price: selectedVariant.price
|
|
125
|
+
}] };
|
|
126
|
+
}
|
|
127
|
+
async function handleFormSubmit(context, event) {
|
|
128
|
+
const eventDetail = buildAddToCartDetail(context);
|
|
129
|
+
await context.cartStore.handleFormSubmit(event, eventDetail);
|
|
130
|
+
}
|
|
131
|
+
function applySelection(context, result) {
|
|
132
|
+
const variantState = buildVariantState(context.currentProduct, result.selectedOptions, context.decodedVariantCache);
|
|
133
|
+
context.observable.setState(deriveFullState(variantState, context.cartStore.getState()));
|
|
134
|
+
return result;
|
|
135
|
+
}
|
|
136
|
+
function hasCartDerivedFieldsChanged(prev, next) {
|
|
137
|
+
return prev.matchedLineItem !== next.matchedLineItem || prev.selectedVariant !== next.selectedVariant || prev.errors.userErrors !== next.errors.userErrors || prev.errors.warnings !== next.errors.warnings || prev.errors.networkErrors !== next.errors.networkErrors;
|
|
138
|
+
}
|
|
139
|
+
function syncFromCart(context) {
|
|
140
|
+
const prev = context.observable.state;
|
|
141
|
+
const next = deriveFullState({
|
|
142
|
+
options: prev.options,
|
|
143
|
+
selectedOptions: prev.selectedOptions
|
|
144
|
+
}, context.cartStore.getState());
|
|
145
|
+
if (hasCartDerivedFieldsChanged(prev, next)) context.observable.setState(next);
|
|
146
|
+
}
|
|
147
|
+
function invalid(selectedOptions, reason) {
|
|
148
|
+
return {
|
|
149
|
+
status: "invalid",
|
|
150
|
+
selectedOptions,
|
|
151
|
+
selectedVariant: null,
|
|
152
|
+
reason
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
//#endregion
|
|
157
|
+
export { canAddToCart, createProductFormStore, findCartLineByMerchandiseId, getSelectedVariant };
|
|
158
|
+
//# sourceMappingURL=product-form.mjs.map
|