intor 2.3.13 → 2.3.15
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 -2
- package/dist/core/src/config/define-intor-config.js +0 -3
- package/dist/core/src/config/resolvers/resolve-cookie-options.js +0 -1
- package/dist/core/src/config/resolvers/resolve-fallback-locales.js +1 -2
- package/dist/core/src/config/resolvers/resolve-routing-options.js +0 -2
- package/dist/core/src/config/validators/validate-default-locale.js +0 -1
- package/dist/core/src/config/validators/validate-id.js +0 -1
- package/dist/core/src/config/validators/validate-supported-locales.js +0 -1
- package/dist/core/src/core/messages/global-messages-pool.js +11 -17
- package/dist/core/src/core/messages/load-remote-messages/load-remote-messages.js +1 -40
- package/dist/core/src/core/messages/utils/is-valid-messages.js +23 -15
- package/dist/core/src/routing/pathname/get-unprefixed-pathname.js +0 -1
- package/dist/core/src/routing/pathname/locale-prefix-pathname.js +0 -1
- package/dist/core/src/routing/pathname/standardize-pathname.js +0 -1
- package/dist/core/src/server/helpers/get-translator.js +3 -2
- package/dist/core/src/server/helpers/local-messages-from-url.js +1 -1
- package/dist/core/src/server/intor/intor.js +0 -1
- package/dist/core/src/server/messages/load-local-messages/load-local-messages.js +11 -12
- package/dist/core/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +6 -6
- package/dist/core/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +14 -6
- package/dist/core/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +3 -3
- package/dist/core/src/server/messages/load-messages.js +8 -12
- package/dist/core/src/server/runtime/create-intor-runtime.js +12 -8
- package/dist/core/src/server/translator/create-translator.js +1 -0
- package/dist/express/src/adapters/express/helpers/get-translator.js +3 -4
- package/dist/express/src/adapters/express/middleware/create-intor.js +5 -5
- package/dist/express/src/core/messages/global-messages-pool.js +9 -3
- package/dist/express/src/core/messages/load-remote-messages/load-remote-messages.js +1 -40
- package/dist/express/src/core/messages/utils/is-valid-messages.js +23 -15
- package/dist/express/src/routing/inbound/resolve-inbound.js +5 -6
- package/dist/express/src/routing/inbound/resolve-locale/resolve-locale.js +13 -6
- package/dist/express/src/routing/locale/get-locale-from-accept-language.js +7 -17
- package/dist/express/src/routing/locale/get-locale-from-host.js +13 -15
- package/dist/express/src/routing/locale/get-locale-from-pathname.js +4 -14
- package/dist/express/src/routing/locale/get-locale-from-query.js +10 -17
- package/dist/express/src/routing/pathname/get-unprefixed-pathname.js +0 -1
- package/dist/express/src/routing/pathname/locale-prefix-pathname.js +0 -1
- package/dist/express/src/routing/pathname/standardize-pathname.js +0 -1
- package/dist/express/src/server/helpers/get-translator.js +3 -2
- package/dist/express/src/server/messages/load-local-messages/load-local-messages.js +11 -12
- package/dist/express/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +6 -6
- package/dist/express/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +14 -6
- package/dist/express/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +3 -3
- package/dist/express/src/server/messages/load-messages.js +8 -12
- package/dist/express/src/server/runtime/create-intor-runtime.js +12 -8
- package/dist/express/src/server/translator/create-translator.js +1 -0
- package/dist/next/src/adapters/next/navigation/redirect.js +0 -1
- package/dist/next/src/adapters/next/navigation/use-pathname.js +0 -1
- package/dist/next/src/adapters/next/proxy/intor-proxy.js +1 -2
- package/dist/next/src/adapters/next/server/get-locale.js +0 -1
- package/dist/next/src/adapters/next/server/get-pathname.js +0 -1
- package/dist/next/src/adapters/next/server/get-translator.js +3 -4
- package/dist/next/src/adapters/next/server/intor.js +2 -3
- package/dist/next/src/core/messages/global-messages-pool.js +9 -3
- package/dist/next/src/core/messages/load-remote-messages/load-remote-messages.js +1 -40
- package/dist/next/src/core/messages/utils/is-valid-messages.js +23 -15
- package/dist/next/src/policies/shoud-full-reload.js +0 -1
- package/dist/next/src/routing/inbound/resolve-inbound.js +5 -6
- package/dist/next/src/routing/inbound/resolve-locale/resolve-locale.js +13 -6
- package/dist/next/src/routing/locale/get-locale-from-accept-language.js +7 -17
- package/dist/next/src/routing/locale/get-locale-from-host.js +13 -15
- package/dist/next/src/routing/locale/get-locale-from-pathname.js +4 -14
- package/dist/next/src/routing/locale/get-locale-from-query.js +10 -17
- package/dist/next/src/routing/pathname/get-unprefixed-pathname.js +0 -1
- package/dist/next/src/routing/pathname/locale-prefix-pathname.js +0 -1
- package/dist/next/src/routing/pathname/standardize-pathname.js +0 -1
- package/dist/next/src/server/helpers/get-translator.js +3 -2
- package/dist/next/src/server/intor/intor.js +0 -1
- package/dist/next/src/server/messages/load-local-messages/load-local-messages.js +11 -12
- package/dist/next/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +6 -6
- package/dist/next/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +14 -6
- package/dist/next/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +3 -3
- package/dist/next/src/server/messages/load-messages.js +8 -12
- package/dist/next/src/server/runtime/create-intor-runtime.js +12 -8
- package/dist/next/src/server/translator/create-translator.js +1 -0
- package/dist/react/src/client/react/helpers/use-runtime-state.js +0 -1
- package/dist/react/src/client/react/navigation/use-execute-navigation.js +0 -1
- package/dist/react/src/client/react/navigation/use-resolve-navigation.js +0 -1
- package/dist/react/src/client/react/provider/effects/use-locale-effects.js +0 -1
- package/dist/react/src/client/react/translator/use-translator.js +1 -0
- package/dist/react/src/client/shared/helpers/get-client-locale.js +0 -1
- package/dist/react/src/client/shared/messages/create-refetch-messages.js +0 -3
- package/dist/react/src/core/messages/load-remote-messages/load-remote-messages.js +1 -40
- package/dist/react/src/core/messages/utils/is-valid-messages.js +23 -15
- package/dist/react/src/policies/shoud-full-reload.js +0 -1
- package/dist/react/src/routing/pathname/get-unprefixed-pathname.js +0 -1
- package/dist/react/src/routing/pathname/locale-prefix-pathname.js +0 -1
- package/dist/react/src/routing/pathname/standardize-pathname.js +0 -1
- package/dist/svelte/src/client/shared/helpers/get-client-locale.js +0 -1
- package/dist/svelte/src/client/shared/messages/create-refetch-messages.js +0 -3
- package/dist/svelte/src/client/svelte/helpers/create-runtime-state.js +0 -1
- package/dist/svelte/src/client/svelte/runtime/create-intor-api.js +4 -0
- package/dist/svelte/src/client/svelte/runtime/create-intor.js +2 -1
- package/dist/svelte/src/client/svelte/runtime/effects/locale-effects.js +0 -1
- package/dist/svelte/src/core/messages/load-remote-messages/load-remote-messages.js +1 -40
- package/dist/svelte/src/core/messages/utils/is-valid-messages.js +23 -15
- package/dist/types/export/index.d.ts +2 -2
- package/dist/types/src/adapters/express/global.d.ts +2 -1
- package/dist/types/src/adapters/express/helpers/get-translator.d.ts +1 -1
- package/dist/types/src/adapters/next/server/get-translator.d.ts +1 -1
- package/dist/types/src/adapters/next/server/intor.d.ts +2 -2
- package/dist/types/src/client/svelte/runtime/create-intor-api.d.ts +2 -0
- package/dist/types/src/client/svelte/runtime/types.d.ts +3 -1
- package/dist/types/src/client/vue/provider/resolver/resolve-runtime.d.ts +1 -1
- package/dist/types/src/config/constants/index.d.ts +0 -1
- package/dist/types/src/config/index.d.ts +2 -2
- package/dist/types/src/config/types/index.d.ts +0 -1
- package/dist/types/src/config/types/intor-config.d.ts +0 -4
- package/dist/types/src/core/index.d.ts +1 -1
- package/dist/types/src/core/messages/global-messages-pool.d.ts +15 -12
- package/dist/types/src/core/messages/index.d.ts +2 -2
- package/dist/types/src/core/messages/load-remote-messages/load-remote-messages.d.ts +1 -2
- package/dist/types/src/core/messages/load-remote-messages/types.d.ts +1 -6
- package/dist/types/src/core/messages/types.d.ts +14 -36
- package/dist/types/src/core/messages/utils/is-valid-messages.d.ts +5 -10
- package/dist/types/src/core/types/translator-instance.d.ts +3 -1
- package/dist/types/src/routing/inbound/resolve-locale/resolve-locale.d.ts +4 -3
- package/dist/types/src/routing/locale/get-locale-from-accept-language.d.ts +5 -7
- package/dist/types/src/routing/locale/get-locale-from-host.d.ts +12 -8
- package/dist/types/src/routing/locale/get-locale-from-pathname.d.ts +4 -13
- package/dist/types/src/routing/locale/get-locale-from-query.d.ts +9 -10
- package/dist/types/src/server/helpers/get-translator.d.ts +2 -3
- package/dist/types/src/server/messages/load-local-messages/load-local-messages.d.ts +2 -2
- package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.d.ts +2 -2
- package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/types.d.ts +4 -3
- package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.d.ts +2 -2
- package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.d.ts +2 -2
- package/dist/types/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.d.ts +1 -1
- package/dist/types/src/server/messages/load-local-messages/read-locale-messages/types.d.ts +2 -2
- package/dist/types/src/server/messages/load-local-messages/types.d.ts +2 -2
- package/dist/types/src/server/messages/load-messages.d.ts +1 -1
- package/dist/types/src/server/messages/types.d.ts +2 -2
- package/dist/types/src/server/runtime/types.d.ts +2 -2
- package/dist/types/src/server/translator/create-translator.d.ts +1 -0
- package/dist/vue/src/client/shared/helpers/get-client-locale.js +0 -1
- package/dist/vue/src/client/shared/messages/create-refetch-messages.js +0 -3
- package/dist/vue/src/client/vue/helpers/use-runtime-state.js +0 -1
- package/dist/vue/src/client/vue/provider/effects/use-locale-effects.js +0 -1
- package/dist/vue/src/client/vue/translator/use-translator.js +3 -1
- package/dist/vue/src/core/messages/load-remote-messages/load-remote-messages.js +1 -40
- package/dist/vue/src/core/messages/utils/is-valid-messages.js +23 -15
- package/package.json +3 -4
- package/dist/core/src/config/constants/cache.js +0 -7
- package/dist/core/src/config/resolvers/resolve-cache-options.js +0 -11
- package/dist/react/src/core/utils/normalizers/normalize-cache-key.js +0 -45
- package/dist/svelte/src/core/utils/normalizers/normalize-cache-key.js +0 -45
- package/dist/types/src/config/constants/cache.d.ts +0 -2
- package/dist/types/src/config/resolvers/resolve-cache-options.d.ts +0 -2
- package/dist/types/src/config/types/cache.d.ts +0 -7
- package/dist/vue/src/core/utils/normalizers/normalize-cache-key.js +0 -45
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ParseFileEntriesParams } from "./types";
|
|
2
|
-
import type {
|
|
2
|
+
import type { MessageObject } from "intor-translator";
|
|
3
3
|
/**
|
|
4
4
|
* Parse locale message files into a unified Messages object (single-locale).
|
|
5
5
|
*
|
|
@@ -29,4 +29,4 @@ import type { Messages } from "../../../../../core";
|
|
|
29
29
|
* }
|
|
30
30
|
* ```
|
|
31
31
|
*/
|
|
32
|
-
export declare function parseFileEntries({ fileEntries, limit,
|
|
32
|
+
export declare function parseFileEntries({ fileEntries, limit, readers, loggerOptions, }: ParseFileEntriesParams): Promise<MessageObject>;
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import type { FileEntry } from "../types";
|
|
2
2
|
import type { LoggerOptions } from "../../../../../config";
|
|
3
|
-
import type {
|
|
3
|
+
import type { MessagesReaders } from "../../../../../core";
|
|
4
|
+
import type { MessageObject } from "intor-translator";
|
|
4
5
|
import type { LimitFunction } from "p-limit";
|
|
5
6
|
export interface ParseFileEntriesParams {
|
|
6
7
|
fileEntries: FileEntry[];
|
|
7
8
|
limit: LimitFunction;
|
|
8
|
-
|
|
9
|
+
readers?: MessagesReaders;
|
|
9
10
|
loggerOptions: LoggerOptions;
|
|
10
11
|
}
|
|
11
12
|
export interface ParsedFileEntries {
|
|
12
13
|
namespace: string;
|
|
13
|
-
messages:
|
|
14
|
+
messages: MessageObject;
|
|
14
15
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MessageObject } from "intor-translator";
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
/**
|
|
4
4
|
* Read & parse a JSON file
|
|
5
5
|
*/
|
|
6
|
-
export declare function jsonReader(filePath: string, readFile?: typeof fs.readFile): Promise<
|
|
6
|
+
export declare function jsonReader(filePath: string, readFile?: typeof fs.readFile): Promise<MessageObject>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MessageObject } from "intor-translator";
|
|
2
2
|
/**
|
|
3
3
|
* Wraps a value inside nested objects according to a given path.
|
|
4
4
|
*
|
|
@@ -11,4 +11,4 @@ import type { Messages } from "../../../../../../core";
|
|
|
11
11
|
* nestObjectFromPath([], value); // → { a: "A" }
|
|
12
12
|
* ```
|
|
13
13
|
*/
|
|
14
|
-
export declare function nestObjectFromPath(path: string[], value:
|
|
14
|
+
export declare function nestObjectFromPath(path: string[], value: MessageObject): MessageObject;
|
|
@@ -10,4 +10,4 @@ import type { LocaleMessages } from "intor-translator";
|
|
|
10
10
|
*
|
|
11
11
|
* It does not perform validation or transformation itself.
|
|
12
12
|
*/
|
|
13
|
-
export declare const readLocaleMessages: ({ locale, namespaces, rootDir, limit,
|
|
13
|
+
export declare const readLocaleMessages: ({ locale, namespaces, rootDir, limit, readers, loggerOptions, }: ReadLocaleMessagesParams) => Promise<LocaleMessages>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { LoggerOptions } from "../../../../config";
|
|
2
|
-
import type {
|
|
2
|
+
import type { MessagesReaders } from "../../../../core";
|
|
3
3
|
import type { LimitFunction } from "p-limit";
|
|
4
4
|
export interface FileEntry {
|
|
5
5
|
namespace: string;
|
|
@@ -13,6 +13,6 @@ export interface ReadLocaleMessagesParams {
|
|
|
13
13
|
namespaces?: string[];
|
|
14
14
|
rootDir?: string;
|
|
15
15
|
limit: LimitFunction;
|
|
16
|
-
|
|
16
|
+
readers?: MessagesReaders;
|
|
17
17
|
loggerOptions: LoggerOptions;
|
|
18
18
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { LoggerOptions } from "../../../config";
|
|
2
|
-
import type { MessagesPool,
|
|
2
|
+
import type { MessagesPool, MessagesReaders } from "../../../core";
|
|
3
3
|
export interface LoadLocalMessagesParams {
|
|
4
4
|
id: string;
|
|
5
5
|
locale: string;
|
|
@@ -7,7 +7,7 @@ export interface LoadLocalMessagesParams {
|
|
|
7
7
|
namespaces?: string[];
|
|
8
8
|
rootDir?: string;
|
|
9
9
|
concurrency?: number;
|
|
10
|
-
|
|
10
|
+
readers?: MessagesReaders;
|
|
11
11
|
pool?: MessagesPool;
|
|
12
12
|
allowCacheWrite?: boolean;
|
|
13
13
|
loggerOptions: LoggerOptions;
|
|
@@ -13,4 +13,4 @@ import type { LocaleMessages } from "intor-translator";
|
|
|
13
13
|
* Message traversal, parsing, fallback resolution, and caching logic
|
|
14
14
|
* are delegated to the selected loader.
|
|
15
15
|
*/
|
|
16
|
-
export declare const loadMessages: ({ config, locale,
|
|
16
|
+
export declare const loadMessages: ({ config, locale, readers, allowCacheWrite, }: LoadMessagesParams) => Promise<LocaleMessages | undefined>;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { IntorResolvedConfig } from "../../config";
|
|
2
|
-
import type {
|
|
2
|
+
import type { MessagesReaders } from "../../core";
|
|
3
3
|
import type { Locale } from "intor-translator";
|
|
4
4
|
export type LoadMessagesParams = {
|
|
5
5
|
config: IntorResolvedConfig;
|
|
6
6
|
locale: Locale;
|
|
7
|
-
|
|
7
|
+
readers?: MessagesReaders;
|
|
8
8
|
/**
|
|
9
9
|
* Controls whether this load operation is permitted to
|
|
10
10
|
* write into the shared messages cache.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { TranslatorInstanceServer } from "../translator";
|
|
2
|
-
import type { GenConfigKeys, GenLocale, GenMessages,
|
|
2
|
+
import type { GenConfigKeys, GenLocale, GenMessages, MessagesReaders } from "../../core";
|
|
3
3
|
import type { LocalizedNodeKeys, TranslateHandlers, TranslateHook, TranslatorPlugin } from "intor-translator";
|
|
4
4
|
export interface IntorRuntimeOptions {
|
|
5
|
-
|
|
5
|
+
readers?: MessagesReaders;
|
|
6
6
|
allowCacheWrite?: boolean;
|
|
7
7
|
}
|
|
8
8
|
export interface IntorRuntime<CK extends GenConfigKeys = "__default__"> {
|
|
@@ -24,5 +24,6 @@ export declare function createTranslator(params: CreateTranslatorParams & {
|
|
|
24
24
|
locale: string;
|
|
25
25
|
hasKey: <K extends string>(key: K, targetLocale?: string | undefined) => boolean;
|
|
26
26
|
t: <Result = string, K extends string = string>(key: K, replacements?: import("intor-translator").Replacement) => Result;
|
|
27
|
+
tRaw: <K extends string = string>(key: K, replacements?: import("intor-translator").Replacement) => import("intor-translator").MessageValue | undefined;
|
|
27
28
|
};
|
|
28
29
|
export {};
|
|
@@ -1,7 +1,6 @@
|
|
|
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 'keyv';
|
|
5
4
|
import { detectBrowserLocale } from '../utils/locale/detect-browser-locale.js';
|
|
6
5
|
import { getLocaleCookieBrowser } from '../utils/locale/get-locale-cookie-browser.js';
|
|
7
6
|
|
|
@@ -2,7 +2,6 @@ import '../../../core/error/intor-error.js';
|
|
|
2
2
|
import { resolveLoaderOptions } from '../../../core/utils/resolve-loader-options.js';
|
|
3
3
|
import 'logry';
|
|
4
4
|
import { loadRemoteMessages } from '../../../core/messages/load-remote-messages/load-remote-messages.js';
|
|
5
|
-
import 'keyv';
|
|
6
5
|
import { mergeMessages } from '../../../core/messages/merge-messages.js';
|
|
7
6
|
|
|
8
7
|
/**
|
|
@@ -27,7 +26,6 @@ const createRefetchMessages = ({ config, onLoadingStart, onLoadingEnd, onMessage
|
|
|
27
26
|
onLoadingStart?.();
|
|
28
27
|
try {
|
|
29
28
|
const loadedMessages = await loadRemoteMessages({
|
|
30
|
-
id: config.id,
|
|
31
29
|
locale: newLocale,
|
|
32
30
|
fallbackLocales: config.fallbackLocales[newLocale] || [],
|
|
33
31
|
namespaces: loader.namespaces,
|
|
@@ -35,7 +33,6 @@ const createRefetchMessages = ({ config, onLoadingStart, onLoadingEnd, onMessage
|
|
|
35
33
|
url: loader.url,
|
|
36
34
|
headers: loader.headers,
|
|
37
35
|
signal: currentController.signal,
|
|
38
|
-
cacheOptions: config.cache,
|
|
39
36
|
loggerOptions: config.logger,
|
|
40
37
|
});
|
|
41
38
|
// Apply state updates only when this request is still the active one
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { ref, onMounted } from 'vue';
|
|
2
2
|
import '../../../core/error/intor-error.js';
|
|
3
3
|
import 'logry';
|
|
4
|
-
import 'keyv';
|
|
5
4
|
import { mergeMessages } from '../../../core/messages/merge-messages.js';
|
|
6
5
|
import { getClientLocale } from '../../shared/helpers/get-client-locale.js';
|
|
7
6
|
|
|
@@ -3,7 +3,6 @@ import { shouldPersist } from '../../../../policies/should-persist.js';
|
|
|
3
3
|
import { shouldPersistOnFirstVisit } from '../../../../policies/should-persist-on-first-visit.js';
|
|
4
4
|
import '../../../../core/error/intor-error.js';
|
|
5
5
|
import 'logry';
|
|
6
|
-
import 'keyv';
|
|
7
6
|
import { getLocaleCookieBrowser } from '../../../shared/utils/locale/get-locale-cookie-browser.js';
|
|
8
7
|
import { setLocaleCookieBrowser } from '../../../shared/utils/locale/set-locale-cookie-browser.js';
|
|
9
8
|
import { setDocumentLocale } from '../../../shared/utils/locale/set-document-locale.js';
|
|
@@ -8,8 +8,9 @@ function useTranslator(preKey) {
|
|
|
8
8
|
const intor = injectIntor();
|
|
9
9
|
const translator = computed(() => intor.value.translator);
|
|
10
10
|
const scoped = computed(() => preKey ? translator.value.scoped(preKey) : translator.value);
|
|
11
|
-
const t = computed(() => scoped.value.t);
|
|
12
11
|
const hasKey = computed(() => scoped.value.hasKey);
|
|
12
|
+
const t = computed(() => scoped.value.t);
|
|
13
|
+
const tRaw = computed(() => scoped.value.tRaw);
|
|
13
14
|
return {
|
|
14
15
|
messages: computed(() => translator.value.messages),
|
|
15
16
|
locale: computed(() => translator.value.locale),
|
|
@@ -17,6 +18,7 @@ function useTranslator(preKey) {
|
|
|
17
18
|
setLocale: intor.value.setLocale,
|
|
18
19
|
hasKey,
|
|
19
20
|
t,
|
|
21
|
+
tRaw,
|
|
20
22
|
tRich: createTRich(translator, preKey),
|
|
21
23
|
// NOTE:
|
|
22
24
|
// The runtime implementation is intentionally erased.
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { getLogger } from '../../logger/get-logger.js';
|
|
2
|
-
import { normalizeCacheKey } from '../../utils/normalizers/normalize-cache-key.js';
|
|
3
2
|
import { fetchLocaleMessages } from './fetch-locale-messages/fetch-locale-messages.js';
|
|
4
3
|
|
|
5
4
|
/**
|
|
@@ -9,12 +8,11 @@ import { fetchLocaleMessages } from './fetch-locale-messages/fetch-locale-messag
|
|
|
9
8
|
* It coordinates:
|
|
10
9
|
*
|
|
11
10
|
* - Locale resolution with fallbacks
|
|
12
|
-
* - Cache read / write behavior
|
|
13
11
|
* - Respecting abort signals across the entire async flow
|
|
14
12
|
*
|
|
15
13
|
* Network fetching and data validation are delegated to lower-level utilities.
|
|
16
14
|
*/
|
|
17
|
-
const loadRemoteMessages = async ({
|
|
15
|
+
const loadRemoteMessages = async ({ locale, fallbackLocales, namespaces, rootDir, url, headers, signal, loggerOptions, }) => {
|
|
18
16
|
const baseLogger = getLogger(loggerOptions);
|
|
19
17
|
const logger = baseLogger.child({ scope: "load-remote-messages" });
|
|
20
18
|
// Abort early if the request has already been cancelled
|
|
@@ -25,31 +23,6 @@ const loadRemoteMessages = async ({ id, locale, fallbackLocales, namespaces, roo
|
|
|
25
23
|
const start = performance.now();
|
|
26
24
|
logger.debug("Loading remote messages.", { url });
|
|
27
25
|
// ---------------------------------------------------------------------------
|
|
28
|
-
// Cache key resolution
|
|
29
|
-
// ---------------------------------------------------------------------------
|
|
30
|
-
const cacheKey = normalizeCacheKey([
|
|
31
|
-
id,
|
|
32
|
-
"loaderType:remote",
|
|
33
|
-
rootDir,
|
|
34
|
-
locale,
|
|
35
|
-
(fallbackLocales || []).toSorted().join(","),
|
|
36
|
-
(namespaces || []).toSorted().join(","),
|
|
37
|
-
]);
|
|
38
|
-
// ---------------------------------------------------------------------------
|
|
39
|
-
// Cache read
|
|
40
|
-
// ---------------------------------------------------------------------------
|
|
41
|
-
if (cacheOptions.enabled && cacheKey) {
|
|
42
|
-
const cached = await pool?.get(cacheKey);
|
|
43
|
-
if (signal?.aborted) {
|
|
44
|
-
logger.debug("Remote message loading aborted after cache read.");
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
if (cached) {
|
|
48
|
-
logger.debug("Messages cache hit.", { key: cacheKey });
|
|
49
|
-
return cached;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
// ---------------------------------------------------------------------------
|
|
53
26
|
// Resolve locale messages with ordered fallback strategy
|
|
54
27
|
// ---------------------------------------------------------------------------
|
|
55
28
|
const candidateLocales = [locale, ...(fallbackLocales || [])];
|
|
@@ -93,18 +66,6 @@ const loadRemoteMessages = async ({ id, locale, fallbackLocales, namespaces, roo
|
|
|
93
66
|
});
|
|
94
67
|
}
|
|
95
68
|
}
|
|
96
|
-
// ---------------------------------------------------------------------------
|
|
97
|
-
// Cache write (explicitly permitted)
|
|
98
|
-
// ---------------------------------------------------------------------------
|
|
99
|
-
if (cacheOptions.enabled && allowCacheWrite) {
|
|
100
|
-
if (signal?.aborted) {
|
|
101
|
-
logger.debug("Remote message loading aborted before cache write.");
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
if (cacheKey && messages) {
|
|
105
|
-
await pool?.set(cacheKey, messages, cacheOptions.ttl);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
69
|
// Final success log with resolved locale and timing
|
|
109
70
|
if (messages) {
|
|
110
71
|
logger.trace("Finished loading remote messages.", {
|
|
@@ -3,15 +3,10 @@ function isPlainObject(value) {
|
|
|
3
3
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
4
4
|
}
|
|
5
5
|
/**
|
|
6
|
-
* Check if a value is a valid
|
|
6
|
+
* Check if a value is a valid MessageObject.
|
|
7
7
|
*
|
|
8
|
-
* -
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```ts
|
|
12
|
-
* isValidMessages({ en: { hello: "Hello" } }) // true
|
|
13
|
-
* isValidMessages({ en: { count: 5 } }) // false
|
|
14
|
-
* ```
|
|
8
|
+
* - Supports all MessageValue variants (primitive, array, object).
|
|
9
|
+
* - Uses an iterative approach to avoid stack overflow.
|
|
15
10
|
*/
|
|
16
11
|
function isValidMessages(value) {
|
|
17
12
|
if (!isPlainObject(value))
|
|
@@ -19,16 +14,29 @@ function isValidMessages(value) {
|
|
|
19
14
|
const stack = [value];
|
|
20
15
|
while (stack.length > 0) {
|
|
21
16
|
const current = stack.pop();
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
17
|
+
// primitives are always valid
|
|
18
|
+
if (current === null ||
|
|
19
|
+
typeof current === "string" ||
|
|
20
|
+
typeof current === "number" ||
|
|
21
|
+
typeof current === "boolean") {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
// array → validate each item
|
|
25
|
+
if (Array.isArray(current)) {
|
|
26
|
+
for (const item of current) {
|
|
27
|
+
stack.push(item);
|
|
27
28
|
}
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
// object → validate each value
|
|
32
|
+
if (isPlainObject(current)) {
|
|
33
|
+
for (const v of Object.values(current)) {
|
|
34
|
+
stack.push(v);
|
|
30
35
|
}
|
|
36
|
+
continue;
|
|
31
37
|
}
|
|
38
|
+
// everything else is invalid
|
|
39
|
+
return false;
|
|
32
40
|
}
|
|
33
41
|
return true;
|
|
34
42
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "intor",
|
|
3
|
-
"version": "2.3.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.3.15",
|
|
4
|
+
"description": "The i18n library for modern JavaScript",
|
|
5
5
|
"author": "Yiming Liao",
|
|
6
6
|
"homepage": "https://github.com/yiming-liao/intor#readme",
|
|
7
7
|
"repository": {
|
|
@@ -100,8 +100,7 @@
|
|
|
100
100
|
"examples:html": "vite --config examples/html/vite.config.ts"
|
|
101
101
|
},
|
|
102
102
|
"dependencies": {
|
|
103
|
-
"intor-translator": "1.
|
|
104
|
-
"keyv": "5.5.5",
|
|
103
|
+
"intor-translator": "1.4.2",
|
|
105
104
|
"logry": "2.1.6",
|
|
106
105
|
"p-limit": "7.2.0"
|
|
107
106
|
},
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
const CACHE_KEY_DELIMITER = "|";
|
|
2
|
-
const sanitize = (k) => k
|
|
3
|
-
.replaceAll(/[\u200B-\u200D\uFEFF]/g, "")
|
|
4
|
-
.replaceAll(/[\r\n]/g, "")
|
|
5
|
-
.trim();
|
|
6
|
-
/**
|
|
7
|
-
* Normalizes a value into a stable cache key string.
|
|
8
|
-
*
|
|
9
|
-
* - Supports primitive values and structured array keys.
|
|
10
|
-
* - Produces deterministic output suitable for cache identifiers.
|
|
11
|
-
*
|
|
12
|
-
* Notes:
|
|
13
|
-
* - `null`, `undefined`, or empty arrays return `null`.
|
|
14
|
-
* - Special tokens are used for boolean, null, and undefined values
|
|
15
|
-
* to preserve semantic differences.
|
|
16
|
-
*/
|
|
17
|
-
const normalizeCacheKey = (key, delimiter = CACHE_KEY_DELIMITER) => {
|
|
18
|
-
// Treat nullish values as "no cache key"
|
|
19
|
-
if (key === null || key === undefined)
|
|
20
|
-
return null;
|
|
21
|
-
if (Array.isArray(key)) {
|
|
22
|
-
// Empty array produces no meaningful cache key
|
|
23
|
-
if (key.length === 0)
|
|
24
|
-
return null;
|
|
25
|
-
const normalized = key.map((k) => {
|
|
26
|
-
// Preserve semantic differences for special values
|
|
27
|
-
if (k === null)
|
|
28
|
-
return "__null";
|
|
29
|
-
if (k === undefined)
|
|
30
|
-
return "__undefined";
|
|
31
|
-
if (typeof k === "boolean")
|
|
32
|
-
return k ? "__true" : "__false";
|
|
33
|
-
return sanitize(String(k));
|
|
34
|
-
});
|
|
35
|
-
// Join segments into a single deterministic cache key
|
|
36
|
-
return normalized.join(delimiter);
|
|
37
|
-
}
|
|
38
|
-
// Normalize boolean primitives explicitly
|
|
39
|
-
if (typeof key === "boolean")
|
|
40
|
-
return key ? "__true" : "__false";
|
|
41
|
-
// Fallback: stringify primitive values
|
|
42
|
-
return String(key);
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
export { normalizeCacheKey };
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
const CACHE_KEY_DELIMITER = "|";
|
|
2
|
-
const sanitize = (k) => k
|
|
3
|
-
.replaceAll(/[\u200B-\u200D\uFEFF]/g, "")
|
|
4
|
-
.replaceAll(/[\r\n]/g, "")
|
|
5
|
-
.trim();
|
|
6
|
-
/**
|
|
7
|
-
* Normalizes a value into a stable cache key string.
|
|
8
|
-
*
|
|
9
|
-
* - Supports primitive values and structured array keys.
|
|
10
|
-
* - Produces deterministic output suitable for cache identifiers.
|
|
11
|
-
*
|
|
12
|
-
* Notes:
|
|
13
|
-
* - `null`, `undefined`, or empty arrays return `null`.
|
|
14
|
-
* - Special tokens are used for boolean, null, and undefined values
|
|
15
|
-
* to preserve semantic differences.
|
|
16
|
-
*/
|
|
17
|
-
const normalizeCacheKey = (key, delimiter = CACHE_KEY_DELIMITER) => {
|
|
18
|
-
// Treat nullish values as "no cache key"
|
|
19
|
-
if (key === null || key === undefined)
|
|
20
|
-
return null;
|
|
21
|
-
if (Array.isArray(key)) {
|
|
22
|
-
// Empty array produces no meaningful cache key
|
|
23
|
-
if (key.length === 0)
|
|
24
|
-
return null;
|
|
25
|
-
const normalized = key.map((k) => {
|
|
26
|
-
// Preserve semantic differences for special values
|
|
27
|
-
if (k === null)
|
|
28
|
-
return "__null";
|
|
29
|
-
if (k === undefined)
|
|
30
|
-
return "__undefined";
|
|
31
|
-
if (typeof k === "boolean")
|
|
32
|
-
return k ? "__true" : "__false";
|
|
33
|
-
return sanitize(String(k));
|
|
34
|
-
});
|
|
35
|
-
// Join segments into a single deterministic cache key
|
|
36
|
-
return normalized.join(delimiter);
|
|
37
|
-
}
|
|
38
|
-
// Normalize boolean primitives explicitly
|
|
39
|
-
if (typeof key === "boolean")
|
|
40
|
-
return key ? "__true" : "__false";
|
|
41
|
-
// Fallback: stringify primitive values
|
|
42
|
-
return String(key);
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
export { normalizeCacheKey };
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
const CACHE_KEY_DELIMITER = "|";
|
|
2
|
-
const sanitize = (k) => k
|
|
3
|
-
.replaceAll(/[\u200B-\u200D\uFEFF]/g, "")
|
|
4
|
-
.replaceAll(/[\r\n]/g, "")
|
|
5
|
-
.trim();
|
|
6
|
-
/**
|
|
7
|
-
* Normalizes a value into a stable cache key string.
|
|
8
|
-
*
|
|
9
|
-
* - Supports primitive values and structured array keys.
|
|
10
|
-
* - Produces deterministic output suitable for cache identifiers.
|
|
11
|
-
*
|
|
12
|
-
* Notes:
|
|
13
|
-
* - `null`, `undefined`, or empty arrays return `null`.
|
|
14
|
-
* - Special tokens are used for boolean, null, and undefined values
|
|
15
|
-
* to preserve semantic differences.
|
|
16
|
-
*/
|
|
17
|
-
const normalizeCacheKey = (key, delimiter = CACHE_KEY_DELIMITER) => {
|
|
18
|
-
// Treat nullish values as "no cache key"
|
|
19
|
-
if (key === null || key === undefined)
|
|
20
|
-
return null;
|
|
21
|
-
if (Array.isArray(key)) {
|
|
22
|
-
// Empty array produces no meaningful cache key
|
|
23
|
-
if (key.length === 0)
|
|
24
|
-
return null;
|
|
25
|
-
const normalized = key.map((k) => {
|
|
26
|
-
// Preserve semantic differences for special values
|
|
27
|
-
if (k === null)
|
|
28
|
-
return "__null";
|
|
29
|
-
if (k === undefined)
|
|
30
|
-
return "__undefined";
|
|
31
|
-
if (typeof k === "boolean")
|
|
32
|
-
return k ? "__true" : "__false";
|
|
33
|
-
return sanitize(String(k));
|
|
34
|
-
});
|
|
35
|
-
// Join segments into a single deterministic cache key
|
|
36
|
-
return normalized.join(delimiter);
|
|
37
|
-
}
|
|
38
|
-
// Normalize boolean primitives explicitly
|
|
39
|
-
if (typeof key === "boolean")
|
|
40
|
-
return key ? "__true" : "__false";
|
|
41
|
-
// Fallback: stringify primitive values
|
|
42
|
-
return String(key);
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
export { normalizeCacheKey };
|