@bleedingdev/modern-js-plugin-i18n 3.2.0-ultramodern.11 → 3.2.0-ultramodern.110

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 (97) hide show
  1. package/dist/cjs/cli/index.js +32 -5
  2. package/dist/cjs/runtime/I18nLink.js +21 -22
  3. package/dist/cjs/runtime/context.js +41 -10
  4. package/dist/cjs/runtime/hooks.js +17 -10
  5. package/dist/cjs/runtime/i18n/backend/config.js +9 -5
  6. package/dist/cjs/runtime/i18n/backend/defaults.js +15 -10
  7. package/dist/cjs/runtime/i18n/backend/defaults.node.js +16 -11
  8. package/dist/cjs/runtime/i18n/backend/index.js +9 -5
  9. package/dist/cjs/runtime/i18n/backend/middleware.common.js +9 -5
  10. package/dist/cjs/runtime/i18n/backend/middleware.js +9 -5
  11. package/dist/cjs/runtime/i18n/backend/middleware.node.js +13 -9
  12. package/dist/cjs/runtime/i18n/backend/sdk-backend.js +9 -5
  13. package/dist/cjs/runtime/i18n/backend/sdk-event.js +16 -11
  14. package/dist/cjs/runtime/i18n/detection/config.js +9 -5
  15. package/dist/cjs/runtime/i18n/detection/index.js +9 -5
  16. package/dist/cjs/runtime/i18n/detection/middleware.js +9 -5
  17. package/dist/cjs/runtime/i18n/detection/middleware.node.js +9 -5
  18. package/dist/cjs/runtime/i18n/index.js +9 -5
  19. package/dist/cjs/runtime/i18n/instance.js +17 -37
  20. package/dist/cjs/runtime/i18n/react-i18next.js +53 -0
  21. package/dist/cjs/runtime/i18n/utils.js +9 -17
  22. package/dist/cjs/runtime/index.js +27 -15
  23. package/dist/cjs/runtime/routerAdapter.js +167 -0
  24. package/dist/cjs/runtime/utils.js +72 -99
  25. package/dist/cjs/server/index.js +69 -13
  26. package/dist/cjs/shared/deepMerge.js +12 -8
  27. package/dist/cjs/shared/detection.js +9 -5
  28. package/dist/cjs/shared/localisedUrls.js +241 -0
  29. package/dist/cjs/shared/utils.js +15 -11
  30. package/dist/esm/cli/index.mjs +23 -0
  31. package/dist/esm/runtime/I18nLink.mjs +12 -17
  32. package/dist/esm/runtime/context.mjs +34 -7
  33. package/dist/esm/runtime/hooks.mjs +9 -6
  34. package/dist/esm/runtime/i18n/backend/defaults.mjs +1 -1
  35. package/dist/esm/runtime/i18n/backend/defaults.node.mjs +2 -2
  36. package/dist/esm/runtime/i18n/backend/middleware.node.mjs +3 -3
  37. package/dist/esm/runtime/i18n/instance.mjs +1 -19
  38. package/dist/esm/runtime/i18n/react-i18next.mjs +15 -0
  39. package/dist/esm/runtime/i18n/utils.mjs +0 -12
  40. package/dist/esm/runtime/index.mjs +19 -11
  41. package/dist/esm/runtime/routerAdapter.mjs +129 -0
  42. package/dist/esm/runtime/utils.mjs +11 -30
  43. package/dist/esm/server/index.mjs +53 -7
  44. package/dist/esm/shared/localisedUrls.mjs +191 -0
  45. package/dist/esm-node/cli/index.mjs +23 -0
  46. package/dist/esm-node/runtime/I18nLink.mjs +12 -17
  47. package/dist/esm-node/runtime/context.mjs +34 -7
  48. package/dist/esm-node/runtime/hooks.mjs +9 -6
  49. package/dist/esm-node/runtime/i18n/backend/defaults.mjs +1 -1
  50. package/dist/esm-node/runtime/i18n/backend/defaults.node.mjs +2 -2
  51. package/dist/esm-node/runtime/i18n/backend/middleware.node.mjs +3 -3
  52. package/dist/esm-node/runtime/i18n/instance.mjs +1 -19
  53. package/dist/esm-node/runtime/i18n/react-i18next.mjs +16 -0
  54. package/dist/esm-node/runtime/i18n/utils.mjs +0 -12
  55. package/dist/esm-node/runtime/index.mjs +19 -11
  56. package/dist/esm-node/runtime/routerAdapter.mjs +130 -0
  57. package/dist/esm-node/runtime/utils.mjs +11 -30
  58. package/dist/esm-node/server/index.mjs +53 -7
  59. package/dist/esm-node/shared/localisedUrls.mjs +192 -0
  60. package/dist/types/cli/index.d.ts +1 -0
  61. package/dist/types/runtime/I18nLink.d.ts +15 -0
  62. package/dist/types/runtime/context.d.ts +3 -0
  63. package/dist/types/runtime/hooks.d.ts +4 -2
  64. package/dist/types/runtime/i18n/backend/middleware.node.d.ts +1 -1
  65. package/dist/types/runtime/i18n/instance.d.ts +4 -6
  66. package/dist/types/runtime/i18n/react-i18next.d.ts +7 -0
  67. package/dist/types/runtime/index.d.ts +1 -0
  68. package/dist/types/runtime/routerAdapter.d.ts +26 -0
  69. package/dist/types/runtime/types.d.ts +1 -1
  70. package/dist/types/runtime/utils.d.ts +2 -7
  71. package/dist/types/server/index.d.ts +6 -0
  72. package/dist/types/shared/localisedUrls.d.ts +13 -0
  73. package/dist/types/shared/type.d.ts +12 -0
  74. package/package.json +23 -27
  75. package/rstest.config.mts +39 -0
  76. package/src/cli/index.ts +44 -1
  77. package/src/runtime/I18nLink.tsx +13 -17
  78. package/src/runtime/context.tsx +45 -7
  79. package/src/runtime/hooks.ts +13 -4
  80. package/src/runtime/i18n/backend/defaults.node.ts +2 -2
  81. package/src/runtime/i18n/backend/defaults.ts +3 -1
  82. package/src/runtime/i18n/backend/middleware.node.ts +1 -1
  83. package/src/runtime/i18n/instance.ts +3 -30
  84. package/src/runtime/i18n/react-i18next.ts +25 -0
  85. package/src/runtime/i18n/utils.ts +4 -26
  86. package/src/runtime/index.tsx +23 -10
  87. package/src/runtime/routerAdapter.tsx +333 -0
  88. package/src/runtime/types.ts +1 -1
  89. package/src/runtime/utils.ts +22 -34
  90. package/src/server/index.ts +117 -10
  91. package/src/shared/localisedUrls.ts +393 -0
  92. package/src/shared/type.ts +12 -0
  93. package/tests/i18nUtils.test.ts +52 -0
  94. package/tests/localisedUrls.test.ts +312 -0
  95. package/tests/routerAdapter.test.tsx +452 -0
  96. package/dist/esm/rslib-runtime.mjs +0 -18
  97. package/dist/esm-node/rslib-runtime.mjs +0 -19
