@sixtyninecommerce/client 0.24.0 → 0.25.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 +21 -0
- package/dist/admin/forms.js +19 -0
- package/dist/admin/forms.js.map +1 -1
- package/dist/admin/http.d.ts +9 -0
- package/dist/admin/http.d.ts.map +1 -1
- package/dist/admin/http.js +3 -0
- package/dist/admin/http.js.map +1 -1
- package/dist/admin/index.d.ts +63 -0
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +67 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/redirects.d.ts +6 -0
- package/dist/admin/redirects.d.ts.map +1 -1
- package/dist/admin/redirects.js +12 -0
- package/dist/admin/redirects.js.map +1 -1
- package/dist/admin/types.d.ts +63 -0
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/cache-tags.d.ts +19 -0
- package/dist/cache-tags.d.ts.map +1 -1
- package/dist/cache-tags.js +19 -0
- package/dist/cache-tags.js.map +1 -1
- package/dist/client.d.ts +17 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +17 -0
- package/dist/client.js.map +1 -1
- package/dist/commerce/age-verification.js +3 -3
- package/dist/commerce/age-verification.js.map +1 -1
- package/dist/commerce/branding.js +7 -0
- package/dist/commerce/branding.js.map +1 -1
- package/dist/commerce/cart.js +25 -0
- package/dist/commerce/cart.js.map +1 -1
- package/dist/commerce/checkout.d.ts +68 -0
- package/dist/commerce/checkout.d.ts.map +1 -1
- package/dist/commerce/checkout.js +83 -0
- package/dist/commerce/checkout.js.map +1 -1
- package/dist/commerce/customer.d.ts +58 -0
- package/dist/commerce/customer.d.ts.map +1 -1
- package/dist/commerce/customer.js +65 -0
- package/dist/commerce/customer.js.map +1 -1
- package/dist/commerce/pickup-location-parser.d.ts +18 -0
- package/dist/commerce/pickup-location-parser.d.ts.map +1 -1
- package/dist/commerce/pickup-location-parser.js +28 -0
- package/dist/commerce/pickup-location-parser.js.map +1 -1
- package/dist/commerce/placement-error.d.ts +52 -0
- package/dist/commerce/placement-error.d.ts.map +1 -1
- package/dist/commerce/placement-error.js +87 -0
- package/dist/commerce/placement-error.js.map +1 -1
- package/dist/commerce/products.d.ts +48 -0
- package/dist/commerce/products.d.ts.map +1 -1
- package/dist/commerce/products.js +92 -0
- package/dist/commerce/products.js.map +1 -1
- package/dist/commerce/queries.d.ts +113 -27
- package/dist/commerce/queries.d.ts.map +1 -1
- package/dist/commerce/queries.js +188 -2
- package/dist/commerce/queries.js.map +1 -1
- package/dist/commerce/quotes.js +33 -0
- package/dist/commerce/quotes.js.map +1 -1
- package/dist/commerce/saved-lists.d.ts +7 -7
- package/dist/commerce/saved-lists.d.ts.map +1 -1
- package/dist/commerce/saved-lists.js +1 -1
- package/dist/commerce/search.js +3 -0
- package/dist/commerce/search.js.map +1 -1
- package/dist/commerce/shipping.js +3 -3
- package/dist/commerce/shipping.js.map +1 -1
- package/dist/commerce/stock-notifications.d.ts +11 -0
- package/dist/commerce/stock-notifications.d.ts.map +1 -1
- package/dist/commerce/stock-notifications.js +11 -0
- package/dist/commerce/stock-notifications.js.map +1 -1
- package/dist/commerce/vat-validation.js +4 -4
- package/dist/commerce/vat-validation.js.map +1 -1
- package/dist/constants.d.ts +31 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +32 -0
- package/dist/constants.js.map +1 -1
- package/dist/content/asset-urls.d.ts +50 -0
- package/dist/content/asset-urls.d.ts.map +1 -1
- package/dist/content/asset-urls.js +92 -0
- package/dist/content/asset-urls.js.map +1 -1
- package/dist/content/assets.d.ts +15 -0
- package/dist/content/assets.d.ts.map +1 -1
- package/dist/content/assets.js +15 -0
- package/dist/content/assets.js.map +1 -1
- package/dist/content/collection-pages.d.ts +5 -0
- package/dist/content/collection-pages.d.ts.map +1 -1
- package/dist/content/collection-pages.js +8 -0
- package/dist/content/collection-pages.js.map +1 -1
- package/dist/content/collections.d.ts +14 -0
- package/dist/content/collections.d.ts.map +1 -1
- package/dist/content/collections.js +16 -0
- package/dist/content/collections.js.map +1 -1
- package/dist/content/filtered-products.d.ts +18 -0
- package/dist/content/filtered-products.d.ts.map +1 -1
- package/dist/content/filtered-products.js +16 -0
- package/dist/content/filtered-products.js.map +1 -1
- package/dist/content/form-field-types.d.ts +6 -0
- package/dist/content/form-field-types.d.ts.map +1 -1
- package/dist/content/form-field-types.js +12 -0
- package/dist/content/form-field-types.js.map +1 -1
- package/dist/content/forms.d.ts +16 -0
- package/dist/content/forms.d.ts.map +1 -1
- package/dist/content/forms.js +23 -0
- package/dist/content/forms.js.map +1 -1
- package/dist/content/items.d.ts +26 -0
- package/dist/content/items.d.ts.map +1 -1
- package/dist/content/items.js +33 -0
- package/dist/content/items.js.map +1 -1
- package/dist/content/resolve.js +6 -0
- package/dist/content/resolve.js.map +1 -1
- package/dist/content/sitemap.d.ts +5 -0
- package/dist/content/sitemap.d.ts.map +1 -1
- package/dist/content/sitemap.js +5 -0
- package/dist/content/sitemap.js.map +1 -1
- package/dist/core/context.js +6 -0
- package/dist/core/context.js.map +1 -1
- package/dist/core/headers.js +2 -0
- package/dist/core/headers.js.map +1 -1
- package/dist/core/http.d.ts +8 -0
- package/dist/core/http.d.ts.map +1 -1
- package/dist/core/http.js +89 -1
- package/dist/core/http.js.map +1 -1
- package/dist/credit/credit-status.js +2 -2
- package/dist/credit/credit-status.js.map +1 -1
- package/dist/credit/payment-terms.js +2 -2
- package/dist/credit/payment-terms.js.map +1 -1
- package/dist/currency/exchange.d.ts +11 -0
- package/dist/currency/exchange.d.ts.map +1 -1
- package/dist/currency/exchange.js +11 -0
- package/dist/currency/exchange.js.map +1 -1
- package/dist/errors.d.ts +50 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +48 -2
- package/dist/errors.js.map +1 -1
- package/dist/events/envelope.d.ts +36 -0
- package/dist/events/envelope.d.ts.map +1 -1
- package/dist/events/envelope.js +12 -0
- package/dist/events/envelope.js.map +1 -1
- package/dist/events/index.d.ts +13 -0
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +13 -0
- package/dist/events/index.js.map +1 -1
- package/dist/events/payloads.d.ts +19 -0
- package/dist/events/payloads.d.ts.map +1 -1
- package/dist/events/payloads.js +12 -0
- package/dist/events/payloads.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/media/index.js +2 -0
- package/dist/media/index.js.map +1 -1
- package/dist/media/urls.d.ts +52 -0
- package/dist/media/urls.d.ts.map +1 -1
- package/dist/media/urls.js +38 -0
- package/dist/media/urls.js.map +1 -1
- package/dist/media/video.d.ts +16 -0
- package/dist/media/video.d.ts.map +1 -1
- package/dist/media/video.js +16 -0
- package/dist/media/video.js.map +1 -1
- package/dist/next/artifact-handler.d.ts +22 -0
- package/dist/next/artifact-handler.d.ts.map +1 -1
- package/dist/next/artifact-handler.js +22 -0
- package/dist/next/artifact-handler.js.map +1 -1
- package/dist/next/event-revalidate-handler.d.ts +67 -0
- package/dist/next/event-revalidate-handler.d.ts.map +1 -1
- package/dist/next/event-revalidate-handler.js +48 -0
- package/dist/next/event-revalidate-handler.js.map +1 -1
- package/dist/next/index.d.ts +6 -0
- package/dist/next/index.d.ts.map +1 -1
- package/dist/next/index.js +6 -0
- package/dist/next/index.js.map +1 -1
- package/dist/next/json-ld.d.ts +9 -0
- package/dist/next/json-ld.d.ts.map +1 -1
- package/dist/next/json-ld.js +9 -0
- package/dist/next/json-ld.js.map +1 -1
- package/dist/next/metadata.d.ts +18 -0
- package/dist/next/metadata.d.ts.map +1 -1
- package/dist/next/metadata.js +21 -0
- package/dist/next/metadata.js.map +1 -1
- package/dist/next/redirect-middleware.d.ts +39 -0
- package/dist/next/redirect-middleware.d.ts.map +1 -1
- package/dist/next/redirect-middleware.js +32 -0
- package/dist/next/redirect-middleware.js.map +1 -1
- package/dist/next/revalidate-handler.d.ts +30 -0
- package/dist/next/revalidate-handler.d.ts.map +1 -1
- package/dist/next/revalidate-handler.js +22 -0
- package/dist/next/revalidate-handler.js.map +1 -1
- package/dist/order-scope.d.ts +27 -0
- package/dist/order-scope.d.ts.map +1 -1
- package/dist/order-scope.js +29 -0
- package/dist/order-scope.js.map +1 -1
- package/dist/pricing/format.d.ts +17 -0
- package/dist/pricing/format.d.ts.map +1 -1
- package/dist/pricing/format.js +19 -0
- package/dist/pricing/format.js.map +1 -1
- package/dist/pricing/index.d.ts +8 -1
- package/dist/pricing/index.d.ts.map +1 -1
- package/dist/pricing/index.js +18 -2
- package/dist/pricing/index.js.map +1 -1
- package/dist/pricing/tax-display.d.ts +77 -0
- package/dist/pricing/tax-display.d.ts.map +1 -1
- package/dist/pricing/tax-display.js +85 -0
- package/dist/pricing/tax-display.js.map +1 -1
- package/dist/pricing/tiers.d.ts +9 -0
- package/dist/pricing/tiers.d.ts.map +1 -1
- package/dist/pricing/tiers.js +9 -0
- package/dist/pricing/tiers.js.map +1 -1
- package/dist/pricing/validation.d.ts +56 -1
- package/dist/pricing/validation.d.ts.map +1 -1
- package/dist/pricing/validation.js +61 -0
- package/dist/pricing/validation.js.map +1 -1
- package/dist/redirects/index.d.ts +1 -0
- package/dist/redirects/index.d.ts.map +1 -1
- package/dist/redirects/index.js +1 -0
- package/dist/redirects/index.js.map +1 -1
- package/dist/redirects/store.d.ts +20 -0
- package/dist/redirects/store.d.ts.map +1 -1
- package/dist/redirects/store.js +57 -0
- package/dist/redirects/store.js.map +1 -1
- package/dist/redirects/types.d.ts +24 -0
- package/dist/redirects/types.d.ts.map +1 -1
- package/dist/redirects/types.js +1 -0
- package/dist/redirects/types.js.map +1 -1
- package/dist/revalidation/event-plan.d.ts +48 -0
- package/dist/revalidation/event-plan.d.ts.map +1 -1
- package/dist/revalidation/event-plan.js +61 -0
- package/dist/revalidation/event-plan.js.map +1 -1
- package/dist/revalidation/event-verify.d.ts +25 -0
- package/dist/revalidation/event-verify.d.ts.map +1 -1
- package/dist/revalidation/event-verify.js +27 -0
- package/dist/revalidation/event-verify.js.map +1 -1
- package/dist/revalidation/types.d.ts +20 -0
- package/dist/revalidation/types.d.ts.map +1 -1
- package/dist/revalidation/types.js +10 -0
- package/dist/revalidation/types.js.map +1 -1
- package/dist/revalidation/url-context.d.ts +25 -0
- package/dist/revalidation/url-context.d.ts.map +1 -1
- package/dist/revalidation/url-context.js +17 -0
- package/dist/revalidation/url-context.js.map +1 -1
- package/dist/revalidation/verify.d.ts +8 -0
- package/dist/revalidation/verify.d.ts.map +1 -1
- package/dist/revalidation/verify.js +8 -0
- package/dist/revalidation/verify.js.map +1 -1
- package/dist/seo/ai.d.ts +17 -0
- package/dist/seo/ai.d.ts.map +1 -1
- package/dist/seo/ai.js +12 -0
- package/dist/seo/ai.js.map +1 -1
- package/dist/seo/alternates.js +13 -0
- package/dist/seo/alternates.js.map +1 -1
- package/dist/seo/artifacts.d.ts +13 -0
- package/dist/seo/artifacts.d.ts.map +1 -1
- package/dist/seo/artifacts.js +19 -0
- package/dist/seo/artifacts.js.map +1 -1
- package/dist/seo/canonical.d.ts +15 -0
- package/dist/seo/canonical.d.ts.map +1 -1
- package/dist/seo/canonical.js +24 -0
- package/dist/seo/canonical.js.map +1 -1
- package/dist/seo/index.js +6 -0
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/json-ld.d.ts +13 -0
- package/dist/seo/json-ld.d.ts.map +1 -1
- package/dist/seo/json-ld.js +32 -0
- package/dist/seo/json-ld.js.map +1 -1
- package/dist/seo/locale-tag.d.ts +31 -0
- package/dist/seo/locale-tag.d.ts.map +1 -1
- package/dist/seo/locale-tag.js +31 -0
- package/dist/seo/locale-tag.js.map +1 -1
- package/dist/seo/meta-tags.d.ts +29 -0
- package/dist/seo/meta-tags.d.ts.map +1 -1
- package/dist/seo/meta-tags.js +28 -0
- package/dist/seo/meta-tags.js.map +1 -1
- package/dist/seo/metadata-parser.d.ts +24 -0
- package/dist/seo/metadata-parser.d.ts.map +1 -1
- package/dist/seo/metadata-parser.js +38 -0
- package/dist/seo/metadata-parser.js.map +1 -1
- package/dist/seo/metadata-types.d.ts +16 -0
- package/dist/seo/metadata-types.d.ts.map +1 -1
- package/dist/seo/product-path.d.ts +96 -0
- package/dist/seo/product-path.d.ts.map +1 -1
- package/dist/seo/product-path.js +96 -0
- package/dist/seo/product-path.js.map +1 -1
- package/dist/seo/robots.d.ts +17 -0
- package/dist/seo/robots.d.ts.map +1 -1
- package/dist/seo/robots.js +12 -0
- package/dist/seo/robots.js.map +1 -1
- package/dist/seo/types.d.ts +39 -0
- package/dist/seo/types.d.ts.map +1 -1
- package/dist/seo/url-builder.d.ts +31 -0
- package/dist/seo/url-builder.d.ts.map +1 -1
- package/dist/seo/url-builder.js +36 -0
- package/dist/seo/url-builder.js.map +1 -1
- package/dist/types.d.ts +1163 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/seo/types.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export type UrlLocaleStrategy = 'path-prefix' | 'subdomain' | 'none';
|
|
2
|
+
/** Locale-aware slug for any translatable entity. */
|
|
2
3
|
export interface TranslatedSlug {
|
|
3
4
|
languageCode: string;
|
|
4
5
|
slug: string;
|
|
5
6
|
}
|
|
7
|
+
/** Minimal Collection shape required for canonical / hreflang resolution. */
|
|
6
8
|
export interface CollectionForSeo {
|
|
7
9
|
id: string;
|
|
8
10
|
slug: string;
|
|
@@ -17,15 +19,20 @@ export interface CollectionForSeo {
|
|
|
17
19
|
isCanonical?: boolean | null;
|
|
18
20
|
} | null;
|
|
19
21
|
}
|
|
22
|
+
/** Product view needed for SEO resolution. Supply the slug + every translation you have. */
|
|
20
23
|
export interface ProductForSeo {
|
|
21
24
|
slug: string;
|
|
22
25
|
translations?: TranslatedSlug[];
|
|
23
26
|
collections: CollectionForSeo[];
|
|
24
27
|
}
|
|
28
|
+
/** CMS resolve-layer item shape for SEO resolution. */
|
|
25
29
|
export interface CmsItemForSeo {
|
|
30
|
+
/** Path already resolved via CMS ResolveService (locale-free canonical path). */
|
|
26
31
|
path: string;
|
|
32
|
+
/** Per-language translated paths. `slug_translations` from the resolve response. */
|
|
27
33
|
slug_translations?: Record<string, string> | null;
|
|
28
34
|
}
|
|
35
|
+
/** Discriminated input to the SEO module methods. */
|
|
29
36
|
export type SeoEntityInput = ({
|
|
30
37
|
kind: 'product';
|
|
31
38
|
} & ProductForSeo) | ({
|
|
@@ -34,8 +41,14 @@ export type SeoEntityInput = ({
|
|
|
34
41
|
kind: 'cms';
|
|
35
42
|
} & CmsItemForSeo);
|
|
36
43
|
export interface HreflangLink {
|
|
44
|
+
/** BCP 47 spelling, ready to put in an `hreflang` attribute (`en-GB`). */
|
|
37
45
|
hreflang: string;
|
|
38
46
|
href: string;
|
|
47
|
+
/**
|
|
48
|
+
* The channel's raw Vendure `LanguageCode` for this row (`en_GB`) — the same
|
|
49
|
+
* locale as `hreflang`, in the spelling the commerce API and OpenGraph use.
|
|
50
|
+
* Optional so existing callers constructing this type keep compiling.
|
|
51
|
+
*/
|
|
39
52
|
languageCode?: string;
|
|
40
53
|
}
|
|
41
54
|
export interface SeoMeta {
|
|
@@ -44,18 +57,44 @@ export interface SeoMeta {
|
|
|
44
57
|
xDefault: string;
|
|
45
58
|
}
|
|
46
59
|
export interface SeoModule {
|
|
60
|
+
/** Resolve the canonical URL for an entity (optionally per-locale). */
|
|
47
61
|
canonicalFor(entity: SeoEntityInput, locale?: string): string;
|
|
62
|
+
/**
|
|
63
|
+
* Enumerate hreflang alternates. Only languages the entity actually has a
|
|
64
|
+
* translation in are emitted (plus `x-default`) — Google drops broken pairs.
|
|
65
|
+
*/
|
|
48
66
|
alternatesFor(entity: SeoEntityInput): HreflangLink[];
|
|
67
|
+
/** Combined meta bundle: canonical + alternates + xDefault. */
|
|
49
68
|
metaFor(entity: SeoEntityInput): SeoMeta;
|
|
69
|
+
/** Low-level URL builder — composes `{storefrontUrl}{localePrefix}/{segments...}`. */
|
|
50
70
|
buildUrl(segments: string[], locale?: string): string;
|
|
71
|
+
/**
|
|
72
|
+
* Full structured meta tag set for an entity: title, description, canonical,
|
|
73
|
+
* robots, OpenGraph, Twitter, hreflang, JSON-LD. Resolves fallbacks for
|
|
74
|
+
* missing per-product metadata.
|
|
75
|
+
*/
|
|
51
76
|
metaTagsFor(entity: import('./meta-tags.js').MetaTagsEntityInput): import('./meta-tags.js').MetaTagsResult;
|
|
77
|
+
/**
|
|
78
|
+
* Per-bot robots directives: composed `<meta>` tags and `X-Robots-Tag`
|
|
79
|
+
* headers based on the product's resolved bot directives.
|
|
80
|
+
*/
|
|
52
81
|
robotsDirectiveFor(entity: import('./ai.js').AiSummaryInput): import('./robots.js').PerBotDirectives;
|
|
82
|
+
/** AI summary string for storefronts to render as a head meta tag or inline section. */
|
|
53
83
|
aiSummaryFor(entity: import('./ai.js').AiSummaryInput): string | null;
|
|
84
|
+
/** One markdown bullet for the channel `/llms.txt` file. */
|
|
54
85
|
llmsTxtEntryFor(entity: import('./ai.js').LlmsTxtEntryInput): string;
|
|
86
|
+
/** Platform URL of the rendered sitemap index (or one child file). Proxy at /sitemap.xml. */
|
|
55
87
|
sitemapUrl(childFile?: string): string;
|
|
88
|
+
/** Platform URL of the rendered robots.txt. Proxy at /robots.txt. */
|
|
56
89
|
robotsUrl(): string;
|
|
90
|
+
/** Platform URL of the rendered llms.txt (404 unless enabled). Proxy at /llms.txt. */
|
|
57
91
|
llmsTxtUrl(): string;
|
|
92
|
+
/** Platform URL of the IndexNow key file. Proxy at /{key}.txt. */
|
|
58
93
|
indexnowKeyUrl(): string;
|
|
94
|
+
/**
|
|
95
|
+
* Fire-and-forget 404 beacon — call from the storefront's not-found handler
|
|
96
|
+
* so the platform can suggest redirects. Never throws, never blocks.
|
|
97
|
+
*/
|
|
59
98
|
reportNotFound(path: string, options?: {
|
|
60
99
|
referrer?: string;
|
|
61
100
|
}): void;
|
package/dist/seo/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/seo/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,WAAW,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/seo/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,12 +5,43 @@ export interface UrlStrategyConfig {
|
|
|
5
5
|
urlLocaleStrategy: UrlLocaleStrategy;
|
|
6
6
|
urlLocalePrefixDefault: boolean;
|
|
7
7
|
defaultLanguageCode: string;
|
|
8
|
+
/**
|
|
9
|
+
* Segment canonical product URLs sit under. Optional on purpose: this type is
|
|
10
|
+
* public API, and a hand-built config from before the field existed must keep
|
|
11
|
+
* working — absent normalizes to `products`, the previous hardcoded value.
|
|
12
|
+
*/
|
|
8
13
|
productPathSegment?: string | null;
|
|
14
|
+
/**
|
|
15
|
+
* Path prefix the storefront serves ALL commerce routes under, e.g. `/store`.
|
|
16
|
+
* Applies to products and collections, never to CMS pages — the same rule
|
|
17
|
+
* the routes manifest applies. Optional for the same compatibility reason.
|
|
18
|
+
*/
|
|
9
19
|
commercePathPrefix?: string | null;
|
|
20
|
+
/** Per-language `commercePathPrefix` overrides, `{ nl: '/winkel' }`. */
|
|
10
21
|
commercePathPrefixTranslations?: Record<string, string> | null;
|
|
11
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Resolve the URL-strategy config from the channel's customFields. Throws a
|
|
25
|
+
* structured error when `storefrontUrl` is missing — canonical URLs must be
|
|
26
|
+
* absolute so there's no safe default.
|
|
27
|
+
*/
|
|
12
28
|
export declare function readUrlStrategy(ctx: StoreContext): UrlStrategyConfig;
|
|
29
|
+
/**
|
|
30
|
+
* {@link readUrlStrategy} for a channel read from anywhere — e.g. a fresh
|
|
31
|
+
* `activeChannel` query, whose custom fields can be newer than the snapshot the
|
|
32
|
+
* client took at startup.
|
|
33
|
+
*/
|
|
13
34
|
export declare function urlStrategyFromChannel(customFields: ChannelCustomFields | null | undefined, defaultLanguageCode: string): UrlStrategyConfig;
|
|
35
|
+
/**
|
|
36
|
+
* The commerce path prefix for a locale: the per-language override when one
|
|
37
|
+
* exists, else the channel default. Mirrors `RoutesService.applyCommercePrefix`
|
|
38
|
+
* exactly, including that an empty string disables prefixing for that locale.
|
|
39
|
+
*/
|
|
14
40
|
export declare function commercePrefixFor(cfg: UrlStrategyConfig, locale: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Compose an absolute URL for a given path (segments) and locale, respecting
|
|
43
|
+
* the channel's URL-locale strategy. Segments are joined with `/` and
|
|
44
|
+
* individually encoded; empty segments are dropped.
|
|
45
|
+
*/
|
|
15
46
|
export declare function buildUrl(cfg: UrlStrategyConfig, segments: string[], locale?: string): string;
|
|
16
47
|
//# sourceMappingURL=url-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url-builder.d.ts","sourceRoot":"","sources":["../../src/seo/url-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,sBAAsB,EAAE,OAAO,CAAC;IAChC,mBAAmB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"url-builder.d.ts","sourceRoot":"","sources":["../../src/seo/url-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,sBAAsB,EAAE,OAAO,CAAC;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,wEAAwE;IACxE,8BAA8B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CAChE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,YAAY,GAAG,iBAAiB,CAEpE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,EACpD,mBAAmB,EAAE,MAAM,GAC1B,iBAAiB,CA2BnB;AAsBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAOhF;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAwC5F"}
|
package/dist/seo/url-builder.js
CHANGED
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
import { StorefrontError } from '../errors.js';
|
|
2
2
|
import { toDnsLabel } from './locale-tag.js';
|
|
3
3
|
import { normalizeProductPathSegment } from './product-path.js';
|
|
4
|
+
/**
|
|
5
|
+
* Resolve the URL-strategy config from the channel's customFields. Throws a
|
|
6
|
+
* structured error when `storefrontUrl` is missing — canonical URLs must be
|
|
7
|
+
* absolute so there's no safe default.
|
|
8
|
+
*/
|
|
4
9
|
export function readUrlStrategy(ctx) {
|
|
5
10
|
return urlStrategyFromChannel(ctx.channel.customFields, ctx.channel.defaultLanguageCode);
|
|
6
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* {@link readUrlStrategy} for a channel read from anywhere — e.g. a fresh
|
|
14
|
+
* `activeChannel` query, whose custom fields can be newer than the snapshot the
|
|
15
|
+
* client took at startup.
|
|
16
|
+
*/
|
|
7
17
|
export function urlStrategyFromChannel(customFields, defaultLanguageCode) {
|
|
8
18
|
const cf = customFields ?? {};
|
|
9
19
|
const storefrontUrl = typeof cf.storefrontUrl === 'string' ? cf.storefrontUrl.trim() : '';
|
|
@@ -24,6 +34,11 @@ export function urlStrategyFromChannel(customFields, defaultLanguageCode) {
|
|
|
24
34
|
: null),
|
|
25
35
|
};
|
|
26
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Parse the JSON-encoded per-language prefix overrides. Invalid JSON yields
|
|
39
|
+
* null rather than throwing — a malformed channel setting must not take the
|
|
40
|
+
* canonical URL down with it.
|
|
41
|
+
*/
|
|
27
42
|
function parsePrefixTranslations(raw) {
|
|
28
43
|
if (!raw)
|
|
29
44
|
return null;
|
|
@@ -42,6 +57,11 @@ function parsePrefixTranslations(raw) {
|
|
|
42
57
|
return null;
|
|
43
58
|
}
|
|
44
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* The commerce path prefix for a locale: the per-language override when one
|
|
62
|
+
* exists, else the channel default. Mirrors `RoutesService.applyCommercePrefix`
|
|
63
|
+
* exactly, including that an empty string disables prefixing for that locale.
|
|
64
|
+
*/
|
|
45
65
|
export function commercePrefixFor(cfg, locale) {
|
|
46
66
|
const translations = cfg.commercePathPrefixTranslations;
|
|
47
67
|
const raw = translations && Object.hasOwn(translations, locale)
|
|
@@ -49,6 +69,11 @@ export function commercePrefixFor(cfg, locale) {
|
|
|
49
69
|
: cfg.commercePathPrefix;
|
|
50
70
|
return (raw ?? '').replace(/\/+$/, '');
|
|
51
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Compose an absolute URL for a given path (segments) and locale, respecting
|
|
74
|
+
* the channel's URL-locale strategy. Segments are joined with `/` and
|
|
75
|
+
* individually encoded; empty segments are dropped.
|
|
76
|
+
*/
|
|
52
77
|
export function buildUrl(cfg, segments, locale) {
|
|
53
78
|
const resolvedLocale = locale ?? cfg.defaultLanguageCode;
|
|
54
79
|
const clean = segments
|
|
@@ -57,16 +82,27 @@ export function buildUrl(cfg, segments, locale) {
|
|
|
57
82
|
.map((s) => encodeURI(s));
|
|
58
83
|
const path = clean.length > 0 ? `/${clean.join('/')}` : '';
|
|
59
84
|
const isDefault = resolvedLocale === cfg.defaultLanguageCode;
|
|
85
|
+
// A blank locale emits no segment at all. The previous implementation got this
|
|
86
|
+
// for free because it tested the encoded prefix STRING for emptiness; deriving
|
|
87
|
+
// the flag from `isDefault` alone would turn `locale: ''` into `//path` and, in
|
|
88
|
+
// subdomain mode, the invalid host `https://.example.com`. `??` above does not
|
|
89
|
+
// catch `''`, and this is published API a caller may reach with `locale ?? ''`.
|
|
60
90
|
const emitLocale = resolvedLocale !== '' && (!isDefault || cfg.urlLocalePrefixDefault);
|
|
61
91
|
switch (cfg.urlLocaleStrategy) {
|
|
62
92
|
case 'path-prefix': {
|
|
93
|
+
// The PATH segment keeps the raw Vendure spelling (`/en_GB/...`): the
|
|
94
|
+
// storefront reads this segment back out and passes it straight to the
|
|
95
|
+
// commerce and CMS APIs, which key on the Vendure code.
|
|
63
96
|
const localePart = emitLocale ? `/${encodeURIComponent(resolvedLocale)}` : '';
|
|
64
97
|
return `${cfg.storefrontUrl}${localePart}${path}`;
|
|
65
98
|
}
|
|
66
99
|
case 'subdomain': {
|
|
67
100
|
if (!emitLocale)
|
|
68
101
|
return `${cfg.storefrontUrl}${path}`;
|
|
102
|
+
// A hostname label may not contain `_`, so a region tag has to be
|
|
103
|
+
// hyphenated and lower-cased here: `en_GB` → `en-gb.example.com`.
|
|
69
104
|
const label = encodeURIComponent(toDnsLabel(resolvedLocale));
|
|
105
|
+
// Insert subdomain after the protocol: https://host → https://nl.host
|
|
70
106
|
return (cfg.storefrontUrl.replace(/^(https?:\/\/)([^/]+)/, (_match, scheme, host) => `${scheme}${label}.${host}`) + path);
|
|
71
107
|
}
|
|
72
108
|
case 'none':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url-builder.js","sourceRoot":"","sources":["../../src/seo/url-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"url-builder.js","sourceRoot":"","sources":["../../src/seo/url-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAwBhE;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,GAAiB;IAC/C,OAAO,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAC3F,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,YAAoD,EACpD,mBAA2B;IAE3B,MAAM,EAAE,GAAG,YAAY,IAAI,EAAE,CAAC;IAC9B,MAAM,aAAa,GAAG,OAAO,EAAE,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,eAAe,CACvB,2HAA2H,EAC3H,KAAK,CACN,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,EAAE,CAAC,iBAAiB,CAAC;IACtC,MAAM,iBAAiB,GACrB,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC;IAC7E,OAAO;QACL,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAChD,iBAAiB;QACjB,sBAAsB,EAAE,EAAE,CAAC,sBAAsB,KAAK,IAAI;QAC1D,mBAAmB;QACnB,kBAAkB,EAAE,2BAA2B,CAC7C,OAAO,EAAE,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CACzE;QACD,kBAAkB,EAAE,OAAO,EAAE,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI;QAC5F,8BAA8B,EAAE,uBAAuB,CACrD,OAAO,EAAE,CAAC,8BAA8B,KAAK,QAAQ;YACnD,CAAC,CAAC,EAAE,CAAC,8BAA8B;YACnC,CAAC,CAAC,IAAI,CACT;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,GAAkB;IACjD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAChF,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAiC,CAAC,EAAE,CAAC;YAC7E,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAClD,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAsB,EAAE,MAAc;IACtE,MAAM,YAAY,GAAG,GAAG,CAAC,8BAA8B,CAAC;IACxD,MAAM,GAAG,GACP,YAAY,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC;QACjD,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC;QACtB,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC7B,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAsB,EAAE,QAAkB,EAAE,MAAe;IAClF,MAAM,cAAc,GAAG,MAAM,IAAI,GAAG,CAAC,mBAAmB,CAAC;IACzD,MAAM,KAAK,GAAG,QAAQ;SACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;SAC9C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3D,MAAM,SAAS,GAAG,cAAc,KAAK,GAAG,CAAC,mBAAmB,CAAC;IAC7D,+EAA+E;IAC/E,+EAA+E;IAC/E,gFAAgF;IAChF,+EAA+E;IAC/E,gFAAgF;IAChF,MAAM,UAAU,GAAG,cAAc,KAAK,EAAE,IAAI,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAEvF,QAAQ,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC9B,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,sEAAsE;YACtE,uEAAuE;YACvE,wDAAwD;YACxD,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9E,OAAO,GAAG,GAAG,CAAC,aAAa,GAAG,UAAU,GAAG,IAAI,EAAE,CAAC;QACpD,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,UAAU;gBAAE,OAAO,GAAG,GAAG,CAAC,aAAa,GAAG,IAAI,EAAE,CAAC;YACtD,kEAAkE;YAClE,kEAAkE;YAClE,MAAM,KAAK,GAAG,kBAAkB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;YAC7D,sEAAsE;YACtE,OAAO,CACL,GAAG,CAAC,aAAa,CAAC,OAAO,CACvB,uBAAuB,EACvB,CAAC,MAAM,EAAE,MAAc,EAAE,IAAY,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,KAAK,IAAI,IAAI,EAAE,CACtE,GAAG,IAAI,CACT,CAAC;QACJ,CAAC;QACD,KAAK,MAAM;YACT,OAAO,GAAG,GAAG,CAAC,aAAa,GAAG,IAAI,EAAE,CAAC;IACzC,CAAC;AACH,CAAC"}
|