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
@@ -2,7 +2,6 @@ import { shouldPersist } from '../../../../policies/should-persist.js';
2
2
  import { shouldPersistOnFirstVisit } from '../../../../policies/should-persist-on-first-visit.js';
3
3
  import '../../../../core/error/intor-error.js';
4
4
  import 'logry';
5
- import 'keyv';
6
5
  import { getLocaleCookieBrowser } from '../../../shared/utils/locale/get-locale-cookie-browser.js';
7
6
  import { setLocaleCookieBrowser } from '../../../shared/utils/locale/set-locale-cookie-browser.js';
8
7
  import { setDocumentLocale } from '../../../shared/utils/locale/set-document-locale.js';
@@ -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
  }
@@ -1,4 +1,4 @@
1
- export { PREFIX_PLACEHOLDER, IntorError, IntorErrorCode, deepMerge, resolveLoaderOptions, clearLoggerPool, clearMessagesPool, setGlobalMessagesPool, mergeMessages, isValidMessages, type Messages, type MessagesReader, } from "../src/core";
1
+ export { PREFIX_PLACEHOLDER, IntorError, IntorErrorCode, deepMerge, resolveLoaderOptions, clearLoggerPool, clearMessagesPool, mergeMessages, isValidMessages, type MessagesReader, type MessagesReaders, } from "../src/core";
2
2
  export { defineIntorConfig, type IntorRawConfig, type IntorResolvedConfig, } from "../src/config";
3
3
  export { localizePathname } from "../src/routing";
4
- export { Translator, type TranslatorPlugin, type TranslateHandlers, type FormatHandler, type LoadingHandler, type MissingHandler, type HandlerContext, type TranslateContext, type TranslateHook, type LocaleMessages, } from "intor-translator";
4
+ export { Translator, type TranslatorPlugin, type TranslateHandlers, type FormatHandler, type LoadingHandler, type MissingHandler, type HandlerContext, type TranslateContext, type TranslateHook, type LocaleMessages, type MessageObject, type MessageValue, } from "intor-translator";
@@ -12,8 +12,9 @@ declare global {
12
12
  };
13
13
  locale: string;
14
14
  localeSource: RoutingLocaleSource;
15
- t: TranslatorInstance<LocaleMessages, undefined, "string">["t"];
16
15
  hasKey: TranslatorInstance<LocaleMessages, undefined, "string">["hasKey"];
16
+ t: TranslatorInstance<LocaleMessages, undefined, "string">["t"];
17
+ tRaw: TranslatorInstance<LocaleMessages, undefined, "string">["tRaw"];
17
18
  }
18
19
  }
19
20
  }
@@ -3,7 +3,7 @@ import type { GenConfigKeys, GenMessages } from "../../../core";
3
3
  import type { GetTranslatorParams, TranslatorInstanceServer } from "../../../server";
4
4
  import type { Request } from "express";
5
5
  import type { LocalizedNodeKeys } from "intor-translator";
6
- type GetTranslatorExpressParams = Omit<GetTranslatorParams, "locale" | "allowCacheWrite">;
6
+ type GetTranslatorExpressParams = Omit<GetTranslatorParams, "locale">;
7
7
  /**
8
8
  * Get a server-side translator for the current execution context.
9
9
  *
@@ -2,7 +2,7 @@ import type { IntorResolvedConfig } from "../../../config";
2
2
  import type { GenConfigKeys, GenMessages } from "../../../core";
3
3
  import type { GetTranslatorParams, TranslatorInstanceServer } from "../../../server";
4
4
  import type { LocalizedNodeKeys } from "intor-translator";
5
- type GetTranslatorNextParams = Omit<GetTranslatorParams, "locale" | "allowCacheWrite">;
5
+ type GetTranslatorNextParams = Omit<GetTranslatorParams, "locale">;
6
6
  /**
7
7
  * Get a server-side translator for the current execution context.
8
8
  *
@@ -1,5 +1,5 @@
1
1
  import type { IntorResolvedConfig } from "../../../config";
2
- import type { MessagesReadOptions } from "../../../core";
2
+ import type { MessagesReaders } from "../../../core";
3
3
  import { type GenConfigKeys } from "../../../core";
4
4
  import { type IntorResult } from "../../../server";
5
5
  /**
@@ -9,4 +9,4 @@ import { type IntorResult } from "../../../server";
9
9
  * - Acts as the bootstrap entry where cache writes are permitted.
10
10
  * @platform Next.js
11
11
  */
