intor 2.3.6 → 2.3.7
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/dist/core/export/config/index.js +2 -0
- package/dist/core/export/index.js +8 -4
- package/dist/core/export/server/index.js +1 -4
- package/dist/core/src/config/define-intor-config.js +5 -2
- package/dist/core/src/config/resolvers/resolve-cache-options.js +2 -1
- package/dist/core/src/config/resolvers/resolve-cookie-options.js +2 -1
- package/dist/core/src/config/resolvers/resolve-routing-options.js +7 -2
- package/dist/core/src/config/validators/validate-default-locale.js +3 -1
- package/dist/core/src/config/validators/validate-supported-locales.js +8 -4
- package/dist/{react/src/server → core/src/core}/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +11 -11
- package/dist/core/src/{server → core}/messages/load-remote-messages/load-remote-messages.js +13 -15
- package/dist/core/src/core/utils/resolve-loader-options.js +25 -0
- package/dist/core/src/server/helpers/local-messages-from-url.js +12 -6
- package/dist/core/src/server/intor/intor.js +11 -7
- package/dist/core/src/server/messages/load-local-messages/load-local-messages.js +16 -16
- package/dist/core/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +5 -3
- package/dist/core/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +7 -5
- package/dist/core/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +2 -2
- package/dist/core/src/server/messages/load-messages.js +28 -22
- package/dist/core/src/server/translator/get-translator.js +10 -15
- package/dist/next/src/adapters/next/navigation/link.js +1 -12
- package/dist/next/src/adapters/next/navigation/redirect.js +6 -6
- package/dist/next/src/adapters/next/navigation/use-pathname.js +6 -4
- package/dist/next/src/adapters/next/navigation/use-router.js +1 -14
- package/dist/next/src/adapters/next/proxy/intor-proxy.js +4 -1
- package/dist/next/src/adapters/next/server/get-locale.js +4 -1
- package/dist/next/src/adapters/next/server/get-translator.js +8 -2
- package/dist/next/src/core/error/intor-error.js +9 -0
- package/dist/next/src/{server → core}/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +11 -11
- package/dist/next/src/{server → core}/messages/load-remote-messages/load-remote-messages.js +13 -15
- package/dist/next/src/core/utils/resolve-loader-options.js +25 -0
- package/dist/next/src/routing/pathname/resolve-pathname.js +4 -1
- package/dist/next/src/routing/resolve-routing.js +6 -3
- package/dist/next/src/server/messages/load-local-messages/load-local-messages.js +16 -16
- package/dist/next/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +5 -3
- package/dist/next/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +7 -5
- package/dist/next/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +2 -2
- package/dist/next/src/server/messages/load-messages.js +28 -22
- package/dist/next/src/server/translator/get-translator.js +10 -15
- package/dist/react/export/react/index.js +5 -15
- package/dist/react/src/client/helpers/get-client-locale.js +4 -1
- package/dist/react/src/client/react/helpers/use-load-messages.js +46 -0
- package/dist/{next → react}/src/client/react/navigation/use-navigation-strategy.js +11 -7
- package/dist/{next → react}/src/client/react/navigation/use-navigation-target.js +6 -3
- package/dist/react/src/client/react/provider/effects/use-locale-effects.js +14 -0
- package/dist/react/src/client/react/provider/effects/use-messages-effects.js +24 -0
- package/dist/react/src/client/react/provider/intor-provider.js +70 -0
- package/dist/react/src/client/react/provider/use-intor.js +11 -0
- package/dist/react/src/client/react/render/create-react-renderer.js +2 -2
- package/dist/react/src/client/react/translator/use-translator.js +9 -20
- package/dist/react/src/client/shared/messages/create-refetch-messages.js +61 -0
- package/dist/react/src/core/constants/prefix-placeholder.js +4 -0
- package/dist/react/src/core/error/intor-error.js +9 -0
- package/dist/{core/src/server → react/src/core}/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +11 -11
- package/dist/react/src/{server → core}/messages/load-remote-messages/load-remote-messages.js +13 -15
- package/dist/react/src/core/utils/is-external-destination.js +11 -0
- package/dist/react/src/core/utils/normalizers/normalize-pathname.js +43 -0
- package/dist/react/src/core/utils/pathname/get-unprefixed-pathname.js +39 -0
- package/dist/react/src/core/utils/pathname/locale-prefix-pathname.js +38 -0
- package/dist/react/src/core/utils/pathname/localize-pathname.js +36 -0
- package/dist/react/src/core/utils/pathname/standardize-pathname.js +30 -0
- package/dist/react/src/core/utils/resolve-loader-options.js +32 -0
- package/dist/{next → react}/src/routing/resolve-navigation-target.js +5 -2
- package/dist/svelte/export/svelte/index.js +6 -0
- package/dist/svelte/src/client/helpers/get-client-locale.js +27 -0
- package/dist/svelte/src/client/shared/messages/create-refetch-messages.js +61 -0
- package/dist/svelte/src/client/shared/utils/locale/detect-browser-locale.js +12 -0
- package/dist/svelte/src/client/shared/utils/locale/get-locale-cookie-browser.js +16 -0
- package/dist/svelte/src/client/shared/utils/locale/set-document-locale.js +12 -0
- package/dist/svelte/src/client/svelte/runtime/create-intor.js +70 -0
- package/dist/svelte/src/client/svelte/runtime/effects/locale-effects.js +19 -0
- package/dist/svelte/src/client/svelte/runtime/effects/messages-effects.js +23 -0
- package/dist/svelte/src/core/error/intor-error.js +9 -0
- package/dist/svelte/src/core/logger/get-logger.js +39 -0
- package/dist/svelte/src/core/logger/global-logger-pool.js +8 -0
- package/dist/svelte/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +55 -0
- package/dist/svelte/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +25 -0
- package/dist/svelte/src/core/messages/load-remote-messages/load-remote-messages.js +108 -0
- package/dist/svelte/src/core/messages/utils/is-valid-messages.js +36 -0
- package/dist/svelte/src/core/utils/deep-merge.js +31 -0
- package/dist/svelte/src/core/utils/normalizers/normalize-cache-key.js +45 -0
- package/dist/svelte/src/core/utils/normalizers/normalize-locale.js +59 -0
- package/dist/svelte/src/core/utils/resolve-loader-options.js +32 -0
- package/dist/types/export/index.d.ts +1 -3
- package/dist/types/export/internal/index.d.ts +1 -1
- package/dist/types/export/react/index.d.ts +4 -1
- package/dist/types/export/server/index.d.ts +1 -1
- package/dist/types/export/svelte/index.d.ts +1 -0
- package/dist/types/export/vue/index.d.ts +1 -0
- package/dist/types/src/adapters/next/navigation/link.d.ts +1 -1
- package/dist/types/src/adapters/next/navigation/redirect.d.ts +1 -1
- package/dist/types/src/adapters/next/navigation/use-router.d.ts +1 -1
- package/dist/types/src/adapters/next/proxy/utils/set-locale-cookie-edge.d.ts +1 -1
- package/dist/types/src/adapters/next/server/get-locale.d.ts +2 -2
- package/dist/types/src/adapters/next/server/get-translator.d.ts +9 -24
- package/dist/types/src/client/react/helpers/index.d.ts +1 -0
- package/dist/types/src/client/react/helpers/use-load-messages.d.ts +10 -0
- package/dist/types/src/client/react/index.d.ts +2 -1
- package/dist/types/src/client/react/navigation/use-navigation-strategy.d.ts +1 -1
- package/dist/types/src/client/react/navigation/use-navigation-target.d.ts +1 -1
- package/dist/types/src/client/react/provider/effects/use-locale-effects.d.ts +3 -0
- package/dist/types/src/client/react/provider/effects/use-messages-effects.d.ts +4 -0
- package/dist/types/src/client/react/{contexts/intor-provider → provider}/index.d.ts +1 -0
- package/dist/types/src/client/react/provider/intor-provider.d.ts +5 -0
- package/dist/types/src/client/react/provider/types.d.ts +22 -0
- package/dist/types/src/client/react/provider/use-intor.d.ts +2 -0
- package/dist/types/src/client/react/render/create-react-renderer.d.ts +1 -0
- package/dist/types/src/client/react/translator/create-t-rich.d.ts +1 -1
- package/dist/types/src/client/react/translator/t.d.ts +2 -2
- package/dist/types/src/client/react/translator/translator-instance.d.ts +12 -8
- package/dist/types/src/client/react/translator/use-translator.d.ts +3 -3
- package/dist/types/src/client/shared/messages/create-refetch-messages.d.ts +18 -0
- package/dist/types/src/client/shared/messages/index.d.ts +1 -0
- package/dist/types/src/client/shared/types/bootstrap.d.ts +16 -0
- package/dist/types/src/client/shared/types/index.d.ts +1 -1
- package/dist/types/src/client/shared/utils/build-cookie-string.d.ts +1 -1
- package/dist/types/src/client/shared/utils/locale/set-locale-cookie-browser.d.ts +1 -1
- package/dist/types/src/client/svelte/helpers/create-messages.d.ts +11 -0
- package/dist/types/src/client/svelte/helpers/index.d.ts +1 -0
- package/dist/types/src/client/svelte/index.d.ts +3 -0
- package/dist/types/src/client/svelte/runtime/create-intor.d.ts +13 -0
- package/dist/types/src/client/svelte/runtime/effects/locale-effects.d.ts +11 -0
- package/dist/types/src/client/svelte/runtime/effects/messages-effects.d.ts +9 -0
- package/dist/types/src/client/svelte/runtime/index.d.ts +1 -0
- package/dist/types/src/client/svelte/runtime/types.d.ts +9 -0
- package/dist/types/src/client/vue/helpers/index.d.ts +1 -0
- package/dist/types/src/client/vue/helpers/use-load-messages.d.ts +11 -0
- package/dist/types/src/client/vue/index.d.ts +4 -0
- package/dist/types/src/client/vue/provider/effects/use-locale-effects.d.ts +4 -0
- package/dist/types/src/client/vue/provider/effects/use-messages-effects.d.ts +11 -0
- package/dist/types/src/client/vue/provider/index.d.ts +2 -0
- package/dist/types/src/client/vue/provider/inject.d.ts +3 -0
- package/dist/types/src/client/vue/provider/intor-provider.d.ts +4 -0
- package/dist/types/src/client/vue/provider/types.d.ts +18 -0
- package/dist/types/src/client/vue/render/create-vue-renderer.d.ts +18 -0
- package/dist/types/src/client/vue/render/index.d.ts +2 -0
- package/dist/types/src/client/vue/render/render-rich-message-react.d.ts +13 -0
- package/dist/types/src/client/vue/render/types.d.ts +15 -0
- package/dist/types/src/client/vue/translator/create-t-rich.d.ts +16 -0
- package/dist/types/src/client/vue/translator/index.d.ts +2 -0
- package/dist/types/src/client/vue/translator/t.d.ts +38 -0
- package/dist/types/src/client/vue/translator/translator-instance.d.ts +16 -0
- package/dist/types/src/client/vue/translator/use-translator.d.ts +8 -0
- package/dist/types/src/config/constants/cache.d.ts +2 -0
- package/dist/types/src/config/constants/cookie.d.ts +2 -0
- package/dist/types/src/config/constants/index.d.ts +3 -0
- package/dist/types/src/config/constants/routing.d.ts +2 -0
- package/dist/types/src/config/define-intor-config.d.ts +1 -1
- package/dist/types/src/config/index.d.ts +2 -1
- package/dist/types/src/config/resolvers/resolve-cache-options.d.ts +1 -1
- package/dist/types/src/config/resolvers/resolve-cookie-options.d.ts +1 -1
- package/dist/types/src/config/resolvers/resolve-fallback-locales.d.ts +1 -1
- package/dist/types/src/config/resolvers/resolve-routing-options.d.ts +1 -1
- package/dist/types/src/config/types/index.d.ts +7 -0
- package/dist/types/src/config/types/{intor-config.types.d.ts → intor-config.d.ts} +28 -24
- package/dist/types/src/config/types/{loader.types.d.ts → loader.d.ts} +15 -12
- package/dist/types/src/config/types/{logger.types.d.ts → logger.d.ts} +1 -0
- package/dist/types/src/config/types/{routing.types.d.ts → routing.d.ts} +1 -1
- package/dist/types/src/config/types/translator.d.ts +7 -0
- package/dist/types/src/config/validators/validate-default-locale.d.ts +1 -1
- package/dist/types/src/config/validators/validate-supported-locales.d.ts +1 -1
- package/dist/types/src/core/index.d.ts +6 -0
- package/dist/types/src/{server/shared → core}/logger/get-logger.d.ts +3 -4
- package/dist/types/src/core/logger/index.d.ts +2 -0
- package/dist/types/src/core/messages/index.d.ts +4 -0
- package/dist/types/src/{server → core}/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.d.ts +1 -1
- package/dist/types/src/core/messages/load-remote-messages/fetch-locale-messages/types.d.ts +12 -0
- package/dist/types/src/core/messages/load-remote-messages/index.d.ts +1 -0
- package/dist/types/src/{server → core}/messages/load-remote-messages/load-remote-messages.d.ts +1 -1
- package/dist/types/src/core/messages/load-remote-messages/types.d.ts +15 -0
- package/dist/types/src/{server/messages/shared → core/messages}/types.d.ts +8 -5
- package/dist/types/src/{server/messages/shared → core/messages}/utils/is-valid-messages.d.ts +1 -1
- package/dist/types/src/{shared → core}/types/generated.d.ts +1 -1
- package/dist/types/src/core/types/index.d.ts +3 -0
- package/dist/types/src/{shared → core}/types/translator-instance.d.ts +2 -6
- package/dist/types/src/{shared → core}/utils/index.d.ts +2 -0
- package/dist/types/src/{shared → core}/utils/locale/get-locale-from-pathname.d.ts +1 -1
- package/dist/types/src/{shared → core}/utils/locale/get-locale-from-query.d.ts +1 -1
- package/dist/types/src/{shared → core}/utils/pathname/get-unprefixed-pathname.d.ts +1 -1
- package/dist/types/src/{shared → core}/utils/pathname/locale-prefix-pathname.d.ts +1 -1
- package/dist/types/src/{shared → core}/utils/pathname/localize-pathname.d.ts +1 -1
- package/dist/types/src/{shared → core}/utils/pathname/standardize-pathname.d.ts +1 -1
- package/dist/types/src/core/utils/resolve-loader-options.d.ts +21 -0
- package/dist/types/src/routing/index.d.ts +2 -0
- package/dist/types/src/routing/locale/resolve-locale.d.ts +1 -1
- package/dist/types/src/routing/locale/types.d.ts +1 -1
- package/dist/types/src/routing/pathname/resolve-pathname.d.ts +1 -1
- package/dist/types/src/routing/pathname/types.d.ts +1 -1
- package/dist/types/src/routing/resolve-navigation-target.d.ts +1 -1
- package/dist/types/src/routing/resolve-routing.d.ts +1 -1
- package/dist/types/src/server/helpers/index.d.ts +1 -1
- package/dist/types/src/server/helpers/local-messages-from-url.d.ts +15 -5
- package/dist/types/src/server/index.d.ts +3 -5
- package/dist/types/src/server/intor/intor.d.ts +4 -4
- package/dist/types/src/server/intor/types.d.ts +4 -4
- package/dist/types/src/server/messages/index.d.ts +0 -2
- package/dist/types/src/server/messages/load-local-messages/index.d.ts +1 -1
- package/dist/types/src/server/messages/load-local-messages/load-local-messages.d.ts +1 -1
- package/dist/types/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.d.ts +2 -2
- package/dist/types/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/types.d.ts +5 -7
- package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.d.ts +1 -1
- package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/types.d.ts +5 -7
- package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.d.ts +1 -1
- package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.d.ts +1 -1
- package/dist/types/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.d.ts +2 -2
- package/dist/types/src/server/messages/load-local-messages/read-locale-messages/types.d.ts +6 -8
- package/dist/types/src/server/messages/load-local-messages/types.d.ts +9 -16
- package/dist/types/src/server/messages/load-messages.d.ts +3 -3
- package/dist/types/src/server/messages/types.d.ts +11 -5
- package/dist/types/src/server/translator/get-translator.d.ts +11 -19
- package/dist/types/src/server/translator/index.d.ts +2 -1
- package/dist/types/src/server/translator/translator-instance.d.ts +8 -0
- package/dist/vue/export/vue/index.js +6 -0
- package/dist/vue/src/client/helpers/get-client-locale.js +27 -0
- package/dist/vue/src/client/shared/messages/create-refetch-messages.js +61 -0
- package/dist/vue/src/client/shared/utils/build-cookie-string.js +30 -0
- package/dist/vue/src/client/shared/utils/locale/detect-browser-locale.js +12 -0
- package/dist/vue/src/client/shared/utils/locale/get-locale-cookie-browser.js +16 -0
- package/dist/vue/src/client/shared/utils/locale/set-document-locale.js +12 -0
- package/dist/vue/src/client/shared/utils/locale/set-locale-cookie-browser.js +18 -0
- package/dist/vue/src/client/vue/helpers/use-load-messages.js +44 -0
- package/dist/vue/src/client/vue/provider/effects/use-locale-effects.js +13 -0
- package/dist/vue/src/client/vue/provider/effects/use-messages-effects.js +36 -0
- package/dist/vue/src/client/vue/provider/inject.js +11 -0
- package/dist/vue/src/client/vue/provider/intor-provider.js +79 -0
- package/dist/vue/src/client/vue/render/create-vue-renderer.js +36 -0
- package/dist/vue/src/client/vue/render/render-rich-message-react.js +19 -0
- package/dist/vue/src/client/vue/translator/create-t-rich.js +26 -0
- package/dist/vue/src/client/vue/translator/t.js +32 -0
- package/dist/vue/src/client/vue/translator/use-translator.js +28 -0
- package/dist/vue/src/core/error/intor-error.js +9 -0
- package/dist/vue/src/core/logger/get-logger.js +39 -0
- package/dist/vue/src/core/logger/global-logger-pool.js +8 -0
- package/dist/vue/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +55 -0
- package/dist/vue/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +25 -0
- package/dist/vue/src/core/messages/load-remote-messages/load-remote-messages.js +108 -0
- package/dist/vue/src/core/messages/utils/is-valid-messages.js +36 -0
- package/dist/vue/src/core/utils/deep-merge.js +31 -0
- package/dist/vue/src/core/utils/normalizers/normalize-cache-key.js +45 -0
- package/dist/vue/src/core/utils/normalizers/normalize-locale.js +59 -0
- package/dist/vue/src/core/utils/resolve-loader-options.js +32 -0
- package/package.json +16 -6
- package/dist/next/src/client/react/contexts/config/context.js +0 -3
- package/dist/next/src/client/react/contexts/locale/context.js +0 -3
- package/dist/next/src/client/react/contexts/messages/context.js +0 -3
- package/dist/next/src/client/react/contexts/translator/context.js +0 -3
- package/dist/next/src/client/react/contexts/translator-runtime/context.js +0 -3
- package/dist/next/src/config/constants/cache.constants.js +0 -7
- package/dist/react/src/client/react/contexts/config/context.js +0 -5
- package/dist/react/src/client/react/contexts/config/hook.js +0 -11
- package/dist/react/src/client/react/contexts/config/provider.js +0 -14
- package/dist/react/src/client/react/contexts/intor-provider/intor-provider.js +0 -17
- package/dist/react/src/client/react/contexts/locale/context.js +0 -5
- package/dist/react/src/client/react/contexts/locale/hook.js +0 -11
- package/dist/react/src/client/react/contexts/locale/provider.js +0 -38
- package/dist/react/src/client/react/contexts/locale/utils/change-locale.js +0 -26
- package/dist/react/src/client/react/contexts/messages/context.js +0 -5
- package/dist/react/src/client/react/contexts/messages/hook.js +0 -11
- package/dist/react/src/client/react/contexts/messages/provider.js +0 -39
- package/dist/react/src/client/react/contexts/messages/utils/use-refetch-messages.js +0 -70
- package/dist/react/src/client/react/contexts/translator/context.js +0 -5
- package/dist/react/src/client/react/contexts/translator/hook.js +0 -11
- package/dist/react/src/client/react/contexts/translator/provider.js +0 -58
- package/dist/react/src/client/react/contexts/translator-runtime/context.js +0 -5
- package/dist/react/src/client/react/contexts/translator-runtime/hook.js +0 -9
- package/dist/react/src/client/react/contexts/translator-runtime/provider.js +0 -15
- package/dist/react/src/config/constants/cache.constants.js +0 -7
- package/dist/react/src/server/shared/messages/global-messages-pool.js +0 -10
- package/dist/types/src/client/react/contexts/config/context.d.ts +0 -3
- package/dist/types/src/client/react/contexts/config/hook.d.ts +0 -2
- package/dist/types/src/client/react/contexts/config/index.d.ts +0 -2
- package/dist/types/src/client/react/contexts/config/provider.d.ts +0 -2
- package/dist/types/src/client/react/contexts/config/types.d.ts +0 -11
- package/dist/types/src/client/react/contexts/index.d.ts +0 -6
- package/dist/types/src/client/react/contexts/intor-provider/intor-provider.d.ts +0 -2
- package/dist/types/src/client/react/contexts/intor-provider/types.d.ts +0 -13
- package/dist/types/src/client/react/contexts/locale/context.d.ts +0 -3
- package/dist/types/src/client/react/contexts/locale/hook.d.ts +0 -1
- package/dist/types/src/client/react/contexts/locale/index.d.ts +0 -2
- package/dist/types/src/client/react/contexts/locale/provider.d.ts +0 -3
- package/dist/types/src/client/react/contexts/locale/types.d.ts +0 -13
- package/dist/types/src/client/react/contexts/locale/utils/change-locale.d.ts +0 -20
- package/dist/types/src/client/react/contexts/messages/context.d.ts +0 -3
- package/dist/types/src/client/react/contexts/messages/hook.d.ts +0 -2
- package/dist/types/src/client/react/contexts/messages/index.d.ts +0 -2
- package/dist/types/src/client/react/contexts/messages/provider.d.ts +0 -3
- package/dist/types/src/client/react/contexts/messages/types.d.ts +0 -12
- package/dist/types/src/client/react/contexts/messages/utils/use-refetch-messages.d.ts +0 -20
- package/dist/types/src/client/react/contexts/translator/context.d.ts +0 -3
- package/dist/types/src/client/react/contexts/translator/hook.d.ts +0 -2
- package/dist/types/src/client/react/contexts/translator/index.d.ts +0 -2
- package/dist/types/src/client/react/contexts/translator/provider.d.ts +0 -2
- package/dist/types/src/client/react/contexts/translator/types.d.ts +0 -11
- package/dist/types/src/client/react/contexts/translator-runtime/context.d.ts +0 -3
- package/dist/types/src/client/react/contexts/translator-runtime/hook.d.ts +0 -2
- package/dist/types/src/client/react/contexts/translator-runtime/index.d.ts +0 -3
- package/dist/types/src/client/react/contexts/translator-runtime/provider.d.ts +0 -2
- package/dist/types/src/client/react/contexts/translator-runtime/types.d.ts +0 -13
- package/dist/types/src/client/shared/types/translator-instance.d.ts +0 -11
- package/dist/types/src/config/constants/cache.constants.d.ts +0 -2
- package/dist/types/src/config/constants/cookie.constants.d.ts +0 -2
- package/dist/types/src/config/constants/routing.constants.d.ts +0 -2
- package/dist/types/src/config/types/translator.types.d.ts +0 -7
- package/dist/types/src/server/messages/load-remote-messages/fetch-locale-messages/types.d.ts +0 -14
- package/dist/types/src/server/messages/load-remote-messages/index.d.ts +0 -2
- package/dist/types/src/server/messages/load-remote-messages/types.d.ts +0 -21
- package/dist/types/src/shared/types/index.d.ts +0 -2
- /package/dist/core/src/config/constants/{cache.constants.js → cache.js} +0 -0
- /package/dist/core/src/config/constants/{cookie.constants.js → cookie.js} +0 -0
- /package/dist/core/src/config/constants/{routing.constants.js → routing.js} +0 -0
- /package/dist/core/src/{shared → core}/constants/prefix-placeholder.js +0 -0
- /package/dist/core/src/{shared → core}/error/intor-error.js +0 -0
- /package/dist/core/src/{server/shared → core}/logger/get-logger.js +0 -0
- /package/dist/core/src/{server/shared → core}/logger/global-logger-pool.js +0 -0
- /package/dist/core/src/{server/shared → core}/messages/global-messages-pool.js +0 -0
- /package/dist/core/src/{server → core}/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -0
- /package/dist/core/src/{server/messages/shared → core/messages}/utils/is-valid-messages.js +0 -0
- /package/dist/core/src/{shared → core}/utils/deep-merge.js +0 -0
- /package/dist/core/src/{shared → core}/utils/normalizers/normalize-cache-key.js +0 -0
- /package/dist/core/src/{shared → core}/utils/normalizers/normalize-pathname.js +0 -0
- /package/dist/core/src/{shared → core}/utils/pathname/get-unprefixed-pathname.js +0 -0
- /package/dist/core/src/{shared → core}/utils/pathname/locale-prefix-pathname.js +0 -0
- /package/dist/core/src/{shared → core}/utils/pathname/localize-pathname.js +0 -0
- /package/dist/core/src/{shared → core}/utils/pathname/standardize-pathname.js +0 -0
- /package/dist/next/src/{shared → core}/constants/prefix-placeholder.js +0 -0
- /package/dist/next/src/{server/shared → core}/logger/get-logger.js +0 -0
- /package/dist/next/src/{server/shared → core}/logger/global-logger-pool.js +0 -0
- /package/dist/next/src/{server/shared → core}/messages/global-messages-pool.js +0 -0
- /package/dist/next/src/{server → core}/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -0
- /package/dist/next/src/{server/messages/shared → core/messages}/utils/is-valid-messages.js +0 -0
- /package/dist/next/src/{shared → core}/utils/deep-merge.js +0 -0
- /package/dist/next/src/{shared → core}/utils/is-external-destination.js +0 -0
- /package/dist/next/src/{shared → core}/utils/locale/get-locale-from-accept-language.js +0 -0
- /package/dist/next/src/{shared → core}/utils/locale/get-locale-from-host.js +0 -0
- /package/dist/next/src/{shared → core}/utils/locale/get-locale-from-pathname.js +0 -0
- /package/dist/next/src/{shared → core}/utils/locale/get-locale-from-query.js +0 -0
- /package/dist/next/src/{shared → core}/utils/normalizers/normalize-cache-key.js +0 -0
- /package/dist/next/src/{shared → core}/utils/normalizers/normalize-locale.js +0 -0
- /package/dist/next/src/{shared → core}/utils/normalizers/normalize-pathname.js +0 -0
- /package/dist/next/src/{shared → core}/utils/pathname/get-unprefixed-pathname.js +0 -0
- /package/dist/next/src/{shared → core}/utils/pathname/locale-prefix-pathname.js +0 -0
- /package/dist/next/src/{shared → core}/utils/pathname/localize-pathname.js +0 -0
- /package/dist/next/src/{shared → core}/utils/pathname/standardize-pathname.js +0 -0
- /package/dist/react/src/{server/shared → core}/logger/get-logger.js +0 -0
- /package/dist/react/src/{server/shared → core}/logger/global-logger-pool.js +0 -0
- /package/dist/react/src/{server → core}/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -0
- /package/dist/react/src/{server/messages/shared → core/messages}/utils/is-valid-messages.js +0 -0
- /package/dist/react/src/{shared → core}/utils/deep-merge.js +0 -0
- /package/dist/react/src/{shared → core}/utils/normalizers/normalize-cache-key.js +0 -0
- /package/dist/react/src/{shared → core}/utils/normalizers/normalize-locale.js +0 -0
- /package/dist/{next → svelte}/src/client/shared/utils/build-cookie-string.js +0 -0
- /package/dist/{next → svelte}/src/client/shared/utils/locale/set-locale-cookie-browser.js +0 -0
- /package/dist/types/src/config/types/{cache.types.d.ts → cache.d.ts} +0 -0
- /package/dist/types/src/config/types/{cookie.types.d.ts → cookie.d.ts} +0 -0
- /package/dist/types/src/{shared → core}/constants/index.d.ts +0 -0
- /package/dist/types/src/{shared → core}/constants/prefix-placeholder.d.ts +0 -0
- /package/dist/types/src/{shared → core}/error/index.d.ts +0 -0
- /package/dist/types/src/{shared → core}/error/intor-error.d.ts +0 -0
- /package/dist/types/src/{server/shared → core}/logger/global-logger-pool.d.ts +0 -0
- /package/dist/types/src/{server/shared → core}/messages/global-messages-pool.d.ts +0 -0
- /package/dist/types/src/{server → core}/messages/load-remote-messages/fetch-locale-messages/index.d.ts +0 -0
- /package/dist/types/src/{server → core}/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.d.ts +0 -0
- /package/dist/types/src/{shared → core}/types/routing.d.ts +0 -0
- /package/dist/types/src/{shared → core}/utils/deep-merge.d.ts +0 -0
- /package/dist/types/src/{shared → core}/utils/is-external-destination.d.ts +0 -0
- /package/dist/types/src/{shared → core}/utils/locale/get-locale-from-accept-language.d.ts +0 -0
- /package/dist/types/src/{shared → core}/utils/locale/get-locale-from-host.d.ts +0 -0
- /package/dist/types/src/{shared → core}/utils/locale/index.d.ts +0 -0
- /package/dist/types/src/{shared → core}/utils/normalizers/index.d.ts +0 -0
- /package/dist/types/src/{shared → core}/utils/normalizers/normalize-cache-key.d.ts +0 -0
- /package/dist/types/src/{shared → core}/utils/normalizers/normalize-locale.d.ts +0 -0
- /package/dist/types/src/{shared → core}/utils/normalizers/normalize-pathname.d.ts +0 -0
- /package/dist/types/src/{shared → core}/utils/pathname/index.d.ts +0 -0
|
@@ -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 };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { PREFIX_PLACEHOLDER } from '../../constants/prefix-placeholder.js';
|
|
2
|
+
import { normalizePathname } from '../normalizers/normalize-pathname.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Standardizes a canonical pathname by applying the base path
|
|
6
|
+
* and injecting the locale placeholder.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* // routing.basePath: "/app",
|
|
11
|
+
* standardizePathname({ config, pathname: "/cms" });
|
|
12
|
+
* // => "/app/{locale}/cms"
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
const standardizePathname = (config, unprefixedPathname) => {
|
|
16
|
+
const { routing } = config;
|
|
17
|
+
const { basePath } = routing;
|
|
18
|
+
// Normalize each segment before join to avoid redundant slashes
|
|
19
|
+
const parts = [
|
|
20
|
+
normalizePathname(basePath),
|
|
21
|
+
PREFIX_PLACEHOLDER,
|
|
22
|
+
normalizePathname(unprefixedPathname),
|
|
23
|
+
];
|
|
24
|
+
// Avoid double slashes between segments
|
|
25
|
+
const standardizedPathname = parts.join("/").replaceAll(/\/{2,}/g, "/");
|
|
26
|
+
// Final normalization to ensure leading slash, no trailing
|
|
27
|
+
return normalizePathname(standardizedPathname);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export { standardizePathname };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the effective message loader for a given runtime.
|
|
3
|
+
*
|
|
4
|
+
* Loader resolution follows an inheritance-based priority model:
|
|
5
|
+
*
|
|
6
|
+
* - client runtime:
|
|
7
|
+
* client.loader → server.loader → root loader
|
|
8
|
+
*
|
|
9
|
+
* - server runtime:
|
|
10
|
+
* server.loader → root loader
|
|
11
|
+
*
|
|
12
|
+
* This allows the client runtime to inherit server behavior
|
|
13
|
+
* when no explicit client loader is provided.
|
|
14
|
+
*
|
|
15
|
+
* Notes:
|
|
16
|
+
* - Static `messages` are intentionally NOT handled here.
|
|
17
|
+
* - Returning `undefined` indicates that no loader is enabled
|
|
18
|
+
* for the given runtime.
|
|
19
|
+
*/
|
|
20
|
+
const resolveLoaderOptions = (config, runtime) => {
|
|
21
|
+
// --- runtime: client ---
|
|
22
|
+
{
|
|
23
|
+
const client = config.client?.loader;
|
|
24
|
+
if (client) {
|
|
25
|
+
// Client loader is always remote by design
|
|
26
|
+
return { type: "remote", ...client };
|
|
27
|
+
}
|
|
28
|
+
return config.server?.loader ?? config.loader;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export { resolveLoaderOptions };
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { isExternalDestination } from '../
|
|
1
|
+
import '../core/error/intor-error.js';
|
|
2
|
+
import { isExternalDestination } from '../core/utils/is-external-destination.js';
|
|
3
|
+
import { localizePathname } from '../core/utils/pathname/localize-pathname.js';
|
|
4
|
+
import 'logry';
|
|
5
|
+
import 'keyv';
|
|
3
6
|
|
|
4
7
|
/**
|
|
5
8
|
* Resolves the destination of a navigation attempt.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import '../../core/error/intor-error.js';
|
|
2
|
+
import { normalizeLocale } from '../../core/utils/normalizers/normalize-locale.js';
|
|
3
|
+
import 'logry';
|
|
4
|
+
import 'keyv';
|
|
5
|
+
import { detectBrowserLocale } from '../shared/utils/locale/detect-browser-locale.js';
|
|
6
|
+
import { getLocaleCookieBrowser } from '../shared/utils/locale/get-locale-cookie-browser.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the locale in a client-only environment.
|
|
10
|
+
*
|
|
11
|
+
* This helper is intended for pure CSR setups (e.g. Vite).
|
|
12
|
+
*
|
|
13
|
+
* For framework-based apps, prefer `useTranslator()`.
|
|
14
|
+
*
|
|
15
|
+
* - Client-side only
|
|
16
|
+
*/
|
|
17
|
+
function getClientLocale(config) {
|
|
18
|
+
const { defaultLocale, supportedLocales, cookie } = config;
|
|
19
|
+
// Locale from browser cookie
|
|
20
|
+
const cookieLocale = getLocaleCookieBrowser(cookie.name);
|
|
21
|
+
// Locale from browser preference
|
|
22
|
+
const browserLocale = detectBrowserLocale();
|
|
23
|
+
const localeCandidate = cookieLocale || browserLocale;
|
|
24
|
+
return normalizeLocale(localeCandidate, supportedLocales) || defaultLocale;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { getClientLocale };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import '../../../core/error/intor-error.js';
|
|
2
|
+
import { deepMerge } from '../../../core/utils/deep-merge.js';
|
|
3
|
+
import { resolveLoaderOptions } from '../../../core/utils/resolve-loader-options.js';
|
|
4
|
+
import 'logry';
|
|
5
|
+
import { loadRemoteMessages } from '../../../core/messages/load-remote-messages/load-remote-messages.js';
|
|
6
|
+
import 'keyv';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Creates a framework-agnostic message refetcher.
|
|
10
|
+
*
|
|
11
|
+
* - At most one remote request is active at any time
|
|
12
|
+
* - Previous in-flight requests are aborted on subsequent calls
|
|
13
|
+
* - State updates are applied only for the latest, non-aborted request
|
|
14
|
+
*/
|
|
15
|
+
const createRefetchMessages = ({ config, onLoadingStart, onLoadingEnd, onMessages, }) => {
|
|
16
|
+
// Tracks the currently active remote request for this refetcher instance
|
|
17
|
+
let controller = null;
|
|
18
|
+
return async function refetchMessages(newLocale) {
|
|
19
|
+
// No-op when remote loading is not enabled
|
|
20
|
+
const loader = resolveLoaderOptions(config);
|
|
21
|
+
if (!loader || loader.type !== "remote")
|
|
22
|
+
return;
|
|
23
|
+
// Abort previous request
|
|
24
|
+
controller?.abort();
|
|
25
|
+
const currentController = new AbortController();
|
|
26
|
+
controller = currentController;
|
|
27
|
+
onLoadingStart?.();
|
|
28
|
+
try {
|
|
29
|
+
const loadedMessages = await loadRemoteMessages({
|
|
30
|
+
// --- Messages Scope ---
|
|
31
|
+
locale: newLocale,
|
|
32
|
+
fallbackLocales: config.fallbackLocales[newLocale] || [],
|
|
33
|
+
namespaces: loader.namespaces,
|
|
34
|
+
rootDir: loader.rootDir,
|
|
35
|
+
// --- Remote Source ---
|
|
36
|
+
url: loader.url,
|
|
37
|
+
headers: loader.headers,
|
|
38
|
+
signal: currentController.signal,
|
|
39
|
+
// --- Caching ---
|
|
40
|
+
cacheOptions: config.cache,
|
|
41
|
+
// --- Observability ---
|
|
42
|
+
loggerOptions: config.logger,
|
|
43
|
+
});
|
|
44
|
+
// Apply state updates only when this request is still the active one
|
|
45
|
+
// and has not been aborted.
|
|
46
|
+
if (controller === currentController &&
|
|
47
|
+
!currentController.signal.aborted) {
|
|
48
|
+
onMessages?.(deepMerge(config.messages, loadedMessages));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
// Clear loading state only if this request is still the active one
|
|
53
|
+
if (controller === currentController &&
|
|
54
|
+
!currentController.signal.aborted) {
|
|
55
|
+
onLoadingEnd?.();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export { createRefetchMessages };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect the preferred locale from the browser.
|
|
3
|
+
*
|
|
4
|
+
* - Client-side only
|
|
5
|
+
*/
|
|
6
|
+
function detectBrowserLocale() {
|
|
7
|
+
if (typeof navigator === "undefined")
|
|
8
|
+
return undefined;
|
|
9
|
+
return navigator.languages?.[0] || navigator.language || undefined;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export { detectBrowserLocale };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gets the locale value from the browser cookie.
|
|
3
|
+
*
|
|
4
|
+
* - Client-side only
|
|
5
|
+
*/
|
|
6
|
+
function getLocaleCookieBrowser(cookieName) {
|
|
7
|
+
if (typeof document === "undefined")
|
|
8
|
+
return undefined;
|
|
9
|
+
const cookies = document.cookie.split(";").map((c) => c.trim());
|
|
10
|
+
const entry = cookies.find((c) => c.startsWith(`${cookieName}=`));
|
|
11
|
+
if (!entry)
|
|
12
|
+
return undefined;
|
|
13
|
+
return decodeURIComponent(entry.slice(cookieName.length + 1));
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { getLocaleCookieBrowser };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Translator } from 'intor-translator';
|
|
2
|
+
import { writable, readable, derived, get } from 'svelte/store';
|
|
3
|
+
import { attachLocaleEffects } from './effects/locale-effects.js';
|
|
4
|
+
import { attachMessagesEffects } from './effects/messages-effects.js';
|
|
5
|
+
|
|
6
|
+
function createIntor({ config, initialLocale, initialMessages, handlers, plugins, onLocaleChange, isLoading: externalIsLoading, }) {
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Internal state
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
const locale = writable(initialLocale);
|
|
11
|
+
const runtimeMessages = writable(null);
|
|
12
|
+
const internalIsLoading = writable(false);
|
|
13
|
+
// -----------------------------------------------------------------------------
|
|
14
|
+
// Locale transition
|
|
15
|
+
// -----------------------------------------------------------------------------
|
|
16
|
+
/** Request a locale change. */
|
|
17
|
+
async function setLocale(next) {
|
|
18
|
+
const current = get(locale);
|
|
19
|
+
if (next === current)
|
|
20
|
+
return;
|
|
21
|
+
locale.set(next);
|
|
22
|
+
onLocaleChange?.(next); // Notify external listener (fire-and-forget)
|
|
23
|
+
}
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Effective state
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
const externalIsLoadingStore = externalIsLoading ?? readable(false);
|
|
28
|
+
// external > internal
|
|
29
|
+
const effectiveIsLoading = derived([externalIsLoadingStore, internalIsLoading], ([$external, $internal]) => $external || $internal);
|
|
30
|
+
// runtime (client refetch) > initial > config (static)
|
|
31
|
+
const effectiveMessages = derived([runtimeMessages, initialMessages ?? readable(undefined)], ([$runtime, $initial]) => $runtime || $initial || config.messages || {});
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Translator
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
const translator = derived([effectiveMessages, locale, effectiveIsLoading], ([$messages, $locale, $isLoading]) => new Translator({
|
|
36
|
+
messages: $messages,
|
|
37
|
+
locale: $locale,
|
|
38
|
+
isLoading: $isLoading,
|
|
39
|
+
fallbackLocales: config.fallbackLocales,
|
|
40
|
+
loadingMessage: config.translator?.loadingMessage,
|
|
41
|
+
missingMessage: config.translator?.missingMessage,
|
|
42
|
+
handlers,
|
|
43
|
+
plugins,
|
|
44
|
+
}));
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Side effects
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
const detachLocaleEffects = attachLocaleEffects(locale, config);
|
|
49
|
+
const detachMessagesEffects = attachMessagesEffects({
|
|
50
|
+
config,
|
|
51
|
+
locale,
|
|
52
|
+
runtimeMessages,
|
|
53
|
+
internalIsLoading,
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
config,
|
|
57
|
+
locale,
|
|
58
|
+
setLocale,
|
|
59
|
+
messages: effectiveMessages,
|
|
60
|
+
isLoading: effectiveIsLoading,
|
|
61
|
+
translator,
|
|
62
|
+
// optional cleanup
|
|
63
|
+
destroy() {
|
|
64
|
+
detachLocaleEffects();
|
|
65
|
+
detachMessagesEffects();
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export { createIntor };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { setLocaleCookieBrowser } from '../../../shared/utils/locale/set-locale-cookie-browser.js';
|
|
2
|
+
import { setDocumentLocale } from '../../../shared/utils/locale/set-document-locale.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Attach locale-related browser side effects.
|
|
6
|
+
*
|
|
7
|
+
* - Sync locale cookie
|
|
8
|
+
* - Sync <html lang="">
|
|
9
|
+
*
|
|
10
|
+
* Returns an unsubscribe function.
|
|
11
|
+
*/
|
|
12
|
+
function attachLocaleEffects(locale, config) {
|
|
13
|
+
return locale.subscribe((value) => {
|
|
14
|
+
setLocaleCookieBrowser(config.cookie, value);
|
|
15
|
+
setDocumentLocale(value);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { attachLocaleEffects };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createRefetchMessages } from '../../../shared/messages/create-refetch-messages.js';
|
|
2
|
+
|
|
3
|
+
function attachMessagesEffects({ locale, config, runtimeMessages, internalIsLoading, }) {
|
|
4
|
+
// Prepares message refetch function.
|
|
5
|
+
const refetchMessages = createRefetchMessages({
|
|
6
|
+
config,
|
|
7
|
+
onLoadingStart: () => internalIsLoading.set(true),
|
|
8
|
+
onLoadingEnd: () => internalIsLoading.set(false),
|
|
9
|
+
onMessages: (messages) => runtimeMessages.set(messages),
|
|
10
|
+
});
|
|
11
|
+
// Refetch messages when locale changes (except initial render).
|
|
12
|
+
let isInitial = true;
|
|
13
|
+
const unsubscribe = locale.subscribe((value) => {
|
|
14
|
+
if (isInitial) {
|
|
15
|
+
isInitial = false;
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
refetchMessages(value);
|
|
19
|
+
});
|
|
20
|
+
return unsubscribe;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { attachMessagesEffects };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
var IntorErrorCode;
|
|
2
|
+
(function (IntorErrorCode) {
|
|
3
|
+
// intor-config
|
|
4
|
+
IntorErrorCode["MISSING_SUPPORTED_LOCALES"] = "INTOR_MISSING_SUPPORTED_LOCALES";
|
|
5
|
+
IntorErrorCode["MISSING_DEFAULT_LOCALE"] = "INTOR_MISSING_DEFAULT_LOCALE";
|
|
6
|
+
IntorErrorCode["UNSUPPORTED_DEFAULT_LOCALE"] = "INTOR_UNSUPPORTED_DEFAULT_LOCALE";
|
|
7
|
+
})(IntorErrorCode || (IntorErrorCode = {}));
|
|
8
|
+
|
|
9
|
+
export { IntorErrorCode };
|
|
@@ -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,55 @@
|
|
|
1
|
+
import { getLogger } from '../../../logger/get-logger.js';
|
|
2
|
+
import { isValidMessages } from '../../utils/is-valid-messages.js';
|
|
3
|
+
import { buildSearchParams } from './utils/build-search-params.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Fetches locale messages from a remote API.
|
|
7
|
+
*
|
|
8
|
+
* - Validates that the returned JSON matches the expected `NamespaceMessages` structure.
|
|
9
|
+
* - Uses `fetch` with `no-store` cache to always get fresh data.
|
|
10
|
+
*/
|
|
11
|
+
const fetchLocaleMessages = async ({ locale, namespaces, rootDir, url: rawUrl, headers: rawHeaders, signal, extraOptions: { loggerOptions }, }) => {
|
|
12
|
+
const baseLogger = getLogger(loggerOptions);
|
|
13
|
+
const logger = baseLogger.child({ scope: "fetch-locale-messages" });
|
|
14
|
+
const searchParams = buildSearchParams({ locale, rootDir, namespaces });
|
|
15
|
+
const url = `${rawUrl}?${searchParams.toString()}`;
|
|
16
|
+
try {
|
|
17
|
+
// Headers
|
|
18
|
+
const headers = {
|
|
19
|
+
"Content-Type": "application/json",
|
|
20
|
+
...rawHeaders,
|
|
21
|
+
};
|
|
22
|
+
// Fetch
|
|
23
|
+
const response = await fetch(url, {
|
|
24
|
+
method: "GET",
|
|
25
|
+
headers: headers,
|
|
26
|
+
cache: "no-store",
|
|
27
|
+
signal,
|
|
28
|
+
});
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
throw new Error(`HTTP error ${response.status} ${response.statusText}`);
|
|
31
|
+
}
|
|
32
|
+
// Parse JSON body
|
|
33
|
+
const data = (await response.json());
|
|
34
|
+
// Validate messages structure
|
|
35
|
+
if (!isValidMessages(data[locale])) {
|
|
36
|
+
throw new Error("JSON file does not match NamespaceMessages structure");
|
|
37
|
+
}
|
|
38
|
+
return data;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
42
|
+
logger.debug("Fetching locale messages aborted.", { locale, url });
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
logger.warn("Fetching locale messages failed.", {
|
|
46
|
+
locale,
|
|
47
|
+
url,
|
|
48
|
+
searchParams: decodeURIComponent(searchParams.toString()),
|
|
49
|
+
error,
|
|
50
|
+
});
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export { fetchLocaleMessages };
|
|
@@ -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,108 @@
|
|
|
1
|
+
import { getLogger } from '../../logger/get-logger.js';
|
|
2
|
+
import { normalizeCacheKey } from '../../utils/normalizers/normalize-cache-key.js';
|
|
3
|
+
import { fetchLocaleMessages } from './fetch-locale-messages/fetch-locale-messages.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Load locale messages from a remote API.
|
|
7
|
+
*
|
|
8
|
+
* This function acts as the orchestration layer for remote message loading.
|
|
9
|
+
* It is responsible for:
|
|
10
|
+
*
|
|
11
|
+
* - Resolving fallback locales in order
|
|
12
|
+
* - Coordinating cache read / write behavior
|
|
13
|
+
* - Respecting abort signals across the entire async flow
|
|
14
|
+
*
|
|
15
|
+
* Network fetching and data validation are delegated to lower-level utilities.
|
|
16
|
+
*/
|
|
17
|
+
const loadRemoteMessages = async ({ locale, fallbackLocales, namespaces, rootDir, url, headers, signal, pool, cacheOptions, allowCacheWrite = false, loggerOptions, }) => {
|
|
18
|
+
const baseLogger = getLogger(loggerOptions);
|
|
19
|
+
const logger = baseLogger.child({ scope: "load-remote-messages" });
|
|
20
|
+
// Abort early if the request has already been cancelled
|
|
21
|
+
if (signal?.aborted) {
|
|
22
|
+
logger.debug("Remote message loading aborted before fetch.");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const start = performance.now();
|
|
26
|
+
logger.debug("Loading remote messages.", { url });
|
|
27
|
+
// --- Cache key ---
|
|
28
|
+
const cacheKey = normalizeCacheKey([
|
|
29
|
+
loggerOptions.id,
|
|
30
|
+
"loaderType:remote",
|
|
31
|
+
rootDir,
|
|
32
|
+
locale,
|
|
33
|
+
(fallbackLocales ?? []).toSorted().join(","),
|
|
34
|
+
(namespaces ?? []).toSorted().join(","),
|
|
35
|
+
]);
|
|
36
|
+
// --- Cache read ---
|
|
37
|
+
if (cacheOptions.enabled && cacheKey) {
|
|
38
|
+
const cached = await pool?.get(cacheKey);
|
|
39
|
+
if (signal?.aborted) {
|
|
40
|
+
logger.debug("Remote message loading aborted after cache read.");
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (cached) {
|
|
44
|
+
logger.debug("Messages cache hit.", { key: cacheKey });
|
|
45
|
+
return cached;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const candidateLocales = [locale, ...(fallbackLocales || [])];
|
|
49
|
+
let messages;
|
|
50
|
+
// Try each candidate locale in order and stop at the first successful result
|
|
51
|
+
for (let i = 0; i < candidateLocales.length; i++) {
|
|
52
|
+
const candidateLocale = candidateLocales[i];
|
|
53
|
+
const isLast = i === candidateLocales.length - 1;
|
|
54
|
+
try {
|
|
55
|
+
const fetched = await fetchLocaleMessages({
|
|
56
|
+
locale: candidateLocale,
|
|
57
|
+
namespaces,
|
|
58
|
+
rootDir,
|
|
59
|
+
url,
|
|
60
|
+
headers,
|
|
61
|
+
signal,
|
|
62
|
+
extraOptions: { loggerOptions },
|
|
63
|
+
});
|
|
64
|
+
// Stop at the first locale that yields non-empty messages
|
|
65
|
+
if (fetched && Object.values(fetched[candidateLocale] || {}).length > 0) {
|
|
66
|
+
messages = fetched;
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
72
|
+
logger.debug("Remote message loading aborted.");
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (isLast) {
|
|
76
|
+
logger.warn("Failed to load messages for all candidate locales.", {
|
|
77
|
+
locale,
|
|
78
|
+
fallbackLocales,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
logger.warn(`Failed to fetch locale messages for "${candidateLocale}", trying next fallback.`);
|
|
83
|
+
}
|
|
84
|
+
logger.trace("Remote fetch error detail.", {
|
|
85
|
+
locale: candidateLocale,
|
|
86
|
+
error,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// --- Cache write ---
|
|
91
|
+
if (cacheOptions.enabled && allowCacheWrite && cacheKey && messages) {
|
|
92
|
+
if (signal?.aborted) {
|
|
93
|
+
logger.debug("Remote message loading aborted before cache write.");
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
await pool?.set(cacheKey, messages, cacheOptions.ttl);
|
|
97
|
+
}
|
|
98
|
+
// Final success log with resolved locale and timing
|
|
99
|
+
if (messages) {
|
|
100
|
+
logger.trace("Finished loading remote messages.", {
|
|
101
|
+
loadedLocale: messages ? Object.keys(messages)[0] : undefined,
|
|
102
|
+
duration: `${Math.round(performance.now() - start)} ms`,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return messages;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
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 };
|