@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 +111 -0
- package/dist/server-build.js +108 -0
- package/dist/utils.js +3 -0
- package/package.json +5 -4
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
|
package/dist/server-build.js
CHANGED
@@ -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
|
+
"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": "
|
29
|
+
"@vercel/build-utils": "7.0.0",
|
30
30
|
"@vercel/nft": "0.22.5",
|
31
|
-
"@vercel/routing-utils": "
|
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",
|