12
- export declare function intor<CK extends GenConfigKeys = "__default__">(config: IntorResolvedConfig, readOptions?: MessagesReadOptions): Promise<IntorResult<CK>>;
12
+ export declare function intor<CK extends GenConfigKeys = "__default__">(config: IntorResolvedConfig, readers?: MessagesReaders): Promise<IntorResult<CK>>;
@@ -6,8 +6,10 @@ export declare function createIntorApi(translator: Readable<Translator>): {
6
6
  scoped: (preKey: string) => {
7
7
  scoped: /*elided*/ any;
8
8
  t: Readable<(key: string, replacements?: Replacement) => string>;
9
+ tRaw: Readable<(key: string, replacements?: Replacement) => import("intor-translator").MessageValue | undefined>;
9
10
  tRich: Readable<(key: string, tagRenderers?: SvelteTagRenderers, replacements?: Replacement) => string>;
10
11
  };
11
12
  t: Readable<(key: string, replacements?: Replacement) => string>;
13
+ tRaw: Readable<(key: string, replacements?: Replacement) => import("intor-translator").MessageValue | undefined>;
12
14
  tRich: Readable<(key: string, tagRenderers?: SvelteTagRenderers, replacements?: Replacement) => string>;
13
15
  };
@@ -1,7 +1,7 @@
1
1
  import type { SvelteTagRenderers } from "../render";
2
2
  import type { BootstrapCore, GenConfigKeys, GenLocale, GenMessages, MessageKey } from "../../../core";
3
3
  import type { KeyMode } from "../../../core";
4
- import type { TranslateHandlers, TranslateHook, TranslatorPlugin } from "intor-translator";
4
+ import type { MessageValue, TranslateHandlers, TranslateHook, TranslatorPlugin } from "intor-translator";
5
5
  import type { Readable } from "svelte/store";
6
6
  import { type Locale, type LocalizedNodeKeys, type Replacement } from "intor-translator";
