intor 2.5.0 → 2.6.0
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/LICENSE +1 -1
- package/README.md +1 -1
- package/dist/core/export/index.js +1 -0
- package/dist/core/src/client/shared/helpers/get-client-locale.js +5 -20
- package/dist/core/src/client/shared/utils/locale/detect-browser-locale.js +2 -8
- package/dist/core/src/client/shared/utils/locale/get-locale-from-cookie.js +5 -12
- package/dist/core/src/config/constants/cookie.js +9 -9
- package/dist/core/src/config/constants/routing.js +13 -14
- package/dist/core/src/config/define-intor-config.js +28 -44
- package/dist/core/src/config/resolvers/resolve-cookie-options.js +4 -4
- package/dist/core/src/config/resolvers/resolve-fallback-locales.js +33 -50
- package/dist/core/src/config/resolvers/resolve-routing-options.js +32 -61
- package/dist/core/src/config/validators/validate-default-locale.js +8 -13
- package/dist/core/src/config/validators/validate-id.js +8 -13
- package/dist/core/src/config/validators/validate-supported-locales.js +8 -13
- package/dist/core/src/core/constants/locale-placeholder.js +0 -1
- package/dist/core/src/core/error/intor-error.js +14 -29
- package/dist/core/src/core/locale/canonicalize-locale.js +7 -18
- package/dist/core/src/core/locale/match-locale.js +24 -50
- package/dist/core/src/core/locale/parse-locale.js +12 -22
- package/dist/core/src/core/logger/get-logger.js +26 -31
- package/dist/core/src/core/logger/global-logger-pool.js +4 -4
- package/dist/core/src/core/messages/internal-metadata.js +1 -1
- package/dist/core/src/core/messages/load-remote-messages/collect-remote-resources.js +13 -22
- package/dist/core/src/core/messages/load-remote-messages/fetch-remote-resource.js +30 -39
- package/dist/core/src/core/messages/load-remote-messages/load-remote-messages.js +72 -89
- package/dist/core/src/core/messages/load-remote-messages/resolve-remote-resources.js +7 -17
- package/dist/core/src/core/messages/merge-messages.js +17 -28
- package/dist/core/src/core/messages/utils/is-valid-messages.js +22 -37
- package/dist/core/src/core/messages/utils/nest-object-from-path.js +5 -17
- package/dist/core/src/core/render/create-html-renderer.js +29 -37
- package/dist/core/src/core/render/utils/escape-html.js +1 -6
- package/dist/core/src/core/render/utils/render-attributes.js +6 -11
- package/dist/core/src/core/translator/create-t-rich.js +6 -15
- package/dist/core/src/core/translator/create-translator.js +16 -24
- package/dist/core/src/core/utils/deep-merge.js +24 -42
- package/dist/core/src/core/utils/normalizers/normalize-cache-key.js +14 -40
- package/dist/core/src/core/utils/normalizers/normalize-pathname.js +19 -37
- package/dist/core/src/core/utils/normalizers/normalize-query.js +6 -20
- package/dist/core/src/core/utils/parse-cookie-header.js +11 -18
- package/dist/core/src/core/utils/resolve-loader-options.js +6 -32
- package/dist/core/src/edge/helpers/get-translator.js +14 -20
- package/dist/core/src/edge/translator/init-translator.js +23 -31
- package/dist/core/src/routing/inbound/helpers/resolve-inbound-from-request.js +21 -28
- package/dist/core/src/routing/inbound/resolve-inbound.js +22 -37
- package/dist/core/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
- package/dist/core/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
- package/dist/core/src/routing/inbound/resolve-pathname/strategies/all.js +10 -23
- package/dist/core/src/routing/inbound/resolve-pathname/strategies/except-default.js +11 -24
- package/dist/core/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
- package/dist/core/src/routing/locale/get-locale-from-accept-language.js +21 -36
- package/dist/core/src/routing/locale/get-locale-from-host.js +5 -28
- package/dist/core/src/routing/locale/get-locale-from-pathname.js +11 -37
- package/dist/core/src/routing/locale/get-locale-from-query.js +2 -17
- package/dist/core/src/routing/pathname/canonicalize-pathname.js +25 -67
- package/dist/core/src/routing/pathname/localize-pathname.js +12 -30
- package/dist/core/src/routing/pathname/materialize-pathname.js +9 -44
- package/dist/core/src/routing/pathname/standardize-pathname.js +6 -30
- package/dist/core/src/server/helpers/get-translator.js +26 -23
- package/dist/core/src/server/intor/intor.js +20 -25
- package/dist/core/src/server/messages/load-local-messages/cache/messages-pool.js +4 -7
- package/dist/core/src/server/messages/load-local-messages/load-local-messages.js +76 -92
- package/dist/core/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +59 -80
- package/dist/core/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +53 -87
- package/dist/core/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.js +3 -6
- package/dist/core/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +23 -35
- package/dist/core/src/server/messages/load-messages.js +56 -69
- package/dist/core/src/server/translator/init-translator.js +28 -30
- package/dist/express/src/adapters/express/create-intor-handler.js +35 -46
- package/dist/express/src/adapters/express/get-translator.js +2 -9
- package/dist/express/src/core/constants/locale-placeholder.js +0 -1
- package/dist/express/src/core/locale/canonicalize-locale.js +7 -18
- package/dist/express/src/core/locale/match-locale.js +24 -50
- package/dist/express/src/core/locale/parse-locale.js +12 -22
- package/dist/express/src/core/utils/normalizers/normalize-pathname.js +19 -37
- package/dist/express/src/core/utils/normalizers/normalize-query.js +6 -20
- package/dist/express/src/core/utils/parse-cookie-header.js +11 -18
- package/dist/express/src/routing/inbound/resolve-inbound.js +22 -37
- package/dist/express/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
- package/dist/express/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
- package/dist/express/src/routing/inbound/resolve-pathname/strategies/all.js +10 -23
- package/dist/express/src/routing/inbound/resolve-pathname/strategies/except-default.js +11 -24
- package/dist/express/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
- package/dist/express/src/routing/locale/get-locale-from-accept-language.js +21 -36
- package/dist/express/src/routing/locale/get-locale-from-host.js +5 -28
- package/dist/express/src/routing/locale/get-locale-from-pathname.js +11 -37
- package/dist/express/src/routing/locale/get-locale-from-query.js +2 -17
- package/dist/express/src/routing/pathname/canonicalize-pathname.js +25 -67
- package/dist/express/src/routing/pathname/localize-pathname.js +12 -30
- package/dist/express/src/routing/pathname/materialize-pathname.js +9 -44
- package/dist/express/src/routing/pathname/standardize-pathname.js +6 -30
- package/dist/fastify/src/adapters/fastify/create-intor-handler.js +35 -47
- package/dist/fastify/src/adapters/fastify/get-translator.js +2 -9
- package/dist/fastify/src/adapters/fastify/intor-fastify-plugin.js +29 -38
- package/dist/fastify/src/core/constants/locale-placeholder.js +0 -1
- package/dist/fastify/src/core/locale/canonicalize-locale.js +7 -18
- package/dist/fastify/src/core/locale/match-locale.js +24 -50
- package/dist/fastify/src/core/locale/parse-locale.js +12 -22
- package/dist/fastify/src/core/utils/normalizers/normalize-pathname.js +19 -37
- package/dist/fastify/src/core/utils/normalizers/normalize-query.js +6 -20
- package/dist/fastify/src/core/utils/parse-cookie-header.js +11 -18
- package/dist/fastify/src/routing/inbound/resolve-inbound.js +22 -37
- package/dist/fastify/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
- package/dist/fastify/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
- package/dist/fastify/src/routing/inbound/resolve-pathname/strategies/all.js +10 -23
- package/dist/fastify/src/routing/inbound/resolve-pathname/strategies/except-default.js +11 -24
- package/dist/fastify/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
- package/dist/fastify/src/routing/locale/get-locale-from-accept-language.js +21 -36
- package/dist/fastify/src/routing/locale/get-locale-from-host.js +5 -28
- package/dist/fastify/src/routing/locale/get-locale-from-pathname.js +11 -37
- package/dist/fastify/src/routing/locale/get-locale-from-query.js +2 -17
- package/dist/fastify/src/routing/pathname/canonicalize-pathname.js +25 -67
- package/dist/fastify/src/routing/pathname/localize-pathname.js +12 -30
- package/dist/fastify/src/routing/pathname/materialize-pathname.js +9 -44
- package/dist/fastify/src/routing/pathname/standardize-pathname.js +6 -30
- package/dist/hono/src/adapters/hono/create-intor-handler.js +33 -44
- package/dist/hono/src/adapters/hono/get-translator.js +2 -9
- package/dist/hono/src/core/constants/locale-placeholder.js +0 -1
- package/dist/hono/src/core/locale/canonicalize-locale.js +7 -18
- package/dist/hono/src/core/locale/match-locale.js +24 -50
- package/dist/hono/src/core/locale/parse-locale.js +12 -22
- package/dist/hono/src/core/utils/normalizers/normalize-pathname.js +19 -37
- package/dist/hono/src/core/utils/normalizers/normalize-query.js +6 -20
- package/dist/hono/src/core/utils/parse-cookie-header.js +11 -18
- package/dist/hono/src/routing/inbound/resolve-inbound.js +22 -37
- package/dist/hono/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
- package/dist/hono/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
- package/dist/hono/src/routing/inbound/resolve-pathname/strategies/all.js +10 -23
- package/dist/hono/src/routing/inbound/resolve-pathname/strategies/except-default.js +11 -24
- package/dist/hono/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
- package/dist/hono/src/routing/locale/get-locale-from-accept-language.js +21 -36
- package/dist/hono/src/routing/locale/get-locale-from-host.js +5 -28
- package/dist/hono/src/routing/locale/get-locale-from-pathname.js +11 -37
- package/dist/hono/src/routing/locale/get-locale-from-query.js +2 -17
- package/dist/hono/src/routing/pathname/canonicalize-pathname.js +25 -67
- package/dist/hono/src/routing/pathname/localize-pathname.js +12 -30
- package/dist/hono/src/routing/pathname/materialize-pathname.js +9 -44
- package/dist/hono/src/routing/pathname/standardize-pathname.js +6 -30
- package/dist/next/export/next/server/index.js +1 -0
- package/dist/next/src/adapters/next/create-intor-handler.js +39 -48
- package/dist/next/src/adapters/next/header-keys.js +9 -0
- package/dist/next/src/adapters/next/link.js +33 -28
- package/dist/next/src/adapters/next/redirect.js +12 -15
- package/dist/next/src/adapters/next/server/get-locale.js +13 -24
- package/dist/next/src/adapters/next/server/get-translator.js +2 -9
- package/dist/next/src/adapters/next/server/intor.js +5 -13
- package/dist/next/src/adapters/next/server/read-intor-url-state.js +13 -0
- package/dist/next/src/adapters/next/use-router.js +47 -66
- package/dist/next/src/client/shared/navigation/execute-navigation.js +20 -38
- package/dist/next/src/client/shared/utils/build-cookie-string.js +18 -27
- package/dist/next/src/client/shared/utils/locale/set-locale-cookie.js +2 -9
- package/dist/next/src/core/constants/locale-placeholder.js +0 -1
- package/dist/next/src/core/locale/canonicalize-locale.js +7 -18
- package/dist/next/src/core/locale/match-locale.js +24 -50
- package/dist/next/src/core/locale/parse-locale.js +12 -22
- package/dist/next/src/core/utils/normalizers/normalize-pathname.js +19 -37
- package/dist/next/src/core/utils/normalizers/normalize-query.js +6 -20
- package/dist/next/src/core/utils/resolve-loader-options.js +6 -29
- package/dist/next/src/policies/shoud-full-reload.js +2 -5
- package/dist/next/src/policies/should-sync-locale.js +1 -4
- package/dist/next/src/routing/inbound/resolve-inbound.js +24 -39
- package/dist/next/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
- package/dist/next/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
- package/dist/next/src/routing/inbound/resolve-pathname/strategies/all.js +13 -29
- package/dist/next/src/routing/inbound/resolve-pathname/strategies/except-default.js +14 -30
- package/dist/next/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
- package/dist/next/src/routing/locale/get-locale-from-accept-language.js +21 -36
- package/dist/next/src/routing/locale/get-locale-from-host.js +5 -28
- package/dist/next/src/routing/locale/get-locale-from-pathname.js +11 -37
- package/dist/next/src/routing/locale/get-locale-from-query.js +2 -17
- package/dist/next/src/routing/outbound/decide-strategy.js +9 -9
- package/dist/next/src/routing/outbound/determine-target.js +28 -44
- package/dist/next/src/routing/outbound/resolve-outbound.js +12 -16
- package/dist/next/src/routing/outbound/utils/derive-host-destination.js +5 -9
- package/dist/next/src/routing/outbound/utils/derive-query-destination.js +4 -7
- package/dist/next/src/routing/outbound/utils/is-external-destination.js +1 -7
- package/dist/next/src/routing/pathname/canonicalize-pathname.js +25 -67
- package/dist/next/src/routing/pathname/localize-pathname.js +12 -30
- package/dist/next/src/routing/pathname/materialize-pathname.js +9 -44
- package/dist/next/src/routing/pathname/standardize-pathname.js +6 -30
- package/dist/react/src/client/react/helpers/use-intor.js +25 -44
- package/dist/react/src/client/react/provider/effects/use-locale-effects.js +20 -25
- package/dist/react/src/client/react/provider/effects/use-messages-effects.js +17 -16
- package/dist/react/src/client/react/provider/intor-provider.js +63 -66
- package/dist/react/src/client/react/provider/use-intor-context.js +4 -4
- package/dist/react/src/client/react/render/create-react-renderer.js +18 -24
- package/dist/react/src/client/react/translator/create-t-rich.js +9 -22
- package/dist/react/src/client/react/translator/use-translator.js +11 -16
- package/dist/react/src/client/shared/messages/create-refetch-messages.js +41 -51
- package/dist/react/src/client/shared/provider/effective-state.js +2 -6
- package/dist/react/src/client/shared/utils/build-cookie-string.js +18 -27
- package/dist/react/src/client/shared/utils/locale/get-locale-from-cookie.js +5 -12
- package/dist/react/src/client/shared/utils/locale/set-document-locale.js +2 -8
- package/dist/react/src/client/shared/utils/locale/set-locale-cookie.js +2 -9
- package/dist/react/src/core/logger/get-logger.js +26 -31
- package/dist/react/src/core/logger/global-logger-pool.js +4 -4
- package/dist/react/src/core/messages/load-remote-messages/collect-remote-resources.js +13 -22
- package/dist/react/src/core/messages/load-remote-messages/fetch-remote-resource.js +30 -39
- package/dist/react/src/core/messages/load-remote-messages/load-remote-messages.js +72 -89
- package/dist/react/src/core/messages/load-remote-messages/resolve-remote-resources.js +7 -17
- package/dist/react/src/core/messages/merge-messages.js +17 -28
- package/dist/react/src/core/messages/utils/is-valid-messages.js +22 -37
- package/dist/react/src/core/messages/utils/nest-object-from-path.js +5 -17
- package/dist/react/src/core/utils/deep-merge.js +24 -42
- package/dist/react/src/core/utils/resolve-loader-options.js +6 -29
- package/dist/react/src/policies/should-persist-on-first-visit.js +1 -4
- package/dist/svelte/export/svelte/index.js +0 -6
- package/dist/svelte/src/client/shared/messages/create-refetch-messages.js +41 -51
- package/dist/svelte/src/client/shared/provider/effective-state.js +2 -6
- package/dist/svelte/src/client/shared/utils/build-cookie-string.js +18 -27
- package/dist/svelte/src/client/shared/utils/locale/get-locale-from-cookie.js +5 -12
- package/dist/svelte/src/client/shared/utils/locale/set-document-locale.js +2 -8
- package/dist/svelte/src/client/shared/utils/locale/set-locale-cookie.js +2 -9
- package/dist/svelte/src/client/svelte/provider/create-intor-store.js +59 -63
- package/dist/svelte/src/client/svelte/provider/effects/attach-locale-effects.js +20 -25
- package/dist/svelte/src/client/svelte/provider/effects/attach-messages-effects.js +21 -18
- package/dist/svelte/src/client/svelte/provider/get-intor-context.js +4 -4
- package/dist/svelte/src/client/svelte/translator/use-translator.js +11 -16
- package/dist/svelte/src/core/logger/get-logger.js +26 -31
- package/dist/svelte/src/core/logger/global-logger-pool.js +4 -4
- package/dist/svelte/src/core/messages/load-remote-messages/collect-remote-resources.js +13 -22
- package/dist/svelte/src/core/messages/load-remote-messages/fetch-remote-resource.js +30 -39
- package/dist/svelte/src/core/messages/load-remote-messages/load-remote-messages.js +72 -89
- package/dist/svelte/src/core/messages/load-remote-messages/resolve-remote-resources.js +7 -17
- package/dist/svelte/src/core/messages/merge-messages.js +17 -28
- package/dist/svelte/src/core/messages/utils/is-valid-messages.js +22 -37
- package/dist/svelte/src/core/messages/utils/nest-object-from-path.js +5 -17
- package/dist/svelte/src/core/render/create-html-renderer.js +29 -37
- package/dist/svelte/src/core/render/utils/escape-html.js +1 -6
- package/dist/svelte/src/core/render/utils/render-attributes.js +6 -11
- package/dist/svelte/src/core/translator/create-t-rich.js +6 -15
- package/dist/svelte/src/core/utils/deep-merge.js +24 -42
- package/dist/svelte/src/core/utils/resolve-loader-options.js +6 -29
- package/dist/svelte/src/policies/should-persist-on-first-visit.js +1 -4
- package/dist/svelte-kit/src/adapters/svelte-kit/create-intor-handler.js +37 -57
- package/dist/svelte-kit/src/adapters/svelte-kit/use-navigation.js +29 -27
- package/dist/svelte-kit/src/adapters/svelte-kit/utils/is-svelte-kit-ssg.js +4 -11
- package/dist/svelte-kit/src/client/shared/navigation/execute-navigation.js +19 -37
- package/dist/svelte-kit/src/client/shared/utils/build-cookie-string.js +18 -27
- package/dist/svelte-kit/src/client/shared/utils/locale/set-locale-cookie.js +2 -9
- package/dist/svelte-kit/src/core/constants/locale-placeholder.js +0 -1
- package/dist/svelte-kit/src/core/locale/canonicalize-locale.js +7 -18
- package/dist/svelte-kit/src/core/locale/match-locale.js +24 -50
- package/dist/svelte-kit/src/core/locale/parse-locale.js +12 -22
- package/dist/svelte-kit/src/core/utils/normalizers/normalize-pathname.js +19 -37
- package/dist/svelte-kit/src/core/utils/normalizers/normalize-query.js +6 -20
- package/dist/svelte-kit/src/core/utils/resolve-loader-options.js +6 -29
- package/dist/svelte-kit/src/policies/shoud-full-reload.js +2 -5
- package/dist/svelte-kit/src/policies/should-sync-locale.js +1 -4
- package/dist/svelte-kit/src/routing/inbound/resolve-inbound.js +22 -37
- package/dist/svelte-kit/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
- package/dist/svelte-kit/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
- package/dist/svelte-kit/src/routing/inbound/resolve-pathname/strategies/all.js +10 -23
- package/dist/svelte-kit/src/routing/inbound/resolve-pathname/strategies/except-default.js +11 -24
- package/dist/svelte-kit/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
- package/dist/svelte-kit/src/routing/locale/get-locale-from-accept-language.js +21 -36
- package/dist/svelte-kit/src/routing/locale/get-locale-from-host.js +5 -28
- package/dist/svelte-kit/src/routing/locale/get-locale-from-pathname.js +11 -37
- package/dist/svelte-kit/src/routing/locale/get-locale-from-query.js +2 -17
- package/dist/svelte-kit/src/routing/outbound/decide-strategy.js +9 -9
- package/dist/svelte-kit/src/routing/outbound/determine-target.js +28 -44
- package/dist/svelte-kit/src/routing/outbound/resolve-outbound.js +12 -16
- package/dist/svelte-kit/src/routing/outbound/utils/derive-host-destination.js +5 -9
- package/dist/svelte-kit/src/routing/outbound/utils/derive-query-destination.js +4 -7
- package/dist/svelte-kit/src/routing/outbound/utils/is-external-destination.js +1 -7
- package/dist/svelte-kit/src/routing/pathname/canonicalize-pathname.js +25 -67
- package/dist/svelte-kit/src/routing/pathname/localize-pathname.js +12 -30
- package/dist/svelte-kit/src/routing/pathname/materialize-pathname.js +9 -44
- package/dist/svelte-kit/src/routing/pathname/standardize-pathname.js +6 -30
- package/dist/types/export/index.d.ts +1 -1
- package/dist/types/export/index.d.ts.map +1 -1
- package/dist/types/export/next/server/index.d.ts +1 -1
- package/dist/types/export/next/server/index.d.ts.map +1 -1
- package/dist/types/src/adapters/fastify/intor-fastify-plugin.d.ts.map +1 -1
- package/dist/types/src/adapters/next/create-intor-handler.d.ts.map +1 -1
- package/dist/types/src/{core/constants/headers.d.ts → adapters/next/header-keys.d.ts} +3 -2
- package/dist/types/src/adapters/next/header-keys.d.ts.map +1 -0
- package/dist/types/src/adapters/next/server/get-locale.d.ts.map +1 -1
- package/dist/types/src/adapters/next/server/index.d.ts +1 -0
- package/dist/types/src/adapters/next/server/index.d.ts.map +1 -1
- package/dist/types/src/adapters/next/server/read-intor-url-state.d.ts +13 -0
- package/dist/types/src/adapters/next/server/read-intor-url-state.d.ts.map +1 -0
- package/dist/types/src/core/constants/index.d.ts +0 -1
- package/dist/types/src/core/constants/index.d.ts.map +1 -1
- package/dist/types/src/core/constants/locale-placeholder.d.ts +5 -0
- package/dist/types/src/core/constants/locale-placeholder.d.ts.map +1 -1
- package/dist/types/src/core/index.d.ts +1 -1
- package/dist/types/src/core/index.d.ts.map +1 -1
- package/dist/types/src/edge/translator/init-translator.d.ts.map +1 -1
- package/dist/types/src/routing/outbound/decide-strategy.d.ts +1 -1
- package/dist/types/src/routing/outbound/decide-strategy.d.ts.map +1 -1
- package/dist/types/src/server/translator/init-translator.d.ts.map +1 -1
- package/dist/vue/src/client/shared/messages/create-refetch-messages.js +41 -51
- package/dist/vue/src/client/shared/provider/effective-state.js +2 -6
- package/dist/vue/src/client/shared/utils/build-cookie-string.js +18 -27
- package/dist/vue/src/client/shared/utils/locale/get-locale-from-cookie.js +5 -12
- package/dist/vue/src/client/shared/utils/locale/set-document-locale.js +2 -8
- package/dist/vue/src/client/shared/utils/locale/set-locale-cookie.js +2 -9
- package/dist/vue/src/client/vue/helpers/use-intor.js +20 -42
- package/dist/vue/src/client/vue/provider/effects/use-locale-effects.js +23 -24
- package/dist/vue/src/client/vue/provider/effects/use-messages-effects.js +15 -24
- package/dist/vue/src/client/vue/provider/inject-intor-context.js +4 -4
- package/dist/vue/src/client/vue/provider/intor-provider.js +61 -66
- package/dist/vue/src/client/vue/render/create-vue-renderer.js +18 -24
- package/dist/vue/src/client/vue/translator/create-t-rich.js +5 -17
- package/dist/vue/src/client/vue/translator/trans.js +24 -31
- package/dist/vue/src/client/vue/translator/use-translator.js +12 -17
- package/dist/vue/src/core/logger/get-logger.js +26 -31
- package/dist/vue/src/core/logger/global-logger-pool.js +4 -4
- package/dist/vue/src/core/messages/load-remote-messages/collect-remote-resources.js +13 -22
- package/dist/vue/src/core/messages/load-remote-messages/fetch-remote-resource.js +30 -39
- package/dist/vue/src/core/messages/load-remote-messages/load-remote-messages.js +72 -89
- package/dist/vue/src/core/messages/load-remote-messages/resolve-remote-resources.js +7 -17
- package/dist/vue/src/core/messages/merge-messages.js +17 -28
- package/dist/vue/src/core/messages/utils/is-valid-messages.js +22 -37
- package/dist/vue/src/core/messages/utils/nest-object-from-path.js +5 -17
- package/dist/vue/src/core/utils/deep-merge.js +24 -42
- package/dist/vue/src/core/utils/resolve-loader-options.js +6 -29
- package/dist/vue/src/policies/should-persist-on-first-visit.js +1 -4
- package/package.json +53 -65
- package/dist/next/src/core/constants/headers.js +0 -8
- package/dist/types/src/core/constants/headers.d.ts.map +0 -1
|
@@ -4,75 +4,33 @@ import 'logry';
|
|
|
4
4
|
import 'p-limit';
|
|
5
5
|
import 'intor-translator';
|
|
6
6
|
|
|
7
|
-
/**
|
|
8
|
-
* Returns the internal canonical pathname.
|
|
9
|
-
*
|
|
10
|
-
* Canonical representation is the locale-neutral and deployment-neutral
|
|
11
|
-
* internal routing form used for identity and routing computation.
|
|
12
|
-
*
|
|
13
|
-
* Guarantees:
|
|
14
|
-
* - Pathname is normalized
|
|
15
|
-
* - Deployment prefix (`basePath`) is removed
|
|
16
|
-
* - Leading locale segment or `{locale}` placeholder is removed
|
|
17
|
-
* - Only the first path segment is evaluated for locale stripping
|
|
18
|
-
* - Result always starts with "/"
|
|
19
|
-
* - Root is represented as "/"
|
|
20
|
-
*
|
|
21
|
-
* Accepts `{locale}` as a locale placeholder segment.
|
|
22
|
-
*
|
|
23
|
-
* @example
|
|
24
|
-
* ```ts
|
|
25
|
-
* // config.supportedLocales: ["en"]
|
|
26
|
-
* // config.routing.basePath: "/app"
|
|
27
|
-
* // config.routing.prefix: "all"
|
|
28
|
-
* canonicalizePathname("/app/en/about", config);
|
|
29
|
-
* // => "/about"
|
|
30
|
-
*```
|
|
31
|
-
*/
|
|
32
7
|
function canonicalizePathname(rawPathname, config) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
if (basePath) {
|
|
41
|
-
|
|
42
|
-
path = "/";
|
|
43
|
-
}
|
|
44
|
-
else if (path.startsWith(basePath + "/")) {
|
|
45
|
-
path = path.slice(basePath.length);
|
|
46
|
-
}
|
|
8
|
+
const { routing, supportedLocales } = config;
|
|
9
|
+
const normalizedPathname = normalizePathname(rawPathname);
|
|
10
|
+
const basePath = routing.basePath === "/" ? "" : routing.basePath;
|
|
11
|
+
let path = normalizedPathname;
|
|
12
|
+
if (basePath) {
|
|
13
|
+
if (path === basePath) {
|
|
14
|
+
path = "/";
|
|
15
|
+
} else if (path.startsWith(basePath + "/")) {
|
|
16
|
+
path = path.slice(basePath.length);
|
|
47
17
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
else if (supportedLocales.includes(firstSegment)) {
|
|
66
|
-
localeLength = firstSegment.length;
|
|
67
|
-
}
|
|
68
|
-
// ---------------------------------------------------------------------------
|
|
69
|
-
// Strip locale segment (if any)
|
|
70
|
-
// ---------------------------------------------------------------------------
|
|
71
|
-
if (localeLength !== undefined) {
|
|
72
|
-
const stripped = path.slice(localeLength + 1);
|
|
73
|
-
return stripped || "/";
|
|
74
|
-
}
|
|
75
|
-
return path;
|
|
18
|
+
}
|
|
19
|
+
if (path === "/") return "/";
|
|
20
|
+
const segmentStart = 1;
|
|
21
|
+
const nextSlash = path.indexOf("/", segmentStart);
|
|
22
|
+
const firstSegment = nextSlash === -1 ? path.slice(segmentStart) : path.slice(segmentStart, nextSlash);
|
|
23
|
+
let localeLength;
|
|
24
|
+
if (firstSegment === LOCALE_PLACEHOLDER) {
|
|
25
|
+
localeLength = firstSegment.length;
|
|
26
|
+
} else if (supportedLocales.includes(firstSegment)) {
|
|
27
|
+
localeLength = firstSegment.length;
|
|
28
|
+
}
|
|
29
|
+
if (localeLength !== void 0) {
|
|
30
|
+
const stripped = path.slice(localeLength + 1);
|
|
31
|
+
return stripped || "/";
|
|
32
|
+
}
|
|
33
|
+
return path;
|
|
76
34
|
}
|
|
77
35
|
|
|
78
36
|
export { canonicalizePathname };
|
|
@@ -2,37 +2,19 @@ import { canonicalizePathname } from './canonicalize-pathname.js';
|
|
|
2
2
|
import { materializePathname } from './materialize-pathname.js';
|
|
3
3
|
import { standardizePathname } from './standardize-pathname.js';
|
|
4
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
|
-
* localizePathname("/app/en-US/about", config, "en-US");
|
|
15
|
-
* // => {
|
|
16
|
-
* // pathname: '/app/en-US/about'
|
|
17
|
-
* // canonicalPathname: '/about',
|
|
18
|
-
* // templatedPathname: '/app/{locale}/about',
|
|
19
|
-
* // }
|
|
20
|
-
* ```
|
|
21
|
-
*
|
|
22
|
-
* @public
|
|
23
|
-
*/
|
|
24
5
|
const localizePathname = (rawPathname, config, locale) => {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
6
|
+
const canonicalPathname = canonicalizePathname(rawPathname, config);
|
|
7
|
+
const standardizedPathname = standardizePathname(canonicalPathname, config);
|
|
8
|
+
const materializedPathname = materializePathname(
|
|
9
|
+
standardizedPathname,
|
|
10
|
+
config,
|
|
11
|
+
locale
|
|
12
|
+
);
|
|
13
|
+
return {
|
|
14
|
+
canonicalPathname,
|
|
15
|
+
templatedPathname: standardizedPathname,
|
|
16
|
+
pathname: materializedPathname
|
|
17
|
+
};
|
|
36
18
|
};
|
|
37
19
|
|
|
38
20
|
export { localizePathname };
|
|
@@ -3,51 +3,16 @@ import 'logry';
|
|
|
3
3
|
import 'p-limit';
|
|
4
4
|
import 'intor-translator';
|
|
5
5
|
|
|
6
|
-
/**
|
|
7
|
-
* Materializes a standardized pathname into a concrete, locale-aware URL.
|
|
8
|
-
*
|
|
9
|
-
* This function resolves the `{locale}` placeholder according to the
|
|
10
|
-
* configured `localePrefix` strategy and produces the final pathname.
|
|
11
|
-
*
|
|
12
|
-
* Behavior:
|
|
13
|
-
* - "all": always injects the locale segment
|
|
14
|
-
* - "except-default": injects the locale unless it equals `defaultLocale`
|
|
15
|
-
* - "none": removes the locale placeholder entirely
|
|
16
|
-
*
|
|
17
|
-
* Invariants:
|
|
18
|
-
* - `standardizedPathname` must be produced by `standardizePathname`
|
|
19
|
-
* - The pathname must contain exactly one `{locale}` placeholder
|
|
20
|
-
* - The placeholder must appear as the first path segment
|
|
21
|
-
*
|
|
22
|
-
* This function performs structural transformation only.
|
|
23
|
-
* It does not normalize or sanitize the resulting pathname.
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* ```ts
|
|
27
|
-
* // config.routing.localePrefix: "all"
|
|
28
|
-
* materializePathname("/app/{locale}/about", config, "en");
|
|
29
|
-
* // => /app/en/about
|
|
30
|
-
*
|
|
31
|
-
* // config.routing.localePrefix: "none"
|
|
32
|
-
* materializePathname("/app/{locale}/about", config, "en");
|
|
33
|
-
* // => /app/about
|
|
34
|
-
* ```
|
|
35
|
-
*/
|
|
36
6
|
const materializePathname = (standardizedPathname, config, locale) => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
// localePrefix: "all"
|
|
47
|
-
if (localePrefix === "all")
|
|
48
|
-
return injectLocale();
|
|
49
|
-
// localePrefix: "except-default"
|
|
50
|
-
return locale === config.defaultLocale ? removeLocale() : injectLocale();
|
|
7
|
+
const { localePrefix } = config.routing;
|
|
8
|
+
const removeLocale = () => {
|
|
9
|
+
const result = standardizedPathname.replace(`/${LOCALE_PLACEHOLDER}`, "");
|
|
10
|
+
return result === "" ? "/" : result;
|
|
11
|
+
};
|
|
12
|
+
const injectLocale = () => standardizedPathname.replace(LOCALE_PLACEHOLDER, locale);
|
|
13
|
+
if (localePrefix === "none") return removeLocale();
|
|
14
|
+
if (localePrefix === "all") return injectLocale();
|
|
15
|
+
return locale === config.defaultLocale ? removeLocale() : injectLocale();
|
|
51
16
|
};
|
|
52
17
|
|
|
53
18
|
export { materializePathname };
|
|
@@ -3,37 +3,13 @@ import 'logry';
|
|
|
3
3
|
import 'p-limit';
|
|
4
4
|
import 'intor-translator';
|
|
5
5
|
|
|
6
|
-
/**
|
|
7
|
-
* Standardizes a canonical pathname into an internal routing template.
|
|
8
|
-
*
|
|
9
|
-
* Standardized representation:
|
|
10
|
-
* - Prepends the deployment prefix (`basePath`) if defined
|
|
11
|
-
* - Injects the `{locale}` placeholder as the first path segment
|
|
12
|
-
* - Preserves the canonical pathname structure
|
|
13
|
-
*
|
|
14
|
-
* Input must be a canonical pathname.
|
|
15
|
-
*
|
|
16
|
-
* Output is an internal routing template and
|
|
17
|
-
* is not a locale-resolved URL.
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```ts
|
|
21
|
-
* // config.routing.basePath: "/app",
|
|
22
|
-
* standardizePathname("/about", config);
|
|
23
|
-
* // => "/app/{locale}/about"
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
6
|
const standardizePathname = (canonicalPathname, config) => {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
return basePath
|
|
35
|
-
? `${basePath}/${LOCALE_PLACEHOLDER}${canonicalPathname}`
|
|
36
|
-
: `/${LOCALE_PLACEHOLDER}${canonicalPathname}`;
|
|
7
|
+
const { routing } = config;
|
|
8
|
+
const basePath = routing.basePath && routing.basePath !== "/" ? routing.basePath : "";
|
|
9
|
+
if (canonicalPathname === "/") {
|
|
10
|
+
return basePath ? `${basePath}/${LOCALE_PLACEHOLDER}` : `/${LOCALE_PLACEHOLDER}`;
|
|
11
|
+
}
|
|
12
|
+
return basePath ? `${basePath}/${LOCALE_PLACEHOLDER}${canonicalPathname}` : `/${LOCALE_PLACEHOLDER}${canonicalPathname}`;
|
|
37
13
|
};
|
|
38
14
|
|
|
39
15
|
export { standardizePathname };
|
|
@@ -7,51 +7,40 @@ import 'intor-translator';
|
|
|
7
7
|
import { resolveInbound } from '../../routing/inbound/resolve-inbound.js';
|
|
8
8
|
import { getLocaleFromAcceptLanguage } from '../../routing/locale/get-locale-from-accept-language.js';
|
|
9
9
|
|
|
10
|
-
/**
|
|
11
|
-
* Resolves locale-aware routing for the current execution context.
|
|
12
|
-
*
|
|
13
|
-
* - Binds resolved routing state to the request.
|
|
14
|
-
* - Optionally binds convenience routing shortcuts for downstream consumption.
|
|
15
|
-
*
|
|
16
|
-
* @public
|
|
17
|
-
*/
|
|
18
10
|
function createIntorHandler(config, options) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
await next();
|
|
54
|
-
};
|
|
11
|
+
return async function intorHandler(c, next) {
|
|
12
|
+
const acceptLanguage = c.req.header("accept-language");
|
|
13
|
+
const localeFromAcceptLanguage = getLocaleFromAcceptLanguage(
|
|
14
|
+
acceptLanguage,
|
|
15
|
+
config.supportedLocales
|
|
16
|
+
);
|
|
17
|
+
const url = new URL(c.req.url);
|
|
18
|
+
const cookie = parseCookieHeader(c.req.header("cookie"))[config.cookie.name];
|
|
19
|
+
const { locale, localeSource, pathname } = resolveInbound(
|
|
20
|
+
config,
|
|
21
|
+
url.pathname,
|
|
22
|
+
{
|
|
23
|
+
host: url.hostname,
|
|
24
|
+
query: normalizeQuery(Object.fromEntries(url.searchParams)),
|
|
25
|
+
...cookie !== void 0 ? { cookie } : {},
|
|
26
|
+
...localeFromAcceptLanguage !== void 0 ? { detected: localeFromAcceptLanguage } : {}
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
c.set("intor", { locale, localeSource, pathname });
|
|
30
|
+
const { handlers, hooks } = options ?? {};
|
|
31
|
+
const { hasKey, t, tRich } = await getTranslator(config, {
|
|
32
|
+
locale,
|
|
33
|
+
...handlers !== void 0 ? { handlers } : {},
|
|
34
|
+
...hooks !== void 0 ? { hooks } : {}
|
|
35
|
+
});
|
|
36
|
+
if (options?.shortcuts !== false) {
|
|
37
|
+
c.set("locale", locale);
|
|
38
|
+
c.set("hasKey", hasKey);
|
|
39
|
+
c.set("t", t);
|
|
40
|
+
c.set("tRich", tRich);
|
|
41
|
+
}
|
|
42
|
+
await next();
|
|
43
|
+
};
|
|
55
44
|
}
|
|
56
45
|
|
|
57
46
|
export { createIntorHandler };
|
|
@@ -1,15 +1,8 @@
|
|
|
1
1
|
import { getTranslator as getTranslator$1 } from 'intor/edge';
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* Get a edge-runtime translator for the current execution context.
|
|
5
|
-
*
|
|
6
|
-
* - Automatically resolves the locale from the framework context.
|
|
7
|
-
*
|
|
8
|
-
* @public
|
|
9
|
-
*/
|
|
10
3
|
async function getTranslator(config, c, params) {
|
|
11
|
-
|
|
12
|
-
|
|
4
|
+
const locale = c.get("intor")?.locale ?? config.defaultLocale;
|
|
5
|
+
return getTranslator$1(config, { locale, ...params ?? {} });
|
|
13
6
|
}
|
|
14
7
|
|
|
15
8
|
export { getTranslator };
|
|
@@ -1,23 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Canonicalizes a BCP 47 locale string.
|
|
3
|
-
*
|
|
4
|
-
* - Uses `Intl.getCanonicalLocales` when available.
|
|
5
|
-
* - Returns the original input if `Intl` is unavailable.
|
|
6
|
-
* - Returns `undefined` for invalid locale input.
|
|
7
|
-
*
|
|
8
|
-
* This function performs normalization only.
|
|
9
|
-
* It does not perform matching or fallback.
|
|
10
|
-
*/
|
|
11
1
|
function canonicalizeLocale(input) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
return Intl.getCanonicalLocales(input)[0];
|
|
17
|
-
}
|
|
18
|
-
catch {
|
|
19
|
-
return;
|
|
2
|
+
try {
|
|
3
|
+
if (typeof Intl === "undefined" || !Intl.getCanonicalLocales) {
|
|
4
|
+
return input;
|
|
20
5
|
}
|
|
6
|
+
return Intl.getCanonicalLocales(input)[0];
|
|
7
|
+
} catch {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
21
10
|
}
|
|
22
11
|
|
|
23
12
|
export { canonicalizeLocale };
|
|
@@ -1,61 +1,35 @@
|
|
|
1
1
|
import { canonicalizeLocale } from './canonicalize-locale.js';
|
|
2
2
|
import { parseLocale } from './parse-locale.js';
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* Matches a locale candidate against a list of supported locales.
|
|
6
|
-
*
|
|
7
|
-
* Resolution order:
|
|
8
|
-
* 1. Exact canonical match
|
|
9
|
-
* 2. Same language + same script
|
|
10
|
-
* 3. Same language only (only if candidate has no script)
|
|
11
|
-
*
|
|
12
|
-
* Returns one of the original `supportedLocales` values if matched.
|
|
13
|
-
* Returns `undefined` if no match is found.
|
|
14
|
-
*
|
|
15
|
-
* Notes:
|
|
16
|
-
* - Matching is deterministic and order-sensitive.
|
|
17
|
-
* - Does not perform automatic fallback to a default locale.
|
|
18
|
-
* Consumers are responsible for applying fallback logic.
|
|
19
|
-
* - If the candidate includes a script subtag, language-only fallback is skipped.
|
|
20
|
-
*
|
|
21
|
-
* @public
|
|
22
|
-
*/
|
|
23
4
|
function matchLocale(locale, supportedLocales = []) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
// 1. Exact match
|
|
37
|
-
for (const s of supportedCanonical) {
|
|
38
|
-
if (s.canonical === canonicalCandidate) {
|
|
39
|
-
return s.original;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
// 2. Same language + same script
|
|
43
|
-
if (candidateParts.script) {
|
|
44
|
-
for (const s of supportedCanonical) {
|
|
45
|
-
if (s.parts.language === candidateParts.language &&
|
|
46
|
-
s.parts.script === candidateParts.script) {
|
|
47
|
-
return s.original;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return;
|
|
5
|
+
if (!locale || supportedLocales.length === 0) return;
|
|
6
|
+
const canonicalCandidate = canonicalizeLocale(locale);
|
|
7
|
+
if (!canonicalCandidate) return;
|
|
8
|
+
const candidateParts = parseLocale(canonicalCandidate);
|
|
9
|
+
const supportedCanonical = supportedLocales.flatMap((original) => {
|
|
10
|
+
const canonical = canonicalizeLocale(original);
|
|
11
|
+
if (!canonical) return [];
|
|
12
|
+
return [{ original, canonical, parts: parseLocale(canonical) }];
|
|
13
|
+
});
|
|
14
|
+
for (const s of supportedCanonical) {
|
|
15
|
+
if (s.canonical === canonicalCandidate) {
|
|
16
|
+
return s.original;
|
|
51
17
|
}
|
|
52
|
-
|
|
18
|
+
}
|
|
19
|
+
if (candidateParts.script) {
|
|
53
20
|
for (const s of supportedCanonical) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
21
|
+
if (s.parts.language === candidateParts.language && s.parts.script === candidateParts.script) {
|
|
22
|
+
return s.original;
|
|
23
|
+
}
|
|
57
24
|
}
|
|
58
25
|
return;
|
|
26
|
+
}
|
|
27
|
+
for (const s of supportedCanonical) {
|
|
28
|
+
if (s.parts.language === candidateParts.language) {
|
|
29
|
+
return s.original;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return;
|
|
59
33
|
}
|
|
60
34
|
|
|
61
35
|
export { matchLocale };
|
|
@@ -1,27 +1,17 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parses a canonical locale tag into structural components.
|
|
3
|
-
*
|
|
4
|
-
* - Uses `Intl.Locale` when available.
|
|
5
|
-
* - Falls back to minimal parsing (language only) if unavailable.
|
|
6
|
-
*
|
|
7
|
-
* This function does not validate or match locales.
|
|
8
|
-
*/
|
|
9
1
|
function parseLocale(tag) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
2
|
+
try {
|
|
3
|
+
if (typeof Intl !== "undefined" && typeof Intl.Locale === "function") {
|
|
4
|
+
const locale = new Intl.Locale(tag);
|
|
5
|
+
return {
|
|
6
|
+
language: locale.language,
|
|
7
|
+
...locale.script !== void 0 ? { script: locale.script } : {},
|
|
8
|
+
...locale.region !== void 0 ? { region: locale.region } : {}
|
|
9
|
+
};
|
|
19
10
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return { language: parts[0].toLowerCase() };
|
|
11
|
+
} catch {
|
|
12
|
+
}
|
|
13
|
+
const parts = tag.split("-");
|
|
14
|
+
return { language: parts[0].toLowerCase() };
|
|
25
15
|
}
|
|
26
16
|
|
|
27
17
|
export { parseLocale };
|
|
@@ -1,42 +1,24 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Normalizes a raw pathname string into a consistent structural form.
|
|
3
|
-
*
|
|
4
|
-
* Canonical guarantees:
|
|
5
|
-
* - Leading and trailing whitespace (code points ≤ 32) are trimmed
|
|
6
|
-
* - Consecutive slashes are collapsed into a single slash
|
|
7
|
-
* - The result always starts with a single "/"
|
|
8
|
-
* - Redundant trailing slashes are removed
|
|
9
|
-
* - The root path is represented as "/"
|
|
10
|
-
*
|
|
11
|
-
* This function is deterministic and allocation-minimized.
|
|
12
|
-
*/
|
|
13
1
|
const normalizePathname = (rawPathname) => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
hasSlash = true;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
result += hasSlash || result === "" ? "/" + char : char;
|
|
36
|
-
hasSlash = false;
|
|
37
|
-
}
|
|
2
|
+
const length = rawPathname.length;
|
|
3
|
+
let start = 0;
|
|
4
|
+
let end = length - 1;
|
|
5
|
+
while (start <= end && rawPathname.codePointAt(start) <= 32) start++;
|
|
6
|
+
while (end >= start && rawPathname.codePointAt(end) <= 32) end--;
|
|
7
|
+
if (start > end) return "/";
|
|
8
|
+
let result = "";
|
|
9
|
+
let hasSlash = false;
|
|
10
|
+
for (let i = start; i <= end; i++) {
|
|
11
|
+
const char = rawPathname[i];
|
|
12
|
+
if (char === "/") {
|
|
13
|
+
if (!hasSlash) {
|
|
14
|
+
hasSlash = true;
|
|
15
|
+
}
|
|
16
|
+
} else {
|
|
17
|
+
result += hasSlash || result === "" ? "/" + char : char;
|
|
18
|
+
hasSlash = false;
|
|
38
19
|
}
|
|
39
|
-
|
|
20
|
+
}
|
|
21
|
+
return result || "/";
|
|
40
22
|
};
|
|
41
23
|
|
|
42
24
|
export { normalizePathname };
|
|
@@ -1,25 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Normalize a raw query object into a string-only map.
|
|
3
|
-
*
|
|
4
|
-
* This utility is used to sanitize framework-specific query inputs
|
|
5
|
-
* into a stable shape that the routing core
|
|
6
|
-
* can safely consume.
|
|
7
|
-
*
|
|
8
|
-
* Behavior:
|
|
9
|
-
* - Keeps only entries whose values are strings
|
|
10
|
-
* - Ignores arrays, objects, and other non-string values
|
|
11
|
-
* - Does not throw or attempt to coerce values
|
|
12
|
-
*
|
|
13
|
-
* This function is intentionally conservative by design.
|
|
14
|
-
*/
|
|
15
1
|
function normalizeQuery(query) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
2
|
+
const normalized = {};
|
|
3
|
+
for (const [key, value] of Object.entries(query)) {
|
|
4
|
+
if (typeof value === "string") {
|
|
5
|
+
normalized[key] = value;
|
|
21
6
|
}
|
|
22
|
-
|
|
7
|
+
}
|
|
8
|
+
return normalized;
|
|
23
9
|
}
|
|
24
10
|
|
|
25
11
|
export { normalizeQuery };
|