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
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build URLSearchParams from an object.
|
|
3
|
+
* Supports string or string[] values. Ignores undefined/null.
|
|
4
|
+
*/
|
|
5
|
+
const buildSearchParams = (params) => {
|
|
6
|
+
const searchParams = new URLSearchParams();
|
|
7
|
+
const appendParam = (key, value) => {
|
|
8
|
+
if (value === undefined || value === null)
|
|
9
|
+
return;
|
|
10
|
+
if (Array.isArray(value) && value.length === 0)
|
|
11
|
+
return;
|
|
12
|
+
if (Array.isArray(value)) {
|
|
13
|
+
value.forEach((v) => v && searchParams.append(key, v));
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
searchParams.append(key, value);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
20
|
+
appendParam(key, value);
|
|
21
|
+
});
|
|
22
|
+
return searchParams;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export { buildSearchParams };
|
|
@@ -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 };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** Check if a value is a plain object (not null, not array) */
|
|
2
|
+
function isPlainObject(value) {
|
|
3
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Check if a value is a valid **Messages** object.
|
|
7
|
+
*
|
|
8
|
+
* - Uses an iterative approach to avoid stack overflow with deeply nested objects.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* isValidMessages({ en: { hello: "Hello" } }) // true
|
|
13
|
+
* isValidMessages({ en: { count: 5 } }) // false
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
function isValidMessages(value) {
|
|
17
|
+
if (!isPlainObject(value))
|
|
18
|
+
return false;
|
|
19
|
+
const stack = [value];
|
|
20
|
+
while (stack.length > 0) {
|
|
21
|
+
const current = stack.pop();
|
|
22
|
+
for (const v of Object.values(current)) {
|
|
23
|
+
if (typeof v === "string")
|
|
24
|
+
continue;
|
|
25
|
+
if (isPlainObject(v)) {
|
|
26
|
+
stack.push(v);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { isPlainObject, isValidMessages };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { logry } from 'logry';
|
|
2
|
+
import { getGlobalLoggerPool } from './global-logger-pool.js';
|
|
3
|
+
|
|
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 },
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Get a shared logger instance by id.
|
|
14
|
+
* - Safe across hot reloads
|
|
15
|
+
* - Prevents unbounded memory usage via soft LRU
|
|
16
|
+
*/
|
|
17
|
+
function getLogger({ id = "default", formatConfig, renderConfig, preset, ...options }) {
|
|
18
|
+
const pool = getGlobalLoggerPool();
|
|
19
|
+
let logger = pool.get(id);
|
|
20
|
+
if (!logger) {
|
|
21
|
+
logger = logry({
|
|
22
|
+
id,
|
|
23
|
+
formatConfig: !formatConfig && !preset ? DEFAULT_FORMAT_CONFIG : formatConfig,
|
|
24
|
+
renderConfig: !renderConfig && !preset ? DEFAULT_RENDER_CONFIG : renderConfig,
|
|
25
|
+
preset,
|
|
26
|
+
...options,
|
|
27
|
+
});
|
|
28
|
+
pool.set(id, logger);
|
|
29
|
+
// Soft LRU: keep pool size under control
|
|
30
|
+
if (pool.size > 1000) {
|
|
31
|
+
const keys = [...pool.keys()];
|
|
32
|
+
for (const key of keys.slice(0, 200))
|
|
33
|
+
pool.delete(key);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return logger;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { getLogger };
|
|
@@ -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 };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const CACHE_KEY_DELIMITER = "|";
|
|
2
|
+
const sanitize = (k) => k
|
|
3
|
+
.replaceAll(/[\u200B-\u200D\uFEFF]/g, "")
|
|
4
|
+
.replaceAll(/[\r\n]/g, "")
|
|
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
|
+
*/
|
|
17
|
+
const normalizeCacheKey = (key, delimiter = CACHE_KEY_DELIMITER) => {
|
|
18
|
+
// Treat nullish values as "no cache key"
|
|
19
|
+
if (key === null || key === undefined)
|
|
20
|
+
return null;
|
|
21
|
+
if (Array.isArray(key)) {
|
|
22
|
+
// Empty array produces no meaningful cache key
|
|
23
|
+
if (key.length === 0)
|
|
24
|
+
return null;
|
|
25
|
+
const normalized = key.map((k) => {
|
|
26
|
+
// Preserve semantic differences for special values
|
|
27
|
+
if (k === null)
|
|
28
|
+
return "__null";
|
|
29
|
+
if (k === undefined)
|
|
30
|
+
return "__undefined";
|
|
31
|
+
if (typeof k === "boolean")
|
|
32
|
+
return k ? "__true" : "__false";
|
|
33
|
+
return sanitize(String(k));
|
|
34
|
+
});
|
|
35
|
+
// Join segments into a single deterministic cache key
|
|
36
|
+
return normalized.join(delimiter);
|
|
37
|
+
}
|
|
38
|
+
// Normalize boolean primitives explicitly
|
|
39
|
+
if (typeof key === "boolean")
|
|
40
|
+
return key ? "__true" : "__false";
|
|
41
|
+
// Fallback: stringify primitive values
|
|
42
|
+
return String(key);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export { normalizeCacheKey };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
const toCanonical = (input) => {
|
|
2
|
+
try {
|
|
3
|
+
return Intl.getCanonicalLocales(input)[0];
|
|
4
|
+
}
|
|
5
|
+
catch {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Normalizes a locale string and resolves the best match
|
|
11
|
+
* from a list of supported locales.
|
|
12
|
+
*
|
|
13
|
+
* Resolution strategy:
|
|
14
|
+
*
|
|
15
|
+
* 1. Exact canonical match (BCP 47)
|
|
16
|
+
* 2. Base language fallback
|
|
17
|
+
* - Falls back by base language when no exact match is found
|
|
18
|
+
* (e.g. `"en"` → `"en-US"`).
|
|
19
|
+
* - Script and region subtags are ignored during this step
|
|
20
|
+
* (e.g. `"zh-Hans"` → `"zh-Hant-TW"`)
|
|
21
|
+
* - Preference is determined by the order of `supportedLocales`.
|
|
22
|
+
*
|
|
23
|
+
* Returns `undefined` if no suitable match is found.
|
|
24
|
+
*
|
|
25
|
+
* Notes:
|
|
26
|
+
* - Invalid locale inputs are ignored gracefully.
|
|
27
|
+
* - Always returns an original entry from `supportedLocales`.
|
|
28
|
+
* - Requires `Intl` locale support in the runtime.
|
|
29
|
+
*/
|
|
30
|
+
const normalizeLocale = (locale, supportedLocales = []) => {
|
|
31
|
+
if (!locale || supportedLocales.length === 0)
|
|
32
|
+
return;
|
|
33
|
+
const canonicalLocale = toCanonical(locale);
|
|
34
|
+
if (!canonicalLocale)
|
|
35
|
+
return;
|
|
36
|
+
const supportedCanonicalMap = new Map();
|
|
37
|
+
for (const l of supportedLocales) {
|
|
38
|
+
const normalized = toCanonical(l);
|
|
39
|
+
if (normalized) {
|
|
40
|
+
supportedCanonicalMap.set(normalized, l);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// 1. Exact match
|
|
44
|
+
if (supportedCanonicalMap.has(canonicalLocale)) {
|
|
45
|
+
return supportedCanonicalMap.get(canonicalLocale);
|
|
46
|
+
}
|
|
47
|
+
const baseLang = canonicalLocale.split("-")[0];
|
|
48
|
+
// 2. Match by same base language (e.g., "en" matches "en-US" or "en-GB")
|
|
49
|
+
for (const [key, original] of supportedCanonicalMap) {
|
|
50
|
+
const supportedBase = key.split("-")[0];
|
|
51
|
+
if (supportedBase === baseLang) {
|
|
52
|
+
return original;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// 3. No match
|
|
56
|
+
return;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export { normalizeLocale };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { defineIntorConfig, type IntorRawConfig, type IntorResolvedConfig, } from "../../src/config";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { PREFIX_PLACEHOLDER } from "../src/shared/constants";
|
|
2
|
+
export { localizePathname, } from "../src/shared/utils";
|
|
3
|
+
export { IntorError, IntorErrorCode } from "../src/shared/error";
|
|
4
|
+
export { type TranslatorPlugin, type TranslateHandlers, type FormatHandler, type LoadingHandler, type MissingHandler, type HandlerContext, type TranslateContext, type TranslateHook, type LocaleMessages, } from "intor-translator";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type { INTOR_GENERATED_KEY, GenConfigKeys, GenConfig, GenMessages, GenLocale, MessageKey, TranslatorInstance, } from "../../src/shared/types";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Link, usePathname, useRouter, redirect, } from "../../src/adapters/next/navigation";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { intorProxy, intorProxy as intorMiddleware, } from "../../../src/adapters/next/proxy";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { getLocale, getTranslator } from "../../../src/adapters/next/server";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { IntorProvider, type IntorProviderProps, TranslatorRuntimeProvider, type TranslatorRuntimeProviderProps, useConfig, useLocale, useTranslator, T, getClientLocale, } from "../../src/client/react";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { intor, type IntorResult, loadMessages, isValidMessages, type Messages, type MessagesReader, getTranslator, clearLoggerPool, clearMessagesPool, setGlobalMessagesPool, loadLocalMessagesFromUrl, } from "../../src/server";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { GenConfigKeys, GenLocale } from "../../../shared/types/generated";
|
|
2
|
+
import type { Url } from "next/dist/shared/lib/router/router";
|
|
3
|
+
import type { LinkProps as NextLinkProps } from "next/link";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
interface LinkProps<CK extends GenConfigKeys = "__default__"> extends Omit<NextLinkProps, "href">, Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, "href"> {
|
|
6
|
+
href?: Url;
|
|
7
|
+
/**
|
|
8
|
+
* Locale to navigate with.
|
|
9
|
+
*
|
|
10
|
+
* If `href` is omitted, the current route is used as the navigation target.
|
|
11
|
+
*/
|
|
12
|
+
locale?: GenLocale<CK>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Locale-aware Link component.
|
|
16
|
+
*
|
|
17
|
+
* Wraps Next.js `Link`
|
|
18
|
+
*
|
|
19
|
+
* - Resolves a locale-aware navigation destination
|
|
20
|
+
* - Preserves external navigation behavior
|
|
21
|
+
* - Switches locale via client state or full reload when required
|
|
22
|
+
*
|
|
23
|
+
* This component is responsible only for executing the resolved target.
|
|
24
|
+
*/
|
|
25
|
+
export declare const Link: <CK extends GenConfigKeys = "__default__">({ href, locale, children, onClick, ...props }: LinkProps<CK>) => React.JSX.Element;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { IntorResolvedConfig } from "../../../config";
|
|
2
|
+
import type { GenConfigKeys, GenLocale } from "../../../shared/types/generated";
|
|
3
|
+
import type { RedirectType } from "next/navigation";
|
|
4
|
+
/**
|
|
5
|
+
* Locale-aware redirect helper (server-only).
|
|
6
|
+
*
|
|
7
|
+
* Wraps Next.js `redirect`
|
|
8
|
+
*
|
|
9
|
+
* - Resolves the effective locale before redirecting
|
|
10
|
+
* - Applies locale prefix for internal destinations
|
|
11
|
+
* - Bypasses localization for external destinations
|
|
12
|
+
*/
|
|
13
|
+
export declare const redirect: <CK extends GenConfigKeys = "__default__">({ config, locale, url, type, }: {
|
|
14
|
+
config: IntorResolvedConfig;
|
|
15
|
+
locale?: GenLocale<CK>;
|
|
16
|
+
url: string;
|
|
17
|
+
type?: RedirectType | undefined;
|
|
18
|
+
}) => Promise<undefined>;
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @example
|
|
8
8
|
* const { localizedPathname, standardizedPathname, unprefixedPathname } = usePathname();
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* // localizedPathname => "/en-US/about"
|
|
10
|
+
* // standardizedPathname => "/{locale}/about"
|
|
11
|
+
* // unprefixedPathname => "/about"
|
|
12
12
|
*/
|
|
13
13
|
export declare const usePathname: () => {
|
|
14
|
-
localizedPathname: string;
|
|
15
|
-
standardizedPathname: string;
|
|
16
14
|
unprefixedPathname: string;
|
|
15
|
+
standardizedPathname: string;
|
|
16
|
+
localizedPathname: string;
|
|
17
17
|
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { GenConfigKeys, GenLocale } from "../../../shared/types/generated";
|
|
2
|
+
import type { NavigateOptions, PrefetchOptions } from "next/dist/shared/lib/app-router-context.shared-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* Locale-aware router hook.
|
|
5
|
+
*
|
|
6
|
+
* Wraps Next.js `useRouter`
|
|
7
|
+
*
|
|
8
|
+
* - Resolve locale-aware navigation targets
|
|
9
|
+
* - Decide execution strategy (client-side vs full reload)
|
|
10
|
+
* - Preserve correct behavior across navigation types
|
|
11
|
+
*/
|
|
12
|
+
export declare const useRouter: () => {
|
|
13
|
+
back(): void;
|
|
14
|
+
forward(): void;
|
|
15
|
+
refresh(): void;
|
|
16
|
+
push: <CK extends GenConfigKeys = "__default__">(href: string, options?: NavigateOptions & {
|
|
17
|
+
locale?: GenLocale<CK>;
|
|
18
|
+
}) => void;
|
|
19
|
+
replace: <CK extends GenConfigKeys = "__default__">(href: string, options?: NavigateOptions & {
|
|
20
|
+
locale?: GenLocale<CK>;
|
|
21
|
+
}) => void;
|
|
22
|
+
prefetch: <CK extends GenConfigKeys = "__default__">(href: string, options?: PrefetchOptions & {
|
|
23
|
+
locale?: GenLocale<CK>;
|
|
24
|
+
}) => void;
|
|
25
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { intorProxy } from "./intor-proxy";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { IntorResolvedConfig } from "../../../config";
|
|
2
|
+
import type { NextRequest } from "next/server";
|
|
3
|
+
/**
|
|
4
|
+
* Next.js routing adapter for Intor.
|
|
5
|
+
*
|
|
6
|
+
* Responsibilities:
|
|
7
|
+
* - Collect locale candidates from request-related sources
|
|
8
|
+
* - Delegate routing decisions to the routing core
|
|
9
|
+
* - Apply redirect behavior when required
|
|
10
|
+
* - Materialize routing decisions into persistent state (cookie)
|
|
11
|
+
* with configurable first-visit behavior
|
|
12
|
+
*/
|
|
13
|
+
export declare const intorProxy: (config: IntorResolvedConfig, request: NextRequest) => Promise<Response>;
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import type { CookieResolvedOptions } from "../../../../config/types/cookie.types";
|
|
2
|
-
import type {
|
|
2
|
+
import type { NextResponse } from "next/server";
|
|
3
3
|
interface SetLocaleCookieParams {
|
|
4
|
-
request: NextRequest;
|
|
5
4
|
response: NextResponse;
|
|
6
5
|
cookie: CookieResolvedOptions;
|
|
7
6
|
locale: string;
|
|
8
|
-
override?: boolean;
|
|
9
7
|
}
|
|
10
8
|
/**
|
|
11
9
|
* Set a locale cookie on the response.
|
|
12
10
|
* - For Next.js proxy.
|
|
13
11
|
*/
|
|
14
|
-
export declare function setLocaleCookieEdge({
|
|
12
|
+
export declare function setLocaleCookieEdge({ response, cookie, locale, }: SetLocaleCookieParams): void;
|
|
15
13
|
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { IntorResolvedConfig } from "../../../config/types/intor-config.types";
|
|
2
|
+
import type { GenConfigKeys, GenLocale } from "../../../shared/types/generated";
|
|
3
|
+
/**
|
|
4
|
+
* Get the locale for the current Next.js request.
|
|
5
|
+
*/
|
|
6
|
+
export declare const getLocale: <CK extends GenConfigKeys = "__default__">(config: IntorResolvedConfig) => Promise<GenLocale<CK>>;
|
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
import type { IntorResolvedConfig } from "../../../config/types/intor-config.types";
|
|
2
2
|
import type { MessagesReader } from "../../../server";
|
|
3
|
-
import type { GenConfigKeys, GenMessages, IfGen } from "../../../shared/types/generated
|
|
4
|
-
import type { TranslatorInstance } from "../../../shared/types/translator-instance
|
|
5
|
-
import type { LocalizedNodeKeys, TranslateHandlers } from "intor-translator";
|
|
3
|
+
import type { GenConfigKeys, GenMessages, IfGen } from "../../../shared/types/generated";
|
|
4
|
+
import type { TranslatorInstance } from "../../../shared/types/translator-instance";
|
|
5
|
+
import type { LocalizedNodeKeys, TranslateHandlers, TranslateHook, TranslatorPlugin } from "intor-translator";
|
|
6
6
|
/**
|
|
7
|
-
* Create a translator instance
|
|
7
|
+
* Create a translator instance for the current Next.js SSR environment.
|
|
8
8
|
*
|
|
9
|
-
* -
|
|
10
|
-
* - Loads messages using the provided config, locale, and pathname.
|
|
11
|
-
* - Initializes a translator with `t`, `hasKey`, and optional scoped methods.
|
|
12
|
-
* - Supports optional `preKey` to create a scoped translator for nested keys.
|
|
9
|
+
* - Automatically resolves the current locale using the Next.js adapter.
|
|
13
10
|
*/
|
|
14
11
|
export declare function getTranslator<CK extends GenConfigKeys = "__default__">(options: {
|
|
15
12
|
config: IntorResolvedConfig;
|
|
16
13
|
handlers?: TranslateHandlers;
|
|
14
|
+
plugins?: (TranslatorPlugin | TranslateHook)[];
|
|
17
15
|
extraOptions?: {
|
|
18
16
|
exts?: string[];
|
|
19
17
|
messagesReader?: MessagesReader;
|
|
@@ -22,6 +20,7 @@ export declare function getTranslator<CK extends GenConfigKeys = "__default__">(
|
|
|
22
20
|
export declare function getTranslator<CK extends GenConfigKeys = "__default__", PK extends string = LocalizedNodeKeys<GenMessages<CK>>>(options: {
|
|
23
21
|
config: IntorResolvedConfig;
|
|
24
22
|
handlers?: TranslateHandlers;
|
|
23
|
+
plugins?: (TranslatorPlugin | TranslateHook)[];
|
|
25
24
|
extraOptions?: {
|
|
26
25
|
exts?: string[];
|
|
27
26
|
messagesReader?: MessagesReader;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { IntorResolvedConfig } from "../../config";
|
|
2
|
+
/**
|
|
3
|
+
* Resolve the locale in a client-only environment.
|
|
4
|
+
*
|
|
5
|
+
* This helper is intended for pure CSR setups (e.g. Vite).
|
|
6
|
+
*
|
|
7
|
+
* For framework-based apps, prefer `useTranslator()`.
|
|
8
|
+
*
|
|
9
|
+
* - Client-side only
|
|
10
|
+
*/
|
|
11
|
+
export declare function getClientLocale(config: IntorResolvedConfig): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { getClientLocale } from "./get-client-locale";
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { IntorResolvedConfig } from "../../../../config/types/intor-config.types";
|
|
2
2
|
import type * as React from "react";
|
|
3
|
-
export type ConfigContextValue = {
|
|
4
|
-
config: IntorResolvedConfig;
|
|
5
|
-
pathname: string;
|
|
6
|
-
};
|
|
7
3
|
export type ConfigProviderProps = {
|
|
8
|
-
value:
|
|
4
|
+
value: {
|
|
5
|
+
config: IntorResolvedConfig;
|
|
6
|
+
};
|
|
9
7
|
children: React.ReactNode;
|
|
10
8
|
};
|
|
9
|
+
export type ConfigContextValue = {
|
|
10
|
+
config: IntorResolvedConfig;
|
|
11
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { IntorProvider, type IntorProviderProps } from "./intor-provider";
|
|
2
|
+
export { ConfigProvider, useConfig } from "./config";
|
|
3
|
+
export { LocaleProvider, useLocale } from "./locale";
|
|
4
|
+
export { MessagesProvider, useMessages } from "./messages";
|
|
5
|
+
export { TranslatorProvider, useTranslator } from "./translator";
|
|
6
|
+
export { TranslatorRuntimeProvider, type TranslatorRuntimeProviderProps, useTranslatorRuntime, } from "./translator-runtime";
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import type { IntorResolvedConfig } from "../../../../config/types/intor-config.types";
|
|
2
|
+
import type { Locale, LocaleMessages } from "intor-translator";
|
|
2
3
|
import type * as React from "react";
|
|
3
|
-
import { type Locale, type LocaleMessages } from "intor-translator";
|
|
4
4
|
export interface IntorProviderProps {
|
|
5
5
|
value: {
|
|
6
6
|
config: IntorResolvedConfig;
|
|
7
7
|
initialLocale: Locale;
|
|
8
|
-
pathname?: string;
|
|
9
8
|
messages?: Readonly<LocaleMessages>;
|
|
10
9
|
onLocaleChange?: (newLocale: string) => Promise<void> | void;
|
|
11
10
|
isLoading?: boolean;
|