@@ -1,25 +1,15 @@
1
1
  "use strict";
2
- var __webpack_modules__ = {
3
- "@modern-js/runtime/router" (module) {
4
- module.exports = require("@modern-js/runtime/router");
5
- }
6
- };
7
- var __webpack_module_cache__ = {};
8
- function __webpack_require__(moduleId) {
9
- var cachedModule = __webpack_module_cache__[moduleId];
10
- if (void 0 !== cachedModule) return cachedModule.exports;
11
- var module = __webpack_module_cache__[moduleId] = {
12
- exports: {}
13
- };
14
- __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
15
- return module.exports;
16
- }
2
+ var __webpack_require__ = {};
17
3
  (()=>{
18
- __webpack_require__.d = (exports1, definition)=>{
19
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
20
- enumerable: true,
21
- get: definition[key]
22
- });
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");
23
13
  };
24
14
  })();
25
15
  (()=>{
@@ -36,100 +26,83 @@ function __webpack_require__(moduleId) {
36
26
  };
37
27
  })();
38
28
  var __webpack_exports__ = {};
39
- (()=>{
40
- __webpack_require__.r(__webpack_exports__);
41
- __webpack_require__.d(__webpack_exports__, {
42
- buildLocalizedUrl: ()=>buildLocalizedUrl,
43
- detectLanguageFromPath: ()=>detectLanguageFromPath,
44
- getEntryPath: ()=>getEntryPath,
45
- getLanguageFromPath: ()=>getLanguageFromPath,
46
- getPathname: ()=>getPathname,
47
- shouldIgnoreRedirect: ()=>shouldIgnoreRedirect,
48
- useRouterHooks: ()=>useRouterHooks
49
- });
50
- const runtime_namespaceObject = require("@modern-js/runtime");
51
- const context_namespaceObject = require("@modern-js/runtime/context");
52
- const getPathname = (context)=>{
53
- if ((0, runtime_namespaceObject.isBrowser)()) return window.location.pathname;
54
- return context.ssrContext?.request?.pathname || '/';
55
- };
56
- const getEntryPath = ()=>{
57
- const basename = (0, context_namespaceObject.getGlobalBasename)();
58
- if (basename) return '/' === basename ? '' : basename;
59
- return '';
60
- };
61
- const getLanguageFromPath = (pathname, languages, fallbackLanguage)=>{
62
- const segments = pathname.split('/').filter(Boolean);
63
- const firstSegment = segments[0];
64
- if (languages.includes(firstSegment)) return firstSegment;
65
- return fallbackLanguage;
66
- };
67
- const buildLocalizedUrl = (pathname, language, languages)=>{
68
- const segments = pathname.split('/').filter(Boolean);
69
- if (segments.length > 0 && languages.includes(segments[0])) segments[0] = language;
70
- else segments.unshift(language);
71
- return `/${segments.join('/')}`;
72
- };
73
- const detectLanguageFromPath = (pathname, languages, localePathRedirect)=>{
74
- if (!localePathRedirect) return {
75
- detected: false
76
- };
77
- const entryPath = getEntryPath();
78
- const relativePath = pathname.replace(entryPath, '');
79
- const segments = relativePath.split('/').filter(Boolean);
80
- const segmentsToCheck = !entryPath && segments.length > 1 && segments[0] && !languages.includes(segments[0]) ? segments.slice(1) : segments;
81
- const firstSegment = segmentsToCheck[0];
82
- if (firstSegment && languages.includes(firstSegment)) return {
83
- detected: true,
84
- language: firstSegment
85
- };
86
- return {
87
- detected: false
88
- };
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ buildLocalizedUrl: ()=>buildLocalizedUrl,
32
+ detectLanguageFromPath: ()=>detectLanguageFromPath,
33
+ getEntryPath: ()=>getEntryPath,
34
+ getLanguageFromPath: ()=>getLanguageFromPath,
35
+ getPathname: ()=>getPathname,
36
+ shouldIgnoreRedirect: ()=>shouldIgnoreRedirect
37
+ });
38
+ const runtime_namespaceObject = require("@modern-js/runtime");
39
+ const context_namespaceObject = require("@modern-js/runtime/context");
40
+ const localisedUrls_js_namespaceObject = require("../shared/localisedUrls.js");
41
+ const getPathname = (context)=>{
42
+ if ((0, runtime_namespaceObject.isBrowser)()) return window.location.pathname;
43
+ return context.ssrContext?.request?.pathname || '/';
44
+ };
45
+ const getEntryPath = ()=>{
46
+ const basename = (0, context_namespaceObject.getGlobalBasename)();
47
+ if (basename) return '/' === basename ? '' : basename;
48
+ return '';
49
+ };
50
+ const getLanguageFromPath = (pathname, languages, fallbackLanguage)=>{
51
+ const segments = pathname.split('/').filter(Boolean);
52
+ const firstSegment = segments[0];
53
+ if (languages.includes(firstSegment)) return firstSegment;
54
+ return fallbackLanguage;
55
+ };
56
+ const buildLocalizedUrl = (pathname, language, languages, localisedUrls)=>{
57
+ const segments = pathname.split('/').filter(Boolean);
58
+ const localisedUrlsConfig = (0, localisedUrls_js_namespaceObject.resolveLocalisedUrlsConfig)(localisedUrls);
59
+ const pathWithoutLanguage = segments.length > 0 && languages.includes(segments[0]) ? `/${segments.slice(1).join('/')}` : pathname;
60
+ const resolvedPath = localisedUrlsConfig.enabled ? (0, localisedUrls_js_namespaceObject.resolveLocalisedPath)(pathWithoutLanguage, language, languages, localisedUrlsConfig.map) : pathWithoutLanguage;
61
+ const resolvedSegments = resolvedPath.split('/').filter(Boolean);
62
+ return `/${[
63
+ language,
64
+ ...resolvedSegments
65
+ ].join('/')}`;
66
+ };
67
+ const detectLanguageFromPath = (pathname, languages, localePathRedirect)=>{
68
+ if (!localePathRedirect) return {
69
+ detected: false
89
70
  };
90
- const shouldIgnoreRedirect = (pathname, languages, ignoreRedirectRoutes)=>{
91
- if (!ignoreRedirectRoutes) return false;
92
- const segments = pathname.split('/').filter(Boolean);
93
- let pathWithoutLang = pathname;
94
- if (segments.length > 0 && languages.includes(segments[0])) pathWithoutLang = `/${segments.slice(1).join('/')}`;
95
- const normalizedPath = pathWithoutLang.startsWith('/') ? pathWithoutLang : `/${pathWithoutLang}`;
96
- if ('function' == typeof ignoreRedirectRoutes) return ignoreRedirectRoutes(normalizedPath);
97
- return ignoreRedirectRoutes.some((pattern)=>normalizedPath === pattern || normalizedPath.startsWith(`${pattern}/`));
71
+ const entryPath = getEntryPath();
72
+ const relativePath = pathname.replace(entryPath, '');
73
+ const segments = relativePath.split('/').filter(Boolean);
74
+ const segmentsToCheck = !entryPath && segments.length > 1 && segments[0] && !languages.includes(segments[0]) ? segments.slice(1) : segments;
75
+ const firstSegment = segmentsToCheck[0];
76
+ if (firstSegment && languages.includes(firstSegment)) return {
77
+ detected: true,
78
+ language: firstSegment
98
79
  };
99
- const useRouterHooks = ()=>{
100
- try {
101
- const { useLocation, useNavigate, useParams } = __webpack_require__("@modern-js/runtime/router");
102
- return {
103
- navigate: useNavigate(),
104
- location: useLocation(),
105
- params: useParams(),
106
- hasRouter: true
107
- };
108
- } catch (error) {
109
- return {
110
- navigate: null,
111
- location: null,
112
- params: {},
113
- hasRouter: false
114
- };
115
- }
80
+ return {
81
+ detected: false
116
82
  };
117
- })();
83
+ };
84
+ const shouldIgnoreRedirect = (pathname, languages, ignoreRedirectRoutes)=>{
85
+ if (!ignoreRedirectRoutes) return false;
86
+ const segments = pathname.split('/').filter(Boolean);
87
+ let pathWithoutLang = pathname;
88
+ if (segments.length > 0 && languages.includes(segments[0])) pathWithoutLang = `/${segments.slice(1).join('/')}`;
89
+ const normalizedPath = pathWithoutLang.startsWith('/') ? pathWithoutLang : `/${pathWithoutLang}`;
90
+ if ('function' == typeof ignoreRedirectRoutes) return ignoreRedirectRoutes(normalizedPath);
91
+ return ignoreRedirectRoutes.some((pattern)=>normalizedPath === pattern || normalizedPath.startsWith(`${pattern}/`));
92
+ };
118
93
  exports.buildLocalizedUrl = __webpack_exports__.buildLocalizedUrl;
119
94
  exports.detectLanguageFromPath = __webpack_exports__.detectLanguageFromPath;
120
95
  exports.getEntryPath = __webpack_exports__.getEntryPath;
121
96
  exports.getLanguageFromPath = __webpack_exports__.getLanguageFromPath;
122
97
  exports.getPathname = __webpack_exports__.getPathname;
123
98
  exports.shouldIgnoreRedirect = __webpack_exports__.shouldIgnoreRedirect;
124
- exports.useRouterHooks = __webpack_exports__.useRouterHooks;
125
99
  for(var __rspack_i in __webpack_exports__)if (-1 === [
126
100
  "buildLocalizedUrl",
127
101
  "detectLanguageFromPath",
128
102
  "getEntryPath",
129
103
  "getLanguageFromPath",
130
104
  "getPathname",
131
- "shouldIgnoreRedirect",
132
- "useRouterHooks"
105
+ "shouldIgnoreRedirect"
133
106
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
134
107
  Object.defineProperty(exports, '__esModule', {
135
108
  value: true
@@ -1,11 +1,15 @@
1
1
  "use strict";
2
2
  var __webpack_require__ = {};
3
3
  (()=>{
4
- __webpack_require__.d = (exports1, definition)=>{
5
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
- enumerable: true,
7
- get: definition[key]
8
- });
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");
9
13
  };
10
14
  })();
11
15
  (()=>{
@@ -24,13 +28,46 @@ var __webpack_require__ = {};
24
28
  var __webpack_exports__ = {};
25
29
  __webpack_require__.r(__webpack_exports__);
26
30
  __webpack_require__.d(__webpack_exports__, {
31
+ collectApiPrefixes: ()=>collectApiPrefixes,
27
32
  default: ()=>server,
28
- i18nServerPlugin: ()=>i18nServerPlugin
33
+ i18nServerPlugin: ()=>i18nServerPlugin,
34
+ matchesApiPrefix: ()=>matchesApiPrefix
29
35
  });
30
36
  const hono_namespaceObject = require("@modern-js/server-core/hono");
31
37
  const config_js_namespaceObject = require("../runtime/i18n/detection/config.js");
38
+ const localisedUrls_js_namespaceObject = require("../shared/localisedUrls.js");
32
39
  const utils_js_namespaceObject = require("../shared/utils.js");
33
40
  const { languageDetector } = hono_namespaceObject;
41
+ const normalizeApiPrefix = (prefix)=>{
42
+ const trimmedPrefix = prefix.trim();
43
+ if (!trimmedPrefix) return null;
44
+ const prefixedPath = trimmedPrefix.startsWith('/') ? trimmedPrefix : `/${trimmedPrefix}`;
45
+ const withoutWildcard = prefixedPath.replace(/\/\*$/, '');
46
+ const normalizedPrefix = withoutWildcard.length > 1 ? withoutWildcard.replace(/\/+$/, '') : withoutWildcard;
47
+ return '/' === normalizedPrefix ? null : normalizedPrefix;
48
+ };
49
+ const collectApiPrefixes = (routes, bffPrefix)=>{
50
+ const prefixes = new Set();
51
+ for (const route of routes){
52
+ if (!route.isApi || !route.urlPath) continue;
53
+ const normalizedPrefix = normalizeApiPrefix(route.urlPath);
54
+ if (normalizedPrefix) prefixes.add(normalizedPrefix);
55
+ }
56
+ const bffPrefixes = Array.isArray(bffPrefix) ? bffPrefix : bffPrefix ? [
57
+ bffPrefix
58
+ ] : [];
59
+ for (const prefix of bffPrefixes){
60
+ const normalizedPrefix = normalizeApiPrefix(prefix);
61
+ if (normalizedPrefix) prefixes.add(normalizedPrefix);
62
+ }
63
+ return [
64
+ ...prefixes
65
+ ];
66
+ };
67
+ const matchesApiPrefix = (pathname, apiPrefixes)=>{
68
+ const normalizedPathname = pathname.startsWith('/') ? pathname : `/${pathname}`;
69
+ return apiPrefixes.some((prefix)=>normalizedPathname === prefix || normalizedPathname.startsWith(`${prefix}/`));
70
+ };
34
71
  const convertToHonoLanguageDetectorOptions = (languages, fallbackLanguage, detectionOptions)=>{
35
72
  const mergedDetection = detectionOptions ? (0, config_js_namespaceObject.mergeDetectionOptions)(detectionOptions) : config_js_namespaceObject.DEFAULT_I18NEXT_DETECTION_OPTIONS;
36
73
  const order = (mergedDetection.order || []).filter((item)=>![
@@ -120,15 +157,20 @@ const getLanguageFromPath = (req, urlPath, languages)=>{
120
157
  if (languages.includes(firstSegment)) return firstSegment;
121
158
  return null;
122
159
  };
123
- const buildLocalizedUrl = (req, urlPath, language, languages)=>{
160
+ const buildLocalizedUrl = (req, urlPath, language, languages, localisedUrls)=>{
124
161
  const url = new URL(req.url);
125
162
  const pathname = url.pathname;
126
163
  const basePath = urlPath.replace('/*', '');
127
164
  const remainingPath = pathname.startsWith(basePath) ? pathname.slice(basePath.length) : pathname;
128
165
  const segments = remainingPath.split('/').filter(Boolean);
129
- if (segments.length > 0 && languages.includes(segments[0])) segments[0] = language;
130
- else segments.unshift(language);
131
- const newPathname = `/${segments.join('/')}`;
166
+ const localisedUrlsConfig = (0, localisedUrls_js_namespaceObject.resolveLocalisedUrlsConfig)(localisedUrls);
167
+ const pathWithoutLanguage = segments.length > 0 && languages.includes(segments[0]) ? `/${segments.slice(1).join('/')}` : remainingPath;
168
+ const resolvedPath = localisedUrlsConfig.enabled ? (0, localisedUrls_js_namespaceObject.resolveLocalisedPath)(pathWithoutLanguage, language, languages, localisedUrlsConfig.map) : pathWithoutLanguage;
169
+ const resolvedSegments = resolvedPath.split('/').filter(Boolean);
170
+ const newPathname = `/${[
171
+ language,
172
+ ...resolvedSegments
173
+ ].join('/')}`;
132
174
  const suffix = `${url.search}${url.hash}`;
133
175
  const localizedUrl = '/' === basePath ? newPathname + suffix : basePath + newPathname + suffix;
134
176
  return localizedUrl;
@@ -138,6 +180,9 @@ const i18nServerPlugin = (options)=>({
138
180
  setup: (api)=>{
139
181
  api.onPrepare(()=>{
140
182
  const { middlewares, routes } = api.getServerContext();
183
+ const serverConfig = api.getServerConfig();
184
+ const bffPrefix = serverConfig?.bff ? serverConfig.bff.prefix ?? '/api' : void 0;
185
+ const apiPrefixes = collectApiPrefixes(routes, bffPrefix);
141
186
  const entryPaths = new Set();
142
187
  routes.forEach((route)=>{
143
188
  if (route.entryName && route.urlPath && '/' !== route.urlPath) {
@@ -149,7 +194,7 @@ const i18nServerPlugin = (options)=>({
149
194
  const { entryName } = route;
150
195
  if (!entryName) return;
151
196
  if (!options.localeDetection) return;
152
- const { localePathRedirect, i18nextDetector = true, languages = [], fallbackLanguage = 'en', detection, ignoreRedirectRoutes } = (0, utils_js_namespaceObject.getLocaleDetectionOptions)(entryName, options.localeDetection);
197
+ const { localePathRedirect, i18nextDetector = true, languages = [], fallbackLanguage = 'en', detection, ignoreRedirectRoutes, localisedUrls } = (0, utils_js_namespaceObject.getLocaleDetectionOptions)(entryName, options.localeDetection);
153
198
  const staticRoutePrefixes = options.staticRoutePrefixes;
154
199
  const originUrlPath = route.urlPath;
155
200
  const urlPath = originUrlPath.endsWith('/') ? `${originUrlPath}*` : `${originUrlPath}/*`;
@@ -163,6 +208,7 @@ const i18nServerPlugin = (options)=>({
163
208
  handler: async (c, next)=>{
164
209
  const url = new URL(c.req.url);
165
210
  const pathname = url.pathname;
211
+ if (matchesApiPrefix(pathname, apiPrefixes)) return await next();
166
212
  if (isStaticResourceRequest(pathname, staticRoutePrefixes, languages)) return await next();
167
213
  if ('/' === originUrlPath) {
168
214
  const pathSegments = pathname.split('/').filter(Boolean);
@@ -181,6 +227,7 @@ const i18nServerPlugin = (options)=>({
181
227
  handler: async (c, next)=>{
182
228
  const url = new URL(c.req.url);
183
229
  const pathname = url.pathname;
230
+ if (matchesApiPrefix(pathname, apiPrefixes)) return await next();
184
231
  if (isStaticResourceRequest(pathname, staticRoutePrefixes, languages)) return await next();
185
232
  if (shouldIgnoreRedirect(pathname, urlPath, ignoreRedirectRoutes)) return await next();
186
233
  if ('/' === originUrlPath) {
@@ -195,9 +242,14 @@ const i18nServerPlugin = (options)=>({
195
242
  let detectedLanguage = null;
196
243
  if (i18nextDetector) detectedLanguage = c.get('language') || null;
197
244
  const targetLanguage = detectedLanguage || fallbackLanguage;
198
- const localizedUrl = buildLocalizedUrl(c.req, originUrlPath, targetLanguage, languages);
245
+ const localizedUrl = buildLocalizedUrl(c.req, originUrlPath, targetLanguage, languages, localisedUrls);
199
246
  return c.redirect(localizedUrl);
200
247
  }
248
+ const localisedUrlsConfig = (0, localisedUrls_js_namespaceObject.resolveLocalisedUrlsConfig)(localisedUrls);
249
+ if (localisedUrlsConfig.enabled) {
250
+ const expectedUrl = buildLocalizedUrl(c.req, originUrlPath, language, languages, localisedUrls);
251
+ if (expectedUrl !== `${pathname}${url.search}${url.hash}`) return c.redirect(expectedUrl);
252
+ }
201
253
  await next();
202
254
  }
203
255
  });
@@ -207,11 +259,15 @@ const i18nServerPlugin = (options)=>({
207
259
  }
208
260
  });
209
261
  const server = i18nServerPlugin;
262
+ exports.collectApiPrefixes = __webpack_exports__.collectApiPrefixes;
210
263
  exports["default"] = __webpack_exports__["default"];
211
264
  exports.i18nServerPlugin = __webpack_exports__.i18nServerPlugin;
265
+ exports.matchesApiPrefix = __webpack_exports__.matchesApiPrefix;
212
266
  for(var __rspack_i in __webpack_exports__)if (-1 === [
267
+ "collectApiPrefixes",
213
268
  "default",
214
- "i18nServerPlugin"
269
+ "i18nServerPlugin",
270
+ "matchesApiPrefix"
215
271
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
216
272
  Object.defineProperty(exports, '__esModule', {
217
273
  value: true
@@ -1,11 +1,15 @@
1
1
  "use strict";
2
2
  var __webpack_require__ = {};
3
3
  (()=>{
4
- __webpack_require__.d = (exports1, definition)=>{
5
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
- enumerable: true,
7
- get: definition[key]
8
- });
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");
9
13
  };
10
14
  })();
11
15
  (()=>{
@@ -23,9 +27,6 @@ var __webpack_require__ = {};
23
27
  })();
24
28
  var __webpack_exports__ = {};
25
29
  __webpack_require__.r(__webpack_exports__);
26
- __webpack_require__.d(__webpack_exports__, {
27
- deepMerge: ()=>deepMerge
28
- });
29
30
  function isPlainObject(value) {
30
31
  return null !== value && 'object' == typeof value && !Array.isArray(value) && !(value instanceof Date);
31
32
  }
@@ -45,6 +46,9 @@ function deepMerge(defaultOptions, userOptions) {
45
46
  }
46
47
  return merged;
47
48
  }
49
+ __webpack_require__.d(__webpack_exports__, {
50
+ deepMerge: ()=>deepMerge
51
+ });
48
52
  exports.deepMerge = __webpack_exports__.deepMerge;
49
53
  for(var __rspack_i in __webpack_exports__)if (-1 === [
50
54
  "deepMerge"
@@ -1,11 +1,15 @@
1
1
  "use strict";
2
2
  var __webpack_require__ = {};
3
3
  (()=>{
4
- __webpack_require__.d = (exports1, definition)=>{
5
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
- enumerable: true,
7
- get: definition[key]
8
- });
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");
9
13
  };
10
14
  })();
11
15
  (()=>{