intor 2.3.2 → 2.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/dist/export/config/index.d.ts +1 -0
- package/dist/export/config/index.js +1 -0
- package/dist/export/index.d.ts +4 -0
- package/dist/export/index.js +4 -0
- package/dist/export/internal/index.d.ts +1 -0
- package/dist/export/next/index.d.ts +1 -0
- package/dist/export/next/index.js +4 -0
- package/dist/export/next/proxy/index.d.ts +1 -0
- package/dist/{exports → export}/next/proxy/index.js +0 -1
- package/dist/export/next/server/index.d.ts +1 -0
- package/dist/export/next/server/index.js +2 -0
- package/dist/export/react/index.d.ts +1 -0
- package/dist/export/react/index.js +10 -0
- package/dist/export/server/index.d.ts +1 -0
- package/dist/export/server/index.js +7 -0
- package/dist/src/adapters/next/navigation/link.d.ts +17 -7
- package/dist/src/adapters/next/navigation/link.js +35 -9
- package/dist/src/adapters/next/navigation/redirect.d.ts +10 -8
- package/dist/src/adapters/next/navigation/redirect.js +19 -18
- package/dist/src/adapters/next/navigation/use-pathname.d.ts +5 -5
- package/dist/src/adapters/next/navigation/use-pathname.js +7 -20
- package/dist/src/adapters/next/navigation/use-router.d.ts +15 -10
- package/dist/src/adapters/next/navigation/use-router.js +51 -17
- package/dist/src/adapters/next/proxy/index.d.ts +0 -1
- package/dist/src/adapters/next/proxy/intor-proxy.d.ts +10 -3
- package/dist/src/adapters/next/proxy/intor-proxy.js +38 -16
- package/dist/src/adapters/next/proxy/utils/set-locale-cookie-edge.d.ts +2 -4
- package/dist/src/adapters/next/proxy/utils/set-locale-cookie-edge.js +2 -7
- package/dist/src/adapters/next/server/get-locale.d.ts +6 -0
- package/dist/src/adapters/next/server/get-locale.js +25 -0
- package/dist/src/adapters/next/server/get-translator.d.ts +7 -5
- package/dist/src/adapters/next/server/get-translator.js +4 -4
- package/dist/src/adapters/next/server/index.d.ts +1 -1
- package/dist/src/client/helpers/get-client-locale.d.ts +11 -0
- package/dist/src/client/helpers/get-client-locale.js +24 -0
- package/dist/src/client/helpers/index.d.ts +1 -0
- package/dist/src/client/react/contexts/config/context.js +0 -1
- package/dist/src/client/react/contexts/config/hook.js +0 -1
- package/dist/src/client/react/contexts/config/provider.d.ts +1 -1
- package/dist/src/client/react/contexts/config/provider.js +5 -2
- package/dist/src/client/react/contexts/config/types.d.ts +6 -5
- package/dist/src/client/react/contexts/intor-provider/intor-provider.d.ts +1 -1
- package/dist/src/client/react/contexts/intor-provider/intor-provider.js +3 -3
- package/dist/src/client/react/contexts/intor-provider/types.d.ts +1 -2
- package/dist/src/client/react/contexts/locale/context.js +0 -1
- package/dist/src/client/react/contexts/locale/hook.js +0 -1
- package/dist/src/client/react/contexts/locale/provider.js +16 -26
- package/dist/src/client/react/contexts/locale/types.d.ts +4 -4
- package/dist/src/client/react/contexts/locale/utils/change-locale.d.ts +14 -16
- package/dist/src/client/react/contexts/locale/utils/change-locale.js +18 -27
- package/dist/src/client/react/contexts/messages/context.js +1 -4
- package/dist/src/client/react/contexts/messages/hook.js +0 -1
- package/dist/src/client/react/contexts/messages/provider.js +18 -11
- package/dist/src/client/react/contexts/messages/types.d.ts +4 -7
- package/dist/src/client/react/contexts/messages/utils/use-refetch-messages.d.ts +10 -6
- package/dist/src/client/react/contexts/messages/utils/use-refetch-messages.js +44 -31
- package/dist/src/client/react/contexts/translator/context.js +1 -4
- package/dist/src/client/react/contexts/translator/hook.d.ts +1 -2
- package/dist/src/client/react/contexts/translator/hook.js +0 -1
- package/dist/src/client/react/contexts/translator/provider.js +21 -24
- package/dist/src/client/react/contexts/translator/types.d.ts +5 -5
- package/dist/src/client/react/contexts/translator-runtime/context.d.ts +3 -0
- package/dist/src/client/react/contexts/translator-runtime/context.js +3 -0
- package/dist/src/client/react/contexts/translator-runtime/hook.d.ts +2 -0
- package/dist/src/client/react/contexts/translator-runtime/hook.js +9 -0
- package/dist/src/client/react/contexts/translator-runtime/index.d.ts +3 -0
- package/dist/src/client/react/contexts/translator-runtime/provider.d.ts +2 -0
- package/dist/src/client/react/contexts/translator-runtime/provider.js +15 -0
- package/dist/src/client/react/contexts/translator-runtime/types.d.ts +13 -0
- package/dist/src/client/react/index.d.ts +4 -3
- package/dist/src/client/react/navigation/index.d.ts +2 -0
- package/dist/src/client/react/navigation/use-navigation-strategy.d.ts +22 -0
- package/dist/src/client/react/navigation/use-navigation-strategy.js +37 -0
- package/dist/src/client/react/navigation/use-navigation-target.d.ts +12 -0
- package/dist/src/client/react/navigation/use-navigation-target.js +27 -0
- package/dist/src/client/react/{hooks → translator}/use-translator.d.ts +4 -4
- package/dist/src/client/react/{hooks → translator}/use-translator.js +4 -9
- package/dist/src/client/shared/utils/build-cookie-string.d.ts +5 -0
- package/dist/src/client/shared/utils/build-cookie-string.js +30 -0
- package/dist/src/client/shared/utils/index.d.ts +1 -0
- package/dist/src/client/shared/utils/locale/detect-browser-locale.d.ts +6 -0
- package/dist/src/client/shared/utils/locale/detect-browser-locale.js +12 -0
- package/dist/src/client/shared/utils/locale/get-locale-cookie-browser.d.ts +6 -0
- package/dist/src/client/shared/utils/locale/get-locale-cookie-browser.js +16 -0
- package/dist/src/client/shared/utils/locale/index.d.ts +4 -0
- package/dist/src/client/shared/utils/locale/set-document-locale.d.ts +6 -0
- package/dist/src/client/shared/utils/locale/set-document-locale.js +12 -0
- package/dist/src/client/shared/utils/locale/set-locale-cookie-browser.d.ts +7 -0
- package/dist/src/client/shared/utils/locale/set-locale-cookie-browser.js +18 -0
- package/dist/src/config/constants/cookie.constants.js +2 -2
- package/dist/src/config/constants/routing.constants.js +6 -0
- package/dist/src/config/define-intor-config.d.ts +16 -0
- package/dist/src/config/define-intor-config.js +18 -4
- package/dist/src/config/index.d.ts +0 -3
- package/dist/src/config/resolvers/resolve-cookie-options.d.ts +0 -9
- package/dist/src/config/resolvers/resolve-cookie-options.js +0 -9
- package/dist/src/config/resolvers/resolve-fallback-locales.d.ts +18 -1
- package/dist/src/config/resolvers/resolve-fallback-locales.js +17 -0
- package/dist/src/config/resolvers/resolve-routing-options.d.ts +0 -11
- package/dist/src/config/resolvers/resolve-routing-options.js +5 -13
- package/dist/src/config/types/cache.types.d.ts +2 -2
- package/dist/src/config/types/cookie.types.d.ts +10 -10
- package/dist/src/config/types/intor-config.types.d.ts +2 -0
- package/dist/src/config/types/loader.types.d.ts +15 -19
- package/dist/src/config/types/logger.types.d.ts +7 -5
- package/dist/src/config/types/routing.types.d.ts +33 -9
- package/dist/src/config/types/translator.types.d.ts +5 -2
- package/dist/src/config/validators/validate-default-locale.d.ts +9 -0
- package/dist/src/config/validators/validate-default-locale.js +9 -0
- package/dist/src/config/validators/validate-supported-locales.d.ts +8 -3
- package/dist/src/config/validators/validate-supported-locales.js +8 -3
- package/dist/src/routing/index.d.ts +1 -0
- package/dist/src/routing/locale/index.d.ts +1 -0
- package/dist/src/routing/locale/resolve-locale.d.ts +16 -0
- package/dist/src/routing/locale/resolve-locale.js +32 -0
- package/dist/src/routing/locale/types.d.ts +36 -0
- package/dist/src/routing/pathname/index.d.ts +1 -0
- package/dist/src/routing/pathname/resolve-pathname.d.ts +19 -0
- package/dist/src/routing/pathname/resolve-pathname.js +53 -0
- package/dist/src/routing/pathname/strategies/all.d.ts +6 -0
- package/dist/src/routing/pathname/strategies/all.js +23 -0
- package/dist/src/routing/pathname/strategies/except-default.d.ts +6 -0
- package/dist/src/routing/pathname/strategies/except-default.js +33 -0
- package/dist/src/routing/pathname/strategies/index.d.ts +3 -0
- package/dist/src/routing/pathname/strategies/none.d.ts +5 -0
- package/dist/src/routing/pathname/strategies/none.js +14 -0
- package/dist/src/routing/pathname/types.d.ts +28 -0
- package/dist/src/routing/resolve-navigation-target.d.ts +20 -0
- package/dist/src/routing/resolve-navigation-target.js +28 -0
- package/dist/src/routing/resolve-routing.d.ts +30 -0
- package/dist/src/routing/resolve-routing.js +38 -0
- package/dist/src/server/helpers/index.d.ts +1 -0
- package/dist/src/server/helpers/local-messages-from-url.d.ts +21 -0
- package/dist/src/server/helpers/local-messages-from-url.js +48 -0
- package/dist/src/server/index.d.ts +4 -2
- package/dist/src/server/intor/index.d.ts +1 -1
- package/dist/src/server/intor/intor.d.ts +12 -6
- package/dist/src/server/intor/intor.js +21 -39
- package/dist/src/server/intor/types.d.ts +5 -10
- package/dist/src/server/messages/index.d.ts +1 -5
- package/dist/src/server/messages/load-local-messages/index.d.ts +1 -1
- package/dist/src/server/messages/load-local-messages/load-local-messages.d.ts +11 -7
- package/dist/src/server/messages/load-local-messages/load-local-messages.js +46 -38
- package/dist/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.d.ts +5 -14
- package/dist/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +12 -29
- package/dist/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/types.d.ts +1 -1
- package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.d.ts +2 -2
- package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +8 -5
- package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/types.d.ts +1 -1
- package/dist/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.d.ts +2 -2
- package/dist/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +3 -3
- package/dist/src/server/messages/load-local-messages/read-locale-messages/types.d.ts +1 -1
- package/dist/src/server/messages/load-local-messages/types.d.ts +12 -11
- package/dist/src/server/messages/load-messages.d.ts +10 -7
- package/dist/src/server/messages/load-messages.js +21 -21
- package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.d.ts +1 -1
- package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +6 -1
- package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/types.d.ts +1 -0
- package/dist/src/server/messages/load-remote-messages/index.d.ts +1 -1
- package/dist/src/server/messages/load-remote-messages/load-remote-messages.d.ts +10 -4
- package/dist/src/server/messages/load-remote-messages/load-remote-messages.js +65 -34
- package/dist/src/server/messages/load-remote-messages/types.d.ts +4 -3
- package/dist/src/server/messages/types.d.ts +2 -3
- package/dist/src/server/shared/logger/get-logger.d.ts +1 -1
- package/dist/src/server/shared/logger/get-logger.js +10 -5
- package/dist/src/server/translator/get-translator.d.ts +9 -9
- package/dist/src/server/translator/get-translator.js +6 -10
- package/dist/src/shared/constants/index.d.ts +1 -0
- package/dist/src/shared/error/intor-error.d.ts +4 -4
- package/dist/src/shared/types/generated.d.ts +53 -0
- package/dist/src/shared/types/index.d.ts +2 -0
- package/dist/src/shared/types/routing.d.ts +6 -0
- package/dist/src/shared/types/{translator-instance.types.d.ts → translator-instance.d.ts} +17 -19
- package/dist/src/shared/utils/deep-merge.d.ts +8 -0
- package/dist/src/shared/utils/deep-merge.js +36 -0
- package/dist/src/shared/utils/index.d.ts +4 -8
- package/dist/src/shared/utils/is-external-destination.d.ts +7 -0
- package/dist/src/shared/utils/is-external-destination.js +11 -0
- package/dist/src/shared/utils/locale/get-locale-from-accept-language.d.ts +19 -0
- package/dist/src/shared/utils/locale/get-locale-from-accept-language.js +45 -0
- package/dist/src/shared/utils/locale/get-locale-from-host.d.ts +17 -0
- package/dist/src/shared/utils/locale/get-locale-from-host.js +31 -0
- package/dist/src/shared/utils/locale/get-locale-from-pathname.d.ts +31 -0
- package/dist/src/shared/utils/locale/get-locale-from-pathname.js +52 -0
- package/dist/src/shared/utils/locale/get-locale-from-query.d.ts +20 -0
- package/dist/src/shared/utils/locale/get-locale-from-query.js +33 -0
- package/dist/src/shared/utils/locale/index.d.ts +4 -0
- package/dist/src/shared/utils/normalizers/index.d.ts +3 -0
- package/dist/src/shared/utils/normalizers/normalize-cache-key.d.ts +14 -0
- package/dist/src/shared/utils/{normalize-cache-key.js → normalizers/normalize-cache-key.js} +17 -1
- package/dist/src/shared/utils/normalizers/normalize-locale.d.ts +22 -0
- package/dist/src/shared/utils/{locale → normalizers}/normalize-locale.js +21 -4
- package/dist/src/shared/utils/{pathname → normalizers}/normalize-pathname.d.ts +1 -1
- package/dist/src/shared/utils/{pathname → normalizers}/normalize-pathname.js +1 -1
- package/dist/src/shared/utils/pathname/get-unprefixed-pathname.d.ts +14 -0
- package/dist/src/shared/utils/pathname/get-unprefixed-pathname.js +39 -0
- package/dist/src/shared/utils/pathname/index.d.ts +1 -0
- package/dist/src/shared/utils/pathname/locale-prefix-pathname.d.ts +16 -0
- package/dist/src/{adapters/next/shared/utils → shared/utils/pathname}/locale-prefix-pathname.js +17 -12
- package/dist/src/shared/utils/pathname/localize-pathname.d.ts +23 -0
- package/dist/src/shared/utils/pathname/localize-pathname.js +36 -0
- package/dist/src/shared/utils/pathname/standardize-pathname.d.ts +6 -11
- package/dist/src/shared/utils/pathname/standardize-pathname.js +8 -8
- package/package.json +74 -65
- package/dist/exports/config/index.d.ts +0 -2
- package/dist/exports/config/index.js +0 -4
- package/dist/exports/index.d.ts +0 -5
- package/dist/exports/index.js +0 -11
- package/dist/exports/next/index.d.ts +0 -3
- package/dist/exports/next/index.js +0 -9
- package/dist/exports/next/proxy/index.d.ts +0 -2
- package/dist/exports/next/server/index.d.ts +0 -2
- package/dist/exports/next/server/index.js +0 -2
- package/dist/exports/react/index.d.ts +0 -2
- package/dist/exports/react/index.js +0 -6
- package/dist/exports/server/index.d.ts +0 -2
- package/dist/exports/server/index.js +0 -7
- package/dist/src/adapters/next/navigation/utils/should-full-reload.d.ts +0 -7
- package/dist/src/adapters/next/navigation/utils/should-full-reload.js +0 -19
- package/dist/src/adapters/next/navigation/utils/use-locale-switch.d.ts +0 -16
- package/dist/src/adapters/next/navigation/utils/use-locale-switch.js +0 -58
- package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-all.d.ts +0 -12
- package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-all.js +0 -60
- package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-except-default.d.ts +0 -16
- package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-except-default.js +0 -81
- package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-none.d.ts +0 -10
- package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-none.js +0 -22
- package/dist/src/adapters/next/proxy/utils/create-response.d.ts +0 -17
- package/dist/src/adapters/next/proxy/utils/create-response.js +0 -42
- package/dist/src/adapters/next/proxy/utils/determine-initial-locale.d.ts +0 -8
- package/dist/src/adapters/next/proxy/utils/determine-initial-locale.js +0 -28
- package/dist/src/adapters/next/proxy/utils/set-pathname-header.d.ts +0 -12
- package/dist/src/adapters/next/proxy/utils/set-pathname-header.js +0 -13
- package/dist/src/adapters/next/server/get-i18n-context.d.ts +0 -9
- package/dist/src/adapters/next/server/get-i18n-context.js +0 -47
- package/dist/src/adapters/next/shared/constants/pathname-header-name.d.ts +0 -1
- package/dist/src/adapters/next/shared/constants/pathname-header-name.js +0 -4
- package/dist/src/adapters/next/shared/utils/locale-prefix-pathname.d.ts +0 -16
- package/dist/src/adapters/next/shared/utils/localize-pathname.d.ts +0 -18
- package/dist/src/adapters/next/shared/utils/localize-pathname.js +0 -36
- package/dist/src/client/react/contexts/locale/utils/use-init-locale-cookie.d.ts +0 -8
- package/dist/src/client/react/contexts/locale/utils/use-init-locale-cookie.js +0 -28
- package/dist/src/client/react/contexts/translate-handlers/context.d.ts +0 -2
- package/dist/src/client/react/contexts/translate-handlers/context.js +0 -6
- package/dist/src/client/react/contexts/translate-handlers/hook.d.ts +0 -2
- package/dist/src/client/react/contexts/translate-handlers/hook.js +0 -10
- package/dist/src/client/react/contexts/translate-handlers/index.d.ts +0 -3
- package/dist/src/client/react/contexts/translate-handlers/provider.d.ts +0 -2
- package/dist/src/client/react/contexts/translate-handlers/provider.js +0 -11
- package/dist/src/client/react/contexts/translate-handlers/types.d.ts +0 -7
- package/dist/src/client/shared/utils/get-initial-locale.d.ts +0 -11
- package/dist/src/client/shared/utils/get-initial-locale.js +0 -21
- package/dist/src/shared/types/generated.types.d.ts +0 -30
- package/dist/src/shared/utils/client/build-cookie-string.d.ts +0 -9
- package/dist/src/shared/utils/client/build-cookie-string.js +0 -33
- package/dist/src/shared/utils/client/set-locale-cookie-browser.d.ts +0 -13
- package/dist/src/shared/utils/client/set-locale-cookie-browser.js +0 -21
- package/dist/src/shared/utils/locale/normalize-locale.d.ts +0 -4
- package/dist/src/shared/utils/locale/resolve-preferred-locale.d.ts +0 -5
- package/dist/src/shared/utils/locale/resolve-preferred-locale.js +0 -26
- package/dist/src/shared/utils/merge-messages.d.ts +0 -6
- package/dist/src/shared/utils/merge-messages.js +0 -13
- package/dist/src/shared/utils/normalize-cache-key.d.ts +0 -3
- package/dist/src/shared/utils/pathname/extract-pathname.d.ts +0 -28
- package/dist/src/shared/utils/pathname/extract-pathname.js +0 -58
- package/dist/src/shared/utils/resolve-namespaces.d.ts +0 -10
- package/dist/src/shared/utils/resolve-namespaces.js +0 -33
- /package/dist/src/server/{messages/shared → shared/messages}/global-messages-pool.d.ts +0 -0
- /package/dist/src/server/{messages/shared → shared/messages}/global-messages-pool.js +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import merge from 'lodash.merge';
|
|
3
2
|
import { isValidMessages } from '../../../shared/utils/is-valid-messages.js';
|
|
4
3
|
import { getLogger } from '../../../../shared/logger/get-logger.js';
|
|
4
|
+
import { deepMerge } from '../../../../../shared/utils/deep-merge.js';
|
|
5
5
|
import { jsonReader } from './utils/json-reader.js';
|
|
6
6
|
import { nestObjectFromPath } from './utils/nest-object-from-path.js';
|
|
7
7
|
|
|
@@ -41,7 +41,7 @@ async function parseFileEntries({ fileEntries, limit, extraOptions: { messagesRe
|
|
|
41
41
|
const logger = baseLogger.child({ scope: "parse-file-entries" });
|
|
42
42
|
// Read and parse all file entries
|
|
43
43
|
const parsedFileEntries = [];
|
|
44
|
-
const tasks = fileEntries.map(({ namespace, segments, basename, fullPath }) => limit(async () => {
|
|
44
|
+
const tasks = fileEntries.map(({ namespace, segments, basename, fullPath, relativePath }) => limit(async () => {
|
|
45
45
|
try {
|
|
46
46
|
const segsWithoutNs = segments.slice(1);
|
|
47
47
|
const ext = path.extname(fullPath);
|
|
@@ -58,7 +58,7 @@ async function parseFileEntries({ fileEntries, limit, extraOptions: { messagesRe
|
|
|
58
58
|
// Nest the parsed content based on the path segments
|
|
59
59
|
const nested = nestObjectFromPath(keyPath, json);
|
|
60
60
|
parsedFileEntries.push({ namespace, messages: nested });
|
|
61
|
-
logger.trace(
|
|
61
|
+
logger.trace(`Parsed message file: ${relativePath}`);
|
|
62
62
|
}
|
|
63
63
|
catch (error) {
|
|
64
64
|
logger.error("Failed to read or parse file.", {
|
|
@@ -73,10 +73,13 @@ async function parseFileEntries({ fileEntries, limit, extraOptions: { messagesRe
|
|
|
73
73
|
for (const { namespace, messages } of parsedFileEntries) {
|
|
74
74
|
// Handle root-level namespace (i.e., [rootDir]/index.json)
|
|
75
75
|
if (namespace === "index") {
|
|
76
|
-
|
|
76
|
+
const merged = deepMerge(result, messages);
|
|
77
|
+
if (merged)
|
|
78
|
+
Object.assign(result, merged);
|
|
77
79
|
}
|
|
78
80
|
else {
|
|
79
|
-
result[namespace] =
|
|
81
|
+
result[namespace] =
|
|
82
|
+
deepMerge(result[namespace] ?? {}, messages) || {};
|
|
80
83
|
}
|
|
81
84
|
}
|
|
82
85
|
return result;
|
|
@@ -2,7 +2,7 @@ import type { LoggerOptions } from "../../../../../config/types/logger.types";
|
|
|
2
2
|
import type { FileEntry } from "../../../../../server/messages/load-local-messages/read-locale-messages/types";
|
|
3
3
|
import type { MessagesReader, Messages } from "../../../../../server/messages/shared/types";
|
|
4
4
|
import type { LimitFunction } from "p-limit";
|
|
5
|
-
export interface
|
|
5
|
+
export interface ParseFileEntriesParams {
|
|
6
6
|
fileEntries: FileEntry[];
|
|
7
7
|
limit: LimitFunction;
|
|
8
8
|
extraOptions?: {
|
package/dist/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ReadLocaleMessagesParams } from "../../../../server/messages/load-local-messages/read-locale-messages/types";
|
|
2
2
|
import type { LocaleMessages } from "intor-translator";
|
|
3
3
|
/**
|
|
4
4
|
* Read messages for a specific locale from the file system.
|
|
@@ -7,4 +7,4 @@ import type { LocaleMessages } from "intor-translator";
|
|
|
7
7
|
* 2. Parses each file into a messages object.
|
|
8
8
|
* 3. Wraps the parsed messages under the locale key.
|
|
9
9
|
*/
|
|
10
|
-
export declare const readLocaleMessages: ({ limit, rootDir, locale, namespaces, extraOptions: { exts, messagesReader, loggerOptions }, }:
|
|
10
|
+
export declare const readLocaleMessages: ({ limit, rootDir, locale, namespaces, extraOptions: { exts, messagesReader, loggerOptions }, }: ReadLocaleMessagesParams) => Promise<LocaleMessages>;
|
package/dist/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js
CHANGED
|
@@ -18,13 +18,13 @@ const readLocaleMessages = async ({ limit, rootDir = "messages", locale, namespa
|
|
|
18
18
|
extraOptions: { exts, loggerOptions },
|
|
19
19
|
});
|
|
20
20
|
// 2. Parse file entries
|
|
21
|
-
const
|
|
21
|
+
const messages = await parseFileEntries({
|
|
22
22
|
fileEntries,
|
|
23
23
|
limit,
|
|
24
24
|
extraOptions: { messagesReader, loggerOptions },
|
|
25
25
|
});
|
|
26
|
-
// 3. Wrap the parsed
|
|
27
|
-
const localeMessages = { [locale]:
|
|
26
|
+
// 3. Wrap the parsed messages under the locale key
|
|
27
|
+
const localeMessages = { [locale]: messages };
|
|
28
28
|
return localeMessages;
|
|
29
29
|
};
|
|
30
30
|
|
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
import type { CacheResolvedOptions } from "../../../config/types/cache.types";
|
|
2
2
|
import type { LoggerOptions } from "../../../config/types/logger.types";
|
|
3
|
-
import type { MessagesPool } from "../../../server/messages/shared/global-messages-pool";
|
|
4
3
|
import type { MessagesReader } from "../../../server/messages/shared/types";
|
|
5
|
-
|
|
4
|
+
import type { MessagesPool } from "../../../server/shared/messages/global-messages-pool";
|
|
5
|
+
export interface LoadLocalMessagesExtraOptions {
|
|
6
|
+
concurrency?: number;
|
|
7
|
+
cacheOptions?: CacheResolvedOptions;
|
|
8
|
+
loggerOptions?: LoggerOptions & {
|
|
9
|
+
id?: string;
|
|
10
|
+
};
|
|
11
|
+
exts?: string[];
|
|
12
|
+
messagesReader?: MessagesReader;
|
|
13
|
+
}
|
|
14
|
+
export interface LoadLocalMessagesParams {
|
|
6
15
|
pool?: MessagesPool;
|
|
7
16
|
rootDir?: string;
|
|
8
17
|
locale: string;
|
|
9
18
|
fallbackLocales?: string[];
|
|
10
19
|
namespaces?: string[];
|
|
11
|
-
extraOptions?:
|
|
12
|
-
concurrency?: number;
|
|
13
|
-
cacheOptions?: CacheResolvedOptions;
|
|
14
|
-
loggerOptions?: LoggerOptions & {
|
|
15
|
-
id?: string;
|
|
16
|
-
};
|
|
17
|
-
exts?: string[];
|
|
18
|
-
messagesReader?: MessagesReader;
|
|
19
|
-
};
|
|
20
|
+
extraOptions?: LoadLocalMessagesExtraOptions;
|
|
20
21
|
allowCacheWrite?: boolean;
|
|
21
22
|
}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import type { LoadMessagesOptions, LoadMessagesResult } from "../../server/messages/types";
|
|
2
|
-
import type { GenConfigKeys } from "../../shared/types/generated
|
|
2
|
+
import type { GenConfigKeys } from "../../shared/types/generated";
|
|
3
3
|
/**
|
|
4
|
-
* Load messages
|
|
4
|
+
* Load locale messages based on the resolved Intor configuration.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
6
|
+
* This function acts as a thin orchestration layer that:
|
|
7
|
+
*
|
|
8
|
+
* - Selects the appropriate message loader (local or remote)
|
|
9
|
+
* - Applies fallback locale resolution
|
|
10
|
+
* - Delegates caching and concurrency behavior to the underlying loader
|
|
11
|
+
*
|
|
12
|
+
* It does not perform message normalization or transformation itself.
|
|
10
13
|
*/
|
|
11
|
-
export declare const loadMessages: <
|
|
14
|
+
export declare const loadMessages: <CK extends GenConfigKeys = "__default__">({ config, locale, extraOptions: { exts, messagesReader }, allowCacheWrite, }: LoadMessagesOptions) => LoadMessagesResult<CK>;
|
|
@@ -1,30 +1,29 @@
|
|
|
1
1
|
import { loadLocalMessages } from './load-local-messages/load-local-messages.js';
|
|
2
2
|
import { loadRemoteMessages } from './load-remote-messages/load-remote-messages.js';
|
|
3
3
|
import { getLogger } from '../shared/logger/get-logger.js';
|
|
4
|
-
import { resolveNamespaces } from '../../shared/utils/resolve-namespaces.js';
|
|
5
4
|
|
|
6
5
|
/**
|
|
7
|
-
* Load messages
|
|
6
|
+
* Load locale messages based on the resolved Intor configuration.
|
|
8
7
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* -
|
|
12
|
-
* -
|
|
8
|
+
* This function acts as a thin orchestration layer that:
|
|
9
|
+
*
|
|
10
|
+
* - Selects the appropriate message loader (local or remote)
|
|
11
|
+
* - Applies fallback locale resolution
|
|
12
|
+
* - Delegates caching and concurrency behavior to the underlying loader
|
|
13
|
+
*
|
|
14
|
+
* It does not perform message normalization or transformation itself.
|
|
13
15
|
*/
|
|
14
|
-
const loadMessages = async ({ config, locale,
|
|
16
|
+
const loadMessages = async ({ config, locale, extraOptions: { exts, messagesReader } = {}, allowCacheWrite = false, }) => {
|
|
15
17
|
const baseLogger = getLogger({ id: config.id, ...config.logger });
|
|
16
18
|
const logger = baseLogger.child({ scope: "load-messages" });
|
|
19
|
+
// Guard: no loader configured
|
|
17
20
|
if (!config.loader) {
|
|
18
21
|
logger.warn("No loader options have been configured in the current config.");
|
|
19
22
|
return;
|
|
20
23
|
}
|
|
21
|
-
const { type, concurrency, rootDir } = config.loader;
|
|
22
|
-
const fallbackLocales = config.fallbackLocales[locale] || [];
|
|
23
|
-
|
|
24
|
-
// Logs
|
|
25
|
-
if (logger.core.level === "debug") {
|
|
26
|
-
logger.debug("Starting to load messages.", { locale });
|
|
27
|
-
}
|
|
24
|
+
const { type, concurrency, rootDir, namespaces } = config.loader;
|
|
25
|
+
const fallbackLocales = config.fallbackLocales[locale] || [];
|
|
26
|
+
logger.info(`Loading messages for locale "${locale}".`);
|
|
28
27
|
logger.trace("Starting to load messages with runtime context.", {
|
|
29
28
|
loaderType: type,
|
|
30
29
|
locale,
|
|
@@ -34,13 +33,13 @@ const loadMessages = async ({ config, locale, pathname = "", extraOptions: { ext
|
|
|
34
33
|
concurrency: concurrency ?? 10,
|
|
35
34
|
});
|
|
36
35
|
let loadedMessages;
|
|
37
|
-
|
|
36
|
+
// --- loader type: local
|
|
38
37
|
if (type === "local") {
|
|
39
38
|
loadedMessages = await loadLocalMessages({
|
|
40
|
-
rootDir,
|
|
41
39
|
locale,
|
|
42
40
|
fallbackLocales,
|
|
43
41
|
namespaces,
|
|
42
|
+
rootDir,
|
|
44
43
|
extraOptions: {
|
|
45
44
|
concurrency,
|
|
46
45
|
cacheOptions: config.cache,
|
|
@@ -51,25 +50,26 @@ const loadMessages = async ({ config, locale, pathname = "", extraOptions: { ext
|
|
|
51
50
|
allowCacheWrite,
|
|
52
51
|
});
|
|
53
52
|
}
|
|
54
|
-
|
|
53
|
+
// --- loader type: remote
|
|
55
54
|
else if (type === "remote") {
|
|
56
55
|
// Fetch messages from remote
|
|
57
56
|
loadedMessages = await loadRemoteMessages({
|
|
58
|
-
rootDir,
|
|
59
|
-
remoteUrl: config.loader.remoteUrl,
|
|
60
|
-
remoteHeaders: config.loader.remoteHeaders,
|
|
61
57
|
locale,
|
|
62
58
|
fallbackLocales,
|
|
63
59
|
namespaces,
|
|
60
|
+
rootDir,
|
|
61
|
+
remoteUrl: config.loader.remoteUrl,
|
|
62
|
+
remoteHeaders: config.loader.remoteHeaders,
|
|
64
63
|
extraOptions: {
|
|
65
64
|
cacheOptions: config.cache,
|
|
66
65
|
loggerOptions: { id: config.id, ...config.logger },
|
|
67
66
|
},
|
|
67
|
+
allowCacheWrite,
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
70
|
// No messages found
|
|
71
71
|
if (!loadedMessages || Object.keys(loadedMessages).length === 0) {
|
|
72
|
-
logger.warn("No messages found.", { locale, namespaces });
|
|
72
|
+
logger.warn("No messages found.", { locale, fallbackLocales, namespaces });
|
|
73
73
|
}
|
|
74
74
|
return loadedMessages;
|
|
75
75
|
};
|
|
@@ -6,4 +6,4 @@ import type { LocaleMessages } from "intor-translator";
|
|
|
6
6
|
* - Validates that the returned JSON matches the expected `NamespaceMessages` structure.
|
|
7
7
|
* - Uses `fetch` with `no-store` cache to always get fresh data.
|
|
8
8
|
*/
|
|
9
|
-
export declare const fetchLocaleMessages: ({ remoteUrl, remoteHeaders, searchParams, locale, extraOptions: { loggerOptions }, }: FetcherOptions) => Promise<LocaleMessages | undefined>;
|
|
9
|
+
export declare const fetchLocaleMessages: ({ remoteUrl, remoteHeaders, searchParams, locale, extraOptions: { loggerOptions }, signal, }: FetcherOptions) => Promise<LocaleMessages | undefined>;
|
package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js
CHANGED
|
@@ -7,7 +7,7 @@ import { getLogger } from '../../../shared/logger/get-logger.js';
|
|
|
7
7
|
* - Validates that the returned JSON matches the expected `NamespaceMessages` structure.
|
|
8
8
|
* - Uses `fetch` with `no-store` cache to always get fresh data.
|
|
9
9
|
*/
|
|
10
|
-
const fetchLocaleMessages = async ({ remoteUrl, remoteHeaders, searchParams, locale, extraOptions: { loggerOptions } = {}, }) => {
|
|
10
|
+
const fetchLocaleMessages = async ({ remoteUrl, remoteHeaders, searchParams, locale, extraOptions: { loggerOptions } = {}, signal, }) => {
|
|
11
11
|
const baseLogger = getLogger({ ...loggerOptions });
|
|
12
12
|
const logger = baseLogger.child({ scope: "fetch-locale-messages" });
|
|
13
13
|
try {
|
|
@@ -24,6 +24,7 @@ const fetchLocaleMessages = async ({ remoteUrl, remoteHeaders, searchParams, loc
|
|
|
24
24
|
method: "GET",
|
|
25
25
|
headers,
|
|
26
26
|
cache: "no-store",
|
|
27
|
+
signal,
|
|
27
28
|
});
|
|
28
29
|
if (!response.ok) {
|
|
29
30
|
throw new Error(`HTTP error ${response.status} ${response.statusText}`);
|
|
@@ -37,6 +38,10 @@ const fetchLocaleMessages = async ({ remoteUrl, remoteHeaders, searchParams, loc
|
|
|
37
38
|
return data;
|
|
38
39
|
}
|
|
39
40
|
catch (error) {
|
|
41
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
42
|
+
logger.debug("Fetching locale messages aborted.", { locale, remoteUrl });
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
40
45
|
logger.warn("Fetching locale messages failed.", {
|
|
41
46
|
locale,
|
|
42
47
|
remoteUrl,
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { loadRemoteMessages } from "./load-remote-messages";
|
|
2
|
-
export type { LoadRemoteMessagesOptions } from "./types";
|
|
2
|
+
export type { LoadRemoteMessagesParams as LoadRemoteMessagesOptions } from "./types";
|
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { LoadRemoteMessagesParams } from "./types";
|
|
2
2
|
import type { LocaleMessages } from "intor-translator";
|
|
3
3
|
/**
|
|
4
4
|
* Load locale messages from a remote API.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
6
|
+
* This function acts as the orchestration layer for remote message loading.
|
|
7
|
+
* It is responsible for:
|
|
8
|
+
*
|
|
9
|
+
* - Resolving fallback locales in order
|
|
10
|
+
* - Coordinating cache read / write behavior
|
|
11
|
+
* - Respecting abort signals across the entire async flow
|
|
12
|
+
*
|
|
13
|
+
* Network fetching and data validation are delegated to lower-level utilities.
|
|
8
14
|
*/
|
|
9
|
-
export declare const loadRemoteMessages: ({ pool, rootDir,
|
|
15
|
+
export declare const loadRemoteMessages: ({ pool, rootDir, locale, fallbackLocales, namespaces, remoteUrl, remoteHeaders, extraOptions: { cacheOptions, loggerOptions, }, allowCacheWrite, signal, }: LoadRemoteMessagesParams) => Promise<LocaleMessages | undefined>;
|
|
@@ -1,25 +1,34 @@
|
|
|
1
1
|
import { DEFAULT_CACHE_OPTIONS } from '../../../config/constants/cache.constants.js';
|
|
2
2
|
import { fetchLocaleMessages } from './fetch-locale-messages/fetch-locale-messages.js';
|
|
3
3
|
import { buildSearchParams } from './fetch-locale-messages/utils/build-search-params.js';
|
|
4
|
-
import { getGlobalMessagesPool } from '../shared/global-messages-pool.js';
|
|
5
4
|
import { getLogger } from '../../shared/logger/get-logger.js';
|
|
6
|
-
import '
|
|
7
|
-
import { normalizeCacheKey } from '../../../shared/utils/normalize-cache-key.js';
|
|
5
|
+
import { getGlobalMessagesPool } from '../../shared/messages/global-messages-pool.js';
|
|
6
|
+
import { normalizeCacheKey } from '../../../shared/utils/normalizers/normalize-cache-key.js';
|
|
8
7
|
|
|
9
8
|
/**
|
|
10
9
|
* Load locale messages from a remote API.
|
|
11
10
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* This function acts as the orchestration layer for remote message loading.
|
|
12
|
+
* It is responsible for:
|
|
13
|
+
*
|
|
14
|
+
* - Resolving fallback locales in order
|
|
15
|
+
* - Coordinating cache read / write behavior
|
|
16
|
+
* - Respecting abort signals across the entire async flow
|
|
17
|
+
*
|
|
18
|
+
* Network fetching and data validation are delegated to lower-level utilities.
|
|
14
19
|
*/
|
|
15
|
-
const loadRemoteMessages = async ({ pool = getGlobalMessagesPool(), rootDir,
|
|
20
|
+
const loadRemoteMessages = async ({ pool = getGlobalMessagesPool(), rootDir, locale, fallbackLocales, namespaces, remoteUrl, remoteHeaders, extraOptions: { cacheOptions = DEFAULT_CACHE_OPTIONS, loggerOptions = { id: "default" }, } = {}, allowCacheWrite = false, signal, }) => {
|
|
16
21
|
const baseLogger = getLogger({ ...loggerOptions });
|
|
17
22
|
const logger = baseLogger.child({ scope: "load-remote-messages" });
|
|
18
|
-
//
|
|
23
|
+
// Abort early if the request has already been cancelled
|
|
24
|
+
if (signal?.aborted) {
|
|
25
|
+
logger.debug("Remote message loading aborted before fetch.");
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
19
28
|
const start = performance.now();
|
|
20
|
-
logger.debug("Loading remote messages
|
|
21
|
-
|
|
22
|
-
const
|
|
29
|
+
logger.debug("Loading remote messages.", { remoteUrl });
|
|
30
|
+
// --- Cache key
|
|
31
|
+
const cacheKey = normalizeCacheKey([
|
|
23
32
|
loggerOptions.id,
|
|
24
33
|
"loaderType:remote",
|
|
25
34
|
rootDir,
|
|
@@ -27,52 +36,74 @@ const loadRemoteMessages = async ({ pool = getGlobalMessagesPool(), rootDir, rem
|
|
|
27
36
|
(fallbackLocales ?? []).toSorted().join(","),
|
|
28
37
|
(namespaces ?? []).toSorted().join(","),
|
|
29
38
|
]);
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
// --- Cache read --------------------------------------------------
|
|
40
|
+
if (cacheOptions.enabled && cacheKey) {
|
|
41
|
+
const cached = await pool?.get(cacheKey);
|
|
42
|
+
if (signal?.aborted) {
|
|
43
|
+
logger.debug("Remote message loading aborted after cache read.");
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
32
46
|
if (cached) {
|
|
33
|
-
logger.debug("Messages cache hit.", { key });
|
|
47
|
+
logger.debug("Messages cache hit.", { key: cacheKey });
|
|
34
48
|
return cached;
|
|
35
49
|
}
|
|
36
50
|
}
|
|
37
|
-
// Build search params
|
|
38
|
-
const searchParams = buildSearchParams({ rootDir, namespaces });
|
|
39
|
-
//============================================================
|
|
40
|
-
// Fetch messages
|
|
41
|
-
//============================================================
|
|
42
51
|
const candidateLocales = [locale, ...(fallbackLocales || [])];
|
|
43
52
|
let messages;
|
|
44
|
-
|
|
53
|
+
// Try each candidate locale in order and stop at the first successful result
|
|
54
|
+
for (let i = 0; i < candidateLocales.length; i++) {
|
|
55
|
+
const candidateLocale = candidateLocales[i];
|
|
56
|
+
const isLast = i === candidateLocales.length - 1;
|
|
45
57
|
try {
|
|
46
|
-
const
|
|
58
|
+
const fetched = await fetchLocaleMessages({
|
|
47
59
|
remoteUrl,
|
|
48
60
|
remoteHeaders,
|
|
49
|
-
searchParams,
|
|
50
61
|
locale: candidateLocale,
|
|
62
|
+
searchParams: buildSearchParams({ rootDir, namespaces }),
|
|
51
63
|
extraOptions: { loggerOptions },
|
|
64
|
+
signal,
|
|
52
65
|
});
|
|
53
|
-
|
|
54
|
-
|
|
66
|
+
// Stop at the first locale that yields non-empty messages
|
|
67
|
+
if (fetched && Object.values(fetched[candidateLocale] || {}).length > 0) {
|
|
68
|
+
messages = fetched;
|
|
55
69
|
break;
|
|
56
70
|
}
|
|
57
71
|
}
|
|
58
72
|
catch (error) {
|
|
59
|
-
|
|
73
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
74
|
+
logger.debug("Remote message loading aborted.");
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (isLast) {
|
|
78
|
+
logger.warn("Failed to load messages for all candidate locales.", {
|
|
79
|
+
locale,
|
|
80
|
+
fallbackLocales,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
logger.warn(`Failed to fetch locale messages for "${candidateLocale}", trying next fallback.`);
|
|
85
|
+
}
|
|
86
|
+
logger.trace("Remote fetch error detail.", {
|
|
60
87
|
locale: candidateLocale,
|
|
61
88
|
error,
|
|
62
89
|
});
|
|
63
90
|
}
|
|
64
91
|
}
|
|
65
|
-
|
|
66
|
-
if (
|
|
67
|
-
|
|
92
|
+
// --- Cache write --------------------------------------------------
|
|
93
|
+
if (cacheOptions.enabled && allowCacheWrite && cacheKey && messages) {
|
|
94
|
+
if (signal?.aborted) {
|
|
95
|
+
logger.debug("Remote message loading aborted before cache write.");
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
await pool?.set(cacheKey, messages, cacheOptions.ttl);
|
|
99
|
+
}
|
|
100
|
+
// Final success log with resolved locale and timing
|
|
101
|
+
if (messages) {
|
|
102
|
+
logger.trace("Finished loading remote messages.", {
|
|
103
|
+
loadedLocale: messages ? Object.keys(messages)[0] : undefined,
|
|
104
|
+
duration: `${Math.round(performance.now() - start)} ms`,
|
|
105
|
+
});
|
|
68
106
|
}
|
|
69
|
-
// Log out validnamespaces & performance measurement
|
|
70
|
-
const end = performance.now();
|
|
71
|
-
const duration = Math.round(end - start);
|
|
72
|
-
logger.trace("Finished loading remote messages.", {
|
|
73
|
-
loadedLocale: messages ? Object.keys(messages)[0] : undefined,
|
|
74
|
-
duration: `${duration} ms`,
|
|
75
|
-
});
|
|
76
107
|
return messages;
|
|
77
108
|
};
|
|
78
109
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { CacheResolvedOptions } from "../../../config/types/cache.types";
|
|
2
2
|
import type { RemoteHeaders } from "../../../config/types/loader.types";
|
|
3
3
|
import type { LoggerOptions } from "../../../config/types/logger.types";
|
|
4
|
-
import type { MessagesPool } from "../../../server/messages/
|
|
5
|
-
export interface
|
|
4
|
+
import type { MessagesPool } from "../../../server/shared/messages/global-messages-pool";
|
|
5
|
+
export interface LoadRemoteMessagesParams {
|
|
6
6
|
pool?: MessagesPool;
|
|
7
7
|
rootDir?: string;
|
|
8
8
|
locale: string;
|
|
9
|
-
fallbackLocales
|
|
9
|
+
fallbackLocales?: string[];
|
|
10
10
|
namespaces?: string[];
|
|
11
11
|
remoteUrl: string;
|
|
12
12
|
remoteHeaders?: RemoteHeaders;
|
|
@@ -17,4 +17,5 @@ export interface LoadRemoteMessagesOptions {
|
|
|
17
17
|
};
|
|
18
18
|
};
|
|
19
19
|
allowCacheWrite?: boolean;
|
|
20
|
+
signal?: AbortSignal;
|
|
20
21
|
}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import type { IntorResolvedConfig } from "../../config/types/intor-config.types";
|
|
2
2
|
import type { MessagesReader } from "../../server/messages/shared/types";
|
|
3
|
-
import type { GenConfigKeys, GenMessages } from "../../shared/types/generated
|
|
3
|
+
import type { GenConfigKeys, GenMessages } from "../../shared/types/generated";
|
|
4
4
|
import type { Locale } from "intor-translator";
|
|
5
5
|
export type LoadMessagesOptions = {
|
|
6
6
|
config: IntorResolvedConfig;
|
|
7
7
|
locale: Locale;
|
|
8
|
-
pathname?: string;
|
|
9
8
|
extraOptions?: {
|
|
10
9
|
exts?: string[];
|
|
11
10
|
messagesReader?: MessagesReader;
|
|
12
11
|
};
|
|
13
12
|
allowCacheWrite?: boolean;
|
|
14
13
|
};
|
|
15
|
-
export type LoadMessagesResult<
|
|
14
|
+
export type LoadMessagesResult<CK extends GenConfigKeys = "__default__"> = Promise<GenMessages<CK> | undefined>;
|
|
@@ -5,7 +5,7 @@ import type { Logger } from "logry";
|
|
|
5
5
|
* - Safe across hot reloads
|
|
6
6
|
* - Prevents unbounded memory usage via soft LRU
|
|
7
7
|
*/
|
|
8
|
-
export declare function getLogger({ id,
|
|
8
|
+
export declare function getLogger({ id, formatConfig, renderConfig, preset, ...options }: {
|
|
9
9
|
id?: string;
|
|
10
10
|
scope?: string;
|
|
11
11
|
} & LoggerOptions): Logger;
|
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
import { logry } from 'logry';
|
|
2
2
|
import { getGlobalLoggerPool } from './global-logger-pool.js';
|
|
3
3
|
|
|
4
|
-
const
|
|
5
|
-
|
|
4
|
+
const DEFAULT_FORMAT_CONFIG = {
|
|
5
|
+
timestamp: { withDate: false },
|
|
6
|
+
};
|
|
7
|
+
const DEFAULT_RENDER_CONFIG = {
|
|
8
|
+
timestamp: {},
|
|
9
|
+
id: { visible: true, prefix: "<", suffix: ">" },
|
|
10
|
+
meta: { lineBreaksAfter: 1 },
|
|
6
11
|
};
|
|
7
12
|
/**
|
|
8
13
|
* Get a shared logger instance by id.
|
|
9
14
|
* - Safe across hot reloads
|
|
10
15
|
* - Prevents unbounded memory usage via soft LRU
|
|
11
16
|
*/
|
|
12
|
-
function getLogger({ id = "default",
|
|
17
|
+
function getLogger({ id = "default", formatConfig, renderConfig, preset, ...options }) {
|
|
13
18
|
const pool = getGlobalLoggerPool();
|
|
14
19
|
let logger = pool.get(id);
|
|
15
|
-
const useDefault = !formatterConfig && !preset;
|
|
16
20
|
if (!logger) {
|
|
17
21
|
logger = logry({
|
|
18
22
|
id,
|
|
19
|
-
|
|
23
|
+
formatConfig: !formatConfig && !preset ? DEFAULT_FORMAT_CONFIG : formatConfig,
|
|
24
|
+
renderConfig: !renderConfig && !preset ? DEFAULT_RENDER_CONFIG : renderConfig,
|
|
20
25
|
preset,
|
|
21
26
|
...options,
|
|
22
27
|
});
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import type { IntorResolvedConfig } from "../../config/types/intor-config.types";
|
|
2
|
-
import type { GenConfigKeys, GenLocale, GenMessages } from "../../shared/types/generated
|
|
3
|
-
import type { TranslatorInstance } from "../../shared/types/translator-instance
|
|
4
|
-
import type { LocalizedNodeKeys, TranslateHandlers } from "intor-translator";
|
|
2
|
+
import type { GenConfigKeys, GenLocale, GenMessages } from "../../shared/types/generated";
|
|
3
|
+
import type { TranslatorInstance } from "../../shared/types/translator-instance";
|
|
4
|
+
import type { LocalizedNodeKeys, TranslateHandlers, TranslateHook, TranslatorPlugin } from "intor-translator";
|
|
5
5
|
import { type MessagesReader } from "../../server/messages";
|
|
6
6
|
/**
|
|
7
|
-
* Create a translator instance for a specific locale
|
|
7
|
+
* Create a translator instance for a specific locale.
|
|
8
8
|
*
|
|
9
|
-
* - Loads messages using the provided config, locale
|
|
9
|
+
* - Loads messages using the provided config, locale.
|
|
10
10
|
* - Initializes a translator with `t`, `hasKey`, and optional scoped methods.
|
|
11
11
|
* - Supports optional `preKey` to create a scoped translator for nested keys.
|
|
12
12
|
*/
|
|
13
13
|
export declare function getTranslator<CK extends GenConfigKeys = "__default__">(options: {
|
|
14
14
|
config: IntorResolvedConfig;
|
|
15
|
-
locale: GenLocale
|
|
16
|
-
pathname?: string;
|
|
15
|
+
locale: GenLocale<CK>;
|
|
17
16
|
handlers?: TranslateHandlers;
|
|
17
|
+
plugins?: (TranslatorPlugin | TranslateHook)[];
|
|
18
18
|
extraOptions?: {
|
|
19
19
|
exts?: string[];
|
|
20
20
|
messagesReader?: MessagesReader;
|
|
@@ -22,9 +22,9 @@ export declare function getTranslator<CK extends GenConfigKeys = "__default__">(
|
|
|
22
22
|
}): Promise<TranslatorInstance<GenMessages<CK>>>;
|
|
23
23
|
export declare function getTranslator<CK extends GenConfigKeys = "__default__", PK extends string = LocalizedNodeKeys<GenMessages<CK>>>(options: {
|
|
24
24
|
config: IntorResolvedConfig;
|
|
25
|
-
locale: GenLocale
|
|
26
|
-
pathname?: string;
|
|
25
|
+
locale: GenLocale<CK>;
|
|
27
26
|
handlers?: TranslateHandlers;
|
|
27
|
+
plugins?: (TranslatorPlugin | TranslateHook)[];
|
|
28
28
|
extraOptions?: {
|
|
29
29
|
exts?: string[];
|
|
30
30
|
messagesReader?: MessagesReader;
|
|
@@ -1,21 +1,12 @@
|
|
|
1
1
|
import { Translator } from 'intor-translator';
|
|
2
2
|
import { loadMessages } from '../messages/load-messages.js';
|
|
3
|
-
import 'node:path';
|
|
4
|
-
import 'node:perf_hooks';
|
|
5
|
-
import 'p-limit';
|
|
6
|
-
import '../../config/constants/cache.constants.js';
|
|
7
|
-
import 'node:fs/promises';
|
|
8
|
-
import 'logry';
|
|
9
|
-
import 'lodash.merge';
|
|
10
|
-
import 'keyv';
|
|
11
3
|
|
|
12
4
|
// Implementation
|
|
13
5
|
async function getTranslator(options) {
|
|
14
|
-
const { config, locale,
|
|
6
|
+
const { config, locale, preKey } = options;
|
|
15
7
|
const messages = await loadMessages({
|
|
16
8
|
config,
|
|
17
9
|
locale,
|
|
18
|
-
pathname,
|
|
19
10
|
extraOptions: options.extraOptions,
|
|
20
11
|
});
|
|
21
12
|
// Create a Translator instance
|
|
@@ -26,6 +17,7 @@ async function getTranslator(options) {
|
|
|
26
17
|
loadingMessage: config.translator?.loadingMessage,
|
|
27
18
|
placeholder: config.translator?.placeholder,
|
|
28
19
|
handlers: options.handlers,
|
|
20
|
+
plugins: options.plugins,
|
|
29
21
|
});
|
|
30
22
|
const props = { messages, locale };
|
|
31
23
|
const scoped = translator.scoped(preKey);
|
|
@@ -33,6 +25,10 @@ async function getTranslator(options) {
|
|
|
33
25
|
...props,
|
|
34
26
|
hasKey: preKey ? scoped.hasKey : translator.hasKey,
|
|
35
27
|
t: preKey ? scoped.t : translator.t,
|
|
28
|
+
// NOTE:
|
|
29
|
+
// Return type is fully validated by overload signatures.
|
|
30
|
+
// Assertion here is intentional due to TS inference limitations.
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
36
32
|
};
|
|
37
33
|
}
|
|
38
34
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { PREFIX_PLACEHOLDER } from "./prefix-placeholder";
|