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
|
@@ -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
|
};
|
|
@@ -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,
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { DEFAULT_CACHE_OPTIONS } from '../../../config/constants/cache.constants.js';
|
|
2
|
+
import { fetchLocaleMessages } from './fetch-locale-messages/fetch-locale-messages.js';
|
|
3
|
+
import { buildSearchParams } from './fetch-locale-messages/utils/build-search-params.js';
|
|
4
|
+
import { getLogger } from '../../shared/logger/get-logger.js';
|
|
5
|
+
import { getGlobalMessagesPool } from '../../shared/messages/global-messages-pool.js';
|
|
6
|
+
import { normalizeCacheKey } from '../../../shared/utils/normalizers/normalize-cache-key.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Load locale messages from a remote API.
|
|
10
|
+
*
|
|
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.
|
|
19
|
+
*/
|
|
20
|
+
const loadRemoteMessages = async ({ pool = getGlobalMessagesPool(), rootDir, locale, fallbackLocales, namespaces, remoteUrl, remoteHeaders, extraOptions: { cacheOptions = DEFAULT_CACHE_OPTIONS, loggerOptions = { id: "default" }, } = {}, allowCacheWrite = false, signal, }) => {
|
|
21
|
+
const baseLogger = getLogger({ ...loggerOptions });
|
|
22
|
+
const logger = baseLogger.child({ scope: "load-remote-messages" });
|
|
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
|
+
}
|
|
28
|
+
const start = performance.now();
|
|
29
|
+
logger.debug("Loading remote messages.", { remoteUrl });
|
|
30
|
+
// --- Cache key
|
|
31
|
+
const cacheKey = normalizeCacheKey([
|
|
32
|
+
loggerOptions.id,
|
|
33
|
+
"loaderType:remote",
|
|
34
|
+
rootDir,
|
|
35
|
+
locale,
|
|
36
|
+
(fallbackLocales ?? []).toSorted().join(","),
|
|
37
|
+
(namespaces ?? []).toSorted().join(","),
|
|
38
|
+
]);
|
|
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
|
+
}
|
|
46
|
+
if (cached) {
|
|
47
|
+
logger.debug("Messages cache hit.", { key: cacheKey });
|
|
48
|
+
return cached;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const candidateLocales = [locale, ...(fallbackLocales || [])];
|
|
52
|
+
let messages;
|
|
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;
|
|
57
|
+
try {
|
|
58
|
+
const fetched = await fetchLocaleMessages({
|
|
59
|
+
remoteUrl,
|
|
60
|
+
remoteHeaders,
|
|
61
|
+
locale: candidateLocale,
|
|
62
|
+
searchParams: buildSearchParams({ rootDir, namespaces }),
|
|
63
|
+
extraOptions: { loggerOptions },
|
|
64
|
+
signal,
|
|
65
|
+
});
|
|
66
|
+
// Stop at the first locale that yields non-empty messages
|
|
67
|
+
if (fetched && Object.values(fetched[candidateLocale] || {}).length > 0) {
|
|
68
|
+
messages = fetched;
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
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.", {
|
|
87
|
+
locale: candidateLocale,
|
|
88
|
+
error,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
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
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return messages;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
export { loadRemoteMessages };
|
|
@@ -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
|
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
function getGlobalLoggerPool() {
|
|
2
|
+
if (!globalThis.__INTOR_LOGGER_POOL__) {
|
|
3
|
+
globalThis.__INTOR_LOGGER_POOL__ = new Map();
|
|
4
|
+
}
|
|
5
|
+
return globalThis.__INTOR_LOGGER_POOL__;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Optional: clear all cache
|
|
9
|
+
* Useful in tests or dynamic reloads.
|
|
10
|
+
*/
|
|
11
|
+
function clearLoggerPool() {
|
|
12
|
+
const pool = getGlobalLoggerPool();
|
|
13
|
+
pool.clear();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { clearLoggerPool, getGlobalLoggerPool };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import Keyv from 'keyv';
|
|
2
|
+
|
|
3
|
+
function getGlobalMessagesPool() {
|
|
4
|
+
if (!globalThis.__INTOR_MESSAGES_POOL__) {
|
|
5
|
+
globalThis.__INTOR_MESSAGES_POOL__ = new Keyv();
|
|
6
|
+
}
|
|
7
|
+
return globalThis.__INTOR_MESSAGES_POOL__;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Replace the global messages pool.
|
|
11
|
+
*
|
|
12
|
+
* - Intended for advanced usage (e.g. Redis, custom cache backends).
|
|
13
|
+
* - Must be called during application bootstrap.
|
|
14
|
+
*/
|
|
15
|
+
function setGlobalMessagesPool(pool) {
|
|
16
|
+
globalThis.__INTOR_MESSAGES_POOL__ = pool;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Optional: clear all cache
|
|
20
|
+
* - Useful in tests or dynamic reloads.
|
|
21
|
+
*/
|
|
22
|
+
function clearMessagesPool() {
|
|
23
|
+
const pool = getGlobalMessagesPool();
|
|
24
|
+
pool.clear();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { clearMessagesPool, getGlobalMessagesPool, setGlobalMessagesPool };
|
|
@@ -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,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deeply merges two objects.
|
|
3
|
+
* - Nested objects → merged recursively
|
|
4
|
+
* - Array / primitive → b overwrites a
|
|
5
|
+
*/
|
|
6
|
+
const deepMerge = (a, b) => {
|
|
7
|
+
if (!a && !b)
|
|
8
|
+
return undefined;
|
|
9
|
+
if (!a)
|
|
10
|
+
return b;
|
|
11
|
+
if (!b)
|
|
12
|
+
return a;
|
|
13
|
+
const result = { ...a };
|
|
14
|
+
for (const key in b) {
|
|
15
|
+
if (Object.prototype.hasOwnProperty.call(b, key)) {
|
|
16
|
+
const av = a[key];
|
|
17
|
+
const bv = b[key];
|
|
18
|
+
if (av &&
|
|
19
|
+
bv &&
|
|
20
|
+
typeof av === "object" &&
|
|
21
|
+
typeof bv === "object" &&
|
|
22
|
+
!Array.isArray(av) &&
|
|
23
|
+
!Array.isArray(bv)) {
|
|
24
|
+
// recursive merge
|
|
25
|
+
result[key] = deepMerge(av, bv);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// overwrite with primitive or array
|
|
29
|
+
result[key] = bv;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export { deepMerge };
|
|
@@ -1,16 +1,29 @@
|
|
|
1
1
|
const CACHE_KEY_DELIMITER = "|";
|
|
2
|
-
// Helper FC
|
|
3
2
|
const sanitize = (k) => k
|
|
4
3
|
.replaceAll(/[\u200B-\u200D\uFEFF]/g, "")
|
|
5
4
|
.replaceAll(/[\r\n]/g, "")
|
|
6
5
|
.trim();
|
|
6
|
+
/**
|
|
7
|
+
* Normalizes a value into a stable cache key string.
|
|
8
|
+
*
|
|
9
|
+
* - Supports primitive values and structured array keys.
|
|
10
|
+
* - Produces deterministic output suitable for cache identifiers.
|
|
11
|
+
*
|
|
12
|
+
* Notes:
|
|
13
|
+
* - `null`, `undefined`, or empty arrays return `null`.
|
|
14
|
+
* - Special tokens are used for boolean, null, and undefined values
|
|
15
|
+
* to preserve semantic differences.
|
|
16
|
+
*/
|
|
7
17
|
const normalizeCacheKey = (key, delimiter = CACHE_KEY_DELIMITER) => {
|
|
18
|
+
// Treat nullish values as "no cache key"
|
|
8
19
|
if (key === null || key === undefined)
|
|
9
20
|
return null;
|
|
10
21
|
if (Array.isArray(key)) {
|
|
22
|
+
// Empty array produces no meaningful cache key
|
|
11
23
|
if (key.length === 0)
|
|
12
24
|
return null;
|
|
13
25
|
const normalized = key.map((k) => {
|
|
26
|
+
// Preserve semantic differences for special values
|
|
14
27
|
if (k === null)
|
|
15
28
|
return "__null";
|
|
16
29
|
if (k === undefined)
|
|
@@ -19,10 +32,13 @@ const normalizeCacheKey = (key, delimiter = CACHE_KEY_DELIMITER) => {
|
|
|
19
32
|
return k ? "__true" : "__false";
|
|
20
33
|
return sanitize(String(k));
|
|
21
34
|
});
|
|
35
|
+
// Join segments into a single deterministic cache key
|
|
22
36
|
return normalized.join(delimiter);
|
|
23
37
|
}
|
|
38
|
+
// Normalize boolean primitives explicitly
|
|
24
39
|
if (typeof key === "boolean")
|
|
25
40
|
return key ? "__true" : "__false";
|
|
41
|
+
// Fallback: stringify primitive values
|
|
26
42
|
return String(key);
|
|
27
43
|
};
|
|
28
44
|
|
package/dist/{src/shared/utils/pathname → core/src/shared/utils/normalizers}/normalize-pathname.js
RENAMED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* - Trims leading and trailing whitespace (code points ≤ 32).
|
|
5
5
|
* - Collapses consecutive slashes into a single slash.
|
|
6
|
-
* - Ensures a leading slash and removes trailing slashes.
|
|
6
|
+
* - Ensures a single leading slash and removes redundant trailing slashes.
|
|
7
7
|
* - Optionally removes the leading slash.
|
|
8
8
|
* - Avoids intermediate array allocations for performance.
|
|
9
9
|
*/
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { normalizePathname } from '../normalizers/normalize-pathname.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Returns a canonical, locale-agnostic pathname.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* // config.supportedLocales: ["en-US"]
|
|
9
|
+
* // config.routing.basePath: "/app"
|
|
10
|
+
* // config.routing.prefix: "all"
|
|
11
|
+
* getUnprefixedPathname(config, "/app/en-US/about" );
|
|
12
|
+
* // => "/about"
|
|
13
|
+
*```
|
|
14
|
+
*/
|
|
15
|
+
function getUnprefixedPathname(config, rawPathname) {
|
|
16
|
+
const { routing, supportedLocales } = config;
|
|
17
|
+
const { basePath } = routing;
|
|
18
|
+
// 1. Normalize pathname
|
|
19
|
+
const normalizedPathname = normalizePathname(rawPathname);
|
|
20
|
+
// 2. Strip basePath
|
|
21
|
+
let prefixedPathname = normalizedPathname;
|
|
22
|
+
if (basePath && normalizedPathname === basePath) {
|
|
23
|
+
prefixedPathname = "/";
|
|
24
|
+
}
|
|
25
|
+
else if (basePath && normalizedPathname.startsWith(basePath + "/")) {
|
|
26
|
+
prefixedPathname = normalizedPathname.slice(basePath.length);
|
|
27
|
+
}
|
|
28
|
+
// 3. Detect locale segment
|
|
29
|
+
const firstSegment = prefixedPathname.split("/").find(Boolean);
|
|
30
|
+
const locale = firstSegment && supportedLocales.includes(firstSegment)
|
|
31
|
+
? firstSegment
|
|
32
|
+
: undefined;
|
|
33
|
+
// 4. Strip locale segment
|
|
34
|
+
return locale
|
|
35
|
+
? prefixedPathname.slice(locale.length + 1) || "/"
|
|
36
|
+
: prefixedPathname;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { getUnprefixedPathname };
|
|
@@ -1,32 +1,37 @@
|
|
|
1
|
-
import { PREFIX_PLACEHOLDER } from '
|
|
2
|
-
import '
|
|
3
|
-
import { normalizePathname } from '../../../../shared/utils/pathname/normalize-pathname.js';
|
|
1
|
+
import { PREFIX_PLACEHOLDER } from '../../constants/prefix-placeholder.js';
|
|
2
|
+
import { normalizePathname } from '../normalizers/normalize-pathname.js';
|
|
4
3
|
|
|
5
4
|
/**
|
|
6
|
-
*
|
|
5
|
+
* Applies routing prefix strategy by resolving the locale placeholder.
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* // config.routing.prefix: "all"
|
|
10
|
+
* localePrefixPathname({ config, pathname: "/app/{locale}/about", locale: "en-US" });
|
|
11
|
+
* // => /app/en-US/about
|
|
12
|
+
*
|
|
13
|
+
* // config.routing.prefix: "none"
|
|
14
|
+
* localePrefixPathname({ config, pathname: "/app/{locale}/about", locale: "en-US" });
|
|
15
|
+
* // => /app/about
|
|
16
|
+
* ```
|
|
12
17
|
*/
|
|
13
|
-
const localePrefixPathname = (
|
|
18
|
+
const localePrefixPathname = (config, standardizedPathname, locale) => {
|
|
14
19
|
const { routing } = config;
|
|
15
20
|
const { prefix } = routing;
|
|
16
21
|
if (prefix !== "none" && !locale) {
|
|
17
22
|
throw new Error('No locale when using prefix "all", "except-default"');
|
|
18
23
|
}
|
|
19
|
-
//
|
|
24
|
+
// prefix: "all"
|
|
20
25
|
if (prefix === "all") {
|
|
21
26
|
return normalizePathname(standardizedPathname.replaceAll(PREFIX_PLACEHOLDER, locale));
|
|
22
27
|
}
|
|
23
|
-
//
|
|
28
|
+
// prefix: "except-default"
|
|
24
29
|
if (prefix === "except-default") {
|
|
25
30
|
return locale === config.defaultLocale
|
|
26
31
|
? normalizePathname(standardizedPathname.replaceAll(`/${PREFIX_PLACEHOLDER}`, ""))
|
|
27
32
|
: normalizePathname(standardizedPathname.replaceAll(PREFIX_PLACEHOLDER, locale));
|
|
28
33
|
}
|
|
29
|
-
//
|
|
34
|
+
// prefix: "none"
|
|
30
35
|
return normalizePathname(standardizedPathname.replaceAll(`/${PREFIX_PLACEHOLDER}`, ""));
|
|
31
36
|
};
|
|
32
37
|
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { getUnprefixedPathname } from './get-unprefixed-pathname.js';
|
|
2
|
+
import { localePrefixPathname } from './locale-prefix-pathname.js';
|
|
3
|
+
import { standardizePathname } from './standardize-pathname.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Localizes a pathname by composing canonicalization,
|
|
7
|
+
* standardization, and locale prefix strategies.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* // config.supportedLocales: ["en-US"]
|
|
12
|
+
* // config.routing.basePath: "/app"
|
|
13
|
+
* // config.routing.prefix: "all"
|
|
14
|
+
* localePrefixPathname({ config, pathname: "/app/en-US/about", locale: "en-US" });
|
|
15
|
+
* // => {
|
|
16
|
+
* // unprefixedPathname: '/about',
|
|
17
|
+
* // standardizedPathname: '/app/{locale}/about',
|
|
18
|
+
* // localizedPathname: '/app/en-US/about'
|
|
19
|
+
* // }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
const localizePathname = (config, rawPathname, locale) => {
|
|
23
|
+
// 1. Canonicalize: extract basePath and strip locale
|
|
24
|
+
const unprefixedPathname = getUnprefixedPathname(config, rawPathname);
|
|
25
|
+
// 2. Standardize: build a pathname with locale placeholder
|
|
26
|
+
const standardizedPathname = standardizePathname(config, unprefixedPathname);
|
|
27
|
+
// 3. Apply strategy: resolve locale prefix based on routing rules
|
|
28
|
+
const localizedPathname = localePrefixPathname(config, standardizedPathname, locale);
|
|
29
|
+
return {
|
|
30
|
+
unprefixedPathname,
|
|
31
|
+
standardizedPathname,
|
|
32
|
+
localizedPathname,
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export { localizePathname };
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
import { PREFIX_PLACEHOLDER } from '../../constants/prefix-placeholder.js';
|
|
2
|
-
import { normalizePathname } from '
|
|
2
|
+
import { normalizePathname } from '../normalizers/normalize-pathname.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Standardizes a canonical pathname by applying the base path
|
|
6
|
+
* and injecting the locale placeholder.
|
|
7
7
|
*
|
|
8
|
+
* @example
|
|
8
9
|
* ```ts
|
|
10
|
+
* // routing.basePath: "/app",
|
|
9
11
|
* standardizePathname({ config, pathname: "/cms" });
|
|
10
|
-
* //
|
|
11
|
-
* // prefixPlaceHolder: "{locale}"
|
|
12
|
-
* => "/asd/qwe/{locale}/cms"
|
|
12
|
+
* // => "/app/{locale}/cms"
|
|
13
13
|
* ```
|
|
14
14
|
*/
|
|
15
|
-
const standardizePathname = (
|
|
15
|
+
const standardizePathname = (config, unprefixedPathname) => {
|
|
16
16
|
const { routing } = config;
|
|
17
17
|
const { basePath } = routing;
|
|
18
18
|
// Normalize each segment before join to avoid redundant slashes
|
|
19
19
|
const parts = [
|
|
20
20
|
normalizePathname(basePath),
|
|
21
21
|
PREFIX_PLACEHOLDER,
|
|
22
|
-
normalizePathname(
|
|
22
|
+
normalizePathname(unprefixedPathname),
|
|
23
23
|
];
|
|
24
24
|
// Avoid double slashes between segments
|
|
25
25
|
const standardizedPathname = parts.join("/").replaceAll(/\/{2,}/g, "/");
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { Link } from '../../src/adapters/next/navigation/link.js';
|
|
2
|
+
export { usePathname } from '../../src/adapters/next/navigation/use-pathname.js';
|
|
3
|
+
export { useRouter } from '../../src/adapters/next/navigation/use-router.js';
|
|
4
|
+
export { redirect } from '../../src/adapters/next/navigation/redirect.js';
|