intor 2.3.27 → 2.3.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/dist/core/export/index.js +1 -1
  2. package/dist/core/export/server/index.js +6 -2
  3. package/dist/core/src/config/constants/cookie.js +0 -1
  4. package/dist/core/src/config/resolvers/resolve-fallback-locales.js +1 -0
  5. package/dist/core/src/config/resolvers/resolve-routing-options.js +1 -0
  6. package/dist/core/src/config/validators/validate-default-locale.js +1 -0
  7. package/dist/core/src/config/validators/validate-id.js +1 -0
  8. package/dist/core/src/config/validators/validate-supported-locales.js +1 -0
  9. package/dist/core/src/core/error/intor-error.js +0 -2
  10. package/dist/core/src/core/messages/load-remote-messages/collect-remote-resources.js +25 -0
  11. package/dist/core/src/core/messages/load-remote-messages/fetch-remote-resource.js +47 -0
  12. package/dist/core/src/core/messages/load-remote-messages/load-remote-messages.js +41 -27
  13. package/dist/core/src/core/messages/load-remote-messages/resolve-remote-resources.js +24 -0
  14. package/dist/core/src/routing/pathname/canonicalize-pathname.js +1 -0
  15. package/dist/core/src/routing/pathname/materialize-pathname.js +1 -0
  16. package/dist/core/src/routing/pathname/standardize-pathname.js +1 -0
  17. package/dist/core/src/server/helpers/get-translator.js +4 -8
  18. package/dist/core/src/server/intor/intor.js +8 -7
  19. package/dist/core/src/server/messages/load-local-messages/cache/messages-pool.js +17 -0
  20. package/dist/core/src/server/messages/load-local-messages/load-local-messages.js +2 -2
  21. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +1 -0
  22. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +4 -4
  23. package/dist/core/src/server/messages/load-messages.js +5 -5
  24. package/dist/core/src/server/translator/init-translator.js +36 -0
  25. package/dist/express/export/express/index.js +1 -1
  26. package/dist/express/src/adapters/express/helpers/get-translator.js +1 -1
  27. package/dist/express/src/adapters/express/middleware/{create-intor.js → create-intor-middleware.js} +3 -3
  28. package/dist/express/src/core/error/intor-error.js +1 -15
  29. package/dist/express/src/core/messages/load-remote-messages/collect-remote-resources.js +25 -0
  30. package/dist/express/src/core/messages/load-remote-messages/fetch-remote-resource.js +47 -0
  31. package/dist/express/src/core/messages/load-remote-messages/load-remote-messages.js +41 -27
  32. package/dist/express/src/core/messages/load-remote-messages/resolve-remote-resources.js +24 -0
  33. package/dist/express/src/routing/inbound/resolve-locale/resolve-locale.js +1 -0
  34. package/dist/express/src/routing/locale/get-locale-from-pathname.js +1 -0
  35. package/dist/express/src/routing/pathname/canonicalize-pathname.js +1 -0
  36. package/dist/express/src/routing/pathname/materialize-pathname.js +1 -0
  37. package/dist/express/src/routing/pathname/standardize-pathname.js +1 -0
  38. package/dist/express/src/server/helpers/get-translator.js +4 -8
  39. package/dist/express/src/server/messages/load-local-messages/cache/messages-pool.js +11 -0
  40. package/dist/express/src/server/messages/load-local-messages/load-local-messages.js +2 -2
  41. package/dist/express/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +1 -0
  42. package/dist/express/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +4 -4
  43. package/dist/express/src/server/messages/load-messages.js +5 -5
  44. package/dist/express/src/server/translator/init-translator.js +36 -0
  45. package/dist/next/src/adapters/next/navigation/redirect.js +1 -0
  46. package/dist/next/src/adapters/next/navigation/use-pathname.js +1 -0
  47. package/dist/next/src/adapters/next/proxy/intor-proxy.js +1 -0
  48. package/dist/next/src/adapters/next/server/get-locale.js +19 -4
  49. package/dist/next/src/adapters/next/server/get-pathname.js +1 -0
  50. package/dist/next/src/adapters/next/server/get-translator.js +1 -1
  51. package/dist/next/src/adapters/next/server/intor.js +4 -4
  52. package/dist/next/src/core/error/intor-error.js +1 -15
  53. package/dist/next/src/core/messages/load-remote-messages/collect-remote-resources.js +25 -0
  54. package/dist/next/src/core/messages/load-remote-messages/fetch-remote-resource.js +47 -0
  55. package/dist/next/src/core/messages/load-remote-messages/load-remote-messages.js +41 -27
  56. package/dist/next/src/core/messages/load-remote-messages/resolve-remote-resources.js +24 -0
  57. package/dist/next/src/policies/shoud-full-reload.js +1 -0
  58. package/dist/next/src/routing/inbound/resolve-locale/resolve-locale.js +1 -0
  59. package/dist/next/src/routing/locale/get-locale-from-pathname.js +1 -0
  60. package/dist/next/src/routing/pathname/canonicalize-pathname.js +1 -0
  61. package/dist/next/src/routing/pathname/materialize-pathname.js +1 -0
  62. package/dist/next/src/routing/pathname/standardize-pathname.js +1 -0
  63. package/dist/next/src/server/helpers/get-translator.js +4 -8
  64. package/dist/next/src/server/intor/intor.js +8 -7
  65. package/dist/next/src/server/messages/load-local-messages/cache/messages-pool.js +11 -0
  66. package/dist/next/src/server/messages/load-local-messages/load-local-messages.js +2 -2
  67. package/dist/next/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +1 -0
  68. package/dist/next/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +4 -4
  69. package/dist/next/src/server/messages/load-messages.js +5 -5
  70. package/dist/next/src/server/translator/init-translator.js +36 -0
  71. package/dist/react/src/client/react/helpers/use-intor.js +1 -0
  72. package/dist/react/src/client/react/navigation/use-execute-navigation.js +6 -5
  73. package/dist/react/src/client/react/navigation/use-resolve-navigation.js +1 -0
  74. package/dist/react/src/client/react/provider/effects/use-locale-effects.js +3 -3
  75. package/dist/react/src/client/shared/helpers/get-client-locale.js +1 -0
  76. package/dist/react/src/client/shared/messages/create-refetch-messages.js +1 -1
  77. package/dist/react/src/core/error/intor-error.js +0 -2
  78. package/dist/react/src/core/messages/load-remote-messages/collect-remote-resources.js +25 -0
  79. package/dist/react/src/core/messages/load-remote-messages/fetch-remote-resource.js +47 -0
  80. package/dist/react/src/core/messages/load-remote-messages/load-remote-messages.js +41 -27
  81. package/dist/react/src/core/messages/load-remote-messages/resolve-remote-resources.js +24 -0
  82. package/dist/react/src/core/messages/utils/nest-object-from-path.js +21 -0
  83. package/dist/react/src/policies/shoud-full-reload.js +1 -0
  84. package/dist/react/src/routing/pathname/canonicalize-pathname.js +1 -0
  85. package/dist/react/src/routing/pathname/materialize-pathname.js +1 -0
  86. package/dist/react/src/routing/pathname/standardize-pathname.js +1 -0
  87. package/dist/svelte/src/client/shared/helpers/get-client-locale.js +1 -0
  88. package/dist/svelte/src/client/shared/messages/create-refetch-messages.js +1 -1
  89. package/dist/svelte/src/client/svelte/helpers/create-intor.js +1 -0
  90. package/dist/svelte/src/client/svelte/store/effects/locale-effects.js +3 -3
  91. package/dist/svelte/src/core/error/intor-error.js +0 -2
  92. package/dist/svelte/src/core/messages/load-remote-messages/collect-remote-resources.js +25 -0
  93. package/dist/svelte/src/core/messages/load-remote-messages/fetch-remote-resource.js +47 -0
  94. package/dist/svelte/src/core/messages/load-remote-messages/load-remote-messages.js +41 -27
  95. package/dist/svelte/src/core/messages/load-remote-messages/resolve-remote-resources.js +24 -0
  96. package/dist/svelte/src/core/messages/utils/nest-object-from-path.js +21 -0
  97. package/dist/types/export/express/index.d.ts +1 -1
  98. package/dist/types/export/index.d.ts +1 -1
  99. package/dist/types/export/server/index.d.ts +1 -1
  100. package/dist/types/src/adapters/express/index.d.ts +1 -1
  101. package/dist/types/src/adapters/express/middleware/{create-intor.d.ts → create-intor-middleware.d.ts} +1 -1
  102. package/dist/types/src/adapters/express/middleware/index.d.ts +1 -1
  103. package/dist/types/src/adapters/next/server/get-locale.d.ts +1 -1
  104. package/dist/types/src/adapters/next/server/intor.d.ts +4 -1
  105. package/dist/types/src/config/types/cookie.d.ts +0 -2
  106. package/dist/types/src/config/types/loader.d.ts +4 -4
  107. package/dist/types/src/core/error/intor-error.d.ts +1 -2
  108. package/dist/types/src/core/index.d.ts +1 -1
  109. package/dist/types/src/core/messages/index.d.ts +1 -2
  110. package/dist/types/src/core/messages/load-remote-messages/collect-remote-resources.d.ts +19 -0
  111. package/dist/types/src/core/messages/load-remote-messages/fetch-remote-resource.d.ts +21 -0
  112. package/dist/types/src/core/messages/load-remote-messages/load-remote-messages.d.ts +7 -4
  113. package/dist/types/src/core/messages/load-remote-messages/resolve-remote-resources.d.ts +14 -0
  114. package/dist/types/src/core/messages/load-remote-messages/types.d.ts +1 -1
  115. package/dist/types/src/core/messages/types.d.ts +9 -6
  116. package/dist/types/src/core/messages/utils/index.d.ts +2 -0
  117. package/dist/types/src/policies/index.d.ts +0 -1
  118. package/dist/types/src/server/helpers/get-translator.d.ts +2 -2
  119. package/dist/types/src/server/helpers/index.d.ts +0 -1
  120. package/dist/types/src/server/index.d.ts +2 -2
  121. package/dist/types/src/server/intor/intor.d.ts +5 -3
  122. package/dist/types/src/server/messages/index.d.ts +2 -0
  123. package/dist/types/src/server/messages/load-local-messages/cache/index.d.ts +1 -0
  124. package/dist/types/src/server/messages/load-local-messages/cache/messages-pool.d.ts +16 -0
  125. package/dist/types/src/server/messages/load-local-messages/index.d.ts +1 -0
  126. package/dist/types/src/server/messages/load-local-messages/types.d.ts +2 -1
  127. package/dist/types/src/server/translator/create-translator.d.ts +3 -5
  128. package/dist/types/src/server/translator/index.d.ts +1 -1
  129. package/dist/types/src/server/translator/init-translator.d.ts +14 -0
  130. package/dist/vue/src/client/shared/helpers/get-client-locale.js +1 -0
  131. package/dist/vue/src/client/shared/messages/create-refetch-messages.js +1 -1
  132. package/dist/vue/src/client/vue/helpers/use-intor.js +1 -0
  133. package/dist/vue/src/client/vue/provider/effects/use-locale-effects.js +3 -3
  134. package/dist/vue/src/core/error/intor-error.js +0 -2
  135. package/dist/vue/src/core/messages/load-remote-messages/collect-remote-resources.js +25 -0
  136. package/dist/vue/src/core/messages/load-remote-messages/fetch-remote-resource.js +47 -0
  137. package/dist/vue/src/core/messages/load-remote-messages/load-remote-messages.js +41 -27
  138. package/dist/vue/src/core/messages/load-remote-messages/resolve-remote-resources.js +24 -0
  139. package/dist/vue/src/core/messages/utils/nest-object-from-path.js +21 -0
  140. package/package.json +1 -1
  141. package/dist/core/src/core/messages/global-messages-pool.js +0 -21
  142. package/dist/core/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +0 -55
  143. package/dist/core/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -25
  144. package/dist/core/src/server/helpers/local-messages-from-url.js +0 -53
  145. package/dist/core/src/server/runtime/create-intor-runtime.js +0 -56
  146. package/dist/express/src/core/messages/global-messages-pool.js +0 -16
  147. package/dist/express/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +0 -55
  148. package/dist/express/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -25
  149. package/dist/express/src/server/runtime/create-intor-runtime.js +0 -56
  150. package/dist/next/src/core/messages/global-messages-pool.js +0 -16
  151. package/dist/next/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +0 -55
  152. package/dist/next/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -25
  153. package/dist/next/src/server/runtime/create-intor-runtime.js +0 -56
  154. package/dist/react/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +0 -55
  155. package/dist/react/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -25
  156. package/dist/react/src/policies/should-persist.js +0 -8
  157. package/dist/svelte/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +0 -55
  158. package/dist/svelte/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -25
  159. package/dist/svelte/src/policies/should-persist.js +0 -8
  160. package/dist/types/src/core/messages/global-messages-pool.d.ts +0 -25
  161. package/dist/types/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.d.ts +0 -9
  162. package/dist/types/src/core/messages/load-remote-messages/fetch-locale-messages/index.d.ts +0 -1
  163. package/dist/types/src/core/messages/load-remote-messages/fetch-locale-messages/types.d.ts +0 -12
  164. package/dist/types/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.d.ts +0 -5
  165. package/dist/types/src/policies/should-persist.d.ts +0 -7
  166. package/dist/types/src/server/helpers/local-messages-from-url.d.ts +0 -21
  167. package/dist/types/src/server/runtime/create-intor-runtime.d.ts +0 -12
  168. package/dist/types/src/server/runtime/index.d.ts +0 -2
  169. package/dist/types/src/server/runtime/types.d.ts +0 -21
  170. package/dist/vue/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +0 -55
  171. package/dist/vue/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -25
  172. package/dist/vue/src/policies/should-persist.js +0 -8
  173. /package/dist/core/src/{server/messages/load-local-messages/read-locale-messages/parse-file-entries → core/messages}/utils/nest-object-from-path.js +0 -0
  174. /package/dist/express/src/{server/messages/load-local-messages/read-locale-messages/parse-file-entries → core/messages}/utils/nest-object-from-path.js +0 -0
  175. /package/dist/next/src/{server/messages/load-local-messages/read-locale-messages/parse-file-entries → core/messages}/utils/nest-object-from-path.js +0 -0
  176. /package/dist/types/src/{server/messages/load-local-messages/read-locale-messages/parse-file-entries → core/messages}/utils/nest-object-from-path.d.ts +0 -0
