@bleedingdev/modern-js-plugin-i18n 3.5.0-ultramodern.35 → 3.5.0-ultramodern.37

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 (91) hide show
  1. package/dist/cjs/cli/locales.js +15 -15
  2. package/dist/cjs/runtime/i18n/backend/defaults.node.js +7 -7
  3. package/dist/cjs/runtime/i18n/detection/cache.js +3 -2
  4. package/dist/cjs/runtime/i18n/instance.js +7 -7
  5. package/dist/cjs/runtime/utils.js +1 -9
  6. package/dist/cjs/server/redirectPolicy.js +14 -20
  7. package/dist/cjs/shared/detection.js +2 -104
  8. package/dist/cjs/shared/localisedUrls/index.js +16 -0
  9. package/dist/cjs/shared/localisedUrls/pathname.js +5 -2
  10. package/dist/cjs/shared/localisedUrls/redirect.js +95 -0
  11. package/dist/cjs/shared/localisedUrls/resolve.js +29 -32
  12. package/dist/cjs/shared/localisedUrls.js +15 -0
  13. package/dist/cjs/shared/utils.js +2 -8
  14. package/dist/esm/cli/locales.mjs +13 -13
  15. package/dist/esm/runtime/i18n/backend/defaults.node.mjs +5 -5
  16. package/dist/esm/runtime/i18n/detection/cache.mjs +3 -2
  17. package/dist/esm/runtime/i18n/instance.mjs +8 -5
  18. package/dist/esm/runtime/utils.mjs +2 -10
  19. package/dist/esm/server/index.mjs +2 -2
  20. package/dist/esm/server/redirectPolicy.mjs +15 -21
  21. package/dist/esm/shared/detection.mjs +1 -71
  22. package/dist/esm/shared/localisedUrls/index.mjs +2 -1
  23. package/dist/esm/shared/localisedUrls/pathname.mjs +1 -1
  24. package/dist/esm/shared/localisedUrls/redirect.mjs +48 -0
  25. package/dist/esm/shared/localisedUrls/resolve.mjs +29 -32
  26. package/dist/esm/shared/localisedUrls.mjs +1 -1
  27. package/dist/esm/shared/utils.mjs +1 -1
  28. package/dist/esm-node/cli/locales.mjs +13 -13
  29. package/dist/esm-node/runtime/i18n/backend/defaults.node.mjs +5 -5
  30. package/dist/esm-node/runtime/i18n/detection/cache.mjs +3 -2
  31. package/dist/esm-node/runtime/i18n/instance.mjs +8 -5
  32. package/dist/esm-node/runtime/utils.mjs +2 -10
  33. package/dist/esm-node/server/index.mjs +2 -2
  34. package/dist/esm-node/server/redirectPolicy.mjs +15 -21
  35. package/dist/esm-node/shared/detection.mjs +1 -71
  36. package/dist/esm-node/shared/localisedUrls/index.mjs +2 -1
  37. package/dist/esm-node/shared/localisedUrls/pathname.mjs +1 -1
  38. package/dist/esm-node/shared/localisedUrls/redirect.mjs +49 -0
  39. package/dist/esm-node/shared/localisedUrls/resolve.mjs +29 -32
  40. package/dist/esm-node/shared/localisedUrls.mjs +1 -1
  41. package/dist/esm-node/shared/utils.mjs +1 -1
  42. package/dist/types/cli/locales.d.ts +1 -1
  43. package/dist/types/runtime/context.d.ts +4 -3
  44. package/dist/types/runtime/contextHelpers.d.ts +2 -2
  45. package/dist/types/runtime/i18n/backend/middleware.common.d.ts +2 -1
  46. package/dist/types/runtime/i18n/detection/cache.d.ts +1 -1
  47. package/dist/types/runtime/i18n/detection/detector.d.ts +2 -2
  48. package/dist/types/runtime/i18n/detection/middleware.d.ts +4 -4
  49. package/dist/types/runtime/i18n/detection/middleware.node.d.ts +4 -4
  50. package/dist/types/runtime/i18n/detection/types.d.ts +8 -5
  51. package/dist/types/runtime/i18n/instance.d.ts +28 -26
  52. package/dist/types/runtime/i18n/utils.d.ts +14 -5
  53. package/dist/types/runtime/pluginSetup.d.ts +1 -1
  54. package/dist/types/runtime/providerComposition.d.ts +2 -1
  55. package/dist/types/runtime/routerAdapter.d.ts +7 -6
  56. package/dist/types/server/redirectPolicy.d.ts +14 -8
  57. package/dist/types/shared/detection.d.ts +1 -11
  58. package/dist/types/shared/localisedUrls/index.d.ts +3 -1
  59. package/dist/types/shared/localisedUrls/pathname.d.ts +1 -0
  60. package/dist/types/shared/localisedUrls/redirect.d.ts +11 -0
  61. package/dist/types/shared/localisedUrls/resolve.d.ts +2 -3
  62. package/dist/types/shared/localisedUrls.d.ts +2 -2
  63. package/dist/types/shared/utils.d.ts +0 -2
  64. package/package.json +16 -18
  65. package/src/cli/index.ts +2 -2
  66. package/src/cli/locales.ts +3 -3
  67. package/src/runtime/context.tsx +3 -3
  68. package/src/runtime/contextHelpers.ts +3 -3
  69. package/src/runtime/hooks.ts +10 -2
  70. package/src/runtime/i18n/backend/defaults.node.ts +2 -2
  71. package/src/runtime/i18n/backend/middleware.common.ts +5 -4
  72. package/src/runtime/i18n/detection/cache.ts +23 -9
  73. package/src/runtime/i18n/detection/detector.ts +15 -6
  74. package/src/runtime/i18n/detection/middleware.node.ts +26 -7
  75. package/src/runtime/i18n/detection/middleware.ts +15 -7
  76. package/src/runtime/i18n/detection/types.ts +13 -5
  77. package/src/runtime/i18n/instance.ts +56 -31
  78. package/src/runtime/i18n/utils.ts +18 -9
  79. package/src/runtime/pluginSetup.ts +1 -1
  80. package/src/runtime/providerComposition.tsx +1 -1
  81. package/src/runtime/routerAdapter.tsx +6 -6
  82. package/src/runtime/utils.ts +5 -29
  83. package/src/server/redirectPolicy.ts +51 -76
  84. package/src/shared/detection.ts +1 -1
  85. package/src/shared/localisedUrls/index.ts +12 -1
  86. package/src/shared/localisedUrls/pathname.ts +4 -1
  87. package/src/shared/localisedUrls/redirect.ts +91 -0
  88. package/src/shared/localisedUrls/resolve.ts +91 -74
  89. package/src/shared/localisedUrls.ts +6 -0
  90. package/src/shared/utils.ts +2 -2
  91. package/tests/redirectPolicy.test.ts +43 -0
