@@ -38,6 +38,7 @@ import {
38
38
EnvConfig ,
39
39
excludeFiles ,
40
40
ExperimentalTraceVersion ,
41
+ NextServerTargetVersion ,
41
42
getDynamicRoutes ,
42
43
getExportIntent ,
43
44
getExportStatus ,
@@ -89,7 +90,7 @@ export const version = 2;
89
90
const htmlContentType = 'text/html; charset=utf-8' ;
90
91
const nowDevChildProcesses = new Set < ChildProcess > ( ) ;
91
92
92
- [ 'SIGINT' , 'SIGTERM' ] . forEach ( signal => {
93
+ [ 'SIGINT' , 'SIGTERM' ] . forEach ( ( signal ) => {
93
94
process . once ( signal as NodeJS . Signals , ( ) => {
94
95
for ( const child of nowDevChildProcesses ) {
95
96
debug (
@@ -193,6 +194,17 @@ function isLegacyNext(nextVersion: string) {
193
194
return true ;
194
195
}
195
196
197
+ /**
198
+ * Check if the target: `server` can be used to build the app
199
+ */
200
+ function isServerTargetNext ( nextVersion : string ) : boolean {
201
+ if ( nextVersion === 'canary' || nextVersion === 'latest' ) {
202
+ return true ;
203
+ }
204
+
205
+ return semver . gte ( NextServerTargetVersion , nextVersion ) ;
206
+ }
207
+
196
208
const name = '[@vercel/next]' ;
197
209
const urls : stringMap = { } ;
198
210
@@ -256,12 +268,6 @@ export async function build({
256
268
...spawnOpts . env ,
257
269
NOW_BUILDER : '1' ,
258
270
VERCEL : '1' ,
259
- // Next.js changed the default output folder beginning with
260
- // 10.0.8-canary.15 from `.next/serverless` to `.next/server`.
261
- // This is an opt-out of this behavior until we support it.
262
- // https://github.com/dealmore/terraform-aws-next-js/issues/86
263
- // https://github.com/vercel/next.js/pull/22731
264
- NEXT_PRIVATE_TARGET : 'experimental-serverless-trace' ,
265
271
// We override init CWD here with the entrypoint to ensure that applications
266
272
// can get the CWD from the download directory root
267
273
INIT_CWD : entryPath ,
@@ -345,8 +351,15 @@ export async function build({
345
351
console . warn ( 'WARNING: You should not upload the `.next` directory.' ) ;
346
352
}
347
353
348
- const isLegacy = nextVersionRange && isLegacyNext ( nextVersionRange ) ;
349
- debug ( `MODE: ${ isLegacy ? 'legacy' : 'serverless' } ` ) ;
354
+ const isServerTarget =
355
+ nextVersionRange && isServerTargetNext ( nextVersionRange ) ;
356
+ const isLegacy =
357
+ ! isServerTarget && nextVersionRange && isLegacyNext ( nextVersionRange ) ;
358
+ debug (
359
+ `MODE: ${
360
+ isServerTarget ? 'server(less)' : isLegacy ? 'legacy' : 'serverless'
361
+ } `
362
+ ) ;
350
363
351
364
if ( isLegacy ) {
352
365
console . warn (
@@ -430,7 +443,11 @@ export async function build({
430
443
} ) ;
431
444
}
432
445
433
- if ( ! isLegacy ) {
446
+ if ( isServerTarget ) {
447
+ debug (
448
+ `Application is being built in server mode since 10.0.9 meets minimum version of v${ NextServerTargetVersion } `
449
+ ) ;
450
+ } else if ( ! isLegacy ) {
434
451
await createServerlessConfig ( workPath , entryPath , nextVersion ) ;
435
452
}
436
453
@@ -571,7 +588,7 @@ export async function build({
571
588
`${ ( ssgDataRoute && ssgDataRoute . dataRoute ) || dataRoute . page } ${
572
589
dataRoute . routeKeys
573
590
? `?${ Object . keys ( dataRoute . routeKeys )
574
- . map ( key => `${ dataRoute . routeKeys ! [ key ] } =$${ key } ` )
591
+ . map ( ( key ) => `${ dataRoute . routeKeys ! [ key ] } =$${ key } ` )
575
592
. join ( '&' ) } `
576
593
: ''
577
594
} `
@@ -590,7 +607,7 @@ export async function build({
590
607
`/${ escapedBuildId } /(?${
591
608
ssgDataRoute ? '<nextLocale>' : ':'
592
609
} ${ i18n . locales
593
- . map ( locale => escapeStringRegexp ( locale ) )
610
+ . map ( ( locale ) => escapeStringRegexp ( locale ) )
594
611
. join ( '|' ) } )/`
595
612
) ;
596
613
@@ -604,7 +621,7 @@ export async function build({
604
621
`/${ escapedBuildId } /(?${
605
622
ssgDataRoute ? '<nextLocale>' : ':'
606
623
} ${ i18n . locales
607
- . map ( locale => escapeStringRegexp ( locale ) )
624
+ . map ( ( locale ) => escapeStringRegexp ( locale ) )
608
625
. join ( '|' ) } )[/]?`
609
626
) ;
610
627
}
@@ -847,7 +864,7 @@ export async function build({
847
864
) ;
848
865
const nodeModules = excludeFiles (
849
866
await glob ( 'node_modules/**' , entryPath ) ,
850
- file => file . startsWith ( 'node_modules/.cache' )
867
+ ( file ) => file . startsWith ( 'node_modules/.cache' )
851
868
) ;
852
869
const launcherFiles = {
853
870
'now__bridge.js' : new FileFsRef ( {
@@ -876,7 +893,7 @@ export async function build({
876
893
const launcherData = await readFile ( launcherPath , 'utf8' ) ;
877
894
878
895
await Promise . all (
879
- Object . keys ( pages ) . map ( async page => {
896
+ Object . keys ( pages ) . map ( async ( page ) => {
880
897
// These default pages don't have to be handled as they'd always 404
881
898
if ( [ '_app.js' , '_error.js' , '_document.js' ] . includes ( page ) ) {
882
899
return ;
@@ -933,7 +950,7 @@ export async function build({
933
950
const pagesDir = path . join (
934
951
entryPath ,
935
952
outputDirectory ,
936
- 'serverless' ,
953
+ isServerTarget ? 'server' : 'serverless' ,
937
954
'pages'
938
955
) ;
939
956
@@ -1034,9 +1051,9 @@ export async function build({
1034
1051
} ;
1035
1052
1036
1053
const isApiPage = ( page : string ) =>
1037
- page . replace ( / \\ / g, '/' ) . match ( / s e r v e r l e s s \/ p a g e s \/ a p i ( \/ | \. j s $ ) / ) ;
1054
+ page . replace ( / \\ / g, '/' ) . match ( / s e r v e r ( l e s s ) ? \/ p a g e s \/ a p i ( \/ | \. j s $ ) / ) ;
1038
1055
1039
- const canUsePreviewMode = Object . keys ( pages ) . some ( page =>
1056
+ const canUsePreviewMode = Object . keys ( pages ) . some ( ( page ) =>
1040
1057
isApiPage ( pages [ page ] . fsPath )
1041
1058
) ;
1042
1059
@@ -1068,7 +1085,7 @@ export async function build({
1068
1085
}
1069
1086
} ;
1070
1087
1071
- Object . keys ( prerenderManifest . staticRoutes ) . forEach ( route =>
1088
+ Object . keys ( prerenderManifest . staticRoutes ) . forEach ( ( route ) =>
1072
1089
onPrerenderRouteInitial ( route )
1073
1090
) ;
1074
1091
@@ -1208,7 +1225,7 @@ export async function build({
1208
1225
debug (
1209
1226
'detected (legacy) assets to be bundled with serverless function:'
1210
1227
) ;
1211
- assetKeys . forEach ( assetFile => debug ( `\t${ assetFile } ` ) ) ;
1228
+ assetKeys . forEach ( ( assetFile ) => debug ( `\t${ assetFile } ` ) ) ;
1212
1229
debug (
1213
1230
'\nPlease upgrade to Next.js 9.1 to leverage modern asset handling.'
1214
1231
) ;
@@ -1334,7 +1351,7 @@ export async function build({
1334
1351
if ( i18n ) {
1335
1352
addPageLambdaRoute (
1336
1353
`[/]?(?:${ i18n . locales
1337
- . map ( locale => escapeStringRegexp ( locale ) )
1354
+ . map ( ( locale ) => escapeStringRegexp ( locale ) )
1338
1355
. join ( '|' ) } )?${ escapeStringRegexp ( outputName ) } `
1339
1356
) ;
1340
1357
} else {
@@ -1368,7 +1385,7 @@ export async function build({
1368
1385
}
1369
1386
} else {
1370
1387
await Promise . all (
1371
- pageKeys . map ( async page => {
1388
+ pageKeys . map ( async ( page ) => {
1372
1389
// These default pages don't have to be handled as they'd always 404
1373
1390
if ( [ '_app.js' , '_document.js' ] . includes ( page ) ) {
1374
1391
return ;
@@ -1465,8 +1482,8 @@ export async function build({
1465
1482
false ,
1466
1483
routesManifest ,
1467
1484
new Set ( prerenderManifest . omittedRoutes )
1468
- ) . then ( arr =>
1469
- arr . map ( route => {
1485
+ ) . then ( ( arr ) =>
1486
+ arr . map ( ( route ) => {
1470
1487
const { i18n } = routesManifest || { } ;
1471
1488
1472
1489
if ( i18n ) {
@@ -1486,7 +1503,7 @@ export async function build({
1486
1503
`^${ dynamicPrefix ? `${ dynamicPrefix } [/]?` : '[/]?' } (?${
1487
1504
isLocalePrefixed ? '<nextLocale>' : ':'
1488
1505
} ${ i18n . locales
1489
- . map ( locale => escapeStringRegexp ( locale ) )
1506
+ . map ( ( locale ) => escapeStringRegexp ( locale ) )
1490
1507
. join ( '|' ) } )?`
1491
1508
) ;
1492
1509
@@ -1517,8 +1534,8 @@ export async function build({
1517
1534
dynamicPages ,
1518
1535
false ,
1519
1536
routesManifest
1520
- ) . then ( arr =>
1521
- arr . map ( route => {
1537
+ ) . then ( ( arr ) =>
1538
+ arr . map ( ( route ) => {
1522
1539
route . src = route . src . replace ( '^' , `^${ dynamicPrefix } ` ) ;
1523
1540
return route ;
1524
1541
} )
@@ -1563,7 +1580,7 @@ export async function build({
1563
1580
const pages = {
1564
1581
${ groupPageKeys
1565
1582
. map (
1566
- page =>
1583
+ ( page ) =>
1567
1584
`'${ page } ': () => require('./${ path . join (
1568
1585
'./' ,
1569
1586
group . pages [ page ] . pageFileName
@@ -1609,7 +1626,7 @@ export async function build({
1609
1626
// for prerendered dynamic routes (/blog/post-1) we need to
1610
1627
// find the match since it won't match the page directly
1611
1628
const dynamicRoutes = ${ JSON . stringify (
1612
- completeDynamicRoutes . map ( route => ( {
1629
+ completeDynamicRoutes . map ( ( route ) => ( {
1613
1630
src : route . src ,
1614
1631
dest : route . dest ,
1615
1632
} ) )
@@ -1936,13 +1953,13 @@ export async function build({
1936
1953
}
1937
1954
} ;
1938
1955
1939
- Object . keys ( prerenderManifest . staticRoutes ) . forEach ( route =>
1956
+ Object . keys ( prerenderManifest . staticRoutes ) . forEach ( ( route ) =>
1940
1957
onPrerenderRoute ( route , { isBlocking : false , isFallback : false } )
1941
1958
) ;
1942
- Object . keys ( prerenderManifest . fallbackRoutes ) . forEach ( route =>
1959
+ Object . keys ( prerenderManifest . fallbackRoutes ) . forEach ( ( route ) =>
1943
1960
onPrerenderRoute ( route , { isBlocking : false , isFallback : true } )
1944
1961
) ;
1945
- Object . keys ( prerenderManifest . blockingFallbackRoutes ) . forEach ( route =>
1962
+ Object . keys ( prerenderManifest . blockingFallbackRoutes ) . forEach ( ( route ) =>
1946
1963
onPrerenderRoute ( route , { isBlocking : true , isFallback : false } )
1947
1964
) ;
1948
1965
@@ -2021,7 +2038,7 @@ export async function build({
2021
2038
// We need to delete lambdas from output instead of omitting them from the
2022
2039
// start since we rely on them for powering Preview Mode (read above in
2023
2040
// onPrerenderRoute).
2024
- prerenderManifest . omittedRoutes . forEach ( routeKey => {
2041
+ prerenderManifest . omittedRoutes . forEach ( ( routeKey ) => {
2025
2042
// Get the route file as it'd be mounted in the builder output
2026
2043
const routeFileNoExt = path . posix . join (
2027
2044
entryDirectory ,
@@ -2081,7 +2098,7 @@ export async function build({
2081
2098
2082
2099
const trailingSlashRedirects : Route [ ] = [ ] ;
2083
2100
2084
- redirects = redirects . filter ( _redir => {
2101
+ redirects = redirects . filter ( ( _redir ) => {
2085
2102
const redir = _redir as Source ;
2086
2103
// detect the trailing slash redirect and make sure it's
2087
2104
// kept above the wildcard mapping to prevent erroneous redirects
@@ -2113,7 +2130,7 @@ export async function build({
2113
2130
...staticDirectoryFiles ,
2114
2131
} ,
2115
2132
wildcard : i18n ?. domains
2116
- ? i18n ?. domains . map ( item => {
2133
+ ? i18n ?. domains . map ( ( item ) => {
2117
2134
return {
2118
2135
domain : item . domain ,
2119
2136
value :
@@ -2156,7 +2173,7 @@ export async function build({
2156
2173
entryDirectory ,
2157
2174
'/'
2158
2175
) } (?!(?:_next/.*|${ i18n . locales
2159
- . map ( locale => escapeStringRegexp ( locale ) )
2176
+ . map ( ( locale ) => escapeStringRegexp ( locale ) )
2160
2177
. join ( '|' ) } )(?:/.*|$))(.*)$`,
2161
2178
// we aren't able to ensure trailing slash mode here
2162
2179
// so ensure this comes after the trailing slash redirect
@@ -2172,7 +2189,7 @@ export async function build({
2172
2189
'/' ,
2173
2190
entryDirectory
2174
2191
) } /?(?:${ i18n . locales
2175
- . map ( locale => escapeStringRegexp ( locale ) )
2192
+ . map ( ( locale ) => escapeStringRegexp ( locale ) )
2176
2193
. join ( '|' ) } )?/?$`,
2177
2194
locale : {
2178
2195
redirect : i18n . domains . reduce (
@@ -2182,7 +2199,7 @@ export async function build({
2182
2199
} ://${ item . domain } /`;
2183
2200
2184
2201
if ( item . locales ) {
2185
- item . locales . map ( locale => {
2202
+ item . locales . map ( ( locale ) => {
2186
2203
prev [ locale ] = `http${ item . http ? '' : 's' } ://${
2187
2204
item . domain
2188
2205
} /${ locale } `;
@@ -2241,7 +2258,7 @@ export async function build({
2241
2258
entryDirectory ,
2242
2259
'/'
2243
2260
) } (?!(?:_next/.*|${ i18n . locales
2244
- . map ( locale => escapeStringRegexp ( locale ) )
2261
+ . map ( ( locale ) => escapeStringRegexp ( locale ) )
2245
2262
. join ( '|' ) } )(?:/.*|$))(.*)$`,
2246
2263
dest : `/${ i18n . defaultLocale } /$1` ,
2247
2264
continue : true ,
@@ -2264,7 +2281,7 @@ export async function build({
2264
2281
entryDirectory ,
2265
2282
'/'
2266
2283
) } (?:${ i18n . locales
2267
- . map ( locale => escapeStringRegexp ( locale ) )
2284
+ . map ( ( locale ) => escapeStringRegexp ( locale ) )
2268
2285
. join ( '|' ) } )?[/]?404`,
2269
2286
status : 404 ,
2270
2287
continue : true ,
@@ -2283,7 +2300,7 @@ export async function build({
2283
2300
{ handle : 'filesystem' } ,
2284
2301
2285
2302
// map pages to their lambda
2286
- ...pageLambdaRoutes . filter ( route => {
2303
+ ...pageLambdaRoutes . filter ( ( route ) => {
2287
2304
// filter out any SSG pages as they are already present in output
2288
2305
if ( 'headers' in route ) {
2289
2306
let page = route . headers ?. [ 'x-nextjs-page' ] ! ;
@@ -2331,7 +2348,7 @@ export async function build({
2331
2348
'/' ,
2332
2349
entryDirectory
2333
2350
) } /?(?:${ i18n . locales
2334
- . map ( locale => escapeStringRegexp ( locale ) )
2351
+ . map ( ( locale ) => escapeStringRegexp ( locale ) )
2335
2352
. join ( '|' ) } )/(.*)`,
2336
2353
dest : `${ path . join ( '/' , entryDirectory , '/' ) } $1` ,
2337
2354
check : true ,
@@ -2350,7 +2367,7 @@ export async function build({
2350
2367
entryDirectory ,
2351
2368
'/'
2352
2369
) } (?:${ i18n ?. locales
2353
- . map ( locale => escapeStringRegexp ( locale ) )
2370
+ . map ( ( locale ) => escapeStringRegexp ( locale ) )
2354
2371
. join ( '|' ) } )/(.*)`,
2355
2372
dest : '/$1' ,
2356
2373
check : true ,
@@ -2406,7 +2423,7 @@ export async function build({
2406
2423
entryDirectory ,
2407
2424
'/'
2408
2425
) } (?<nextLocale>${ i18n . locales
2409
- . map ( locale => escapeStringRegexp ( locale ) )
2426
+ . map ( ( locale ) => escapeStringRegexp ( locale ) )
2410
2427
. join ( '|' ) } )(/.*|$)`,
2411
2428
dest : '/$nextLocale/404' ,
2412
2429
status : 404 ,
0 commit comments