@@ -117,6 +117,7 @@ import {
117
117
extractSlotsFromAppRoutes ,
118
118
type RouteInfo ,
119
119
type SlotInfo ,
120
+ collectPagesFiles ,
120
121
} from './entries'
121
122
import { PAGE_TYPES } from '../lib/page-types'
122
123
import { generateBuildId } from './generate-build-id'
@@ -145,7 +146,6 @@ import isError from '../lib/is-error'
145
146
import type { NextError } from '../lib/is-error'
146
147
import { isEdgeRuntime } from '../lib/is-edge-runtime'
147
148
import { recursiveCopy } from '../lib/recursive-copy'
148
- import { recursiveReadDir } from '../lib/recursive-readdir'
149
149
import { lockfilePatchPromise , teardownTraceSubscriber } from './swc'
150
150
import { getNamedRouteRegex } from '../shared/lib/router/utils/route-regex'
151
151
import { getFilesInDir } from '../lib/get-files-in-dir'
@@ -218,9 +218,11 @@ import {
218
218
sortPages ,
219
219
sortSortableRouteObjects ,
220
220
} from '../shared/lib/router/utils/sortable-routes'
221
+ import { mkdir } from 'fs/promises'
221
222
import {
222
223
createRouteTypesManifest ,
223
224
writeRouteTypesManifest ,
225
+ writeValidatorFile ,
224
226
} from '../server/lib/router-utils/route-types-utils'
225
227
226
228
type Fallback = null | boolean | string
@@ -1153,11 +1155,9 @@ export default async function build(
1153
1155
let pagesPaths = Boolean ( process . env . NEXT_PRIVATE_PAGE_PATHS )
1154
1156
? providedPagePaths
1155
1157
: ! appDirOnly && pagesDir
1156
- ? await nextBuildSpan . traceChild ( 'collect-pages' ) . traceAsyncFn ( ( ) =>
1157
- recursiveReadDir ( pagesDir , {
1158
- pathnameFilter : validFileMatcher . isPageFile ,
1159
- } )
1160
- )
1158
+ ? await nextBuildSpan
1159
+ . traceChild ( 'collect-pages' )
1160
+ . traceAsyncFn ( ( ) => collectPagesFiles ( pagesDir , validFileMatcher ) )
1161
1161
: [ ]
1162
1162
1163
1163
const middlewareDetectionRegExp = new RegExp (
@@ -1223,13 +1223,14 @@ export default async function build(
1223
1223
let layoutPaths : string [ ]
1224
1224
1225
1225
if ( Boolean ( process . env . NEXT_PRIVATE_APP_PATHS ) ) {
1226
+ // used for testing?
1226
1227
appPaths = providedAppPaths
1227
1228
layoutPaths = [ ]
1228
1229
} else {
1229
1230
// Collect both app pages and layouts in a single directory traversal
1230
1231
const result = await nextBuildSpan
1231
1232
. traceChild ( 'collect-app-files' )
1232
- . traceAsyncFn ( ( ) => collectAppFiles ( appDir , config . pageExtensions ) )
1233
+ . traceAsyncFn ( ( ) => collectAppFiles ( appDir , validFileMatcher ) )
1233
1234
1234
1235
appPaths = result . appPaths
1235
1236
layoutPaths = result . layoutPaths
@@ -1313,25 +1314,25 @@ export default async function build(
1313
1314
. traceChild ( 'generate-route-types' )
1314
1315
. traceAsyncFn ( async ( ) => {
1315
1316
const routeTypesFilePath = path . join ( distDir , 'types' , 'routes.d.ts' )
1316
- await fs . mkdir ( path . dirname ( routeTypesFilePath ) , { recursive : true } )
1317
+ const validatorFilePath = path . join ( distDir , 'types' , 'validator.ts' )
1318
+ await mkdir ( path . dirname ( routeTypesFilePath ) , { recursive : true } )
1317
1319
1318
- let pageRoutes : RouteInfo [ ] = [ ]
1319
1320
let appRoutes : RouteInfo [ ] = [ ]
1321
+ let appRouteHandlers : RouteInfo [ ] = [ ]
1320
1322
let layoutRoutes : RouteInfo [ ] = [ ]
1321
1323
let slots : SlotInfo [ ] = [ ]
1322
1324
1323
- // Build pages routes
1324
- const processedPages = processPageRoutes ( mappedPages , dir )
1325
- // We combine both page routes and API routes
1326
- pageRoutes = [
1327
- ...processedPages . pageRoutes ,
1328
- ...processedPages . pageApiRoutes ,
1329
- ]
1325
+ const { pageRoutes, pageApiRoutes } = processPageRoutes (
1326
+ mappedPages ,
1327
+ dir
1328
+ )
1330
1329
1331
1330
// Build app routes
1332
1331
if ( appDir && mappedAppPages ) {
1333
1332
slots = extractSlotsFromAppRoutes ( mappedAppPages )
1334
- appRoutes = processAppRoutes ( mappedAppPages , dir )
1333
+ const result = processAppRoutes ( mappedAppPages , validFileMatcher )
1334
+ appRoutes = result . appRoutes
1335
+ appRouteHandlers = result . appRouteHandlers
1335
1336
}
1336
1337
1337
1338
// Build app layouts
@@ -1343,13 +1344,16 @@ export default async function build(
1343
1344
dir,
1344
1345
pageRoutes,
1345
1346
appRoutes,
1347
+ appRouteHandlers,
1348
+ pageApiRoutes,
1346
1349
layoutRoutes,
1347
1350
slots,
1348
1351
redirects : config . redirects ,
1349
1352
rewrites : config . rewrites ,
1350
1353
} )
1351
1354
1352
1355
await writeRouteTypesManifest ( routeTypesManifest , routeTypesFilePath )
1356
+ await writeValidatorFile ( routeTypesManifest , validatorFilePath )
1353
1357
} )
1354
1358
1355
1359
// Turbopack already handles conflicting app and page routes.
0 commit comments