From b34a6327d75d3a4e594656848cf170ed151795e0 Mon Sep 17 00:00:00 2001 From: Jan Amann Date: Tue, 17 Sep 2024 11:28:20 +0200 Subject: [PATCH 1/2] fix: Handle overlapping locale prefixes correctly pt. 2 --- .../middleware/getAlternateLinksHeaderValue.tsx | 3 ++- .../src/middleware/middleware.test.tsx | 17 +++++++++++++++++ packages/next-intl/src/middleware/utils.tsx | 15 ++++++++++----- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/packages/next-intl/src/middleware/getAlternateLinksHeaderValue.tsx b/packages/next-intl/src/middleware/getAlternateLinksHeaderValue.tsx index 56343a050..e09f4d64e 100644 --- a/packages/next-intl/src/middleware/getAlternateLinksHeaderValue.tsx +++ b/packages/next-intl/src/middleware/getAlternateLinksHeaderValue.tsx @@ -69,7 +69,8 @@ export default function getAlternateLinksHeaderValue< const links = getLocalePrefixes( routing.locales as AppLocales, - routing.localePrefix + routing.localePrefix, + false ).flatMap(([locale, prefix]) => { function prefixPathname(pathname: string) { if (pathname === '/') { diff --git a/packages/next-intl/src/middleware/middleware.test.tsx b/packages/next-intl/src/middleware/middleware.test.tsx index 9caae4a14..4641b2228 100644 --- a/packages/next-intl/src/middleware/middleware.test.tsx +++ b/packages/next-intl/src/middleware/middleware.test.tsx @@ -1589,6 +1589,23 @@ describe('prefix-based routing', () => { ); }); + it('handles overlapping custom prefixes correctly', () => { + createMiddleware({ + locales: ['en-US', 'es-US'], + defaultLocale: 'en-US', + localePrefix: { + mode: 'always', + prefixes: { + 'es-US': '/us/es', + 'en-US': '/us' + } + } + })(createMockRequest('/us/es')); + expect(MockedNextResponse.rewrite.mock.calls[0][0].toString()).toBe( + 'http://localhost:3000/es-US' + ); + }); + it('serves requests for a prefixed locale at the root', () => { middlewareWithPrefixes(createMockRequest('/uk?test')); expect(MockedNextResponse.redirect).not.toHaveBeenCalled(); diff --git a/packages/next-intl/src/middleware/utils.tsx b/packages/next-intl/src/middleware/utils.tsx index d70468166..6b7da0234 100644 --- a/packages/next-intl/src/middleware/utils.tsx +++ b/packages/next-intl/src/middleware/utils.tsx @@ -129,12 +129,20 @@ export function findCaseInsensitiveString( export function getLocalePrefixes( locales: AppLocales, - localePrefix: LocalePrefixConfigVerbose + localePrefix: LocalePrefixConfigVerbose, + sort = true ): Array<[AppLocales[number], string]> { - return locales.map((locale) => [ + const prefixes = locales.map((locale) => [ locale as AppLocales[number], getLocalePrefix(locale, localePrefix) ]); + + if (sort) { + // More specific ones first + prefixes.sort((a, b) => b[1].length - a[1].length); + } + + return prefixes as Array<[AppLocales[number], string]>; } export function getPathnameMatch( @@ -151,9 +159,6 @@ export function getPathnameMatch( | undefined { const localePrefixes = getLocalePrefixes(locales, localePrefix); - // More specific ones first - localePrefixes.sort((a, b) => b[1].length - a[1].length); - for (const [locale, prefix] of localePrefixes) { let exact, matches; if (pathname === prefix || pathname.startsWith(prefix + '/')) { From 4c61773981379e33d067ac674ecec7c672c4b9a5 Mon Sep 17 00:00:00 2001 From: Jan Amann Date: Tue, 17 Sep 2024 11:53:52 +0200 Subject: [PATCH 2/2] Bump size --- packages/next-intl/.size-limit.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next-intl/.size-limit.ts b/packages/next-intl/.size-limit.ts index 76974f868..7a8838d78 100644 --- a/packages/next-intl/.size-limit.ts +++ b/packages/next-intl/.size-limit.ts @@ -27,7 +27,7 @@ const config: SizeLimitConfig = [ }, { path: 'dist/production/middleware.js', - limit: '9.595 KB' + limit: '9.61 KB' }, { path: 'dist/production/routing.js',