Skip to content

Commit 7faf80d

Browse files
committed
fix: handle localised RSC routes
1 parent cc1cc9a commit 7faf80d

File tree

3 files changed

+203
-12
lines changed

3 files changed

+203
-12
lines changed

packages/runtime/src/helpers/edge.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,10 @@ const maybeLoadJson = <T>(path: string): Promise<T> | null => {
7474
export const isStaticAppDirRoute = ({ srcRoute }: SsgRoute, manifest: Record<string, string> | null): boolean =>
7575
Boolean(manifest) && Object.values(manifest).includes(srcRoute)
7676

77-
export const isDynamicAppDirRoute = ({ page }: DynamicRoute, manifest: Record<string, string> | null): boolean =>
78-
Boolean(manifest) && Object.values(manifest).includes(page)
77+
export const isDynamicAppDirRoute = (
78+
{ page }: Pick<DynamicRoute, 'page'>,
79+
manifest: Record<string, string> | null,
80+
): boolean => Boolean(manifest) && Object.values(manifest).includes(page)
7981

8082
export const loadMiddlewareManifest = (netlifyConfig: NetlifyConfig): Promise<MiddlewareManifest | null> =>
8183
maybeLoadJson(resolve(netlifyConfig.build.publish, 'server', 'middleware-manifest.json'))

packages/runtime/src/helpers/utils.ts

+9-4
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ export const generateNetlifyRoutes = ({
8383
export const routeToDataRoute = (route: string, buildId: string, locale?: string) =>
8484
`/_next/data/${buildId}${locale ? `/${locale}` : ''}${route === '/' ? '/index' : route}.json`
8585

86+
// Default locale is served from root, not localized
87+
export const localizeRoute = (route: string, locale: string, defaultLocale: string) =>
88+
locale === defaultLocale ? route : `/${locale}${route}`
89+
8690
const netlifyRoutesForNextRoute = ({
8791
route,
8892
buildId,
@@ -107,13 +111,14 @@ const netlifyRoutesForNextRoute = ({
107111
const { locales, defaultLocale } = i18n
108112
const routes = []
109113
locales.forEach((locale) => {
110-
// Data route is always localized
111-
const localizedDataRoute = dataRoute || routeToDataRoute(route, buildId, locale)
114+
// Data route is always localized, except for appDir
115+
const localizedDataRoute = dataRoute
116+
? localizeRoute(dataRoute, locale, defaultLocale)
117+
: routeToDataRoute(route, buildId, locale)
112118

113119
routes.push(
114-
// Default locale is served from root, not localized
115120
...generateNetlifyRoutes({
116-
route: locale === defaultLocale ? route : `/${locale}${route}`,
121+
route: localizeRoute(route, locale, defaultLocale),
117122
dataRoute: localizedDataRoute,
118123
withData,
119124
}).map((redirect) => ({

test/__snapshots__/index.spec.js.snap

+190-6
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,46 @@ exports.resolvePages = () => {
326326

327327
exports[`onBuild() generates static files manifest 1`] = `
328328
Array [
329+
Array [
330+
"app/blog/erica/first-post.html",
331+
"blog/erica/first-post.html",
332+
],
333+
Array [
334+
"app/blog/erica/first-post.rsc",
335+
"blog/erica/first-post.rsc",
336+
],
337+
Array [
338+
"app/blog/nick/first-post.html",
339+
"blog/nick/first-post.html",
340+
],
341+
Array [
342+
"app/blog/nick/first-post.rsc",
343+
"blog/nick/first-post.rsc",
344+
],
345+
Array [
346+
"app/blog/nick/second-post.html",
347+
"blog/nick/second-post.html",
348+
],
349+
Array [
350+
"app/blog/nick/second-post.rsc",
351+
"blog/nick/second-post.rsc",
352+
],
353+
Array [
354+
"app/blog/rob/second-post.html",
355+
"blog/rob/second-post.html",
356+
],
357+
Array [
358+
"app/blog/rob/second-post.rsc",
359+
"blog/rob/second-post.rsc",
360+
],
361+
Array [
362+
"app/blog/sarah/second-post.html",
363+
"blog/sarah/second-post.html",
364+
],
365+
Array [
366+
"app/blog/sarah/second-post.rsc",
367+
"blog/sarah/second-post.rsc",
368+
],
329369
Array [
330370
"pages/en/broken-image.html",
331371
"en/broken-image.html",
@@ -1299,13 +1339,109 @@ Array [
12991339
"force": false,
13001340
"from": "/blog/:author",
13011341
"status": 200,
1302-
"to": "/.netlify/functions/___netlify-handler",
1342+
"to": "/.netlify/builders/___netlify-odb-handler",
1343+
},
1344+
Object {
1345+
"force": false,
1346+
"from": "/blog/:author.rsc",
1347+
"status": 200,
1348+
"to": "/.netlify/builders/___netlify-odb-handler",
13031349
},
13041350
Object {
13051351
"force": false,
13061352
"from": "/blog/:author/:slug",
13071353
"status": 200,
1308-
"to": "/.netlify/functions/___netlify-handler",
1354+
"to": "/.netlify/builders/___netlify-odb-handler",
1355+
},
1356+
Object {
1357+
"force": false,
1358+
"from": "/blog/:author/:slug.rsc",
1359+
"status": 200,
1360+
"to": "/.netlify/builders/___netlify-odb-handler",
1361+
},
1362+
Object {
1363+
"force": false,
1364+
"from": "/blog/:author/:slug/index.rsc",
1365+
"status": 200,
1366+
"to": "/.netlify/builders/___netlify-odb-handler",
1367+
},
1368+
Object {
1369+
"force": false,
1370+
"from": "/blog/:author/index.rsc",
1371+
"status": 200,
1372+
"to": "/.netlify/builders/___netlify-odb-handler",
1373+
},
1374+
Object {
1375+
"force": true,
1376+
"from": "/blog/erica",
1377+
"status": 200,
1378+
"to": "/.netlify/builders/___netlify-odb-handler",
1379+
},
1380+
Object {
1381+
"force": true,
1382+
"from": "/blog/erica.rsc",
1383+
"status": 200,
1384+
"to": "/.netlify/builders/___netlify-odb-handler",
1385+
},
1386+
Object {
1387+
"force": true,
1388+
"from": "/blog/erica/index.rsc",
1389+
"status": 200,
1390+
"to": "/.netlify/builders/___netlify-odb-handler",
1391+
},
1392+
Object {
1393+
"force": true,
1394+
"from": "/blog/nick",
1395+
"status": 200,
1396+
"to": "/.netlify/builders/___netlify-odb-handler",
1397+
},
1398+
Object {
1399+
"force": true,
1400+
"from": "/blog/nick.rsc",
1401+
"status": 200,
1402+
"to": "/.netlify/builders/___netlify-odb-handler",
1403+
},
1404+
Object {
1405+
"force": true,
1406+
"from": "/blog/nick/index.rsc",
1407+
"status": 200,
1408+
"to": "/.netlify/builders/___netlify-odb-handler",
1409+
},
1410+
Object {
1411+
"force": true,
1412+
"from": "/blog/rob",
1413+
"status": 200,
1414+
"to": "/.netlify/builders/___netlify-odb-handler",
1415+
},
1416+
Object {
1417+
"force": true,
1418+
"from": "/blog/rob.rsc",
1419+
"status": 200,
1420+
"to": "/.netlify/builders/___netlify-odb-handler",
1421+
},
1422+
Object {
1423+
"force": true,
1424+
"from": "/blog/rob/index.rsc",
1425+
"status": 200,
1426+
"to": "/.netlify/builders/___netlify-odb-handler",
1427+
},
1428+
Object {
1429+
"force": true,
1430+
"from": "/blog/sarah",
1431+
"status": 200,
1432+
"to": "/.netlify/builders/___netlify-odb-handler",
1433+
},
1434+
Object {
1435+
"force": true,
1436+
"from": "/blog/sarah.rsc",
1437+
"status": 200,
1438+
"to": "/.netlify/builders/___netlify-odb-handler",
1439+
},
1440+
Object {
1441+
"force": true,
1442+
"from": "/blog/sarah/index.rsc",
1443+
"status": 200,
1444+
"to": "/.netlify/builders/___netlify-odb-handler",
13091445
},
13101446
Object {
13111447
"force": false,
@@ -1365,13 +1501,37 @@ Array [
13651501
"force": false,
13661502
"from": "/es/blog/:author",
13671503
"status": 200,
1368-
"to": "/.netlify/functions/___netlify-handler",
1504+
"to": "/.netlify/builders/___netlify-odb-handler",
1505+
},
1506+
Object {
1507+
"force": false,
1508+
"from": "/es/blog/:author.rsc",
1509+
"status": 200,
1510+
"to": "/.netlify/builders/___netlify-odb-handler",
13691511
},
13701512
Object {
13711513
"force": false,
13721514
"from": "/es/blog/:author/:slug",
13731515
"status": 200,
1374-
"to": "/.netlify/functions/___netlify-handler",
1516+
"to": "/.netlify/builders/___netlify-odb-handler",
1517+
},
1518+
Object {
1519+
"force": false,
1520+
"from": "/es/blog/:author/:slug.rsc",
1521+
"status": 200,
1522+
"to": "/.netlify/builders/___netlify-odb-handler",
1523+
},
1524+
Object {
1525+
"force": false,
1526+
"from": "/es/blog/:author/:slug/index.rsc",
1527+
"status": 200,
1528+
"to": "/.netlify/builders/___netlify-odb-handler",
1529+
},
1530+
Object {
1531+
"force": false,
1532+
"from": "/es/blog/:author/index.rsc",
1533+
"status": 200,
1534+
"to": "/.netlify/builders/___netlify-odb-handler",
13751535
},
13761536
Object {
13771537
"force": false,
@@ -1581,13 +1741,37 @@ Array [
15811741
"force": false,
15821742
"from": "/fr/blog/:author",
15831743
"status": 200,
1584-
"to": "/.netlify/functions/___netlify-handler",
1744+
"to": "/.netlify/builders/___netlify-odb-handler",
1745+
},
1746+
Object {
1747+
"force": false,
1748+
"from": "/fr/blog/:author.rsc",
1749+
"status": 200,
1750+
"to": "/.netlify/builders/___netlify-odb-handler",
15851751
},
15861752
Object {
15871753
"force": false,
15881754
"from": "/fr/blog/:author/:slug",
15891755
"status": 200,
1590-
"to": "/.netlify/functions/___netlify-handler",
1756+
"to": "/.netlify/builders/___netlify-odb-handler",
1757+
},
1758+
Object {
1759+
"force": false,
1760+
"from": "/fr/blog/:author/:slug.rsc",
1761+
"status": 200,
1762+
"to": "/.netlify/builders/___netlify-odb-handler",
1763+
},
1764+
Object {
1765+
"force": false,
1766+
"from": "/fr/blog/:author/:slug/index.rsc",
1767+
"status": 200,
1768+
"to": "/.netlify/builders/___netlify-odb-handler",
1769+
},
1770+
Object {
1771+
"force": false,
1772+
"from": "/fr/blog/:author/index.rsc",
1773+
"status": 200,
1774+
"to": "/.netlify/builders/___netlify-odb-handler",
15911775
},
15921776
Object {
15931777
"force": false,

0 commit comments

Comments
 (0)