@sixtyninecommerce/client 0.29.0 → 0.31.0
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 +556 -16
- package/dist/admin/http.d.ts.map +1 -1
- package/dist/admin/http.js.map +1 -1
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/build-client.d.ts +9 -0
- package/dist/build-client.d.ts.map +1 -0
- package/dist/build-client.js +58 -0
- package/dist/build-client.js.map +1 -0
- package/dist/cache-tags.d.ts +35 -1
- package/dist/cache-tags.d.ts.map +1 -1
- package/dist/cache-tags.js +39 -1
- package/dist/cache-tags.js.map +1 -1
- package/dist/client.d.ts +25 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +9 -62
- package/dist/client.js.map +1 -1
- package/dist/commerce/age-verification.d.ts +7 -4
- package/dist/commerce/age-verification.d.ts.map +1 -1
- package/dist/commerce/age-verification.js +6 -4
- package/dist/commerce/age-verification.js.map +1 -1
- package/dist/commerce/arguments.d.ts +13 -0
- package/dist/commerce/arguments.d.ts.map +1 -0
- package/dist/commerce/arguments.js +19 -0
- package/dist/commerce/arguments.js.map +1 -0
- package/dist/commerce/branding.d.ts.map +1 -1
- package/dist/commerce/branding.js.map +1 -1
- package/dist/commerce/capabilities.d.ts +40 -0
- package/dist/commerce/capabilities.d.ts.map +1 -0
- package/dist/commerce/capabilities.js +41 -0
- package/dist/commerce/capabilities.js.map +1 -0
- package/dist/commerce/cart.d.ts +9 -12
- package/dist/commerce/cart.d.ts.map +1 -1
- package/dist/commerce/cart.js +6 -1
- package/dist/commerce/cart.js.map +1 -1
- package/dist/commerce/checkout.d.ts +95 -15
- package/dist/commerce/checkout.d.ts.map +1 -1
- package/dist/commerce/checkout.js +230 -10
- package/dist/commerce/checkout.js.map +1 -1
- package/dist/commerce/customer.d.ts +82 -38
- package/dist/commerce/customer.d.ts.map +1 -1
- package/dist/commerce/customer.js +146 -10
- package/dist/commerce/customer.js.map +1 -1
- package/dist/commerce/favorites.d.ts +2 -5
- package/dist/commerce/favorites.d.ts.map +1 -1
- package/dist/commerce/favorites.js.map +1 -1
- package/dist/commerce/index.d.ts +189 -133
- package/dist/commerce/index.d.ts.map +1 -1
- package/dist/commerce/index.js +9 -0
- package/dist/commerce/index.js.map +1 -1
- package/dist/commerce/order-states.d.ts +18 -0
- package/dist/commerce/order-states.d.ts.map +1 -0
- package/dist/commerce/order-states.js +30 -0
- package/dist/commerce/order-states.js.map +1 -0
- package/dist/commerce/parcel-pricing.d.ts +48 -0
- package/dist/commerce/parcel-pricing.d.ts.map +1 -0
- package/dist/commerce/parcel-pricing.js +39 -0
- package/dist/commerce/parcel-pricing.js.map +1 -0
- package/dist/commerce/parked-orders.d.ts +22 -0
- package/dist/commerce/parked-orders.d.ts.map +1 -0
- package/dist/commerce/parked-orders.js +47 -0
- package/dist/commerce/parked-orders.js.map +1 -0
- package/dist/commerce/payments.d.ts +12 -5
- package/dist/commerce/payments.d.ts.map +1 -1
- package/dist/commerce/payments.js +10 -1
- package/dist/commerce/payments.js.map +1 -1
- package/dist/commerce/placement-error.d.ts +17 -0
- package/dist/commerce/placement-error.d.ts.map +1 -1
- package/dist/commerce/placement-error.js.map +1 -1
- package/dist/commerce/products.d.ts +92 -38
- package/dist/commerce/products.d.ts.map +1 -1
- package/dist/commerce/products.js +162 -123
- package/dist/commerce/products.js.map +1 -1
- package/dist/commerce/queries.d.ts +204 -49
- package/dist/commerce/queries.d.ts.map +1 -1
- package/dist/commerce/queries.js +1296 -737
- package/dist/commerce/queries.js.map +1 -1
- package/dist/commerce/quotes.d.ts +5 -4
- package/dist/commerce/quotes.d.ts.map +1 -1
- package/dist/commerce/quotes.js +1 -36
- package/dist/commerce/quotes.js.map +1 -1
- package/dist/commerce/recommendations.d.ts +3 -3
- package/dist/commerce/recommendations.d.ts.map +1 -1
- package/dist/commerce/recommendations.js +3 -1
- package/dist/commerce/recommendations.js.map +1 -1
- package/dist/commerce/returns.d.ts +7 -6
- package/dist/commerce/returns.d.ts.map +1 -1
- package/dist/commerce/returns.js.map +1 -1
- package/dist/commerce/reviews.d.ts +24 -15
- package/dist/commerce/reviews.d.ts.map +1 -1
- package/dist/commerce/reviews.js +67 -50
- package/dist/commerce/reviews.js.map +1 -1
- package/dist/commerce/saved-lists.d.ts +15 -15
- package/dist/commerce/saved-lists.d.ts.map +1 -1
- package/dist/commerce/saved-lists.js +67 -55
- package/dist/commerce/saved-lists.js.map +1 -1
- package/dist/commerce/search.d.ts +3 -2
- package/dist/commerce/search.d.ts.map +1 -1
- package/dist/commerce/search.js +10 -2
- package/dist/commerce/search.js.map +1 -1
- package/dist/commerce/shipping.d.ts +11 -4
- package/dist/commerce/shipping.d.ts.map +1 -1
- package/dist/commerce/shipping.js +17 -2
- package/dist/commerce/shipping.js.map +1 -1
- package/dist/commerce/stock-notifications.d.ts +2 -0
- package/dist/commerce/stock-notifications.d.ts.map +1 -1
- package/dist/commerce/stock-notifications.js +2 -2
- package/dist/commerce/stock-notifications.js.map +1 -1
- package/dist/commerce/subscriptions.d.ts +35 -37
- package/dist/commerce/subscriptions.d.ts.map +1 -1
- package/dist/commerce/subscriptions.js +159 -120
- package/dist/commerce/subscriptions.js.map +1 -1
- package/dist/commerce/vat-validation.d.ts +6 -3
- package/dist/commerce/vat-validation.d.ts.map +1 -1
- package/dist/commerce/vat-validation.js +24 -19
- package/dist/commerce/vat-validation.js.map +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/content/assets.d.ts +5 -4
- package/dist/content/assets.d.ts.map +1 -1
- package/dist/content/assets.js.map +1 -1
- package/dist/content/collection-pages.d.ts +3 -2
- package/dist/content/collection-pages.d.ts.map +1 -1
- package/dist/content/collection-pages.js.map +1 -1
- package/dist/content/collections.d.ts +5 -4
- package/dist/content/collections.d.ts.map +1 -1
- package/dist/content/collections.js.map +1 -1
- package/dist/content/filtered-products.d.ts.map +1 -1
- package/dist/content/filtered-products.js.map +1 -1
- package/dist/content/form-field-types.d.ts +3 -3
- package/dist/content/form-field-types.d.ts.map +1 -1
- package/dist/content/form-field-types.js.map +1 -1
- package/dist/content/forms.d.ts +4 -3
- package/dist/content/forms.d.ts.map +1 -1
- package/dist/content/forms.js +3 -0
- package/dist/content/forms.js.map +1 -1
- package/dist/content/index.d.ts +18 -17
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/items.d.ts +5 -4
- package/dist/content/items.d.ts.map +1 -1
- package/dist/content/items.js +2 -0
- package/dist/content/items.js.map +1 -1
- package/dist/content/menus.d.ts +3 -2
- package/dist/content/menus.d.ts.map +1 -1
- package/dist/content/menus.js +7 -1
- package/dist/content/menus.js.map +1 -1
- package/dist/content/resolve.d.ts +3 -2
- package/dist/content/resolve.d.ts.map +1 -1
- package/dist/content/resolve.js +1 -1
- package/dist/content/resolve.js.map +1 -1
- package/dist/content/sitemap.d.ts +3 -2
- package/dist/content/sitemap.d.ts.map +1 -1
- package/dist/content/sitemap.js.map +1 -1
- package/dist/content/strings.d.ts +16 -2
- package/dist/content/strings.d.ts.map +1 -1
- package/dist/content/strings.js +32 -4
- package/dist/content/strings.js.map +1 -1
- package/dist/core/context.d.ts +127 -1
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +436 -45
- package/dist/core/context.js.map +1 -1
- package/dist/core/currency.d.ts +14 -0
- package/dist/core/currency.d.ts.map +1 -0
- package/dist/core/currency.js +52 -0
- package/dist/core/currency.js.map +1 -0
- package/dist/core/deprecation.d.ts +23 -0
- package/dist/core/deprecation.d.ts.map +1 -0
- package/dist/core/deprecation.js +81 -0
- package/dist/core/deprecation.js.map +1 -0
- package/dist/core/http.d.ts +15 -1
- package/dist/core/http.d.ts.map +1 -1
- package/dist/core/http.js +55 -3
- package/dist/core/http.js.map +1 -1
- package/dist/core/public-artifact.d.ts +72 -0
- package/dist/core/public-artifact.d.ts.map +1 -0
- package/dist/core/public-artifact.js +122 -0
- package/dist/core/public-artifact.js.map +1 -0
- package/dist/core/unknown-field-rejection.d.ts +18 -0
- package/dist/core/unknown-field-rejection.d.ts.map +1 -0
- package/dist/core/unknown-field-rejection.js +37 -0
- package/dist/core/unknown-field-rejection.js.map +1 -0
- package/dist/credit/credit-status.d.ts +2 -0
- package/dist/credit/credit-status.d.ts.map +1 -1
- package/dist/credit/credit-status.js +71 -19
- package/dist/credit/credit-status.js.map +1 -1
- package/dist/credit/index.d.ts +1 -1
- package/dist/credit/payment-terms.d.ts +3 -3
- package/dist/credit/payment-terms.d.ts.map +1 -1
- package/dist/credit/payment-terms.js +28 -24
- package/dist/credit/payment-terms.js.map +1 -1
- package/dist/currency/exchange.d.ts +7 -7
- package/dist/currency/exchange.d.ts.map +1 -1
- package/dist/currency/exchange.js +5 -1
- package/dist/currency/exchange.js.map +1 -1
- package/dist/errors.d.ts +17 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -1
- package/dist/events/index.d.ts +20 -7
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +17 -5
- package/dist/events/index.js.map +1 -1
- package/dist/events/payloads.d.ts +7 -4
- package/dist/events/payloads.d.ts.map +1 -1
- package/dist/events/payloads.js +6 -3
- package/dist/events/payloads.js.map +1 -1
- package/dist/feeds/index.d.ts +5 -0
- package/dist/feeds/index.d.ts.map +1 -0
- package/dist/feeds/index.js +12 -0
- package/dist/feeds/index.js.map +1 -0
- package/dist/feeds/types.d.ts +18 -0
- package/dist/feeds/types.d.ts.map +1 -0
- package/dist/feeds/types.js +8 -0
- package/dist/feeds/types.js.map +1 -0
- package/dist/generated/cms.d.ts +2136 -0
- package/dist/generated/cms.d.ts.map +1 -0
- package/dist/generated/cms.js +4 -0
- package/dist/generated/cms.js.map +1 -0
- package/dist/generated/plugins.d.ts +550 -0
- package/dist/generated/plugins.d.ts.map +1 -0
- package/dist/generated/plugins.js +4 -0
- package/dist/generated/plugins.js.map +1 -0
- package/dist/generated/shop.d.ts +5539 -0
- package/dist/generated/shop.d.ts.map +1 -0
- package/dist/generated/shop.js +5 -0
- package/dist/generated/shop.js.map +1 -0
- package/dist/graphql-document.d.ts +29 -0
- package/dist/graphql-document.d.ts.map +1 -0
- package/dist/graphql-document.js +21 -0
- package/dist/graphql-document.js.map +1 -0
- package/dist/index.d.ts +9 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/media/urls.d.ts.map +1 -1
- package/dist/media/urls.js +12 -1
- package/dist/media/urls.js.map +1 -1
- package/dist/media/video.d.ts.map +1 -1
- package/dist/media/video.js.map +1 -1
- package/dist/multi-store.d.ts +200 -0
- package/dist/multi-store.d.ts.map +1 -0
- package/dist/multi-store.js +558 -0
- package/dist/multi-store.js.map +1 -0
- package/dist/navigation/routes.d.ts +4 -3
- package/dist/navigation/routes.d.ts.map +1 -1
- package/dist/navigation/routes.js.map +1 -1
- package/dist/next/artifact-handler.d.ts +21 -13
- package/dist/next/artifact-handler.d.ts.map +1 -1
- package/dist/next/artifact-handler.js +28 -66
- package/dist/next/artifact-handler.js.map +1 -1
- package/dist/next/event-revalidate-handler.d.ts +26 -6
- package/dist/next/event-revalidate-handler.d.ts.map +1 -1
- package/dist/next/event-revalidate-handler.js +126 -19
- package/dist/next/event-revalidate-handler.js.map +1 -1
- package/dist/next/feed-handler.d.ts +50 -0
- package/dist/next/feed-handler.d.ts.map +1 -0
- package/dist/next/feed-handler.js +61 -0
- package/dist/next/feed-handler.js.map +1 -0
- package/dist/next/index.d.ts +3 -1
- package/dist/next/index.d.ts.map +1 -1
- package/dist/next/index.js +1 -0
- package/dist/next/index.js.map +1 -1
- package/dist/next/metadata.d.ts.map +1 -1
- package/dist/next/metadata.js.map +1 -1
- package/dist/next/redirect-middleware.d.ts +5 -31
- package/dist/next/redirect-middleware.d.ts.map +1 -1
- package/dist/next/redirect-middleware.js +4 -46
- package/dist/next/redirect-middleware.js.map +1 -1
- package/dist/next/revalidate-handler.d.ts.map +1 -1
- package/dist/next/revalidate-handler.js.map +1 -1
- package/dist/pricing/index.d.ts +1 -1
- package/dist/pricing/index.d.ts.map +1 -1
- package/dist/pricing/index.js +5 -2
- package/dist/pricing/index.js.map +1 -1
- package/dist/pricing/tax-display.js +1 -1
- package/dist/pricing/tax-display.js.map +1 -1
- package/dist/pricing/tiers.d.ts +3 -2
- package/dist/pricing/tiers.d.ts.map +1 -1
- package/dist/pricing/tiers.js.map +1 -1
- package/dist/pricing/validation.d.ts +152 -13
- package/dist/pricing/validation.d.ts.map +1 -1
- package/dist/pricing/validation.js +167 -13
- package/dist/pricing/validation.js.map +1 -1
- package/dist/redirects/index.d.ts.map +1 -1
- package/dist/redirects/index.js +2 -1
- package/dist/redirects/index.js.map +1 -1
- package/dist/redirects/store.d.ts.map +1 -1
- package/dist/redirects/store.js +6 -2
- package/dist/redirects/store.js.map +1 -1
- package/dist/redirects/types.d.ts +5 -2
- package/dist/redirects/types.d.ts.map +1 -1
- package/dist/revalidation/event-plan.d.ts +55 -4
- package/dist/revalidation/event-plan.d.ts.map +1 -1
- package/dist/revalidation/event-plan.js +115 -8
- package/dist/revalidation/event-plan.js.map +1 -1
- package/dist/revalidation/event-verify.d.ts +8 -37
- package/dist/revalidation/event-verify.d.ts.map +1 -1
- package/dist/revalidation/event-verify.js +7 -97
- package/dist/revalidation/event-verify.js.map +1 -1
- package/dist/revalidation/types.d.ts.map +1 -1
- package/dist/revalidation/url-context.d.ts +17 -0
- package/dist/revalidation/url-context.d.ts.map +1 -1
- package/dist/revalidation/url-context.js +35 -2
- package/dist/revalidation/url-context.js.map +1 -1
- package/dist/seo/ai.d.ts.map +1 -1
- package/dist/seo/ai.js.map +1 -1
- package/dist/seo/artifacts.d.ts +86 -4
- package/dist/seo/artifacts.d.ts.map +1 -1
- package/dist/seo/artifacts.js +115 -16
- package/dist/seo/artifacts.js.map +1 -1
- package/dist/seo/availability.d.ts +95 -0
- package/dist/seo/availability.d.ts.map +1 -0
- package/dist/seo/availability.js +89 -0
- package/dist/seo/availability.js.map +1 -0
- package/dist/seo/index.d.ts +4 -0
- package/dist/seo/index.d.ts.map +1 -1
- package/dist/seo/index.js +6 -1
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/json-ld.d.ts.map +1 -1
- package/dist/seo/json-ld.js +34 -1
- package/dist/seo/json-ld.js.map +1 -1
- package/dist/seo/meta-tags.d.ts +40 -1
- package/dist/seo/meta-tags.d.ts.map +1 -1
- package/dist/seo/meta-tags.js +8 -1
- package/dist/seo/meta-tags.js.map +1 -1
- package/dist/seo/metadata-parser.d.ts.map +1 -1
- package/dist/seo/metadata-parser.js.map +1 -1
- package/dist/seo/metadata-types.d.ts.map +1 -1
- package/dist/seo/robots.d.ts.map +1 -1
- package/dist/seo/robots.js.map +1 -1
- package/dist/seo/types.d.ts +20 -2
- package/dist/seo/types.d.ts.map +1 -1
- package/dist/seo/url-builder.d.ts +5 -3
- package/dist/seo/url-builder.d.ts.map +1 -1
- package/dist/seo/url-builder.js +3 -1
- package/dist/seo/url-builder.js.map +1 -1
- package/dist/types.d.ts +1306 -2429
- package/dist/types.d.ts.map +1 -1
- package/dist/web/artifact-responder.d.ts +69 -0
- package/dist/web/artifact-responder.d.ts.map +1 -0
- package/dist/web/artifact-responder.js +90 -0
- package/dist/web/artifact-responder.js.map +1 -0
- package/dist/web/feed-responder.d.ts +72 -0
- package/dist/web/feed-responder.d.ts.map +1 -0
- package/dist/web/feed-responder.js +81 -0
- package/dist/web/feed-responder.js.map +1 -0
- package/dist/web/index.d.ts +23 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +19 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/redirect-middleware.d.ts +76 -0
- package/dist/web/redirect-middleware.d.ts.map +1 -0
- package/dist/web/redirect-middleware.js +94 -0
- package/dist/web/redirect-middleware.js.map +1 -0
- package/dist/web/respond.d.ts +20 -0
- package/dist/web/respond.d.ts.map +1 -0
- package/dist/web/respond.js +52 -0
- package/dist/web/respond.js.map +1 -0
- package/package.json +19 -3
|
@@ -3,28 +3,58 @@ import { formatPrice } from './format.js';
|
|
|
3
3
|
* Validate an order against the channel's order minimums.
|
|
4
4
|
* Call before `transitionToArrangingPayment()` to provide early feedback.
|
|
5
5
|
*
|
|
6
|
-
* Pass the object from `getOrderConstraints()` straight through
|
|
7
|
-
* `minOrderAmountGross` / `minOrderQuantity` fields are read directly:
|
|
6
|
+
* Pass the order and the object from `getOrderConstraints()` straight through:
|
|
8
7
|
*
|
|
9
8
|
* ```ts
|
|
10
|
-
* const constraints = await client.
|
|
9
|
+
* const constraints = await client.commerce.getOrderConstraints();
|
|
11
10
|
* const result = client.pricing.validateOrderMinimums(order, constraints);
|
|
12
11
|
* ```
|
|
13
12
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
13
|
+
* It checks what the engine checks at that transition, on the same figures:
|
|
14
|
+
*
|
|
15
|
+
* - the GROSS minimum (`minOrderAmountGross`) against the lines' gross total,
|
|
16
|
+
* `subTotalWithTax`. Shipping does not count;
|
|
17
|
+
* - the NET minimum (`minOrderAmountNet`) against the lines' net total,
|
|
18
|
+
* `subTotal`;
|
|
19
|
+
* - the delivery minimum (`fulfillmentMinOrderNet`, the store's default
|
|
20
|
+
* delivery profile, net) against `subTotal`, unless the customer is exempt
|
|
21
|
+
* (`customerIsExempt`), as the engine skips it then;
|
|
22
|
+
* - the item count (`minOrderQuantity`) against `totalQuantity`.
|
|
23
|
+
*
|
|
24
|
+
* The engine leaves out of its totals the lines of collections the store
|
|
25
|
+
* exempts from minimums, and any surcharge; the client cannot tell those
|
|
26
|
+
* apart, so on such a cart the hint and checkout can disagree. The server
|
|
27
|
+
* enforces every minimum regardless. Display its message as-is on failure: it
|
|
28
|
+
* may name the price list that binds ("Minimum order for Wholesale is …"),
|
|
29
|
+
* which the client cannot know. These messages are for the pre-checkout
|
|
30
|
+
* shortfall hint.
|
|
31
|
+
*
|
|
32
|
+
* Amounts are compared only in ONE currency. The engine answers the minimums
|
|
33
|
+
* in the session's currency (`constraints.currencyCode`), converted at the rate
|
|
34
|
+
* checkout charges with, and formats the messages in it; nothing is converted
|
|
35
|
+
* here. When that is not the order's currency — constraints fetched before
|
|
36
|
+
* the shopper switched currency, an engine with no rate for the order's
|
|
37
|
+
* currency (it then answers the channel default and refuses such a checkout
|
|
38
|
+
* itself), or an engine released before 2026-09-30 — the AMOUNT checks are
|
|
39
|
+
* skipped rather than compare EUR cents with USD ones. Re-fetch
|
|
40
|
+
* `getOrderConstraints()` after a currency switch. The quantity check needs no
|
|
41
|
+
* currency and always runs.
|
|
18
42
|
*/
|
|
19
43
|
export function validateOrderMinimums(order, constraints) {
|
|
20
44
|
const errors = [];
|
|
45
|
+
// The minimums are formatted in the currency they are held in, and compared
|
|
46
|
+
// only with an order in that same currency — never EUR minor units against
|
|
47
|
+
// USD ones.
|
|
48
|
+
const amountCurrency = constraints.currencyCode ?? order.currencyCode;
|
|
49
|
+
const amountsComparable = amountCurrency === order.currencyCode;
|
|
21
50
|
const minAmount = constraints.minOrderAmountGross ?? constraints.minOrderAmount;
|
|
22
|
-
|
|
51
|
+
const grossTotal = order.subTotalWithTax ?? order.totalWithTax;
|
|
52
|
+
if (amountsComparable && minAmount != null && minAmount > 0 && grossTotal < minAmount) {
|
|
23
53
|
errors.push({
|
|
24
54
|
type: 'min_amount',
|
|
25
|
-
message: `Minimum order amount is ${formatPrice(minAmount,
|
|
55
|
+
message: `Minimum order amount is ${formatPrice(minAmount, amountCurrency)}`,
|
|
26
56
|
required: minAmount,
|
|
27
|
-
actual:
|
|
57
|
+
actual: grossTotal,
|
|
28
58
|
});
|
|
29
59
|
}
|
|
30
60
|
// A net minimum is checked separately, never folded into the gross one: the
|
|
@@ -32,16 +62,34 @@ export function validateOrderMinimums(order, constraints) {
|
|
|
32
62
|
// client does not have. Both can fail on the same cart.
|
|
33
63
|
const minAmountNet = constraints.minOrderAmountNet;
|
|
34
64
|
const netTotal = order.subTotal ?? order.total;
|
|
35
|
-
if (
|
|
65
|
+
if (amountsComparable &&
|
|
66
|
+
minAmountNet != null &&
|
|
67
|
+
minAmountNet > 0 &&
|
|
68
|
+
netTotal != null &&
|
|
69
|
+
netTotal < minAmountNet) {
|
|
36
70
|
errors.push({
|
|
37
71
|
type: 'min_amount',
|
|
38
72
|
// Says "excl. tax" so the figure is not read against the gross total the
|
|
39
73
|
// buyer sees on screen, where it would look wrong.
|
|
40
|
-
message: `Minimum order amount is ${formatPrice(minAmountNet,
|
|
74
|
+
message: `Minimum order amount is ${formatPrice(minAmountNet, amountCurrency)} excl. tax`,
|
|
41
75
|
required: minAmountNet,
|
|
42
76
|
actual: netTotal,
|
|
43
77
|
});
|
|
44
78
|
}
|
|
79
|
+
const minDeliveryNet = constraints.fulfillmentMinOrderNet;
|
|
80
|
+
if (amountsComparable &&
|
|
81
|
+
constraints.customerIsExempt !== true &&
|
|
82
|
+
minDeliveryNet != null &&
|
|
83
|
+
minDeliveryNet > 0 &&
|
|
84
|
+
netTotal != null &&
|
|
85
|
+
netTotal < minDeliveryNet) {
|
|
86
|
+
errors.push({
|
|
87
|
+
type: 'min_amount',
|
|
88
|
+
message: `Minimum order amount for delivery is ${formatPrice(minDeliveryNet, amountCurrency)} excl. tax`,
|
|
89
|
+
required: minDeliveryNet,
|
|
90
|
+
actual: netTotal,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
45
93
|
const minQuantity = constraints.minOrderQuantity;
|
|
46
94
|
// `totalQuantity` is optional so a caller passing only totals still validates
|
|
47
95
|
// the amount. Skipping the quantity check when it is absent is correct;
|
|
@@ -61,14 +109,26 @@ export function validateOrderMinimums(order, constraints) {
|
|
|
61
109
|
}
|
|
62
110
|
/**
|
|
63
111
|
* How many units of a variant the current shopper may put in the cart:
|
|
64
|
-
* `max(0, saleable) + backorderAllowance
|
|
112
|
+
* `max(0, saleable) + backorderAllowance` — or `0` when the merchant is not
|
|
113
|
+
* accepting orders for it at all (`availability.orderable === false`, i.e.
|
|
114
|
+
* "coming soon").
|
|
65
115
|
*
|
|
66
116
|
* Returns `null` when the channel does not expose stock (`saleable == null`) —
|
|
67
117
|
* the storefront cannot know a ceiling then and should let the server decide,
|
|
68
118
|
* exactly as before backorders existed. A `null` allowance counts as 0, so a
|
|
69
119
|
* shopper the policy does not admit gets plain `saleable`.
|
|
120
|
+
*
|
|
121
|
+
* The coming-soon clamp comes FIRST and ignores stock: a coming-soon variant
|
|
122
|
+
* with units on hand is still refused by the server (`InsufficientStockError`,
|
|
123
|
+
* `quantityAvailable: 0`), so a stepper that let the shopper reach that number
|
|
124
|
+
* would be offering something no add-to-cart can deliver. `0` is returned
|
|
125
|
+
* rather than `null` even on a channel that hides stock, because `orderable:
|
|
126
|
+
* false` is a merchant decision the storefront CAN read — there is nothing to
|
|
127
|
+
* defer to the server about.
|
|
70
128
|
*/
|
|
71
129
|
export function maxOrderableQuantity(variant) {
|
|
130
|
+
if (variant.availability?.orderable === false)
|
|
131
|
+
return 0;
|
|
72
132
|
if (variant.saleable == null)
|
|
73
133
|
return null;
|
|
74
134
|
return Math.max(0, variant.saleable) + Math.max(0, variant.backorderAllowance ?? 0);
|
|
@@ -80,6 +140,100 @@ export function maxOrderableQuantity(variant) {
|
|
|
80
140
|
export function isBackorderOnly(variant) {
|
|
81
141
|
return (variant.saleable ?? 0) <= 0 && (variant.backorderAllowance ?? 0) > 0;
|
|
82
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* Whether the merchant is showing this variant as "coming soon": visible, but
|
|
145
|
+
* not orderable by anyone — not from stock on hand, and not on backorder.
|
|
146
|
+
*
|
|
147
|
+
* The signal to render a "Coming soon" badge (with `availability.availableFrom`
|
|
148
|
+
* as the date when it is set) and to disable add-to-cart. Stock never ends the
|
|
149
|
+
* state: a coming-soon variant with units on hand is still refused.
|
|
150
|
+
*
|
|
151
|
+
* Deliberately a `===` comparison and not a `switch`: a state this SDK release
|
|
152
|
+
* has never heard of must read as "not coming soon", never as `undefined`.
|
|
153
|
+
*/
|
|
154
|
+
export function isComingSoon(variant) {
|
|
155
|
+
return variant.availability?.state === 'comingSoon';
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Does the storefront KNOW there is nothing to buy outright?
|
|
159
|
+
*
|
|
160
|
+
* Three answers, and the third is the point: `true` known empty, `false` known
|
|
161
|
+
* to have stock, `null` when no signal is readable and nothing may be asserted
|
|
162
|
+
* either way.
|
|
163
|
+
*
|
|
164
|
+
* The signals, most precise first — and which one a shape carries depends on
|
|
165
|
+
* the document it came from:
|
|
166
|
+
*
|
|
167
|
+
* - `saleable`, the precise number. It is `null` whenever the channel does not
|
|
168
|
+
* expose stock numbers — which is the DEFAULT
|
|
169
|
+
* (`Channel.customFields.exposeStockToStorefront` is off until a merchant
|
|
170
|
+
* turns it on), so on an ordinary retail tenant every shopper sees `null`.
|
|
171
|
+
* - `inStock`, the only stock signal a SEARCH row has: `SEARCH_PRODUCTS`
|
|
172
|
+
* selects neither `saleable` nor `stockLevel`, so without this a search grid
|
|
173
|
+
* could never tell a 0-stock pre-order from one with stock.
|
|
174
|
+
* - `stockLevel`, the coarse display string every VARIANT document selects.
|
|
175
|
+
* Any value other than `'OUT_OF_STOCK'` means there is something to sell (a
|
|
176
|
+
* custom `StockDisplayStrategy` may emit `'LOW_STOCK'` and the like).
|
|
177
|
+
*/
|
|
178
|
+
export function knownNothingSaleable(variant) {
|
|
179
|
+
if (typeof variant.saleable === 'number')
|
|
180
|
+
return variant.saleable <= 0;
|
|
181
|
+
if (typeof variant.inStock === 'boolean')
|
|
182
|
+
return !variant.inStock;
|
|
183
|
+
if (variant.stockLevel === 'OUT_OF_STOCK')
|
|
184
|
+
return true;
|
|
185
|
+
if (typeof variant.stockLevel === 'string' && variant.stockLevel !== '')
|
|
186
|
+
return false;
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Whether this variant can be had ONLY as a pre-order: the merchant has it on
|
|
191
|
+
* pre-order AND the storefront can see there is nothing to buy outright.
|
|
192
|
+
*
|
|
193
|
+
* The label is "Pre-order", not "Out of stock". How MANY units this shopper may
|
|
194
|
+
* pre-order is `backorderAllowance` — pre-orders borrow the backorder cap, so
|
|
195
|
+
* an anonymous visitor sees `state: 'preorder'` with a `null` allowance and
|
|
196
|
+
* cannot in fact order beyond stock. Use `canAddToCart` for the button.
|
|
197
|
+
*
|
|
198
|
+
* **A `null` `saleable` is the DEFAULT, not an edge case, and it is not read as
|
|
199
|
+
* zero here.** `exposeStockToStorefront` is off until a merchant turns it on,
|
|
200
|
+
* so on an ordinary retail tenant `saleable` is `null` for everybody. Stock
|
|
201
|
+
* never ends a pre-order state either (the merchant may keep selling from the
|
|
202
|
+
* warehouse while the state stands), so reading `null` as "nothing saleable"
|
|
203
|
+
* badged a SKU with forty units on hand "Pre-order, ships 12 March" while the
|
|
204
|
+
* add succeeded from stock and the parcel shipped that afternoon. It now falls
|
|
205
|
+
* back to a search row's `inStock`, then to `stockLevel`, and answers `false`
|
|
206
|
+
* when no signal is knowable — "I cannot prove this is pre-order-only" rather
|
|
207
|
+
* than a wrong promise.
|
|
208
|
+
*
|
|
209
|
+
* **It does NOT match `isBackorderOnly`, despite the shape.** That one reads
|
|
210
|
+
* `saleable ?? 0` and cannot be wrong for the same reason: its
|
|
211
|
+
* `backorderAllowance > 0` clause is never true on a stock-hiding channel,
|
|
212
|
+
* since the allowance is `null` under exactly the same gate. The availability
|
|
213
|
+
* state has no such gate — it is public — so this helper needs the stock
|
|
214
|
+
* question answered properly.
|
|
215
|
+
*/
|
|
216
|
+
export function isPreorderOnly(variant) {
|
|
217
|
+
return variant.availability?.state === 'preorder' && knownNothingSaleable(variant) === true;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Whether the buy button should be enabled for this shopper, right now.
|
|
221
|
+
*
|
|
222
|
+
* `true` unless the storefront can prove otherwise: the ceiling is `0` (coming
|
|
223
|
+
* soon, or out of stock with no allowance). A `null` ceiling — the channel
|
|
224
|
+
* hides stock — stays `true` and lets the server decide, exactly as before
|
|
225
|
+
* backorders and pre-orders existed.
|
|
226
|
+
*
|
|
227
|
+
* This is the ONE rule a storefront needs. In particular it is NOT
|
|
228
|
+
* `availability.orderable`: an anonymous shopper sees `orderable: true` on a
|
|
229
|
+
* pre-order they cannot order beyond stock, because the units come from
|
|
230
|
+
* `backorderAllowance`, which is `null` for them. The server refuses either way
|
|
231
|
+
* (`InsufficientStockError` on add, `INSUFFICIENT_STOCK` at placement) — this
|
|
232
|
+
* just stops the storefront offering it.
|
|
233
|
+
*/
|
|
234
|
+
export function canAddToCart(variant) {
|
|
235
|
+
return maxOrderableQuantity(variant) !== 0;
|
|
236
|
+
}
|
|
83
237
|
/**
|
|
84
238
|
* Units of a cart line physical stock will not cover — the "N on backorder"
|
|
85
239
|
* hint BEFORE placement, when `backorderedQuantity` is still 0 — computed the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/pricing/validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/pricing/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/redirects/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAErE,kEAAkE;AAClE,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,YAAY,EACjB,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC,GACrE,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/redirects/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAErE,kEAAkE;AAClE,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,YAAY,EACjB,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC,GACrE,aAAa,CAQf;AAED,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EACL,qBAAqB,EACrB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAC"}
|
package/dist/redirects/index.js
CHANGED
|
@@ -2,7 +2,8 @@ import { createRedirectStore } from './store.js';
|
|
|
2
2
|
/** Wire a redirect store from an initialized client's context. */
|
|
3
3
|
export function createRedirectsModule(ctx, options) {
|
|
4
4
|
return createRedirectStore({
|
|
5
|
-
|
|
5
|
+
// Read per load: the store's code can move under a running client (a rename).
|
|
6
|
+
storeCode: () => ctx.channel.code,
|
|
6
7
|
pluginsUrl: ctx.pluginsUrl,
|
|
7
8
|
fetch: ctx.fetch,
|
|
8
9
|
...options,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/redirects/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGjD,kEAAkE;AAClE,MAAM,UAAU,qBAAqB,CACnC,GAAiB,EACjB,OAAsE;IAEtE,OAAO,mBAAmB,CAAC;QACzB,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/redirects/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGjD,kEAAkE;AAClE,MAAM,UAAU,qBAAqB,CACnC,GAAiB,EACjB,OAAsE;IAEtE,OAAO,mBAAmB,CAAC;QACzB,8EAA8E;QAC9E,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI;QACjC,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG,OAAO;KACX,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EACL,qBAAqB,GAOtB,MAAM,YAAY,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/redirects/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/redirects/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAC;AAsBpB;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAe5D;AAsCD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CAmK9E"}
|
package/dist/redirects/store.js
CHANGED
|
@@ -89,7 +89,11 @@ export function createRedirectStore(config) {
|
|
|
89
89
|
const pluginsUrl = (config.pluginsUrl ?? DEFAULT_PLUGINS_URL).replace(/\/+$/, '');
|
|
90
90
|
const ttlMs = config.ttlMs ?? DEFAULT_TTL_MS;
|
|
91
91
|
const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
92
|
-
const
|
|
92
|
+
const storeCodeOf = config.storeCode;
|
|
93
|
+
const urlNow = () => {
|
|
94
|
+
const code = typeof storeCodeOf === 'function' ? storeCodeOf() : storeCodeOf;
|
|
95
|
+
return `${pluginsUrl}/redirects/public/${encodeURIComponent(code)}`;
|
|
96
|
+
};
|
|
93
97
|
let cached = null;
|
|
94
98
|
let index = null;
|
|
95
99
|
let etag = null;
|
|
@@ -114,7 +118,7 @@ export function createRedirectStore(config) {
|
|
|
114
118
|
if (etag && cached) {
|
|
115
119
|
headers['If-None-Match'] = etag;
|
|
116
120
|
}
|
|
117
|
-
const response = await fetchFn(
|
|
121
|
+
const response = await fetchFn(urlNow(), { headers, signal: controller.signal });
|
|
118
122
|
if (response.status === 304 && cached) {
|
|
119
123
|
freshUntil = Date.now() + ttlMs;
|
|
120
124
|
return cached;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/redirects/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/redirects/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,8 +26,11 @@ export interface RedirectMatch {
|
|
|
26
26
|
status: RedirectStatusCode;
|
|
27
27
|
}
|
|
28
28
|
export interface RedirectStoreConfig {
|
|
29
|
-
/**
|
|
30
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Store channel code, e.g. `fashion-store` — or a function answering the code to load under
|
|
31
|
+
* NOW, read on every load, so a store renamed under a running process follows its new code.
|
|
32
|
+
*/
|
|
33
|
+
storeCode: string | (() => string);
|
|
31
34
|
/** Plugins service origin. Defaults to the SDK's configured plugins URL. */
|
|
32
35
|
pluginsUrl?: string;
|
|
33
36
|
/** How long a fetched snapshot is served before revalidating. Default 60s. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/redirects/types.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,eAAO,MAAM,qBAAqB,oCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/redirects/types.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,eAAO,MAAM,qBAAqB,oCAAqC,CAAC;AAExE,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAIxE,wFAAwF;AACxF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAGD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;CACzB;AAGD,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAGD,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,SAAS,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACnC,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAGD,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IACvD,4EAA4E;IAC5E,QAAQ,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtC,8CAA8C;IAC9C,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACtC"}
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* base path, a rule change), the plan is the WHOLE site. Never quieter.
|
|
14
14
|
*/
|
|
15
15
|
import type { PlatformEventEnvelope } from '../events/envelope.js';
|
|
16
|
+
import type { RevalidationEventTypeV1 } from '../events/payloads.js';
|
|
16
17
|
import type { ChannelUrlRuleSet, UrlContext } from './url-context.js';
|
|
17
18
|
/** Above this many route paths, one whole-site revalidation replaces them — as the legacy dispatcher does. */
|
|
18
19
|
export declare const DEFAULT_MAX_REVALIDATE_PATHS = 500;
|
|
@@ -33,6 +34,15 @@ export interface RevalidationPlan {
|
|
|
33
34
|
* site instead, answering 200. `planRevalidation` never sets it; it throws.
|
|
34
35
|
*/
|
|
35
36
|
readonly degraded?: RevalidationDegradedReason;
|
|
37
|
+
/**
|
|
38
|
+
* The event changed what a {@link UrlContext} is read from
|
|
39
|
+
* (`channel.url_settings_changed`, `head.changed`, `channel.renamed`): re-read
|
|
40
|
+
* it before composing the next event's paths. `createEventRevalidateHandler`
|
|
41
|
+
* does so itself (for `channel.url_settings_changed` it adopts the payload's
|
|
42
|
+
* rule set); a pull-feed consumer calling `planRevalidation` drops its own
|
|
43
|
+
* cached context.
|
|
44
|
+
*/
|
|
45
|
+
readonly invalidateUrlContext?: true;
|
|
36
46
|
}
|
|
37
47
|
export type RevalidationDegradedReason = 'url_mapping_failed';
|
|
38
48
|
export interface RevalidationPlanOptions {
|
|
@@ -42,8 +52,27 @@ export interface RevalidationPlanOptions {
|
|
|
42
52
|
* Map a composed storefront URL to the route path to revalidate, or `null` to
|
|
43
53
|
* skip it. Default: `url.pathname`. Override when your routes differ from your
|
|
44
54
|
* public URLs — e.g. `subdomain` locales rewritten to `/[locale]/...` routes.
|
|
55
|
+
*
|
|
56
|
+
* `store` is passed only for a store-scoped plan (several stores in one app):
|
|
57
|
+
* the event's store code, for an app whose routes carry the store (a host
|
|
58
|
+
* rewritten to `/[store]/...`). The URL is already built on that store's own
|
|
59
|
+
* address.
|
|
60
|
+
*/
|
|
61
|
+
toRoutePath?(url: URL, locale: string, store?: string): string | null;
|
|
62
|
+
/**
|
|
63
|
+
* Scope every tag to the envelope's store — `store:<channel_code>:<tag>` —
|
|
64
|
+
* for an app that serves several stores from one process
|
|
65
|
+
* (`createStorefrontClient({ resolveStore })`). Its reads carry the scoped tag
|
|
66
|
+
* beside each bare one, so one store's event purges that store's copies only.
|
|
67
|
+
*
|
|
68
|
+
* Only for such an app: a single-store client's reads carry bare tags alone,
|
|
69
|
+
* and a store-scoped plan would purge nothing they hold. Requires the
|
|
70
|
+
* envelope's `channel_code`.
|
|
71
|
+
*
|
|
72
|
+
* Path revalidations are not narrowed (their URLs are composed per store
|
|
73
|
+
* already), and a whole-site plan still revalidates the whole app.
|
|
45
74
|
*/
|
|
46
|
-
|
|
75
|
+
storeScoped?: boolean;
|
|
47
76
|
}
|
|
48
77
|
/** A signed, known-type, version-1 event whose `data` does not match its contract. */
|
|
49
78
|
export declare class EventPayloadError extends Error {
|
|
@@ -60,10 +89,25 @@ export type RevalidationIntent = {
|
|
|
60
89
|
} | {
|
|
61
90
|
readonly kind: 'tags';
|
|
62
91
|
readonly tags: readonly string[];
|
|
92
|
+
readonly invalidateUrlContext?: true;
|
|
63
93
|
} | {
|
|
64
94
|
readonly kind: 'paths';
|
|
65
95
|
expand(locales: readonly string[]): PathPair[];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* A known event that moves nothing this SDK caches — distinct from `skip`,
|
|
99
|
+
* which is an event it does not know. Never needs a URL context.
|
|
100
|
+
*/
|
|
101
|
+
| {
|
|
102
|
+
readonly kind: 'none';
|
|
103
|
+
readonly invalidateUrlContext?: true;
|
|
66
104
|
};
|
|
105
|
+
/**
|
|
106
|
+
* The event types this SDK acts on: the revalidation subset core publishes,
|
|
107
|
+
* plus the storefront-facing types handled since (headless spec §9.1). Every
|
|
108
|
+
* other catalogued type is a `skip` (`unknown_type`).
|
|
109
|
+
*/
|
|
110
|
+
export type RevalidationHandledEventTypeV1 = RevalidationEventTypeV1 | 'head.changed' | 'menu.changed' | 'asset.changed' | 'channel.renamed' | 'product.channel_assigned' | 'product.channel_removed' | 'product_variant.created' | 'product_variant.updated' | 'product_variant.deleted' | 'facet.created' | 'facet.updated' | 'facet.deleted' | 'facet.value.created' | 'facet.value.updated' | 'facet.value.deleted' | 'price_list.changed' | 'promotion.changed';
|
|
67
111
|
/**
|
|
68
112
|
* Classify an envelope. Unknown types and unsupported versions are skips, not
|
|
69
113
|
* errors — a subscriber on an older SDK must keep accepting newer events.
|
|
@@ -71,8 +115,13 @@ export type RevalidationIntent = {
|
|
|
71
115
|
*/
|
|
72
116
|
export declare function classifyEvent(envelope: Pick<PlatformEventEnvelope, 'type' | 'schema_version' | 'data'>): RevalidationIntent;
|
|
73
117
|
export declare function resolveMaxPaths(maxPaths: number | undefined): number;
|
|
74
|
-
/**
|
|
75
|
-
|
|
118
|
+
/**
|
|
119
|
+
* Turn an intent into a plan, composing URLs only when the intent has paths.
|
|
120
|
+
*
|
|
121
|
+
* `store` (a store-scoped plan) scopes every tag to that store and is handed to
|
|
122
|
+
* `toRoutePath`; omitted, the plan is exactly what it always was.
|
|
123
|
+
*/
|
|
124
|
+
export declare function planFromIntent(intent: RevalidationIntent, urls: UrlContext | null, options?: RevalidationPlanOptions, store?: string): RevalidationPlan;
|
|
76
125
|
/**
|
|
77
126
|
* The revalidation a platform event calls for — the mapping
|
|
78
127
|
* `createEventRevalidateHandler` applies, for consumers of the pull feed or of
|
|
@@ -82,6 +131,8 @@ export declare function planFromIntent(intent: RevalidationIntent, urls: UrlCont
|
|
|
82
131
|
* not match its contract, and `TypeError` when `urls` is unusable for an event
|
|
83
132
|
* that carries paths.
|
|
84
133
|
*/
|
|
85
|
-
export declare function planRevalidation(envelope: Pick<PlatformEventEnvelope, 'type' | 'schema_version' | 'data'
|
|
134
|
+
export declare function planRevalidation(envelope: Pick<PlatformEventEnvelope, 'type' | 'schema_version' | 'data'> & Partial<Pick<PlatformEventEnvelope, 'channel_code'>>, urls: UrlContext, options?: RevalidationPlanOptions): RevalidationPlan;
|
|
135
|
+
/** The store a store-scoped plan is for: the envelope's `channel_code`, required. */
|
|
136
|
+
export declare function envelopeStore(envelope: Partial<Pick<PlatformEventEnvelope, 'channel_code'>>): string;
|
|
86
137
|
export {};
|
|
87
138
|
//# sourceMappingURL=event-plan.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-plan.d.ts","sourceRoot":"","sources":["../../src/revalidation/event-plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"event-plan.d.ts","sourceRoot":"","sources":["../../src/revalidation/event-plan.ts"],"names":[],"mappings":"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"}
|