@vercel/next 3.9.4 → 4.0.1

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
@@ -43126,11 +43126,14 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
43126
43126
  inversedAppPathManifest[appPathRoutesManifest[ogRoute]] = ogRoute;
43127
43127
  }
43128
43128
  }
43129
+ const APP_PREFETCH_SUFFIX = '.prefetch.rsc';
43130
+ let appRscPrefetches = {};
43129
43131
  let appBuildTraces = {};
43130
43132
  let appDir = null;
43131
43133
  if (appPathRoutesManifest) {
43132
43134
  appDir = path_1.default.join(pagesDir, '../app');
43133
43135
  appBuildTraces = await (0, build_utils_1.glob)('**/*.js.nft.json', appDir);
43136
+ appRscPrefetches = await (0, build_utils_1.glob)(`**/*${APP_PREFETCH_SUFFIX}`, appDir);
43134
43137
  }
43135
43138
  const isCorrectNotFoundRoutes = semver_1.default.gte(nextVersion, CORRECT_NOT_FOUND_ROUTES_VERSION);
43136
43139
  const isCorrectMiddlewareOrder = semver_1.default.gte(nextVersion, CORRECT_MIDDLEWARE_ORDER_VERSION);
@@ -43802,6 +43805,7 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
43802
43805
  }
43803
43806
  }
43804
43807
  const rscHeader = routesManifest.rsc?.header?.toLowerCase() || '__rsc__';
43808
+ const rscPrefetchHeader = routesManifest.rsc?.prefetchHeader?.toLowerCase();
43805
43809
  const rscVaryHeader = routesManifest?.rsc?.varyHeader ||
43806
43810
  'RSC, Next-Router-State-Tree, Next-Router-Prefetch';
43807
43811
  const appNotFoundPath = path_1.default.posix.join('.', entryDirectory, '_not-found');
