@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 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)(`**/*${APP_PREFETCH_SUFFIX}`, appDir);
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 nextServerFile = (0, resolve_from_1.default)(projectDir, `${(0, utils_1.getNextServerPath)(nextVersion)}/next-server.js`);
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, 'next-server.js.nft.json'), 'utf8'));
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
- appRouterPages.push(page);
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__', `${(0, utils_1.getNextServerPath)(nextVersion)}/next-server.js`);
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, '/index.prefetch.rsc'),
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${APP_PREFETCH_SUFFIX}`),
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${APP_PREFETCH_SUFFIX}`),
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, `/(.+?)${APP_PREFETCH_SUFFIX}(?:/)?$`)}`,
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 || 'text/x-component';
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,
@@ -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)(`**/*${APP_PREFETCH_SUFFIX}`, appDir);
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 nextServerFile = (0, resolve_from_1.default)(projectDir, `${(0, utils_1.getNextServerPath)(nextVersion)}/next-server.js`);
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, 'next-server.js.nft.json'), 'utf8'));
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
- appRouterPages.push(page);
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__', `${(0, utils_1.getNextServerPath)(nextVersion)}/next-server.js`);
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, '/index.prefetch.rsc'),
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${APP_PREFETCH_SUFFIX}`),
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${APP_PREFETCH_SUFFIX}`),
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, `/(.+?)${APP_PREFETCH_SUFFIX}(?:/)?$`)}`,
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 || 'text/x-component';
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.2",
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.1.1",
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",