@@ -1,25 +0,0 @@
1
- /**
2
- * Build URLSearchParams from an object.
3
- * Supports string or string[] values. Ignores undefined/null.
4
- */
5
- const buildSearchParams = (params) => {
6
- const searchParams = new URLSearchParams();
7
- const appendParam = (key, value) => {
8
- if (value === undefined || value === null)
9
- return;
10
- if (Array.isArray(value) && value.length === 0)
11
- return;
12
- if (Array.isArray(value)) {
13
- value.forEach((v) => v && searchParams.append(key, v));
14
- }
15
- else {
16
- searchParams.append(key, value);
17
- }
18
- };
19
- Object.entries(params).forEach(([key, value]) => {
20
- appendParam(key, value);
21
- });
22
- return searchParams;
23
- };
24
-
25
- export { buildSearchParams };
@@ -1,53 +0,0 @@
1
- import { loadLocalMessages } from '../messages/load-local-messages/load-local-messages.js';
2
-
3
- /** Parse a multi-value query parameter into a normalized string array. */
4
- function parseMultiValueParam(values) {
5
- if (!values || values.length === 0)
6
- return undefined;
7
- const result = values.flatMap((value) => value
8
- .split(",")
9
- .map((v) => v.trim())
10
- .filter(Boolean));
11
- return result.length > 0 ? result : undefined;
12
- }
13
- /**
14
- * Load locale messages from a URL-based query protocol.
15
- *
16
- * - This helper is intended for building custom HTTP endpoints
17
- *
18
- * @example
19
- * ```ts
20
- * const url = new URL(
21
- * "https://example.com/messages" +
22
- * "?locale=en-US" +
23
- * "&rootDir=./messages" +
24
- * "&namespaces=common" +
25
- * "&namespaces=homepage" +
26
- * "&fallbackLocales=zh-TW"
27
- * );
28
- *
29
- * const messages = await loadMessagesFromUrl(url);
30
- * ```
31
- */
32
- async function loadMessagesFromUrl(url, options) {
33
- // Parse query parameters
34
- const rootDir = url.searchParams.get("rootDir") ?? "";
35
- const locale = url.searchParams.get("locale") ?? "en-US";
36
- const namespaces = parseMultiValueParam(url.searchParams.getAll("namespaces"));
37
- const fallbackLocales = parseMultiValueParam(url.searchParams.getAll("fallbackLocales"));
38
- // Load local messages
39
- return loadLocalMessages({
40
- id: options?.id || "default",
41
- rootDir,
42
- locale,
43
- namespaces,
44
- fallbackLocales,
45
- concurrency: options?.concurrency,
46
- readers: options?.readers,
47
- pool: options?.pool,
48
- allowCacheWrite: options?.allowCacheWrite,
49
- loggerOptions: options?.loggerOptions || { id: "default" },
50
- });
51
- }
52
-
53
- export { loadMessagesFromUrl };
@@ -1,56 +0,0 @@
1
- import { IntorError, IntorErrorCode } from '../../core/error/intor-error.js';
2
- import { resolveLoaderOptions } from '../../core/utils/resolve-loader-options.js';
3
- import 'logry';
4
- import { loadMessages } from '../messages/load-messages.js';
5
- import { createTranslator } from '../translator/create-translator.js';
6
-
7
- /**
8
- * Create a server-side Intor runtime.
9
- *
10
- * - The runtime represents a request-scoped execution context.
11
- * - It enforces a strict initialization protocol:
12
- * `ensureMessages(locale) → getTranslator(locale)`
13
- * - Messages may be empty, but the ensure step must be completed
14
- * before a translator snapshot can be created.
15
- */
16
- function createIntorRuntime(config, options) {
17
- const loader = resolveLoaderOptions(config, "server");
18
- // Locale that has completed the ensureMessages() phase
19
- let ensuredLocale;
20
- // Messages prepared during ensureMessages(); may be empty
21
- let ensuredMessages;
22
- return {
23
- async ensureMessages(locale) {
24
- let messages;
25
- if (loader) {
26
- messages = await loadMessages({
27
- config,
28
- locale,
29
- readers: options?.readers,
30
- allowCacheWrite: options?.allowCacheWrite || false,
31
- });
32
- }
33
- ensuredLocale = locale;
34
- ensuredMessages = messages || {};
35
- },
36
- translator(locale, options) {
37
- // Guard: translator requires ensureMessages() to be completed for this locale
38
- if (locale !== ensuredLocale) {
39
- throw new IntorError({
40
- message: "translator() called before ensureMessages()",
41
- code: IntorErrorCode.RUNTIME_NOT_INITIALIZED,
42
- });
43
- }
44
- return createTranslator({
45
- config,
46
- locale,
47
- messages: ensuredMessages || {},
48
- preKey: options?.preKey,
49
- handlers: options?.handlers,
50
- plugins: options?.plugins,
51
- });
52
- },
53
- };
54
- }
55
-
56
- export { createIntorRuntime };
@@ -1,16 +0,0 @@
1
- /**
2
- * Get the global messages pool.
3
- *
4
- * Lazily initialized to ensure:
5
- * - Cross-module sharing
6
- * - Dev / HMR safety
7
- */
8
- function getGlobalMessagesPool() {
9
- if (!globalThis.__INTOR_MESSAGES_POOL__) {
10
- const pool = new Map();
11
- globalThis.__INTOR_MESSAGES_POOL__ = pool;
12
- }
13
- return globalThis.__INTOR_MESSAGES_POOL__;
14
- }
15
-
16
- export { getGlobalMessagesPool };
@@ -1,55 +0,0 @@
1
- import { getLogger } from '../../../logger/get-logger.js';
2
- import { isValidMessages } from '../../utils/is-valid-messages.js';
3
- import { buildSearchParams } from './utils/build-search-params.js';
4
-
5
- /**
6
- * Fetches locale messages from a remote API.
7
- *
8
- * - Validates that the returned JSON matches the expected `NamespaceMessages` structure.
9
- * - Uses `fetch` with `no-store` cache to always get fresh data.
10
- */
11
- const fetchLocaleMessages = async ({ locale, namespaces, rootDir, url: rawUrl, headers: rawHeaders, signal, extraOptions: { loggerOptions }, }) => {
12
- const baseLogger = getLogger(loggerOptions);
13
- const logger = baseLogger.child({ scope: "fetch-locale-messages" });
14
- const searchParams = buildSearchParams({ locale, rootDir, namespaces });
15
- const url = `${rawUrl}?${searchParams.toString()}`;
16
- try {
17
- // Headers
18
- const headers = {
19
- "Content-Type": "application/json",
20
- ...rawHeaders,
21
- };
22
- // Fetch
23
- const response = await fetch(url, {
24
- method: "GET",
25
- headers: headers,
26
- cache: "no-store",
27
- signal,
28
- });
29
- if (!response.ok) {
30
- throw new Error(`HTTP error ${response.status} ${response.statusText}`);
31
- }
32
- // Parse JSON body
33
- const data = (await response.json());
34
- // Validate messages structure
35
- if (!isValidMessages(data[locale])) {
36
- throw new Error("JSON file does not match NamespaceMessages structure");
37
- }
38
- return data;
39
- }
40
- catch (error) {
41
- if (error instanceof Error && error.name === "AbortError") {
42
- logger.debug("Fetching locale messages aborted.", { locale, url });
43
- return;
44
- }
45
- logger.warn("Fetching locale messages failed.", {
46
- locale,
47
- url,
48
- searchParams: decodeURIComponent(searchParams.toString()),
49
- error,
50
- });
51
- return;
52
- }
53
- };
54
-
55
- export { fetchLocaleMessages };
@@ -1,25 +0,0 @@
1
- /**
2
- * Build URLSearchParams from an object.
3
- * Supports string or string[] values. Ignores undefined/null.
4
- */
5
- const buildSearchParams = (params) => {
6
- const searchParams = new URLSearchParams();
7
- const appendParam = (key, value) => {
8
- if (value === undefined || value === null)
9
- return;
10
- if (Array.isArray(value) && value.length === 0)
11
- return;
12
- if (Array.isArray(value)) {
13
- value.forEach((v) => v && searchParams.append(key, v));
14
- }
15
- else {
16
- searchParams.append(key, value);
17
- }
18
- };
19
- Object.entries(params).forEach(([key, value]) => {
20
- appendParam(key, value);
21
- });
22
- return searchParams;
23
- };
24
-
25
- export { buildSearchParams };
@@ -1,56 +0,0 @@
1
- import { IntorError, IntorErrorCode } from '../../core/error/intor-error.js';
2
- import { resolveLoaderOptions } from '../../core/utils/resolve-loader-options.js';
3
- import 'logry';
4
- import { loadMessages } from '../messages/load-messages.js';
5
- import { createTranslator } from '../translator/create-translator.js';
6
-
7
- /**
8
- * Create a server-side Intor runtime.
9
- *
10
- * - The runtime represents a request-scoped execution context.
11
- * - It enforces a strict initialization protocol:
12
- * `ensureMessages(locale) → getTranslator(locale)`
13
- * - Messages may be empty, but the ensure step must be completed
14
- * before a translator snapshot can be created.
15
- */
16
- function createIntorRuntime(config, options) {
17
- const loader = resolveLoaderOptions(config);
18
- // Locale that has completed the ensureMessages() phase
19
- let ensuredLocale;
20
- // Messages prepared during ensureMessages(); may be empty
21
- let ensuredMessages;
22
- return {
23
- async ensureMessages(locale) {
24
- let messages;
25
- if (loader) {
26
- messages = await loadMessages({
27
- config,
28
- locale,
29
- readers: options?.readers,
30
- allowCacheWrite: options?.allowCacheWrite || false,
31
- });
32
- }
33
- ensuredLocale = locale;
34
- ensuredMessages = messages || {};
35
- },
36
- translator(locale, options) {
37
- // Guard: translator requires ensureMessages() to be completed for this locale
38
- if (locale !== ensuredLocale) {
39
- throw new IntorError({
40
- message: "translator() called before ensureMessages()",
41
- code: IntorErrorCode.RUNTIME_NOT_INITIALIZED,
42
- });
43
- }
44
- return createTranslator({
45
- config,
46
- locale,
47
- messages: ensuredMessages || {},
48
- preKey: options?.preKey,
49
- handlers: options?.handlers,
50
- plugins: options?.plugins,
51
- });
52
- },
53
- };
54
- }
55
-
56
- export { createIntorRuntime };
@@ -1,16 +0,0 @@
1
- /**
2
- * Get the global messages pool.
3
- *
4
- * Lazily initialized to ensure:
5
- * - Cross-module sharing
6
- * - Dev / HMR safety
7
- */
8
- function getGlobalMessagesPool() {
9
- if (!globalThis.__INTOR_MESSAGES_POOL__) {
10
- const pool = new Map();
11
- globalThis.__INTOR_MESSAGES_POOL__ = pool;
12
- }
13
- return globalThis.__INTOR_MESSAGES_POOL__;
14
- }
15
-
16
- export { getGlobalMessagesPool };
@@ -1,55 +0,0 @@
1
- import { getLogger } from '../../../logger/get-logger.js';
2
- import { isValidMessages } from '../../utils/is-valid-messages.js';
3
- import { buildSearchParams } from './utils/build-search-params.js';
4
-
5
- /**
6
- * Fetches locale messages from a remote API.
7
- *
8
- * - Validates that the returned JSON matches the expected `NamespaceMessages` structure.
9
- * - Uses `fetch` with `no-store` cache to always get fresh data.
10
- */
11
- const fetchLocaleMessages = async ({ locale, namespaces, rootDir, url: rawUrl, headers: rawHeaders, signal, extraOptions: { loggerOptions }, }) => {
12
- const baseLogger = getLogger(loggerOptions);
13
- const logger = baseLogger.child({ scope: "fetch-locale-messages" });
14
- const searchParams = buildSearchParams({ locale, rootDir, namespaces });
15
- const url = `${rawUrl}?${searchParams.toString()}`;
16
- try {
17
- // Headers
18
- const headers = {
19
- "Content-Type": "application/json",
20
- ...rawHeaders,
21
- };
22
- // Fetch
23
- const response = await fetch(url, {
24
- method: "GET",
25
- headers: headers,
26
- cache: "no-store",
27
- signal,
28
- });
29
- if (!response.ok) {
30
- throw new Error(`HTTP error ${response.status} ${response.statusText}`);
31
- }
32
- // Parse JSON body
33
- const data = (await response.json());
34
- // Validate messages structure
35
- if (!isValidMessages(data[locale])) {
36
- throw new Error("JSON file does not match NamespaceMessages structure");
37
- }
38
- return data;
39
- }
40
- catch (error) {
41
- if (error instanceof Error && error.name === "AbortError") {
42
- logger.debug("Fetching locale messages aborted.", { locale, url });
43
- return;
44
- }
45
- logger.warn("Fetching locale messages failed.", {
46
- locale,
47
- url,
48
- searchParams: decodeURIComponent(searchParams.toString()),
49
- error,
50
- });
51
- return;
52
- }
53
- };
54
-
55
- export { fetchLocaleMessages };
@@ -1,25 +0,0 @@
1
- /**
2
- * Build URLSearchParams from an object.
3
- * Supports string or string[] values. Ignores undefined/null.
4
- */
5
- const buildSearchParams = (params) => {
6
- const searchParams = new URLSearchParams();
7
- const appendParam = (key, value) => {
8
- if (value === undefined || value === null)
9
- return;
10
- if (Array.isArray(value) && value.length === 0)
11
- return;
12
- if (Array.isArray(value)) {
13
- value.forEach((v) => v && searchParams.append(key, v));
14
- }
15
- else {
16
- searchParams.append(key, value);
17
- }
18
- };
19
- Object.entries(params).forEach(([key, value]) => {
20
- appendParam(key, value);
21
- });
22
- return searchParams;
23
- };
24
-
25
- export { buildSearchParams };
@@ -1,56 +0,0 @@
1
- import { IntorError, IntorErrorCode } from '../../core/error/intor-error.js';
2
- import { resolveLoaderOptions } from '../../core/utils/resolve-loader-options.js';
3
- import 'logry';
4
- import { loadMessages } from '../messages/load-messages.js';
5
- import { createTranslator } from '../translator/create-translator.js';
6
-
7
- /**
8
- * Create a server-side Intor runtime.
9
- *
10
- * - The runtime represents a request-scoped execution context.
11
- * - It enforces a strict initialization protocol:
12
- * `ensureMessages(locale) → getTranslator(locale)`
13
- * - Messages may be empty, but the ensure step must be completed
14
- * before a translator snapshot can be created.
15
- */
16
- function createIntorRuntime(config, options) {
17
- const loader = resolveLoaderOptions(config, "server");
18
- // Locale that has completed the ensureMessages() phase
19
- let ensuredLocale;
20
- // Messages prepared during ensureMessages(); may be empty
21
- let ensuredMessages;
22
- return {
23
- async ensureMessages(locale) {
24
- let messages;
25
- if (loader) {
26
- messages = await loadMessages({
27
- config,
28
- locale,
29
- readers: options?.readers,
30
- allowCacheWrite: options?.allowCacheWrite || false,
31
- });
32
- }
33
- ensuredLocale = locale;
34
- ensuredMessages = messages || {};
35
- },
36
- translator(locale, options) {
37
- // Guard: translator requires ensureMessages() to be completed for this locale
38
- if (locale !== ensuredLocale) {
39
- throw new IntorError({
40
- message: "translator() called before ensureMessages()",
41
- code: IntorErrorCode.RUNTIME_NOT_INITIALIZED,
42
- });
43
- }
44
- return createTranslator({
45
- config,
46
- locale,
47
- messages: ensuredMessages || {},
48
- preKey: options?.preKey,
49
- handlers: options?.handlers,
50
- plugins: options?.plugins,
51
- });
52
- },
53
- };
54
- }
55
-
56
- export { createIntorRuntime };
@@ -1,55 +0,0 @@
1
- import { getLogger } from '../../../logger/get-logger.js';
2
- import { isValidMessages } from '../../utils/is-valid-messages.js';
3
- import { buildSearchParams } from './utils/build-search-params.js';
4
-
5
- /**
6
- * Fetches locale messages from a remote API.
7
- *
8
- * - Validates that the returned JSON matches the expected `NamespaceMessages` structure.
9
- * - Uses `fetch` with `no-store` cache to always get fresh data.
10
- */
11
- const fetchLocaleMessages = async ({ locale, namespaces, rootDir, url: rawUrl, headers: rawHeaders, signal, extraOptions: { loggerOptions }, }) => {
12
- const baseLogger = getLogger(loggerOptions);
13
- const logger = baseLogger.child({ scope: "fetch-locale-messages" });
14
- const searchParams = buildSearchParams({ locale, rootDir, namespaces });
15
- const url = `${rawUrl}?${searchParams.toString()}`;
16
- try {
17
- // Headers
18
- const headers = {
19
- "Content-Type": "application/json",
20
- ...rawHeaders,
21
- };
22
- // Fetch
23
- const response = await fetch(url, {
24
- method: "GET",
25
- headers: headers,
26
- cache: "no-store",
27
- signal,
28
- });
29
- if (!response.ok) {
30
- throw new Error(`HTTP error ${response.status} ${response.statusText}`);
31
- }
32
- // Parse JSON body
33
- const data = (await response.json());
34
- // Validate messages structure
35
- if (!isValidMessages(data[locale])) {
36
- throw new Error("JSON file does not match NamespaceMessages structure");
37
- }
38
- return data;
39
- }
40
- catch (error) {
41
- if (error instanceof Error && error.name === "AbortError") {
42
- logger.debug("Fetching locale messages aborted.", { locale, url });
43
- return;
44
- }
45
- logger.warn("Fetching locale messages failed.", {
46
- locale,
47
- url,
48
- searchParams: decodeURIComponent(searchParams.toString()),
49
- error,
50
- });
51
- return;
52
- }
53
- };
54
-
55
- export { fetchLocaleMessages };
@@ -1,25 +0,0 @@
1
- /**
2
- * Build URLSearchParams from an object.
3
- * Supports string or string[] values. Ignores undefined/null.
4
- */
5
- const buildSearchParams = (params) => {
6
- const searchParams = new URLSearchParams();
7
- const appendParam = (key, value) => {
8
- if (value === undefined || value === null)
9
- return;
10
- if (Array.isArray(value) && value.length === 0)
11
- return;
12
- if (Array.isArray(value)) {
13
- value.forEach((v) => v && searchParams.append(key, v));
14
- }
15
- else {
16
- searchParams.append(key, value);
17
- }
18
- };
19
- Object.entries(params).forEach(([key, value]) => {
20
- appendParam(key, value);
21
- });
22
- return searchParams;
23
- };
24
-
25
- export { buildSearchParams };
@@ -1,8 +0,0 @@
1
- /**
2
- * Determine whether locale persistence is enabled.
3
- */
4
- function shouldPersist(cookie) {
5
- return cookie.enabled && cookie.persist;
6
- }
7
-
8
- export { shouldPersist };
@@ -1,55 +0,0 @@
1
- import { getLogger } from '../../../logger/get-logger.js';
2
- import { isValidMessages } from '../../utils/is-valid-messages.js';
3
- import { buildSearchParams } from './utils/build-search-params.js';
4
-
5
- /**
6
- * Fetches locale messages from a remote API.
7
- *
8
- * - Validates that the returned JSON matches the expected `NamespaceMessages` structure.
9
- * - Uses `fetch` with `no-store` cache to always get fresh data.
10
- */
11
- const fetchLocaleMessages = async ({ locale, namespaces, rootDir, url: rawUrl, headers: rawHeaders, signal, extraOptions: { loggerOptions }, }) => {
12
- const baseLogger = getLogger(loggerOptions);
13
- const logger = baseLogger.child({ scope: "fetch-locale-messages" });
14
- const searchParams = buildSearchParams({ locale, rootDir, namespaces });
15
- const url = `${rawUrl}?${searchParams.toString()}`;
16
- try {
17
- // Headers
18
- const headers = {
19
- "Content-Type": "application/json",
20
- ...rawHeaders,
21
- };
22
- // Fetch
23
- const response = await fetch(url, {
24
- method: "GET",
25
- headers: headers,
26
- cache: "no-store",
27
- signal,
28
- });
29
- if (!response.ok) {
30
- throw new Error(`HTTP error ${response.status} ${response.statusText}`);
31
- }
32
- // Parse JSON body
33
- const data = (await response.json());
34
- // Validate messages structure
35
- if (!isValidMessages(data[locale])) {
36
- throw new Error("JSON file does not match NamespaceMessages structure");
37
- }
38
- return data;
39
- }
40
- catch (error) {
41
- if (error instanceof Error && error.name === "AbortError") {
42
- logger.debug("Fetching locale messages aborted.", { locale, url });
43
- return;
44
- }
45
- logger.warn("Fetching locale messages failed.", {
46
- locale,
47
- url,
48
- searchParams: decodeURIComponent(searchParams.toString()),
49
- error,
50
- });
51
- return;
52
- }
53
- };
54
-
55
- export { fetchLocaleMessages };
@@ -1,25 +0,0 @@
1
- /**
2
- * Build URLSearchParams from an object.
3
- * Supports string or string[] values. Ignores undefined/null.
4
- */
5
- const buildSearchParams = (params) => {
6
- const searchParams = new URLSearchParams();
7
- const appendParam = (key, value) => {
8
- if (value === undefined || value === null)
9
- return;
10
- if (Array.isArray(value) && value.length === 0)
11
- return;
12
- if (Array.isArray(value)) {
13
- value.forEach((v) => v && searchParams.append(key, v));
14
- }
15
- else {
16
- searchParams.append(key, value);
17
- }
18
- };
19
- Object.entries(params).forEach(([key, value]) => {
20
- appendParam(key, value);
21
- });
22
- return searchParams;
23
- };
24
-
25
- export { buildSearchParams };
@@ -1,8 +0,0 @@
1
- /**
2
- * Determine whether locale persistence is enabled.
3
- */
4
- function shouldPersist(cookie) {
5
- return cookie.enabled && cookie.persist;
6
- }
7
-
8
- export { shouldPersist };
@@ -1,25 +0,0 @@
1
- import type { LocaleMessages } from "intor-translator";
2
- /**
3
- * Global messages pool (process-level, hot-reload safe).
4
- *
5
- * This pool is intentionally minimal:
6
- * - No TTL
7
- * - No eviction
8
- * - No external backends
9
- *
10
- * Messages are treated as immutable within a process lifecycle.
11
- */
12
- export type MessagesPool = Map<string, LocaleMessages>;
13
- declare global {
14
- var __INTOR_MESSAGES_POOL__: MessagesPool | undefined;
15
- }
16
- /**
17
- * Get the global messages pool.
18
- *
19
- * Lazily initialized to ensure:
20
- * - Cross-module sharing
21
- * - Dev / HMR safety
22
- */
23
- export declare function getGlobalMessagesPool(): MessagesPool;
24
- /** Clear all cached messages. */
25
- export declare function clearMessagesPool(): void;
@@ -1,9 +0,0 @@
1
- import type { FetcherOptions } from "./types";
2
- import type { LocaleMessages } from "intor-translator";
3
- /**
4
- * Fetches locale messages from a remote API.
5
- *
6
- * - Validates that the returned JSON matches the expected `NamespaceMessages` structure.
7
- * - Uses `fetch` with `no-store` cache to always get fresh data.
8
- */
9
- export declare const fetchLocaleMessages: ({ locale, namespaces, rootDir, url: rawUrl, headers: rawHeaders, signal, extraOptions: { loggerOptions }, }: FetcherOptions) => Promise<LocaleMessages | undefined>;
@@ -1 +0,0 @@
1
- export { fetchLocaleMessages } from "./fetch-locale-messages";