@@ -43811,6 +43815,7 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
43811
43815
  output: {
43812
43816
  ...publicDirectoryFiles,
43813
43817
  ...lambdas,
43818
+ ...appRscPrefetches,
43814
43819
  // Prerenders may override Lambdas -- this is an intentional behavior.
43815
43820
  ...prerenders,
43816
43821
  ...staticPages,
@@ -43992,6 +43997,36 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
43992
43997
  ...(!isCorrectMiddlewareOrder ? middleware.staticRoutes : []),
43993
43998
  ...(appDir
43994
43999
  ? [
44000
+ ...(rscPrefetchHeader
44001
+ ? [
44002
+ {
44003
+ src: `^${path_1.default.posix.join('/', entryDirectory, '/')}`,
44004
+ has: [
44005
+ {
44006
+ type: 'header',
44007
+ key: rscPrefetchHeader,
44008
+ },
44009
+ ],
44010
+ dest: path_1.default.posix.join('/', entryDirectory, '/index.prefetch.rsc'),
44011
+ headers: { vary: rscVaryHeader },
44012
+ continue: true,
44013
+ override: true,
44014
+ },
44015
+ {
44016
+ src: `^${path_1.default.posix.join('/', entryDirectory, '/((?!.+\\.rsc).+?)(?:/)?$')}`,
44017
+ has: [
44018
+ {
44019
+ type: 'header',
44020
+ key: rscPrefetchHeader,
44021
+ },
44022
+ ],
44023
+ dest: path_1.default.posix.join('/', entryDirectory, `/$1${APP_PREFETCH_SUFFIX}`),
44024
+ headers: { vary: rscVaryHeader },
44025
+ continue: true,
44026
+ override: true,
44027
+ },
44028
+ ]
44029
+ : []),
43995
44030
  {
43996
44031
  src: `^${path_1.default.posix.join('/', entryDirectory, '/')}`,
43997
44032
  has: [
@@ -44047,9 +44082,82 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
44047
44082
  },
44048
44083
  ]
44049
44084
  : []),
44085
+ ...(rscPrefetchHeader
44086
+ ? [
44087
+ {
44088
+ src: path_1.default.posix.join('/', entryDirectory, `/index${APP_PREFETCH_SUFFIX}`),
44089
+ dest: path_1.default.posix.join('/', entryDirectory, '/index.rsc'),
44090
+ has: [
44091
+ {
44092
+ type: 'header',
44093
+ key: rscPrefetchHeader,
44094
+ },
44095
+ ],
44096
+ continue: true,
44097
+ override: true,
44098
+ },
44099
+ {
44100
+ src: `^${path_1.default.posix.join('/', entryDirectory, `/(.+?)${APP_PREFETCH_SUFFIX}(?:/)?$`)}`,
44101
+ dest: path_1.default.posix.join('/', entryDirectory, '/$1.rsc'),
44102
+ has: [
44103
+ {
44104
+ type: 'header',
44105
+ key: rscPrefetchHeader,
44106
+ },
44107
+ ],
44108
+ continue: true,
44109
+ override: true,
44110
+ },
44111
+ ]
44112
+ : []),
44113
+ ...(appDir
44114
+ ? [
44115
+ // check routes that end in `.rsc` to see if a page with the resulting name (sans-.rsc) exists in the filesystem
44116
+ // if so, we want to match that page instead. (This matters when prefetching a pages route while on an appdir route)
44117
+ {
44118
+ src: `^${path_1.default.posix.join('/', entryDirectory, '/(.*)\\.rsc$')}`,
44119
+ dest: path_1.default.posix.join('/', entryDirectory, '/$1'),
44120
+ has: [
44121
+ {
44122
+ type: 'header',
44123
+ key: rscHeader,
44124
+ },
44125
+ ],
44126
+ ...(rscPrefetchHeader
44127
+ ? {
44128
+ missing: [
44129
+ {
44130
+ type: 'header',
44131
+ key: rscPrefetchHeader,
44132
+ },
44133
+ ],
44134
+ }
44135
+ : {}),
44136
+ check: true,
44137
+ },
44138
+ ]
44139
+ : []),
44050
44140
  // These need to come before handle: miss or else they are grouped
44051
44141
  // with that routing section
44052
44142
  ...afterFilesRewrites,
44143
+ ...(appDir
44144
+ ? [
44145
+ // rewrite route back to `.rsc`, but skip checking fs
44146
+ {
44147
+ src: `^${path_1.default.posix.join('/', entryDirectory, '/((?!.+\\.rsc).+?)(?:/)?$')}`,
44148
+ has: [
44149
+ {
44150
+ type: 'header',
44151
+ key: rscHeader,
44152
+ },
44153
+ ],
44154
+ dest: path_1.default.posix.join('/', entryDirectory, '/$1.rsc'),
44155
+ headers: { vary: rscVaryHeader },
44156
+ continue: true,
44157
+ override: true,
44158
+ },
44159
+ ]
44160
+ : []),
44053
44161
  // make sure 404 page is used when a directory is matched without
44054
44162
  // an index page
44055
44163
  { handle: 'resource' },
@@ -45654,6 +45762,9 @@ const onPrerenderRoute = (prerenderRouteArgs) => (routeKey, { isBlocking, isFall
45654
45762
  ? dataRoute
45655
45763
  : routeFileNoExt + '.json'}`),
45656
45764
  });
45765
+ if (isOmittedOrNotFound) {
45766
+ initialStatus = 404;
45767
+ }
45657
45768
  if (isAppPathRoute) {
45658
45769
  // for literal index routes we need to append an additional /index
45659
45770
  // due to the proxy's normalizing for /index routes
@@ -39,11 +39,14 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
39
39
  inversedAppPathManifest[appPathRoutesManifest[ogRoute]] = ogRoute;
40
40
  }
41
41
  }
42
+ const APP_PREFETCH_SUFFIX = '.prefetch.rsc';
43
+ let appRscPrefetches = {};
42
44
  let appBuildTraces = {};
43
45
  let appDir = null;
44
46
  if (appPathRoutesManifest) {
45
47
  appDir = path_1.default.join(pagesDir, '../app');
46
48
  appBuildTraces = await (0, build_utils_1.glob)('**/*.js.nft.json', appDir);
49
+ appRscPrefetches = await (0, build_utils_1.glob)(`**/*${APP_PREFETCH_SUFFIX}`, appDir);
47
50
  }
48
51
  const isCorrectNotFoundRoutes = semver_1.default.gte(nextVersion, CORRECT_NOT_FOUND_ROUTES_VERSION);
49
52
  const isCorrectMiddlewareOrder = semver_1.default.gte(nextVersion, CORRECT_MIDDLEWARE_ORDER_VERSION);
@@ -715,6 +718,7 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
715
718
  }
716
719
  }
717
720
  const rscHeader = routesManifest.rsc?.header?.toLowerCase() || '__rsc__';
721
+ const rscPrefetchHeader = routesManifest.rsc?.prefetchHeader?.toLowerCase();
718
722
  const rscVaryHeader = routesManifest?.rsc?.varyHeader ||
719
723
  'RSC, Next-Router-State-Tree, Next-Router-Prefetch';
720
724
  const appNotFoundPath = path_1.default.posix.join('.', entryDirectory, '_not-found');
@@ -724,6 +728,7 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
724
728
  output: {
725
729
  ...publicDirectoryFiles,
726
730
  ...lambdas,
731
+ ...appRscPrefetches,
727
732
  // Prerenders may override Lambdas -- this is an intentional behavior.
728
733
  ...prerenders,
729
734
  ...staticPages,
@@ -905,6 +910,36 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
905
910
  ...(!isCorrectMiddlewareOrder ? middleware.staticRoutes : []),
906
911
  ...(appDir
907
912
  ? [
913
+ ...(rscPrefetchHeader
914
+ ? [
915
+ {
916
+ src: `^${path_1.default.posix.join('/', entryDirectory, '/')}`,
917
+ has: [
918
+ {
919
+ type: 'header',
920
+ key: rscPrefetchHeader,
921
+ },
922
+ ],
923
+ dest: path_1.default.posix.join('/', entryDirectory, '/index.prefetch.rsc'),
924
+ headers: { vary: rscVaryHeader },
925
+ continue: true,
926
+ override: true,
927
+ },
928
+ {
929
+ src: `^${path_1.default.posix.join('/', entryDirectory, '/((?!.+\\.rsc).+?)(?:/)?$')}`,
930
+ has: [
931
+ {
932
+ type: 'header',
933
+ key: rscPrefetchHeader,
934
+ },
935
+ ],
936
+ dest: path_1.default.posix.join('/', entryDirectory, `/$1${APP_PREFETCH_SUFFIX}`),
937
+ headers: { vary: rscVaryHeader },
938
+ continue: true,
939
+ override: true,
940
+ },
941
+ ]
942
+ : []),
908
943
  {
909
944
  src: `^${path_1.default.posix.join('/', entryDirectory, '/')}`,
910
945
  has: [
@@ -960,9 +995,82 @@ async function serverBuild({ dynamicPages, pagesDir, config = {}, functionsConfi
960
995
  },
961
996
  ]
962
997
  : []),
998
+ ...(rscPrefetchHeader
999
+ ? [
1000
+ {
1001
+ src: path_1.default.posix.join('/', entryDirectory, `/index${APP_PREFETCH_SUFFIX}`),
1002
+ dest: path_1.default.posix.join('/', entryDirectory, '/index.rsc'),
1003
+ has: [
1004
+ {
1005
+ type: 'header',
1006
+ key: rscPrefetchHeader,
1007
+ },
1008
+ ],
1009
+ continue: true,
1010
+ override: true,
1011
+ },
1012
+ {
1013
+ src: `^${path_1.default.posix.join('/', entryDirectory, `/(.+?)${APP_PREFETCH_SUFFIX}(?:/)?$`)}`,
1014
+ dest: path_1.default.posix.join('/', entryDirectory, '/$1.rsc'),
1015
+ has: [
1016
+ {
1017
+ type: 'header',
1018
+ key: rscPrefetchHeader,
1019
+ },
1020
+ ],
1021
+ continue: true,
1022
+ override: true,
1023
+ },
1024
+ ]
1025
+ : []),
1026
+ ...(appDir
1027
+ ? [
1028
+ // check routes that end in `.rsc` to see if a page with the resulting name (sans-.rsc) exists in the filesystem
1029
+ // if so, we want to match that page instead. (This matters when prefetching a pages route while on an appdir route)
1030
+ {
1031
+ src: `^${path_1.default.posix.join('/', entryDirectory, '/(.*)\\.rsc$')}`,
1032
+ dest: path_1.default.posix.join('/', entryDirectory, '/$1'),
1033
+ has: [
1034
+ {
1035
+ type: 'header',
1036
+ key: rscHeader,
1037
+ },
1038
+ ],
1039
+ ...(rscPrefetchHeader
1040
+ ? {
1041
+ missing: [
1042
+ {
1043
+ type: 'header',
1044
+ key: rscPrefetchHeader,
1045
+ },
1046
+ ],
1047
+ }
1048
+ : {}),
1049
+ check: true,
1050
+ },
1051
+ ]
1052
+ : []),
963
1053
  // These need to come before handle: miss or else they are grouped
964
1054
  // with that routing section
965
1055
  ...afterFilesRewrites,
1056
+ ...(appDir
1057
+ ? [
1058
+ // rewrite route back to `.rsc`, but skip checking fs
1059
+ {
1060
+ src: `^${path_1.default.posix.join('/', entryDirectory, '/((?!.+\\.rsc).+?)(?:/)?$')}`,
1061
+ has: [
1062
+ {
1063
+ type: 'header',
1064
+ key: rscHeader,
1065
+ },
1066
+ ],
1067
+ dest: path_1.default.posix.join('/', entryDirectory, '/$1.rsc'),
1068
+ headers: { vary: rscVaryHeader },
1069
+ continue: true,
1070
+ override: true,
1071
+ },
1072
+ ]
1073
+ : []),
966
1074
  // make sure 404 page is used when a directory is matched without
967
1075
  // an index page
968
1076
  { handle: 'resource' },
package/dist/utils.js CHANGED
@@ -1249,6 +1249,9 @@ const onPrerenderRoute = (prerenderRouteArgs) => (routeKey, { isBlocking, isFall
1249
1249
  ? dataRoute
1250
1250
  : routeFileNoExt + '.json'}`),
1251
1251
  });
1252
+ if (isOmittedOrNotFound) {
1253
+ initialStatus = 404;
1254
+ }
1252
1255
  if (isAppPathRoute) {
1253
1256
  // for literal index routes we need to append an additional /index
1254
1257
  // due to the proxy's normalizing for /index routes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vercel/next",
3
- "version": "3.9.4",
3
+ "version": "4.0.1",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index",
6
6
  "homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js",
@@ -26,9 +26,9 @@
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": "6.8.3",
29
+ "@vercel/build-utils": "7.0.0",
30
30
  "@vercel/nft": "0.22.5",
31
- "@vercel/routing-utils": "2.2.1",
31
+ "@vercel/routing-utils": "3.0.0",
32
32
  "async-sema": "3.0.1",
33
33
  "buffer-crc32": "0.2.13",
34
34
  "bytes": "3.1.2",
@@ -40,6 +40,7 @@
40
40
  "find-up": "4.1.0",
41
41
  "fs-extra": "7.0.0",
42
42
  "get-port": "5.0.0",
43
+ "jest-junit": "16.0.0",
43
44
  "nanoid": "3.3.4",
44
45
  "ndjson": "2.0.0",
45
46
  "pretty-bytes": "5.3.0",
@@ -54,7 +55,7 @@
54
55
  "scripts": {
55
56
  "build": "node build.js",
56
57
  "build-dev": "node build.js --dev",
57
- "test": "jest --env node --verbose --bail --runInBand --testTimeout=360000",
58
+ "test": "jest --reporters=default --reporters=jest-junit --env node --verbose --bail --runInBand --testTimeout=360000",
58
59
  "test-unit": "pnpm test test/unit/",
59
60
  "test-next-local": "pnpm test test/integration/*.test.js test/integration/*.test.ts",
60
61
  "test-next-local:middleware": "pnpm test test/integration/middleware.test.ts",