intor 2.3.27 → 2.3.29
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/core/export/index.js +1 -1
- package/dist/core/export/server/index.js +6 -2
- package/dist/core/src/config/constants/cookie.js +0 -1
- package/dist/core/src/config/resolvers/resolve-fallback-locales.js +1 -0
- package/dist/core/src/config/resolvers/resolve-routing-options.js +1 -0
- package/dist/core/src/config/validators/validate-default-locale.js +1 -0
- package/dist/core/src/config/validators/validate-id.js +1 -0
- package/dist/core/src/config/validators/validate-supported-locales.js +1 -0
- package/dist/core/src/core/error/intor-error.js +0 -2
- package/dist/core/src/core/messages/load-remote-messages/collect-remote-resources.js +25 -0
- package/dist/core/src/core/messages/load-remote-messages/fetch-remote-resource.js +47 -0
- package/dist/core/src/core/messages/load-remote-messages/load-remote-messages.js +41 -27
- package/dist/core/src/core/messages/load-remote-messages/resolve-remote-resources.js +24 -0
- package/dist/core/src/routing/pathname/canonicalize-pathname.js +1 -0
- package/dist/core/src/routing/pathname/materialize-pathname.js +1 -0
- package/dist/core/src/routing/pathname/standardize-pathname.js +1 -0
- package/dist/core/src/server/helpers/get-translator.js +4 -8
- package/dist/core/src/server/intor/intor.js +8 -7
- package/dist/core/src/server/messages/load-local-messages/cache/messages-pool.js +17 -0
- package/dist/core/src/server/messages/load-local-messages/load-local-messages.js +2 -2
- package/dist/core/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +1 -0
- package/dist/core/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +4 -4
- package/dist/core/src/server/messages/load-messages.js +5 -5
- package/dist/core/src/server/translator/init-translator.js +36 -0
- package/dist/express/export/express/index.js +1 -1
- package/dist/express/src/adapters/express/helpers/get-translator.js +1 -1
- package/dist/express/src/adapters/express/middleware/{create-intor.js → create-intor-middleware.js} +3 -3
- package/dist/express/src/core/error/intor-error.js +1 -15
- package/dist/express/src/core/messages/load-remote-messages/collect-remote-resources.js +25 -0
- package/dist/express/src/core/messages/load-remote-messages/fetch-remote-resource.js +47 -0
- package/dist/express/src/core/messages/load-remote-messages/load-remote-messages.js +41 -27
- package/dist/express/src/core/messages/load-remote-messages/resolve-remote-resources.js +24 -0
- package/dist/express/src/routing/inbound/resolve-locale/resolve-locale.js +1 -0
- package/dist/express/src/routing/locale/get-locale-from-pathname.js +1 -0
- package/dist/express/src/routing/pathname/canonicalize-pathname.js +1 -0
- package/dist/express/src/routing/pathname/materialize-pathname.js +1 -0
- package/dist/express/src/routing/pathname/standardize-pathname.js +1 -0
- package/dist/express/src/server/helpers/get-translator.js +4 -8
- package/dist/express/src/server/messages/load-local-messages/cache/messages-pool.js +11 -0
- package/dist/express/src/server/messages/load-local-messages/load-local-messages.js +2 -2
- package/dist/express/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +1 -0
- package/dist/express/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +4 -4
- package/dist/express/src/server/messages/load-messages.js +5 -5
- package/dist/express/src/server/translator/init-translator.js +36 -0
- package/dist/next/src/adapters/next/navigation/redirect.js +1 -0
- package/dist/next/src/adapters/next/navigation/use-pathname.js +1 -0
- package/dist/next/src/adapters/next/proxy/intor-proxy.js +1 -0
- package/dist/next/src/adapters/next/server/get-locale.js +19 -4
- package/dist/next/src/adapters/next/server/get-pathname.js +1 -0
- package/dist/next/src/adapters/next/server/get-translator.js +1 -1
- package/dist/next/src/adapters/next/server/intor.js +4 -4
- package/dist/next/src/core/error/intor-error.js +1 -15
- package/dist/next/src/core/messages/load-remote-messages/collect-remote-resources.js +25 -0
- package/dist/next/src/core/messages/load-remote-messages/fetch-remote-resource.js +47 -0
- package/dist/next/src/core/messages/load-remote-messages/load-remote-messages.js +41 -27
- package/dist/next/src/core/messages/load-remote-messages/resolve-remote-resources.js +24 -0
- package/dist/next/src/policies/shoud-full-reload.js +1 -0
- package/dist/next/src/routing/inbound/resolve-locale/resolve-locale.js +1 -0
- package/dist/next/src/routing/locale/get-locale-from-pathname.js +1 -0
- package/dist/next/src/routing/pathname/canonicalize-pathname.js +1 -0
- package/dist/next/src/routing/pathname/materialize-pathname.js +1 -0
- package/dist/next/src/routing/pathname/standardize-pathname.js +1 -0
- package/dist/next/src/server/helpers/get-translator.js +4 -8
- package/dist/next/src/server/intor/intor.js +8 -7
- package/dist/next/src/server/messages/load-local-messages/cache/messages-pool.js +11 -0
- package/dist/next/src/server/messages/load-local-messages/load-local-messages.js +2 -2
- package/dist/next/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +1 -0
- package/dist/next/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +4 -4
- package/dist/next/src/server/messages/load-messages.js +5 -5
- package/dist/next/src/server/translator/init-translator.js +36 -0
- package/dist/react/src/client/react/helpers/use-intor.js +1 -0
- package/dist/react/src/client/react/navigation/use-execute-navigation.js +6 -5
- package/dist/react/src/client/react/navigation/use-resolve-navigation.js +1 -0
- package/dist/react/src/client/react/provider/effects/use-locale-effects.js +3 -3
- package/dist/react/src/client/shared/helpers/get-client-locale.js +1 -0
- package/dist/react/src/client/shared/messages/create-refetch-messages.js +1 -1
- package/dist/react/src/core/error/intor-error.js +0 -2
- package/dist/react/src/core/messages/load-remote-messages/collect-remote-resources.js +25 -0
- package/dist/react/src/core/messages/load-remote-messages/fetch-remote-resource.js +47 -0
- package/dist/react/src/core/messages/load-remote-messages/load-remote-messages.js +41 -27
- package/dist/react/src/core/messages/load-remote-messages/resolve-remote-resources.js +24 -0
- package/dist/react/src/core/messages/utils/nest-object-from-path.js +21 -0
- package/dist/react/src/policies/shoud-full-reload.js +1 -0
- package/dist/react/src/routing/pathname/canonicalize-pathname.js +1 -0
- package/dist/react/src/routing/pathname/materialize-pathname.js +1 -0
- package/dist/react/src/routing/pathname/standardize-pathname.js +1 -0
- package/dist/svelte/src/client/shared/helpers/get-client-locale.js +1 -0
- package/dist/svelte/src/client/shared/messages/create-refetch-messages.js +1 -1
- package/dist/svelte/src/client/svelte/helpers/create-intor.js +1 -0
- package/dist/svelte/src/client/svelte/store/effects/locale-effects.js +3 -3
- package/dist/svelte/src/core/error/intor-error.js +0 -2
- package/dist/svelte/src/core/messages/load-remote-messages/collect-remote-resources.js +25 -0
- package/dist/svelte/src/core/messages/load-remote-messages/fetch-remote-resource.js +47 -0
- package/dist/svelte/src/core/messages/load-remote-messages/load-remote-messages.js +41 -27
- package/dist/svelte/src/core/messages/load-remote-messages/resolve-remote-resources.js +24 -0
- package/dist/svelte/src/core/messages/utils/nest-object-from-path.js +21 -0
- package/dist/types/export/express/index.d.ts +1 -1
- package/dist/types/export/index.d.ts +1 -1
- package/dist/types/export/server/index.d.ts +1 -1
- package/dist/types/src/adapters/express/index.d.ts +1 -1
- package/dist/types/src/adapters/express/middleware/{create-intor.d.ts → create-intor-middleware.d.ts} +1 -1
- package/dist/types/src/adapters/express/middleware/index.d.ts +1 -1
- package/dist/types/src/adapters/next/server/get-locale.d.ts +1 -1
- package/dist/types/src/adapters/next/server/intor.d.ts +4 -1
- package/dist/types/src/config/types/cookie.d.ts +0 -2
- package/dist/types/src/config/types/loader.d.ts +4 -4
- package/dist/types/src/core/error/intor-error.d.ts +1 -2
- package/dist/types/src/core/index.d.ts +1 -1
- package/dist/types/src/core/messages/index.d.ts +1 -2
- package/dist/types/src/core/messages/load-remote-messages/collect-remote-resources.d.ts +19 -0
- package/dist/types/src/core/messages/load-remote-messages/fetch-remote-resource.d.ts +21 -0
- package/dist/types/src/core/messages/load-remote-messages/load-remote-messages.d.ts +7 -4
- package/dist/types/src/core/messages/load-remote-messages/resolve-remote-resources.d.ts +14 -0
- package/dist/types/src/core/messages/load-remote-messages/types.d.ts +1 -1
- package/dist/types/src/core/messages/types.d.ts +9 -6
- package/dist/types/src/core/messages/utils/index.d.ts +2 -0
- package/dist/types/src/policies/index.d.ts +0 -1
- package/dist/types/src/server/helpers/get-translator.d.ts +2 -2
- package/dist/types/src/server/helpers/index.d.ts +0 -1
- package/dist/types/src/server/index.d.ts +2 -2
- package/dist/types/src/server/intor/intor.d.ts +5 -3
- package/dist/types/src/server/messages/index.d.ts +2 -0
- package/dist/types/src/server/messages/load-local-messages/cache/index.d.ts +1 -0
- package/dist/types/src/server/messages/load-local-messages/cache/messages-pool.d.ts +16 -0
- package/dist/types/src/server/messages/load-local-messages/index.d.ts +1 -0
- package/dist/types/src/server/messages/load-local-messages/types.d.ts +2 -1
- package/dist/types/src/server/translator/create-translator.d.ts +3 -5
- package/dist/types/src/server/translator/index.d.ts +1 -1
- package/dist/types/src/server/translator/init-translator.d.ts +14 -0
- package/dist/vue/src/client/shared/helpers/get-client-locale.js +1 -0
- package/dist/vue/src/client/shared/messages/create-refetch-messages.js +1 -1
- package/dist/vue/src/client/vue/helpers/use-intor.js +1 -0
- package/dist/vue/src/client/vue/provider/effects/use-locale-effects.js +3 -3
- package/dist/vue/src/core/error/intor-error.js +0 -2
- package/dist/vue/src/core/messages/load-remote-messages/collect-remote-resources.js +25 -0
- package/dist/vue/src/core/messages/load-remote-messages/fetch-remote-resource.js +47 -0
- package/dist/vue/src/core/messages/load-remote-messages/load-remote-messages.js +41 -27
- package/dist/vue/src/core/messages/load-remote-messages/resolve-remote-resources.js +24 -0
- package/dist/vue/src/core/messages/utils/nest-object-from-path.js +21 -0
- package/package.json +1 -1
- package/dist/core/src/core/messages/global-messages-pool.js +0 -21
- package/dist/core/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +0 -55
- package/dist/core/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -25
- package/dist/core/src/server/helpers/local-messages-from-url.js +0 -53
- package/dist/core/src/server/runtime/create-intor-runtime.js +0 -56
- package/dist/express/src/core/messages/global-messages-pool.js +0 -16
- package/dist/express/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +0 -55
- package/dist/express/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -25
- package/dist/express/src/server/runtime/create-intor-runtime.js +0 -56
- package/dist/next/src/core/messages/global-messages-pool.js +0 -16
- package/dist/next/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +0 -55
- package/dist/next/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -25
- package/dist/next/src/server/runtime/create-intor-runtime.js +0 -56
- package/dist/react/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +0 -55
- package/dist/react/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -25
- package/dist/react/src/policies/should-persist.js +0 -8
- package/dist/svelte/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +0 -55
- package/dist/svelte/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -25
- package/dist/svelte/src/policies/should-persist.js +0 -8
- package/dist/types/src/core/messages/global-messages-pool.d.ts +0 -25
- package/dist/types/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.d.ts +0 -9
- package/dist/types/src/core/messages/load-remote-messages/fetch-locale-messages/index.d.ts +0 -1
- package/dist/types/src/core/messages/load-remote-messages/fetch-locale-messages/types.d.ts +0 -12
- package/dist/types/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.d.ts +0 -5
- package/dist/types/src/policies/should-persist.d.ts +0 -7
- package/dist/types/src/server/helpers/local-messages-from-url.d.ts +0 -21
- package/dist/types/src/server/runtime/create-intor-runtime.d.ts +0 -12
- package/dist/types/src/server/runtime/index.d.ts +0 -2
- package/dist/types/src/server/runtime/types.d.ts +0 -21
- package/dist/vue/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +0 -55
- package/dist/vue/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -25
- package/dist/vue/src/policies/should-persist.js +0 -8
- /package/dist/core/src/{server/messages/load-local-messages/read-locale-messages/parse-file-entries → core/messages}/utils/nest-object-from-path.js +0 -0
- /package/dist/express/src/{server/messages/load-local-messages/read-locale-messages/parse-file-entries → core/messages}/utils/nest-object-from-path.js +0 -0
- /package/dist/next/src/{server/messages/load-local-messages/read-locale-messages/parse-file-entries → core/messages}/utils/nest-object-from-path.js +0 -0
- /package/dist/types/src/{server/messages/load-local-messages/read-locale-messages/parse-file-entries → core/messages}/utils/nest-object-from-path.d.ts +0 -0
|
@@ -1,18 +1,24 @@
|
|
|
1
|
+
import pLimit from 'p-limit';
|
|
1
2
|
import { getLogger } from '../../logger/get-logger.js';
|
|
2
|
-
import {
|
|
3
|
+
import { collectRemoteResources } from './collect-remote-resources.js';
|
|
4
|
+
import { fetchRemoteResource } from './fetch-remote-resource.js';
|
|
5
|
+
import { resolveRemoteResources } from './resolve-remote-resources.js';
|
|
3
6
|
|
|
4
7
|
/**
|
|
5
|
-
* Load locale messages from a remote
|
|
8
|
+
* Load locale messages from a remote source.
|
|
6
9
|
*
|
|
7
10
|
* This function serves as the orchestration layer for remote message loading.
|
|
8
11
|
* It coordinates:
|
|
9
12
|
*
|
|
10
13
|
* - Locale resolution with fallbacks
|
|
11
|
-
* -
|
|
14
|
+
* - Concurrency control for network requests
|
|
15
|
+
* - Remote resource fetching and message merging
|
|
12
16
|
*
|
|
13
|
-
*
|
|
17
|
+
* Remote messages are fetched on demand and are not memoized at the process level.
|
|
18
|
+
*
|
|
19
|
+
* Network requests and response validation are delegated to lower-level utilities.
|
|
14
20
|
*/
|
|
15
|
-
const loadRemoteMessages = async ({ locale, fallbackLocales, namespaces,
|
|
21
|
+
const loadRemoteMessages = async ({ locale, fallbackLocales, namespaces, concurrency, url: baseUrl, headers, signal, loggerOptions, }) => {
|
|
16
22
|
const baseLogger = getLogger(loggerOptions);
|
|
17
23
|
const logger = baseLogger.child({ scope: "load-remote-messages" });
|
|
18
24
|
// Abort early if the request has already been cancelled
|
|
@@ -21,33 +27,45 @@ const loadRemoteMessages = async ({ locale, fallbackLocales, namespaces, rootDir
|
|
|
21
27
|
return;
|
|
22
28
|
}
|
|
23
29
|
const start = performance.now();
|
|
24
|
-
logger.debug("Loading remote messages.", {
|
|
25
|
-
//
|
|
30
|
+
logger.debug("Loading remote messages.", { baseUrl });
|
|
31
|
+
// ----------------------------------------------------------------
|
|
26
32
|
// Resolve locale messages with ordered fallback strategy
|
|
27
|
-
//
|
|
33
|
+
// ----------------------------------------------------------------
|
|
34
|
+
const limit = concurrency ? pLimit(concurrency) : undefined;
|
|
28
35
|
const candidateLocales = [locale, ...(fallbackLocales || [])];
|
|
29
36
|
let messages;
|
|
30
37
|
for (let i = 0; i < candidateLocales.length; i++) {
|
|
31
38
|
const candidateLocale = candidateLocales[i];
|
|
32
39
|
const isLast = i === candidateLocales.length - 1;
|
|
33
40
|
try {
|
|
34
|
-
|
|
41
|
+
// -----------------------------------------------------------------
|
|
42
|
+
// Collect remote message resources for the locale
|
|
43
|
+
// -----------------------------------------------------------------
|
|
44
|
+
const resources = collectRemoteResources({
|
|
35
45
|
locale: candidateLocale,
|
|
46
|
+
baseUrl,
|
|
36
47
|
namespaces,
|
|
37
|
-
rootDir,
|
|
38
|
-
url,
|
|
39
|
-
headers,
|
|
40
|
-
signal,
|
|
41
|
-
extraOptions: { loggerOptions },
|
|
42
48
|
});
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
49
|
+
// -----------------------------------------------------------------
|
|
50
|
+
// Fetch all message chunks in parallel
|
|
51
|
+
// -----------------------------------------------------------------
|
|
52
|
+
const fetchUrl = (url) => fetchRemoteResource({ url, headers, signal, loggerOptions });
|
|
53
|
+
const results = await Promise.all(resources.map(({ url }) => limit ? limit(() => fetchUrl(url)) : fetchUrl(url)));
|
|
54
|
+
// Guard: no valid remote resources
|
|
55
|
+
if (!results.some(Boolean))
|
|
56
|
+
continue;
|
|
57
|
+
// -----------------------------------------------------------------
|
|
58
|
+
// Resolve and merge remote message resources
|
|
59
|
+
// -----------------------------------------------------------------
|
|
60
|
+
const resolved = resolveRemoteResources(resources.map((res, i) => ({ path: res.path, data: results[i] })));
|
|
61
|
+
// -----------------------------------------------------------------
|
|
62
|
+
// Wrap resolved messages into locale-scoped LocaleMessages
|
|
63
|
+
// -----------------------------------------------------------------
|
|
64
|
+
messages = { [candidateLocale]: resolved };
|
|
65
|
+
break;
|
|
48
66
|
}
|
|
49
|
-
catch
|
|
50
|
-
if (
|
|
67
|
+
catch {
|
|
68
|
+
if (signal?.aborted) {
|
|
51
69
|
logger.debug("Remote message loading aborted.");
|
|
52
70
|
return;
|
|
53
71
|
}
|
|
@@ -58,18 +76,14 @@ const loadRemoteMessages = async ({ locale, fallbackLocales, namespaces, rootDir
|
|
|
58
76
|
});
|
|
59
77
|
}
|
|
60
78
|
else {
|
|
61
|
-
logger.warn(`Failed to
|
|
79
|
+
logger.warn(`Failed to load locale messages for "${candidateLocale}", trying next fallback.`);
|
|
62
80
|
}
|
|
63
|
-
logger.trace("Remote fetch error detail.", {
|
|
64
|
-
locale: candidateLocale,
|
|
65
|
-
error,
|
|
66
|
-
});
|
|
67
81
|
}
|
|
68
82
|
}
|
|
69
83
|
// Final success log with resolved locale and timing
|
|
70
84
|
if (messages) {
|
|
71
85
|
logger.trace("Finished loading remote messages.", {
|
|
72
|
-
loadedLocale:
|
|
86
|
+
loadedLocale: Object.keys(messages)[0],
|
|
73
87
|
duration: `${Math.round(performance.now() - start)} ms`,
|
|
74
88
|
});
|
|
75
89
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { deepMerge } from '../../utils/deep-merge.js';
|
|
2
|
+
import { nestObjectFromPath } from '../utils/nest-object-from-path.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Resolve remote message resources into a single MessageObject.
|
|
6
|
+
*
|
|
7
|
+
* - Applies semantic nesting based on resource path
|
|
8
|
+
* - Merges all resolved message chunks
|
|
9
|
+
*
|
|
10
|
+
* Always returns a MessageObject.
|
|
11
|
+
* An empty object represents an empty translation domain.
|
|
12
|
+
*/
|
|
13
|
+
function resolveRemoteResources(resources) {
|
|
14
|
+
let result = {};
|
|
15
|
+
for (const { path, data } of resources) {
|
|
16
|
+
if (!data)
|
|
17
|
+
continue;
|
|
18
|
+
const resolved = path.length > 0 ? nestObjectFromPath(path, data) : data;
|
|
19
|
+
result = deepMerge(result, resolved);
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { resolveRemoteResources };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps a value inside nested objects according to a given path.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* const value = { a: "A" };
|
|
7
|
+
*
|
|
8
|
+
* nestObjectFromPath(["auth", "verify"], value); // → { auth: { verify: { a: "A" } } }
|
|
9
|
+
*
|
|
10
|
+
* nestObjectFromPath([], value); // → { a: "A" }
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
function nestObjectFromPath(path, value) {
|
|
14
|
+
let obj = value;
|
|
15
|
+
for (let i = path.length - 1; i >= 0; i--) {
|
|
16
|
+
obj = { [path[i]]: obj };
|
|
17
|
+
}
|
|
18
|
+
return obj;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { nestObjectFromPath };
|
|
@@ -2,6 +2,7 @@ import { PREFIX_PLACEHOLDER } from '../../core/constants/prefix-placeholder.js';
|
|
|
2
2
|
import '../../core/error/intor-error.js';
|
|
3
3
|
import { normalizePathname } from '../../core/utils/normalizers/normalize-pathname.js';
|
|
4
4
|
import 'logry';
|
|
5
|
+
import 'p-limit';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Materializes a standardized pathname by applying
|
|
@@ -2,6 +2,7 @@ import { PREFIX_PLACEHOLDER } from '../../core/constants/prefix-placeholder.js';
|
|
|
2
2
|
import '../../core/error/intor-error.js';
|
|
3
3
|
import { normalizePathname } from '../../core/utils/normalizers/normalize-pathname.js';
|
|
4
4
|
import 'logry';
|
|
5
|
+
import 'p-limit';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Standardizes a canonical pathname into an internal routing template
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import '../../../core/error/intor-error.js';
|
|
2
2
|
import { normalizeLocale } from '../../../core/utils/normalizers/normalize-locale.js';
|
|
3
3
|
import 'logry';
|
|
4
|
+
import 'p-limit';
|
|
4
5
|
import { detectBrowserLocale } from '../utils/locale/detect-browser-locale.js';
|
|
5
6
|
import { getLocaleFromCookie } from '../utils/locale/get-locale-from-cookie.js';
|
|
6
7
|
|
|
@@ -29,7 +29,7 @@ const createRefetchMessages = ({ config, onLoadingStart, onLoadingEnd, onMessage
|
|
|
29
29
|
locale: newLocale,
|
|
30
30
|
fallbackLocales: config.fallbackLocales[newLocale] || [],
|
|
31
31
|
namespaces: loader.namespaces,
|
|
32
|
-
|
|
32
|
+
concurrency: loader.concurrency,
|
|
33
33
|
url: loader.url,
|
|
34
34
|
headers: loader.headers,
|
|
35
35
|
signal: currentController.signal,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { writable } from 'svelte/store';
|
|
2
2
|
import '../../../core/error/intor-error.js';
|
|
3
3
|
import 'logry';
|
|
4
|
+
import 'p-limit';
|
|
4
5
|
import { mergeMessages } from '../../../core/messages/merge-messages.js';
|
|
5
6
|
import { getClientLocale } from '../../shared/helpers/get-client-locale.js';
|
|
6
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { shouldPersist } from '../../../../policies/should-persist.js';
|
|
2
1
|
import { shouldPersistOnFirstVisit } from '../../../../policies/should-persist-on-first-visit.js';
|
|
3
2
|
import '../../../../core/error/intor-error.js';
|
|
4
3
|
import 'logry';
|
|
4
|
+
import 'p-limit';
|
|
5
5
|
import { getLocaleFromCookie } from '../../../shared/utils/locale/get-locale-from-cookie.js';
|
|
6
6
|
import { setLocaleCookie } from '../../../shared/utils/locale/set-locale-cookie.js';
|
|
7
7
|
import { setDocumentLocale } from '../../../shared/utils/locale/set-document-locale.js';
|
|
@@ -20,7 +20,7 @@ function attachLocaleEffects(locale, config) {
|
|
|
20
20
|
const localeCookie = getLocaleFromCookie(cookie.name);
|
|
21
21
|
const isFirstVisit = !localeCookie;
|
|
22
22
|
if (shouldPersistOnFirstVisit(isFirstVisit, routing.inbound.firstVisit.persist) &&
|
|
23
|
-
|
|
23
|
+
cookie.persist) {
|
|
24
24
|
setLocaleCookie(cookie, currentLocale);
|
|
25
25
|
}
|
|
26
26
|
return;
|
|
@@ -28,7 +28,7 @@ function attachLocaleEffects(locale, config) {
|
|
|
28
28
|
// -------------------------------------------------------------
|
|
29
29
|
// Subsequent locale changes (user-driven)
|
|
30
30
|
// -------------------------------------------------------------
|
|
31
|
-
if (
|
|
31
|
+
if (cookie.persist) {
|
|
32
32
|
setLocaleCookie(cookie, currentLocale);
|
|
33
33
|
}
|
|
34
34
|
});
|
|
@@ -4,8 +4,6 @@ var IntorErrorCode;
|
|
|
4
4
|
IntorErrorCode["INVALID_CONFIG_ID"] = "INTOR_INVALID_CONFIG_ID";
|
|
5
5
|
IntorErrorCode["MISSING_SUPPORTED_LOCALES"] = "INTOR_MISSING_SUPPORTED_LOCALES";
|
|
6
6
|
IntorErrorCode["UNSUPPORTED_DEFAULT_LOCALE"] = "INTOR_UNSUPPORTED_DEFAULT_LOCALE";
|
|
7
|
-
// runtime
|
|
8
|
-
IntorErrorCode["RUNTIME_NOT_INITIALIZED"] = "INTOR_RUNTIME_NOT_INITIALIZED";
|
|
9
7
|
})(IntorErrorCode || (IntorErrorCode = {}));
|
|
10
8
|
|
|
11
9
|
export { IntorErrorCode };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collect remote message resources for a given locale.
|
|
3
|
+
*
|
|
4
|
+
* - Always includes the root `index.json`
|
|
5
|
+
* - Optionally includes namespace-specific resources
|
|
6
|
+
* - Produces semantic paths for later message nesting
|
|
7
|
+
*
|
|
8
|
+
* This function performs no I/O and does not validate resource existence.
|
|
9
|
+
*/
|
|
10
|
+
function collectRemoteResources({ locale, baseUrl, namespaces, }) {
|
|
11
|
+
const basePath = `${baseUrl}/${locale}`;
|
|
12
|
+
// Root translation resource (always loaded)
|
|
13
|
+
const indexResource = { url: `${basePath}/index.json`, path: [] };
|
|
14
|
+
// When no namespaces are provided, the locale domain consists of index only
|
|
15
|
+
if (!namespaces || namespaces.length === 0)
|
|
16
|
+
return [indexResource];
|
|
17
|
+
// Namespace-specific resources are nested under their namespace key
|
|
18
|
+
const nsResources = namespaces.map((ns) => ({
|
|
19
|
+
url: `${basePath}/${ns}.json`,
|
|
20
|
+
path: [ns],
|
|
21
|
+
}));
|
|
22
|
+
return [indexResource, ...nsResources];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { collectRemoteResources };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { getLogger } from '../../logger/get-logger.js';
|
|
2
|
+
import { isValidMessages } from '../utils/is-valid-messages.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Fetch a single remote messages resource.
|
|
6
|
+
*
|
|
7
|
+
* This function performs a single HTTP request to retrieve
|
|
8
|
+
* a remote translation messages payload.
|
|
9
|
+
*
|
|
10
|
+
* It is responsible for:
|
|
11
|
+
* - Issuing the network request
|
|
12
|
+
* - Validating the returned message structure
|
|
13
|
+
* - Handling abort and network errors
|
|
14
|
+
*/
|
|
15
|
+
async function fetchRemoteResource({ url, headers, signal, loggerOptions, }) {
|
|
16
|
+
const baseLogger = getLogger(loggerOptions);
|
|
17
|
+
const logger = baseLogger.child({ scope: "fetch-locale-messages" });
|
|
18
|
+
try {
|
|
19
|
+
// Fetch
|
|
20
|
+
const response = await fetch(url, {
|
|
21
|
+
method: "GET",
|
|
22
|
+
headers: { "Content-Type": "application/json", ...headers },
|
|
23
|
+
cache: "no-store",
|
|
24
|
+
signal,
|
|
25
|
+
});
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
throw new Error(`HTTP ${response.status} ${response.statusText}`);
|
|
28
|
+
}
|
|
29
|
+
// Parse JSON body
|
|
30
|
+
const data = await response.json();
|
|
31
|
+
// Validate messages structure
|
|
32
|
+
if (!isValidMessages(data)) {
|
|
33
|
+
throw new Error("Invalid messages structure");
|
|
34
|
+
}
|
|
35
|
+
return data;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
39
|
+
logger.debug("Remote fetch aborted.", { url });
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
logger.warn("Failed to fetch remote messages.", { url, error });
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export { fetchRemoteResource };
|
|
@@ -1,18 +1,24 @@
|
|
|
1
|
+
import pLimit from 'p-limit';
|
|
1
2
|
import { getLogger } from '../../logger/get-logger.js';
|
|
2
|
-
import {
|
|
3
|
+
import { collectRemoteResources } from './collect-remote-resources.js';
|
|
4
|
+
import { fetchRemoteResource } from './fetch-remote-resource.js';
|
|
5
|
+
import { resolveRemoteResources } from './resolve-remote-resources.js';
|
|
3
6
|
|
|
4
7
|
/**
|
|
5
|
-
* Load locale messages from a remote
|
|
8
|
+
* Load locale messages from a remote source.
|
|
6
9
|
*
|
|
7
10
|
* This function serves as the orchestration layer for remote message loading.
|
|
8
11
|
* It coordinates:
|
|
9
12
|
*
|
|
10
13
|
* - Locale resolution with fallbacks
|
|
11
|
-
* -
|
|
14
|
+
* - Concurrency control for network requests
|
|
15
|
+
* - Remote resource fetching and message merging
|
|
12
16
|
*
|
|
13
|
-
*
|
|
17
|
+
* Remote messages are fetched on demand and are not memoized at the process level.
|
|
18
|
+
*
|
|
19
|
+
* Network requests and response validation are delegated to lower-level utilities.
|
|
14
20
|
*/
|
|
15
|
-
const loadRemoteMessages = async ({ locale, fallbackLocales, namespaces,
|
|
21
|
+
const loadRemoteMessages = async ({ locale, fallbackLocales, namespaces, concurrency, url: baseUrl, headers, signal, loggerOptions, }) => {
|
|
16
22
|
const baseLogger = getLogger(loggerOptions);
|
|
17
23
|
const logger = baseLogger.child({ scope: "load-remote-messages" });
|
|
18
24
|
// Abort early if the request has already been cancelled
|
|
@@ -21,33 +27,45 @@ const loadRemoteMessages = async ({ locale, fallbackLocales, namespaces, rootDir
|
|
|
21
27
|
return;
|
|
22
28
|
}
|
|
23
29
|
const start = performance.now();
|
|
24
|
-
logger.debug("Loading remote messages.", {
|
|
25
|
-
//
|
|
30
|
+
logger.debug("Loading remote messages.", { baseUrl });
|
|
31
|
+
// ----------------------------------------------------------------
|
|
26
32
|
// Resolve locale messages with ordered fallback strategy
|
|
27
|
-
//
|
|
33
|
+
// ----------------------------------------------------------------
|
|
34
|
+
const limit = concurrency ? pLimit(concurrency) : undefined;
|
|
28
35
|
const candidateLocales = [locale, ...(fallbackLocales || [])];
|
|
29
36
|
let messages;
|
|
30
37
|
for (let i = 0; i < candidateLocales.length; i++) {
|
|
31
38
|
const candidateLocale = candidateLocales[i];
|
|
32
39
|
const isLast = i === candidateLocales.length - 1;
|
|
33
40
|
try {
|
|
34
|
-
|
|
41
|
+
// -----------------------------------------------------------------
|
|
42
|
+
// Collect remote message resources for the locale
|
|
43
|
+
// -----------------------------------------------------------------
|
|
44
|
+
const resources = collectRemoteResources({
|
|
35
45
|
locale: candidateLocale,
|
|
46
|
+
baseUrl,
|
|
36
47
|
namespaces,
|
|
37
|
-
rootDir,
|
|
38
|
-
url,
|
|
39
|
-
headers,
|
|
40
|
-
signal,
|
|
41
|
-
extraOptions: { loggerOptions },
|
|
42
48
|
});
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
49
|
+
// -----------------------------------------------------------------
|
|
50
|
+
// Fetch all message chunks in parallel
|
|
51
|
+
// -----------------------------------------------------------------
|
|
52
|
+
const fetchUrl = (url) => fetchRemoteResource({ url, headers, signal, loggerOptions });
|
|
53
|
+
const results = await Promise.all(resources.map(({ url }) => limit ? limit(() => fetchUrl(url)) : fetchUrl(url)));
|
|
54
|
+
// Guard: no valid remote resources
|
|
55
|
+
if (!results.some(Boolean))
|
|
56
|
+
continue;
|
|
57
|
+
// -----------------------------------------------------------------
|
|
58
|
+
// Resolve and merge remote message resources
|
|
59
|
+
// -----------------------------------------------------------------
|
|
60
|
+
const resolved = resolveRemoteResources(resources.map((res, i) => ({ path: res.path, data: results[i] })));
|
|
61
|
+
// -----------------------------------------------------------------
|
|
62
|
+
// Wrap resolved messages into locale-scoped LocaleMessages
|
|
63
|
+
// -----------------------------------------------------------------
|
|
64
|
+
messages = { [candidateLocale]: resolved };
|
|
65
|
+
break;
|
|
48
66
|
}
|
|
49
|
-
catch
|
|
50
|
-
if (
|
|
67
|
+
catch {
|
|
68
|
+
if (signal?.aborted) {
|
|
51
69
|
logger.debug("Remote message loading aborted.");
|
|
52
70
|
return;
|
|
53
71
|
}
|
|
@@ -58,18 +76,14 @@ const loadRemoteMessages = async ({ locale, fallbackLocales, namespaces, rootDir
|
|
|
58
76
|
});
|
|
59
77
|
}
|
|
60
78
|
else {
|
|
61
|
-
logger.warn(`Failed to
|
|
79
|
+
logger.warn(`Failed to load locale messages for "${candidateLocale}", trying next fallback.`);
|
|
62
80
|
}
|
|
63
|
-
logger.trace("Remote fetch error detail.", {
|
|
64
|
-
locale: candidateLocale,
|
|
65
|
-
error,
|
|
66
|
-
});
|
|
67
81
|
}
|
|
68
82
|
}
|
|
69
83
|
// Final success log with resolved locale and timing
|
|
70
84
|
if (messages) {
|
|
71
85
|
logger.trace("Finished loading remote messages.", {
|
|
72
|
-
loadedLocale:
|
|
86
|
+
loadedLocale: Object.keys(messages)[0],
|
|
73
87
|
duration: `${Math.round(performance.now() - start)} ms`,
|
|
74
88
|
});
|
|
75
89
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { deepMerge } from '../../utils/deep-merge.js';
|
|
2
|
+
import { nestObjectFromPath } from '../utils/nest-object-from-path.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Resolve remote message resources into a single MessageObject.
|
|
6
|
+
*
|
|
7
|
+
* - Applies semantic nesting based on resource path
|
|
8
|
+
* - Merges all resolved message chunks
|
|
9
|
+
*
|
|
10
|
+
* Always returns a MessageObject.
|
|
11
|
+
* An empty object represents an empty translation domain.
|
|
12
|
+
*/
|
|
13
|
+
function resolveRemoteResources(resources) {
|
|
14
|
+
let result = {};
|
|
15
|
+
for (const { path, data } of resources) {
|
|
16
|
+
if (!data)
|
|
17
|
+
continue;
|
|
18
|
+
const resolved = path.length > 0 ? nestObjectFromPath(path, data) : data;
|
|
19
|
+
result = deepMerge(result, resolved);
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { resolveRemoteResources };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps a value inside nested objects according to a given path.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* const value = { a: "A" };
|
|
7
|
+
*
|
|
8
|
+
* nestObjectFromPath(["auth", "verify"], value); // → { auth: { verify: { a: "A" } } }
|
|
9
|
+
*
|
|
10
|
+
* nestObjectFromPath([], value); // → { a: "A" }
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
function nestObjectFromPath(path, value) {
|
|
14
|
+
let obj = value;
|
|
15
|
+
for (let i = path.length - 1; i >= 0; i--) {
|
|
16
|
+
obj = { [path[i]]: obj };
|
|
17
|
+
}
|
|
18
|
+
return obj;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { nestObjectFromPath };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { createIntorMiddleware, getTranslator } from "../../src/adapters/express";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { PREFIX_PLACEHOLDER, IntorError, IntorErrorCode, deepMerge, type DeepMergeOverrideEvent, resolveLoaderOptions, clearLoggerPool,
|
|
1
|
+
export { PREFIX_PLACEHOLDER, IntorError, IntorErrorCode, deepMerge, type DeepMergeOverrideEvent, resolveLoaderOptions, clearLoggerPool, mergeMessages, isValidMessages, type MessagesReader, type MessagesReaders, INTOR_PREFIX, INTOR_MESSAGES_KIND_KEY, INTOR_MESSAGES_KIND, getMessagesKind, type IntorMessagesKind, } from "../src/core";
|
|
2
2
|
export { defineIntorConfig, type IntorRawConfig, type IntorResolvedConfig, } from "../src/config";
|
|
3
3
|
export { localizePathname } from "../src/routing";
|
|
4
4
|
export { Translator, type TranslatorPlugin, type TranslateContext, type TranslateHook, type TranslateHandlers, type HandlerContext, type FormatHandler, type LoadingHandler, type MissingHandler, type LocaleMessages, type MessageObject, type MessageValue, tokenize, type Token, } from "intor-translator";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { intor, type IntorValue, loadMessages,
|
|
1
|
+
export { intor, type IntorValue, loadMessages, clearMessagesPool, getTranslator, } from "../../src/server";
|
|
@@ -11,4 +11,4 @@ import { type GetTranslatorParams } from "../../../server";
|
|
|
11
11
|
*
|
|
12
12
|
* @platform Express
|
|
13
13
|
*/
|
|
14
|
-
export declare function
|
|
14
|
+
export declare function createIntorMiddleware(config: IntorResolvedConfig, options?: Omit<GetTranslatorParams, "locale">): (req: Request, _res: Response, next: NextFunction) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { createIntorMiddleware } from "./create-intor-middleware";
|
|
@@ -3,7 +3,7 @@ import type { GenConfigKeys, GenLocale } from "../../../core";
|
|
|
3
3
|
/**
|
|
4
4
|
* Get the locale for the current execution context.
|
|
5
5
|
*
|
|
6
|
-
* @note
|
|
6
|
+
* @note Uses inbound routing context when available, otherwise falls back to persisted state.
|
|
7
7
|
* @platform Next.js
|
|
8
8
|
*/
|
|
9
9
|
export declare const getLocale: <CK extends GenConfigKeys = "__default__">(config: IntorResolvedConfig) => Promise<GenLocale<CK>>;
|
|
@@ -9,4 +9,7 @@ import { type IntorValue } from "../../../server";
|
|
|
9
9
|
* - Permits cache writes during server execution.
|
|
10
10
|
* @platform Next.js
|
|
11
11
|
*/
|
|
12
|
-
export declare function intor<CK extends GenConfigKeys = "__default__">(config: IntorResolvedConfig,
|
|
12
|
+
export declare function intor<CK extends GenConfigKeys = "__default__">(config: IntorResolvedConfig, options?: {
|
|
13
|
+
readers?: MessagesReaders;
|
|
14
|
+
allowCacheWrite?: boolean;
|
|
15
|
+
}): Promise<IntorValue<CK>>;
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
export type CookieRawOptions = {
|
|
2
|
-
/** Enable cookie read/write behavior. Defaults to true */
|
|
3
|
-
enabled?: boolean;
|
|
4
2
|
/** Whether to persist the resolved locale in a cookie. Defaults to true */
|
|
5
3
|
persist?: boolean;
|
|
6
4
|
/** Cookie name used to store the locale. Defaults to "intor.locale" */
|
|
@@ -11,21 +11,21 @@ export interface RemoteHeaders {
|
|
|
11
11
|
interface LocalLoader {
|
|
12
12
|
/** Use local filesystem-based message loading. */
|
|
13
13
|
type: "local";
|
|
14
|
-
/** Root location for resolving message loading sources. */
|
|
15
|
-
rootDir?: string;
|
|
16
14
|
/** Namespaces to load for all routes. */
|
|
17
15
|
namespaces?: string[];
|
|
18
16
|
/** Maximum number of concurrent loading tasks. */
|
|
19
17
|
concurrency?: number;
|
|
18
|
+
/** Root location for resolving message loading sources. */
|
|
19
|
+
rootDir?: string;
|
|
20
20
|
}
|
|
21
21
|
/** Remote message loader options. */
|
|
22
22
|
export interface RemoteLoader {
|
|
23
23
|
/** Use remote API-based message loading. */
|
|
24
24
|
type: "remote";
|
|
25
|
-
/** Root location for resolving message loading sources. */
|
|
26
|
-
rootDir?: string;
|
|
27
25
|
/** Namespaces to load for all routes. */
|
|
28
26
|
namespaces?: string[];
|
|
27
|
+
/** Maximum number of concurrent loading tasks. */
|
|
28
|
+
concurrency?: number;
|
|
29
29
|
/** Base URL for fetching remote messages. */
|
|
30
30
|
url: string;
|
|
31
31
|
/** Optional headers sent with remote requests. */
|
|
@@ -11,7 +11,6 @@ export declare class IntorError extends Error {
|
|
|
11
11
|
export declare enum IntorErrorCode {
|
|
12
12
|
INVALID_CONFIG_ID = "INTOR_INVALID_CONFIG_ID",
|
|
13
13
|
MISSING_SUPPORTED_LOCALES = "INTOR_MISSING_SUPPORTED_LOCALES",
|
|
14
|
-
UNSUPPORTED_DEFAULT_LOCALE = "INTOR_UNSUPPORTED_DEFAULT_LOCALE"
|
|
15
|
-
RUNTIME_NOT_INITIALIZED = "INTOR_RUNTIME_NOT_INITIALIZED"
|
|
14
|
+
UNSUPPORTED_DEFAULT_LOCALE = "INTOR_UNSUPPORTED_DEFAULT_LOCALE"
|
|
16
15
|
}
|
|
17
16
|
export {};
|
|
@@ -2,5 +2,5 @@ export { PREFIX_PLACEHOLDER, INTOR_HEADERS } from "./constants";
|
|
|
2
2
|
export { IntorError, IntorErrorCode } from "./error";
|
|
3
3
|
export { deepMerge, type PlainObject, type DeepMergeOverrideEvent, resolveLoaderOptions, normalizePathname, normalizeCacheKey, normalizeLocale, normalizeQuery, } from "./utils";
|
|
4
4
|
export { getLogger, clearLoggerPool } from "./logger";
|
|
5
|
-
export { loadRemoteMessages,
|
|
5
|
+
export { loadRemoteMessages, mergeMessages, isValidMessages, nestObjectFromPath, type MessagesReader, type MessagesReaders, INTOR_PREFIX, INTOR_MESSAGES_KIND_KEY, INTOR_MESSAGES_KIND, getMessagesKind, type IntorMessagesKind, } from "./messages";
|
|
6
6
|
export type { INTOR_GENERATED_KEY, IfGen, GenConfigKeys, GenConfig, GenMessages, GenLocale, GenReplacements, GenRich, TranslatorInstance, RoutingLocaleSource, RoutingLocaleCarrier, LocalePathPrefix, } from "./types";
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export { loadRemoteMessages } from "./load-remote-messages";
|
|
2
|
-
export { type MessagesPool, getGlobalMessagesPool, clearMessagesPool, } from "./global-messages-pool";
|
|
3
2
|
export { mergeMessages } from "./merge-messages";
|
|
4
|
-
export { isValidMessages } from "./utils
|
|
3
|
+
export { isValidMessages, nestObjectFromPath } from "./utils";
|
|
5
4
|
export type { MessagesReader, MessagesReaders } from "./types";
|
|
6
5
|
export { INTOR_PREFIX, INTOR_MESSAGES_KIND_KEY, INTOR_MESSAGES_KIND, getMessagesKind, type IntorMessagesKind, } from "./internal-metadata";
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
interface CollectRemoteResourcesParams {
|
|
2
|
+
locale: string;
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
namespaces?: string[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Collect remote message resources for a given locale.
|
|
8
|
+
*
|
|
9
|
+
* - Always includes the root `index.json`
|
|
10
|
+
* - Optionally includes namespace-specific resources
|
|
11
|
+
* - Produces semantic paths for later message nesting
|
|
12
|
+
*
|
|
13
|
+
* This function performs no I/O and does not validate resource existence.
|
|
14
|
+
*/
|
|
15
|
+
export declare function collectRemoteResources({ locale, baseUrl, namespaces, }: CollectRemoteResourcesParams): Array<{
|
|
16
|
+
url: string;
|
|
17
|
+
path: string[];
|
|
18
|
+
}>;
|
|
19
|
+
export {};
|