@bleedingdev/modern-js-i18n-runtime-extensions 3.9.0-ultramodern.9 → 3.9.3-ultramodern.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +10 -10
- package/dist/cjs/localeRedirectPolicy.js +6 -6
- package/dist/cjs/native.js +438 -0
- package/dist/cjs/paths.js +11 -3
- package/dist/cjs/requestLanguage.js +195 -0
- package/dist/cjs/router-navigation/adapter.js +93 -0
- package/dist/cjs/{localisedUrls/config.js → router-navigation/index.js} +5 -14
- package/dist/cjs/ssrLanguageHandoff.js +94 -0
- package/dist/cjs/urlRewrite.js +64 -0
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/localeRedirectPolicy.mjs +1 -1
- package/dist/esm/native.mjs +378 -0
- package/dist/esm/paths.mjs +7 -2
- package/dist/esm/requestLanguage.mjs +148 -0
- package/dist/esm/router-navigation/adapter.mjs +55 -0
- package/dist/esm/router-navigation/index.mjs +1 -0
- package/dist/esm/ssrLanguageHandoff.mjs +44 -0
- package/dist/esm/urlRewrite.mjs +26 -0
- package/dist/esm-node/index.mjs +1 -1
- package/dist/esm-node/localeRedirectPolicy.mjs +1 -1
- package/dist/esm-node/native.mjs +379 -0
- package/dist/esm-node/paths.mjs +7 -2
- package/dist/esm-node/requestLanguage.mjs +149 -0
- package/dist/esm-node/router-navigation/adapter.mjs +56 -0
- package/dist/esm-node/router-navigation/index.mjs +2 -0
- package/dist/esm-node/ssrLanguageHandoff.mjs +45 -0
- package/dist/esm-node/urlRewrite.mjs +27 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/localeRedirectPolicy.d.ts +1 -1
- package/dist/types/native.d.ts +34 -0
- package/dist/types/paths.d.ts +8 -1
- package/dist/types/requestLanguage.d.ts +60 -0
- package/dist/types/router-navigation/adapter.d.ts +23 -0
- package/dist/types/router-navigation/index.d.ts +1 -0
- package/dist/types/ssrLanguageHandoff.d.ts +60 -0
- package/dist/types/urlRewrite.d.ts +60 -0
- package/package.json +102 -15
- package/src/index.ts +1 -1
- package/src/localeRedirectPolicy.ts +2 -2
- package/src/native.ts +624 -0
- package/src/paths.ts +23 -2
- package/src/requestLanguage.ts +311 -0
- package/src/router-navigation/adapter.tsx +120 -0
- package/src/router-navigation/index.ts +6 -0
- package/src/ssrLanguageHandoff.ts +138 -0
- package/src/urlRewrite.ts +107 -0
- package/dist/cjs/localisedUrls/index.js +0 -98
- package/dist/cjs/localisedUrls/normalise.js +0 -87
- package/dist/cjs/localisedUrls/pathname.js +0 -68
- package/dist/cjs/localisedUrls/patterns.js +0 -214
- package/dist/cjs/localisedUrls/redirect.js +0 -100
- package/dist/cjs/localisedUrls/resolve.js +0 -78
- package/dist/cjs/localisedUrls/routeIdentity.js +0 -118
- package/dist/cjs/localisedUrls/routes.js +0 -210
- package/dist/cjs/localisedUrls/types.js +0 -18
- package/dist/esm/localisedUrls/config.mjs +0 -11
- package/dist/esm/localisedUrls/index.mjs +0 -8
- package/dist/esm/localisedUrls/normalise.mjs +0 -37
- package/dist/esm/localisedUrls/pathname.mjs +0 -24
- package/dist/esm/localisedUrls/patterns.mjs +0 -152
- package/dist/esm/localisedUrls/redirect.mjs +0 -53
- package/dist/esm/localisedUrls/resolve.mjs +0 -37
- package/dist/esm/localisedUrls/routeIdentity.mjs +0 -77
- package/dist/esm/localisedUrls/routes.mjs +0 -169
- package/dist/esm/localisedUrls/types.mjs +0 -0
- package/dist/esm-node/localisedUrls/config.mjs +0 -12
- package/dist/esm-node/localisedUrls/index.mjs +0 -9
- package/dist/esm-node/localisedUrls/normalise.mjs +0 -38
- package/dist/esm-node/localisedUrls/pathname.mjs +0 -25
- package/dist/esm-node/localisedUrls/patterns.mjs +0 -153
- package/dist/esm-node/localisedUrls/redirect.mjs +0 -54
- package/dist/esm-node/localisedUrls/resolve.mjs +0 -38
- package/dist/esm-node/localisedUrls/routeIdentity.mjs +0 -78
- package/dist/esm-node/localisedUrls/routes.mjs +0 -170
- package/dist/esm-node/localisedUrls/types.mjs +0 -1
- package/dist/types/localisedUrls/config.d.ts +0 -9
- package/dist/types/localisedUrls/index.d.ts +0 -10
- package/dist/types/localisedUrls/normalise.d.ts +0 -10
- package/dist/types/localisedUrls/pathname.d.ts +0 -4
- package/dist/types/localisedUrls/patterns.d.ts +0 -11
- package/dist/types/localisedUrls/redirect.d.ts +0 -19
- package/dist/types/localisedUrls/resolve.d.ts +0 -7
- package/dist/types/localisedUrls/routeIdentity.d.ts +0 -24
- package/dist/types/localisedUrls/routes.d.ts +0 -3
- package/dist/types/localisedUrls/types.d.ts +0 -14
- package/rslib.config.mts +0 -4
- package/rstest.config.mts +0 -36
- package/src/localisedUrls/config.ts +0 -18
- package/src/localisedUrls/index.ts +0 -28
- package/src/localisedUrls/normalise.ts +0 -62
- package/src/localisedUrls/pathname.ts +0 -60
- package/src/localisedUrls/patterns.ts +0 -283
- package/src/localisedUrls/redirect.ts +0 -107
- package/src/localisedUrls/resolve.ts +0 -106
- package/src/localisedUrls/routeIdentity.ts +0 -107
- package/src/localisedUrls/routes.ts +0 -432
- package/src/localisedUrls/types.ts +0 -18
- package/tests/languageSyncController.test.ts +0 -136
- package/tests/localeRedirectPolicy.test.ts +0 -173
- package/tests/localisedUrls.test.ts +0 -532
- package/tests/paths.test.ts +0 -24
- package/tests/reactLanguageSync.test.tsx +0 -136
- package/tests/tsconfig.json +0 -11
- package/tsconfig.json +0 -11
|
@@ -0,0 +1,195 @@
|
|
|
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
|
+
createRequestLanguageRedirect: ()=>createRequestLanguageRedirect,
|
|
32
|
+
detectRequestLanguage: ()=>detectRequestLanguage,
|
|
33
|
+
languageFromPathname: ()=>languageFromPathname,
|
|
34
|
+
resolveRequestLanguage: ()=>resolveRequestLanguage
|
|
35
|
+
});
|
|
36
|
+
const localised_urls_namespaceObject = require("@modern-js/runtime-extensions/localised-urls");
|
|
37
|
+
const DEFAULT_ORDER = [
|
|
38
|
+
'querystring',
|
|
39
|
+
'cookie',
|
|
40
|
+
'header'
|
|
41
|
+
];
|
|
42
|
+
const normaliseBasePath = (basePath)=>{
|
|
43
|
+
if (!basePath || '/' === basePath) return '';
|
|
44
|
+
return `/${basePath.split('/').filter(Boolean).join('/')}`;
|
|
45
|
+
};
|
|
46
|
+
const entryPathname = (pathname, basePath)=>{
|
|
47
|
+
const base = normaliseBasePath(basePath);
|
|
48
|
+
if (!base) return pathname || '/';
|
|
49
|
+
if (pathname === base) return '/';
|
|
50
|
+
return pathname.startsWith(`${base}/`) ? pathname.slice(base.length) : void 0;
|
|
51
|
+
};
|
|
52
|
+
const baseLanguage = (tag)=>tag.toLowerCase().split(/[-_]/u)[0];
|
|
53
|
+
const compatibleLanguages = (candidate, languages)=>{
|
|
54
|
+
const value = candidate?.trim().toLowerCase();
|
|
55
|
+
if (!value) return [];
|
|
56
|
+
const base = baseLanguage(value);
|
|
57
|
+
return [
|
|
58
|
+
...languages.filter((language)=>language.toLowerCase() === value),
|
|
59
|
+
...languages.filter((language)=>language.toLowerCase() === base),
|
|
60
|
+
...base === value ? languages.filter((language)=>baseLanguage(language) === value) : []
|
|
61
|
+
].filter((language, index, all)=>all.indexOf(language) === index);
|
|
62
|
+
};
|
|
63
|
+
const matchLanguage = (candidate, languages)=>compatibleLanguages(candidate, languages)[0];
|
|
64
|
+
function languageFromPathname(pathname, languages, basePath) {
|
|
65
|
+
const remaining = entryPathname(pathname, basePath);
|
|
66
|
+
if (void 0 === remaining) return;
|
|
67
|
+
const first = remaining.split('/').filter(Boolean)[0];
|
|
68
|
+
if (!first) return;
|
|
69
|
+
return languages.find((language)=>language.toLowerCase() === first.toLowerCase());
|
|
70
|
+
}
|
|
71
|
+
const readCookie = (header, name)=>{
|
|
72
|
+
if (!header) return null;
|
|
73
|
+
for (const part of header.split(';')){
|
|
74
|
+
const separator = part.indexOf('=');
|
|
75
|
+
if (separator < 0) continue;
|
|
76
|
+
if (part.slice(0, separator).trim() !== name) continue;
|
|
77
|
+
const raw = part.slice(separator + 1).trim();
|
|
78
|
+
try {
|
|
79
|
+
return decodeURIComponent(raw);
|
|
80
|
+
} catch {
|
|
81
|
+
return raw;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
};
|
|
86
|
+
const QVALUE = /^(?:0(?:\.\d{0,3})?|1(?:\.0{0,3})?)$/;
|
|
87
|
+
const rangeSpecificity = (range, language)=>{
|
|
88
|
+
const value = range.toLowerCase().replaceAll('_', '-');
|
|
89
|
+
const supported = language.toLowerCase().replaceAll('_', '-');
|
|
90
|
+
if ('*' === value) return 0;
|
|
91
|
+
if (value === supported) return Number.MAX_SAFE_INTEGER;
|
|
92
|
+
if (supported.startsWith(`${value}-`)) return 1 + value.split('-').length;
|
|
93
|
+
if (baseLanguage(value) === supported) return 1;
|
|
94
|
+
};
|
|
95
|
+
const acceptedLanguages = (header, languages)=>{
|
|
96
|
+
const items = (header ?? '').split(',').map((item, index)=>{
|
|
97
|
+
const [tag, ...parameters] = item.trim().split(';');
|
|
98
|
+
const quality = parameters.map((parameter)=>parameter.trim()).find((parameter)=>parameter.toLowerCase().startsWith('q='));
|
|
99
|
+
const value = quality?.slice(2).trim();
|
|
100
|
+
const q = void 0 === value ? 1 : QVALUE.test(value) ? Number(value) : 0 / 0;
|
|
101
|
+
return {
|
|
102
|
+
tag: tag.trim(),
|
|
103
|
+
q,
|
|
104
|
+
index
|
|
105
|
+
};
|
|
106
|
+
}).filter((item)=>item.tag && !Number.isNaN(item.q));
|
|
107
|
+
const ranked = languages.flatMap((language, position)=>{
|
|
108
|
+
let best;
|
|
109
|
+
for (const item of items){
|
|
110
|
+
const specificity = rangeSpecificity(item.tag, language);
|
|
111
|
+
if (void 0 !== specificity && (!best || specificity > best.specificity)) best = {
|
|
112
|
+
q: item.q,
|
|
113
|
+
index: item.index,
|
|
114
|
+
specificity
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
return best && best.q > 0 ? [
|
|
118
|
+
{
|
|
119
|
+
language,
|
|
120
|
+
position,
|
|
121
|
+
...best
|
|
122
|
+
}
|
|
123
|
+
] : [];
|
|
124
|
+
});
|
|
125
|
+
return ranked.sort((left, right)=>right.q - left.q || left.index - right.index || right.specificity - left.specificity || left.position - right.position).map((entry)=>entry.language);
|
|
126
|
+
};
|
|
127
|
+
function detectRequestLanguage(request, languages, detection = {}) {
|
|
128
|
+
const url = new URL(request.url);
|
|
129
|
+
for (const detector of detection.order ?? DEFAULT_ORDER){
|
|
130
|
+
let language;
|
|
131
|
+
if ('querystring' === detector) language = matchLanguage(url.searchParams.get(detection.lookupQuerystring ?? 'lng'), languages);
|
|
132
|
+
else if ('cookie' === detector) language = matchLanguage(readCookie(request.headers.get('cookie'), detection.lookupCookie ?? 'i18next'), languages);
|
|
133
|
+
else if ('header' === detector) language = acceptedLanguages(request.headers.get(detection.lookupHeader ?? 'accept-language'), languages).find(Boolean);
|
|
134
|
+
if (language) return language;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function resolveRequestLanguage(request, options) {
|
|
138
|
+
const { languages, fallbackLanguage } = options;
|
|
139
|
+
const url = new URL(request.url);
|
|
140
|
+
const fromPath = languageFromPathname(url.pathname, languages, options.basePath);
|
|
141
|
+
if (fromPath) return {
|
|
142
|
+
kind: 'language',
|
|
143
|
+
language: fromPath
|
|
144
|
+
};
|
|
145
|
+
const detected = (false === options.detect ? void 0 : detectRequestLanguage(request, languages, options.detection)) ?? fallbackLanguage;
|
|
146
|
+
const remaining = entryPathname(url.pathname, options.basePath);
|
|
147
|
+
if (void 0 === remaining || (0, localised_urls_namespaceObject.shouldSkipLocaleRedirect)(remaining, [
|
|
148
|
+
...languages
|
|
149
|
+
], options.ignoreRedirectRoutes)) {
|
|
150
|
+
const vary = (false === options.detect ? [] : options.detection?.order ?? DEFAULT_ORDER).flatMap((detector)=>'header' === detector ? [
|
|
151
|
+
options.detection?.lookupHeader ?? 'Accept-Language'
|
|
152
|
+
] : 'cookie' === detector ? [
|
|
153
|
+
'Cookie'
|
|
154
|
+
] : []);
|
|
155
|
+
return vary.length ? {
|
|
156
|
+
kind: 'language',
|
|
157
|
+
language: detected,
|
|
158
|
+
vary
|
|
159
|
+
} : {
|
|
160
|
+
kind: 'language',
|
|
161
|
+
language: detected
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
const localized = (0, localised_urls_namespaceObject.localiseTargetPathname)(remaining, detected, [
|
|
165
|
+
...languages
|
|
166
|
+
], options.localisedUrls);
|
|
167
|
+
return {
|
|
168
|
+
kind: 'redirect',
|
|
169
|
+
language: detected,
|
|
170
|
+
location: `${normaliseBasePath(options.basePath)}${localized}${url.search}`
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function createRequestLanguageRedirect(location) {
|
|
174
|
+
return new Response(null, {
|
|
175
|
+
status: 302,
|
|
176
|
+
headers: {
|
|
177
|
+
'cache-control': 'private, no-store',
|
|
178
|
+
location,
|
|
179
|
+
vary: 'Accept-Language, Cookie'
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
exports.createRequestLanguageRedirect = __webpack_exports__.createRequestLanguageRedirect;
|
|
184
|
+
exports.detectRequestLanguage = __webpack_exports__.detectRequestLanguage;
|
|
185
|
+
exports.languageFromPathname = __webpack_exports__.languageFromPathname;
|
|
186
|
+
exports.resolveRequestLanguage = __webpack_exports__.resolveRequestLanguage;
|
|
187
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
188
|
+
"createRequestLanguageRedirect",
|
|
189
|
+
"detectRequestLanguage",
|
|
190
|
+
"languageFromPathname",
|
|
191
|
+
"resolveRequestLanguage"
|
|
192
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
193
|
+
Object.defineProperty(exports, '__esModule', {
|
|
194
|
+
value: true
|
|
195
|
+
});
|
|
@@ -0,0 +1,93 @@
|
|
|
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
|
+
createI18nRouterNavigation: ()=>createI18nRouterNavigation
|
|
32
|
+
});
|
|
33
|
+
const jsx_runtime_namespaceObject = require("react/jsx-runtime");
|
|
34
|
+
const runtime_namespaceObject = require("@modern-js/runtime");
|
|
35
|
+
const context_namespaceObject = require("@modern-js/runtime/context");
|
|
36
|
+
const router_state_namespaceObject = require("@modern-js/runtime-extensions/router-state");
|
|
37
|
+
const external_react_namespaceObject = require("react");
|
|
38
|
+
const subscribeNone = ()=>()=>{};
|
|
39
|
+
const getEmptySnapshot = ()=>null;
|
|
40
|
+
const createI18nRouterNavigation = ({ I18nNavigationProvider, useNativeI18nRouterAdapter })=>{
|
|
41
|
+
const NavigationProvider = I18nNavigationProvider;
|
|
42
|
+
const useIntegratedRouterAdapter = ()=>{
|
|
43
|
+
const runtimeContext = (0, external_react_namespaceObject.useContext)(runtime_namespaceObject.RuntimeContext);
|
|
44
|
+
const internalContext = (0, external_react_namespaceObject.useContext)(context_namespaceObject.InternalRuntimeContext);
|
|
45
|
+
const native = useNativeI18nRouterAdapter();
|
|
46
|
+
const getCapability = (0, external_react_namespaceObject.useCallback)(()=>(0, router_state_namespaceObject.getRouterRuntimeState)(internalContext)?.navigation ?? (0, router_state_namespaceObject.getRouterRuntimeState)(runtimeContext)?.navigation, [
|
|
47
|
+
internalContext,
|
|
48
|
+
runtimeContext
|
|
49
|
+
]);
|
|
50
|
+
const subscribeCapability = (0, external_react_namespaceObject.useCallback)((update)=>{
|
|
51
|
+
const stopInternal = (0, router_state_namespaceObject.subscribeRouterRuntimeState)(internalContext, update);
|
|
52
|
+
const stopPublic = internalContext === runtimeContext ? void 0 : (0, router_state_namespaceObject.subscribeRouterRuntimeState)(runtimeContext, update);
|
|
53
|
+
return ()=>{
|
|
54
|
+
stopInternal();
|
|
55
|
+
stopPublic?.();
|
|
56
|
+
};
|
|
57
|
+
}, [
|
|
58
|
+
internalContext,
|
|
59
|
+
runtimeContext
|
|
60
|
+
]);
|
|
61
|
+
const capability = (0, external_react_namespaceObject.useSyncExternalStore)(subscribeCapability, getCapability, getCapability);
|
|
62
|
+
const snapshot = (0, external_react_namespaceObject.useSyncExternalStore)(capability?.subscribe ?? subscribeNone, capability?.getSnapshot ?? getEmptySnapshot, capability?.getSnapshot ?? getEmptySnapshot);
|
|
63
|
+
if (native.hasRouter || !capability || !snapshot) return native;
|
|
64
|
+
const internalState = (0, router_state_namespaceObject.getRouterRuntimeState)(internalContext);
|
|
65
|
+
return {
|
|
66
|
+
framework: internalState?.navigation === capability ? internalState.framework : (0, router_state_namespaceObject.getRouterRuntimeState)(runtimeContext)?.framework,
|
|
67
|
+
hasRouter: true,
|
|
68
|
+
...snapshot,
|
|
69
|
+
navigate: capability.navigate,
|
|
70
|
+
Link: capability.Link,
|
|
71
|
+
createLinkProps: capability.createLinkProps
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
const I18nRouterNavigationProvider = ({ children })=>{
|
|
75
|
+
const value = useIntegratedRouterAdapter();
|
|
76
|
+
const native = useNativeI18nRouterAdapter();
|
|
77
|
+
return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(NavigationProvider, {
|
|
78
|
+
value: value.hasRouter && !native.hasRouter ? value : null,
|
|
79
|
+
children: children
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
return {
|
|
83
|
+
useIntegratedRouterAdapter,
|
|
84
|
+
I18nRouterNavigationProvider
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
exports.createI18nRouterNavigation = __webpack_exports__.createI18nRouterNavigation;
|
|
88
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
89
|
+
"createI18nRouterNavigation"
|
|
90
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
91
|
+
Object.defineProperty(exports, '__esModule', {
|
|
92
|
+
value: true
|
|
93
|
+
});
|
|
@@ -27,22 +27,13 @@ var __webpack_require__ = {};
|
|
|
27
27
|
})();
|
|
28
28
|
var __webpack_exports__ = {};
|
|
29
29
|
__webpack_require__.r(__webpack_exports__);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
enabled: true,
|
|
33
|
-
map: option
|
|
34
|
-
};
|
|
35
|
-
return {
|
|
36
|
-
enabled: false,
|
|
37
|
-
map: {}
|
|
38
|
-
};
|
|
39
|
-
};
|
|
40
|
-
__webpack_require__.d(__webpack_exports__, {}, {
|
|
41
|
-
resolveLocalisedUrlsConfig: resolveLocalisedUrlsConfig
|
|
30
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
31
|
+
createI18nRouterNavigation: ()=>external_adapter_js_namespaceObject.createI18nRouterNavigation
|
|
42
32
|
});
|
|
43
|
-
|
|
33
|
+
const external_adapter_js_namespaceObject = require("./adapter.js");
|
|
34
|
+
exports.createI18nRouterNavigation = __webpack_exports__.createI18nRouterNavigation;
|
|
44
35
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
45
|
-
"
|
|
36
|
+
"createI18nRouterNavigation"
|
|
46
37
|
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
47
38
|
Object.defineProperty(exports, '__esModule', {
|
|
48
39
|
value: true
|
|
@@ -0,0 +1,94 @@
|
|
|
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
|
+
I18N_SSR_HANDOFF_ELEMENT_ID: ()=>I18N_SSR_HANDOFF_ELEMENT_ID,
|
|
32
|
+
createI18nSsrHandoffInlineData: ()=>createI18nSsrHandoffInlineData,
|
|
33
|
+
readI18nSsrHandoff: ()=>readI18nSsrHandoff,
|
|
34
|
+
readI18nSsrHandoffFromText: ()=>readI18nSsrHandoffFromText,
|
|
35
|
+
serializeI18nSsrHandoff: ()=>serializeI18nSsrHandoff
|
|
36
|
+
});
|
|
37
|
+
const data_namespaceObject = require("@modern-js/renderer-core/data");
|
|
38
|
+
const document_namespaceObject = require("@modern-js/renderer-core/document");
|
|
39
|
+
const I18N_SSR_HANDOFF_ELEMENT_ID = '__modernjs_i18n_ssr__';
|
|
40
|
+
function assertPayload(payload) {
|
|
41
|
+
if ('string' != typeof payload.language || 0 === payload.language.length) throw new TypeError('An i18n SSR handoff payload requires a nonempty language.');
|
|
42
|
+
if (void 0 !== payload.resources && ('object' != typeof payload.resources || null === payload.resources)) throw new TypeError('An i18n SSR handoff payload resources field must be a plain object.');
|
|
43
|
+
}
|
|
44
|
+
function createI18nSsrHandoffInlineData(payload, options = {}) {
|
|
45
|
+
assertPayload(payload);
|
|
46
|
+
return {
|
|
47
|
+
id: options.id ?? I18N_SSR_HANDOFF_ELEMENT_ID,
|
|
48
|
+
payload: (0, data_namespaceObject.serializePublicData)({
|
|
49
|
+
language: payload.language,
|
|
50
|
+
...payload.resources ? {
|
|
51
|
+
resources: payload.resources
|
|
52
|
+
} : {}
|
|
53
|
+
})
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function serializeI18nSsrHandoff(payload, options = {}) {
|
|
57
|
+
return (0, document_namespaceObject.serializeInlineData)({
|
|
58
|
+
...createI18nSsrHandoffInlineData(payload, options),
|
|
59
|
+
nonce: options.nonce
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function isHandoffPayload(value) {
|
|
63
|
+
return Boolean(value) && 'object' == typeof value && 'string' == typeof value.language;
|
|
64
|
+
}
|
|
65
|
+
function readI18nSsrHandoffFromText(text) {
|
|
66
|
+
if (!text) return;
|
|
67
|
+
try {
|
|
68
|
+
const result = (0, data_namespaceObject.parsePublicData)(text);
|
|
69
|
+
return isHandoffPayload(result) ? result : void 0;
|
|
70
|
+
} catch {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function readI18nSsrHandoff(options = {}) {
|
|
75
|
+
const doc = options.doc ?? ("u" < typeof document ? void 0 : document);
|
|
76
|
+
if (!doc) return;
|
|
77
|
+
const element = doc.getElementById(options.id ?? I18N_SSR_HANDOFF_ELEMENT_ID);
|
|
78
|
+
return readI18nSsrHandoffFromText(element?.textContent ?? null);
|
|
79
|
+
}
|
|
80
|
+
exports.I18N_SSR_HANDOFF_ELEMENT_ID = __webpack_exports__.I18N_SSR_HANDOFF_ELEMENT_ID;
|
|
81
|
+
exports.createI18nSsrHandoffInlineData = __webpack_exports__.createI18nSsrHandoffInlineData;
|
|
82
|
+
exports.readI18nSsrHandoff = __webpack_exports__.readI18nSsrHandoff;
|
|
83
|
+
exports.readI18nSsrHandoffFromText = __webpack_exports__.readI18nSsrHandoffFromText;
|
|
84
|
+
exports.serializeI18nSsrHandoff = __webpack_exports__.serializeI18nSsrHandoff;
|
|
85
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
86
|
+
"I18N_SSR_HANDOFF_ELEMENT_ID",
|
|
87
|
+
"createI18nSsrHandoffInlineData",
|
|
88
|
+
"readI18nSsrHandoff",
|
|
89
|
+
"readI18nSsrHandoffFromText",
|
|
90
|
+
"serializeI18nSsrHandoff"
|
|
91
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
92
|
+
Object.defineProperty(exports, '__esModule', {
|
|
93
|
+
value: true
|
|
94
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
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
|
+
createI18nUrlRewrite: ()=>createI18nUrlRewrite
|
|
32
|
+
});
|
|
33
|
+
const localised_urls_namespaceObject = require("@modern-js/runtime-extensions/localised-urls");
|
|
34
|
+
const external_requestLanguage_js_namespaceObject = require("./requestLanguage.js");
|
|
35
|
+
const createI18nUrlRewrite = (options)=>{
|
|
36
|
+
const { languages, getLanguage, localisedUrls, onLanguageDetected } = options;
|
|
37
|
+
const languageList = [
|
|
38
|
+
...languages
|
|
39
|
+
];
|
|
40
|
+
return {
|
|
41
|
+
input: ({ url })=>{
|
|
42
|
+
const pathname = url.pathname;
|
|
43
|
+
if (onLanguageDetected) {
|
|
44
|
+
const segments = pathname.split('/').filter(Boolean);
|
|
45
|
+
const firstSegment = segments[0];
|
|
46
|
+
const detected = firstSegment ? languageList.find((language)=>language.toLowerCase() === firstSegment.toLowerCase()) : void 0;
|
|
47
|
+
if (detected) onLanguageDetected(detected);
|
|
48
|
+
}
|
|
49
|
+
url.pathname = (0, localised_urls_namespaceObject.canonicalTargetPathname)(pathname, languageList, localisedUrls);
|
|
50
|
+
return url;
|
|
51
|
+
},
|
|
52
|
+
output: ({ url })=>{
|
|
53
|
+
url.pathname = (0, localised_urls_namespaceObject.localiseTargetPathname)(url.pathname, (0, external_requestLanguage_js_namespaceObject.languageFromPathname)(url.pathname, languageList) ?? getLanguage(), languageList, localisedUrls);
|
|
54
|
+
return url;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
exports.createI18nUrlRewrite = __webpack_exports__.createI18nUrlRewrite;
|
|
59
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
60
|
+
"createI18nUrlRewrite"
|
|
61
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
62
|
+
Object.defineProperty(exports, '__esModule', {
|
|
63
|
+
value: true
|
|
64
|
+
});
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isDefaultLocaleRedirectSkipPath, localiseTargetPathname, matchesPathPrefix, shouldSkipLocaleRedirect, stripLanguagePrefix } from "
|
|
1
|
+
import { isDefaultLocaleRedirectSkipPath, localiseTargetPathname, matchesPathPrefix, shouldSkipLocaleRedirect, stripLanguagePrefix } from "@modern-js/runtime-extensions/localised-urls";
|
|
2
2
|
const stripUrlPathPrefix = (pathname, urlPath)=>{
|
|
3
3
|
const basePath = urlPath.replace('/*', '');
|
|
4
4
|
if (!basePath || '/' === basePath) return pathname;
|