intor 2.3.3 → 2.3.5
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 +79 -0
- package/dist/core/export/config/index.js +1 -0
- package/dist/core/export/index.js +4 -0
- package/dist/core/export/server/index.js +7 -0
- package/dist/{src → core/src}/config/constants/cookie.constants.js +2 -2
- package/dist/{src → core/src}/config/constants/routing.constants.js +6 -0
- package/dist/{src → core/src}/config/define-intor-config.js +18 -4
- package/dist/core/src/config/resolvers/resolve-cookie-options.js +10 -0
- package/dist/{src → core/src}/config/resolvers/resolve-fallback-locales.js +17 -0
- package/dist/core/src/config/resolvers/resolve-routing-options.js +20 -0
- package/dist/{src → core/src}/config/validators/validate-default-locale.js +9 -0
- package/dist/{src → core/src}/config/validators/validate-supported-locales.js +8 -3
- package/dist/core/src/server/helpers/local-messages-from-url.js +48 -0
- package/dist/core/src/server/intor/intor.js +49 -0
- package/dist/core/src/server/messages/load-local-messages/load-local-messages.js +93 -0
- package/dist/{src → core/src}/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +12 -29
- package/dist/{src → core/src}/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +8 -5
- package/dist/{src → core/src}/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +3 -3
- package/dist/{src → core/src}/server/messages/load-messages.js +21 -21
- package/dist/{src → core/src}/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +6 -1
- package/dist/core/src/server/messages/load-remote-messages/load-remote-messages.js +110 -0
- package/dist/{src → core/src}/server/shared/logger/get-logger.js +10 -5
- package/dist/core/src/server/shared/logger/global-logger-pool.js +16 -0
- package/dist/core/src/server/shared/messages/global-messages-pool.js +27 -0
- package/dist/{src → core/src}/server/translator/get-translator.js +6 -10
- package/dist/core/src/shared/utils/deep-merge.js +36 -0
- package/dist/{src/shared/utils → core/src/shared/utils/normalizers}/normalize-cache-key.js +17 -1
- package/dist/{src/shared/utils/pathname → core/src/shared/utils/normalizers}/normalize-pathname.js +1 -1
- package/dist/core/src/shared/utils/pathname/get-unprefixed-pathname.js +39 -0
- package/dist/{src/adapters/next/shared/utils → core/src/shared/utils/pathname}/locale-prefix-pathname.js +17 -12
- package/dist/core/src/shared/utils/pathname/localize-pathname.js +36 -0
- package/dist/{src → core/src}/shared/utils/pathname/standardize-pathname.js +8 -8
- package/dist/next/export/next/index.js +4 -0
- package/dist/{exports → next/export}/next/proxy/index.js +0 -1
- package/dist/next/export/next/server/index.js +2 -0
- package/dist/next/src/adapters/next/navigation/link.js +54 -0
- package/dist/next/src/adapters/next/navigation/redirect.js +37 -0
- package/dist/next/src/adapters/next/navigation/use-pathname.js +31 -0
- package/dist/next/src/adapters/next/navigation/use-router.js +68 -0
- package/dist/next/src/adapters/next/proxy/intor-proxy.js +44 -0
- package/dist/{src → next/src}/adapters/next/proxy/utils/set-locale-cookie-edge.js +2 -7
- package/dist/next/src/adapters/next/server/get-locale.js +25 -0
- package/dist/{src → next/src}/adapters/next/server/get-translator.js +4 -4
- package/dist/next/src/client/react/contexts/config/context.js +3 -0
- package/dist/next/src/client/react/contexts/locale/context.js +3 -0
- package/dist/next/src/client/react/contexts/messages/context.js +3 -0
- package/dist/next/src/client/react/contexts/translator/context.js +3 -0
- package/dist/next/src/client/react/contexts/translator-runtime/context.js +3 -0
- package/dist/next/src/client/react/navigation/use-navigation-strategy.js +32 -0
- package/dist/next/src/client/react/navigation/use-navigation-target.js +20 -0
- package/dist/next/src/client/shared/utils/build-cookie-string.js +30 -0
- package/dist/next/src/client/shared/utils/locale/set-locale-cookie-browser.js +18 -0
- package/dist/next/src/config/constants/cache.constants.js +7 -0
- package/dist/next/src/routing/locale/resolve-locale.js +32 -0
- package/dist/next/src/routing/pathname/resolve-pathname.js +53 -0
- package/dist/next/src/routing/pathname/strategies/all.js +23 -0
- package/dist/next/src/routing/pathname/strategies/except-default.js +33 -0
- package/dist/next/src/routing/pathname/strategies/none.js +14 -0
- package/dist/next/src/routing/resolve-navigation-target.js +28 -0
- package/dist/next/src/routing/resolve-routing.js +38 -0
- package/dist/next/src/server/messages/load-local-messages/load-local-messages.js +93 -0
- package/dist/next/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +78 -0
- package/dist/next/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +88 -0
- package/dist/next/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.js +12 -0
- package/dist/next/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.js +21 -0
- package/dist/next/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +31 -0
- package/dist/next/src/server/messages/load-messages.js +77 -0
- package/dist/next/src/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +55 -0
- package/dist/next/src/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +25 -0
- package/dist/next/src/server/messages/load-remote-messages/load-remote-messages.js +110 -0
- package/dist/next/src/server/messages/shared/utils/is-valid-messages.js +36 -0
- package/dist/next/src/server/shared/logger/get-logger.js +39 -0
- package/dist/next/src/server/translator/get-translator.js +35 -0
- package/dist/next/src/shared/constants/prefix-placeholder.js +4 -0
- package/dist/next/src/shared/utils/deep-merge.js +36 -0
- package/dist/next/src/shared/utils/is-external-destination.js +11 -0
- package/dist/next/src/shared/utils/locale/get-locale-from-accept-language.js +45 -0
- package/dist/next/src/shared/utils/locale/get-locale-from-host.js +31 -0
- package/dist/next/src/shared/utils/locale/get-locale-from-pathname.js +52 -0
- package/dist/next/src/shared/utils/locale/get-locale-from-query.js +33 -0
- package/dist/next/src/shared/utils/normalizers/normalize-cache-key.js +45 -0
- package/dist/{src/shared/utils/locale → next/src/shared/utils/normalizers}/normalize-locale.js +21 -4
- package/dist/next/src/shared/utils/normalizers/normalize-pathname.js +43 -0
- package/dist/next/src/shared/utils/pathname/get-unprefixed-pathname.js +39 -0
- package/dist/next/src/shared/utils/pathname/locale-prefix-pathname.js +38 -0
- package/dist/next/src/shared/utils/pathname/localize-pathname.js +36 -0
- package/dist/next/src/shared/utils/pathname/standardize-pathname.js +30 -0
- package/dist/react/export/react/index.js +18 -0
- package/dist/react/src/client/helpers/get-client-locale.js +24 -0
- package/dist/{src → react/src}/client/react/contexts/config/context.js +0 -1
- package/dist/{src → react/src}/client/react/contexts/config/hook.js +0 -1
- package/dist/{src → react/src}/client/react/contexts/config/provider.js +5 -2
- package/dist/{src → react/src}/client/react/contexts/intor-provider/intor-provider.js +3 -3
- package/dist/{src → react/src}/client/react/contexts/locale/context.js +0 -1
- package/dist/{src → react/src}/client/react/contexts/locale/hook.js +0 -1
- package/dist/react/src/client/react/contexts/locale/provider.js +38 -0
- package/dist/react/src/client/react/contexts/locale/utils/change-locale.js +26 -0
- package/dist/{src → react/src}/client/react/contexts/messages/context.js +0 -1
- package/dist/{src → react/src}/client/react/contexts/messages/hook.js +0 -1
- package/dist/{src → react/src}/client/react/contexts/messages/provider.js +18 -11
- package/dist/react/src/client/react/contexts/messages/utils/use-refetch-messages.js +70 -0
- package/dist/{src → react/src}/client/react/contexts/translator/context.js +0 -1
- package/dist/{src → react/src}/client/react/contexts/translator/hook.js +0 -1
- package/dist/{src → react/src}/client/react/contexts/translator/provider.js +23 -26
- package/dist/react/src/client/react/contexts/translator-runtime/context.js +5 -0
- package/dist/react/src/client/react/contexts/translator-runtime/hook.js +9 -0
- package/dist/react/src/client/react/contexts/translator-runtime/provider.js +15 -0
- package/dist/react/src/client/react/render/create-react-renderer.js +36 -0
- package/dist/react/src/client/react/render/render-rich-message-react.js +22 -0
- package/dist/react/src/client/react/translator/create-t-rich.js +23 -0
- package/dist/react/src/client/react/translator/t.js +15 -0
- package/dist/{src/client/react/hooks → react/src/client/react/translator}/use-translator.js +7 -10
- package/dist/react/src/client/shared/utils/build-cookie-string.js +30 -0
- package/dist/react/src/client/shared/utils/locale/detect-browser-locale.js +12 -0
- package/dist/react/src/client/shared/utils/locale/get-locale-cookie-browser.js +16 -0
- package/dist/react/src/client/shared/utils/locale/set-document-locale.js +12 -0
- package/dist/react/src/client/shared/utils/locale/set-locale-cookie-browser.js +18 -0
- package/dist/react/src/config/constants/cache.constants.js +7 -0
- package/dist/react/src/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +55 -0
- package/dist/react/src/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +25 -0
- package/dist/react/src/server/messages/load-remote-messages/load-remote-messages.js +110 -0
- package/dist/react/src/server/messages/shared/utils/is-valid-messages.js +36 -0
- package/dist/react/src/server/shared/logger/get-logger.js +39 -0
- package/dist/react/src/server/shared/logger/global-logger-pool.js +8 -0
- package/dist/react/src/server/shared/messages/global-messages-pool.js +10 -0
- package/dist/react/src/shared/utils/deep-merge.js +36 -0
- package/dist/react/src/shared/utils/normalizers/normalize-cache-key.js +45 -0
- package/dist/react/src/shared/utils/normalizers/normalize-locale.js +59 -0
- package/dist/types/export/config/index.d.ts +1 -0
- package/dist/types/export/index.d.ts +4 -0
- package/dist/types/export/internal/index.d.ts +1 -0
- package/dist/types/export/next/index.d.ts +1 -0
- package/dist/types/export/next/proxy/index.d.ts +1 -0
- package/dist/types/export/next/server/index.d.ts +1 -0
- package/dist/types/export/react/index.d.ts +1 -0
- package/dist/types/export/server/index.d.ts +1 -0
- package/dist/types/src/adapters/next/navigation/link.d.ts +26 -0
- package/dist/types/src/adapters/next/navigation/redirect.d.ts +18 -0
- package/dist/{src → types/src}/adapters/next/navigation/use-pathname.d.ts +5 -5
- package/dist/types/src/adapters/next/navigation/use-router.d.ts +25 -0
- package/dist/types/src/adapters/next/proxy/index.d.ts +1 -0
- package/dist/types/src/adapters/next/proxy/intor-proxy.d.ts +13 -0
- package/dist/{src → types/src}/adapters/next/proxy/utils/set-locale-cookie-edge.d.ts +2 -4
- package/dist/types/src/adapters/next/server/get-locale.d.ts +6 -0
- package/dist/{src → types/src}/adapters/next/server/get-translator.d.ts +7 -8
- package/dist/types/src/adapters/next/server/index.d.ts +2 -0
- package/dist/types/src/client/helpers/get-client-locale.d.ts +11 -0
- package/dist/types/src/client/helpers/index.d.ts +1 -0
- package/dist/types/src/client/react/contexts/config/provider.d.ts +2 -0
- package/dist/{src → types/src}/client/react/contexts/config/types.d.ts +6 -5
- package/dist/types/src/client/react/contexts/index.d.ts +6 -0
- package/dist/types/src/client/react/contexts/intor-provider/intor-provider.d.ts +2 -0
- package/dist/{src → types/src}/client/react/contexts/intor-provider/types.d.ts +1 -2
- package/dist/types/src/client/react/contexts/locale/utils/change-locale.d.ts +20 -0
- package/dist/{src → types/src}/client/react/contexts/messages/types.d.ts +4 -7
- package/dist/types/src/client/react/contexts/messages/utils/use-refetch-messages.d.ts +20 -0
- package/dist/types/src/client/react/contexts/translator/hook.d.ts +2 -0
- package/dist/types/src/client/react/contexts/translator/types.d.ts +11 -0
- package/dist/types/src/client/react/contexts/translator-runtime/context.d.ts +3 -0
- package/dist/types/src/client/react/contexts/translator-runtime/hook.d.ts +2 -0
- package/dist/types/src/client/react/contexts/translator-runtime/index.d.ts +3 -0
- package/dist/types/src/client/react/contexts/translator-runtime/provider.d.ts +2 -0
- package/dist/types/src/client/react/contexts/translator-runtime/types.d.ts +13 -0
- package/dist/types/src/client/react/index.d.ts +4 -0
- package/dist/types/src/client/react/navigation/index.d.ts +2 -0
- package/dist/types/src/client/react/navigation/use-navigation-strategy.d.ts +22 -0
- package/dist/types/src/client/react/navigation/use-navigation-target.d.ts +12 -0
- package/dist/types/src/client/react/render/create-react-renderer.d.ts +17 -0
- package/dist/types/src/client/react/render/index.d.ts +2 -0
- package/dist/types/src/client/react/render/render-rich-message-react.d.ts +13 -0
- package/dist/types/src/client/react/render/types.d.ts +17 -0
- package/dist/types/src/client/react/translator/create-t-rich.d.ts +15 -0
- package/dist/types/src/client/react/translator/index.d.ts +2 -0
- package/dist/types/src/client/react/translator/t.d.ts +27 -0
- package/dist/types/src/client/react/translator/translator-instance.d.ts +12 -0
- package/dist/types/src/client/react/translator/use-translator.d.ts +8 -0
- package/dist/types/src/client/shared/types/index.d.ts +1 -0
- package/dist/types/src/client/shared/types/translator-instance.d.ts +11 -0
- package/dist/types/src/client/shared/utils/build-cookie-string.d.ts +5 -0
- package/dist/types/src/client/shared/utils/index.d.ts +1 -0
- package/dist/types/src/client/shared/utils/locale/detect-browser-locale.d.ts +6 -0
- package/dist/types/src/client/shared/utils/locale/get-locale-cookie-browser.d.ts +6 -0
- package/dist/types/src/client/shared/utils/locale/index.d.ts +4 -0
- package/dist/types/src/client/shared/utils/locale/set-document-locale.d.ts +6 -0
- package/dist/types/src/client/shared/utils/locale/set-locale-cookie-browser.d.ts +7 -0
- package/dist/types/src/config/define-intor-config.d.ts +18 -0
- package/dist/types/src/config/index.d.ts +2 -0
- package/dist/types/src/config/resolvers/resolve-cookie-options.d.ts +2 -0
- package/dist/types/src/config/resolvers/resolve-fallback-locales.d.ts +20 -0
- package/dist/types/src/config/resolvers/resolve-routing-options.d.ts +2 -0
- package/dist/{src → types/src}/config/types/cache.types.d.ts +2 -2
- package/dist/types/src/config/types/cookie.types.d.ts +23 -0
- package/dist/{src → types/src}/config/types/intor-config.types.d.ts +2 -0
- package/dist/types/src/config/types/loader.types.d.ts +34 -0
- package/dist/types/src/config/types/logger.types.d.ts +9 -0
- package/dist/types/src/config/types/routing.types.d.ts +39 -0
- package/dist/types/src/config/types/translator.types.d.ts +7 -0
- package/dist/types/src/config/validators/validate-default-locale.d.ts +12 -0
- package/dist/types/src/config/validators/validate-supported-locales.d.ts +12 -0
- package/dist/types/src/routing/index.d.ts +1 -0
- package/dist/types/src/routing/locale/index.d.ts +1 -0
- package/dist/types/src/routing/locale/resolve-locale.d.ts +16 -0
- package/dist/types/src/routing/locale/types.d.ts +36 -0
- package/dist/types/src/routing/pathname/index.d.ts +1 -0
- package/dist/types/src/routing/pathname/resolve-pathname.d.ts +19 -0
- package/dist/types/src/routing/pathname/strategies/all.d.ts +6 -0
- package/dist/types/src/routing/pathname/strategies/except-default.d.ts +6 -0
- package/dist/types/src/routing/pathname/strategies/index.d.ts +3 -0
- package/dist/types/src/routing/pathname/strategies/none.d.ts +5 -0
- package/dist/types/src/routing/pathname/types.d.ts +28 -0
- package/dist/types/src/routing/resolve-navigation-target.d.ts +20 -0
- package/dist/types/src/routing/resolve-routing.d.ts +30 -0
- package/dist/types/src/server/helpers/index.d.ts +1 -0
- package/dist/types/src/server/helpers/local-messages-from-url.d.ts +21 -0
- package/dist/types/src/server/index.d.ts +6 -0
- package/dist/types/src/server/intor/index.d.ts +2 -0
- package/dist/types/src/server/intor/intor.d.ts +20 -0
- package/dist/types/src/server/intor/types.d.ts +9 -0
- package/dist/types/src/server/messages/index.d.ts +3 -0
- package/dist/types/src/server/messages/load-local-messages/index.d.ts +2 -0
- package/dist/types/src/server/messages/load-local-messages/load-local-messages.d.ts +15 -0
- package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.d.ts +5 -14
- package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/collect-file-entries/types.d.ts +1 -1
- package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.d.ts +2 -2
- package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/parse-file-entries/types.d.ts +1 -1
- package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/read-locale-messages.d.ts +2 -2
- package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/types.d.ts +1 -1
- package/dist/types/src/server/messages/load-local-messages/types.d.ts +22 -0
- package/dist/types/src/server/messages/load-messages.d.ts +14 -0
- package/dist/{src → types/src}/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.d.ts +1 -1
- package/dist/{src → types/src}/server/messages/load-remote-messages/fetch-locale-messages/types.d.ts +1 -0
- package/dist/types/src/server/messages/load-remote-messages/index.d.ts +2 -0
- package/dist/types/src/server/messages/load-remote-messages/load-remote-messages.d.ts +15 -0
- package/dist/{src → types/src}/server/messages/load-remote-messages/types.d.ts +4 -3
- package/dist/{src → types/src}/server/messages/types.d.ts +2 -3
- package/dist/{src → types/src}/server/shared/logger/get-logger.d.ts +1 -1
- package/dist/{src/server/messages/shared → types/src/server/shared/messages}/global-messages-pool.d.ts +8 -1
- package/dist/{src → types/src}/server/translator/get-translator.d.ts +8 -12
- package/dist/types/src/shared/constants/index.d.ts +1 -0
- package/dist/{src → types/src}/shared/error/intor-error.d.ts +4 -4
- package/dist/types/src/shared/types/generated.d.ts +53 -0
- package/dist/types/src/shared/types/index.d.ts +2 -0
- package/dist/types/src/shared/types/routing.d.ts +6 -0
- package/dist/types/src/shared/types/translator-instance.d.ts +27 -0
- package/dist/types/src/shared/utils/deep-merge.d.ts +8 -0
- package/dist/types/src/shared/utils/index.d.ts +4 -0
- package/dist/types/src/shared/utils/is-external-destination.d.ts +7 -0
- package/dist/types/src/shared/utils/locale/get-locale-from-accept-language.d.ts +19 -0
- package/dist/types/src/shared/utils/locale/get-locale-from-host.d.ts +17 -0
- package/dist/types/src/shared/utils/locale/get-locale-from-pathname.d.ts +31 -0
- package/dist/types/src/shared/utils/locale/get-locale-from-query.d.ts +20 -0
- package/dist/types/src/shared/utils/locale/index.d.ts +4 -0
- package/dist/types/src/shared/utils/normalizers/index.d.ts +3 -0
- package/dist/types/src/shared/utils/normalizers/normalize-cache-key.d.ts +14 -0
- package/dist/types/src/shared/utils/normalizers/normalize-locale.d.ts +22 -0
- package/dist/{src/shared/utils/pathname → types/src/shared/utils/normalizers}/normalize-pathname.d.ts +1 -1
- package/dist/types/src/shared/utils/pathname/get-unprefixed-pathname.d.ts +14 -0
- package/dist/types/src/shared/utils/pathname/index.d.ts +1 -0
- package/dist/types/src/shared/utils/pathname/locale-prefix-pathname.d.ts +16 -0
- package/dist/types/src/shared/utils/pathname/localize-pathname.d.ts +23 -0
- package/dist/types/src/shared/utils/pathname/standardize-pathname.d.ts +13 -0
- package/package.json +76 -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 -6
- package/dist/src/adapters/next/navigation/link.d.ts +0 -16
- package/dist/src/adapters/next/navigation/link.js +0 -25
- package/dist/src/adapters/next/navigation/redirect.d.ts +0 -16
- package/dist/src/adapters/next/navigation/redirect.js +0 -36
- package/dist/src/adapters/next/navigation/use-pathname.js +0 -49
- package/dist/src/adapters/next/navigation/use-router.d.ts +0 -20
- package/dist/src/adapters/next/navigation/use-router.js +0 -31
- 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/index.d.ts +0 -2
- package/dist/src/adapters/next/proxy/intor-proxy.d.ts +0 -6
- package/dist/src/adapters/next/proxy/intor-proxy.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/server/index.d.ts +0 -2
- 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/config/provider.d.ts +0 -2
- package/dist/src/client/react/contexts/intor-provider/intor-provider.d.ts +0 -2
- package/dist/src/client/react/contexts/locale/provider.js +0 -48
- package/dist/src/client/react/contexts/locale/utils/change-locale.d.ts +0 -22
- package/dist/src/client/react/contexts/locale/utils/change-locale.js +0 -35
- 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/messages/utils/use-refetch-messages.d.ts +0 -16
- package/dist/src/client/react/contexts/messages/utils/use-refetch-messages.js +0 -57
- 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/react/contexts/translator/hook.d.ts +0 -3
- package/dist/src/client/react/contexts/translator/types.d.ts +0 -11
- package/dist/src/client/react/hooks/use-translator.d.ts +0 -12
- package/dist/src/client/react/index.d.ts +0 -4
- 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/config/define-intor-config.d.ts +0 -2
- package/dist/src/config/index.d.ts +0 -5
- package/dist/src/config/resolvers/resolve-cookie-options.d.ts +0 -11
- package/dist/src/config/resolvers/resolve-cookie-options.js +0 -19
- package/dist/src/config/resolvers/resolve-fallback-locales.d.ts +0 -3
- package/dist/src/config/resolvers/resolve-routing-options.d.ts +0 -13
- package/dist/src/config/resolvers/resolve-routing-options.js +0 -28
- package/dist/src/config/types/cookie.types.d.ts +0 -23
- package/dist/src/config/types/loader.types.d.ts +0 -38
- package/dist/src/config/types/logger.types.d.ts +0 -7
- package/dist/src/config/types/routing.types.d.ts +0 -15
- package/dist/src/config/types/translator.types.d.ts +0 -4
- package/dist/src/config/validators/validate-default-locale.d.ts +0 -3
- package/dist/src/config/validators/validate-supported-locales.d.ts +0 -7
- package/dist/src/server/index.d.ts +0 -4
- package/dist/src/server/intor/index.d.ts +0 -2
- package/dist/src/server/intor/intor.d.ts +0 -14
- package/dist/src/server/intor/intor.js +0 -67
- package/dist/src/server/intor/types.d.ts +0 -14
- package/dist/src/server/messages/index.d.ts +0 -7
- package/dist/src/server/messages/load-local-messages/index.d.ts +0 -2
- package/dist/src/server/messages/load-local-messages/load-local-messages.d.ts +0 -11
- package/dist/src/server/messages/load-local-messages/load-local-messages.js +0 -85
- package/dist/src/server/messages/load-local-messages/types.d.ts +0 -21
- package/dist/src/server/messages/load-messages.d.ts +0 -11
- package/dist/src/server/messages/load-remote-messages/index.d.ts +0 -2
- package/dist/src/server/messages/load-remote-messages/load-remote-messages.d.ts +0 -9
- package/dist/src/server/messages/load-remote-messages/load-remote-messages.js +0 -79
- package/dist/src/shared/types/generated.types.d.ts +0 -30
- package/dist/src/shared/types/translator-instance.types.d.ts +0 -33
- 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/index.d.ts +0 -8
- 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/pathname/standardize-pathname.d.ts +0 -18
- package/dist/src/shared/utils/resolve-namespaces.d.ts +0 -10
- package/dist/src/shared/utils/resolve-namespaces.js +0 -33
- package/dist/{src → core/src}/config/constants/cache.constants.js +0 -0
- package/dist/{src → core/src}/config/resolvers/resolve-cache-options.js +0 -0
- package/dist/{src → core/src}/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.js +0 -0
- package/dist/{src → core/src}/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.js +0 -0
- package/dist/{src → core/src}/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -0
- package/dist/{src → core/src}/server/messages/shared/utils/is-valid-messages.js +0 -0
- package/dist/{src → core/src}/shared/constants/prefix-placeholder.js +0 -0
- package/dist/{src → core/src}/shared/error/intor-error.js +0 -0
- package/dist/{src → next/src}/server/shared/logger/global-logger-pool.js +0 -0
- package/dist/{src/server/messages/shared → next/src/server/shared/messages}/global-messages-pool.js +0 -0
- package/dist/{src → types/src}/adapters/next/navigation/index.d.ts +0 -0
- package/dist/{src → types/src}/client/react/contexts/config/context.d.ts +0 -0
- package/dist/{src → types/src}/client/react/contexts/config/hook.d.ts +0 -0
- package/dist/{src → types/src}/client/react/contexts/config/index.d.ts +0 -0
- package/dist/{src → types/src}/client/react/contexts/intor-provider/index.d.ts +0 -0
- package/dist/{src → types/src}/client/react/contexts/locale/context.d.ts +0 -0
- package/dist/{src → types/src}/client/react/contexts/locale/hook.d.ts +0 -0
- package/dist/{src → types/src}/client/react/contexts/locale/index.d.ts +0 -0
- package/dist/{src → types/src}/client/react/contexts/locale/provider.d.ts +0 -0
- package/dist/{src → types/src}/client/react/contexts/locale/types.d.ts +4 -4
- /package/dist/{src → types/src}/client/react/contexts/messages/context.d.ts +0 -0
- /package/dist/{src → types/src}/client/react/contexts/messages/hook.d.ts +0 -0
- /package/dist/{src → types/src}/client/react/contexts/messages/index.d.ts +0 -0
- /package/dist/{src → types/src}/client/react/contexts/messages/provider.d.ts +0 -0
- /package/dist/{src → types/src}/client/react/contexts/translator/context.d.ts +0 -0
- /package/dist/{src → types/src}/client/react/contexts/translator/index.d.ts +0 -0
- /package/dist/{src → types/src}/client/react/contexts/translator/provider.d.ts +0 -0
- /package/dist/{src → types/src}/config/constants/cache.constants.d.ts +0 -0
- /package/dist/{src → types/src}/config/constants/cookie.constants.d.ts +0 -0
- /package/dist/{src → types/src}/config/constants/routing.constants.d.ts +0 -0
- /package/dist/{src → types/src}/config/resolvers/resolve-cache-options.d.ts +0 -0
- /package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/collect-file-entries/index.d.ts +0 -0
- /package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/index.d.ts +0 -0
- /package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/parse-file-entries/index.d.ts +0 -0
- /package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.d.ts +0 -0
- /package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.d.ts +0 -0
- /package/dist/{src → types/src}/server/messages/load-remote-messages/fetch-locale-messages/index.d.ts +0 -0
- /package/dist/{src → types/src}/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.d.ts +0 -0
- /package/dist/{src → types/src}/server/messages/shared/types.d.ts +0 -0
- /package/dist/{src → types/src}/server/messages/shared/utils/is-valid-messages.d.ts +0 -0
- /package/dist/{src → types/src}/server/shared/logger/global-logger-pool.d.ts +0 -0
- /package/dist/{src → types/src}/server/translator/index.d.ts +0 -0
- /package/dist/{src → types/src}/shared/constants/prefix-placeholder.d.ts +0 -0
- /package/dist/{src → types/src}/shared/error/index.d.ts +0 -0
package/README.md
CHANGED
|
@@ -21,3 +21,82 @@ Fast to start, easy to extend, and free from the usual i18n heaviness.
|
|
|
21
21
|
#### 🍳 Cooking the Intor v2 docs, crafting them to perfection...
|
|
22
22
|
|
|
23
23
|
</div>
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
Intor separates language translation from semantic rendering.
|
|
28
|
+
ICU operates at the text-translation layer, while semantic tags
|
|
29
|
+
are parsed and rendered in a dedicated AST-based rendering phase.
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
┌──────────────────────────────────────────────┐
|
|
33
|
+
│ Application │
|
|
34
|
+
│ │
|
|
35
|
+
│ t() / tRich() / <T /> │
|
|
36
|
+
└───────────────────────────┬──────────────────┘
|
|
37
|
+
│
|
|
38
|
+
▼
|
|
39
|
+
┌──────────────────────────────────────────────┐
|
|
40
|
+
│ Translator (Language / Semantic) │
|
|
41
|
+
│ intor-translator │
|
|
42
|
+
│ │
|
|
43
|
+
│ Responsibilities: │
|
|
44
|
+
│ - Resolve message key │
|
|
45
|
+
│ - Locale resolution & fallback │
|
|
46
|
+
│ - Message loading │
|
|
47
|
+
│ - Text-level interpolation │
|
|
48
|
+
│ • {name}, {count} │
|
|
49
|
+
│ • plural / select │
|
|
50
|
+
│ • ICU MessageFormat (optional) │
|
|
51
|
+
│ (ignoreTag: true) │
|
|
52
|
+
│ │
|
|
53
|
+
│ Output: │
|
|
54
|
+
│ - Translated string │
|
|
55
|
+
│ - May still contain <semantic tags> │
|
|
56
|
+
└───────────────────────────┬──────────────────┘
|
|
57
|
+
│
|
|
58
|
+
▼
|
|
59
|
+
┌──────────────────────────────────────────────┐
|
|
60
|
+
│ Semantic Parsing & AST Construction │
|
|
61
|
+
│ │
|
|
62
|
+
│ Responsibilities: │
|
|
63
|
+
│ - Tokenize semantic tags │
|
|
64
|
+
│ • <b>, <link>, <Component> │
|
|
65
|
+
│ - Build semantic AST │
|
|
66
|
+
│ • TextNode │
|
|
67
|
+
│ • TagNode │
|
|
68
|
+
│ │
|
|
69
|
+
│ Note: │
|
|
70
|
+
│ - Independent from ICU / formatter │
|
|
71
|
+
│ - Pure semantic structure │
|
|
72
|
+
└───────────────────────────┬──────────────────┘
|
|
73
|
+
│
|
|
74
|
+
▼
|
|
75
|
+
┌──────────────────────────────────────────────┐
|
|
76
|
+
│ Semantic Rendering (Renderer) │
|
|
77
|
+
│ │
|
|
78
|
+
│ Responsibilities: │
|
|
79
|
+
│ - Traverse semantic AST │
|
|
80
|
+
│ - Render TextNode │
|
|
81
|
+
│ - Render TagNode │
|
|
82
|
+
│ │
|
|
83
|
+
│ Renderer decides output type: │
|
|
84
|
+
│ - string │
|
|
85
|
+
│ - ReactNode │
|
|
86
|
+
│ - Vue / Svelte nodes │
|
|
87
|
+
│ - Markdown / CLI output │
|
|
88
|
+
│ │
|
|
89
|
+
│ Optional extensions: │
|
|
90
|
+
│ - Custom tag renderers │
|
|
91
|
+
│ - Rich components │
|
|
92
|
+
└───────────────────────────┬──────────────────┘
|
|
93
|
+
│
|
|
94
|
+
▼
|
|
95
|
+
┌──────────────────────────────────────────────┐
|
|
96
|
+
│ Final Output │
|
|
97
|
+
│ │
|
|
98
|
+
│ - Rendered rich content │
|
|
99
|
+
│ - Framework-specific result │
|
|
100
|
+
│ │
|
|
101
|
+
└──────────────────────────────────────────────┘
|
|
102
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { defineIntorConfig } from '../../src/config/define-intor-config.js';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { PREFIX_PLACEHOLDER } from '../src/shared/constants/prefix-placeholder.js';
|
|
2
|
+
export { localizePathname } from '../src/shared/utils/pathname/localize-pathname.js';
|
|
3
|
+
export { IntorError, IntorErrorCode } from '../src/shared/error/intor-error.js';
|
|
4
|
+
import 'intor-translator';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { intor } from '../../src/server/intor/intor.js';
|
|
2
|
+
export { loadMessages } from '../../src/server/messages/load-messages.js';
|
|
3
|
+
export { isValidMessages } from '../../src/server/messages/shared/utils/is-valid-messages.js';
|
|
4
|
+
export { getTranslator } from '../../src/server/translator/get-translator.js';
|
|
5
|
+
export { clearLoggerPool } from '../../src/server/shared/logger/global-logger-pool.js';
|
|
6
|
+
export { clearMessagesPool, setGlobalMessagesPool } from '../../src/server/shared/messages/global-messages-pool.js';
|
|
7
|
+
export { loadLocalMessagesFromUrl } from '../../src/server/helpers/local-messages-from-url.js';
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
// Default routing options
|
|
2
2
|
const DEFAULT_ROUTING_OPTIONS = {
|
|
3
|
+
locale: {
|
|
4
|
+
sources: ["path", "query", "cookie", "detected"],
|
|
5
|
+
queryKey: "locale",
|
|
6
|
+
},
|
|
3
7
|
prefix: "none",
|
|
4
8
|
firstVisit: {
|
|
5
9
|
localeSource: "browser",
|
|
6
10
|
redirect: true,
|
|
11
|
+
persist: true,
|
|
7
12
|
},
|
|
8
13
|
basePath: "/",
|
|
14
|
+
forceFullReload: false,
|
|
9
15
|
};
|
|
10
16
|
|
|
11
17
|
export { DEFAULT_ROUTING_OPTIONS };
|
|
@@ -5,10 +5,24 @@ import { resolveRoutingOptions } from './resolvers/resolve-routing-options.js';
|
|
|
5
5
|
import { validateDefaultLocale } from './validators/validate-default-locale.js';
|
|
6
6
|
import { validateSupportedLocales } from './validators/validate-supported-locales.js';
|
|
7
7
|
|
|
8
|
+
/**
|
|
9
|
+
* Defines and resolves an Intor configuration.
|
|
10
|
+
*
|
|
11
|
+
* This is the canonical entry point for transforming a raw configuration
|
|
12
|
+
* into a fully validated and resolved Intor config.
|
|
13
|
+
*
|
|
14
|
+
* Responsibilities:
|
|
15
|
+
* - Validate required invariants
|
|
16
|
+
* - Resolve and normalize derived options
|
|
17
|
+
* - Apply stable defaults
|
|
18
|
+
*
|
|
19
|
+
* This function is purely declarative and side-effect free.
|
|
20
|
+
* It does not create runtime instances or attach dynamic behavior.
|
|
21
|
+
*
|
|
22
|
+
* Intended to run once during application initialization.
|
|
23
|
+
*/
|
|
8
24
|
const defineIntorConfig = (config) => {
|
|
9
|
-
//
|
|
10
|
-
const id = config.id || `ID${Math.random().toString(36).slice(2, 6)}`;
|
|
11
|
-
// Validaters
|
|
25
|
+
// Validators
|
|
12
26
|
const supportedLocales = validateSupportedLocales(config);
|
|
13
27
|
const defaultLocale = validateDefaultLocale(config, supportedLocales);
|
|
14
28
|
// Resolvers
|
|
@@ -17,7 +31,7 @@ const defineIntorConfig = (config) => {
|
|
|
17
31
|
const routing = resolveRoutingOptions(config.routing);
|
|
18
32
|
const cache = resolveCacheOptions(config.cache);
|
|
19
33
|
return {
|
|
20
|
-
id,
|
|
34
|
+
id: config.id ?? "default",
|
|
21
35
|
messages: config.messages,
|
|
22
36
|
loader: config.loader,
|
|
23
37
|
defaultLocale,
|
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves and normalizes fallback locale mappings.
|
|
3
|
+
*
|
|
4
|
+
* This utility validates the user-defined `fallbackLocales` configuration
|
|
5
|
+
* against the provided `supportedLocales` list and the configured `defaultLocale`.
|
|
6
|
+
*
|
|
7
|
+
* Resolution rules:
|
|
8
|
+
* - Only locales listed in `supportedLocales` are considered valid fallbacks.
|
|
9
|
+
* - The literal value `"default"` is always allowed and represents the configured default locale.
|
|
10
|
+
* - Fallback entries matching `defaultLocale` are treated as valid.
|
|
11
|
+
* - Invalid fallback locales are ignored and reported via warnings.
|
|
12
|
+
*
|
|
13
|
+
* Notes:
|
|
14
|
+
* - This function is purely defensive and does not throw on invalid input.
|
|
15
|
+
* - Only validated fallback mappings are included in the returned result.
|
|
16
|
+
* - Logging is used for diagnostics only and does not affect the output.
|
|
17
|
+
*/
|
|
1
18
|
const resolveFallbackLocales = (config, supportedLocales) => {
|
|
2
19
|
const { defaultLocale, fallbackLocales } = config;
|
|
3
20
|
if (!fallbackLocales || typeof fallbackLocales !== "object") {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DEFAULT_ROUTING_OPTIONS } from '../constants/routing.constants.js';
|
|
2
|
+
import { normalizePathname } from '../../shared/utils/normalizers/normalize-pathname.js';
|
|
3
|
+
|
|
4
|
+
const resolveRoutingOptions = (routing = {}) => {
|
|
5
|
+
return {
|
|
6
|
+
...DEFAULT_ROUTING_OPTIONS,
|
|
7
|
+
...routing,
|
|
8
|
+
locale: {
|
|
9
|
+
...DEFAULT_ROUTING_OPTIONS.locale,
|
|
10
|
+
...routing.locale,
|
|
11
|
+
},
|
|
12
|
+
firstVisit: {
|
|
13
|
+
...DEFAULT_ROUTING_OPTIONS.firstVisit,
|
|
14
|
+
...routing.firstVisit,
|
|
15
|
+
},
|
|
16
|
+
basePath: normalizePathname(routing?.basePath || ""),
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export { resolveRoutingOptions };
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { IntorError, IntorErrorCode } from '../../shared/error/intor-error.js';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Validates the configured default locale.
|
|
5
|
+
*
|
|
6
|
+
* - Ensures that `defaultLocale` is explicitly defined.
|
|
7
|
+
* - Ensures that `defaultLocale` is included in `supportedLocales`.
|
|
8
|
+
*
|
|
9
|
+
* This validation is part of the configuration initialization phase
|
|
10
|
+
* and is expected to fail fast when misconfigured.
|
|
11
|
+
*/
|
|
3
12
|
const validateDefaultLocale = (config, supportedLocales) => {
|
|
4
13
|
const { id, defaultLocale } = config;
|
|
5
14
|
// Throw error if defaultLocale is undefined
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { IntorError, IntorErrorCode } from '../../shared/error/intor-error.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Validates and resolves the list of supported locales.
|
|
5
|
+
*
|
|
6
|
+
* - Ensures `supportedLocales` is explicitly provided when a loader is used.
|
|
7
|
+
* - Falls back to inferring locales from static message keys when no loader
|
|
8
|
+
* is configured.
|
|
9
|
+
*
|
|
10
|
+
* This validation runs during configuration initialization and is expected
|
|
11
|
+
* to fail fast when required inputs are missing.
|
|
7
12
|
*/
|
|
8
13
|
const validateSupportedLocales = (config) => {
|
|
9
14
|
const { id, loader, supportedLocales } = config;
|
|
@@ -0,0 +1,48 @@
|
|
|
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 local locale messages from a URL-based query protocol.
|
|
15
|
+
*
|
|
16
|
+
* - A convenience helper for exposing local messages through a URL-accessible interface.
|
|
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 loadLocalMessagesFromUrl(url);
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
async function loadLocalMessagesFromUrl(url, extraOptions) {
|
|
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
|
+
rootDir,
|
|
41
|
+
locale,
|
|
42
|
+
namespaces,
|
|
43
|
+
fallbackLocales,
|
|
44
|
+
extraOptions,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export { loadLocalMessagesFromUrl };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { loadMessages } from '../messages/load-messages.js';
|
|
2
|
+
import { getLogger } from '../shared/logger/get-logger.js';
|
|
3
|
+
import { deepMerge } from '../../shared/utils/deep-merge.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Entry point for initializing Intor.
|
|
7
|
+
*
|
|
8
|
+
* This function orchestrates the initialization flow:
|
|
9
|
+
*
|
|
10
|
+
* - Resolves the initial locale using a provided locale resolver
|
|
11
|
+
* - Loads locale messages if the message loader is enabled
|
|
12
|
+
* - Returns a fully-initialized Intor result
|
|
13
|
+
*
|
|
14
|
+
* This function does not perform routing decisions itself.
|
|
15
|
+
* Locale resolution is delegated to the provided `getLocale` implementation.
|
|
16
|
+
*/
|
|
17
|
+
const intor = async (config, getLocale, loadMessagesOptions = {}) => {
|
|
18
|
+
const baseLogger = getLogger({ id: config.id, ...config.logger });
|
|
19
|
+
const logger = baseLogger.child({ scope: "intor" });
|
|
20
|
+
logger.info("Start Intor initialization.");
|
|
21
|
+
// Resolve initial locale
|
|
22
|
+
const isLocaleFunction = typeof getLocale === "function";
|
|
23
|
+
const locale = isLocaleFunction
|
|
24
|
+
? await getLocale(config)
|
|
25
|
+
: getLocale || config.defaultLocale;
|
|
26
|
+
const source = typeof getLocale === "function" ? "resolver" : "static";
|
|
27
|
+
logger.debug(`Initial locale resolved as "${locale}" via "${source}".`);
|
|
28
|
+
// Load messages (if enabled)
|
|
29
|
+
let loadedMessages;
|
|
30
|
+
if (config.loader) {
|
|
31
|
+
loadedMessages = await loadMessages({
|
|
32
|
+
config,
|
|
33
|
+
locale,
|
|
34
|
+
extraOptions: {
|
|
35
|
+
exts: loadMessagesOptions.exts,
|
|
36
|
+
messagesReader: loadMessagesOptions.messagesReader,
|
|
37
|
+
},
|
|
38
|
+
allowCacheWrite: true,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
logger.info("Intor initialized.");
|
|
42
|
+
return {
|
|
43
|
+
config,
|
|
44
|
+
initialLocale: locale,
|
|
45
|
+
messages: deepMerge(config.messages, loadedMessages) || {},
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export { intor };
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import pLimit from 'p-limit';
|
|
3
|
+
import { DEFAULT_CACHE_OPTIONS } from '../../../config/constants/cache.constants.js';
|
|
4
|
+
import { readLocaleMessages } from './read-locale-messages/read-locale-messages.js';
|
|
5
|
+
import { getLogger } from '../../shared/logger/get-logger.js';
|
|
6
|
+
import { getGlobalMessagesPool } from '../../shared/messages/global-messages-pool.js';
|
|
7
|
+
import { normalizeCacheKey } from '../../../shared/utils/normalizers/normalize-cache-key.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Load locale messages from the local file system.
|
|
11
|
+
*
|
|
12
|
+
* This function acts as the orchestration layer for local message loading.
|
|
13
|
+
* It is responsible for:
|
|
14
|
+
*
|
|
15
|
+
* - Resolving fallback locales in order
|
|
16
|
+
* - Coordinating cache read / write behavior
|
|
17
|
+
* - Limiting concurrent file reads for performance
|
|
18
|
+
*
|
|
19
|
+
* File system traversal, parsing, and message validation are delegated to lower-level utilities.
|
|
20
|
+
*/
|
|
21
|
+
const loadLocalMessages = async ({ pool = getGlobalMessagesPool(), rootDir = "messages", locale, fallbackLocales, namespaces, extraOptions: { concurrency = 10, cacheOptions = DEFAULT_CACHE_OPTIONS, loggerOptions = { id: "default" }, exts, messagesReader, } = {}, allowCacheWrite = false, }) => {
|
|
22
|
+
const baseLogger = getLogger({ ...loggerOptions });
|
|
23
|
+
const logger = baseLogger.child({ scope: "load-local-messages" });
|
|
24
|
+
const start = performance.now();
|
|
25
|
+
logger.debug("Loading local messages.", {
|
|
26
|
+
rootDir,
|
|
27
|
+
resolvedRootDir: path.resolve(process.cwd(), rootDir),
|
|
28
|
+
});
|
|
29
|
+
// --- Cache key
|
|
30
|
+
const cacheKey = normalizeCacheKey([
|
|
31
|
+
loggerOptions.id,
|
|
32
|
+
"loaderType:local",
|
|
33
|
+
rootDir,
|
|
34
|
+
locale,
|
|
35
|
+
(fallbackLocales || []).toSorted().join(","),
|
|
36
|
+
(namespaces || []).toSorted().join(","),
|
|
37
|
+
]);
|
|
38
|
+
// --- Cache read --------------------------------------------------
|
|
39
|
+
if (cacheOptions.enabled && cacheKey) {
|
|
40
|
+
const cached = await pool?.get(cacheKey);
|
|
41
|
+
if (cached) {
|
|
42
|
+
logger.debug("Messages cache hit.", { key: cacheKey });
|
|
43
|
+
return cached;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const limit = pLimit(concurrency);
|
|
47
|
+
const candidateLocales = [locale, ...(fallbackLocales || [])];
|
|
48
|
+
let messages;
|
|
49
|
+
// Try each candidate locale in order and stop at the first successful result
|
|
50
|
+
for (let i = 0; i < candidateLocales.length; i++) {
|
|
51
|
+
const candidateLocale = candidateLocales[i];
|
|
52
|
+
const isLast = i === candidateLocales.length - 1;
|
|
53
|
+
try {
|
|
54
|
+
const readed = await readLocaleMessages({
|
|
55
|
+
limit,
|
|
56
|
+
rootDir,
|
|
57
|
+
locale: candidateLocale,
|
|
58
|
+
namespaces,
|
|
59
|
+
extraOptions: { loggerOptions, exts, messagesReader },
|
|
60
|
+
});
|
|
61
|
+
// Stop at the first locale that yields non-empty messages
|
|
62
|
+
if (Object.values(readed[candidateLocale] || {}).length > 0) {
|
|
63
|
+
messages = readed;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
if (isLast) {
|
|
69
|
+
logger.warn("Failed to load messages for all candidate locales.", {
|
|
70
|
+
locale,
|
|
71
|
+
fallbackLocales,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
logger.warn(`Failed to load locale messages for "${candidateLocale}", trying next fallback.`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// --- Cache write --------------------------------------------------
|
|
80
|
+
if (allowCacheWrite && cacheOptions.enabled && cacheKey && messages) {
|
|
81
|
+
await pool?.set(cacheKey, messages, cacheOptions.ttl);
|
|
82
|
+
}
|
|
83
|
+
// Final success log with resolved locale and timing
|
|
84
|
+
if (messages) {
|
|
85
|
+
logger.trace("Finished loading local messages.", {
|
|
86
|
+
loadedLocale: Object.keys(messages)[0],
|
|
87
|
+
duration: `${Math.round(performance.now() - start)} ms`,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return messages;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export { loadLocalMessages };
|
|
@@ -10,36 +10,29 @@ import { getLogger } from '../../../../shared/logger/get-logger.js';
|
|
|
10
10
|
*
|
|
11
11
|
* @example
|
|
12
12
|
* ```ts
|
|
13
|
-
* [
|
|
14
|
-
*
|
|
15
|
-
* namespace: "index", // "index" = messages under locale root (no namespace)
|
|
16
|
-
* fullPath: "/Users/john/my-app/messages/en-US/index.json",
|
|
17
|
-
* relativePath: "index.json",
|
|
18
|
-
* segments: ["index"],
|
|
19
|
-
* basename: "index",
|
|
20
|
-
* },
|
|
21
|
-
* {
|
|
22
|
-
* namespace: "auth",
|
|
13
|
+
* [{
|
|
14
|
+
* namespace: "auth", // If messages under locale root (no namespace) -> "index"
|
|
23
15
|
* fullPath: "/Users/john/my-app/messages/en-US/auth/login.json",
|
|
24
16
|
* relativePath: "auth/login.json",
|
|
25
17
|
* segments: ["auth", "login"],
|
|
26
18
|
* basename: "login",
|
|
27
|
-
*
|
|
28
|
-
* ];
|
|
19
|
+
* }, ... ];
|
|
29
20
|
* ```
|
|
30
21
|
*/
|
|
31
22
|
async function collectFileEntries({ readdir = fs.readdir, limit, rootDir, namespaces, extraOptions: { exts = [".json"], loggerOptions } = {}, }) {
|
|
32
23
|
const baseLogger = getLogger({ ...loggerOptions });
|
|
33
24
|
const logger = baseLogger.child({ scope: "collect-file-entries" });
|
|
34
|
-
const
|
|
25
|
+
const fileEntries = [];
|
|
35
26
|
const walk = async (currentDir) => {
|
|
36
27
|
// Read current directory entries
|
|
37
28
|
let entries = [];
|
|
38
29
|
try {
|
|
39
30
|
entries = await readdir(currentDir, { withFileTypes: true });
|
|
40
31
|
}
|
|
41
|
-
catch
|
|
42
|
-
logger.
|
|
32
|
+
catch {
|
|
33
|
+
logger.debug("Locale directory not found, skipping locale.", {
|
|
34
|
+
localeDir: currentDir,
|
|
35
|
+
});
|
|
43
36
|
return;
|
|
44
37
|
}
|
|
45
38
|
// Process each directory entry and collect valid files
|
|
@@ -65,7 +58,7 @@ async function collectFileEntries({ readdir = fs.readdir, limit, rootDir, namesp
|
|
|
65
58
|
if (!namespaces.includes(namespace))
|
|
66
59
|
return;
|
|
67
60
|
}
|
|
68
|
-
|
|
61
|
+
fileEntries.push({
|
|
69
62
|
namespace,
|
|
70
63
|
fullPath,
|
|
71
64
|
relativePath,
|
|
@@ -76,20 +69,10 @@ async function collectFileEntries({ readdir = fs.readdir, limit, rootDir, namesp
|
|
|
76
69
|
await Promise.all(tasks);
|
|
77
70
|
};
|
|
78
71
|
await walk(rootDir);
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
logger.debug("Local message files collected.", {
|
|
82
|
-
count: results.length,
|
|
83
|
-
});
|
|
72
|
+
if (fileEntries.length > 0) {
|
|
73
|
+
logger.trace(`Collected ${fileEntries.length} local message files for locale "${path.basename(rootDir)}".`);
|
|
84
74
|
}
|
|
85
|
-
|
|
86
|
-
count: results.length,
|
|
87
|
-
fileEntries: results.map(({ namespace, relativePath }) => ({
|
|
88
|
-
namespace: namespace === "index" ? null : namespace,
|
|
89
|
-
relativePath,
|
|
90
|
-
})),
|
|
91
|
-
});
|
|
92
|
-
return results;
|
|
75
|
+
return fileEntries;
|
|
93
76
|
}
|
|
94
77
|
|
|
95
78
|
export { collectFileEntries };
|
|
@@ -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;
|
|
@@ -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
|
|