@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.
Files changed (250) hide show
  1. package/build/boilerplate.cjs +17 -0
  2. package/build/boilerplate.d.ts +8 -0
  3. package/build/boilerplate.mjs +9 -0
  4. package/build/constants.cjs +11 -0
  5. package/build/{utils/constants.d.ts → constants.d.ts} +2 -1
  6. package/build/constants.mjs +5 -0
  7. package/build/content-delivery/ContentDelivery.cjs +348 -0
  8. package/build/content-delivery/ContentDelivery.d.ts +8 -4
  9. package/build/content-delivery/ContentDelivery.mjs +342 -0
  10. package/build/content-delivery/cache/index.cjs +35 -0
  11. package/build/content-delivery/cache/index.d.ts +3 -0
  12. package/build/content-delivery/cache/index.mjs +3 -0
  13. package/build/content-delivery/cache/memory.cjs +65 -0
  14. package/build/content-delivery/cache/memory.d.ts +3 -0
  15. package/build/content-delivery/cache/memory.mjs +58 -0
  16. package/build/content-delivery/cache/memory.test.cjs +54 -0
  17. package/build/content-delivery/cache/memory.test.mjs +52 -0
  18. package/build/content-delivery/cache/stacked.cjs +32 -0
  19. package/build/content-delivery/cache/stacked.d.ts +2 -0
  20. package/build/content-delivery/cache/stacked.mjs +26 -0
  21. package/build/content-delivery/cache/type.cjs +1 -0
  22. package/build/content-delivery/cache/type.d.ts +8 -0
  23. package/build/content-delivery/cache/type.mjs +1 -0
  24. package/build/content-delivery/index.cjs +27 -0
  25. package/build/content-delivery/index.d.ts +2 -1
  26. package/build/content-delivery/index.mjs +2 -0
  27. package/build/environment.cjs +42 -0
  28. package/build/environment.d.ts +2 -0
  29. package/build/environment.mjs +36 -0
  30. package/build/galleries.cjs +38 -0
  31. package/build/galleries.d.ts +11 -0
  32. package/build/galleries.mjs +30 -0
  33. package/build/http/HttpClient.cjs +66 -0
  34. package/build/http/HttpClient.d.ts +20 -0
  35. package/build/http/HttpClient.mjs +59 -0
  36. package/build/http/index.cjs +10 -0
  37. package/build/http/index.d.ts +1 -0
  38. package/build/http/index.mjs +2 -0
  39. package/build/index.cjs +88 -0
  40. package/build/index.d.ts +15 -4
  41. package/build/index.mjs +26 -0
  42. package/build/intl/getLanguageDisplayName.cjs +37 -0
  43. package/build/intl/getLanguageDisplayName.d.ts +20 -0
  44. package/build/intl/getLanguageDisplayName.mjs +32 -0
  45. package/build/intl/getLanguageDisplayName.test.cjs +46 -0
  46. package/build/intl/getLanguageDisplayName.test.mjs +44 -0
  47. package/build/intl/index.cjs +12 -0
  48. package/build/intl/index.d.ts +1 -5
  49. package/build/intl/index.mjs +1 -0
  50. package/build/metadata/getAlternateLanguageLinks.cjs +76 -0
  51. package/build/{seo → metadata}/getAlternateLanguageLinks.d.ts +2 -2
  52. package/build/metadata/getAlternateLanguageLinks.mjs +72 -0
  53. package/build/metadata/getAlternateLanguageLinks.test.cjs +198 -0
  54. package/build/metadata/getAlternateLanguageLinks.test.mjs +196 -0
  55. package/build/metadata/index.cjs +12 -0
  56. package/build/metadata/index.d.ts +2 -0
  57. package/build/metadata/index.mjs +1 -0
  58. package/build/metadata/types.cjs +1 -0
  59. package/build/metadata/types.d.ts +6 -0
  60. package/build/metadata/types.mjs +1 -0
  61. package/build/newsrooms.cjs +36 -0
  62. package/build/newsrooms.d.ts +5 -0
  63. package/build/newsrooms.mjs +28 -0
  64. package/build/privacy-portal.cjs +28 -0
  65. package/build/privacy-portal.d.ts +9 -0
  66. package/build/privacy-portal.mjs +21 -0
  67. package/build/resolvable.cjs +38 -0
  68. package/build/resolvable.d.ts +71 -0
  69. package/build/resolvable.mjs +32 -0
  70. package/build/routing/Route.cjs +46 -0
  71. package/build/routing/Route.d.ts +37 -0
  72. package/build/routing/Route.mjs +40 -0
  73. package/build/routing/Router.cjs +51 -0
  74. package/build/routing/Router.d.ts +23 -0
  75. package/build/routing/Router.mjs +45 -0
  76. package/build/routing/Routing.cjs +24 -0
  77. package/build/routing/Routing.d.ts +1 -0
  78. package/build/routing/Routing.mjs +2 -0
  79. package/build/routing/UrlGenerator.cjs +13 -0
  80. package/build/routing/UrlGenerator.d.ts +39 -0
  81. package/build/routing/UrlGenerator.mjs +7 -0
  82. package/build/routing/index.cjs +24 -0
  83. package/build/routing/index.d.ts +4 -0
  84. package/build/routing/index.mjs +4 -0
  85. package/build/routing/types.cjs +1 -0
  86. package/build/routing/types.d.ts +14 -0
  87. package/build/routing/types.mjs +1 -0
  88. package/build/routing/utils/generateUrlFromPattern.cjs +52 -0
  89. package/build/routing/utils/generateUrlFromPattern.d.ts +12 -0
  90. package/build/routing/utils/generateUrlFromPattern.mjs +47 -0
  91. package/build/routing/utils/generateUrlFromPattern.test.cjs +44 -0
  92. package/build/routing/utils/generateUrlFromPattern.test.mjs +42 -0
  93. package/build/routing/utils/getShortestLocaleSlug.cjs +60 -0
  94. package/build/routing/utils/getShortestLocaleSlug.d.ts +11 -0
  95. package/build/routing/utils/getShortestLocaleSlug.mjs +53 -0
  96. package/build/routing/utils/getShortestLocaleSlug.test.cjs +37 -0
  97. package/build/routing/utils/getShortestLocaleSlug.test.mjs +35 -0
  98. package/build/routing/utils/index.cjs +40 -0
  99. package/build/routing/utils/index.d.ts +5 -0
  100. package/build/routing/utils/index.mjs +5 -0
  101. package/build/routing/utils/isNumberCode.cjs +12 -0
  102. package/build/routing/utils/isNumberCode.d.ts +4 -0
  103. package/build/routing/utils/isNumberCode.mjs +6 -0
  104. package/build/routing/utils/matchLocaleSlug.cjs +41 -0
  105. package/build/routing/utils/matchLocaleSlug.d.ts +15 -0
  106. package/build/routing/utils/matchLocaleSlug.mjs +34 -0
  107. package/build/routing/utils/matchLocaleSlug.test.cjs +43 -0
  108. package/build/routing/utils/matchLocaleSlug.test.mjs +40 -0
  109. package/build/routing/utils/normalizeUrl.cjs +9 -0
  110. package/build/routing/utils/normalizeUrl.d.ts +1 -0
  111. package/build/routing/utils/normalizeUrl.mjs +3 -0
  112. package/build/search.cjs +1 -0
  113. package/build/{types.d.ts → search.d.ts} +3 -3
  114. package/build/search.mjs +1 -0
  115. package/build/sitemap/build.cjs +33 -0
  116. package/build/sitemap/build.d.ts +6 -0
  117. package/build/sitemap/build.mjs +27 -0
  118. package/build/sitemap/generate.cjs +192 -0
  119. package/build/sitemap/generate.d.ts +37 -0
  120. package/build/sitemap/generate.mjs +183 -0
  121. package/build/sitemap/index.cjs +38 -0
  122. package/build/sitemap/index.d.ts +4 -0
  123. package/build/sitemap/index.mjs +3 -0
  124. package/build/sitemap/stringify.cjs +24 -0
  125. package/build/sitemap/stringify.d.ts +2 -0
  126. package/build/sitemap/stringify.mjs +18 -0
  127. package/build/sitemap/types.cjs +1 -0
  128. package/build/sitemap/types.d.ts +67 -0
  129. package/build/sitemap/types.mjs +1 -0
  130. package/build/uploads.cjs +14 -0
  131. package/build/{utils/getAssetsUrl.d.ts → uploads.d.ts} +1 -1
  132. package/build/uploads.mjs +8 -0
  133. package/build/uploads.test.cjs +10 -0
  134. package/build/uploads.test.mjs +8 -0
  135. package/package.json +23 -26
  136. package/build/content-delivery/ContentDelivery.js +0 -238
  137. package/build/content-delivery/ContentDelivery.js.map +0 -1
  138. package/build/content-delivery/index.js +0 -28
  139. package/build/content-delivery/index.js.map +0 -1
  140. package/build/data-fetching/api/index.d.ts +0 -1
  141. package/build/data-fetching/api/index.js +0 -6
  142. package/build/data-fetching/api/index.js.map +0 -1
  143. package/build/data-fetching/api/initContentDeliveryClient.d.ts +0 -4
  144. package/build/data-fetching/api/initContentDeliveryClient.js +0 -25
  145. package/build/data-fetching/api/initContentDeliveryClient.js.map +0 -1
  146. package/build/data-fetching/index.d.ts +0 -3
  147. package/build/data-fetching/index.js +0 -20
  148. package/build/data-fetching/index.js.map +0 -1
  149. package/build/data-fetching/lib/getAlgoliaSettings.d.ts +0 -4
  150. package/build/data-fetching/lib/getAlgoliaSettings.js +0 -21
  151. package/build/data-fetching/lib/getAlgoliaSettings.js.map +0 -1
  152. package/build/data-fetching/lib/getEnvVariables.d.ts +0 -4
  153. package/build/data-fetching/lib/getEnvVariables.js +0 -43
  154. package/build/data-fetching/lib/getEnvVariables.js.map +0 -1
  155. package/build/data-fetching/lib/index.d.ts +0 -3
  156. package/build/data-fetching/lib/index.js +0 -10
  157. package/build/data-fetching/lib/index.js.map +0 -1
  158. package/build/data-fetching/lib/isUuid.d.ts +0 -1
  159. package/build/data-fetching/lib/isUuid.js +0 -9
  160. package/build/data-fetching/lib/isUuid.js.map +0 -1
  161. package/build/data-fetching/types.d.ts +0 -13
  162. package/build/data-fetching/types.js +0 -3
  163. package/build/data-fetching/types.js.map +0 -1
  164. package/build/index.js +0 -21
  165. package/build/index.js.map +0 -1
  166. package/build/intl/getFallbackLocale.d.ts +0 -10
  167. package/build/intl/getFallbackLocale.js +0 -24
  168. package/build/intl/getFallbackLocale.js.map +0 -1
  169. package/build/intl/index.js +0 -27
  170. package/build/intl/index.js.map +0 -1
  171. package/build/intl/languages.d.ts +0 -57
  172. package/build/intl/languages.js +0 -191
  173. package/build/intl/languages.js.map +0 -1
  174. package/build/intl/locale.d.ts +0 -11
  175. package/build/intl/locale.js +0 -41
  176. package/build/intl/locale.js.map +0 -1
  177. package/build/intl/localeConfig.d.ts +0 -2
  178. package/build/intl/localeConfig.js +0 -22
  179. package/build/intl/localeConfig.js.map +0 -1
  180. package/build/intl/localeList.d.ts +0 -2
  181. package/build/intl/localeList.js +0 -114
  182. package/build/intl/localeList.js.map +0 -1
  183. package/build/intl/localeObject.d.ts +0 -51
  184. package/build/intl/localeObject.js +0 -98
  185. package/build/intl/localeObject.js.map +0 -1
  186. package/build/seo/getAlternateLanguageLinks.js +0 -85
  187. package/build/seo/getAlternateLanguageLinks.js.map +0 -1
  188. package/build/seo/index.d.ts +0 -2
  189. package/build/seo/index.js +0 -19
  190. package/build/seo/index.js.map +0 -1
  191. package/build/seo/types.d.ts +0 -4
  192. package/build/seo/types.js +0 -3
  193. package/build/seo/types.js.map +0 -1
  194. package/build/seo/utils/bindLanguagesWithLocales.d.ts +0 -11
  195. package/build/seo/utils/bindLanguagesWithLocales.js +0 -23
  196. package/build/seo/utils/bindLanguagesWithLocales.js.map +0 -1
  197. package/build/seo/utils/createAlternateLanguageLink.d.ts +0 -5
  198. package/build/seo/utils/createAlternateLanguageLink.js +0 -15
  199. package/build/seo/utils/createAlternateLanguageLink.js.map +0 -1
  200. package/build/seo/utils/index.d.ts +0 -2
  201. package/build/seo/utils/index.js +0 -8
  202. package/build/seo/utils/index.js.map +0 -1
  203. package/build/server.d.ts +0 -2
  204. package/build/server.js +0 -21
  205. package/build/server.js.map +0 -1
  206. package/build/types.js +0 -3
  207. package/build/types.js.map +0 -1
  208. package/build/utils/assertServerEnv.d.ts +0 -1
  209. package/build/utils/assertServerEnv.js +0 -10
  210. package/build/utils/assertServerEnv.js.map +0 -1
  211. package/build/utils/boilerplate.d.ts +0 -8
  212. package/build/utils/boilerplate.js +0 -27
  213. package/build/utils/boilerplate.js.map +0 -1
  214. package/build/utils/constants.js +0 -8
  215. package/build/utils/constants.js.map +0 -1
  216. package/build/utils/getAssetsUrl.js +0 -13
  217. package/build/utils/getAssetsUrl.js.map +0 -1
  218. package/build/utils/getDataRequestLink.d.ts +0 -3
  219. package/build/utils/getDataRequestLink.js +0 -12
  220. package/build/utils/getDataRequestLink.js.map +0 -1
  221. package/build/utils/getGalleryThumbnail.d.ts +0 -2
  222. package/build/utils/getGalleryThumbnail.js +0 -15
  223. package/build/utils/getGalleryThumbnail.js.map +0 -1
  224. package/build/utils/getLocalizedCategoryData.d.ts +0 -12
  225. package/build/utils/getLocalizedCategoryData.js +0 -34
  226. package/build/utils/getLocalizedCategoryData.js.map +0 -1
  227. package/build/utils/getNewsroomLogoUrl.d.ts +0 -5
  228. package/build/utils/getNewsroomLogoUrl.js +0 -30
  229. package/build/utils/getNewsroomLogoUrl.js.map +0 -1
  230. package/build/utils/getPrivacyPortalUrl.d.ts +0 -8
  231. package/build/utils/getPrivacyPortalUrl.js +0 -13
  232. package/build/utils/getPrivacyPortalUrl.js.map +0 -1
  233. package/build/utils/getStoryPublicationDate.d.ts +0 -3
  234. package/build/utils/getStoryPublicationDate.js +0 -14
  235. package/build/utils/getStoryPublicationDate.js.map +0 -1
  236. package/build/utils/getUploadcareGroupUrl.d.ts +0 -8
  237. package/build/utils/getUploadcareGroupUrl.js +0 -17
  238. package/build/utils/getUploadcareGroupUrl.js.map +0 -1
  239. package/build/utils/index.d.ts +0 -14
  240. package/build/utils/index.js +0 -31
  241. package/build/utils/index.js.map +0 -1
  242. package/build/utils/isEmbargoStory.d.ts +0 -6
  243. package/build/utils/isEmbargoStory.js +0 -9
  244. package/build/utils/isEmbargoStory.js.map +0 -1
  245. package/build/utils/isGalleryEmpty.d.ts +0 -2
  246. package/build/utils/isGalleryEmpty.js +0 -8
  247. package/build/utils/isGalleryEmpty.js.map +0 -1
  248. package/build/utils/sdkHelpers.d.ts +0 -32
  249. package/build/utils/sdkHelpers.js +0 -42
  250. 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");
@@ -1,5 +1 @@
1
- export * from './getFallbackLocale';
2
- export * from './languages';
3
- export { default as localeConfig } from './localeConfig';
4
- export * from './locale';
5
- export * from './localeObject';
1
+ export { getLanguageDisplayName } from './getLanguageDisplayName';
@@ -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 type { LocaleObject } from '../intl';
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: LocaleObject) => string | undefined): AlternateLanguageLink[];
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
+ });