7
7
  export interface SvelteBootstrap<CK extends GenConfigKeys = "__default__"> extends Omit<BootstrapCore<CK>, "messages"> {
@@ -27,6 +27,8 @@ export type IntorRuntime<CK extends GenConfigKeys = "__default__", Mode extends
27
27
  interface ReactiveTranslator<CK extends GenConfigKeys = "__default__", PK extends string | undefined = undefined, Mode extends KeyMode = "auto"> {
28
28
  /** Reactive translation function for Svelte templates */
29
29
  t: Readable<(key?: MessageKey<GenMessages<CK>, PK, Mode>, replacements?: Replacement) => string>;
30
+ /** Reactive translation function that returns the raw message value. */
31
+ tRaw: Readable<(key?: MessageKey<GenMessages<CK>, PK, Mode>, replacements?: Replacement) => MessageValue | undefined>;
30
32
  /** Reactive rich translation function for Svelte templates */
31
33
  tRich: Readable<(key: MessageKey<GenMessages<CK>, PK, Mode>, tagRenderers?: SvelteTagRenderers, replacements?: Replacement) => string>;
32
34
  }
@@ -2,7 +2,7 @@ import type { IntorProviderProps } from "../types";
2
2
  export declare function resolveRuntime(props: IntorProviderProps): {
3
3
  config: import("vue").ComputedRef<import("../../../../config").IntorResolvedConfig>;
4
4
  locale: import("vue").ComputedRef<string>;
5
- messages: import("vue").ComputedRef<import("../../../../core").GenMessages<"__default__"> | undefined>;
5
+ messages: import("vue").ComputedRef<import("intor-translator").LocaleMessages | undefined>;
6
6
  isLoading: import("vue").ComputedRef<boolean>;
7
7
  onLocaleChange: import("vue").ComputedRef<((newLocale: import("../../../../core").GenLocale<"__default__">) => Promise<void> | void) | undefined>;
8
8
  handlers: import("vue").Ref<import("intor-translator").TranslateHandlers | undefined, import("intor-translator").TranslateHandlers | undefined> | undefined;
@@ -1,3 +1,2 @@
1
1
  export { DEFAULT_ROUTING_OPTIONS } from "./routing";
2
2
  export { DEFAULT_COOKIE_OPTIONS } from "./cookie";
3
- export { DEFAULT_CACHE_OPTIONS } from "./cache";
@@ -1,3 +1,3 @@
1
1
  export { defineIntorConfig } from "./define-intor-config";
2
- export { DEFAULT_ROUTING_OPTIONS, DEFAULT_COOKIE_OPTIONS, DEFAULT_CACHE_OPTIONS, } from "./constants";
3
- export type { IntorRawConfig, IntorResolvedConfig, LoaderOptions, RemoteHeaders, TranslatorOptions, RoutingResolvedOptions, CookieResolvedOptions, LoggerOptions, CacheResolvedOptions, } from "./types";
2
+ export { DEFAULT_ROUTING_OPTIONS, DEFAULT_COOKIE_OPTIONS } from "./constants";
3
+ export type { IntorRawConfig, IntorResolvedConfig, LoaderOptions, RemoteHeaders, TranslatorOptions, RoutingResolvedOptions, CookieResolvedOptions, LoggerOptions, } from "./types";
@@ -4,4 +4,3 @@ export type { TranslatorOptions } from "./translator";
4
4
  export type { RoutingResolvedOptions } from "./routing";
5
5
  export type { CookieRawOptions, CookieResolvedOptions } from "./cookie";
6
6
  export type { LoggerOptions } from "./logger";
7
- export type { CacheRawOptions, CacheResolvedOptions } from "./cache";
@@ -1,4 +1,3 @@
1
- import type { CacheRawOptions, CacheResolvedOptions } from "./cache";
2
1
  import type { CookieRawOptions, CookieResolvedOptions } from "./cookie";
3
2
  import type { ClientLoaderOptions, LoaderOptions, ServerLoaderOptions } from "./loader";
4
3
  import type { LoggerOptions } from "./logger";
@@ -35,8 +34,6 @@ export type IntorRawConfig = {
35
34
  };
36
35
  /** Logging and diagnostic configuration. */
37
36
  readonly logger?: Omit<LoggerOptions, "id">;
38
- /** Cache policy used by remote messages loading. */
39
- readonly cache?: CacheRawOptions;
40
37
  };
41
38
  /** Fully resolved configuration after validation and normalization. */
42
39
  export type IntorResolvedConfig = {
@@ -56,5 +53,4 @@ export type IntorResolvedConfig = {
56
53
  loader?: ClientLoaderOptions;
57
54
  };
58
55
  readonly logger: LoggerOptions;
59
- readonly cache: CacheResolvedOptions;
60
56
  };
@@ -2,5 +2,5 @@ export { PREFIX_PLACEHOLDER, INTOR_HEADERS } from "./constants";
2
2
  export { IntorError, IntorErrorCode } from "./error";
3
3
  export { deepMerge, type PlainObject, type DeepMergeOverrideEvent, resolveLoaderOptions, normalizePathname, normalizeCacheKey, normalizeLocale, normalizeQuery, } from "./utils";
4
4
  export { getLogger, clearLoggerPool } from "./logger";
5
- export { loadRemoteMessages, type MessagesPool, getGlobalMessagesPool, clearMessagesPool, setGlobalMessagesPool, mergeMessages, isValidMessages, type Messages, type MessagesReader, type MessagesReadOptions, } from "./messages";
5
+ export { loadRemoteMessages, type MessagesPool, getGlobalMessagesPool, clearMessagesPool, mergeMessages, isValidMessages, type MessagesReader, type MessagesReaders, } from "./messages";
6
6
  export type { INTOR_GENERATED_KEY, IfGen, GenConfigKeys, GenConfig, GenMessages, GenLocale, BootstrapCore, MessageKey, TranslatorInstance, KeyMode, RoutingLocaleSource, RoutingLocaleCarrier, LocalePathPrefix, } from "./types";
@@ -1,22 +1,25 @@
1
1
  import type { LocaleMessages } from "intor-translator";
2
- import Keyv from "keyv";
3
2
  /**
4
- * Global messages pool (cross-module + hot-reload safe)
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.
5
11
  */
6
- export type MessagesPool = Keyv<LocaleMessages>;
12
+ export type MessagesPool = Map<string, LocaleMessages>;
7
13
  declare global {
8
14
  var __INTOR_MESSAGES_POOL__: MessagesPool | undefined;
9
15
  }
10
- export declare function getGlobalMessagesPool(): MessagesPool;
11
16
  /**
12
- * Replace the global messages pool.
17
+ * Get the global messages pool.
13
18
  *
14
- * - Intended for advanced usage (e.g. Redis, custom cache backends).
15
- * - Must be called during application bootstrap.
16
- */
17
- export declare function setGlobalMessagesPool(pool: MessagesPool): void;
18
- /**
19
- * Optional: clear all cache
20
- * - Useful in tests or dynamic reloads.
19
+ * Lazily initialized to ensure:
20
+ * - Cross-module sharing
21
+ * - Dev / HMR safety
21
22
  */
23
+ export declare function getGlobalMessagesPool(): MessagesPool;
24
+ /** Clear all cached messages. */
22
25
  export declare function clearMessagesPool(): void;
@@ -1,5 +1,5 @@
1
1
  export { loadRemoteMessages } from "./load-remote-messages";
2
- export { type MessagesPool, getGlobalMessagesPool, clearMessagesPool, setGlobalMessagesPool, } from "./global-messages-pool";
2
+ export { type MessagesPool, getGlobalMessagesPool, clearMessagesPool, } from "./global-messages-pool";
3
3
  export { mergeMessages } from "./merge-messages";
4
4
  export { isValidMessages } from "./utils/is-valid-messages";
5
- export type { Messages, MessagesReader, MessagesReadOptions } from "./types";
5
+ export type { MessagesReader, MessagesReaders } from "./types";
@@ -7,9 +7,8 @@ import type { LocaleMessages } from "intor-translator";
7
7
  * It coordinates:
8
8
  *
9
9
  * - Locale resolution with fallbacks
10
- * - Cache read / write behavior
11
10
  * - Respecting abort signals across the entire async flow
12
11
  *
13
12
  * Network fetching and data validation are delegated to lower-level utilities.
14
13
  */
15
- export declare const loadRemoteMessages: ({ id, locale, fallbackLocales, namespaces, rootDir, url, headers, signal, pool, cacheOptions, allowCacheWrite, loggerOptions, }: LoadRemoteMessagesParams) => Promise<LocaleMessages | undefined>;
14
+ export declare const loadRemoteMessages: ({ locale, fallbackLocales, namespaces, rootDir, url, headers, signal, loggerOptions, }: LoadRemoteMessagesParams) => Promise<LocaleMessages | undefined>;
@@ -1,7 +1,5 @@
1
- import type { RemoteHeaders, LoggerOptions, CacheResolvedOptions } from "../../../config";
2
- import type { MessagesPool } from "../../../core";
1
+ import type { RemoteHeaders, LoggerOptions } from "../../../config";
3
2
  export interface LoadRemoteMessagesParams {
4
- id: string;
5
3
  locale: string;
6
4
  fallbackLocales?: string[];
7
5
  namespaces?: string[];
@@ -9,8 +7,5 @@ export interface LoadRemoteMessagesParams {
9
7
  url: string;
10
8
  headers?: RemoteHeaders;
11
9
  signal?: AbortSignal;
12
- pool?: MessagesPool;
13
- cacheOptions: CacheResolvedOptions;
14
- allowCacheWrite?: boolean;
15
10
  loggerOptions: LoggerOptions;
16
11
  }
@@ -1,37 +1,13 @@
1
- import type { NestedMessage } from "intor-translator";
2
1
  /**
3
- * Represents a collection of messages for a single locale.
2
+ * A function that reads and parses a message file.
4
3
  *
5
- * - This type does NOT include a locale layer.
6
- * - Each key represents a namespace or message group, and the value is a
7
- * `NestedMessage` object that can contain nested message structures.
8
- *
9
- *
10
- * @example
11
- * ```ts
12
- * const messages: Messages = {
13
- * ui: {
14
- * greeting: "Hello",
15
- * farewell: "Goodbye"
16
- * },
17
- * errors: {
18
- * network: "Network error occurred"
19
- * }
20
- * };
21
- * ```
22
- */
23
- export type Messages = Record<string, NestedMessage>;
24
- /**
25
- * A function that reads messages from a given file path.
26
- *
27
- * - This function is expected to return a `Promise` that resolves to a `Messages` object
28
- * representing messages for a single locale.
29
- * - It can be implemented to support different file formats such as YAML, TOML, or others.
4
+ * This function is format-specific (YAML, TOML, etc.)
5
+ * and is NOT responsible for validating the returned structure.
30
6
  *
31
7
  * @param filePath - The path to the message file to read.
32
- * @returns A Promise that resolves to a `Messages` object.
8
+ * @returns A Promise that resolves to parsed, unvalidated content.
33
9
  *
34
- * @example
10
+ * @example
35
11
  * ```ts
36
12
  * const reader: MessagesReader = async (filePath) => {
37
13
  * const content = await fs.promises.readFile(filePath, "utf-8");
@@ -39,13 +15,15 @@ export type Messages = Record<string, NestedMessage>;
39
15
  * };
40
16
  * ```
41
17
  */
42
- export type MessagesReader = (filePath: string) => Promise<Messages>;
18
+ export type MessagesReader = (filePath: string) => Promise<unknown>;
43
19
  /**
44
- * Options for reading locale messages.
20
+ * A map of file extension (without dot) to message reader.
45
21
  *
46
- * Used across loaders and runtimes to control how messages are read.
22
+ * Example:
23
+ * {
24
+ * yaml: yamlReader,
25
+ * yml: yamlReader,
26
+ * toml: tomlReader,
27
+ * }
47
28
  */
48
- export interface MessagesReadOptions {
49
- exts?: string[];
50
- messagesReader?: MessagesReader;
51
- }
29
+ export type MessagesReaders = Record<string, MessagesReader>;
@@ -1,15 +1,10 @@
1
- import type { Messages } from "../types";
1
+ import type { MessageObject } from "intor-translator";
2
2
  /** Check if a value is a plain object (not null, not array) */
3
3
  export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
4
4
  /**
5
- * Check if a value is a valid **Messages** object.
5
+ * Check if a value is a valid MessageObject.
6
6
  *
7
- * - Uses an iterative approach to avoid stack overflow with deeply nested objects.
8
- *
9
- * @example
10
- * ```ts
11
- * isValidMessages({ en: { hello: "Hello" } }) // true
12
- * isValidMessages({ en: { count: 5 } }) // false
13
- * ```
7
+ * - Supports all MessageValue variants (primitive, array, object).
8
+ * - Uses an iterative approach to avoid stack overflow.
14
9
  */
15
- export declare function isValidMessages(value: unknown): value is Messages;
10
+ export declare function isValidMessages(value: unknown): value is MessageObject;
@@ -1,4 +1,4 @@
1
- import { type Locale, type Replacement, type ScopedLeafKeys, type LocalizedLeafKeys, type LocaleMessages } from "intor-translator";
1
+ import { type Locale, type Replacement, type ScopedLeafKeys, type LocalizedLeafKeys, type LocaleMessages, type MessageValue } from "intor-translator";
2
2
  /** Key resolution strategy. */
3
3
  export type KeyMode = "auto" | "strict" | "string";
4
4
  /** Only allows keys resolved from message definitions. */
@@ -24,5 +24,7 @@ export type TranslatorInstance<M extends LocaleMessages, PK extends string | und
24
24
  hasKey: (key?: MessageKey<M, PK, Mode>, targetLocale?: Locale<M>) => boolean;
25
25
  /** Translate a given key into its string representation. */
26
26
  t: (key?: MessageKey<M, PK, Mode>, replacements?: Replacement) => string;
27
+ /** Translate a given key and return its raw message value. */
28
+ tRaw: (key?: MessageKey<M, PK, Mode>, replacements?: Replacement) => MessageValue | undefined;
27
29
  };
28
30
  export {};
@@ -1,9 +1,10 @@
1
1
  import type { LocaleContext, ResolvedLocale } from "./types";
2
2
  import type { IntorResolvedConfig } from "../../../config";
3
3
  /**
4
- * Resolves the active locale from inbound routing configuration.
4
+ * Resolve the active locale from inbound routing configuration.
5
5
  *
6
- * The first matching locale from the configured sources is used,
7
- * with the detected locale as a guaranteed fallback.
6
+ * Iterates through configured locale sources and returns the first
7
+ * normalized, supported locale. Falls back to the detected locale
8
+ * or the default locale if none match.
8
9
  */
9
10
  export declare function resolveLocale(config: IntorResolvedConfig, context: LocaleContext): ResolvedLocale;
@@ -1,19 +1,17 @@
1
1
  import type { IntorResolvedConfig } from "../../config";
2
2
  /**
3
- * Resolve locale from the `Accept-Language` header.
3
+ * Get locale candidate from the `Accept-Language` header.
4
4
  *
5
- * - Parses language priorities (`q` values) from the header.
6
- * - Selects the highest-priority language supported by the application.
7
- * - Normalizes the matched locale against `supportedLocales`.
8
- *
9
- * If no supported locale can be resolved, `undefined` is returned.
5
+ * Parses language priorities and returns the highest-priority
6
+ * language present in `supportedLocales`, without normalization.
10
7
  *
11
8
  * @example
12
9
  * ```ts
13
10
  * getLocaleFromAcceptLanguage("en-US,en;q=0.8,zh-TW;q=0.9", ["en-US", "zh-TW"])
14
11
  * // => "en-US"
12
+ *
15
13
  * getLocaleFromAcceptLanguage("fr,ja;q=0.9", ["en", "zh-TW"])
16
14
  * // => undefined
17
15
  * ```
18
16
  */
19
- export declare const getLocaleFromAcceptLanguage: (config: IntorResolvedConfig, acceptLanguageHeader: string | undefined | null) => string | undefined;
17
+ export declare const getLocaleFromAcceptLanguage: (acceptLanguageHeader: string | undefined | null, supportedLocales: IntorResolvedConfig["supportedLocales"]) => string | undefined;
@@ -1,17 +1,21 @@
1
- import type { IntorResolvedConfig } from "../../config";
2
1
  /**
3
- * Extract locale from hostname.
2
+ * Get locale candidate from hostname.
4
3
  *
5
- * Only the left-most subdomain is considered as a locale candidate, if present.
4
+ * Returns the left-most hostname label, without validation or normalization.
6
5
  *
7
6
  * @example
8
7
  * ```ts
9
- * getLocaleFromHost(config, "en.example.com")
8
+ * getLocaleFromHost("en.example.com")
10
9
  * // => "en"
11
- * getLocaleFromHost(config, "example.com")
12
- * // => undefined
13
- * getLocaleFromHost(config, "api.jp.example.com")
10
+ *
11
+ * getLocaleFromHost("example.com")
12
+ * // => "example"
13
+ *
14
+ * getLocaleFromHost("api.jp.example.com")
15
+ * // => "api"
16
+ *
17
+ * getLocaleFromHost("localhost")
14
18
  * // => undefined
15
19
  * ```
16
20
  */
17
- export declare function getLocaleFromHost(config: IntorResolvedConfig, host: string | undefined): string | undefined;
21
+ export declare function getLocaleFromHost(host: string | undefined): string | undefined;
@@ -1,18 +1,9 @@
1
1
  import type { IntorResolvedConfig } from "../../config";
2
2
  /**
3
- * Extracts the locale from a pathname, if present.
3
+ * Get locale from pathname.
4
4
  *
5
- * - Normalizes the raw pathname.
6
- * - Strips the configured basePath.
7
- * - Inspects the first path segment to determine whether
8
- * it matches a supported locale.
9
- *
10
- * If no locale segment is found, `undefined` is returned.
11
- *
12
- * Note:
13
- * - The pathname is treated as a canonical source.
14
- * - Only exact matches against `supportedLocales` are accepted.
15
- * - ___Locale normalization is intentionally not applied here.___
5
+ * Extracts the first pathname segment (after basePath) as a locale
6
+ * if it exactly matches one of the supported locales.
16
7
  *
17
8
  * @example
18
9
  * ```ts
@@ -28,4 +19,4 @@ import type { IntorResolvedConfig } from "../../config";
28
19
  * // => "en"
29
20
  * ```
30
21
  */
31
- export declare function getLocaleFromPathname(config: IntorResolvedConfig, pathname: string): string | undefined;
22
+ export declare function getLocaleFromPathname(pathname: string, config: IntorResolvedConfig): string | undefined;
@@ -1,20 +1,19 @@
1
- import type { IntorResolvedConfig } from "../../config";
2
1
  /**
3
- * Extracts locale from URL query parameters.
2
+ * Get locale candidate from URL query parameters.
4
3
  *
5
- * - Reads the configured locale query key.
6
- * - Normalizes the value against supported locales.
7
- *
8
- * If no valid locale is found, `undefined` is returned.
4
+ * Extracts the value of the configured query key, without
5
+ * validation or normalization.
9
6
  *
10
7
  * @example
11
8
  * ```ts
12
- * getLocaleFromQuery(config, { locale: "en" })
9
+ * getLocaleFromQuery({ locale: "en" }, "locale")
13
10
  * // => "en"
14
- * getLocaleFromQuery(config, {})
11
+ *
12
+ * getLocaleFromQuery({}, "locale")
15
13
  * // => undefined
16
- * getLocaleFromQuery(config, { locale: ["zh-TW"] })
14
+ *
15
+ * getLocaleFromQuery({ locale: ["zh-TW"] }, "locale")
17
16
  * // => "zh-TW"
18
17
  * ```
19
18
  */
20
- export declare function getLocaleFromQuery(config: IntorResolvedConfig, query: Record<string, string | string[] | undefined> | undefined): string | undefined;
19
+ export declare function getLocaleFromQuery(query: Record<string, string | string[] | undefined> | undefined, queryKey: string): string | undefined;
@@ -1,13 +1,12 @@
1
1
  import type { TranslatorInstanceServer } from "../translator/translator-instance";
2
2
  import type { IntorResolvedConfig } from "../../config";
3
- import type { GenConfigKeys, GenMessages } from "../../core";
4
- import type { MessagesReadOptions } from "../../core";
3
+ import type { GenConfigKeys, GenMessages, MessagesReaders } from "../../core";
5
4
  import type { LocalizedNodeKeys, TranslateHandlers, TranslateHook, TranslatorPlugin } from "intor-translator";
6
5
  export interface GetTranslatorParams {
7
6
  locale: string;
8
7
  handlers?: TranslateHandlers;
9
8
  plugins?: (TranslatorPlugin | TranslateHook)[];
10
- readOptions?: MessagesReadOptions;
9
+ readers?: MessagesReaders;
11
10
  allowCacheWrite?: boolean;
12
11
  }
13
12
  /**
@@ -7,12 +7,12 @@ import type { LocaleMessages } from "intor-translator";
7
7
  * It coordinates:
8
8
  *
9
9
  * - Locale resolution with fallbacks
10
- * - Process-level memoization (read by default, write by ownership)
11
10
  * - Concurrency control for file system access
11
+ * - Process-level memoization (read by default, write by ownership)
12
12
  *
13
13
  * Local messages are cached for the lifetime of the process.
14
14
  * Cache writes are restricted to the primary initialization flow.
15
15
  *
16
16
  * File traversal, parsing, and validation are delegated to lower-level utilities.
17
17
  */
18
- export declare const loadLocalMessages: ({ id, locale, fallbackLocales, namespaces, rootDir, concurrency, readOptions, pool, allowCacheWrite, loggerOptions, }: LoadLocalMessagesParams) => Promise<LocaleMessages | undefined>;
18
+ export declare const loadLocalMessages: ({ id, locale, fallbackLocales, namespaces, rootDir, concurrency, readers, pool, allowCacheWrite, loggerOptions, }: LoadLocalMessagesParams) => Promise<LocaleMessages | undefined>;