@vercel/next 4.0.2 → 4.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +80 -12
- package/dist/server-build.js +70 -10
- package/dist/utils.js +10 -2
- package/package.json +2 -2
package/dist/index.js
CHANGED
@@ -43302,6 +43302,9 @@ const CORRECT_MIDDLEWARE_ORDER_VERSION = 'v12.1.7-canary.29';
|
|
43302
43302
|
const NEXT_DATA_MIDDLEWARE_RESOLVING_VERSION = 'v12.1.7-canary.33';
|
43303
43303
|
const EMPTY_ALLOW_QUERY_FOR_PRERENDERED_VERSION = 'v12.2.0';
|
43304
43304
|
const CORRECTED_MANIFESTS_VERSION = 'v12.2.0';
|
43305
|
+
// related PR: https://github.com/vercel/next.js/pull/52997
|
43306
|
+
const BUNDLED_SERVER_NEXT_VERSION = '13.4.20-canary.26';
|
43307
|
+
const BUNDLED_SERVER_NEXT_PATH = 'next/dist/compiled/next-server/server.runtime.prod.js';
|
43305
43308
|
async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfigManifest, privateOutputs, baseDir, workPath, entryPath, nodeVersion, buildId, escapedBuildId, dynamicPrefix, entryDirectory, outputDirectory, redirects, beforeFilesRewrites, afterFilesRewrites, fallbackRewrites, headers, dataRoutes, hasIsr404Page, hasIsr500Page, imagesManifest, wildcardConfig, routesManifest, staticPages, lambdaPages, localePrefixed404, nextVersion, lambdaAppPaths, canUsePreviewMode, trailingSlash, prerenderManifest, appPathRoutesManifest, omittedPrerenderRoutes, trailingSlashRedirects, isCorrectLocaleAPIRoutes, lambdaCompressedByteLimit, requiredServerFilesManifest, }) {
|
43306
43309
|
lambdaPages = Object.assign({}, lambdaPages, lambdaAppPaths);
|
43307
43310
|
const lambdas = {};
|
@@ -43320,14 +43323,21 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
43320
43323
|
inversedAppPathManifest[appPathRoutesManifest[ogRoute]] = ogRoute;
|
43321
43324
|
}
|
43322
43325
|
}
|
43323
|
-
const APP_PREFETCH_SUFFIX = '.prefetch.rsc';
|
43324
43326
|
let appRscPrefetches = {};
|
43325
43327
|
let appBuildTraces = {};
|
43326
43328
|
let appDir = null;
|
43327
43329
|
if (appPathRoutesManifest) {
|
43328
43330
|
appDir = path_1.default.join(pagesDir, '../app');
|
43329
43331
|
appBuildTraces = await (0, build_utils_1.glob)('**/*.js.nft.json', appDir);
|
43330
|
-
appRscPrefetches = await (0, build_utils_1.glob)(`**/*${
|
43332
|
+
appRscPrefetches = await (0, build_utils_1.glob)(`**/*${utils_1.RSC_PREFETCH_SUFFIX}`, appDir);
|
43333
|
+
const rscContentTypeHeader = routesManifest?.rsc?.contentTypeHeader || utils_1.RSC_CONTENT_TYPE;
|
43334
|
+
// ensure all appRscPrefetches have a contentType since this is used by Next.js
|
43335
|
+
// to determine if it's a valid response
|
43336
|
+
for (const value of Object.values(appRscPrefetches)) {
|
43337
|
+
if (!value.contentType) {
|
43338
|
+
value.contentType = rscContentTypeHeader;
|
43339
|
+
}
|
43340
|
+
}
|
43331
43341
|
}
|
43332
43342
|
const isCorrectNotFoundRoutes = semver_1.default.gte(nextVersion, CORRECT_NOT_FOUND_ROUTES_VERSION);
|
43333
43343
|
const isCorrectMiddlewareOrder = semver_1.default.gte(nextVersion, CORRECT_MIDDLEWARE_ORDER_VERSION);
|
@@ -43396,10 +43406,19 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
43396
43406
|
let initialFileReasons;
|
43397
43407
|
let nextServerBuildTrace;
|
43398
43408
|
let instrumentationHookBuildTrace;
|
43399
|
-
const
|
43409
|
+
const useBundledServer = semver_1.default.gte(nextVersion, BUNDLED_SERVER_NEXT_VERSION) &&
|
43410
|
+
process.env.VERCEL_NEXT_BUNDLED_SERVER;
|
43411
|
+
if (useBundledServer) {
|
43412
|
+
(0, build_utils_1.debug)('Using bundled Next.js server');
|
43413
|
+
}
|
43414
|
+
const nextServerFile = (0, resolve_from_1.default)(projectDir, useBundledServer
|
43415
|
+
? BUNDLED_SERVER_NEXT_PATH
|
43416
|
+
: `${(0, utils_1.getNextServerPath)(nextVersion)}/next-server.js`);
|
43400
43417
|
try {
|
43401
43418
|
// leverage next-server trace from build if available
|
43402
|
-
nextServerBuildTrace = JSON.parse(await fs_extra_1.default.readFile(path_1.default.join(entryPath, outputDirectory,
|
43419
|
+
nextServerBuildTrace = JSON.parse(await fs_extra_1.default.readFile(path_1.default.join(entryPath, outputDirectory, useBundledServer
|
43420
|
+
? 'next-minimal-server.js.nft.json'
|
43421
|
+
: 'next-server.js.nft.json'), 'utf8'));
|
43403
43422
|
}
|
43404
43423
|
catch (_) {
|
43405
43424
|
// if the trace is unavailable we trace inside the runtime
|
@@ -43453,6 +43472,7 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
43453
43472
|
const apiPages = [];
|
43454
43473
|
const nonApiPages = [];
|
43455
43474
|
const appRouterPages = [];
|
43475
|
+
const appRouteHandlers = [];
|
43456
43476
|
lambdaPageKeys.forEach(page => {
|
43457
43477
|
if (internalPages.includes(page) &&
|
43458
43478
|
page !== '404.js' &&
|
@@ -43468,7 +43488,12 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
43468
43488
|
dynamicPages.push(normalizedPathname);
|
43469
43489
|
}
|
43470
43490
|
if (lambdaAppPaths[page]) {
|
43471
|
-
|
43491
|
+
if (lambdaAppPaths[page].fsPath.endsWith('route.js')) {
|
43492
|
+
appRouteHandlers.push(page);
|
43493
|
+
}
|
43494
|
+
else {
|
43495
|
+
appRouterPages.push(page);
|
43496
|
+
}
|
43472
43497
|
}
|
43473
43498
|
else if (pageMatchesApi(page)) {
|
43474
43499
|
apiPages.push(page);
|
@@ -43575,7 +43600,9 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
43575
43600
|
distDir: path_1.default.relative(projectDir, path_1.default.join(entryPath, outputDirectory)),
|
43576
43601
|
compress: false,
|
43577
43602
|
})}`)
|
43578
|
-
.replace('__NEXT_SERVER_PATH__',
|
43603
|
+
.replace('__NEXT_SERVER_PATH__', useBundledServer
|
43604
|
+
? BUNDLED_SERVER_NEXT_PATH
|
43605
|
+
: `${(0, utils_1.getNextServerPath)(nextVersion)}/next-server.js`);
|
43579
43606
|
const appLauncher = launcher.replace('// pre-next-server-target', `process.env.__NEXT_PRIVATE_PREBUNDLED_REACT = "${requiredServerFilesManifest.config?.experimental?.serverActions
|
43580
43607
|
? 'experimental'
|
43581
43608
|
: 'next'}"`);
|
@@ -43593,6 +43620,7 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
43593
43620
|
const mergedPageKeys = [
|
43594
43621
|
...nonApiPages,
|
43595
43622
|
...appRouterPages,
|
43623
|
+
...appRouteHandlers,
|
43596
43624
|
...apiPages,
|
43597
43625
|
...internalPages,
|
43598
43626
|
];
|
@@ -43698,6 +43726,9 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
43698
43726
|
internalPages,
|
43699
43727
|
pageExtensions,
|
43700
43728
|
});
|
43729
|
+
for (const group of pageLambdaGroups) {
|
43730
|
+
group.isPages = true;
|
43731
|
+
}
|
43701
43732
|
const appRouterLambdaGroups = await (0, utils_1.getPageLambdaGroups)({
|
43702
43733
|
entryPath: projectDir,
|
43703
43734
|
config,
|
@@ -43713,12 +43744,34 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
43713
43744
|
internalPages,
|
43714
43745
|
pageExtensions,
|
43715
43746
|
});
|
43747
|
+
const appRouteHandlersLambdaGroups = await (0, utils_1.getPageLambdaGroups)({
|
43748
|
+
entryPath: projectDir,
|
43749
|
+
config,
|
43750
|
+
functionsConfigManifest,
|
43751
|
+
pages: appRouteHandlers,
|
43752
|
+
prerenderRoutes,
|
43753
|
+
pageTraces,
|
43754
|
+
compressedPages,
|
43755
|
+
tracedPseudoLayer: tracedPseudoLayer.pseudoLayer,
|
43756
|
+
initialPseudoLayer,
|
43757
|
+
lambdaCompressedByteLimit,
|
43758
|
+
initialPseudoLayerUncompressed: uncompressedInitialSize,
|
43759
|
+
internalPages,
|
43760
|
+
pageExtensions,
|
43761
|
+
});
|
43716
43762
|
for (const group of appRouterLambdaGroups) {
|
43717
43763
|
if (!group.isPrerenders) {
|
43718
43764
|
group.isStreaming = true;
|
43719
43765
|
}
|
43720
43766
|
group.isAppRouter = true;
|
43721
43767
|
}
|
43768
|
+
for (const group of appRouteHandlersLambdaGroups) {
|
43769
|
+
if (!group.isPrerenders) {
|
43770
|
+
group.isStreaming = true;
|
43771
|
+
}
|
43772
|
+
group.isAppRouter = true;
|
43773
|
+
group.isAppRouteHandler = true;
|
43774
|
+
}
|
43722
43775
|
const apiLambdaGroups = await (0, utils_1.getPageLambdaGroups)({
|
43723
43776
|
entryPath: projectDir,
|
43724
43777
|
config,
|
@@ -43756,12 +43809,19 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
43756
43809
|
pseudoLayerBytes: group.pseudoLayerBytes,
|
43757
43810
|
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
|
43758
43811
|
})),
|
43812
|
+
appRouteHandlersLambdaGroups: appRouteHandlersLambdaGroups.map(group => ({
|
43813
|
+
pages: group.pages,
|
43814
|
+
isPrerender: group.isPrerenders,
|
43815
|
+
pseudoLayerBytes: group.pseudoLayerBytes,
|
43816
|
+
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
|
43817
|
+
})),
|
43759
43818
|
nextServerLayerSize: initialPseudoLayer.pseudoLayerBytes,
|
43760
43819
|
}, null, 2));
|
43761
43820
|
const combinedGroups = [
|
43762
43821
|
...pageLambdaGroups,
|
43763
43822
|
...appRouterLambdaGroups,
|
43764
43823
|
...apiLambdaGroups,
|
43824
|
+
...appRouteHandlersLambdaGroups,
|
43765
43825
|
];
|
43766
43826
|
await (0, utils_1.detectLambdaLimitExceeding)(combinedGroups, lambdaCompressedByteLimit, compressedPages);
|
43767
43827
|
for (const group of combinedGroups) {
|
@@ -44227,7 +44287,7 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
44227
44287
|
key: rscPrefetchHeader,
|
44228
44288
|
},
|
44229
44289
|
],
|
44230
|
-
dest: path_1.default.posix.join('/', entryDirectory,
|
44290
|
+
dest: path_1.default.posix.join('/', entryDirectory, `/index${utils_1.RSC_PREFETCH_SUFFIX}`),
|
44231
44291
|
headers: { vary: rscVaryHeader },
|
44232
44292
|
continue: true,
|
44233
44293
|
override: true,
|
@@ -44240,7 +44300,7 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
44240
44300
|
key: rscPrefetchHeader,
|
44241
44301
|
},
|
44242
44302
|
],
|
44243
|
-
dest: path_1.default.posix.join('/', entryDirectory, `/$1${
|
44303
|
+
dest: path_1.default.posix.join('/', entryDirectory, `/$1${utils_1.RSC_PREFETCH_SUFFIX}`),
|
44244
44304
|
headers: { vary: rscVaryHeader },
|
44245
44305
|
continue: true,
|
44246
44306
|
override: true,
|
@@ -44305,7 +44365,7 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
44305
44365
|
...(rscPrefetchHeader
|
44306
44366
|
? [
|
44307
44367
|
{
|
44308
|
-
src: path_1.default.posix.join('/', entryDirectory, `/index${
|
44368
|
+
src: path_1.default.posix.join('/', entryDirectory, `/index${utils_1.RSC_PREFETCH_SUFFIX}`),
|
44309
44369
|
dest: path_1.default.posix.join('/', entryDirectory, '/index.rsc'),
|
44310
44370
|
has: [
|
44311
44371
|
{
|
@@ -44317,7 +44377,7 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
44317
44377
|
override: true,
|
44318
44378
|
},
|
44319
44379
|
{
|
44320
|
-
src: `^${path_1.default.posix.join('/', entryDirectory, `/(.+?)${
|
44380
|
+
src: `^${path_1.default.posix.join('/', entryDirectory, `/(.+?)${utils_1.RSC_PREFETCH_SUFFIX}(?:/)?$`)}`,
|
44321
44381
|
dest: path_1.default.posix.join('/', entryDirectory, '/$1.rsc'),
|
44322
44382
|
has: [
|
44323
44383
|
{
|
@@ -44714,7 +44774,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
44714
44774
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
44715
44775
|
};
|
44716
44776
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
44717
|
-
exports.isApiPage = exports.getOperationType = exports.upgradeMiddlewareManifest = exports.getMiddlewareManifest = exports.getFunctionsConfigManifest = exports.getMiddlewareBundle = exports.normalizeEdgeFunctionPath = exports.getSourceFilePathFromPage = exports.isDynamicRoute = exports.normalizePage = exports.getImagesConfig = exports.getNextConfig = exports.normalizePackageJson = exports.validateEntrypoint = exports.excludeFiles = exports.getPrivateOutputs = exports.updateRouteSrc = exports.getNextServerPath = exports.normalizeIndexOutput = exports.getStaticFiles = exports.onPrerenderRoute = exports.onPrerenderRouteInitial = exports.detectLambdaLimitExceeding = exports.outputFunctionFileSizeInfo = exports.getPageLambdaGroups = exports.MAX_UNCOMPRESSED_LAMBDA_SIZE = exports.addLocaleOrDefault = exports.normalizeLocalePath = exports.getPrerenderManifest = exports.getRequiredServerFilesManifest = exports.getExportStatus = exports.getExportIntent = exports.createLambdaFromPseudoLayers = exports.createPseudoLayer = exports.ExperimentalTraceVersion = exports.collectTracedFiles = exports.getFilesMapFromReasons = exports.filterStaticPages = exports.getImagesManifest = exports.localizeDynamicRoutes = exports.getDynamicRoutes = exports.getRoutesManifest = exports.prettyBytes = exports.MIB = exports.KIB = void 0;
|
44777
|
+
exports.isApiPage = exports.getOperationType = exports.upgradeMiddlewareManifest = exports.getMiddlewareManifest = exports.getFunctionsConfigManifest = exports.getMiddlewareBundle = exports.normalizeEdgeFunctionPath = exports.getSourceFilePathFromPage = exports.isDynamicRoute = exports.normalizePage = exports.getImagesConfig = exports.getNextConfig = exports.normalizePackageJson = exports.validateEntrypoint = exports.excludeFiles = exports.getPrivateOutputs = exports.updateRouteSrc = exports.getNextServerPath = exports.normalizeIndexOutput = exports.getStaticFiles = exports.onPrerenderRoute = exports.onPrerenderRouteInitial = exports.detectLambdaLimitExceeding = exports.outputFunctionFileSizeInfo = exports.getPageLambdaGroups = exports.MAX_UNCOMPRESSED_LAMBDA_SIZE = exports.addLocaleOrDefault = exports.normalizeLocalePath = exports.getPrerenderManifest = exports.getRequiredServerFilesManifest = exports.getExportStatus = exports.getExportIntent = exports.createLambdaFromPseudoLayers = exports.createPseudoLayer = exports.ExperimentalTraceVersion = exports.collectTracedFiles = exports.getFilesMapFromReasons = exports.filterStaticPages = exports.getImagesManifest = exports.localizeDynamicRoutes = exports.getDynamicRoutes = exports.getRoutesManifest = exports.RSC_PREFETCH_SUFFIX = exports.RSC_CONTENT_TYPE = exports.prettyBytes = exports.MIB = exports.KIB = void 0;
|
44718
44778
|
const build_utils_1 = __webpack_require__(3445);
|
44719
44779
|
const async_sema_1 = __webpack_require__(7905);
|
44720
44780
|
const buffer_crc32_1 = __importDefault(__webpack_require__(2227));
|
@@ -44734,6 +44794,8 @@ exports.KIB = 1024;
|
|
44734
44794
|
exports.MIB = 1024 * exports.KIB;
|
44735
44795
|
const prettyBytes = (n) => (0, bytes_1.default)(n, { unitSeparator: ' ' });
|
44736
44796
|
exports.prettyBytes = prettyBytes;
|
44797
|
+
exports.RSC_CONTENT_TYPE = 'x-component';
|
44798
|
+
exports.RSC_PREFETCH_SUFFIX = '.prefetch.rsc';
|
44737
44799
|
// Identify /[param]/ in route string
|
44738
44800
|
// eslint-disable-next-line no-useless-escape
|
44739
44801
|
const TEST_DYNAMIC_ROUTE = /\/\[[^\/]+?\](?=\/|$)/;
|
@@ -45386,9 +45448,11 @@ async function getPrerenderManifest(entryPath, outputDirectory) {
|
|
45386
45448
|
const { initialRevalidateSeconds, dataRoute, srcRoute } = manifest.routes[route];
|
45387
45449
|
let initialStatus;
|
45388
45450
|
let initialHeaders;
|
45451
|
+
let experimentalBypassFor;
|
45389
45452
|
if (manifest.version === 4) {
|
45390
45453
|
initialStatus = manifest.routes[route].initialStatus;
|
45391
45454
|
initialHeaders = manifest.routes[route].initialHeaders;
|
45455
|
+
experimentalBypassFor = manifest.routes[route].experimentalBypassFor;
|
45392
45456
|
}
|
45393
45457
|
ret.staticRoutes[route] = {
|
45394
45458
|
initialRevalidate: initialRevalidateSeconds === false
|
@@ -45398,6 +45462,7 @@ async function getPrerenderManifest(entryPath, outputDirectory) {
|
|
45398
45462
|
srcRoute,
|
45399
45463
|
initialStatus,
|
45400
45464
|
initialHeaders,
|
45465
|
+
experimentalBypassFor,
|
45401
45466
|
};
|
45402
45467
|
});
|
45403
45468
|
lazyRoutes.forEach(lazyRoute => {
|
@@ -45855,6 +45920,7 @@ const onPrerenderRoute = (prerenderRouteArgs) => (routeKey, { isBlocking, isFall
|
|
45855
45920
|
let dataRoute;
|
45856
45921
|
let initialStatus;
|
45857
45922
|
let initialHeaders;
|
45923
|
+
let experimentalBypassFor;
|
45858
45924
|
if (isFallback || isBlocking) {
|
45859
45925
|
const pr = isFallback
|
45860
45926
|
? prerenderManifest.fallbackRoutes[routeKey]
|
@@ -45884,6 +45950,7 @@ const onPrerenderRoute = (prerenderRouteArgs) => (routeKey, { isBlocking, isFall
|
|
45884
45950
|
dataRoute,
|
45885
45951
|
initialHeaders,
|
45886
45952
|
initialStatus,
|
45953
|
+
experimentalBypassFor,
|
45887
45954
|
} = pr);
|
45888
45955
|
}
|
45889
45956
|
let isAppPathRoute = false;
|
@@ -46049,7 +46116,7 @@ const onPrerenderRoute = (prerenderRouteArgs) => (routeKey, { isBlocking, isFall
|
|
46049
46116
|
const rscEnabled = !!routesManifest?.rsc;
|
46050
46117
|
const rscVaryHeader = routesManifest?.rsc?.varyHeader ||
|
46051
46118
|
'RSC, Next-Router-State-Tree, Next-Router-Prefetch';
|
46052
|
-
const rscContentTypeHeader = routesManifest?.rsc?.contentTypeHeader ||
|
46119
|
+
const rscContentTypeHeader = routesManifest?.rsc?.contentTypeHeader || exports.RSC_CONTENT_TYPE;
|
46053
46120
|
let sourcePath;
|
46054
46121
|
if (`/${outputPathPage}` !== srcRoute && srcRoute) {
|
46055
46122
|
sourcePath = srcRoute;
|
@@ -46061,6 +46128,7 @@ const onPrerenderRoute = (prerenderRouteArgs) => (routeKey, { isBlocking, isFall
|
|
46061
46128
|
fallback: htmlFsRef,
|
46062
46129
|
group: prerenderGroup,
|
46063
46130
|
bypassToken: prerenderManifest.bypassToken,
|
46131
|
+
experimentalBypassFor,
|
46064
46132
|
initialStatus,
|
46065
46133
|
initialHeaders,
|
46066
46134
|
sourcePath,
|
package/dist/server-build.js
CHANGED
@@ -21,6 +21,9 @@ const CORRECT_MIDDLEWARE_ORDER_VERSION = 'v12.1.7-canary.29';
|
|
21
21
|
const NEXT_DATA_MIDDLEWARE_RESOLVING_VERSION = 'v12.1.7-canary.33';
|
22
22
|
const EMPTY_ALLOW_QUERY_FOR_PRERENDERED_VERSION = 'v12.2.0';
|
23
23
|
const CORRECTED_MANIFESTS_VERSION = 'v12.2.0';
|
24
|
+
// related PR: https://github.com/vercel/next.js/pull/52997
|
25
|
+
const BUNDLED_SERVER_NEXT_VERSION = '13.4.20-canary.26';
|
26
|
+
const BUNDLED_SERVER_NEXT_PATH = 'next/dist/compiled/next-server/server.runtime.prod.js';
|
24
27
|
async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfigManifest, privateOutputs, baseDir, workPath, entryPath, nodeVersion, buildId, escapedBuildId, dynamicPrefix, entryDirectory, outputDirectory, redirects, beforeFilesRewrites, afterFilesRewrites, fallbackRewrites, headers, dataRoutes, hasIsr404Page, hasIsr500Page, imagesManifest, wildcardConfig, routesManifest, staticPages, lambdaPages, localePrefixed404, nextVersion, lambdaAppPaths, canUsePreviewMode, trailingSlash, prerenderManifest, appPathRoutesManifest, omittedPrerenderRoutes, trailingSlashRedirects, isCorrectLocaleAPIRoutes, lambdaCompressedByteLimit, requiredServerFilesManifest, }) {
|
25
28
|
lambdaPages = Object.assign({}, lambdaPages, lambdaAppPaths);
|
26
29
|
const lambdas = {};
|
@@ -39,14 +42,21 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
39
42
|
inversedAppPathManifest[appPathRoutesManifest[ogRoute]] = ogRoute;
|
40
43
|
}
|
41
44
|
}
|
42
|
-
const APP_PREFETCH_SUFFIX = '.prefetch.rsc';
|
43
45
|
let appRscPrefetches = {};
|
44
46
|
let appBuildTraces = {};
|
45
47
|
let appDir = null;
|
46
48
|
if (appPathRoutesManifest) {
|
47
49
|
appDir = path_1.default.join(pagesDir, '../app');
|
48
50
|
appBuildTraces = await (0, build_utils_1.glob)('**/*.js.nft.json', appDir);
|
49
|
-
appRscPrefetches = await (0, build_utils_1.glob)(`**/*${
|
51
|
+
appRscPrefetches = await (0, build_utils_1.glob)(`**/*${utils_1.RSC_PREFETCH_SUFFIX}`, appDir);
|
52
|
+
const rscContentTypeHeader = routesManifest?.rsc?.contentTypeHeader || utils_1.RSC_CONTENT_TYPE;
|
53
|
+
// ensure all appRscPrefetches have a contentType since this is used by Next.js
|
54
|
+
// to determine if it's a valid response
|
55
|
+
for (const value of Object.values(appRscPrefetches)) {
|
56
|
+
if (!value.contentType) {
|
57
|
+
value.contentType = rscContentTypeHeader;
|
58
|
+
}
|
59
|
+
}
|
50
60
|
}
|
51
61
|
const isCorrectNotFoundRoutes = semver_1.default.gte(nextVersion, CORRECT_NOT_FOUND_ROUTES_VERSION);
|
52
62
|
const isCorrectMiddlewareOrder = semver_1.default.gte(nextVersion, CORRECT_MIDDLEWARE_ORDER_VERSION);
|
@@ -115,10 +125,19 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
115
125
|
let initialFileReasons;
|
116
126
|
let nextServerBuildTrace;
|
117
127
|
let instrumentationHookBuildTrace;
|
118
|
-
const
|
128
|
+
const useBundledServer = semver_1.default.gte(nextVersion, BUNDLED_SERVER_NEXT_VERSION) &&
|
129
|
+
process.env.VERCEL_NEXT_BUNDLED_SERVER;
|
130
|
+
if (useBundledServer) {
|
131
|
+
(0, build_utils_1.debug)('Using bundled Next.js server');
|
132
|
+
}
|
133
|
+
const nextServerFile = (0, resolve_from_1.default)(projectDir, useBundledServer
|
134
|
+
? BUNDLED_SERVER_NEXT_PATH
|
135
|
+
: `${(0, utils_1.getNextServerPath)(nextVersion)}/next-server.js`);
|
119
136
|
try {
|
120
137
|
// leverage next-server trace from build if available
|
121
|
-
nextServerBuildTrace = JSON.parse(await fs_extra_1.default.readFile(path_1.default.join(entryPath, outputDirectory,
|
138
|
+
nextServerBuildTrace = JSON.parse(await fs_extra_1.default.readFile(path_1.default.join(entryPath, outputDirectory, useBundledServer
|
139
|
+
? 'next-minimal-server.js.nft.json'
|
140
|
+
: 'next-server.js.nft.json'), 'utf8'));
|
122
141
|
}
|
123
142
|
catch (_) {
|
124
143
|
// if the trace is unavailable we trace inside the runtime
|
@@ -172,6 +191,7 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
172
191
|
const apiPages = [];
|
173
192
|
const nonApiPages = [];
|
174
193
|
const appRouterPages = [];
|
194
|
+
const appRouteHandlers = [];
|
175
195
|
lambdaPageKeys.forEach(page => {
|
176
196
|
if (internalPages.includes(page) &&
|
177
197
|
page !== '404.js' &&
|
@@ -187,7 +207,12 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
187
207
|
dynamicPages.push(normalizedPathname);
|
188
208
|
}
|
189
209
|
if (lambdaAppPaths[page]) {
|
190
|
-
|
210
|
+
if (lambdaAppPaths[page].fsPath.endsWith('route.js')) {
|
211
|
+
appRouteHandlers.push(page);
|
212
|
+
}
|
213
|
+
else {
|
214
|
+
appRouterPages.push(page);
|
215
|
+
}
|
191
216
|
}
|
192
217
|
else if (pageMatchesApi(page)) {
|
193
218
|
apiPages.push(page);
|
@@ -294,7 +319,9 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
294
319
|
distDir: path_1.default.relative(projectDir, path_1.default.join(entryPath, outputDirectory)),
|
295
320
|
compress: false,
|
296
321
|
})}`)
|
297
|
-
.replace('__NEXT_SERVER_PATH__',
|
322
|
+
.replace('__NEXT_SERVER_PATH__', useBundledServer
|
323
|
+
? BUNDLED_SERVER_NEXT_PATH
|
324
|
+
: `${(0, utils_1.getNextServerPath)(nextVersion)}/next-server.js`);
|
298
325
|
const appLauncher = launcher.replace('// pre-next-server-target', `process.env.__NEXT_PRIVATE_PREBUNDLED_REACT = "${requiredServerFilesManifest.config?.experimental?.serverActions
|
299
326
|
? 'experimental'
|
300
327
|
: 'next'}"`);
|
@@ -312,6 +339,7 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
312
339
|
const mergedPageKeys = [
|
313
340
|
...nonApiPages,
|
314
341
|
...appRouterPages,
|
342
|
+
...appRouteHandlers,
|
315
343
|
...apiPages,
|
316
344
|
...internalPages,
|
317
345
|
];
|
@@ -417,6 +445,9 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
417
445
|
internalPages,
|
418
446
|
pageExtensions,
|
419
447
|
});
|
448
|
+
for (const group of pageLambdaGroups) {
|
449
|
+
group.isPages = true;
|
450
|
+
}
|
420
451
|
const appRouterLambdaGroups = await (0, utils_1.getPageLambdaGroups)({
|
421
452
|
entryPath: projectDir,
|
422
453
|
config,
|
@@ -432,12 +463,34 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
432
463
|
internalPages,
|
433
464
|
pageExtensions,
|
434
465
|
});
|
466
|
+
const appRouteHandlersLambdaGroups = await (0, utils_1.getPageLambdaGroups)({
|
467
|
+
entryPath: projectDir,
|
468
|
+
config,
|
469
|
+
functionsConfigManifest,
|
470
|
+
pages: appRouteHandlers,
|
471
|
+
prerenderRoutes,
|
472
|
+
pageTraces,
|
473
|
+
compressedPages,
|
474
|
+
tracedPseudoLayer: tracedPseudoLayer.pseudoLayer,
|
475
|
+
initialPseudoLayer,
|
476
|
+
lambdaCompressedByteLimit,
|
477
|
+
initialPseudoLayerUncompressed: uncompressedInitialSize,
|
478
|
+
internalPages,
|
479
|
+
pageExtensions,
|
480
|
+
});
|
435
481
|
for (const group of appRouterLambdaGroups) {
|
436
482
|
if (!group.isPrerenders) {
|
437
483
|
group.isStreaming = true;
|
438
484
|
}
|
439
485
|
group.isAppRouter = true;
|
440
486
|
}
|
487
|
+
for (const group of appRouteHandlersLambdaGroups) {
|
488
|
+
if (!group.isPrerenders) {
|
489
|
+
group.isStreaming = true;
|
490
|
+
}
|
491
|
+
group.isAppRouter = true;
|
492
|
+
group.isAppRouteHandler = true;
|
493
|
+
}
|
441
494
|
const apiLambdaGroups = await (0, utils_1.getPageLambdaGroups)({
|
442
495
|
entryPath: projectDir,
|
443
496
|
config,
|
@@ -475,12 +528,19 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
475
528
|
pseudoLayerBytes: group.pseudoLayerBytes,
|
476
529
|
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
|
477
530
|
})),
|
531
|
+
appRouteHandlersLambdaGroups: appRouteHandlersLambdaGroups.map(group => ({
|
532
|
+
pages: group.pages,
|
533
|
+
isPrerender: group.isPrerenders,
|
534
|
+
pseudoLayerBytes: group.pseudoLayerBytes,
|
535
|
+
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
|
536
|
+
})),
|
478
537
|
nextServerLayerSize: initialPseudoLayer.pseudoLayerBytes,
|
479
538
|
}, null, 2));
|
480
539
|
const combinedGroups = [
|
481
540
|
...pageLambdaGroups,
|
482
541
|
...appRouterLambdaGroups,
|
483
542
|
...apiLambdaGroups,
|
543
|
+
...appRouteHandlersLambdaGroups,
|
484
544
|
];
|
485
545
|
await (0, utils_1.detectLambdaLimitExceeding)(combinedGroups, lambdaCompressedByteLimit, compressedPages);
|
486
546
|
for (const group of combinedGroups) {
|
@@ -946,7 +1006,7 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
946
1006
|
key: rscPrefetchHeader,
|
947
1007
|
},
|
948
1008
|
],
|
949
|
-
dest: path_1.default.posix.join('/', entryDirectory,
|
1009
|
+
dest: path_1.default.posix.join('/', entryDirectory, `/index${utils_1.RSC_PREFETCH_SUFFIX}`),
|
950
1010
|
headers: { vary: rscVaryHeader },
|
951
1011
|
continue: true,
|
952
1012
|
override: true,
|
@@ -959,7 +1019,7 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
959
1019
|
key: rscPrefetchHeader,
|
960
1020
|
},
|
961
1021
|
],
|
962
|
-
dest: path_1.default.posix.join('/', entryDirectory, `/$1${
|
1022
|
+
dest: path_1.default.posix.join('/', entryDirectory, `/$1${utils_1.RSC_PREFETCH_SUFFIX}`),
|
963
1023
|
headers: { vary: rscVaryHeader },
|
964
1024
|
continue: true,
|
965
1025
|
override: true,
|
@@ -1024,7 +1084,7 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
1024
1084
|
...(rscPrefetchHeader
|
1025
1085
|
? [
|
1026
1086
|
{
|
1027
|
-
src: path_1.default.posix.join('/', entryDirectory, `/index${
|
1087
|
+
src: path_1.default.posix.join('/', entryDirectory, `/index${utils_1.RSC_PREFETCH_SUFFIX}`),
|
1028
1088
|
dest: path_1.default.posix.join('/', entryDirectory, '/index.rsc'),
|
1029
1089
|
has: [
|
1030
1090
|
{
|
@@ -1036,7 +1096,7 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
|
|
1036
1096
|
override: true,
|
1037
1097
|
},
|
1038
1098
|
{
|
1039
|
-
src: `^${path_1.default.posix.join('/', entryDirectory, `/(.+?)${
|
1099
|
+
src: `^${path_1.default.posix.join('/', entryDirectory, `/(.+?)${utils_1.RSC_PREFETCH_SUFFIX}(?:/)?$`)}`,
|
1040
1100
|
dest: path_1.default.posix.join('/', entryDirectory, '/$1.rsc'),
|
1041
1101
|
has: [
|
1042
1102
|
{
|
package/dist/utils.js
CHANGED
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
27
27
|
};
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
29
|
-
exports.isApiPage = exports.getOperationType = exports.upgradeMiddlewareManifest = exports.getMiddlewareManifest = exports.getFunctionsConfigManifest = exports.getMiddlewareBundle = exports.normalizeEdgeFunctionPath = exports.getSourceFilePathFromPage = exports.isDynamicRoute = exports.normalizePage = exports.getImagesConfig = exports.getNextConfig = exports.normalizePackageJson = exports.validateEntrypoint = exports.excludeFiles = exports.getPrivateOutputs = exports.updateRouteSrc = exports.getNextServerPath = exports.normalizeIndexOutput = exports.getStaticFiles = exports.onPrerenderRoute = exports.onPrerenderRouteInitial = exports.detectLambdaLimitExceeding = exports.outputFunctionFileSizeInfo = exports.getPageLambdaGroups = exports.MAX_UNCOMPRESSED_LAMBDA_SIZE = exports.addLocaleOrDefault = exports.normalizeLocalePath = exports.getPrerenderManifest = exports.getRequiredServerFilesManifest = exports.getExportStatus = exports.getExportIntent = exports.createLambdaFromPseudoLayers = exports.createPseudoLayer = exports.ExperimentalTraceVersion = exports.collectTracedFiles = exports.getFilesMapFromReasons = exports.filterStaticPages = exports.getImagesManifest = exports.localizeDynamicRoutes = exports.getDynamicRoutes = exports.getRoutesManifest = exports.prettyBytes = exports.MIB = exports.KIB = void 0;
|
29
|
+
exports.isApiPage = exports.getOperationType = exports.upgradeMiddlewareManifest = exports.getMiddlewareManifest = exports.getFunctionsConfigManifest = exports.getMiddlewareBundle = exports.normalizeEdgeFunctionPath = exports.getSourceFilePathFromPage = exports.isDynamicRoute = exports.normalizePage = exports.getImagesConfig = exports.getNextConfig = exports.normalizePackageJson = exports.validateEntrypoint = exports.excludeFiles = exports.getPrivateOutputs = exports.updateRouteSrc = exports.getNextServerPath = exports.normalizeIndexOutput = exports.getStaticFiles = exports.onPrerenderRoute = exports.onPrerenderRouteInitial = exports.detectLambdaLimitExceeding = exports.outputFunctionFileSizeInfo = exports.getPageLambdaGroups = exports.MAX_UNCOMPRESSED_LAMBDA_SIZE = exports.addLocaleOrDefault = exports.normalizeLocalePath = exports.getPrerenderManifest = exports.getRequiredServerFilesManifest = exports.getExportStatus = exports.getExportIntent = exports.createLambdaFromPseudoLayers = exports.createPseudoLayer = exports.ExperimentalTraceVersion = exports.collectTracedFiles = exports.getFilesMapFromReasons = exports.filterStaticPages = exports.getImagesManifest = exports.localizeDynamicRoutes = exports.getDynamicRoutes = exports.getRoutesManifest = exports.RSC_PREFETCH_SUFFIX = exports.RSC_CONTENT_TYPE = exports.prettyBytes = exports.MIB = exports.KIB = void 0;
|
30
30
|
const build_utils_1 = require("@vercel/build-utils");
|
31
31
|
const async_sema_1 = require("async-sema");
|
32
32
|
const buffer_crc32_1 = __importDefault(require("buffer-crc32"));
|
@@ -46,6 +46,8 @@ exports.KIB = 1024;
|
|
46
46
|
exports.MIB = 1024 * exports.KIB;
|
47
47
|
const prettyBytes = (n) => (0, bytes_1.default)(n, { unitSeparator: ' ' });
|
48
48
|
exports.prettyBytes = prettyBytes;
|
49
|
+
exports.RSC_CONTENT_TYPE = 'x-component';
|
50
|
+
exports.RSC_PREFETCH_SUFFIX = '.prefetch.rsc';
|
49
51
|
// Identify /[param]/ in route string
|
50
52
|
// eslint-disable-next-line no-useless-escape
|
51
53
|
const TEST_DYNAMIC_ROUTE = /\/\[[^\/]+?\](?=\/|$)/;
|
@@ -698,9 +700,11 @@ async function getPrerenderManifest(entryPath, outputDirectory) {
|
|
698
700
|
const { initialRevalidateSeconds, dataRoute, srcRoute } = manifest.routes[route];
|
699
701
|
let initialStatus;
|
700
702
|
let initialHeaders;
|
703
|
+
let experimentalBypassFor;
|
701
704
|
if (manifest.version === 4) {
|
702
705
|
initialStatus = manifest.routes[route].initialStatus;
|
703
706
|
initialHeaders = manifest.routes[route].initialHeaders;
|
707
|
+
experimentalBypassFor = manifest.routes[route].experimentalBypassFor;
|
704
708
|
}
|
705
709
|
ret.staticRoutes[route] = {
|
706
710
|
initialRevalidate: initialRevalidateSeconds === false
|
@@ -710,6 +714,7 @@ async function getPrerenderManifest(entryPath, outputDirectory) {
|
|
710
714
|
srcRoute,
|
711
715
|
initialStatus,
|
712
716
|
initialHeaders,
|
717
|
+
experimentalBypassFor,
|
713
718
|
};
|
714
719
|
});
|
715
720
|
lazyRoutes.forEach(lazyRoute => {
|
@@ -1167,6 +1172,7 @@ const onPrerenderRoute = (prerenderRouteArgs) => (routeKey, { isBlocking, isFall
|
|
1167
1172
|
let dataRoute;
|
1168
1173
|
let initialStatus;
|
1169
1174
|
let initialHeaders;
|
1175
|
+
let experimentalBypassFor;
|
1170
1176
|
if (isFallback || isBlocking) {
|
1171
1177
|
const pr = isFallback
|
1172
1178
|
? prerenderManifest.fallbackRoutes[routeKey]
|
@@ -1196,6 +1202,7 @@ const onPrerenderRoute = (prerenderRouteArgs) => (routeKey, { isBlocking, isFall
|
|
1196
1202
|
dataRoute,
|
1197
1203
|
initialHeaders,
|
1198
1204
|
initialStatus,
|
1205
|
+
experimentalBypassFor,
|
1199
1206
|
} = pr);
|
1200
1207
|
}
|
1201
1208
|
let isAppPathRoute = false;
|
@@ -1361,7 +1368,7 @@ const onPrerenderRoute = (prerenderRouteArgs) => (routeKey, { isBlocking, isFall
|
|
1361
1368
|
const rscEnabled = !!routesManifest?.rsc;
|
1362
1369
|
const rscVaryHeader = routesManifest?.rsc?.varyHeader ||
|
1363
1370
|
'RSC, Next-Router-State-Tree, Next-Router-Prefetch';
|
1364
|
-
const rscContentTypeHeader = routesManifest?.rsc?.contentTypeHeader ||
|
1371
|
+
const rscContentTypeHeader = routesManifest?.rsc?.contentTypeHeader || exports.RSC_CONTENT_TYPE;
|
1365
1372
|
let sourcePath;
|
1366
1373
|
if (`/${outputPathPage}` !== srcRoute && srcRoute) {
|
1367
1374
|
sourcePath = srcRoute;
|
@@ -1373,6 +1380,7 @@ const onPrerenderRoute = (prerenderRouteArgs) => (routeKey, { isBlocking, isFall
|
|
1373
1380
|
fallback: htmlFsRef,
|
1374
1381
|
group: prerenderGroup,
|
1375
1382
|
bypassToken: prerenderManifest.bypassToken,
|
1383
|
+
experimentalBypassFor,
|
1376
1384
|
initialStatus,
|
1377
1385
|
initialHeaders,
|
1378
1386
|
sourcePath,
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@vercel/next",
|
3
|
-
"version": "4.0.
|
3
|
+
"version": "4.0.4",
|
4
4
|
"license": "Apache-2.0",
|
5
5
|
"main": "./dist/index",
|
6
6
|
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js",
|
@@ -26,7 +26,7 @@
|
|
26
26
|
"@types/semver": "6.0.0",
|
27
27
|
"@types/text-table": "0.2.1",
|
28
28
|
"@types/webpack-sources": "3.2.0",
|
29
|
-
"@vercel/build-utils": "7.
|
29
|
+
"@vercel/build-utils": "7.2.0",
|
30
30
|
"@vercel/nft": "0.22.5",
|
31
31
|
"@vercel/routing-utils": "3.0.0",
|
32
32
|
"async-sema": "3.0.1",
|