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,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Build URLSearchParams from an object.
|
|
3
|
-
* Supports string or string[] values. Ignores undefined/null.
|
|
4
|
-
*/
|
|
5
|
-
const buildSearchParams = (params) => {
|
|
6
|
-
const searchParams = new URLSearchParams();
|
|
7
|
-
const appendParam = (key, value) => {
|
|
8
|
-
if (value === undefined || value === null)
|
|
9
|
-
return;
|
|
10
|
-
if (Array.isArray(value) && value.length === 0)
|
|
11
|
-
return;
|
|
12
|
-
if (Array.isArray(value)) {
|
|
13
|
-
value.forEach((v) => v && searchParams.append(key, v));
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
searchParams.append(key, value);
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
Object.entries(params).forEach(([key, value]) => {
|
|
20
|
-
appendParam(key, value);
|
|
21
|
-
});
|
|
22
|
-
return searchParams;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export { buildSearchParams };
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { loadLocalMessages } from '../messages/load-local-messages/load-local-messages.js';
|
|
2
|
-
|
|
3
|
-
/** Parse a multi-value query parameter into a normalized string array. */
|
|
4
|
-
function parseMultiValueParam(values) {
|
|
5
|
-
if (!values || values.length === 0)
|
|
6
|
-
return undefined;
|
|
7
|
-
const result = values.flatMap((value) => value
|
|
8
|
-
.split(",")
|
|
9
|
-
.map((v) => v.trim())
|
|
10
|
-
.filter(Boolean));
|
|
11
|
-
return result.length > 0 ? result : undefined;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Load locale messages from a URL-based query protocol.
|
|
15
|
-
*
|
|
16
|
-
* - This helper is intended for building custom HTTP endpoints
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```ts
|
|
20
|
-
* const url = new URL(
|
|
21
|
-
* "https://example.com/messages" +
|
|
22
|
-
* "?locale=en-US" +
|
|
23
|
-
* "&rootDir=./messages" +
|
|
24
|
-
* "&namespaces=common" +
|
|
25
|
-
* "&namespaces=homepage" +
|
|
26
|
-
* "&fallbackLocales=zh-TW"
|
|
27
|
-
* );
|
|
28
|
-
*
|
|
29
|
-
* const messages = await loadMessagesFromUrl(url);
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
async function loadMessagesFromUrl(url, options) {
|
|
33
|
-
// Parse query parameters
|
|
34
|
-
const rootDir = url.searchParams.get("rootDir") ?? "";
|
|
35
|
-
const locale = url.searchParams.get("locale") ?? "en-US";
|
|
36
|
-
const namespaces = parseMultiValueParam(url.searchParams.getAll("namespaces"));
|
|
37
|
-
const fallbackLocales = parseMultiValueParam(url.searchParams.getAll("fallbackLocales"));
|
|
38
|
-
// Load local messages
|
|
39
|
-
return loadLocalMessages({
|
|
40
|
-
id: options?.id || "default",
|
|
41
|
-
rootDir,
|
|
42
|
-
locale,
|
|
43
|
-
namespaces,
|
|
44
|
-
fallbackLocales,
|
|
45
|
-
concurrency: options?.concurrency,
|
|
46
|
-
readers: options?.readers,
|
|
47
|
-
pool: options?.pool,
|
|
48
|
-
allowCacheWrite: options?.allowCacheWrite,
|
|
49
|
-
loggerOptions: options?.loggerOptions || { id: "default" },
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export { loadMessagesFromUrl };
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { IntorError, IntorErrorCode } from '../../core/error/intor-error.js';
|
|
2
|
-
import { resolveLoaderOptions } from '../../core/utils/resolve-loader-options.js';
|
|
3
|
-
import 'logry';
|
|
4
|
-
import { loadMessages } from '../messages/load-messages.js';
|
|
5
|
-
import { createTranslator } from '../translator/create-translator.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Create a server-side Intor runtime.
|
|
9
|
-
*
|
|
10
|
-
* - The runtime represents a request-scoped execution context.
|
|
11
|
-
* - It enforces a strict initialization protocol:
|
|
12
|
-
* `ensureMessages(locale) → getTranslator(locale)`
|
|
13
|
-
* - Messages may be empty, but the ensure step must be completed
|
|
14
|
-
* before a translator snapshot can be created.
|
|
15
|
-
*/
|
|
16
|
-
function createIntorRuntime(config, options) {
|
|
17
|
-
const loader = resolveLoaderOptions(config, "server");
|
|
18
|
-
// Locale that has completed the ensureMessages() phase
|
|
19
|
-
let ensuredLocale;
|
|
20
|
-
// Messages prepared during ensureMessages(); may be empty
|
|
21
|
-
let ensuredMessages;
|
|
22
|
-
return {
|
|
23
|
-
async ensureMessages(locale) {
|
|
24
|
-
let messages;
|
|
25
|
-
if (loader) {
|
|
26
|
-
messages = await loadMessages({
|
|
27
|
-
config,
|
|
28
|
-
locale,
|
|
29
|
-
readers: options?.readers,
|
|
30
|
-
allowCacheWrite: options?.allowCacheWrite || false,
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
ensuredLocale = locale;
|
|
34
|
-
ensuredMessages = messages || {};
|
|
35
|
-
},
|
|
36
|
-
translator(locale, options) {
|
|
37
|
-
// Guard: translator requires ensureMessages() to be completed for this locale
|
|
38
|
-
if (locale !== ensuredLocale) {
|
|
39
|
-
throw new IntorError({
|
|
40
|
-
message: "translator() called before ensureMessages()",
|
|
41
|
-
code: IntorErrorCode.RUNTIME_NOT_INITIALIZED,
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
return createTranslator({
|
|
45
|
-
config,
|
|
46
|
-
locale,
|
|
47
|
-
messages: ensuredMessages || {},
|
|
48
|
-
preKey: options?.preKey,
|
|
49
|
-
handlers: options?.handlers,
|
|
50
|
-
plugins: options?.plugins,
|
|
51
|
-
});
|
|
52
|
-
},
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export { createIntorRuntime };
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Get the global messages pool.
|
|
3
|
-
*
|
|
4
|
-
* Lazily initialized to ensure:
|
|
5
|
-
* - Cross-module sharing
|
|
6
|
-
* - Dev / HMR safety
|
|
7
|
-
*/
|
|
8
|
-
function getGlobalMessagesPool() {
|
|
9
|
-
if (!globalThis.__INTOR_MESSAGES_POOL__) {
|
|
10
|
-
const pool = new Map();
|
|
11
|
-
globalThis.__INTOR_MESSAGES_POOL__ = pool;
|
|
12
|
-
}
|
|
13
|
-
return globalThis.__INTOR_MESSAGES_POOL__;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export { getGlobalMessagesPool };
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { getLogger } from '../../../logger/get-logger.js';
|
|
2
|
-
import { isValidMessages } from '../../utils/is-valid-messages.js';
|
|
3
|
-
import { buildSearchParams } from './utils/build-search-params.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Fetches locale messages from a remote API.
|
|
7
|
-
*
|
|
8
|
-
* - Validates that the returned JSON matches the expected `NamespaceMessages` structure.
|
|
9
|
-
* - Uses `fetch` with `no-store` cache to always get fresh data.
|
|
10
|
-
*/
|
|
11
|
-
const fetchLocaleMessages = async ({ locale, namespaces, rootDir, url: rawUrl, headers: rawHeaders, signal, extraOptions: { loggerOptions }, }) => {
|
|
12
|
-
const baseLogger = getLogger(loggerOptions);
|
|
13
|
-
const logger = baseLogger.child({ scope: "fetch-locale-messages" });
|
|
14
|
-
const searchParams = buildSearchParams({ locale, rootDir, namespaces });
|
|
15
|
-
const url = `${rawUrl}?${searchParams.toString()}`;
|
|
16
|
-
try {
|
|
17
|
-
// Headers
|
|
18
|
-
const headers = {
|
|
19
|
-
"Content-Type": "application/json",
|
|
20
|
-
...rawHeaders,
|
|
21
|
-
};
|
|
22
|
-
// Fetch
|
|
23
|
-
const response = await fetch(url, {
|
|
24
|
-
method: "GET",
|
|
25
|
-
headers: headers,
|
|
26
|
-
cache: "no-store",
|
|
27
|
-
signal,
|
|
28
|
-
});
|
|
29
|
-
if (!response.ok) {
|
|
30
|
-
throw new Error(`HTTP error ${response.status} ${response.statusText}`);
|
|
31
|
-
}
|
|
32
|
-
// Parse JSON body
|
|
33
|
-
const data = (await response.json());
|
|
34
|
-
// Validate messages structure
|
|
35
|
-
if (!isValidMessages(data[locale])) {
|
|
36
|
-
throw new Error("JSON file does not match NamespaceMessages structure");
|
|
37
|
-
}
|
|
38
|
-
return data;
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
if (error instanceof Error && error.name === "AbortError") {
|
|
42
|
-
logger.debug("Fetching locale messages aborted.", { locale, url });
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
logger.warn("Fetching locale messages failed.", {
|
|
46
|
-
locale,
|
|
47
|
-
url,
|
|
48
|
-
searchParams: decodeURIComponent(searchParams.toString()),
|
|
49
|
-
error,
|
|
50
|
-
});
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
export { fetchLocaleMessages };
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Build URLSearchParams from an object.
|
|
3
|
-
* Supports string or string[] values. Ignores undefined/null.
|
|
4
|
-
*/
|
|
5
|
-
const buildSearchParams = (params) => {
|
|
6
|
-
const searchParams = new URLSearchParams();
|
|
7
|
-
const appendParam = (key, value) => {
|
|
8
|
-
if (value === undefined || value === null)
|
|
9
|
-
return;
|
|
10
|
-
if (Array.isArray(value) && value.length === 0)
|
|
11
|
-
return;
|
|
12
|
-
if (Array.isArray(value)) {
|
|
13
|
-
value.forEach((v) => v && searchParams.append(key, v));
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
searchParams.append(key, value);
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
Object.entries(params).forEach(([key, value]) => {
|
|
20
|
-
appendParam(key, value);
|
|
21
|
-
});
|
|
22
|
-
return searchParams;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export { buildSearchParams };
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { IntorError, IntorErrorCode } from '../../core/error/intor-error.js';
|
|
2
|
-
import { resolveLoaderOptions } from '../../core/utils/resolve-loader-options.js';
|
|
3
|
-
import 'logry';
|
|
4
|
-
import { loadMessages } from '../messages/load-messages.js';
|
|
5
|
-
import { createTranslator } from '../translator/create-translator.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Create a server-side Intor runtime.
|
|
9
|
-
*
|
|
10
|
-
* - The runtime represents a request-scoped execution context.
|
|
11
|
-
* - It enforces a strict initialization protocol:
|
|
12
|
-
* `ensureMessages(locale) → getTranslator(locale)`
|
|
13
|
-
* - Messages may be empty, but the ensure step must be completed
|
|
14
|
-
* before a translator snapshot can be created.
|
|
15
|
-
*/
|
|
16
|
-
function createIntorRuntime(config, options) {
|
|
17
|
-
const loader = resolveLoaderOptions(config);
|
|
18
|
-
// Locale that has completed the ensureMessages() phase
|
|
19
|
-
let ensuredLocale;
|
|
20
|
-
// Messages prepared during ensureMessages(); may be empty
|
|
21
|
-
let ensuredMessages;
|
|
22
|
-
return {
|
|
23
|
-
async ensureMessages(locale) {
|
|
24
|
-
let messages;
|
|
25
|
-
if (loader) {
|
|
26
|
-
messages = await loadMessages({
|
|
27
|
-
config,
|
|
28
|
-
locale,
|
|
29
|
-
readers: options?.readers,
|
|
30
|
-
allowCacheWrite: options?.allowCacheWrite || false,
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
ensuredLocale = locale;
|
|
34
|
-
ensuredMessages = messages || {};
|
|
35
|
-
},
|
|
36
|
-
translator(locale, options) {
|
|
37
|
-
// Guard: translator requires ensureMessages() to be completed for this locale
|
|
38
|
-
if (locale !== ensuredLocale) {
|
|
39
|
-
throw new IntorError({
|
|
40
|
-
message: "translator() called before ensureMessages()",
|
|
41
|
-
code: IntorErrorCode.RUNTIME_NOT_INITIALIZED,
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
return createTranslator({
|
|
45
|
-
config,
|
|
46
|
-
locale,
|
|
47
|
-
messages: ensuredMessages || {},
|
|
48
|
-
preKey: options?.preKey,
|
|
49
|
-
handlers: options?.handlers,
|
|
50
|
-
plugins: options?.plugins,
|
|
51
|
-
});
|
|
52
|
-
},
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export { createIntorRuntime };
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Get the global messages pool.
|
|
3
|
-
*
|
|
4
|
-
* Lazily initialized to ensure:
|
|
5
|
-
* - Cross-module sharing
|
|
6
|
-
* - Dev / HMR safety
|
|
7
|
-
*/
|
|
8
|
-
function getGlobalMessagesPool() {
|
|
9
|
-
if (!globalThis.__INTOR_MESSAGES_POOL__) {
|
|
10
|
-
const pool = new Map();
|
|
11
|
-
globalThis.__INTOR_MESSAGES_POOL__ = pool;
|
|
12
|
-
}
|
|
13
|
-
return globalThis.__INTOR_MESSAGES_POOL__;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export { getGlobalMessagesPool };
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { getLogger } from '../../../logger/get-logger.js';
|
|
2
|
-
import { isValidMessages } from '../../utils/is-valid-messages.js';
|
|
3
|
-
import { buildSearchParams } from './utils/build-search-params.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Fetches locale messages from a remote API.
|
|
7
|
-
*
|
|
8
|
-
* - Validates that the returned JSON matches the expected `NamespaceMessages` structure.
|
|
9
|
-
* - Uses `fetch` with `no-store` cache to always get fresh data.
|
|
10
|
-
*/
|
|
11
|
-
const fetchLocaleMessages = async ({ locale, namespaces, rootDir, url: rawUrl, headers: rawHeaders, signal, extraOptions: { loggerOptions }, }) => {
|
|
12
|
-
const baseLogger = getLogger(loggerOptions);
|
|
13
|
-
const logger = baseLogger.child({ scope: "fetch-locale-messages" });
|
|
14
|
-
const searchParams = buildSearchParams({ locale, rootDir, namespaces });
|
|
15
|
-
const url = `${rawUrl}?${searchParams.toString()}`;
|
|
16
|
-
try {
|
|
17
|
-
// Headers
|
|
18
|
-
const headers = {
|
|
19
|
-
"Content-Type": "application/json",
|
|
20
|
-
...rawHeaders,
|
|
21
|
-
};
|
|
22
|
-
// Fetch
|
|
23
|
-
const response = await fetch(url, {
|
|
24
|
-
method: "GET",
|
|
25
|
-
headers: headers,
|
|
26
|
-
cache: "no-store",
|
|
27
|
-
signal,
|
|
28
|
-
});
|
|
29
|
-
if (!response.ok) {
|
|
30
|
-
throw new Error(`HTTP error ${response.status} ${response.statusText}`);
|
|
31
|
-
}
|
|
32
|
-
// Parse JSON body
|
|
33
|
-
const data = (await response.json());
|
|
34
|
-
// Validate messages structure
|
|
35
|
-
if (!isValidMessages(data[locale])) {
|
|
36
|
-
throw new Error("JSON file does not match NamespaceMessages structure");
|
|
37
|
-
}
|
|
38
|
-
return data;
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
if (error instanceof Error && error.name === "AbortError") {
|
|
42
|
-
logger.debug("Fetching locale messages aborted.", { locale, url });
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
logger.warn("Fetching locale messages failed.", {
|
|
46
|
-
locale,
|
|
47
|
-
url,
|
|
48
|
-
searchParams: decodeURIComponent(searchParams.toString()),
|
|
49
|
-
error,
|
|
50
|
-
});
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
export { fetchLocaleMessages };
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Build URLSearchParams from an object.
|
|
3
|
-
* Supports string or string[] values. Ignores undefined/null.
|
|
4
|
-
*/
|
|
5
|
-
const buildSearchParams = (params) => {
|
|
6
|
-
const searchParams = new URLSearchParams();
|
|
7
|
-
const appendParam = (key, value) => {
|
|
8
|
-
if (value === undefined || value === null)
|
|
9
|
-
return;
|
|
10
|
-
if (Array.isArray(value) && value.length === 0)
|
|
11
|
-
return;
|
|
12
|
-
if (Array.isArray(value)) {
|
|
13
|
-
value.forEach((v) => v && searchParams.append(key, v));
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
searchParams.append(key, value);
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
Object.entries(params).forEach(([key, value]) => {
|
|
20
|
-
appendParam(key, value);
|
|
21
|
-
});
|
|
22
|
-
return searchParams;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export { buildSearchParams };
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { IntorError, IntorErrorCode } from '../../core/error/intor-error.js';
|
|
2
|
-
import { resolveLoaderOptions } from '../../core/utils/resolve-loader-options.js';
|
|
3
|
-
import 'logry';
|
|
4
|
-
import { loadMessages } from '../messages/load-messages.js';
|
|
5
|
-
import { createTranslator } from '../translator/create-translator.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Create a server-side Intor runtime.
|
|
9
|
-
*
|
|
10
|
-
* - The runtime represents a request-scoped execution context.
|
|
11
|
-
* - It enforces a strict initialization protocol:
|
|
12
|
-
* `ensureMessages(locale) → getTranslator(locale)`
|
|
13
|
-
* - Messages may be empty, but the ensure step must be completed
|
|
14
|
-
* before a translator snapshot can be created.
|
|
15
|
-
*/
|
|
16
|
-
function createIntorRuntime(config, options) {
|
|
17
|
-
const loader = resolveLoaderOptions(config, "server");
|
|
18
|
-
// Locale that has completed the ensureMessages() phase
|
|
19
|
-
let ensuredLocale;
|
|
20
|
-
// Messages prepared during ensureMessages(); may be empty
|
|
21
|
-
let ensuredMessages;
|
|
22
|
-
return {
|
|
23
|
-
async ensureMessages(locale) {
|
|
24
|
-
let messages;
|
|
25
|
-
if (loader) {
|
|
26
|
-
messages = await loadMessages({
|
|
27
|
-
config,
|
|
28
|
-
locale,
|
|
29
|
-
readers: options?.readers,
|
|
30
|
-
allowCacheWrite: options?.allowCacheWrite || false,
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
ensuredLocale = locale;
|
|
34
|
-
ensuredMessages = messages || {};
|
|
35
|
-
},
|
|
36
|
-
translator(locale, options) {
|
|
37
|
-
// Guard: translator requires ensureMessages() to be completed for this locale
|
|
38
|
-
if (locale !== ensuredLocale) {
|
|
39
|
-
throw new IntorError({
|
|
40
|
-
message: "translator() called before ensureMessages()",
|
|
41
|
-
code: IntorErrorCode.RUNTIME_NOT_INITIALIZED,
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
return createTranslator({
|
|
45
|
-
config,
|
|
46
|
-
locale,
|
|
47
|
-
messages: ensuredMessages || {},
|
|
48
|
-
preKey: options?.preKey,
|
|
49
|
-
handlers: options?.handlers,
|
|
50
|
-
plugins: options?.plugins,
|
|
51
|
-
});
|
|
52
|
-
},
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export { createIntorRuntime };
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { getLogger } from '../../../logger/get-logger.js';
|
|
2
|
-
import { isValidMessages } from '../../utils/is-valid-messages.js';
|
|
3
|
-
import { buildSearchParams } from './utils/build-search-params.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Fetches locale messages from a remote API.
|
|
7
|
-
*
|
|
8
|
-
* - Validates that the returned JSON matches the expected `NamespaceMessages` structure.
|
|
9
|
-
* - Uses `fetch` with `no-store` cache to always get fresh data.
|
|
10
|
-
*/
|
|
11
|
-
const fetchLocaleMessages = async ({ locale, namespaces, rootDir, url: rawUrl, headers: rawHeaders, signal, extraOptions: { loggerOptions }, }) => {
|
|
12
|
-
const baseLogger = getLogger(loggerOptions);
|
|
13
|
-
const logger = baseLogger.child({ scope: "fetch-locale-messages" });
|
|
14
|
-
const searchParams = buildSearchParams({ locale, rootDir, namespaces });
|
|
15
|
-
const url = `${rawUrl}?${searchParams.toString()}`;
|
|
16
|
-
try {
|
|
17
|
-
// Headers
|
|
18
|
-
const headers = {
|
|
19
|
-
"Content-Type": "application/json",
|
|
20
|
-
...rawHeaders,
|
|
21
|
-
};
|
|
22
|
-
// Fetch
|
|
23
|
-
const response = await fetch(url, {
|
|
24
|
-
method: "GET",
|
|
25
|
-
headers: headers,
|
|
26
|
-
cache: "no-store",
|
|
27
|
-
signal,
|
|
28
|
-
});
|
|
29
|
-
if (!response.ok) {
|
|
30
|
-
throw new Error(`HTTP error ${response.status} ${response.statusText}`);
|
|
31
|
-
}
|
|
32
|
-
// Parse JSON body
|
|
33
|
-
const data = (await response.json());
|
|
34
|
-
// Validate messages structure
|
|
35
|
-
if (!isValidMessages(data[locale])) {
|
|
36
|
-
throw new Error("JSON file does not match NamespaceMessages structure");
|
|
37
|
-
}
|
|
38
|
-
return data;
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
if (error instanceof Error && error.name === "AbortError") {
|
|
42
|
-
logger.debug("Fetching locale messages aborted.", { locale, url });
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
logger.warn("Fetching locale messages failed.", {
|
|
46
|
-
locale,
|
|
47
|
-
url,
|
|
48
|
-
searchParams: decodeURIComponent(searchParams.toString()),
|
|
49
|
-
error,
|
|
50
|
-
});
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
export { fetchLocaleMessages };
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Build URLSearchParams from an object.
|
|
3
|
-
* Supports string or string[] values. Ignores undefined/null.
|
|
4
|
-
*/
|
|
5
|
-
const buildSearchParams = (params) => {
|
|
6
|
-
const searchParams = new URLSearchParams();
|
|
7
|
-
const appendParam = (key, value) => {
|
|
8
|
-
if (value === undefined || value === null)
|
|
9
|
-
return;
|
|
10
|
-
if (Array.isArray(value) && value.length === 0)
|
|
11
|
-
return;
|
|
12
|
-
if (Array.isArray(value)) {
|
|
13
|
-
value.forEach((v) => v && searchParams.append(key, v));
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
searchParams.append(key, value);
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
Object.entries(params).forEach(([key, value]) => {
|
|
20
|
-
appendParam(key, value);
|
|
21
|
-
});
|
|
22
|
-
return searchParams;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export { buildSearchParams };
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { getLogger } from '../../../logger/get-logger.js';
|
|
2
|
-
import { isValidMessages } from '../../utils/is-valid-messages.js';
|
|
3
|
-
import { buildSearchParams } from './utils/build-search-params.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Fetches locale messages from a remote API.
|
|
7
|
-
*
|
|
8
|
-
* - Validates that the returned JSON matches the expected `NamespaceMessages` structure.
|
|
9
|
-
* - Uses `fetch` with `no-store` cache to always get fresh data.
|
|
10
|
-
*/
|
|
11
|
-
const fetchLocaleMessages = async ({ locale, namespaces, rootDir, url: rawUrl, headers: rawHeaders, signal, extraOptions: { loggerOptions }, }) => {
|
|
12
|
-
const baseLogger = getLogger(loggerOptions);
|
|
13
|
-
const logger = baseLogger.child({ scope: "fetch-locale-messages" });
|
|
14
|
-
const searchParams = buildSearchParams({ locale, rootDir, namespaces });
|
|
15
|
-
const url = `${rawUrl}?${searchParams.toString()}`;
|
|
16
|
-
try {
|
|
17
|
-
// Headers
|
|
18
|
-
const headers = {
|
|
19
|
-
"Content-Type": "application/json",
|
|
20
|
-
...rawHeaders,
|
|
21
|
-
};
|
|
22
|
-
// Fetch
|
|
23
|
-
const response = await fetch(url, {
|
|
24
|
-
method: "GET",
|
|
25
|
-
headers: headers,
|
|
26
|
-
cache: "no-store",
|
|
27
|
-
signal,
|
|
28
|
-
});
|
|
29
|
-
if (!response.ok) {
|
|
30
|
-
throw new Error(`HTTP error ${response.status} ${response.statusText}`);
|
|
31
|
-
}
|
|
32
|
-
// Parse JSON body
|
|
33
|
-
const data = (await response.json());
|
|
34
|
-
// Validate messages structure
|
|
35
|
-
if (!isValidMessages(data[locale])) {
|
|
36
|
-
throw new Error("JSON file does not match NamespaceMessages structure");
|
|
37
|
-
}
|
|
38
|
-
return data;
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
if (error instanceof Error && error.name === "AbortError") {
|
|
42
|
-
logger.debug("Fetching locale messages aborted.", { locale, url });
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
logger.warn("Fetching locale messages failed.", {
|
|
46
|
-
locale,
|
|
47
|
-
url,
|
|
48
|
-
searchParams: decodeURIComponent(searchParams.toString()),
|
|
49
|
-
error,
|
|
50
|
-
});
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
export { fetchLocaleMessages };
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Build URLSearchParams from an object.
|
|
3
|
-
* Supports string or string[] values. Ignores undefined/null.
|
|
4
|
-
*/
|
|
5
|
-
const buildSearchParams = (params) => {
|
|
6
|
-
const searchParams = new URLSearchParams();
|
|
7
|
-
const appendParam = (key, value) => {
|
|
8
|
-
if (value === undefined || value === null)
|
|
9
|
-
return;
|
|
10
|
-
if (Array.isArray(value) && value.length === 0)
|
|
11
|
-
return;
|
|
12
|
-
if (Array.isArray(value)) {
|
|
13
|
-
value.forEach((v) => v && searchParams.append(key, v));
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
searchParams.append(key, value);
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
Object.entries(params).forEach(([key, value]) => {
|
|
20
|
-
appendParam(key, value);
|
|
21
|
-
});
|
|
22
|
-
return searchParams;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export { buildSearchParams };
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { LocaleMessages } from "intor-translator";
|
|
2
|
-
/**
|
|
3
|
-
* Global messages pool (process-level, hot-reload safe).
|
|
4
|
-
*
|
|
5
|
-
* This pool is intentionally minimal:
|
|
6
|
-
* - No TTL
|
|
7
|
-
* - No eviction
|
|
8
|
-
* - No external backends
|
|
9
|
-
*
|
|
10
|
-
* Messages are treated as immutable within a process lifecycle.
|
|
11
|
-
*/
|
|
12
|
-
export type MessagesPool = Map<string, LocaleMessages>;
|
|
13
|
-
declare global {
|
|
14
|
-
var __INTOR_MESSAGES_POOL__: MessagesPool | undefined;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Get the global messages pool.
|
|
18
|
-
*
|
|
19
|
-
* Lazily initialized to ensure:
|
|
20
|
-
* - Cross-module sharing
|
|
21
|
-
* - Dev / HMR safety
|
|
22
|
-
*/
|
|
23
|
-
export declare function getGlobalMessagesPool(): MessagesPool;
|
|
24
|
-
/** Clear all cached messages. */
|
|
25
|
-
export declare function clearMessagesPool(): void;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { FetcherOptions } from "./types";
|
|
2
|
-
import type { LocaleMessages } from "intor-translator";
|
|
3
|
-
/**
|
|
4
|
-
* Fetches locale messages from a remote API.
|
|
5
|
-
*
|
|
6
|
-
* - Validates that the returned JSON matches the expected `NamespaceMessages` structure.
|
|
7
|
-
* - Uses `fetch` with `no-store` cache to always get fresh data.
|
|
8
|
-
*/
|
|
9
|
-
export declare const fetchLocaleMessages: ({ locale, namespaces, rootDir, url: rawUrl, headers: rawHeaders, signal, extraOptions: { loggerOptions }, }: FetcherOptions) => Promise<LocaleMessages | undefined>;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { fetchLocaleMessages } from "./fetch-locale-messages";
|