@@ -40,19 +40,19 @@ __webpack_require__.d(__webpack_exports__, {
40
40
  applyDetectedBackendPaths: ()=>applyDetectedBackendPaths,
41
41
  detectLocalesDirectory: ()=>detectLocalesDirectory
42
42
  });
43
+ const external_node_fs_namespaceObject = require("node:fs");
44
+ var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
45
+ const external_node_path_namespaceObject = require("node:path");
46
+ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
43
47
  const server_core_namespaceObject = require("@modern-js/server-core");
44
- const external_fs_namespaceObject = require("fs");
45
- var external_fs_default = /*#__PURE__*/ __webpack_require__.n(external_fs_namespaceObject);
46
- const external_path_namespaceObject = require("path");
47
- var external_path_default = /*#__PURE__*/ __webpack_require__.n(external_path_namespaceObject);
48
48
  const LOCALES_RESOURCE_PATTERN = '{{lng}}/{{ns}}.json';
49
49
  function hasJsonFiles(dirPath) {
50
50
  try {
51
- if (!external_fs_default().existsSync(dirPath) || !external_fs_default().statSync(dirPath).isDirectory()) return false;
52
- const entries = external_fs_default().readdirSync(dirPath);
51
+ if (!external_node_fs_default().existsSync(dirPath) || !external_node_fs_default().statSync(dirPath).isDirectory()) return false;
52
+ const entries = external_node_fs_default().readdirSync(dirPath);
53
53
  for (const entry of entries){
54
- const entryPath = external_path_default().join(dirPath, entry);
55
- const stat = external_fs_default().statSync(entryPath);
54
+ const entryPath = external_node_path_default().join(dirPath, entry);
55
+ const stat = external_node_fs_default().statSync(entryPath);
56
56
  if (stat.isFile() && entry.endsWith('.json')) return true;
57
57
  if (stat.isDirectory() && hasJsonFiles(entryPath)) return true;
58
58
  }
@@ -62,7 +62,7 @@ function hasJsonFiles(dirPath) {
62
62
  }
63
63
  }
64
64
  function toPosixPath(filePath) {
65
- return filePath.split(external_path_default().sep).join(external_path_default().posix.sep);
65
+ return filePath.split(external_node_path_default().sep).join(external_node_path_default().posix.sep);
66
66
  }
67
67
  function getPublicDirOutputPath(publicDir) {
68
68
  return (0, server_core_namespaceObject.normalizePublicDirPath)(publicDir);
@@ -89,20 +89,20 @@ function detectLocalesDirectory(appDirectory, normalizedConfig) {
89
89
  const publicDirPrefixes = (0, server_core_namespaceObject.getPublicDirRoutePrefixes)(normalizedConfig?.server?.publicDir);
90
90
  for(let index = 0; index < publicDirs.length; index++){
91
91
  const publicDir = publicDirs[index];
92
- if (external_path_default().isAbsolute(publicDir)) continue;
93
- const publicDirPath = external_path_default().join(appDirectory, publicDir);
92
+ if (external_node_path_default().isAbsolute(publicDir)) continue;
93
+ const publicDirPath = external_node_path_default().join(appDirectory, publicDir);
94
94
  const publicDirPrefix = publicDirPrefixes[index] || `/${(0, server_core_namespaceObject.normalizePublicDirPath)(publicDir)}`;
95
95
  const publicDirOutputPath = getPublicDirOutputPath(publicDir);
96
- if ('locales' === external_path_default().basename((0, server_core_namespaceObject.normalizePublicDirPath)(publicDir)) && hasJsonFiles(publicDirPath)) return buildDetectedLocalesDirectory(publicDirPrefix, `./${publicDirOutputPath}`);
97
- const localesPath = external_path_default().join(publicDirPath, 'locales');
96
+ if ('locales' === external_node_path_default().basename((0, server_core_namespaceObject.normalizePublicDirPath)(publicDir)) && hasJsonFiles(publicDirPath)) return buildDetectedLocalesDirectory(publicDirPrefix, `./${publicDirOutputPath}`);
97
+ const localesPath = external_node_path_default().join(publicDirPath, 'locales');
98
98
  if (hasJsonFiles(localesPath)) return buildDetectedLocalesDirectory(`${publicDirPrefix}/locales`, `./${publicDirOutputPath}/locales`);
99
99
  }
100
- const configPublicPath = external_path_default().join(appDirectory, 'config', 'public', 'locales');
100
+ const configPublicPath = external_node_path_default().join(appDirectory, 'config', 'public', 'locales');
101
101
  if (hasJsonFiles(configPublicPath)) return buildDetectedLocalesDirectory('/locales', './public/locales', [
102
102
  './config/public/locales',
103
103
  './public/locales'
104
104
  ]);
105
- const rootLocalesPath = external_path_default().join(appDirectory, 'locales');
105
+ const rootLocalesPath = external_node_path_default().join(appDirectory, 'locales');
106
106
  if (hasJsonFiles(rootLocalesPath)) return buildDetectedLocalesDirectory('/locales', './locales');
107
107
  }
108
108
  function applyDetectedBackendPaths(backendOptions, detectedLocales) {
@@ -41,23 +41,23 @@ __webpack_require__.d(__webpack_exports__, {
41
41
  convertBackendOptions: ()=>convertBackendOptions,
42
42
  resolveDefaultLocalesDir: ()=>resolveDefaultLocalesDir
43
43
  });
44
- const external_fs_namespaceObject = require("fs");
45
- var external_fs_default = /*#__PURE__*/ __webpack_require__.n(external_fs_namespaceObject);
46
- const external_path_namespaceObject = require("path");
47
- var external_path_default = /*#__PURE__*/ __webpack_require__.n(external_path_namespaceObject);
44
+ const external_node_fs_namespaceObject = require("node:fs");
45
+ var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
46
+ const external_node_path_namespaceObject = require("node:path");
47
+ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
48
48
  const CONVENTIONAL_LOCALES_DIRS = [
49
49
  './locales',
50
50
  './config/public/locales'
51
51
  ];
52
52
  const isDirectory = (dirPath)=>{
53
53
  try {
54
- return external_fs_default().statSync(dirPath).isDirectory();
54
+ return external_node_fs_default().statSync(dirPath).isDirectory();
55
55
  } catch {
56
56
  return false;
57
57
  }
58
58
  };
59
59
  const resolveDefaultLocalesDir = (cwd = process.cwd())=>{
60
- for (const dir of CONVENTIONAL_LOCALES_DIRS)if (isDirectory(external_path_default().resolve(cwd, dir))) return dir;
60
+ for (const dir of CONVENTIONAL_LOCALES_DIRS)if (isDirectory(external_node_path_default().resolve(cwd, dir))) return dir;
61
61
  return CONVENTIONAL_LOCALES_DIRS[0];
62
62
  };
63
63
  const DEFAULT_I18NEXT_BACKEND_OPTIONS = {
@@ -83,7 +83,7 @@ function getResourceBasePath(resourcePath) {
83
83
  }
84
84
  function pathExists(resourcePath) {
85
85
  try {
86
- return external_fs_default().existsSync(getResourceBasePath(resourcePath));
86
+ return external_node_fs_default().existsSync(getResourceBasePath(resourcePath));
87
87
  } catch {
88
88
  return false;
89
89
  }
@@ -50,9 +50,10 @@ const stableStringify = (value)=>{
50
50
  if (null == value) return JSON.stringify(value);
51
51
  if ('object' != typeof value) return JSON.stringify(value);
52
52
  if (Array.isArray(value)) return `[${value.map((item)=>stableStringify(item)).join(',')}]`;
53
- const sortedKeys = Object.keys(value).sort();
53
+ const record = value;
54
+ const sortedKeys = Object.keys(record).sort();
54
55
  const sortedEntries = sortedKeys.map((key)=>{
55
- const stringifiedValue = stableStringify(value[key]);
56
+ const stringifiedValue = stableStringify(record[key]);
56
57
  return `${JSON.stringify(key)}:${stringifiedValue}`;
57
58
  });
58
59
  return `{${sortedEntries.join(',')}}`;
@@ -29,9 +29,11 @@ var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
30
  function isI18nWrapperInstance(obj) {
31
31
  if (!obj || 'object' != typeof obj) return false;
32
- if (!obj.i18nInstance || 'object' != typeof obj.i18nInstance) return false;
33
- if (!obj.i18nInstance.instance) return false;
34
- if ('function' != typeof obj.init || 'function' != typeof obj.use) return false;
32
+ const candidate = obj;
33
+ if (!candidate.i18nInstance || 'object' != typeof candidate.i18nInstance) return false;
34
+ const wrapper = candidate.i18nInstance;
35
+ if (!wrapper.instance) return false;
36
+ if ('function' != typeof candidate.init || 'function' != typeof candidate.use) return false;
35
37
  return true;
36
38
  }
37
39
  function getI18nWrapperI18nextInstance(wrapperInstance) {
@@ -48,7 +50,8 @@ function getActualI18nextInstance(instance) {
48
50
  function isI18nInstance(obj) {
49
51
  if (!obj || 'object' != typeof obj) return false;
50
52
  if (isI18nWrapperInstance(obj)) return true;
51
- return 'function' == typeof obj.init && 'function' == typeof obj.use;
53
+ const candidate = obj;
54
+ return 'function' == typeof candidate.init && 'function' == typeof candidate.use;
52
55
  }
53
56
  async function tryImportI18next() {
54
57
  try {
@@ -88,21 +91,18 @@ async function getI18nInstance(userInstance) {
88
91
  __webpack_require__.d(__webpack_exports__, {
89
92
  getActualI18nextInstance: ()=>getActualI18nextInstance,
90
93
  getI18nInstance: ()=>getI18nInstance,
91
- getI18nWrapperI18nextInstance: ()=>getI18nWrapperI18nextInstance,
92
94
  getI18nextInstanceForProvider: ()=>getI18nextInstanceForProvider,
93
95
  isI18nInstance: ()=>isI18nInstance,
94
96
  isI18nWrapperInstance: ()=>isI18nWrapperInstance
95
97
  });
96
98
  exports.getActualI18nextInstance = __webpack_exports__.getActualI18nextInstance;
97
99
  exports.getI18nInstance = __webpack_exports__.getI18nInstance;
98
- exports.getI18nWrapperI18nextInstance = __webpack_exports__.getI18nWrapperI18nextInstance;
99
100
  exports.getI18nextInstanceForProvider = __webpack_exports__.getI18nextInstanceForProvider;
100
101
  exports.isI18nInstance = __webpack_exports__.isI18nInstance;
101
102
  exports.isI18nWrapperInstance = __webpack_exports__.isI18nWrapperInstance;
102
103
  for(var __rspack_i in __webpack_exports__)if (-1 === [
103
104
  "getActualI18nextInstance",
104
105
  "getI18nInstance",
105
- "getI18nWrapperI18nextInstance",
106
106
  "getI18nextInstanceForProvider",
107
107
  "isI18nInstance",
108
108
  "isI18nWrapperInstance"
@@ -89,15 +89,7 @@ const detectLanguageFromPath = (pathname, languages, localePathRedirect)=>{
89
89
  detected: false
90
90
  };
91
91
  };
92
- const shouldIgnoreRedirect = (pathname, languages, ignoreRedirectRoutes)=>{
93
- if (!ignoreRedirectRoutes) return false;
94
- const segments = pathname.split('/').filter(Boolean);
95
- let pathWithoutLang = pathname;
96
- if (segments.length > 0 && languages.includes(segments[0])) pathWithoutLang = `/${segments.slice(1).join('/')}`;
97
- const normalizedPath = pathWithoutLang.startsWith('/') ? pathWithoutLang : `/${pathWithoutLang}`;
98
- if ('function' == typeof ignoreRedirectRoutes) return ignoreRedirectRoutes(normalizedPath);
99
- return ignoreRedirectRoutes.some((pattern)=>normalizedPath === pattern || normalizedPath.startsWith(`${pattern}/`));
100
- };
92
+ const shouldIgnoreRedirect = (pathname, languages, ignoreRedirectRoutes)=>(0, localisedUrls_js_namespaceObject.shouldSkipLocaleRedirect)(pathname, languages, ignoreRedirectRoutes);
101
93
  exports.buildLocalizedUrl = __webpack_exports__.buildLocalizedUrl;
102
94
  exports.detectLanguageFromPath = __webpack_exports__.detectLanguageFromPath;
103
95
  exports.getEntryPath = __webpack_exports__.getEntryPath;
@@ -35,33 +35,27 @@ __webpack_require__.d(__webpack_exports__, {
35
35
  shouldIgnoreRedirect: ()=>shouldIgnoreRedirect
36
36
  });
37
37
  const localisedUrls_js_namespaceObject = require("../shared/localisedUrls.js");
38
- const shouldIgnoreRedirect = (pathname, urlPath, ignoreRedirectRoutes)=>{
39
- if (!ignoreRedirectRoutes) return false;
38
+ const stripUrlPathPrefix = (pathname, urlPath)=>{
40
39
  const basePath = urlPath.replace('/*', '');
40
+ if (!basePath || '/' === basePath) return pathname;
41
41
  const remainingPath = pathname.startsWith(basePath) ? pathname.slice(basePath.length) : pathname;
42
- const normalizedPath = remainingPath.startsWith('/') ? remainingPath : `/${remainingPath}`;
43
- if ('function' == typeof ignoreRedirectRoutes) return ignoreRedirectRoutes(normalizedPath);
44
- return ignoreRedirectRoutes.some((pattern)=>normalizedPath === pattern || normalizedPath.startsWith(`${pattern}/`));
42
+ return remainingPath || '/';
43
+ };
44
+ const shouldIgnoreRedirect = (pathname, urlPath, ignoreRedirectRoutes)=>{
45
+ const remainingPath = stripUrlPathPrefix(pathname, urlPath);
46
+ return (0, localisedUrls_js_namespaceObject.shouldSkipLocaleRedirect)(remainingPath, [], ignoreRedirectRoutes);
45
47
  };
46
48
  const isStaticResourceRequest = (pathname, staticRoutePrefixes, languages = [])=>{
47
- if (staticRoutePrefixes.some((prefix)=>pathname.startsWith(`${prefix}/`) || pathname === prefix)) return true;
48
- const standardStaticPrefixes = [
49
- '/static/',
50
- '/upload/'
51
- ];
52
- if (standardStaticPrefixes.some((prefix)=>pathname.startsWith(prefix))) return true;
53
- const pathSegments = pathname.split('/').filter(Boolean);
54
- if (pathSegments.length > 0 && languages.includes(pathSegments[0])) {
55
- const pathWithoutLang = '/' + pathSegments.slice(1).join('/');
56
- if (standardStaticPrefixes.some((prefix)=>pathWithoutLang.startsWith(prefix)) || staticRoutePrefixes.some((prefix)=>pathWithoutLang.startsWith(`${prefix}/`) || pathWithoutLang === prefix)) return true;
57
- }
58
- return false;
49
+ if ((0, localisedUrls_js_namespaceObject.isDefaultLocaleRedirectSkipPath)(pathname, languages)) return true;
50
+ const matchesStaticRoutePrefix = (targetPathname)=>staticRoutePrefixes.some((prefix)=>(0, localisedUrls_js_namespaceObject.matchesPathPrefix)(targetPathname, prefix));
51
+ if (matchesStaticRoutePrefix(pathname)) return true;
52
+ const pathWithoutLanguage = (0, localisedUrls_js_namespaceObject.stripLanguagePrefix)(pathname, languages);
53
+ return pathWithoutLanguage !== pathname && matchesStaticRoutePrefix(pathWithoutLanguage);
59
54
  };
60
55
  const getLanguageFromPath = (req, urlPath, languages)=>{
61
56
  const url = new URL(req.url, `http://${req.header().host}`);
62
57
  const pathname = url.pathname;
63
- const basePath = urlPath.replace('/*', '');
64
- const remainingPath = pathname.startsWith(basePath) ? pathname.slice(basePath.length) : pathname;
58
+ const remainingPath = stripUrlPathPrefix(pathname, urlPath);
65
59
  const segments = remainingPath.split('/').filter(Boolean);
66
60
  const firstSegment = segments[0];
67
61
  if (languages.includes(firstSegment)) return firstSegment;
@@ -71,7 +65,7 @@ const buildLocalizedUrl = (req, urlPath, language, languages, localisedUrls)=>{
71
65
  const url = new URL(req.url);
72
66
  const pathname = url.pathname;
73
67
  const basePath = urlPath.replace('/*', '');
74
- const remainingPath = pathname.startsWith(basePath) ? pathname.slice(basePath.length) : pathname;
68
+ const remainingPath = stripUrlPathPrefix(pathname, urlPath);
75
69
  const newPathname = (0, localisedUrls_js_namespaceObject.localiseTargetPathname)(remainingPath, language, languages, localisedUrls);
76
70
  const suffix = `${url.search}${url.hash}`;
77
71
  const localizedUrl = '/' === basePath ? newPathname + suffix : basePath + newPathname + suffix;
@@ -1,109 +1,7 @@
1
1
  "use strict";
2
- var __webpack_require__ = {};
3
- (()=>{
4
- __webpack_require__.d = (exports1, getters, values)=>{
5
- var define = (defs, kind)=>{
6
- for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
- enumerable: true,
8
- [kind]: defs[key]
9
- });
10
- };
11
- define(getters, "get");
12
- define(values, "value");
13
- };
14
- })();
15
- (()=>{
16
- __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
- })();
18
- (()=>{
19
- __webpack_require__.r = (exports1)=>{
20
- if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
- value: 'Module'
22
- });
23
- Object.defineProperty(exports1, '__esModule', {
24
- value: true
25
- });
26
- };
27
- })();
28
2
  var __webpack_exports__ = {};
29
- __webpack_require__.r(__webpack_exports__);
30
- __webpack_require__.d(__webpack_exports__, {
31
- detectLanguageFromRequest: ()=>detectLanguageFromRequest
32
- });
33
- const config_js_namespaceObject = require("../runtime/i18n/detection/config.js");
34
- function detectLanguageFromRequest(req, languages, detectionOptions) {
35
- try {
36
- const mergedDetection = detectionOptions ? (0, config_js_namespaceObject.mergeDetectionOptions)(detectionOptions) : config_js_namespaceObject.DEFAULT_I18NEXT_DETECTION_OPTIONS;
37
- const order = (mergedDetection.order || []).filter((item)=>![
38
- 'path',
39
- 'localStorage',
40
- 'navigator',
41
- 'htmlTag',
42
- 'subdomain'
43
- ].includes(item));
44
- const detectionOrder = order.length > 0 ? order : [
45
- 'querystring',
46
- 'cookie',
47
- 'header'
48
- ];
49
- const getHeader = (name)=>{
50
- req.headers, Headers;
51
- return req.headers.get(name);
52
- };
53
- for (const method of detectionOrder){
54
- let detectedLang = null;
55
- switch(method){
56
- case 'querystring':
57
- {
58
- const lookupKey = mergedDetection.lookupQuerystring || config_js_namespaceObject.DEFAULT_I18NEXT_DETECTION_OPTIONS.lookupQuerystring || 'lng';
59
- const host = getHeader('host') || 'localhost';
60
- const url = new URL(req.url, `http://${host}`);
61
- detectedLang = url.searchParams.get(lookupKey);
62
- break;
63
- }
64
- case 'cookie':
65
- {
66
- const lookupKey = mergedDetection.lookupCookie || config_js_namespaceObject.DEFAULT_I18NEXT_DETECTION_OPTIONS.lookupCookie || 'i18next';
67
- const cookieHeader = getHeader('Cookie');
68
- if (cookieHeader) {
69
- const cookies = cookieHeader.split(';').reduce((acc, item)=>{
70
- const [key, value] = item.trim().split('=');
71
- if (key && value) acc[key] = value;
72
- return acc;
73
- }, {});
74
- detectedLang = cookies[lookupKey] || null;
75
- }
76
- break;
77
- }
78
- case 'header':
79
- {
80
- const lookupKey = mergedDetection.lookupHeader || config_js_namespaceObject.DEFAULT_I18NEXT_DETECTION_OPTIONS.lookupHeader || 'accept-language';
81
- const acceptLanguage = getHeader(lookupKey);
82
- if (acceptLanguage) {
83
- const languagesList = acceptLanguage.split(',').map((lang)=>{
84
- const [code, q] = lang.trim().split(';');
85
- return {
86
- code: code.split('-')[0],
87
- quality: q ? parseFloat(q.split('=')[1]) : 1.0
88
- };
89
- }).sort((a, b)=>b.quality - a.quality);
90
- for (const lang of languagesList)if (0 === languages.length || languages.includes(lang.code)) {
91
- detectedLang = lang.code;
92
- break;
93
- }
94
- }
95
- break;
96
- }
97
- }
98
- if (detectedLang && (0 === languages.length || languages.includes(detectedLang))) return detectedLang;
99
- }
100
- } catch (error) {}
101
- return null;
102
- }
103
- exports.detectLanguageFromRequest = __webpack_exports__.detectLanguageFromRequest;
104
- for(var __rspack_i in __webpack_exports__)if (-1 === [
105
- "detectLanguageFromRequest"
106
- ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
3
+ require("../runtime/i18n/detection/config.js");
4
+ for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
107
5
  Object.defineProperty(exports, '__esModule', {
108
6
  value: true
109
7
  });
@@ -28,46 +28,62 @@ var __webpack_require__ = {};
28
28
  var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
+ DEFAULT_LOCALE_REDIRECT_SKIP_RULES: ()=>external_redirect_js_namespaceObject.DEFAULT_LOCALE_REDIRECT_SKIP_RULES,
31
32
  applyLocalisedUrlsToRoutes: ()=>external_routes_js_namespaceObject.applyLocalisedUrlsToRoutes,
32
33
  buildPathFromPattern: ()=>external_patterns_js_namespaceObject.buildPathFromPattern,
33
34
  canonicalTargetPathname: ()=>external_pathname_js_namespaceObject.canonicalTargetPathname,
35
+ isDefaultLocaleRedirectSkipPath: ()=>external_redirect_js_namespaceObject.isDefaultLocaleRedirectSkipPath,
34
36
  localiseTargetPathname: ()=>external_pathname_js_namespaceObject.localiseTargetPathname,
35
37
  matchPathPattern: ()=>external_patterns_js_namespaceObject.matchPathPattern,
38
+ matchesPathPrefix: ()=>external_redirect_js_namespaceObject.matchesPathPrefix,
36
39
  normalisePathPattern: ()=>external_normalise_js_namespaceObject.normalisePathPattern,
37
40
  normalisePathname: ()=>external_normalise_js_namespaceObject.normalisePathname,
38
41
  resolveCanonicalLocalisedPath: ()=>external_resolve_js_namespaceObject.resolveCanonicalLocalisedPath,
39
42
  resolveLocalisedPath: ()=>external_resolve_js_namespaceObject.resolveLocalisedPath,
40
43
  resolveLocalisedUrlsConfig: ()=>external_config_js_namespaceObject.resolveLocalisedUrlsConfig,
44
+ shouldSkipLocaleRedirect: ()=>external_redirect_js_namespaceObject.shouldSkipLocaleRedirect,
45
+ stripLanguagePrefix: ()=>external_pathname_js_namespaceObject.stripLanguagePrefix,
41
46
  validateLocalisedUrls: ()=>external_routes_js_namespaceObject.validateLocalisedUrls
42
47
  });
43
48
  const external_config_js_namespaceObject = require("./config.js");
44
49
  const external_normalise_js_namespaceObject = require("./normalise.js");
45
50
  const external_pathname_js_namespaceObject = require("./pathname.js");
46
51
  const external_patterns_js_namespaceObject = require("./patterns.js");
52
+ const external_redirect_js_namespaceObject = require("./redirect.js");
47
53
  const external_resolve_js_namespaceObject = require("./resolve.js");
48
54
  const external_routes_js_namespaceObject = require("./routes.js");
55
+ exports.DEFAULT_LOCALE_REDIRECT_SKIP_RULES = __webpack_exports__.DEFAULT_LOCALE_REDIRECT_SKIP_RULES;
49
56
  exports.applyLocalisedUrlsToRoutes = __webpack_exports__.applyLocalisedUrlsToRoutes;
50
57
  exports.buildPathFromPattern = __webpack_exports__.buildPathFromPattern;
51
58
  exports.canonicalTargetPathname = __webpack_exports__.canonicalTargetPathname;
59
+ exports.isDefaultLocaleRedirectSkipPath = __webpack_exports__.isDefaultLocaleRedirectSkipPath;
52
60
  exports.localiseTargetPathname = __webpack_exports__.localiseTargetPathname;
53
61
  exports.matchPathPattern = __webpack_exports__.matchPathPattern;
62
+ exports.matchesPathPrefix = __webpack_exports__.matchesPathPrefix;
54
63
  exports.normalisePathPattern = __webpack_exports__.normalisePathPattern;
55
64
  exports.normalisePathname = __webpack_exports__.normalisePathname;
56
65
  exports.resolveCanonicalLocalisedPath = __webpack_exports__.resolveCanonicalLocalisedPath;
57
66
  exports.resolveLocalisedPath = __webpack_exports__.resolveLocalisedPath;
58
67
  exports.resolveLocalisedUrlsConfig = __webpack_exports__.resolveLocalisedUrlsConfig;
68
+ exports.shouldSkipLocaleRedirect = __webpack_exports__.shouldSkipLocaleRedirect;
69
+ exports.stripLanguagePrefix = __webpack_exports__.stripLanguagePrefix;
59
70
  exports.validateLocalisedUrls = __webpack_exports__.validateLocalisedUrls;
60
71
  for(var __rspack_i in __webpack_exports__)if (-1 === [
72
+ "DEFAULT_LOCALE_REDIRECT_SKIP_RULES",
61
73
  "applyLocalisedUrlsToRoutes",
62
74
  "buildPathFromPattern",
63
75
  "canonicalTargetPathname",
76
+ "isDefaultLocaleRedirectSkipPath",
64
77
  "localiseTargetPathname",
65
78
  "matchPathPattern",
79
+ "matchesPathPrefix",
66
80
  "normalisePathPattern",
67
81
  "normalisePathname",
68
82
  "resolveCanonicalLocalisedPath",
69
83
  "resolveLocalisedPath",
70
84
  "resolveLocalisedUrlsConfig",
85
+ "shouldSkipLocaleRedirect",
86
+ "stripLanguagePrefix",
71
87
  "validateLocalisedUrls"
72
88
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
73
89
  Object.defineProperty(exports, '__esModule', {
@@ -29,7 +29,8 @@ var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
31
  canonicalTargetPathname: ()=>canonicalTargetPathname,
32
- localiseTargetPathname: ()=>localiseTargetPathname
32
+ localiseTargetPathname: ()=>localiseTargetPathname,
33
+ stripLanguagePrefix: ()=>stripLanguagePrefix
33
34
  });
34
35
  const external_config_js_namespaceObject = require("./config.js");
35
36
  const external_resolve_js_namespaceObject = require("./resolve.js");
@@ -56,9 +57,11 @@ const canonicalTargetPathname = (pathname, languages, localisedUrls)=>{
56
57
  };
57
58
  exports.canonicalTargetPathname = __webpack_exports__.canonicalTargetPathname;
58
59
  exports.localiseTargetPathname = __webpack_exports__.localiseTargetPathname;
60
+ exports.stripLanguagePrefix = __webpack_exports__.stripLanguagePrefix;
59
61
  for(var __rspack_i in __webpack_exports__)if (-1 === [
60
62
  "canonicalTargetPathname",
61
- "localiseTargetPathname"
63
+ "localiseTargetPathname",
64
+ "stripLanguagePrefix"
62
65
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
63
66
  Object.defineProperty(exports, '__esModule', {
64
67
  value: true
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ DEFAULT_LOCALE_REDIRECT_SKIP_RULES: ()=>DEFAULT_LOCALE_REDIRECT_SKIP_RULES,
32
+ isDefaultLocaleRedirectSkipPath: ()=>isDefaultLocaleRedirectSkipPath,
33
+ matchesPathPrefix: ()=>matchesPathPrefix,
34
+ shouldSkipLocaleRedirect: ()=>shouldSkipLocaleRedirect
35
+ });
36
+ const external_normalise_js_namespaceObject = require("./normalise.js");
37
+ const external_pathname_js_namespaceObject = require("./pathname.js");
38
+ const DEFAULT_LOCALE_REDIRECT_SKIP_RULES = [
39
+ {
40
+ type: 'exact',
41
+ path: '/mf-manifest.json'
42
+ },
43
+ {
44
+ type: 'exact',
45
+ path: '/mf-stats.json'
46
+ },
47
+ {
48
+ type: 'exact',
49
+ path: '/remoteEntry.js'
50
+ },
51
+ {
52
+ type: 'prefix',
53
+ path: '/static/'
54
+ },
55
+ {
56
+ type: 'prefix',
57
+ path: '/upload/'
58
+ }
59
+ ];
60
+ const stripTrailingSlash = (pathname)=>pathname.length > 1 ? pathname.replace(/\/+$/, '') : pathname;
61
+ const matchesPathPrefix = (pathname, prefix)=>{
62
+ const normalizedPathname = (0, external_normalise_js_namespaceObject.normalisePathname)(pathname);
63
+ const normalizedPrefix = stripTrailingSlash((0, external_normalise_js_namespaceObject.normalisePathname)(prefix));
64
+ return normalizedPathname === normalizedPrefix || normalizedPathname.startsWith(`${normalizedPrefix}/`);
65
+ };
66
+ const matchesSkipRule = (pathname, rule)=>{
67
+ if ('exact' === rule.type) return (0, external_normalise_js_namespaceObject.normalisePathname)(pathname) === (0, external_normalise_js_namespaceObject.normalisePathname)(rule.path);
68
+ return matchesPathPrefix(pathname, rule.path);
69
+ };
70
+ const isDefaultLocaleRedirectSkipPath = (pathname, languages = [])=>{
71
+ const normalizedPathname = (0, external_normalise_js_namespaceObject.normalisePathname)(pathname);
72
+ const pathWithoutLanguage = (0, external_pathname_js_namespaceObject.stripLanguagePrefix)(normalizedPathname, languages);
73
+ return DEFAULT_LOCALE_REDIRECT_SKIP_RULES.some((rule)=>matchesSkipRule(pathWithoutLanguage, rule));
74
+ };
75
+ const shouldSkipLocaleRedirect = (pathname, languages = [], ignoreRedirectRoutes)=>{
76
+ const normalizedPathname = (0, external_normalise_js_namespaceObject.normalisePathname)(pathname);
77
+ const pathWithoutLanguage = (0, external_pathname_js_namespaceObject.stripLanguagePrefix)(normalizedPathname, languages);
78
+ if (isDefaultLocaleRedirectSkipPath(pathWithoutLanguage)) return true;
79
+ if (!ignoreRedirectRoutes) return false;
80
+ if ('function' == typeof ignoreRedirectRoutes) return ignoreRedirectRoutes(pathWithoutLanguage);
81
+ return ignoreRedirectRoutes.some((pattern)=>matchesPathPrefix(pathWithoutLanguage, pattern));
82
+ };
83
+ exports.DEFAULT_LOCALE_REDIRECT_SKIP_RULES = __webpack_exports__.DEFAULT_LOCALE_REDIRECT_SKIP_RULES;
84
+ exports.isDefaultLocaleRedirectSkipPath = __webpack_exports__.isDefaultLocaleRedirectSkipPath;
85
+ exports.matchesPathPrefix = __webpack_exports__.matchesPathPrefix;
86
+ exports.shouldSkipLocaleRedirect = __webpack_exports__.shouldSkipLocaleRedirect;
87
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
88
+ "DEFAULT_LOCALE_REDIRECT_SKIP_RULES",
89
+ "isDefaultLocaleRedirectSkipPath",
90
+ "matchesPathPrefix",
91
+ "shouldSkipLocaleRedirect"
92
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
93
+ Object.defineProperty(exports, '__esModule', {
94
+ value: true
95
+ });
@@ -33,53 +33,50 @@ __webpack_require__.d(__webpack_exports__, {
33
33
  });
34
34
  const external_normalise_js_namespaceObject = require("./normalise.js");
35
35
  const external_patterns_js_namespaceObject = require("./patterns.js");
36
- const resolveLocalisedPath = (pathname, targetLanguage, languages, localisedUrls)=>{
37
- const normalizedPathname = (0, external_normalise_js_namespaceObject.normalisePathname)(pathname);
38
- const canonicalCandidates = (0, external_patterns_js_namespaceObject.sortPatternsBySpecificity)(Object.entries(localisedUrls).map(([canonicalPattern, localisedUrlEntry])=>({
36
+ const getCanonicalCandidates = (localisedUrls)=>(0, external_patterns_js_namespaceObject.sortPatternsBySpecificity)(Object.entries(localisedUrls).map(([canonicalPattern, localisedUrlEntry])=>({
39
37
  pattern: canonicalPattern,
40
38
  canonicalPattern,
41
39
  localisedUrlEntry
42
40
  })));
43
- for (const { canonicalPattern, localisedUrlEntry } of canonicalCandidates){
44
- const targetPattern = localisedUrlEntry[targetLanguage];
45
- if (!targetPattern) continue;
46
- const params = (0, external_patterns_js_namespaceObject.matchPathPattern)(normalizedPathname, canonicalPattern);
47
- if (params) return (0, external_patterns_js_namespaceObject.buildPathFromPattern)(targetPattern, params);
48
- }
49
- const localisedCandidates = (0, external_patterns_js_namespaceObject.sortPatternsBySpecificity)(Object.values(localisedUrls).flatMap((localisedUrlEntry)=>{
50
- const targetPattern = localisedUrlEntry[targetLanguage];
51
- if (!targetPattern) return [];
52
- return languages.map((language)=>localisedUrlEntry[language]).filter((sourcePattern)=>Boolean(sourcePattern)).map((sourcePattern)=>({
53
- pattern: sourcePattern,
54
- sourcePattern,
55
- targetPattern
56
- }));
57
- }));
58
- for (const { sourcePattern, targetPattern } of localisedCandidates){
59
- const params = (0, external_patterns_js_namespaceObject.matchPathPattern)(normalizedPathname, sourcePattern);
60
- if (params) return (0, external_patterns_js_namespaceObject.buildPathFromPattern)(targetPattern, params);
61
- }
62
- return normalizedPathname;
63
- };
64
- const resolveCanonicalLocalisedPath = (pathname, languages, localisedUrls)=>{
41
+ const resolveLocalisedUrlPath = (pathname, languages, localisedUrls, options)=>{
65
42
  const normalizedPathname = (0, external_normalise_js_namespaceObject.normalisePathname)(pathname);
66
- const canonicalCandidates = (0, external_patterns_js_namespaceObject.sortPatternsBySpecificity)(Object.entries(localisedUrls).map(([canonicalPattern, localisedUrlEntry])=>({
67
- pattern: canonicalPattern,
68
- canonicalPattern,
69
- localisedUrlEntry
70
- })));
43
+ const canonicalCandidates = getCanonicalCandidates(localisedUrls);
71
44
  for (const { canonicalPattern, localisedUrlEntry } of canonicalCandidates){
45
+ const targetPattern = 'localised' === options.mode ? localisedUrlEntry[options.targetLanguage] : canonicalPattern;
46
+ if (!targetPattern) continue;
72
47
  const canonicalParams = (0, external_patterns_js_namespaceObject.matchPathPattern)(normalizedPathname, canonicalPattern);
73
- if (canonicalParams) return (0, external_patterns_js_namespaceObject.buildPathFromPattern)(canonicalPattern, canonicalParams);
74
- for (const language of languages){
48
+ if (canonicalParams) return (0, external_patterns_js_namespaceObject.buildPathFromPattern)(targetPattern, canonicalParams);
49
+ if ('canonical' === options.mode) for (const language of languages){
75
50
  const sourcePattern = localisedUrlEntry[language];
76
51
  if (!sourcePattern) continue;
77
52
  const params = (0, external_patterns_js_namespaceObject.matchPathPattern)(normalizedPathname, sourcePattern);
78
53
  if (params) return (0, external_patterns_js_namespaceObject.buildPathFromPattern)(canonicalPattern, params);
79
54
  }
80
55
  }
56
+ if ('localised' === options.mode) {
57
+ const localisedCandidates = (0, external_patterns_js_namespaceObject.sortPatternsBySpecificity)(Object.values(localisedUrls).flatMap((localisedUrlEntry)=>{
58
+ const targetPattern = localisedUrlEntry[options.targetLanguage];
59
+ if (!targetPattern) return [];
60
+ return languages.map((language)=>localisedUrlEntry[language]).filter((sourcePattern)=>Boolean(sourcePattern)).map((sourcePattern)=>({
61
+ pattern: sourcePattern,
62
+ sourcePattern,
63
+ targetPattern
64
+ }));
65
+ }));
66
+ for (const { sourcePattern, targetPattern } of localisedCandidates){
67
+ const params = (0, external_patterns_js_namespaceObject.matchPathPattern)(normalizedPathname, sourcePattern);
68
+ if (params) return (0, external_patterns_js_namespaceObject.buildPathFromPattern)(targetPattern, params);
69
+ }
70
+ }
81
71
  return normalizedPathname;
82
72
  };
73
+ const resolveLocalisedPath = (pathname, targetLanguage, languages, localisedUrls)=>resolveLocalisedUrlPath(pathname, languages, localisedUrls, {
74
+ mode: 'localised',
75
+ targetLanguage
76
+ });
77
+ const resolveCanonicalLocalisedPath = (pathname, languages, localisedUrls)=>resolveLocalisedUrlPath(pathname, languages, localisedUrls, {
78
+ mode: 'canonical'
79
+ });
83
80
  exports.resolveCanonicalLocalisedPath = __webpack_exports__.resolveCanonicalLocalisedPath;
84
81
  exports.resolveLocalisedPath = __webpack_exports__.resolveLocalisedPath;
85
82
  for(var __rspack_i in __webpack_exports__)if (-1 === [