Skip to content

Commit 8823a86

Browse files
committed
chore: correct redirects
1 parent 45c6526 commit 8823a86

File tree

5 files changed

+127
-33
lines changed

5 files changed

+127
-33
lines changed

packages/runtime/src/helpers/edge.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { outdent } from 'outdent'
1212

1313
import { getRequiredServerFiles, NextConfig } from './config'
1414
import { makeLocaleOptional, stripLookahead } from './matchers'
15-
import { RoutesManifest } from './types'
15+
import { DynamicRoute, RoutesManifest } from './types'
1616

1717
// This is the format as of [email protected]
1818
interface EdgeFunctionDefinitionV1 {
@@ -71,9 +71,12 @@ const maybeLoadJson = <T>(path: string): Promise<T> | null => {
7171
}
7272
}
7373

74-
export const isAppDirRoute = ({ srcRoute }: SsgRoute, manifest: Record<string, string> | null): boolean =>
74+
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)
79+
7780
export const loadMiddlewareManifest = (netlifyConfig: NetlifyConfig): Promise<MiddlewareManifest | null> =>
7881
maybeLoadJson(resolve(netlifyConfig.build.publish, 'server', 'middleware-manifest.json'))
7982

packages/runtime/src/helpers/files.ts

+7-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import slash from 'slash'
1313
import { MINIMUM_REVALIDATE_SECONDS, DIVIDER } from '../constants'
1414

1515
import { NextConfig } from './config'
16-
import { isAppDirRoute, loadAppPathRoutesManifest } from './edge'
16+
import { isStaticAppDirRoute, loadAppPathRoutesManifest } from './edge'
1717
import { Rewrites, RoutesManifest } from './types'
1818
import { findModuleFromBase } from './utils'
1919

