@wix/headless-localization-utils 1.0.10 → 1.0.12
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/build/index.cjs +30 -13
- package/build/index.cjs.map +1 -1
- package/build/index.js +30 -13
- package/build/index.js.map +1 -1
- package/package.json +3 -3
package/build/index.cjs
CHANGED
|
@@ -94,21 +94,29 @@ var extractLanguageFromUrlAndValidate = (url, availableLocales) => {
|
|
|
94
94
|
return localeFromQueryParams ?? localeFromSubfolder ?? localeFromSubdomain;
|
|
95
95
|
};
|
|
96
96
|
var clearLanguageFromUrl = (urlString, languageCodes) => {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
97
|
+
if (!urlString?.length) {
|
|
98
|
+
return urlString;
|
|
99
|
+
}
|
|
100
|
+
let urlObject;
|
|
101
|
+
try {
|
|
102
|
+
urlObject = new URL(urlString);
|
|
103
|
+
} catch {
|
|
104
|
+
return urlString;
|
|
105
|
+
}
|
|
106
|
+
urlObject.searchParams.delete("lang");
|
|
107
|
+
const subfolderLanguage = urlObject.pathname.split("/")[1]?.toLowerCase();
|
|
100
108
|
if (languageCodes.includes(subfolderLanguage ?? "")) {
|
|
101
|
-
const segments =
|
|
109
|
+
const segments = urlObject.pathname.split("/");
|
|
102
110
|
segments.splice(1, 1);
|
|
103
|
-
|
|
111
|
+
urlObject.pathname = segments.join("/");
|
|
104
112
|
}
|
|
105
|
-
const subdirectoryLanguage =
|
|
113
|
+
const subdirectoryLanguage = urlObject.hostname.split(".")[0]?.toLowerCase();
|
|
106
114
|
if (languageCodes.includes(subdirectoryLanguage ?? "")) {
|
|
107
|
-
const parts =
|
|
115
|
+
const parts = urlObject.hostname.split(".");
|
|
108
116
|
parts.shift();
|
|
109
|
-
|
|
117
|
+
urlObject.hostname = parts.join(".");
|
|
110
118
|
}
|
|
111
|
-
return
|
|
119
|
+
return urlObject.href;
|
|
112
120
|
};
|
|
113
121
|
var extractFromQueryParamsAndValidate = (url, availableLocales) => {
|
|
114
122
|
return getLanguageIfExists(getLanguageFromQueryParam(url), availableLocales);
|
|
@@ -166,10 +174,19 @@ function getLocalizationData(url, header, siteProperties) {
|
|
|
166
174
|
...availableLocales.map((locale2) => locale2.locale?.languageCode),
|
|
167
175
|
siteProperties?.locale?.languageCode
|
|
168
176
|
].filter((languageCode) => Boolean(languageCode));
|
|
169
|
-
const
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
177
|
+
const cookieLocale = calculateLocaleFromMultilingualCookie(
|
|
178
|
+
header,
|
|
179
|
+
availableLocales
|
|
180
|
+
);
|
|
181
|
+
const visitorPrimaryLanguage = siteProperties?.multilingual?.supportedLanguages?.find(
|
|
182
|
+
({ isVisitorPrimary }) => isVisitorPrimary
|
|
183
|
+
);
|
|
184
|
+
const primaryLanguage = siteProperties?.multilingual?.supportedLanguages?.find(
|
|
185
|
+
({ isPrimary }) => isPrimary
|
|
186
|
+
);
|
|
187
|
+
const language = explicitRequestedLocale?.languageCode ?? cookieLocale?.languageCode ?? visitorPrimaryLanguage?.languageCode ?? primaryLanguage?.languageCode ?? siteProperties?.language ?? void 0;
|
|
188
|
+
const resolvedLocale = explicitRequestedLocale?.locale ?? cookieLocale?.locale ?? visitorPrimaryLanguage?.locale ?? primaryLanguage?.locale ?? siteProperties?.locale ?? void 0;
|
|
189
|
+
const locale = buildLocaleString(resolvedLocale);
|
|
173
190
|
const cleanUrl = clearLanguageFromUrl(url.href, languageCodes);
|
|
174
191
|
const essentials = {
|
|
175
192
|
language,
|
package/build/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/localeUtils.ts","../src/urlUtils.ts","../src/languageHeaderUtils.ts","../src/localizationUtils.ts"],"sourcesContent":["export {\n getLocalizationData,\n type LocalizationData,\n MULTILINGUAL_COOKIE_HEADER_KEY,\n} from './localizationUtils.js';\n\nexport { applyLanguageToUrl, clearLanguageFromUrl } from './urlUtils.js';\n","import type { scripts } from '@wix/headless-site-assets';\n\n// Type for locale object\nexport type Locale = scripts.Locale;\n\n// Type for locale string building\nexport const buildLocaleString = (\n locale?: null | Locale,\n): string | undefined => {\n if (!locale) {\n return;\n }\n\n // in case of dialects, language code will be in the form of\n // en-au and not just en\n if (locale.languageCode?.includes('-')) {\n return locale.languageCode;\n }\n\n const localeParts = [locale.languageCode, locale.country].filter(Boolean);\n\n if (localeParts.length === 0) {\n return;\n }\n\n return localeParts.join('-');\n};\n","import type { scripts } from '@wix/headless-site-assets';\n\nexport type SupportedLanguage = scripts.SupportedLanguage;\n\ntype AvailableLocale = SupportedLanguage;\n\nconst getLanguageFromQueryParam = (url: URL) =>\n url.searchParams.get('lang') ?? undefined;\nconst getLanguageFromSubfolder = (url: URL) => url.pathname.split('/')[1];\nconst getLanguageFromSubdomain = (url: URL) => url.hostname.split('.')[0];\n\nconst applyQueryParamLanguage = (url: URL, languageCode: string) => {\n url.searchParams.set('lang', languageCode);\n};\n\nconst applySubdomainLanguage = (url: URL, languageCode: string) => {\n let hostnameParts = url.hostname.split('.');\n if (hostnameParts[0] === 'www') {\n hostnameParts = hostnameParts.slice(1);\n }\n hostnameParts = [languageCode, ...hostnameParts];\n url.hostname = hostnameParts.join('.');\n};\n\nconst applySubfolderLanguage = (url: URL, languageCode: string) => {\n url.pathname = `/${languageCode}${url.pathname}`;\n};\n\nexport const applyLanguageToUrl = (\n url: string,\n language: AvailableLocale,\n): string => {\n if (!language.languageCode || !language?.resolutionMethod) {\n return url;\n }\n\n const urlObj = new URL(url);\n const applyFunc =\n language?.resolutionMethod === 'QUERY_PARAM'\n ? applyQueryParamLanguage\n : language?.resolutionMethod === 'SUBDOMAIN'\n ? applySubdomainLanguage\n : applySubfolderLanguage;\n\n applyFunc(urlObj, language.languageCode);\n return urlObj.href;\n};\n\nexport const extractLanguageFromUrlAndValidate = (\n url: URL,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n const localeFromQueryParams = extractFromQueryParamsAndValidate(\n url,\n availableLocales,\n );\n if (localeFromQueryParams?.resolutionMethod === 'QUERY_PARAM') {\n return localeFromQueryParams;\n }\n\n const localeFromSubfolder = extractFromSubfolderAndValidate(\n url,\n availableLocales,\n );\n if (localeFromSubfolder?.resolutionMethod === 'SUBDIRECTORY') {\n return localeFromSubfolder;\n }\n\n const localeFromSubdomain = extractFromSubdomainAndValidate(\n url,\n availableLocales,\n );\n if (localeFromSubdomain?.resolutionMethod === 'SUBDOMAIN') {\n return localeFromSubdomain;\n }\n\n // Fallback if a locale is available but doesn't have the correct resolution method\n return localeFromQueryParams ?? localeFromSubfolder ?? localeFromSubdomain;\n};\n\nexport const clearLanguageFromUrl = (\n urlString: string,\n languageCodes: string[],\n): string => {\n const url = new URL(urlString);\n url.searchParams.delete('lang');\n\n const subfolderLanguage = url.pathname.split('/')[1]?.toLowerCase();\n if (languageCodes.includes(subfolderLanguage ?? '')) {\n const segments = url.pathname.split('/'); // ['', 'en', 'docs', 'api']\n segments.splice(1, 1); // Remove index 1\n url.pathname = segments.join('/');\n }\n\n const subdirectoryLanguage = url.hostname.split('.')[0]?.toLowerCase();\n if (languageCodes.includes(subdirectoryLanguage ?? '')) {\n const parts = url.hostname.split('.'); // ['fr', 'example', 'com']\n parts.shift(); // ['example', 'com']\n url.hostname = parts.join('.');\n }\n\n return url.href;\n};\n\n// https://somesite.com/hello?lang:XX\nconst extractFromQueryParamsAndValidate = (\n url: URL,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n return getLanguageIfExists(getLanguageFromQueryParam(url), availableLocales);\n};\n\n// https://somesite.com/XX/hello\nconst extractFromSubfolderAndValidate = (\n url: URL,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n return getLanguageIfExists(getLanguageFromSubfolder(url), availableLocales);\n};\n\n// https://XX.somesite.com/hello\nconst extractFromSubdomainAndValidate = (\n url: URL,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n return getLanguageIfExists(getLanguageFromSubdomain(url), availableLocales);\n};\n\nconst getLanguageIfExists = (\n languageCode: string | undefined,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n if (languageCode == null) {\n return undefined;\n }\n const lowerCasedCode = languageCode.toLowerCase();\n return availableLocales.find(\n (locale) => locale.locale?.languageCode?.toLowerCase() === lowerCasedCode,\n );\n};\n","import type { scripts } from '@wix/headless-site-assets';\nimport {\n MULTILINGUAL_COOKIE_HEADER_KEY,\n WixLanguage,\n} from './localizationUtils.js';\n\nexport const calculateLocaleFromMultilingualCookie = (\n headers: Headers,\n supportedLanguages: scripts.SupportedLanguage[],\n) => {\n if (!supportedLanguages.length) {\n return undefined;\n }\n\n const languageCode = getWixLanguageFromCookie(headers)?.languageCode;\n if (!languageCode) {\n return undefined;\n }\n return supportedLanguages.find(\n (supportedLanguage) => supportedLanguage.languageCode === languageCode,\n );\n};\n\nconst getWixLanguageFromCookie = (\n headers: Headers,\n): WixLanguage | undefined => {\n try {\n const cookies = headers.get('cookie') ?? undefined;\n\n const languageCookie = cookies\n ?.split(';')\n .find((keyValue) =>\n keyValue.trim().startsWith(`${MULTILINGUAL_COOKIE_HEADER_KEY}=`),\n );\n\n return languageCookie\n ? { languageCode: languageCookie.split('=')[1] }\n : undefined;\n } catch {\n return undefined;\n }\n};\n","import type { Essentials, Multilingual } from '@wix/headless-node';\nimport type { scripts } from '@wix/headless-site-assets';\nimport { buildLocaleString } from './localeUtils.js';\nimport {\n clearLanguageFromUrl,\n extractLanguageFromUrlAndValidate,\n} from './urlUtils.js';\nimport { calculateLocaleFromMultilingualCookie } from './languageHeaderUtils.js';\n\nexport type EssentialProperties = scripts.EssentialProperties;\nexport const MULTILINGUAL_COOKIE_HEADER_KEY = `wixLanguage`;\nexport interface WixLanguage {\n languageCode?: string;\n}\n\nexport type LocalizationData = {\n cleanUrl: string;\n essentials: Essentials;\n};\n\nexport function getLocalizationData(\n url: URL,\n header: Headers,\n siteProperties: EssentialProperties,\n): LocalizationData {\n const availableLocales =\n siteProperties?.multilingual?.supportedLanguages ?? [];\n const explicitRequestedLocale = extractLanguageFromUrlAndValidate(\n url,\n availableLocales,\n );\n\n const languageCodes = [\n ...availableLocales.map((locale) => locale.locale?.languageCode),\n siteProperties?.locale?.languageCode,\n ].filter((languageCode) => Boolean(languageCode)) as string[];\n\n const locale =\n buildLocaleString(\n explicitRequestedLocale?.locale ??\n calculateLocaleFromMultilingualCookie(header, availableLocales)\n ?.locale ??\n siteProperties?.locale,\n ) ?? undefined;\n\n const language =\n explicitRequestedLocale?.languageCode ??\n calculateLocaleFromMultilingualCookie(header, availableLocales)\n ?.languageCode ??\n siteProperties?.language ??\n undefined;\n\n const cleanUrl = clearLanguageFromUrl(url.href, languageCodes);\n\n const essentials: Essentials = {\n language,\n locale,\n multilingual: siteProperties?.multilingual as Multilingual | undefined,\n timezone: siteProperties?.timeZone ?? undefined,\n };\n\n return { cleanUrl, essentials };\n}\n"],"mappings":"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","names":["locale"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/localeUtils.ts","../src/urlUtils.ts","../src/languageHeaderUtils.ts","../src/localizationUtils.ts"],"sourcesContent":["export {\n getLocalizationData,\n type LocalizationData,\n MULTILINGUAL_COOKIE_HEADER_KEY,\n} from './localizationUtils.js';\n\nexport { applyLanguageToUrl, clearLanguageFromUrl } from './urlUtils.js';\n","import type { scripts } from '@wix/headless-site-assets';\n\n// Type for locale object\nexport type Locale = scripts.Locale;\n\n// Type for locale string building\nexport const buildLocaleString = (\n locale?: null | Locale,\n): string | undefined => {\n if (!locale) {\n return;\n }\n\n // in case of dialects, language code will be in the form of\n // en-au and not just en\n if (locale.languageCode?.includes('-')) {\n return locale.languageCode;\n }\n\n const localeParts = [locale.languageCode, locale.country].filter(Boolean);\n\n if (localeParts.length === 0) {\n return;\n }\n\n return localeParts.join('-');\n};\n","import type { scripts } from '@wix/headless-site-assets';\n\nexport type SupportedLanguage = scripts.SupportedLanguage;\n\ntype AvailableLocale = SupportedLanguage;\n\nconst getLanguageFromQueryParam = (url: URL) =>\n url.searchParams.get('lang') ?? undefined;\nconst getLanguageFromSubfolder = (url: URL) => url.pathname.split('/')[1];\nconst getLanguageFromSubdomain = (url: URL) => url.hostname.split('.')[0];\n\nconst applyQueryParamLanguage = (url: URL, languageCode: string) => {\n url.searchParams.set('lang', languageCode);\n};\n\nconst applySubdomainLanguage = (url: URL, languageCode: string) => {\n let hostnameParts = url.hostname.split('.');\n if (hostnameParts[0] === 'www') {\n hostnameParts = hostnameParts.slice(1);\n }\n hostnameParts = [languageCode, ...hostnameParts];\n url.hostname = hostnameParts.join('.');\n};\n\nconst applySubfolderLanguage = (url: URL, languageCode: string) => {\n url.pathname = `/${languageCode}${url.pathname}`;\n};\n\nexport const applyLanguageToUrl = (\n url: string,\n language: AvailableLocale,\n): string => {\n if (!language.languageCode || !language?.resolutionMethod) {\n return url;\n }\n\n const urlObj = new URL(url);\n const applyFunc =\n language?.resolutionMethod === 'QUERY_PARAM'\n ? applyQueryParamLanguage\n : language?.resolutionMethod === 'SUBDOMAIN'\n ? applySubdomainLanguage\n : applySubfolderLanguage;\n\n applyFunc(urlObj, language.languageCode);\n return urlObj.href;\n};\n\nexport const extractLanguageFromUrlAndValidate = (\n url: URL,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n const localeFromQueryParams = extractFromQueryParamsAndValidate(\n url,\n availableLocales,\n );\n if (localeFromQueryParams?.resolutionMethod === 'QUERY_PARAM') {\n return localeFromQueryParams;\n }\n\n const localeFromSubfolder = extractFromSubfolderAndValidate(\n url,\n availableLocales,\n );\n if (localeFromSubfolder?.resolutionMethod === 'SUBDIRECTORY') {\n return localeFromSubfolder;\n }\n\n const localeFromSubdomain = extractFromSubdomainAndValidate(\n url,\n availableLocales,\n );\n if (localeFromSubdomain?.resolutionMethod === 'SUBDOMAIN') {\n return localeFromSubdomain;\n }\n\n // Fallback if a locale is available but doesn't have the correct resolution method\n return localeFromQueryParams ?? localeFromSubfolder ?? localeFromSubdomain;\n};\n\nexport const clearLanguageFromUrl = (\n urlString: string,\n languageCodes: string[],\n): string => {\n if (!urlString?.length) {\n return urlString;\n }\n\n let urlObject: URL;\n\n try {\n urlObject = new URL(urlString);\n } catch {\n return urlString;\n }\n\n urlObject.searchParams.delete('lang');\n\n const subfolderLanguage = urlObject.pathname.split('/')[1]?.toLowerCase();\n if (languageCodes.includes(subfolderLanguage ?? '')) {\n const segments = urlObject.pathname.split('/'); // ['', 'en', 'docs', 'api']\n segments.splice(1, 1); // Remove index 1\n urlObject.pathname = segments.join('/');\n }\n\n const subdirectoryLanguage = urlObject.hostname.split('.')[0]?.toLowerCase();\n if (languageCodes.includes(subdirectoryLanguage ?? '')) {\n const parts = urlObject.hostname.split('.'); // ['fr', 'example', 'com']\n parts.shift(); // ['example', 'com']\n urlObject.hostname = parts.join('.');\n }\n\n return urlObject.href;\n};\n\n// https://somesite.com/hello?lang:XX\nconst extractFromQueryParamsAndValidate = (\n url: URL,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n return getLanguageIfExists(getLanguageFromQueryParam(url), availableLocales);\n};\n\n// https://somesite.com/XX/hello\nconst extractFromSubfolderAndValidate = (\n url: URL,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n return getLanguageIfExists(getLanguageFromSubfolder(url), availableLocales);\n};\n\n// https://XX.somesite.com/hello\nconst extractFromSubdomainAndValidate = (\n url: URL,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n return getLanguageIfExists(getLanguageFromSubdomain(url), availableLocales);\n};\n\nconst getLanguageIfExists = (\n languageCode: string | undefined,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n if (languageCode == null) {\n return undefined;\n }\n const lowerCasedCode = languageCode.toLowerCase();\n return availableLocales.find(\n (locale) => locale.locale?.languageCode?.toLowerCase() === lowerCasedCode,\n );\n};\n","import type { scripts } from '@wix/headless-site-assets';\nimport {\n MULTILINGUAL_COOKIE_HEADER_KEY,\n WixLanguage,\n} from './localizationUtils.js';\n\nexport const calculateLocaleFromMultilingualCookie = (\n headers: Headers,\n supportedLanguages: scripts.SupportedLanguage[],\n) => {\n if (!supportedLanguages.length) {\n return undefined;\n }\n\n const languageCode = getWixLanguageFromCookie(headers)?.languageCode;\n if (!languageCode) {\n return undefined;\n }\n return supportedLanguages.find(\n (supportedLanguage) => supportedLanguage.languageCode === languageCode,\n );\n};\n\nconst getWixLanguageFromCookie = (\n headers: Headers,\n): WixLanguage | undefined => {\n try {\n const cookies = headers.get('cookie') ?? undefined;\n\n const languageCookie = cookies\n ?.split(';')\n .find((keyValue) =>\n keyValue.trim().startsWith(`${MULTILINGUAL_COOKIE_HEADER_KEY}=`),\n );\n\n return languageCookie\n ? { languageCode: languageCookie.split('=')[1] }\n : undefined;\n } catch {\n return undefined;\n }\n};\n","import type { Essentials, Multilingual } from '@wix/headless-node';\nimport type { scripts } from '@wix/headless-site-assets';\nimport { buildLocaleString } from './localeUtils.js';\nimport {\n clearLanguageFromUrl,\n extractLanguageFromUrlAndValidate,\n} from './urlUtils.js';\nimport { calculateLocaleFromMultilingualCookie } from './languageHeaderUtils.js';\n\nexport type EssentialProperties = scripts.EssentialProperties;\nexport const MULTILINGUAL_COOKIE_HEADER_KEY = `wixLanguage`;\nexport interface WixLanguage {\n languageCode?: string;\n}\n\nexport type LocalizationData = {\n cleanUrl: string;\n essentials: Essentials;\n};\n\nexport function getLocalizationData(\n url: URL,\n header: Headers,\n siteProperties: EssentialProperties,\n): LocalizationData {\n const availableLocales =\n siteProperties?.multilingual?.supportedLanguages ?? [];\n const explicitRequestedLocale = extractLanguageFromUrlAndValidate(\n url,\n availableLocales,\n );\n\n const languageCodes = [\n ...availableLocales.map((locale) => locale.locale?.languageCode),\n siteProperties?.locale?.languageCode,\n ].filter((languageCode) => Boolean(languageCode)) as string[];\n\n const cookieLocale = calculateLocaleFromMultilingualCookie(\n header,\n availableLocales,\n );\n const visitorPrimaryLanguage =\n siteProperties?.multilingual?.supportedLanguages?.find(\n ({ isVisitorPrimary }) => isVisitorPrimary,\n );\n\n const primaryLanguage =\n siteProperties?.multilingual?.supportedLanguages?.find(\n ({ isPrimary }) => isPrimary,\n );\n\n const language =\n explicitRequestedLocale?.languageCode ??\n cookieLocale?.languageCode ??\n visitorPrimaryLanguage?.languageCode ??\n primaryLanguage?.languageCode ??\n siteProperties?.language ??\n undefined;\n\n const resolvedLocale =\n explicitRequestedLocale?.locale ??\n cookieLocale?.locale ??\n visitorPrimaryLanguage?.locale ??\n primaryLanguage?.locale ??\n siteProperties?.locale ??\n undefined;\n\n const locale = buildLocaleString(resolvedLocale);\n\n const cleanUrl = clearLanguageFromUrl(url.href, languageCodes);\n\n const essentials: Essentials = {\n language,\n locale,\n multilingual: siteProperties?.multilingual as Multilingual | undefined,\n timezone: siteProperties?.timeZone ?? undefined,\n };\n\n return { cleanUrl, essentials };\n}\n"],"mappings":"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","names":["locale"]}
|
package/build/index.js
CHANGED
|
@@ -65,21 +65,29 @@ var extractLanguageFromUrlAndValidate = (url, availableLocales) => {
|
|
|
65
65
|
return localeFromQueryParams ?? localeFromSubfolder ?? localeFromSubdomain;
|
|
66
66
|
};
|
|
67
67
|
var clearLanguageFromUrl = (urlString, languageCodes) => {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
if (!urlString?.length) {
|
|
69
|
+
return urlString;
|
|
70
|
+
}
|
|
71
|
+
let urlObject;
|
|
72
|
+
try {
|
|
73
|
+
urlObject = new URL(urlString);
|
|
74
|
+
} catch {
|
|
75
|
+
return urlString;
|
|
76
|
+
}
|
|
77
|
+
urlObject.searchParams.delete("lang");
|
|
78
|
+
const subfolderLanguage = urlObject.pathname.split("/")[1]?.toLowerCase();
|
|
71
79
|
if (languageCodes.includes(subfolderLanguage ?? "")) {
|
|
72
|
-
const segments =
|
|
80
|
+
const segments = urlObject.pathname.split("/");
|
|
73
81
|
segments.splice(1, 1);
|
|
74
|
-
|
|
82
|
+
urlObject.pathname = segments.join("/");
|
|
75
83
|
}
|
|
76
|
-
const subdirectoryLanguage =
|
|
84
|
+
const subdirectoryLanguage = urlObject.hostname.split(".")[0]?.toLowerCase();
|
|
77
85
|
if (languageCodes.includes(subdirectoryLanguage ?? "")) {
|
|
78
|
-
const parts =
|
|
86
|
+
const parts = urlObject.hostname.split(".");
|
|
79
87
|
parts.shift();
|
|
80
|
-
|
|
88
|
+
urlObject.hostname = parts.join(".");
|
|
81
89
|
}
|
|
82
|
-
return
|
|
90
|
+
return urlObject.href;
|
|
83
91
|
};
|
|
84
92
|
var extractFromQueryParamsAndValidate = (url, availableLocales) => {
|
|
85
93
|
return getLanguageIfExists(getLanguageFromQueryParam(url), availableLocales);
|
|
@@ -137,10 +145,19 @@ function getLocalizationData(url, header, siteProperties) {
|
|
|
137
145
|
...availableLocales.map((locale2) => locale2.locale?.languageCode),
|
|
138
146
|
siteProperties?.locale?.languageCode
|
|
139
147
|
].filter((languageCode) => Boolean(languageCode));
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
148
|
+
const cookieLocale = calculateLocaleFromMultilingualCookie(
|
|
149
|
+
header,
|
|
150
|
+
availableLocales
|
|
151
|
+
);
|
|
152
|
+
const visitorPrimaryLanguage = siteProperties?.multilingual?.supportedLanguages?.find(
|
|
153
|
+
({ isVisitorPrimary }) => isVisitorPrimary
|
|
154
|
+
);
|
|
155
|
+
const primaryLanguage = siteProperties?.multilingual?.supportedLanguages?.find(
|
|
156
|
+
({ isPrimary }) => isPrimary
|
|
157
|
+
);
|
|
158
|
+
const language = explicitRequestedLocale?.languageCode ?? cookieLocale?.languageCode ?? visitorPrimaryLanguage?.languageCode ?? primaryLanguage?.languageCode ?? siteProperties?.language ?? void 0;
|
|
159
|
+
const resolvedLocale = explicitRequestedLocale?.locale ?? cookieLocale?.locale ?? visitorPrimaryLanguage?.locale ?? primaryLanguage?.locale ?? siteProperties?.locale ?? void 0;
|
|
160
|
+
const locale = buildLocaleString(resolvedLocale);
|
|
144
161
|
const cleanUrl = clearLanguageFromUrl(url.href, languageCodes);
|
|
145
162
|
const essentials = {
|
|
146
163
|
language,
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/localeUtils.ts","../src/urlUtils.ts","../src/languageHeaderUtils.ts","../src/localizationUtils.ts"],"sourcesContent":["import type { scripts } from '@wix/headless-site-assets';\n\n// Type for locale object\nexport type Locale = scripts.Locale;\n\n// Type for locale string building\nexport const buildLocaleString = (\n locale?: null | Locale,\n): string | undefined => {\n if (!locale) {\n return;\n }\n\n // in case of dialects, language code will be in the form of\n // en-au and not just en\n if (locale.languageCode?.includes('-')) {\n return locale.languageCode;\n }\n\n const localeParts = [locale.languageCode, locale.country].filter(Boolean);\n\n if (localeParts.length === 0) {\n return;\n }\n\n return localeParts.join('-');\n};\n","import type { scripts } from '@wix/headless-site-assets';\n\nexport type SupportedLanguage = scripts.SupportedLanguage;\n\ntype AvailableLocale = SupportedLanguage;\n\nconst getLanguageFromQueryParam = (url: URL) =>\n url.searchParams.get('lang') ?? undefined;\nconst getLanguageFromSubfolder = (url: URL) => url.pathname.split('/')[1];\nconst getLanguageFromSubdomain = (url: URL) => url.hostname.split('.')[0];\n\nconst applyQueryParamLanguage = (url: URL, languageCode: string) => {\n url.searchParams.set('lang', languageCode);\n};\n\nconst applySubdomainLanguage = (url: URL, languageCode: string) => {\n let hostnameParts = url.hostname.split('.');\n if (hostnameParts[0] === 'www') {\n hostnameParts = hostnameParts.slice(1);\n }\n hostnameParts = [languageCode, ...hostnameParts];\n url.hostname = hostnameParts.join('.');\n};\n\nconst applySubfolderLanguage = (url: URL, languageCode: string) => {\n url.pathname = `/${languageCode}${url.pathname}`;\n};\n\nexport const applyLanguageToUrl = (\n url: string,\n language: AvailableLocale,\n): string => {\n if (!language.languageCode || !language?.resolutionMethod) {\n return url;\n }\n\n const urlObj = new URL(url);\n const applyFunc =\n language?.resolutionMethod === 'QUERY_PARAM'\n ? applyQueryParamLanguage\n : language?.resolutionMethod === 'SUBDOMAIN'\n ? applySubdomainLanguage\n : applySubfolderLanguage;\n\n applyFunc(urlObj, language.languageCode);\n return urlObj.href;\n};\n\nexport const extractLanguageFromUrlAndValidate = (\n url: URL,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n const localeFromQueryParams = extractFromQueryParamsAndValidate(\n url,\n availableLocales,\n );\n if (localeFromQueryParams?.resolutionMethod === 'QUERY_PARAM') {\n return localeFromQueryParams;\n }\n\n const localeFromSubfolder = extractFromSubfolderAndValidate(\n url,\n availableLocales,\n );\n if (localeFromSubfolder?.resolutionMethod === 'SUBDIRECTORY') {\n return localeFromSubfolder;\n }\n\n const localeFromSubdomain = extractFromSubdomainAndValidate(\n url,\n availableLocales,\n );\n if (localeFromSubdomain?.resolutionMethod === 'SUBDOMAIN') {\n return localeFromSubdomain;\n }\n\n // Fallback if a locale is available but doesn't have the correct resolution method\n return localeFromQueryParams ?? localeFromSubfolder ?? localeFromSubdomain;\n};\n\nexport const clearLanguageFromUrl = (\n urlString: string,\n languageCodes: string[],\n): string => {\n const url = new URL(urlString);\n url.searchParams.delete('lang');\n\n const subfolderLanguage = url.pathname.split('/')[1]?.toLowerCase();\n if (languageCodes.includes(subfolderLanguage ?? '')) {\n const segments = url.pathname.split('/'); // ['', 'en', 'docs', 'api']\n segments.splice(1, 1); // Remove index 1\n url.pathname = segments.join('/');\n }\n\n const subdirectoryLanguage = url.hostname.split('.')[0]?.toLowerCase();\n if (languageCodes.includes(subdirectoryLanguage ?? '')) {\n const parts = url.hostname.split('.'); // ['fr', 'example', 'com']\n parts.shift(); // ['example', 'com']\n url.hostname = parts.join('.');\n }\n\n return url.href;\n};\n\n// https://somesite.com/hello?lang:XX\nconst extractFromQueryParamsAndValidate = (\n url: URL,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n return getLanguageIfExists(getLanguageFromQueryParam(url), availableLocales);\n};\n\n// https://somesite.com/XX/hello\nconst extractFromSubfolderAndValidate = (\n url: URL,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n return getLanguageIfExists(getLanguageFromSubfolder(url), availableLocales);\n};\n\n// https://XX.somesite.com/hello\nconst extractFromSubdomainAndValidate = (\n url: URL,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n return getLanguageIfExists(getLanguageFromSubdomain(url), availableLocales);\n};\n\nconst getLanguageIfExists = (\n languageCode: string | undefined,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n if (languageCode == null) {\n return undefined;\n }\n const lowerCasedCode = languageCode.toLowerCase();\n return availableLocales.find(\n (locale) => locale.locale?.languageCode?.toLowerCase() === lowerCasedCode,\n );\n};\n","import type { scripts } from '@wix/headless-site-assets';\nimport {\n MULTILINGUAL_COOKIE_HEADER_KEY,\n WixLanguage,\n} from './localizationUtils.js';\n\nexport const calculateLocaleFromMultilingualCookie = (\n headers: Headers,\n supportedLanguages: scripts.SupportedLanguage[],\n) => {\n if (!supportedLanguages.length) {\n return undefined;\n }\n\n const languageCode = getWixLanguageFromCookie(headers)?.languageCode;\n if (!languageCode) {\n return undefined;\n }\n return supportedLanguages.find(\n (supportedLanguage) => supportedLanguage.languageCode === languageCode,\n );\n};\n\nconst getWixLanguageFromCookie = (\n headers: Headers,\n): WixLanguage | undefined => {\n try {\n const cookies = headers.get('cookie') ?? undefined;\n\n const languageCookie = cookies\n ?.split(';')\n .find((keyValue) =>\n keyValue.trim().startsWith(`${MULTILINGUAL_COOKIE_HEADER_KEY}=`),\n );\n\n return languageCookie\n ? { languageCode: languageCookie.split('=')[1] }\n : undefined;\n } catch {\n return undefined;\n }\n};\n","import type { Essentials, Multilingual } from '@wix/headless-node';\nimport type { scripts } from '@wix/headless-site-assets';\nimport { buildLocaleString } from './localeUtils.js';\nimport {\n clearLanguageFromUrl,\n extractLanguageFromUrlAndValidate,\n} from './urlUtils.js';\nimport { calculateLocaleFromMultilingualCookie } from './languageHeaderUtils.js';\n\nexport type EssentialProperties = scripts.EssentialProperties;\nexport const MULTILINGUAL_COOKIE_HEADER_KEY = `wixLanguage`;\nexport interface WixLanguage {\n languageCode?: string;\n}\n\nexport type LocalizationData = {\n cleanUrl: string;\n essentials: Essentials;\n};\n\nexport function getLocalizationData(\n url: URL,\n header: Headers,\n siteProperties: EssentialProperties,\n): LocalizationData {\n const availableLocales =\n siteProperties?.multilingual?.supportedLanguages ?? [];\n const explicitRequestedLocale = extractLanguageFromUrlAndValidate(\n url,\n availableLocales,\n );\n\n const languageCodes = [\n ...availableLocales.map((locale) => locale.locale?.languageCode),\n siteProperties?.locale?.languageCode,\n ].filter((languageCode) => Boolean(languageCode)) as string[];\n\n const locale =\n buildLocaleString(\n explicitRequestedLocale?.locale ??\n calculateLocaleFromMultilingualCookie(header, availableLocales)\n ?.locale ??\n siteProperties?.locale,\n ) ?? undefined;\n\n const language =\n explicitRequestedLocale?.languageCode ??\n calculateLocaleFromMultilingualCookie(header, availableLocales)\n ?.languageCode ??\n siteProperties?.language ??\n undefined;\n\n const cleanUrl = clearLanguageFromUrl(url.href, languageCodes);\n\n const essentials: Essentials = {\n language,\n locale,\n multilingual: siteProperties?.multilingual as Multilingual | undefined,\n timezone: siteProperties?.timeZone ?? undefined,\n };\n\n return { cleanUrl, essentials };\n}\n"],"mappings":"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","names":["locale"]}
|
|
1
|
+
{"version":3,"sources":["../src/localeUtils.ts","../src/urlUtils.ts","../src/languageHeaderUtils.ts","../src/localizationUtils.ts"],"sourcesContent":["import type { scripts } from '@wix/headless-site-assets';\n\n// Type for locale object\nexport type Locale = scripts.Locale;\n\n// Type for locale string building\nexport const buildLocaleString = (\n locale?: null | Locale,\n): string | undefined => {\n if (!locale) {\n return;\n }\n\n // in case of dialects, language code will be in the form of\n // en-au and not just en\n if (locale.languageCode?.includes('-')) {\n return locale.languageCode;\n }\n\n const localeParts = [locale.languageCode, locale.country].filter(Boolean);\n\n if (localeParts.length === 0) {\n return;\n }\n\n return localeParts.join('-');\n};\n","import type { scripts } from '@wix/headless-site-assets';\n\nexport type SupportedLanguage = scripts.SupportedLanguage;\n\ntype AvailableLocale = SupportedLanguage;\n\nconst getLanguageFromQueryParam = (url: URL) =>\n url.searchParams.get('lang') ?? undefined;\nconst getLanguageFromSubfolder = (url: URL) => url.pathname.split('/')[1];\nconst getLanguageFromSubdomain = (url: URL) => url.hostname.split('.')[0];\n\nconst applyQueryParamLanguage = (url: URL, languageCode: string) => {\n url.searchParams.set('lang', languageCode);\n};\n\nconst applySubdomainLanguage = (url: URL, languageCode: string) => {\n let hostnameParts = url.hostname.split('.');\n if (hostnameParts[0] === 'www') {\n hostnameParts = hostnameParts.slice(1);\n }\n hostnameParts = [languageCode, ...hostnameParts];\n url.hostname = hostnameParts.join('.');\n};\n\nconst applySubfolderLanguage = (url: URL, languageCode: string) => {\n url.pathname = `/${languageCode}${url.pathname}`;\n};\n\nexport const applyLanguageToUrl = (\n url: string,\n language: AvailableLocale,\n): string => {\n if (!language.languageCode || !language?.resolutionMethod) {\n return url;\n }\n\n const urlObj = new URL(url);\n const applyFunc =\n language?.resolutionMethod === 'QUERY_PARAM'\n ? applyQueryParamLanguage\n : language?.resolutionMethod === 'SUBDOMAIN'\n ? applySubdomainLanguage\n : applySubfolderLanguage;\n\n applyFunc(urlObj, language.languageCode);\n return urlObj.href;\n};\n\nexport const extractLanguageFromUrlAndValidate = (\n url: URL,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n const localeFromQueryParams = extractFromQueryParamsAndValidate(\n url,\n availableLocales,\n );\n if (localeFromQueryParams?.resolutionMethod === 'QUERY_PARAM') {\n return localeFromQueryParams;\n }\n\n const localeFromSubfolder = extractFromSubfolderAndValidate(\n url,\n availableLocales,\n );\n if (localeFromSubfolder?.resolutionMethod === 'SUBDIRECTORY') {\n return localeFromSubfolder;\n }\n\n const localeFromSubdomain = extractFromSubdomainAndValidate(\n url,\n availableLocales,\n );\n if (localeFromSubdomain?.resolutionMethod === 'SUBDOMAIN') {\n return localeFromSubdomain;\n }\n\n // Fallback if a locale is available but doesn't have the correct resolution method\n return localeFromQueryParams ?? localeFromSubfolder ?? localeFromSubdomain;\n};\n\nexport const clearLanguageFromUrl = (\n urlString: string,\n languageCodes: string[],\n): string => {\n if (!urlString?.length) {\n return urlString;\n }\n\n let urlObject: URL;\n\n try {\n urlObject = new URL(urlString);\n } catch {\n return urlString;\n }\n\n urlObject.searchParams.delete('lang');\n\n const subfolderLanguage = urlObject.pathname.split('/')[1]?.toLowerCase();\n if (languageCodes.includes(subfolderLanguage ?? '')) {\n const segments = urlObject.pathname.split('/'); // ['', 'en', 'docs', 'api']\n segments.splice(1, 1); // Remove index 1\n urlObject.pathname = segments.join('/');\n }\n\n const subdirectoryLanguage = urlObject.hostname.split('.')[0]?.toLowerCase();\n if (languageCodes.includes(subdirectoryLanguage ?? '')) {\n const parts = urlObject.hostname.split('.'); // ['fr', 'example', 'com']\n parts.shift(); // ['example', 'com']\n urlObject.hostname = parts.join('.');\n }\n\n return urlObject.href;\n};\n\n// https://somesite.com/hello?lang:XX\nconst extractFromQueryParamsAndValidate = (\n url: URL,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n return getLanguageIfExists(getLanguageFromQueryParam(url), availableLocales);\n};\n\n// https://somesite.com/XX/hello\nconst extractFromSubfolderAndValidate = (\n url: URL,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n return getLanguageIfExists(getLanguageFromSubfolder(url), availableLocales);\n};\n\n// https://XX.somesite.com/hello\nconst extractFromSubdomainAndValidate = (\n url: URL,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n return getLanguageIfExists(getLanguageFromSubdomain(url), availableLocales);\n};\n\nconst getLanguageIfExists = (\n languageCode: string | undefined,\n availableLocales: AvailableLocale[],\n): AvailableLocale | undefined => {\n if (languageCode == null) {\n return undefined;\n }\n const lowerCasedCode = languageCode.toLowerCase();\n return availableLocales.find(\n (locale) => locale.locale?.languageCode?.toLowerCase() === lowerCasedCode,\n );\n};\n","import type { scripts } from '@wix/headless-site-assets';\nimport {\n MULTILINGUAL_COOKIE_HEADER_KEY,\n WixLanguage,\n} from './localizationUtils.js';\n\nexport const calculateLocaleFromMultilingualCookie = (\n headers: Headers,\n supportedLanguages: scripts.SupportedLanguage[],\n) => {\n if (!supportedLanguages.length) {\n return undefined;\n }\n\n const languageCode = getWixLanguageFromCookie(headers)?.languageCode;\n if (!languageCode) {\n return undefined;\n }\n return supportedLanguages.find(\n (supportedLanguage) => supportedLanguage.languageCode === languageCode,\n );\n};\n\nconst getWixLanguageFromCookie = (\n headers: Headers,\n): WixLanguage | undefined => {\n try {\n const cookies = headers.get('cookie') ?? undefined;\n\n const languageCookie = cookies\n ?.split(';')\n .find((keyValue) =>\n keyValue.trim().startsWith(`${MULTILINGUAL_COOKIE_HEADER_KEY}=`),\n );\n\n return languageCookie\n ? { languageCode: languageCookie.split('=')[1] }\n : undefined;\n } catch {\n return undefined;\n }\n};\n","import type { Essentials, Multilingual } from '@wix/headless-node';\nimport type { scripts } from '@wix/headless-site-assets';\nimport { buildLocaleString } from './localeUtils.js';\nimport {\n clearLanguageFromUrl,\n extractLanguageFromUrlAndValidate,\n} from './urlUtils.js';\nimport { calculateLocaleFromMultilingualCookie } from './languageHeaderUtils.js';\n\nexport type EssentialProperties = scripts.EssentialProperties;\nexport const MULTILINGUAL_COOKIE_HEADER_KEY = `wixLanguage`;\nexport interface WixLanguage {\n languageCode?: string;\n}\n\nexport type LocalizationData = {\n cleanUrl: string;\n essentials: Essentials;\n};\n\nexport function getLocalizationData(\n url: URL,\n header: Headers,\n siteProperties: EssentialProperties,\n): LocalizationData {\n const availableLocales =\n siteProperties?.multilingual?.supportedLanguages ?? [];\n const explicitRequestedLocale = extractLanguageFromUrlAndValidate(\n url,\n availableLocales,\n );\n\n const languageCodes = [\n ...availableLocales.map((locale) => locale.locale?.languageCode),\n siteProperties?.locale?.languageCode,\n ].filter((languageCode) => Boolean(languageCode)) as string[];\n\n const cookieLocale = calculateLocaleFromMultilingualCookie(\n header,\n availableLocales,\n );\n const visitorPrimaryLanguage =\n siteProperties?.multilingual?.supportedLanguages?.find(\n ({ isVisitorPrimary }) => isVisitorPrimary,\n );\n\n const primaryLanguage =\n siteProperties?.multilingual?.supportedLanguages?.find(\n ({ isPrimary }) => isPrimary,\n );\n\n const language =\n explicitRequestedLocale?.languageCode ??\n cookieLocale?.languageCode ??\n visitorPrimaryLanguage?.languageCode ??\n primaryLanguage?.languageCode ??\n siteProperties?.language ??\n undefined;\n\n const resolvedLocale =\n explicitRequestedLocale?.locale ??\n cookieLocale?.locale ??\n visitorPrimaryLanguage?.locale ??\n primaryLanguage?.locale ??\n siteProperties?.locale ??\n undefined;\n\n const locale = buildLocaleString(resolvedLocale);\n\n const cleanUrl = clearLanguageFromUrl(url.href, languageCodes);\n\n const essentials: Essentials = {\n language,\n locale,\n multilingual: siteProperties?.multilingual as Multilingual | undefined,\n timezone: siteProperties?.timeZone ?? undefined,\n };\n\n return { cleanUrl, essentials };\n}\n"],"mappings":"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","names":["locale"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wix/headless-localization-utils",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.12",
|
|
4
4
|
"unpkg": true,
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"typecheck": "tsc --noEmit"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@wix/headless-node": "^1.
|
|
47
|
+
"@wix/headless-node": "^1.28.0",
|
|
48
48
|
"@wix/headless-site-assets": "^1.0.9"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
@@ -74,5 +74,5 @@
|
|
|
74
74
|
]
|
|
75
75
|
}
|
|
76
76
|
},
|
|
77
|
-
"falconPackageHash": "
|
|
77
|
+
"falconPackageHash": "0abf2466015deb01e8315e3c118aa03699327e653b03c7633e4dbd9c"
|
|
78
78
|
}
|