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.
Files changed (150) hide show
  1. package/dist/core/export/index.js +1 -2
  2. package/dist/core/src/config/define-intor-config.js +0 -3
  3. package/dist/core/src/config/resolvers/resolve-cookie-options.js +0 -1
  4. package/dist/core/src/config/resolvers/resolve-fallback-locales.js +1 -2
  5. package/dist/core/src/config/resolvers/resolve-routing-options.js +0 -2
  6. package/dist/core/src/config/validators/validate-default-locale.js +0 -1
  7. package/dist/core/src/config/validators/validate-id.js +0 -1
  8. package/dist/core/src/config/validators/validate-supported-locales.js +0 -1
  9. package/dist/core/src/core/messages/global-messages-pool.js +11 -17
  10. package/dist/core/src/core/messages/load-remote-messages/load-remote-messages.js +1 -40
  11. package/dist/core/src/core/messages/utils/is-valid-messages.js +23 -15
  12. package/dist/core/src/routing/pathname/get-unprefixed-pathname.js +0 -1
  13. package/dist/core/src/routing/pathname/locale-prefix-pathname.js +0 -1
  14. package/dist/core/src/routing/pathname/standardize-pathname.js +0 -1
  15. package/dist/core/src/server/helpers/get-translator.js +3 -2
  16. package/dist/core/src/server/helpers/local-messages-from-url.js +1 -1
  17. package/dist/core/src/server/intor/intor.js +0 -1
  18. package/dist/core/src/server/messages/load-local-messages/load-local-messages.js +11 -12
  19. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +6 -6
  20. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +14 -6
  21. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +3 -3
  22. package/dist/core/src/server/messages/load-messages.js +8 -12
  23. package/dist/core/src/server/runtime/create-intor-runtime.js +12 -8
  24. package/dist/core/src/server/translator/create-translator.js +1 -0
  25. package/dist/express/src/adapters/express/helpers/get-translator.js +3 -4
  26. package/dist/express/src/adapters/express/middleware/create-intor.js +5 -5
  27. package/dist/express/src/core/messages/global-messages-pool.js +9 -3
  28. package/dist/express/src/core/messages/load-remote-messages/load-remote-messages.js +1 -40
  29. package/dist/express/src/core/messages/utils/is-valid-messages.js +23 -15
  30. package/dist/express/src/routing/inbound/resolve-inbound.js +5 -6
  31. package/dist/express/src/routing/inbound/resolve-locale/resolve-locale.js +13 -6
  32. package/dist/express/src/routing/locale/get-locale-from-accept-language.js +7 -17
  33. package/dist/express/src/routing/locale/get-locale-from-host.js +13 -15
  34. package/dist/express/src/routing/locale/get-locale-from-pathname.js +4 -14
  35. package/dist/express/src/routing/locale/get-locale-from-query.js +10 -17
  36. package/dist/express/src/routing/pathname/get-unprefixed-pathname.js +0 -1
  37. package/dist/express/src/routing/pathname/locale-prefix-pathname.js +0 -1
  38. package/dist/express/src/routing/pathname/standardize-pathname.js +0 -1
  39. package/dist/express/src/server/helpers/get-translator.js +3 -2
  40. package/dist/express/src/server/messages/load-local-messages/load-local-messages.js +11 -12
  41. package/dist/express/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +6 -6
  42. package/dist/express/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +14 -6
  43. package/dist/express/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +3 -3
  44. package/dist/express/src/server/messages/load-messages.js +8 -12
  45. package/dist/express/src/server/runtime/create-intor-runtime.js +12 -8
  46. package/dist/express/src/server/translator/create-translator.js +1 -0
  47. package/dist/next/src/adapters/next/navigation/redirect.js +0 -1
  48. package/dist/next/src/adapters/next/navigation/use-pathname.js +0 -1
  49. package/dist/next/src/adapters/next/proxy/intor-proxy.js +1 -2
  50. package/dist/next/src/adapters/next/server/get-locale.js +0 -1
  51. package/dist/next/src/adapters/next/server/get-pathname.js +0 -1
  52. package/dist/next/src/adapters/next/server/get-translator.js +3 -4
  53. package/dist/next/src/adapters/next/server/intor.js +2 -3
  54. package/dist/next/src/core/messages/global-messages-pool.js +9 -3
  55. package/dist/next/src/core/messages/load-remote-messages/load-remote-messages.js +1 -40
  56. package/dist/next/src/core/messages/utils/is-valid-messages.js +23 -15
  57. package/dist/next/src/policies/shoud-full-reload.js +0 -1
  58. package/dist/next/src/routing/inbound/resolve-inbound.js +5 -6
  59. package/dist/next/src/routing/inbound/resolve-locale/resolve-locale.js +13 -6
  60. package/dist/next/src/routing/locale/get-locale-from-accept-language.js +7 -17
  61. package/dist/next/src/routing/locale/get-locale-from-host.js +13 -15
  62. package/dist/next/src/routing/locale/get-locale-from-pathname.js +4 -14
  63. package/dist/next/src/routing/locale/get-locale-from-query.js +10 -17
  64. package/dist/next/src/routing/pathname/get-unprefixed-pathname.js +0 -1
  65. package/dist/next/src/routing/pathname/locale-prefix-pathname.js +0 -1
  66. package/dist/next/src/routing/pathname/standardize-pathname.js +0 -1
  67. package/dist/next/src/server/helpers/get-translator.js +3 -2
  68. package/dist/next/src/server/intor/intor.js +0 -1
  69. package/dist/next/src/server/messages/load-local-messages/load-local-messages.js +11 -12
  70. package/dist/next/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +6 -6
  71. package/dist/next/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +14 -6
  72. package/dist/next/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +3 -3
  73. package/dist/next/src/server/messages/load-messages.js +8 -12
  74. package/dist/next/src/server/runtime/create-intor-runtime.js +12 -8
  75. package/dist/next/src/server/translator/create-translator.js +1 -0
  76. package/dist/react/src/client/react/helpers/use-runtime-state.js +0 -1
  77. package/dist/react/src/client/react/navigation/use-execute-navigation.js +0 -1
  78. package/dist/react/src/client/react/navigation/use-resolve-navigation.js +0 -1
  79. package/dist/react/src/client/react/provider/effects/use-locale-effects.js +0 -1
  80. package/dist/react/src/client/react/translator/use-translator.js +1 -0
  81. package/dist/react/src/client/shared/helpers/get-client-locale.js +0 -1
  82. package/dist/react/src/client/shared/messages/create-refetch-messages.js +0 -3
  83. package/dist/react/src/core/messages/load-remote-messages/load-remote-messages.js +1 -40
  84. package/dist/react/src/core/messages/utils/is-valid-messages.js +23 -15
  85. package/dist/react/src/policies/shoud-full-reload.js +0 -1
  86. package/dist/react/src/routing/pathname/get-unprefixed-pathname.js +0 -1
  87. package/dist/react/src/routing/pathname/locale-prefix-pathname.js +0 -1
  88. package/dist/react/src/routing/pathname/standardize-pathname.js +0 -1
  89. package/dist/svelte/src/client/shared/helpers/get-client-locale.js +0 -1
  90. package/dist/svelte/src/client/shared/messages/create-refetch-messages.js +0 -3
  91. package/dist/svelte/src/client/svelte/helpers/create-runtime-state.js +0 -1
  92. package/dist/svelte/src/client/svelte/runtime/create-intor-api.js +4 -0
  93. package/dist/svelte/src/client/svelte/runtime/create-intor.js +2 -1
  94. package/dist/svelte/src/client/svelte/runtime/effects/locale-effects.js +0 -1
  95. package/dist/svelte/src/core/messages/load-remote-messages/load-remote-messages.js +1 -40
  96. package/dist/svelte/src/core/messages/utils/is-valid-messages.js +23 -15
  97. package/dist/types/export/index.d.ts +2 -2
  98. package/dist/types/src/adapters/express/global.d.ts +2 -1
  99. package/dist/types/src/adapters/express/helpers/get-translator.d.ts +1 -1
  100. package/dist/types/src/adapters/next/server/get-translator.d.ts +1 -1
  101. package/dist/types/src/adapters/next/server/intor.d.ts +2 -2
  102. package/dist/types/src/client/svelte/runtime/create-intor-api.d.ts +2 -0
  103. package/dist/types/src/client/svelte/runtime/types.d.ts +3 -1
  104. package/dist/types/src/client/vue/provider/resolver/resolve-runtime.d.ts +1 -1
  105. package/dist/types/src/config/constants/index.d.ts +0 -1
  106. package/dist/types/src/config/index.d.ts +2 -2
  107. package/dist/types/src/config/types/index.d.ts +0 -1
  108. package/dist/types/src/config/types/intor-config.d.ts +0 -4
  109. package/dist/types/src/core/index.d.ts +1 -1
  110. package/dist/types/src/core/messages/global-messages-pool.d.ts +15 -12
  111. package/dist/types/src/core/messages/index.d.ts +2 -2
  112. package/dist/types/src/core/messages/load-remote-messages/load-remote-messages.d.ts +1 -2
  113. package/dist/types/src/core/messages/load-remote-messages/types.d.ts +1 -6
  114. package/dist/types/src/core/messages/types.d.ts +14 -36
  115. package/dist/types/src/core/messages/utils/is-valid-messages.d.ts +5 -10
  116. package/dist/types/src/core/types/translator-instance.d.ts +3 -1
  117. package/dist/types/src/routing/inbound/resolve-locale/resolve-locale.d.ts +4 -3
  118. package/dist/types/src/routing/locale/get-locale-from-accept-language.d.ts +5 -7
  119. package/dist/types/src/routing/locale/get-locale-from-host.d.ts +12 -8
  120. package/dist/types/src/routing/locale/get-locale-from-pathname.d.ts +4 -13
  121. package/dist/types/src/routing/locale/get-locale-from-query.d.ts +9 -10
  122. package/dist/types/src/server/helpers/get-translator.d.ts +2 -3
  123. package/dist/types/src/server/messages/load-local-messages/load-local-messages.d.ts +2 -2
  124. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.d.ts +2 -2
  125. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/types.d.ts +4 -3
  126. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.d.ts +2 -2
  127. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.d.ts +2 -2
  128. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.d.ts +1 -1
  129. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/types.d.ts +2 -2
  130. package/dist/types/src/server/messages/load-local-messages/types.d.ts +2 -2
  131. package/dist/types/src/server/messages/load-messages.d.ts +1 -1
  132. package/dist/types/src/server/messages/types.d.ts +2 -2
  133. package/dist/types/src/server/runtime/types.d.ts +2 -2
  134. package/dist/types/src/server/translator/create-translator.d.ts +1 -0
  135. package/dist/vue/src/client/shared/helpers/get-client-locale.js +0 -1
  136. package/dist/vue/src/client/shared/messages/create-refetch-messages.js +0 -3
  137. package/dist/vue/src/client/vue/helpers/use-runtime-state.js +0 -1
  138. package/dist/vue/src/client/vue/provider/effects/use-locale-effects.js +0 -1
  139. package/dist/vue/src/client/vue/translator/use-translator.js +3 -1
  140. package/dist/vue/src/core/messages/load-remote-messages/load-remote-messages.js +1 -40
  141. package/dist/vue/src/core/messages/utils/is-valid-messages.js +23 -15
  142. package/package.json +3 -4
  143. package/dist/core/src/config/constants/cache.js +0 -7
  144. package/dist/core/src/config/resolvers/resolve-cache-options.js +0 -11
  145. package/dist/react/src/core/utils/normalizers/normalize-cache-key.js +0 -45
  146. package/dist/svelte/src/core/utils/normalizers/normalize-cache-key.js +0 -45
  147. package/dist/types/src/config/constants/cache.d.ts +0 -2
  148. package/dist/types/src/config/resolvers/resolve-cache-options.d.ts +0 -2
  149. package/dist/types/src/config/types/cache.d.ts +0 -7
  150. 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 { Messages } from "../../../../../core";
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, messagesReader, loggerOptions, }: ParseFileEntriesParams): Promise<Messages>;
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 { MessagesReader, Messages } from "../../../../../core";
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
- messagesReader?: MessagesReader;
9
+ readers?: MessagesReaders;
9
10
  loggerOptions: LoggerOptions;
