@prezly/theme-kit-core 7.1.0 → 8.0.1
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/boilerplate.cjs +17 -0
- package/build/boilerplate.d.ts +8 -0
- package/build/boilerplate.mjs +9 -0
- package/build/constants.cjs +11 -0
- package/build/{utils/constants.d.ts → constants.d.ts} +2 -1
- package/build/constants.mjs +5 -0
- package/build/content-delivery/ContentDelivery.cjs +348 -0
- package/build/content-delivery/ContentDelivery.d.ts +8 -4
- package/build/content-delivery/ContentDelivery.mjs +342 -0
- package/build/content-delivery/cache/index.cjs +35 -0
- package/build/content-delivery/cache/index.d.ts +3 -0
- package/build/content-delivery/cache/index.mjs +3 -0
- package/build/content-delivery/cache/memory.cjs +65 -0
- package/build/content-delivery/cache/memory.d.ts +3 -0
- package/build/content-delivery/cache/memory.mjs +58 -0
- package/build/content-delivery/cache/memory.test.cjs +54 -0
- package/build/content-delivery/cache/memory.test.mjs +52 -0
- package/build/content-delivery/cache/stacked.cjs +32 -0
- package/build/content-delivery/cache/stacked.d.ts +2 -0
- package/build/content-delivery/cache/stacked.mjs +26 -0
- package/build/content-delivery/cache/type.cjs +1 -0
- package/build/content-delivery/cache/type.d.ts +8 -0
- package/build/content-delivery/cache/type.mjs +1 -0
- package/build/content-delivery/index.cjs +27 -0
- package/build/content-delivery/index.d.ts +2 -1
- package/build/content-delivery/index.mjs +2 -0
- package/build/environment.cjs +42 -0
- package/build/environment.d.ts +2 -0
- package/build/environment.mjs +36 -0
- package/build/galleries.cjs +38 -0
- package/build/galleries.d.ts +11 -0
- package/build/galleries.mjs +30 -0
- package/build/http/HttpClient.cjs +66 -0
- package/build/http/HttpClient.d.ts +20 -0
- package/build/http/HttpClient.mjs +59 -0
- package/build/http/index.cjs +10 -0
- package/build/http/index.d.ts +1 -0
- package/build/http/index.mjs +2 -0
- package/build/index.cjs +88 -0
- package/build/index.d.ts +15 -4
- package/build/index.mjs +26 -0
- package/build/intl/getLanguageDisplayName.cjs +37 -0
- package/build/intl/getLanguageDisplayName.d.ts +20 -0
- package/build/intl/getLanguageDisplayName.mjs +32 -0
- package/build/intl/getLanguageDisplayName.test.cjs +46 -0
- package/build/intl/getLanguageDisplayName.test.mjs +44 -0
- package/build/intl/index.cjs +12 -0
- package/build/intl/index.d.ts +1 -5
- package/build/intl/index.mjs +1 -0
- package/build/metadata/getAlternateLanguageLinks.cjs +76 -0
- package/build/{seo → metadata}/getAlternateLanguageLinks.d.ts +2 -2
- package/build/metadata/getAlternateLanguageLinks.mjs +72 -0
- package/build/metadata/getAlternateLanguageLinks.test.cjs +198 -0
- package/build/metadata/getAlternateLanguageLinks.test.mjs +196 -0
- package/build/metadata/index.cjs +12 -0
- package/build/metadata/index.d.ts +2 -0
- package/build/metadata/index.mjs +1 -0
- package/build/metadata/types.cjs +1 -0
- package/build/metadata/types.d.ts +6 -0
- package/build/metadata/types.mjs +1 -0
- package/build/newsrooms.cjs +36 -0
- package/build/newsrooms.d.ts +5 -0
- package/build/newsrooms.mjs +28 -0
- package/build/privacy-portal.cjs +28 -0
- package/build/privacy-portal.d.ts +9 -0
- package/build/privacy-portal.mjs +21 -0
- package/build/resolvable.cjs +38 -0
- package/build/resolvable.d.ts +71 -0
- package/build/resolvable.mjs +32 -0
- package/build/routing/Route.cjs +46 -0
- package/build/routing/Route.d.ts +37 -0
- package/build/routing/Route.mjs +40 -0
- package/build/routing/Router.cjs +51 -0
- package/build/routing/Router.d.ts +23 -0
- package/build/routing/Router.mjs +45 -0
- package/build/routing/Routing.cjs +24 -0
- package/build/routing/Routing.d.ts +1 -0
- package/build/routing/Routing.mjs +2 -0
- package/build/routing/UrlGenerator.cjs +13 -0
- package/build/routing/UrlGenerator.d.ts +39 -0
- package/build/routing/UrlGenerator.mjs +7 -0
- package/build/routing/index.cjs +24 -0
- package/build/routing/index.d.ts +4 -0
- package/build/routing/index.mjs +4 -0
- package/build/routing/types.cjs +1 -0
- package/build/routing/types.d.ts +14 -0
- package/build/routing/types.mjs +1 -0
- package/build/routing/utils/generateUrlFromPattern.cjs +52 -0
- package/build/routing/utils/generateUrlFromPattern.d.ts +12 -0
- package/build/routing/utils/generateUrlFromPattern.mjs +47 -0
- package/build/routing/utils/generateUrlFromPattern.test.cjs +44 -0
- package/build/routing/utils/generateUrlFromPattern.test.mjs +42 -0
- package/build/routing/utils/getShortestLocaleSlug.cjs +60 -0
- package/build/routing/utils/getShortestLocaleSlug.d.ts +11 -0
- package/build/routing/utils/getShortestLocaleSlug.mjs +53 -0
- package/build/routing/utils/getShortestLocaleSlug.test.cjs +37 -0
- package/build/routing/utils/getShortestLocaleSlug.test.mjs +35 -0
- package/build/routing/utils/index.cjs +40 -0
- package/build/routing/utils/index.d.ts +5 -0
- package/build/routing/utils/index.mjs +5 -0
- package/build/routing/utils/isNumberCode.cjs +12 -0
- package/build/routing/utils/isNumberCode.d.ts +4 -0
- package/build/routing/utils/isNumberCode.mjs +6 -0
- package/build/routing/utils/matchLocaleSlug.cjs +41 -0
- package/build/routing/utils/matchLocaleSlug.d.ts +15 -0
- package/build/routing/utils/matchLocaleSlug.mjs +34 -0
- package/build/routing/utils/matchLocaleSlug.test.cjs +43 -0
- package/build/routing/utils/matchLocaleSlug.test.mjs +40 -0
- package/build/routing/utils/normalizeUrl.cjs +9 -0
- package/build/routing/utils/normalizeUrl.d.ts +1 -0
- package/build/routing/utils/normalizeUrl.mjs +3 -0
- package/build/search.cjs +1 -0
- package/build/{types.d.ts → search.d.ts} +3 -3
- package/build/search.mjs +1 -0
- package/build/sitemap/build.cjs +33 -0
- package/build/sitemap/build.d.ts +6 -0
- package/build/sitemap/build.mjs +27 -0
- package/build/sitemap/generate.cjs +192 -0
- package/build/sitemap/generate.d.ts +37 -0
- package/build/sitemap/generate.mjs +183 -0
- package/build/sitemap/index.cjs +38 -0
- package/build/sitemap/index.d.ts +4 -0
- package/build/sitemap/index.mjs +3 -0
- package/build/sitemap/stringify.cjs +24 -0
- package/build/sitemap/stringify.d.ts +2 -0
- package/build/sitemap/stringify.mjs +18 -0
- package/build/sitemap/types.cjs +1 -0
- package/build/sitemap/types.d.ts +67 -0
- package/build/sitemap/types.mjs +1 -0
- package/build/uploads.cjs +14 -0
- package/build/{utils/getAssetsUrl.d.ts → uploads.d.ts} +1 -1
- package/build/uploads.mjs +8 -0
- package/build/uploads.test.cjs +10 -0
- package/build/uploads.test.mjs +8 -0
- package/package.json +23 -26
- package/build/content-delivery/ContentDelivery.js +0 -238
- package/build/content-delivery/ContentDelivery.js.map +0 -1
- package/build/content-delivery/index.js +0 -28
- package/build/content-delivery/index.js.map +0 -1
- package/build/data-fetching/api/index.d.ts +0 -1
- package/build/data-fetching/api/index.js +0 -6
- package/build/data-fetching/api/index.js.map +0 -1
- package/build/data-fetching/api/initContentDeliveryClient.d.ts +0 -4
- package/build/data-fetching/api/initContentDeliveryClient.js +0 -25
- package/build/data-fetching/api/initContentDeliveryClient.js.map +0 -1
- package/build/data-fetching/index.d.ts +0 -3
- package/build/data-fetching/index.js +0 -20
- package/build/data-fetching/index.js.map +0 -1
- package/build/data-fetching/lib/getAlgoliaSettings.d.ts +0 -4
- package/build/data-fetching/lib/getAlgoliaSettings.js +0 -21
- package/build/data-fetching/lib/getAlgoliaSettings.js.map +0 -1
- package/build/data-fetching/lib/getEnvVariables.d.ts +0 -4
- package/build/data-fetching/lib/getEnvVariables.js +0 -43
- package/build/data-fetching/lib/getEnvVariables.js.map +0 -1
- package/build/data-fetching/lib/index.d.ts +0 -3
- package/build/data-fetching/lib/index.js +0 -10
- package/build/data-fetching/lib/index.js.map +0 -1
- package/build/data-fetching/lib/isUuid.d.ts +0 -1
- package/build/data-fetching/lib/isUuid.js +0 -9
- package/build/data-fetching/lib/isUuid.js.map +0 -1
- package/build/data-fetching/types.d.ts +0 -13
- package/build/data-fetching/types.js +0 -3
- package/build/data-fetching/types.js.map +0 -1
- package/build/index.js +0 -21
- package/build/index.js.map +0 -1
- package/build/intl/getFallbackLocale.d.ts +0 -10
- package/build/intl/getFallbackLocale.js +0 -24
- package/build/intl/getFallbackLocale.js.map +0 -1
- package/build/intl/index.js +0 -27
- package/build/intl/index.js.map +0 -1
- package/build/intl/languages.d.ts +0 -57
- package/build/intl/languages.js +0 -191
- package/build/intl/languages.js.map +0 -1
- package/build/intl/locale.d.ts +0 -11
- package/build/intl/locale.js +0 -41
- package/build/intl/locale.js.map +0 -1
- package/build/intl/localeConfig.d.ts +0 -2
- package/build/intl/localeConfig.js +0 -22
- package/build/intl/localeConfig.js.map +0 -1
- package/build/intl/localeList.d.ts +0 -2
- package/build/intl/localeList.js +0 -114
- package/build/intl/localeList.js.map +0 -1
- package/build/intl/localeObject.d.ts +0 -51
- package/build/intl/localeObject.js +0 -98
- package/build/intl/localeObject.js.map +0 -1
- package/build/seo/getAlternateLanguageLinks.js +0 -85
- package/build/seo/getAlternateLanguageLinks.js.map +0 -1
- package/build/seo/index.d.ts +0 -2
- package/build/seo/index.js +0 -19
- package/build/seo/index.js.map +0 -1
- package/build/seo/types.d.ts +0 -4
- package/build/seo/types.js +0 -3
- package/build/seo/types.js.map +0 -1
- package/build/seo/utils/bindLanguagesWithLocales.d.ts +0 -11
- package/build/seo/utils/bindLanguagesWithLocales.js +0 -23
- package/build/seo/utils/bindLanguagesWithLocales.js.map +0 -1
- package/build/seo/utils/createAlternateLanguageLink.d.ts +0 -5
- package/build/seo/utils/createAlternateLanguageLink.js +0 -15
- package/build/seo/utils/createAlternateLanguageLink.js.map +0 -1
- package/build/seo/utils/index.d.ts +0 -2
- package/build/seo/utils/index.js +0 -8
- package/build/seo/utils/index.js.map +0 -1
- package/build/server.d.ts +0 -2
- package/build/server.js +0 -21
- package/build/server.js.map +0 -1
- package/build/types.js +0 -3
- package/build/types.js.map +0 -1
- package/build/utils/assertServerEnv.d.ts +0 -1
- package/build/utils/assertServerEnv.js +0 -10
- package/build/utils/assertServerEnv.js.map +0 -1
- package/build/utils/boilerplate.d.ts +0 -8
- package/build/utils/boilerplate.js +0 -27
- package/build/utils/boilerplate.js.map +0 -1
- package/build/utils/constants.js +0 -8
- package/build/utils/constants.js.map +0 -1
- package/build/utils/getAssetsUrl.js +0 -13
- package/build/utils/getAssetsUrl.js.map +0 -1
- package/build/utils/getDataRequestLink.d.ts +0 -3
- package/build/utils/getDataRequestLink.js +0 -12
- package/build/utils/getDataRequestLink.js.map +0 -1
- package/build/utils/getGalleryThumbnail.d.ts +0 -2
- package/build/utils/getGalleryThumbnail.js +0 -15
- package/build/utils/getGalleryThumbnail.js.map +0 -1
- package/build/utils/getLocalizedCategoryData.d.ts +0 -12
- package/build/utils/getLocalizedCategoryData.js +0 -34
- package/build/utils/getLocalizedCategoryData.js.map +0 -1
- package/build/utils/getNewsroomLogoUrl.d.ts +0 -5
- package/build/utils/getNewsroomLogoUrl.js +0 -30
- package/build/utils/getNewsroomLogoUrl.js.map +0 -1
- package/build/utils/getPrivacyPortalUrl.d.ts +0 -8
- package/build/utils/getPrivacyPortalUrl.js +0 -13
- package/build/utils/getPrivacyPortalUrl.js.map +0 -1
- package/build/utils/getStoryPublicationDate.d.ts +0 -3
- package/build/utils/getStoryPublicationDate.js +0 -14
- package/build/utils/getStoryPublicationDate.js.map +0 -1
- package/build/utils/getUploadcareGroupUrl.d.ts +0 -8
- package/build/utils/getUploadcareGroupUrl.js +0 -17
- package/build/utils/getUploadcareGroupUrl.js.map +0 -1
- package/build/utils/index.d.ts +0 -14
- package/build/utils/index.js +0 -31
- package/build/utils/index.js.map +0 -1
- package/build/utils/isEmbargoStory.d.ts +0 -6
- package/build/utils/isEmbargoStory.js +0 -9
- package/build/utils/isEmbargoStory.js.map +0 -1
- package/build/utils/isGalleryEmpty.d.ts +0 -2
- package/build/utils/isGalleryEmpty.js +0 -8
- package/build/utils/isGalleryEmpty.js.map +0 -1
- package/build/utils/sdkHelpers.d.ts +0 -32
- package/build/utils/sdkHelpers.js +0 -42
- package/build/utils/sdkHelpers.js.map +0 -1
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _languages = require("../__mocks__/languages.cjs");
|
|
4
|
+
var _getLanguageDisplayName = require("./getLanguageDisplayName.cjs");
|
|
5
|
+
describe('getLanguageDisplayName', () => {
|
|
6
|
+
describe('with languages as input', () => {
|
|
7
|
+
it('should return shortened name when language is the only culture', () => {
|
|
8
|
+
var languages = [_languages.LANGUAGES.en, _languages.LANGUAGES.fr];
|
|
9
|
+
expect((0, _getLanguageDisplayName.getLanguageDisplayName)(_languages.LANGUAGES.en, languages)).toBe('English');
|
|
10
|
+
expect((0, _getLanguageDisplayName.getLanguageDisplayName)(_languages.LANGUAGES.fr, languages)).toBe('Français');
|
|
11
|
+
});
|
|
12
|
+
it('should return full name when language is NOT the only culture', () => {
|
|
13
|
+
var languages = [_languages.LANGUAGES.nl_BE, _languages.LANGUAGES.nl_NL];
|
|
14
|
+
expect((0, _getLanguageDisplayName.getLanguageDisplayName)(_languages.LANGUAGES.nl_BE, languages)).toBe('Nederlands (België)');
|
|
15
|
+
expect((0, _getLanguageDisplayName.getLanguageDisplayName)(_languages.LANGUAGES.nl_NL, languages)).toBe('Nederlands (Nederland)');
|
|
16
|
+
});
|
|
17
|
+
it('should properly cut region from an RTL language name', () => {
|
|
18
|
+
var languages = [{
|
|
19
|
+
locale: {
|
|
20
|
+
code: 'ar_AE',
|
|
21
|
+
native_name: 'العربية (الإمارات العربية المتحدة)'
|
|
22
|
+
}
|
|
23
|
+
}];
|
|
24
|
+
expect((0, _getLanguageDisplayName.getLanguageDisplayName)(languages[0], languages)).toBe('العربية');
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe('with locales as input', () => {
|
|
28
|
+
it('should return shortened name when language is the only culture', () => {
|
|
29
|
+
var locales = [_languages.LANGUAGES.en.locale, _languages.LANGUAGES.fr.locale];
|
|
30
|
+
expect((0, _getLanguageDisplayName.getLanguageDisplayName)(_languages.LANGUAGES.en.locale, locales)).toBe('English');
|
|
31
|
+
expect((0, _getLanguageDisplayName.getLanguageDisplayName)(_languages.LANGUAGES.fr.locale, locales)).toBe('Français');
|
|
32
|
+
});
|
|
33
|
+
it('should return full name when language is NOT the only culture', () => {
|
|
34
|
+
var locales = [_languages.LANGUAGES.nl_BE.locale, _languages.LANGUAGES.nl_NL.locale];
|
|
35
|
+
expect((0, _getLanguageDisplayName.getLanguageDisplayName)(_languages.LANGUAGES.nl_BE.locale, locales)).toBe('Nederlands (België)');
|
|
36
|
+
expect((0, _getLanguageDisplayName.getLanguageDisplayName)(_languages.LANGUAGES.nl_NL.locale, locales)).toBe('Nederlands (Nederland)');
|
|
37
|
+
});
|
|
38
|
+
it('should properly cut region from an RTL language name', () => {
|
|
39
|
+
var locales = [{
|
|
40
|
+
code: 'ar_AE',
|
|
41
|
+
native_name: 'العربية (الإمارات العربية المتحدة)'
|
|
42
|
+
}];
|
|
43
|
+
expect((0, _getLanguageDisplayName.getLanguageDisplayName)(locales[0], locales)).toBe('العربية');
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { LANGUAGES } from "../__mocks__/languages.mjs";
|
|
2
|
+
import { getLanguageDisplayName } from "./getLanguageDisplayName.mjs";
|
|
3
|
+
describe('getLanguageDisplayName', () => {
|
|
4
|
+
describe('with languages as input', () => {
|
|
5
|
+
it('should return shortened name when language is the only culture', () => {
|
|
6
|
+
var languages = [LANGUAGES.en, LANGUAGES.fr];
|
|
7
|
+
expect(getLanguageDisplayName(LANGUAGES.en, languages)).toBe('English');
|
|
8
|
+
expect(getLanguageDisplayName(LANGUAGES.fr, languages)).toBe('Français');
|
|
9
|
+
});
|
|
10
|
+
it('should return full name when language is NOT the only culture', () => {
|
|
11
|
+
var languages = [LANGUAGES.nl_BE, LANGUAGES.nl_NL];
|
|
12
|
+
expect(getLanguageDisplayName(LANGUAGES.nl_BE, languages)).toBe('Nederlands (België)');
|
|
13
|
+
expect(getLanguageDisplayName(LANGUAGES.nl_NL, languages)).toBe('Nederlands (Nederland)');
|
|
14
|
+
});
|
|
15
|
+
it('should properly cut region from an RTL language name', () => {
|
|
16
|
+
var languages = [{
|
|
17
|
+
locale: {
|
|
18
|
+
code: 'ar_AE',
|
|
19
|
+
native_name: 'العربية (الإمارات العربية المتحدة)'
|
|
20
|
+
}
|
|
21
|
+
}];
|
|
22
|
+
expect(getLanguageDisplayName(languages[0], languages)).toBe('العربية');
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe('with locales as input', () => {
|
|
26
|
+
it('should return shortened name when language is the only culture', () => {
|
|
27
|
+
var locales = [LANGUAGES.en.locale, LANGUAGES.fr.locale];
|
|
28
|
+
expect(getLanguageDisplayName(LANGUAGES.en.locale, locales)).toBe('English');
|
|
29
|
+
expect(getLanguageDisplayName(LANGUAGES.fr.locale, locales)).toBe('Français');
|
|
30
|
+
});
|
|
31
|
+
it('should return full name when language is NOT the only culture', () => {
|
|
32
|
+
var locales = [LANGUAGES.nl_BE.locale, LANGUAGES.nl_NL.locale];
|
|
33
|
+
expect(getLanguageDisplayName(LANGUAGES.nl_BE.locale, locales)).toBe('Nederlands (België)');
|
|
34
|
+
expect(getLanguageDisplayName(LANGUAGES.nl_NL.locale, locales)).toBe('Nederlands (Nederland)');
|
|
35
|
+
});
|
|
36
|
+
it('should properly cut region from an RTL language name', () => {
|
|
37
|
+
var locales = [{
|
|
38
|
+
code: 'ar_AE',
|
|
39
|
+
native_name: 'العربية (الإمارات العربية المتحدة)'
|
|
40
|
+
}];
|
|
41
|
+
expect(getLanguageDisplayName(locales[0], locales)).toBe('العربية');
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "getLanguageDisplayName", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function get() {
|
|
9
|
+
return _getLanguageDisplayName.getLanguageDisplayName;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
var _getLanguageDisplayName = require("./getLanguageDisplayName.cjs");
|
package/build/intl/index.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { getLanguageDisplayName } from "./getLanguageDisplayName.mjs";
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getAlternateLanguageLinks = getAlternateLanguageLinks;
|
|
7
|
+
var _themeKitIntl = require("@prezly/theme-kit-intl");
|
|
8
|
+
var _isNotUndefined = require("@technically/is-not-undefined");
|
|
9
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
10
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
11
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
12
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
|
|
13
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /* eslint-disable @typescript-eslint/no-use-before-define */
|
|
14
|
+
// We use english locale as fallback since English is the most common language
|
|
15
|
+
var EN = 'en';
|
|
16
|
+
var X_DEFAULT = 'x-default';
|
|
17
|
+
var ALLOWED_FALLBACKS = {
|
|
18
|
+
["en_US"]: 'en',
|
|
19
|
+
["en_GB"]: 'en',
|
|
20
|
+
["fr_FR"]: 'fr',
|
|
21
|
+
["fr_CA"]: 'fr'
|
|
22
|
+
};
|
|
23
|
+
function getAlternateLanguageLinks(availableLanguages, generateTranslationUrl) {
|
|
24
|
+
var _links$EN;
|
|
25
|
+
var defaultLanguage = availableLanguages.find(lang => lang.is_default);
|
|
26
|
+
|
|
27
|
+
// Generate the translation URLs map for the exact locale codes
|
|
28
|
+
var translations = Object.fromEntries(availableLanguages.map(lang => [lang.code, generateTranslationUrl(lang.code)]));
|
|
29
|
+
|
|
30
|
+
// Initialize the links map with the existing translations
|
|
31
|
+
var links = _objectSpread({}, translations);
|
|
32
|
+
|
|
33
|
+
// Add selected languages as possible region-independent translations, if not present yet.
|
|
34
|
+
Object.entries(ALLOWED_FALLBACKS).forEach(_ref => {
|
|
35
|
+
var _links$langCode;
|
|
36
|
+
var [preferredFallbackLocale, langCode] = _ref;
|
|
37
|
+
links[langCode] = (_links$langCode = links[langCode]) !== null && _links$langCode !== void 0 ? _links$langCode : links[preferredFallbackLocale];
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Add any same-language version as region-independent fallback, if not present yet.
|
|
41
|
+
availableLanguages.forEach(lang => {
|
|
42
|
+
var _links$langCode2;
|
|
43
|
+
var {
|
|
44
|
+
code: localeCode,
|
|
45
|
+
lang: langCode
|
|
46
|
+
} = _themeKitIntl.Locale.from(lang.code);
|
|
47
|
+
links[langCode] = (_links$langCode2 = links[langCode]) !== null && _links$langCode2 !== void 0 ? _links$langCode2 : links[localeCode];
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Determine `x-default` version
|
|
51
|
+
links[X_DEFAULT] = // First we try to find region independent English locale (en)
|
|
52
|
+
// If the story has just region independent `en` translation we will use it as default hreflang
|
|
53
|
+
(_links$EN = links[EN]) !== null && _links$EN !== void 0 ? _links$EN :
|
|
54
|
+
// If there are no English translations at all we will use the default language (provided by the server)
|
|
55
|
+
defaultLanguage ? links[defaultLanguage.code] : undefined;
|
|
56
|
+
return Object.entries(links).map(_ref2 => {
|
|
57
|
+
var [hrefLang, href] = _ref2;
|
|
58
|
+
if (!href) {
|
|
59
|
+
// some of the fallbacks logic above can result in undefined Urls present in the map
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
if (hrefLang === X_DEFAULT) {
|
|
63
|
+
// `x-default` is not a valid locale code, so we can't pass it to the `Locale.from()` call.
|
|
64
|
+
return {
|
|
65
|
+
hrefLang: X_DEFAULT,
|
|
66
|
+
href,
|
|
67
|
+
type: 'x-default'
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
hrefLang: _themeKitIntl.Locale.from(hrefLang).isoCode,
|
|
72
|
+
href,
|
|
73
|
+
type: translations[hrefLang] ? 'exact' : 'alias'
|
|
74
|
+
};
|
|
75
|
+
}).filter(_isNotUndefined.isNotUndefined).sort((a, b) => a.hrefLang.localeCompare(b.hrefLang));
|
|
76
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { NewsroomLanguageSettings } from '@prezly/sdk';
|
|
2
|
-
import
|
|
2
|
+
import { Locale } from '@prezly/theme-kit-intl';
|
|
3
3
|
import type { AlternateLanguageLink } from './types';
|
|
4
|
-
export declare function getAlternateLanguageLinks<Language extends Pick<NewsroomLanguageSettings, 'code' | 'is_default'>>(availableLanguages: Language[], generateTranslationUrl: (locale:
|
|
4
|
+
export declare function getAlternateLanguageLinks<Language extends Pick<NewsroomLanguageSettings, 'code' | 'is_default'>>(availableLanguages: Language[], generateTranslationUrl: (locale: Locale.Code) => string | undefined): AlternateLanguageLink[];
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
2
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
3
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
4
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
|
|
5
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
6
|
+
/* eslint-disable @typescript-eslint/no-use-before-define */
|
|
7
|
+
|
|
8
|
+
import { Locale } from '@prezly/theme-kit-intl';
|
|
9
|
+
import { isNotUndefined } from '@technically/is-not-undefined';
|
|
10
|
+
// We use english locale as fallback since English is the most common language
|
|
11
|
+
var EN = 'en';
|
|
12
|
+
var X_DEFAULT = 'x-default';
|
|
13
|
+
var ALLOWED_FALLBACKS = {
|
|
14
|
+
["en_US"]: 'en',
|
|
15
|
+
["en_GB"]: 'en',
|
|
16
|
+
["fr_FR"]: 'fr',
|
|
17
|
+
["fr_CA"]: 'fr'
|
|
18
|
+
};
|
|
19
|
+
export function getAlternateLanguageLinks(availableLanguages, generateTranslationUrl) {
|
|
20
|
+
var _links$EN;
|
|
21
|
+
var defaultLanguage = availableLanguages.find(lang => lang.is_default);
|
|
22
|
+
|
|
23
|
+
// Generate the translation URLs map for the exact locale codes
|
|
24
|
+
var translations = Object.fromEntries(availableLanguages.map(lang => [lang.code, generateTranslationUrl(lang.code)]));
|
|
25
|
+
|
|
26
|
+
// Initialize the links map with the existing translations
|
|
27
|
+
var links = _objectSpread({}, translations);
|
|
28
|
+
|
|
29
|
+
// Add selected languages as possible region-independent translations, if not present yet.
|
|
30
|
+
Object.entries(ALLOWED_FALLBACKS).forEach(_ref => {
|
|
31
|
+
var _links$langCode;
|
|
32
|
+
var [preferredFallbackLocale, langCode] = _ref;
|
|
33
|
+
links[langCode] = (_links$langCode = links[langCode]) !== null && _links$langCode !== void 0 ? _links$langCode : links[preferredFallbackLocale];
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// Add any same-language version as region-independent fallback, if not present yet.
|
|
37
|
+
availableLanguages.forEach(lang => {
|
|
38
|
+
var _links$langCode2;
|
|
39
|
+
var {
|
|
40
|
+
code: localeCode,
|
|
41
|
+
lang: langCode
|
|
42
|
+
} = Locale.from(lang.code);
|
|
43
|
+
links[langCode] = (_links$langCode2 = links[langCode]) !== null && _links$langCode2 !== void 0 ? _links$langCode2 : links[localeCode];
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Determine `x-default` version
|
|
47
|
+
links[X_DEFAULT] = // First we try to find region independent English locale (en)
|
|
48
|
+
// If the story has just region independent `en` translation we will use it as default hreflang
|
|
49
|
+
(_links$EN = links[EN]) !== null && _links$EN !== void 0 ? _links$EN :
|
|
50
|
+
// If there are no English translations at all we will use the default language (provided by the server)
|
|
51
|
+
defaultLanguage ? links[defaultLanguage.code] : undefined;
|
|
52
|
+
return Object.entries(links).map(_ref2 => {
|
|
53
|
+
var [hrefLang, href] = _ref2;
|
|
54
|
+
if (!href) {
|
|
55
|
+
// some of the fallbacks logic above can result in undefined Urls present in the map
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
if (hrefLang === X_DEFAULT) {
|
|
59
|
+
// `x-default` is not a valid locale code, so we can't pass it to the `Locale.from()` call.
|
|
60
|
+
return {
|
|
61
|
+
hrefLang: X_DEFAULT,
|
|
62
|
+
href,
|
|
63
|
+
type: 'x-default'
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
hrefLang: Locale.from(hrefLang).isoCode,
|
|
68
|
+
href,
|
|
69
|
+
type: translations[hrefLang] ? 'exact' : 'alias'
|
|
70
|
+
};
|
|
71
|
+
}).filter(isNotUndefined).sort((a, b) => a.hrefLang.localeCompare(b.hrefLang));
|
|
72
|
+
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _themeKitIntl = require("@prezly/theme-kit-intl");
|
|
4
|
+
var _getAlternateLanguageLinks = require("./getAlternateLanguageLinks.cjs");
|
|
5
|
+
function lang(code) {
|
|
6
|
+
var isDefault = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
7
|
+
return {
|
|
8
|
+
code,
|
|
9
|
+
is_default: isDefault
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function getTranslationUrl(locale) {
|
|
13
|
+
var {
|
|
14
|
+
isoCode
|
|
15
|
+
} = _themeKitIntl.Locale.from(locale);
|
|
16
|
+
return "translationUrl/".concat(isoCode);
|
|
17
|
+
}
|
|
18
|
+
function generateTranslationUrl(locale) {
|
|
19
|
+
var translationUrl = getTranslationUrl(locale);
|
|
20
|
+
var {
|
|
21
|
+
lang: langCode
|
|
22
|
+
} = _themeKitIntl.Locale.from(locale);
|
|
23
|
+
return "http://localhost:3000/".concat(langCode, "/").concat(translationUrl);
|
|
24
|
+
}
|
|
25
|
+
describe('getAlternateLanguageLinks', () => {
|
|
26
|
+
it('should handle one en-GB non-default language', () => {
|
|
27
|
+
var links = (0, _getAlternateLanguageLinks.getAlternateLanguageLinks)([lang('en_GB')], generateTranslationUrl);
|
|
28
|
+
expect(links).toMatchObject([{
|
|
29
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
30
|
+
hrefLang: 'en'
|
|
31
|
+
}, {
|
|
32
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
33
|
+
hrefLang: 'en-GB'
|
|
34
|
+
}, {
|
|
35
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
36
|
+
hrefLang: 'x-default'
|
|
37
|
+
}]);
|
|
38
|
+
});
|
|
39
|
+
it('should handle one en-GB default language', () => {
|
|
40
|
+
var links = (0, _getAlternateLanguageLinks.getAlternateLanguageLinks)([lang('en_GB', true)], generateTranslationUrl);
|
|
41
|
+
expect(links).toMatchObject([{
|
|
42
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
43
|
+
hrefLang: 'en'
|
|
44
|
+
}, {
|
|
45
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
46
|
+
hrefLang: 'en-GB'
|
|
47
|
+
}, {
|
|
48
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
49
|
+
hrefLang: 'x-default'
|
|
50
|
+
}]);
|
|
51
|
+
});
|
|
52
|
+
it('should handle two full locales', () => {
|
|
53
|
+
var links = (0, _getAlternateLanguageLinks.getAlternateLanguageLinks)([lang('en_GB', true), lang('fr_FR')], generateTranslationUrl);
|
|
54
|
+
expect(links).toMatchObject([{
|
|
55
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
56
|
+
hrefLang: 'en'
|
|
57
|
+
}, {
|
|
58
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
59
|
+
hrefLang: 'en-GB'
|
|
60
|
+
}, {
|
|
61
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
62
|
+
hrefLang: 'fr'
|
|
63
|
+
}, {
|
|
64
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
65
|
+
hrefLang: 'fr-FR'
|
|
66
|
+
}, {
|
|
67
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
68
|
+
hrefLang: 'x-default'
|
|
69
|
+
}]);
|
|
70
|
+
});
|
|
71
|
+
it('should use en-GB locale as x-default even if other locale is set as default', () => {
|
|
72
|
+
var links = (0, _getAlternateLanguageLinks.getAlternateLanguageLinks)([lang('en_GB'), lang('fr_FR', true)], generateTranslationUrl);
|
|
73
|
+
expect(links).toMatchObject([{
|
|
74
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
75
|
+
hrefLang: 'en'
|
|
76
|
+
}, {
|
|
77
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
78
|
+
hrefLang: 'en-GB'
|
|
79
|
+
}, {
|
|
80
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
81
|
+
hrefLang: 'fr'
|
|
82
|
+
}, {
|
|
83
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
84
|
+
hrefLang: 'fr-FR'
|
|
85
|
+
}, {
|
|
86
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
87
|
+
hrefLang: 'x-default'
|
|
88
|
+
}]);
|
|
89
|
+
});
|
|
90
|
+
it('should use default locale as x-default when there is eng locale', () => {
|
|
91
|
+
var links = (0, _getAlternateLanguageLinks.getAlternateLanguageLinks)([lang('ru_RU'), lang('fr_FR', true)], generateTranslationUrl);
|
|
92
|
+
expect(links).toMatchObject([{
|
|
93
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
94
|
+
hrefLang: 'fr'
|
|
95
|
+
}, {
|
|
96
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
97
|
+
hrefLang: 'fr-FR'
|
|
98
|
+
}, {
|
|
99
|
+
href: 'http://localhost:3000/ru/translationUrl/ru-RU',
|
|
100
|
+
hrefLang: 'ru'
|
|
101
|
+
}, {
|
|
102
|
+
href: 'http://localhost:3000/ru/translationUrl/ru-RU',
|
|
103
|
+
hrefLang: 'ru-RU'
|
|
104
|
+
}, {
|
|
105
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
106
|
+
hrefLang: 'x-default'
|
|
107
|
+
}]);
|
|
108
|
+
});
|
|
109
|
+
it('should include provided region independent locale', () => {
|
|
110
|
+
var links = (0, _getAlternateLanguageLinks.getAlternateLanguageLinks)([lang('en_US'), lang('fr'), lang('fr_FR', true)], generateTranslationUrl);
|
|
111
|
+
expect(links).toMatchObject([{
|
|
112
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
113
|
+
hrefLang: 'en'
|
|
114
|
+
}, {
|
|
115
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
116
|
+
hrefLang: 'en-US'
|
|
117
|
+
}, {
|
|
118
|
+
href: 'http://localhost:3000/fr/translationUrl/fr',
|
|
119
|
+
hrefLang: 'fr'
|
|
120
|
+
}, {
|
|
121
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
122
|
+
hrefLang: 'fr-FR'
|
|
123
|
+
}, {
|
|
124
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
125
|
+
hrefLang: 'x-default'
|
|
126
|
+
}]);
|
|
127
|
+
});
|
|
128
|
+
it('should use provided en region independent locale as x-default', () => {
|
|
129
|
+
var links = (0, _getAlternateLanguageLinks.getAlternateLanguageLinks)([lang('en'), lang('en_US'), lang('fr'), lang('fr_FR')], generateTranslationUrl);
|
|
130
|
+
expect(links).toMatchObject([{
|
|
131
|
+
href: 'http://localhost:3000/en/translationUrl/en',
|
|
132
|
+
hrefLang: 'en'
|
|
133
|
+
}, {
|
|
134
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
135
|
+
hrefLang: 'en-US'
|
|
136
|
+
}, {
|
|
137
|
+
href: 'http://localhost:3000/fr/translationUrl/fr',
|
|
138
|
+
hrefLang: 'fr'
|
|
139
|
+
}, {
|
|
140
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
141
|
+
hrefLang: 'fr-FR'
|
|
142
|
+
}, {
|
|
143
|
+
href: 'http://localhost:3000/en/translationUrl/en',
|
|
144
|
+
hrefLang: 'x-default'
|
|
145
|
+
}]);
|
|
146
|
+
});
|
|
147
|
+
it('should fallback en link to en-US locale when there is en-GB locale', () => {
|
|
148
|
+
var links = (0, _getAlternateLanguageLinks.getAlternateLanguageLinks)([lang('en_GB'), lang('en_US')], generateTranslationUrl);
|
|
149
|
+
expect(links).toMatchObject([{
|
|
150
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
151
|
+
hrefLang: 'en'
|
|
152
|
+
}, {
|
|
153
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
154
|
+
hrefLang: 'en-GB'
|
|
155
|
+
}, {
|
|
156
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
157
|
+
hrefLang: 'en-US'
|
|
158
|
+
}, {
|
|
159
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
160
|
+
hrefLang: 'x-default'
|
|
161
|
+
}]);
|
|
162
|
+
});
|
|
163
|
+
it('should should omit locales if getTranslationUrl is undefined', () => {
|
|
164
|
+
var links = (0, _getAlternateLanguageLinks.getAlternateLanguageLinks)([lang('en_US'), lang('fr'), lang('fr_FR', true)], locale => {
|
|
165
|
+
var translationUrl = _themeKitIntl.Locale.isEqual(locale, 'en-US') ? undefined : getTranslationUrl(locale);
|
|
166
|
+
if (translationUrl) {
|
|
167
|
+
return generateTranslationUrl(locale);
|
|
168
|
+
}
|
|
169
|
+
return undefined;
|
|
170
|
+
});
|
|
171
|
+
expect(links).toMatchObject([{
|
|
172
|
+
href: 'http://localhost:3000/fr/translationUrl/fr',
|
|
173
|
+
hrefLang: 'fr'
|
|
174
|
+
}, {
|
|
175
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
176
|
+
hrefLang: 'fr-FR'
|
|
177
|
+
}, {
|
|
178
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
179
|
+
hrefLang: 'x-default'
|
|
180
|
+
}]);
|
|
181
|
+
});
|
|
182
|
+
it('should should not duplicate links when equal languages passed', () => {
|
|
183
|
+
var links = (0, _getAlternateLanguageLinks.getAlternateLanguageLinks)([lang('en_GB'), lang('en_GB'), lang('en_US'), lang('en_US')], generateTranslationUrl);
|
|
184
|
+
expect(links).toMatchObject([{
|
|
185
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
186
|
+
hrefLang: 'en'
|
|
187
|
+
}, {
|
|
188
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
189
|
+
hrefLang: 'en-GB'
|
|
190
|
+
}, {
|
|
191
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
192
|
+
hrefLang: 'en-US'
|
|
193
|
+
}, {
|
|
194
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
195
|
+
hrefLang: 'x-default'
|
|
196
|
+
}]);
|
|
197
|
+
});
|
|
198
|
+
});
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { Locale } from '@prezly/theme-kit-intl';
|
|
2
|
+
import { getAlternateLanguageLinks } from "./getAlternateLanguageLinks.mjs";
|
|
3
|
+
function lang(code) {
|
|
4
|
+
var isDefault = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
5
|
+
return {
|
|
6
|
+
code,
|
|
7
|
+
is_default: isDefault
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function getTranslationUrl(locale) {
|
|
11
|
+
var {
|
|
12
|
+
isoCode
|
|
13
|
+
} = Locale.from(locale);
|
|
14
|
+
return "translationUrl/".concat(isoCode);
|
|
15
|
+
}
|
|
16
|
+
function generateTranslationUrl(locale) {
|
|
17
|
+
var translationUrl = getTranslationUrl(locale);
|
|
18
|
+
var {
|
|
19
|
+
lang: langCode
|
|
20
|
+
} = Locale.from(locale);
|
|
21
|
+
return "http://localhost:3000/".concat(langCode, "/").concat(translationUrl);
|
|
22
|
+
}
|
|
23
|
+
describe('getAlternateLanguageLinks', () => {
|
|
24
|
+
it('should handle one en-GB non-default language', () => {
|
|
25
|
+
var links = getAlternateLanguageLinks([lang('en_GB')], generateTranslationUrl);
|
|
26
|
+
expect(links).toMatchObject([{
|
|
27
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
28
|
+
hrefLang: 'en'
|
|
29
|
+
}, {
|
|
30
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
31
|
+
hrefLang: 'en-GB'
|
|
32
|
+
}, {
|
|
33
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
34
|
+
hrefLang: 'x-default'
|
|
35
|
+
}]);
|
|
36
|
+
});
|
|
37
|
+
it('should handle one en-GB default language', () => {
|
|
38
|
+
var links = getAlternateLanguageLinks([lang('en_GB', true)], generateTranslationUrl);
|
|
39
|
+
expect(links).toMatchObject([{
|
|
40
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
41
|
+
hrefLang: 'en'
|
|
42
|
+
}, {
|
|
43
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
44
|
+
hrefLang: 'en-GB'
|
|
45
|
+
}, {
|
|
46
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
47
|
+
hrefLang: 'x-default'
|
|
48
|
+
}]);
|
|
49
|
+
});
|
|
50
|
+
it('should handle two full locales', () => {
|
|
51
|
+
var links = getAlternateLanguageLinks([lang('en_GB', true), lang('fr_FR')], generateTranslationUrl);
|
|
52
|
+
expect(links).toMatchObject([{
|
|
53
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
54
|
+
hrefLang: 'en'
|
|
55
|
+
}, {
|
|
56
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
57
|
+
hrefLang: 'en-GB'
|
|
58
|
+
}, {
|
|
59
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
60
|
+
hrefLang: 'fr'
|
|
61
|
+
}, {
|
|
62
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
63
|
+
hrefLang: 'fr-FR'
|
|
64
|
+
}, {
|
|
65
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
66
|
+
hrefLang: 'x-default'
|
|
67
|
+
}]);
|
|
68
|
+
});
|
|
69
|
+
it('should use en-GB locale as x-default even if other locale is set as default', () => {
|
|
70
|
+
var links = getAlternateLanguageLinks([lang('en_GB'), lang('fr_FR', true)], generateTranslationUrl);
|
|
71
|
+
expect(links).toMatchObject([{
|
|
72
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
73
|
+
hrefLang: 'en'
|
|
74
|
+
}, {
|
|
75
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
76
|
+
hrefLang: 'en-GB'
|
|
77
|
+
}, {
|
|
78
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
79
|
+
hrefLang: 'fr'
|
|
80
|
+
}, {
|
|
81
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
82
|
+
hrefLang: 'fr-FR'
|
|
83
|
+
}, {
|
|
84
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
85
|
+
hrefLang: 'x-default'
|
|
86
|
+
}]);
|
|
87
|
+
});
|
|
88
|
+
it('should use default locale as x-default when there is eng locale', () => {
|
|
89
|
+
var links = getAlternateLanguageLinks([lang('ru_RU'), lang('fr_FR', true)], generateTranslationUrl);
|
|
90
|
+
expect(links).toMatchObject([{
|
|
91
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
92
|
+
hrefLang: 'fr'
|
|
93
|
+
}, {
|
|
94
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
95
|
+
hrefLang: 'fr-FR'
|
|
96
|
+
}, {
|
|
97
|
+
href: 'http://localhost:3000/ru/translationUrl/ru-RU',
|
|
98
|
+
hrefLang: 'ru'
|
|
99
|
+
}, {
|
|
100
|
+
href: 'http://localhost:3000/ru/translationUrl/ru-RU',
|
|
101
|
+
hrefLang: 'ru-RU'
|
|
102
|
+
}, {
|
|
103
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
104
|
+
hrefLang: 'x-default'
|
|
105
|
+
}]);
|
|
106
|
+
});
|
|
107
|
+
it('should include provided region independent locale', () => {
|
|
108
|
+
var links = getAlternateLanguageLinks([lang('en_US'), lang('fr'), lang('fr_FR', true)], generateTranslationUrl);
|
|
109
|
+
expect(links).toMatchObject([{
|
|
110
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
111
|
+
hrefLang: 'en'
|
|
112
|
+
}, {
|
|
113
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
114
|
+
hrefLang: 'en-US'
|
|
115
|
+
}, {
|
|
116
|
+
href: 'http://localhost:3000/fr/translationUrl/fr',
|
|
117
|
+
hrefLang: 'fr'
|
|
118
|
+
}, {
|
|
119
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
120
|
+
hrefLang: 'fr-FR'
|
|
121
|
+
}, {
|
|
122
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
123
|
+
hrefLang: 'x-default'
|
|
124
|
+
}]);
|
|
125
|
+
});
|
|
126
|
+
it('should use provided en region independent locale as x-default', () => {
|
|
127
|
+
var links = getAlternateLanguageLinks([lang('en'), lang('en_US'), lang('fr'), lang('fr_FR')], generateTranslationUrl);
|
|
128
|
+
expect(links).toMatchObject([{
|
|
129
|
+
href: 'http://localhost:3000/en/translationUrl/en',
|
|
130
|
+
hrefLang: 'en'
|
|
131
|
+
}, {
|
|
132
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
133
|
+
hrefLang: 'en-US'
|
|
134
|
+
}, {
|
|
135
|
+
href: 'http://localhost:3000/fr/translationUrl/fr',
|
|
136
|
+
hrefLang: 'fr'
|
|
137
|
+
}, {
|
|
138
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
139
|
+
hrefLang: 'fr-FR'
|
|
140
|
+
}, {
|
|
141
|
+
href: 'http://localhost:3000/en/translationUrl/en',
|
|
142
|
+
hrefLang: 'x-default'
|
|
143
|
+
}]);
|
|
144
|
+
});
|
|
145
|
+
it('should fallback en link to en-US locale when there is en-GB locale', () => {
|
|
146
|
+
var links = getAlternateLanguageLinks([lang('en_GB'), lang('en_US')], generateTranslationUrl);
|
|
147
|
+
expect(links).toMatchObject([{
|
|
148
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
149
|
+
hrefLang: 'en'
|
|
150
|
+
}, {
|
|
151
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
152
|
+
hrefLang: 'en-GB'
|
|
153
|
+
}, {
|
|
154
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
155
|
+
hrefLang: 'en-US'
|
|
156
|
+
}, {
|
|
157
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
158
|
+
hrefLang: 'x-default'
|
|
159
|
+
}]);
|
|
160
|
+
});
|
|
161
|
+
it('should should omit locales if getTranslationUrl is undefined', () => {
|
|
162
|
+
var links = getAlternateLanguageLinks([lang('en_US'), lang('fr'), lang('fr_FR', true)], locale => {
|
|
163
|
+
var translationUrl = Locale.isEqual(locale, 'en-US') ? undefined : getTranslationUrl(locale);
|
|
164
|
+
if (translationUrl) {
|
|
165
|
+
return generateTranslationUrl(locale);
|
|
166
|
+
}
|
|
167
|
+
return undefined;
|
|
168
|
+
});
|
|
169
|
+
expect(links).toMatchObject([{
|
|
170
|
+
href: 'http://localhost:3000/fr/translationUrl/fr',
|
|
171
|
+
hrefLang: 'fr'
|
|
172
|
+
}, {
|
|
173
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
174
|
+
hrefLang: 'fr-FR'
|
|
175
|
+
}, {
|
|
176
|
+
href: 'http://localhost:3000/fr/translationUrl/fr-FR',
|
|
177
|
+
hrefLang: 'x-default'
|
|
178
|
+
}]);
|
|
179
|
+
});
|
|
180
|
+
it('should should not duplicate links when equal languages passed', () => {
|
|
181
|
+
var links = getAlternateLanguageLinks([lang('en_GB'), lang('en_GB'), lang('en_US'), lang('en_US')], generateTranslationUrl);
|
|
182
|
+
expect(links).toMatchObject([{
|
|
183
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
184
|
+
hrefLang: 'en'
|
|
185
|
+
}, {
|
|
186
|
+
href: 'http://localhost:3000/en/translationUrl/en-GB',
|
|
187
|
+
hrefLang: 'en-GB'
|
|
188
|
+
}, {
|
|
189
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
190
|
+
hrefLang: 'en-US'
|
|
191
|
+
}, {
|
|
192
|
+
href: 'http://localhost:3000/en/translationUrl/en-US',
|
|
193
|
+
hrefLang: 'x-default'
|
|
194
|
+
}]);
|
|
195
|
+
});
|
|
196
|
+
});
|