@prezly/theme-kit-core 7.0.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +64 -0
- package/build/content-delivery/cache/memory.d.ts +2 -0
- package/build/content-delivery/cache/memory.mjs +58 -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,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
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "getAlternateLanguageLinks", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function get() {
|
|
9
|
+
return _getAlternateLanguageLinks.getAlternateLanguageLinks;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
var _getAlternateLanguageLinks = require("./getAlternateLanguageLinks.cjs");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { getAlternateLanguageLinks } from "./getAlternateLanguageLinks.mjs";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getFaviconUrl = getFaviconUrl;
|
|
7
|
+
exports.getLogoUrl = getLogoUrl;
|
|
8
|
+
exports.getOgImageUrl = getOgImageUrl;
|
|
9
|
+
var _uploadcare = require("@prezly/uploadcare");
|
|
10
|
+
var _constants = require("./constants.cjs");
|
|
11
|
+
function getLogoUrl(newsroom, previewSize) {
|
|
12
|
+
if (newsroom.newsroom_logo) {
|
|
13
|
+
var image = _uploadcare.UploadcareImage.createFromPrezlyStoragePayload(newsroom.newsroom_logo);
|
|
14
|
+
if (previewSize) {
|
|
15
|
+
return image.preview(previewSize, previewSize).cdnUrl;
|
|
16
|
+
}
|
|
17
|
+
return image.cdnUrl;
|
|
18
|
+
}
|
|
19
|
+
return '';
|
|
20
|
+
}
|
|
21
|
+
function getFaviconUrl(newsroom) {
|
|
22
|
+
var previewSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 400;
|
|
23
|
+
var imageObject = newsroom.icon || newsroom.square_logo;
|
|
24
|
+
if (imageObject) {
|
|
25
|
+
var image = _uploadcare.UploadcareImage.createFromPrezlyStoragePayload(imageObject);
|
|
26
|
+
return image.preview(previewSize, previewSize).cdnUrl;
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
function getOgImageUrl(newsroom, locale) {
|
|
31
|
+
var url = "".concat(_constants.OG_IMAGE_API_URL, "/").concat(newsroom.uuid);
|
|
32
|
+
if (locale) {
|
|
33
|
+
return "".concat(url, "?locale=").concat(locale.slug);
|
|
34
|
+
}
|
|
35
|
+
return url;
|
|
36
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Newsroom } from '@prezly/sdk';
|
|
2
|
+
import type { Locale } from '@prezly/theme-kit-intl';
|
|
3
|
+
export declare function getLogoUrl(newsroom: Pick<Newsroom, 'newsroom_logo'>, previewSize?: number): string;
|
|
4
|
+
export declare function getFaviconUrl(newsroom: Pick<Newsroom, 'icon' | 'square_logo'>, previewSize?: number): string | undefined;
|
|
5
|
+
export declare function getOgImageUrl(newsroom: Pick<Newsroom, 'uuid'>, locale?: Locale): string;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { UploadcareImage } from '@prezly/uploadcare';
|
|
2
|
+
import { OG_IMAGE_API_URL } from "./constants.mjs";
|
|
3
|
+
export function getLogoUrl(newsroom, previewSize) {
|
|
4
|
+
if (newsroom.newsroom_logo) {
|
|
5
|
+
var image = UploadcareImage.createFromPrezlyStoragePayload(newsroom.newsroom_logo);
|
|
6
|
+
if (previewSize) {
|
|
7
|
+
return image.preview(previewSize, previewSize).cdnUrl;
|
|
8
|
+
}
|
|
9
|
+
return image.cdnUrl;
|
|
10
|
+
}
|
|
11
|
+
return '';
|
|
12
|
+
}
|
|
13
|
+
export function getFaviconUrl(newsroom) {
|
|
14
|
+
var previewSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 400;
|
|
15
|
+
var imageObject = newsroom.icon || newsroom.square_logo;
|
|
16
|
+
if (imageObject) {
|
|
17
|
+
var image = UploadcareImage.createFromPrezlyStoragePayload(imageObject);
|
|
18
|
+
return image.preview(previewSize, previewSize).cdnUrl;
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
export function getOgImageUrl(newsroom, locale) {
|
|
23
|
+
var url = "".concat(OG_IMAGE_API_URL, "/").concat(newsroom.uuid);
|
|
24
|
+
if (locale) {
|
|
25
|
+
return "".concat(url, "?locale=").concat(locale.slug);
|
|
26
|
+
}
|
|
27
|
+
return url;
|
|
28
|
+
}
|