@wix/headless-localization-utils 1.0.11 → 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 CHANGED
@@ -174,10 +174,19 @@ function getLocalizationData(url, header, siteProperties) {
174
174
  ...availableLocales.map((locale2) => locale2.locale?.languageCode),
175
175
  siteProperties?.locale?.languageCode
176
176
  ].filter((languageCode) => Boolean(languageCode));
177
- const locale = buildLocaleString(
178
- explicitRequestedLocale?.locale ?? calculateLocaleFromMultilingualCookie(header, availableLocales)?.locale ?? siteProperties?.locale
179
- ) ?? void 0;
180
- const language = explicitRequestedLocale?.languageCode ?? calculateLocaleFromMultilingualCookie(header, availableLocales)?.languageCode ?? siteProperties?.language ?? void 0;
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);
181
190
  const cleanUrl = clearLanguageFromUrl(url.href, languageCodes);
182
191
  const essentials = {
183
192
  language,
@@ -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 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 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
@@ -145,10 +145,19 @@ function getLocalizationData(url, header, siteProperties) {
145
145
  ...availableLocales.map((locale2) => locale2.locale?.languageCode),
146
146
  siteProperties?.locale?.languageCode
147
147
  ].filter((languageCode) => Boolean(languageCode));
148
- const locale = buildLocaleString(
149
- explicitRequestedLocale?.locale ?? calculateLocaleFromMultilingualCookie(header, availableLocales)?.locale ?? siteProperties?.locale
150
- ) ?? void 0;
151
- const language = explicitRequestedLocale?.languageCode ?? calculateLocaleFromMultilingualCookie(header, availableLocales)?.languageCode ?? siteProperties?.language ?? void 0;
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);
152
161
  const cleanUrl = clearLanguageFromUrl(url.href, languageCodes);
153
162
  const essentials = {
154
163
  language,
@@ -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 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 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.11",
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.27.0",
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": "6f7545553ef442e24480583796a6014956044210be94b4f39b160fc8"
77
+ "falconPackageHash": "0abf2466015deb01e8315e3c118aa03699327e653b03c7633e4dbd9c"
78
78
  }