@@ -108,12 +108,15 @@ export const moveStaticPages = async ({
108108

109109
Object.entries(prerenderManifest.routes).forEach(([route, ssgRoute]) => {
110110
const { initialRevalidateSeconds } = ssgRoute
111-
if (initialRevalidateSeconds) {
111+
const trimmedPath = route === '/' ? 'index' : route.slice(1)
112+
113+
if (isStaticAppDirRoute(ssgRoute, appPathRoutes)) {
114+
isrFiles.add(`${trimmedPath}.html`)
115+
} else if (initialRevalidateSeconds) {
112116
// Find all files used by ISR routes
113-
const trimmedPath = route === '/' ? 'index' : route.slice(1)
114117
isrFiles.add(`${trimmedPath}.html`)
115118
isrFiles.add(`${trimmedPath}.json`)
116-
if (initialRevalidateSeconds < MINIMUM_REVALIDATE_SECONDS && !isAppDirRoute(ssgRoute, appPathRoutes)) {
119+
if (initialRevalidateSeconds < MINIMUM_REVALIDATE_SECONDS) {
117120
shortRevalidateRoutes.push({ Route: route, Revalidate: initialRevalidateSeconds })
118121
}
119122
}

packages/runtime/src/helpers/redirects.ts

+17-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { join } from 'pathe'
88

99
import { HANDLER_FUNCTION_PATH, HIDDEN_PATHS, ODB_FUNCTION_PATH } from '../constants'
1010

11-
import { isAppDirRoute, loadAppPathRoutesManifest } from './edge'
11+
import { isDynamicAppDirRoute, isStaticAppDirRoute, loadAppPathRoutesManifest } from './edge'
1212
import { getMiddleware } from './files'
1313
import { ApiRouteConfig } from './functions'
1414
import { RoutesManifest } from './types'
@@ -189,6 +189,7 @@ const generateDynamicRewrites = ({
189189
buildId,
190190
i18n,
191191
is404Isr,
192+
appPathRoutes,
192193
}: {
193194
dynamicRoutes: RoutesManifest['dynamicRoutes']
194195
prerenderedDynamicRoutes: PrerenderManifest['dynamicRoutes']
@@ -197,19 +198,32 @@ const generateDynamicRewrites = ({
197198
buildId: string
198199
middleware: Array<string>
199200
is404Isr: boolean
201+
appPathRoutes?: Record<string, string>
200202
}): {
201203
dynamicRoutesThatMatchMiddleware: Array<string>
202204
dynamicRewrites: NetlifyConfig['redirects']
203205
} => {
204206
const dynamicRewrites: NetlifyConfig['redirects'] = []
205207
const dynamicRoutesThatMatchMiddleware: Array<string> = []
208+
206209
dynamicRoutes.forEach((route) => {
207210
if (isApiRoute(route.page) || is404Route(route.page, i18n)) {
208211
return
209212
}
210213
if (route.page in prerenderedDynamicRoutes) {
211214
if (matchesMiddleware(middleware, route.page)) {
212215
dynamicRoutesThatMatchMiddleware.push(route.page)
216+
} else if (isDynamicAppDirRoute(route, appPathRoutes)) {
217+
dynamicRewrites.push(
218+
...redirectsForNextRoute({
219+
route: route.page,
220+
buildId,
221+
basePath,
222+
to: HANDLER_FUNCTION_PATH,
223+
i18n,
224+
withData: false,
225+
}),
226+
)
213227
} else if (prerenderedDynamicRoutes[route.page].fallback === false && !is404Isr) {
214228
dynamicRewrites.push(...redirectsForNext404Route({ route: route.page, buildId, basePath, i18n }))
215229
} else {
@@ -270,7 +284,7 @@ export const generateRedirects = async ({
270284

271285
// appDir routes don't use ISR
272286
const staticRouteEntries = Object.entries(prerenderedStaticRoutes).filter(
273-
([, route]) => !isAppDirRoute(route, appPathRoutes),
287+
([, route]) => !isStaticAppDirRoute(route, appPathRoutes),
274288
)
275289

276290
const is404Isr = staticRouteEntries.some(
@@ -310,6 +324,7 @@ export const generateRedirects = async ({
310324
buildId,
311325
i18n,
312326
is404Isr,
327+
appPathRoutes,
313328
})
314329
netlifyConfig.redirects.push(...dynamicRewrites)
315330
routesThatMatchMiddleware.push(...dynamicRoutesThatMatchMiddleware)

packages/runtime/src/helpers/utils.ts

+20-13
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,15 @@ export const toNetlifyRoute = (nextRoute: string): Array<string> => {
6363
)
6464
}
6565

66-
export const netlifyRoutesForNextRouteWithData = ({ route, dataRoute }: { route: string; dataRoute: string }) => [
67-
...toNetlifyRoute(dataRoute),
68-
...toNetlifyRoute(route),
69-
]
66+
export const generateNetlifyRoutes = ({
67+
route,
68+
dataRoute,
69+
withData = true,
70+
}: {
71+
route: string
72+
dataRoute: string
73+
withData: boolean
74+
}) => [...(withData ? toNetlifyRoute(dataRoute) : []), ...toNetlifyRoute(route)]
7075

7176
export const routeToDataRoute = (route: string, buildId: string, locale?: string) =>
7277
`/_next/data/${buildId}${locale ? `/${locale}` : ''}${route === '/' ? '/index' : route}.json`
@@ -75,14 +80,13 @@ const netlifyRoutesForNextRoute = (
7580
route: string,
7681
buildId: string,
7782
i18n?: I18n,
83+
withData = true,
7884
): Array<{ redirect: string; locale: string | false }> => {
7985
if (!i18n?.locales?.length) {
80-
return netlifyRoutesForNextRouteWithData({ route, dataRoute: routeToDataRoute(route, buildId) }).map(
81-
(redirect) => ({
82-
redirect,
83-
locale: false,
84-
}),
85-
)
86+
return generateNetlifyRoutes({ route, dataRoute: routeToDataRoute(route, buildId), withData }).map((redirect) => ({
87+
redirect,
88+
locale: false,
89+
}))
8690
}
8791
const { locales, defaultLocale } = i18n
8892
const routes = []
@@ -92,9 +96,10 @@ const netlifyRoutesForNextRoute = (
9296

9397
routes.push(
9498
// Default locale is served from root, not localized
95-
...netlifyRoutesForNextRouteWithData({
99+
...generateNetlifyRoutes({
96100
route: locale === defaultLocale ? route : `/${locale}${route}`,
97101
dataRoute,
102+
withData,
98103
}).map((redirect) => ({
99104
redirect,
100105
locale,
@@ -117,6 +122,7 @@ export const redirectsForNextRoute = ({
117122
i18n,
118123
status = 200,
119124
force = false,
125+
withData = true,
120126
}: {
121127
route: string
122128
buildId: string
@@ -125,8 +131,9 @@ export const redirectsForNextRoute = ({
125131
i18n: I18n
126132
status?: number
127133
force?: boolean
134+
withData?: boolean
128135
}): NetlifyConfig['redirects'] =>
129-
netlifyRoutesForNextRoute(route, buildId, i18n).map(({ redirect }) => ({
136+
netlifyRoutesForNextRoute(route, buildId, i18n, withData).map(({ redirect }) => ({
130137
from: `${basePath}${redirect}`,
131138
to,
132139
status,
@@ -168,7 +175,7 @@ export const redirectsForNextRouteWithData = ({
168175
status?: number
169176
force?: boolean
170177
}): NetlifyConfig['redirects'] =>
171-
netlifyRoutesForNextRouteWithData({ route, dataRoute }).map((redirect) => ({
178+
generateNetlifyRoutes({ route, dataRoute, withData: true }).map((redirect) => ({
172179
from: `${basePath}${redirect}`,
173180
to,
174181
status,

test/__snapshots__/index.spec.js.snap

+78-12
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@
33
exports[`function helpers config dependency tracing extracts a list of all dependencies 1`] = `
44
Array [
55
".next/package.json",
6+
".next/server/app/blog/[author]/[slug]/page.js",
7+
".next/server/app/blog/[author]/page.js",
8+
".next/server/chunks/1090.js",
69
".next/server/chunks/274.js",
7-
".next/server/chunks/4271.js",
10+
".next/server/chunks/3374.js",
11+
".next/server/chunks/4428.js",
812
".next/server/chunks/5237.js",
9-
".next/server/chunks/7016.js",
13+
".next/server/chunks/6316.js",
1014
".next/server/chunks/7590.js",
15+
".next/server/chunks/8685.js",
16+
".next/server/chunks/8864.js",
1117
".next/server/chunks/9097.js",
1218
".next/server/chunks/header.js",
1319
".next/server/pages/_app.js",
@@ -55,8 +61,8 @@ exports.resolvePages = () => {
5561
try {
5662
require.resolve('../../../.next/package.json')
5763
require.resolve('../../../.next/server/chunks/274.js')
58-
require.resolve('../../../.next/server/chunks/7016.js')
5964
require.resolve('../../../.next/server/chunks/7590.js')
65+
require.resolve('../../../.next/server/chunks/8685.js')
6066
require.resolve('../../../.next/server/pages/_app.js')
6167
require.resolve('../../../.next/server/pages/_document.js')
6268
require.resolve('../../../.next/server/pages/_error.js')
@@ -73,8 +79,8 @@ exports.resolvePages = () => {
7379
try {
7480
require.resolve('../../../.next/package.json')
7581
require.resolve('../../../.next/server/chunks/274.js')
76-
require.resolve('../../../.next/server/chunks/7016.js')
7782
require.resolve('../../../.next/server/chunks/7590.js')
83+
require.resolve('../../../.next/server/chunks/8685.js')
7884
require.resolve('../../../.next/server/pages/_app.js')
7985
require.resolve('../../../.next/server/pages/_document.js')
8086
require.resolve('../../../.next/server/pages/_error.js')
@@ -91,11 +97,17 @@ exports[`onBuild() generates a file referencing all page sources 1`] = `
9197
exports.resolvePages = () => {
9298
try {
9399
require.resolve('../../../.next/package.json')
100+
require.resolve('../../../.next/server/app/blog/[author]/[slug]/page.js')
101+
require.resolve('../../../.next/server/app/blog/[author]/page.js')
102+
require.resolve('../../../.next/server/chunks/1090.js')
94103
require.resolve('../../../.next/server/chunks/274.js')
95-
require.resolve('../../../.next/server/chunks/4271.js')
104+
require.resolve('../../../.next/server/chunks/3374.js')
105+
require.resolve('../../../.next/server/chunks/4428.js')
96106
require.resolve('../../../.next/server/chunks/5237.js')
97-
require.resolve('../../../.next/server/chunks/7016.js')
107+
require.resolve('../../../.next/server/chunks/6316.js')
98108
require.resolve('../../../.next/server/chunks/7590.js')
109+
require.resolve('../../../.next/server/chunks/8685.js')
110+
require.resolve('../../../.next/server/chunks/8864.js')
99111
require.resolve('../../../.next/server/chunks/9097.js')
100112
require.resolve('../../../.next/server/chunks/header.js')
101113
require.resolve('../../../.next/server/pages/_app.js')
@@ -143,11 +155,17 @@ exports[`onBuild() generates a file referencing all page sources 2`] = `
143155
exports.resolvePages = () => {
144156
try {
145157
require.resolve('../../../.next/package.json')
158+
require.resolve('../../../.next/server/app/blog/[author]/[slug]/page.js')
159+
require.resolve('../../../.next/server/app/blog/[author]/page.js')
160+
require.resolve('../../../.next/server/chunks/1090.js')
146161
require.resolve('../../../.next/server/chunks/274.js')
147-
require.resolve('../../../.next/server/chunks/4271.js')
162+
require.resolve('../../../.next/server/chunks/3374.js')
163+
require.resolve('../../../.next/server/chunks/4428.js')
148164
require.resolve('../../../.next/server/chunks/5237.js')
149-
require.resolve('../../../.next/server/chunks/7016.js')
165+
require.resolve('../../../.next/server/chunks/6316.js')
150166
require.resolve('../../../.next/server/chunks/7590.js')
167+
require.resolve('../../../.next/server/chunks/8685.js')
168+
require.resolve('../../../.next/server/chunks/8864.js')
151169
require.resolve('../../../.next/server/chunks/9097.js')
152170
require.resolve('../../../.next/server/chunks/header.js')
153171
require.resolve('../../../.next/server/pages/_app.js')
@@ -195,11 +213,17 @@ exports[`onBuild() generates a file referencing all when publish dir is a subdir
195213
exports.resolvePages = () => {
196214
try {
197215
require.resolve('../../../web/.next/package.json')
216+
require.resolve('../../../web/.next/server/app/blog/[author]/[slug]/page.js')
217+
require.resolve('../../../web/.next/server/app/blog/[author]/page.js')
218+
require.resolve('../../../web/.next/server/chunks/1090.js')
198219
require.resolve('../../../web/.next/server/chunks/274.js')
199-
require.resolve('../../../web/.next/server/chunks/4271.js')
220+
require.resolve('../../../web/.next/server/chunks/3374.js')
221+
require.resolve('../../../web/.next/server/chunks/4428.js')
200222
require.resolve('../../../web/.next/server/chunks/5237.js')
201-
require.resolve('../../../web/.next/server/chunks/7016.js')
223+
require.resolve('../../../web/.next/server/chunks/6316.js')
202224
require.resolve('../../../web/.next/server/chunks/7590.js')
225+
require.resolve('../../../web/.next/server/chunks/8685.js')
226+
require.resolve('../../../web/.next/server/chunks/8864.js')
203227
require.resolve('../../../web/.next/server/chunks/9097.js')
204228
require.resolve('../../../web/.next/server/chunks/header.js')
205229
require.resolve('../../../web/.next/server/pages/_app.js')
@@ -247,11 +271,17 @@ exports[`onBuild() generates a file referencing all when publish dir is a subdir
247271
exports.resolvePages = () => {
248272
try {
249273
require.resolve('../../../web/.next/package.json')
274+
require.resolve('../../../web/.next/server/app/blog/[author]/[slug]/page.js')
275+
require.resolve('../../../web/.next/server/app/blog/[author]/page.js')
276+
require.resolve('../../../web/.next/server/chunks/1090.js')
250277
require.resolve('../../../web/.next/server/chunks/274.js')
251-
require.resolve('../../../web/.next/server/chunks/4271.js')
278+
require.resolve('../../../web/.next/server/chunks/3374.js')
279+
require.resolve('../../../web/.next/server/chunks/4428.js')
252280
require.resolve('../../../web/.next/server/chunks/5237.js')
253-
require.resolve('../../../web/.next/server/chunks/7016.js')
281+
require.resolve('../../../web/.next/server/chunks/6316.js')
254282
require.resolve('../../../web/.next/server/chunks/7590.js')
283+
require.resolve('../../../web/.next/server/chunks/8685.js')
284+
require.resolve('../../../web/.next/server/chunks/8864.js')
255285
require.resolve('../../../web/.next/server/chunks/9097.js')
256286
require.resolve('../../../web/.next/server/chunks/header.js')
257287
require.resolve('../../../web/.next/server/pages/_app.js')
@@ -1265,6 +1295,18 @@ Array [
12651295
"status": 404,
12661296
"to": "/404.html",
12671297
},
1298+
Object {
1299+
"force": false,
1300+
"from": "/blog/:author",
1301+
"status": 200,
1302+
"to": "/.netlify/functions/___netlify-handler",
1303+
},
1304+
Object {
1305+
"force": false,
1306+
"from": "/blog/:author/:slug",
1307+
"status": 200,
1308+
"to": "/.netlify/functions/___netlify-handler",
1309+
},
12681310
Object {
12691311
"force": false,
12701312
"from": "/broken-image",
@@ -1319,6 +1361,18 @@ Array [
13191361
"status": 200,
13201362
"to": "/.netlify/functions/___netlify-handler",
13211363
},
1364+
Object {
1365+
"force": false,
1366+
"from": "/es/blog/:author",
1367+
"status": 200,
1368+
"to": "/.netlify/functions/___netlify-handler",
1369+
},
1370+
Object {
1371+
"force": false,
1372+
"from": "/es/blog/:author/:slug",
1373+
"status": 200,
1374+
"to": "/.netlify/functions/___netlify-handler",
1375+
},
13221376
Object {
13231377
"force": false,
13241378
"from": "/es/broken-image",
@@ -1523,6 +1577,18 @@ Array [
15231577
"status": 200,
15241578
"to": "/.netlify/functions/___netlify-handler",
15251579
},
1580+
Object {
1581+
"force": false,
1582+
"from": "/fr/blog/:author",
1583+
"status": 200,
1584+
"to": "/.netlify/functions/___netlify-handler",
1585+
},
1586+
Object {
1587+
"force": false,
1588+
"from": "/fr/blog/:author/:slug",
1589+
"status": 200,
1590+
"to": "/.netlify/functions/___netlify-handler",
1591+
},
15261592
Object {
15271593
"force": false,
15281594
"from": "/fr/broken-image",

0 commit comments

Comments
 (0)