10
11
  }
11
12
  export interface ParsedFileEntries {
12
13
  namespace: string;
13
- messages: Messages;
14
+ messages: MessageObject;
14
15
  }
@@ -1,6 +1,6 @@
1
- import type { Messages } from "../../../../../../core";
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<Messages>;
6
+ export declare function jsonReader(filePath: string, readFile?: typeof fs.readFile): Promise<MessageObject>;
@@ -1,4 +1,4 @@
1
- import type { Messages } from "../../../../../../core";
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: Messages): Messages;
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, readOptions: { exts, messagesReader }, loggerOptions, }: ReadLocaleMessagesParams) => Promise<LocaleMessages>;
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 { MessagesReadOptions } from "../../../../core";
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
- readOptions?: MessagesReadOptions;
16
+ readers?: MessagesReaders;
17
17
  loggerOptions: LoggerOptions;
18
18
  }
@@ -1,5 +1,5 @@
1
1
  import type { LoggerOptions } from "../../../config";
2
- import type { MessagesPool, MessagesReadOptions } from "../../../core";
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
- readOptions?: MessagesReadOptions;
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, readOptions, allowCacheWrite, }: LoadMessagesParams) => Promise<LocaleMessages | undefined>;
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 { MessagesReadOptions } from "../../core";
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
- readOptions?: MessagesReadOptions;
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, MessagesReadOptions } from "../../core";
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
- readOptions?: MessagesReadOptions;
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 ({ id, locale, fallbackLocales, namespaces, rootDir, url, headers, signal, pool, cacheOptions, allowCacheWrite = false, loggerOptions, }) => {
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 **Messages** object.
6
+ * Check if a value is a valid MessageObject.
7
7
  *
8
- * - Uses an iterative approach to avoid stack overflow with deeply nested objects.
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
- for (const v of Object.values(current)) {
23
- if (typeof v === "string")
24
- continue;
25
- if (isPlainObject(v)) {
26
- stack.push(v);
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
- else {
29
- return false;
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.13",
4
- "description": "A modular and extensible i18n core designed for TypeScript and JavaScript projects. Intor enables custom translation logic with support for both frontend and backend environments, featuring runtime configuration, caching, adapters, and message loaders.",
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.3.2",
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,7 +0,0 @@
1
- // Default cache options
2
- const DEFAULT_CACHE_OPTIONS = {
3
- enabled: process.env.NODE_ENV === "production",
4
- ttl: 60 * 60 * 1000, // 1 hour
5
- };
6
-
7
- export { DEFAULT_CACHE_OPTIONS };
@@ -1,11 +0,0 @@
1
- import '../constants/cookie.js';
2
- import { DEFAULT_CACHE_OPTIONS } from '../constants/cache.js';
3
-
4
- const resolveCacheOptions = (cache) => {
5
- return {
6
- ...DEFAULT_CACHE_OPTIONS,
7
- ...cache,
8
- };
9
- };
10
-
11
- export { resolveCacheOptions };
@@ -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,2 +0,0 @@
1
- import type { CacheResolvedOptions } from "../types";
2
- export declare const DEFAULT_CACHE_OPTIONS: CacheResolvedOptions;
@@ -1,2 +0,0 @@
1
- import type { CacheRawOptions, CacheResolvedOptions } from "../types";
2
- export declare const resolveCacheOptions: (cache?: CacheRawOptions) => CacheResolvedOptions;
@@ -1,7 +0,0 @@
1
- export type CacheRawOptions = {
2
- /** Enable cache behavior. Defaults to production */
3
- enabled?: boolean;
4
- /** Cache time-to-live in milliseconds. Defaults to 1 hour */
5
- ttl?: number;
6
- };
7
- export type CacheResolvedOptions = Required<CacheRawOptions>;
@@ -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 };