@vercel/next 4.6.2 → 4.7.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
@@ -12806,6 +12806,127 @@ function normalizeEdgeFunctionPath(shortPath, appPathRoutesManifest) {
12806
12806
  }
12807
12807
  return shortPath;
12808
12808
  }
12809
+ async function getNodeMiddleware({
12810
+ config,
12811
+ baseDir,
12812
+ projectDir,
12813
+ entryPath,
12814
+ nextVersion,
12815
+ nodeVersion,
12816
+ lstatSema,
12817
+ lstatResults,
12818
+ pageExtensions,
12819
+ routesManifest,
12820
+ outputDirectory,
12821
+ prerenderBypassToken,
12822
+ isCorrectMiddlewareOrder,
12823
+ functionsConfigManifest,
12824
+ requiredServerFilesManifest
12825
+ }) {
12826
+ const middlewareFunctionConfig = functionsConfigManifest?.functions["/_middleware"];
12827
+ if (!middlewareFunctionConfig || !middlewareFunctionConfig.matchers) {
12828
+ return null;
12829
+ }
12830
+ const routes = [];
12831
+ const routeMatchers = getRouteMatchers(
12832
+ { matchers: middlewareFunctionConfig.matchers },
12833
+ routesManifest
12834
+ );
12835
+ for (const matcher of routeMatchers) {
12836
+ const route = {
12837
+ continue: true,
12838
+ src: matcher.regexp,
12839
+ has: matcher.has,
12840
+ missing: [
12841
+ {
12842
+ type: "header",
12843
+ key: "x-prerender-revalidate",
12844
+ value: prerenderBypassToken
12845
+ },
12846
+ ...matcher.missing || []
12847
+ ]
12848
+ };
12849
+ route.middlewarePath = "/_middleware";
12850
+ route.middlewareRawSrc = matcher.originalSource ? [matcher.originalSource] : [];
12851
+ if (isCorrectMiddlewareOrder) {
12852
+ route.override = true;
12853
+ }
12854
+ routes.push(route);
12855
+ }
12856
+ const sourceFile = await getSourceFilePathFromPage({
12857
+ workPath: entryPath,
12858
+ page: normalizeSourceFilePageFromManifest("/middleware", "middleware", {}),
12859
+ pageExtensions
12860
+ });
12861
+ const vercelConfigOpts = await (0, import_build_utils.getLambdaOptionsFromFunction)({
12862
+ sourceFile,
12863
+ config
12864
+ });
12865
+ const middlewareFile = import_path2.default.join(
12866
+ entryPath,
12867
+ outputDirectory,
12868
+ "server",
12869
+ "middleware.js"
12870
+ );
12871
+ const middlewareTrace = `${middlewareFile}.nft.json`;
12872
+ const middlewareTraceDir = import_path2.default.dirname(middlewareTrace);
12873
+ const { files } = JSON.parse(await import_fs_extra3.default.readFile(middlewareTrace, "utf8"));
12874
+ const fileList = [];
12875
+ const normalizedBaseDir = `${baseDir}${baseDir.endsWith(import_path2.default.sep) ? "" : import_path2.default.sep}`;
12876
+ files.forEach((file) => {
12877
+ const absolutePath = import_path2.default.join(middlewareTraceDir, file);
12878
+ if (absolutePath.startsWith(normalizedBaseDir)) {
12879
+ fileList.push(import_path2.default.relative(baseDir, absolutePath));
12880
+ } else {
12881
+ console.log("outside base dir", absolutePath);
12882
+ }
12883
+ });
12884
+ const reasons = /* @__PURE__ */ new Map();
12885
+ const tracedFiles = {};
12886
+ await Promise.all(
12887
+ fileList.map(
12888
+ collectTracedFiles(baseDir, lstatResults, lstatSema, reasons, tracedFiles)
12889
+ )
12890
+ );
12891
+ const launcherData = (await import_fs_extra3.default.readFile(import_path2.default.join(__dirname, "middleware-launcher.js"), "utf8")).replace(
12892
+ /(?:var|const) conf = __NEXT_CONFIG__/,
12893
+ `const conf = ${JSON.stringify({
12894
+ ...requiredServerFilesManifest.config,
12895
+ distDir: import_path2.default.relative(
12896
+ projectDir,
12897
+ import_path2.default.join(entryPath, outputDirectory)
12898
+ )
12899
+ })}`
12900
+ ).replace("__NEXT_MIDDLEWARE_PATH__", `./.next/server/middleware.js`);
12901
+ const lambda = new import_build_utils.NodejsLambda({
12902
+ ...vercelConfigOpts,
12903
+ runtime: nodeVersion,
12904
+ handler: import_path2.default.join(
12905
+ import_path2.default.relative(baseDir, projectDir),
12906
+ "___next_launcher.cjs"
12907
+ ),
12908
+ useWebApi: true,
12909
+ shouldAddHelpers: false,
12910
+ shouldAddSourcemapSupport: false,
12911
+ framework: {
12912
+ slug: "nextjs",
12913
+ version: nextVersion
12914
+ },
12915
+ files: {
12916
+ ...tracedFiles,
12917
+ [import_path2.default.relative(baseDir, middlewareFile)]: new import_build_utils.FileFsRef({
12918
+ fsPath: middlewareFile
12919
+ }),
12920
+ [import_path2.default.join(import_path2.default.relative(baseDir, projectDir), "___next_launcher.cjs")]: new import_build_utils.FileBlob({ data: launcherData })
12921
+ }
12922
+ });
12923
+ return {
12924
+ routes,
12925
+ lambdas: {
12926
+ _middleware: lambda
12927
+ }
12928
+ };
12929
+ }
12809
12930
  async function getMiddlewareBundle({
12810
12931
  entryPath,
12811
12932
  outputDirectory,
@@ -14732,6 +14853,23 @@ ${JSON.stringify(
14732
14853
  true
14733
14854
  )];
14734
14855
  });
14856
+ const nodeMiddleware = await getNodeMiddleware({
14857
+ config,
14858
+ baseDir,
14859
+ projectDir,
14860
+ entryPath,
14861
+ nextVersion,
14862
+ nodeVersion: nodeVersion.runtime,
14863
+ lstatSema,
14864
+ lstatResults,
14865
+ pageExtensions: requiredServerFilesManifest.config.pageExtensions,
14866
+ routesManifest,
14867
+ outputDirectory,
14868
+ prerenderBypassToken: prerenderManifest.bypassToken,
14869
+ isCorrectMiddlewareOrder,
14870
+ functionsConfigManifest,
14871
+ requiredServerFilesManifest
14872
+ });
14735
14873
  const middleware = await getMiddlewareBundle({
14736
14874
  config,
14737
14875
  entryPath,
@@ -14742,7 +14880,7 @@ ${JSON.stringify(
14742
14880
  nextVersion,
14743
14881
  appPathRoutesManifest: appPathRoutesManifest || {}
14744
14882
  });
14745
- const isNextDataServerResolving = middleware.staticRoutes.length > 0 && import_semver3.default.gte(nextVersion, NEXT_DATA_MIDDLEWARE_RESOLVING_VERSION);
14883
+ const isNextDataServerResolving = (middleware.staticRoutes.length > 0 || nodeMiddleware) && import_semver3.default.gte(nextVersion, NEXT_DATA_MIDDLEWARE_RESOLVING_VERSION);
14746
14884
  const dynamicRoutes = await getDynamicRoutes({
14747
14885
  entryPath,
14748
14886
  entryDirectory,
@@ -14961,6 +15099,7 @@ ${JSON.stringify(
14961
15099
  ...staticDirectoryFiles,
14962
15100
  ...privateOutputs.files,
14963
15101
  ...middleware.edgeFunctions,
15102
+ ...nodeMiddleware?.lambdas,
14964
15103
  ...isNextDataServerResolving ? {
14965
15104
  __next_data_catchall: nextDataCatchallOutput
14966
15105
  } : {}
@@ -15093,7 +15232,7 @@ ${JSON.stringify(
15093
15232
  // middleware comes directly after redirects but before
15094
15233
  // beforeFiles rewrites as middleware is not a "file" route
15095
15234
  ...routesManifest?.skipMiddlewareUrlNormalize ? denormalizeNextDataRoute(true) : [],
15096
- ...isCorrectMiddlewareOrder ? middleware.staticRoutes : [],
15235
+ ...isCorrectMiddlewareOrder ? [...middleware.staticRoutes, ...nodeMiddleware?.routes || []] : [],
15097
15236
  ...routesManifest?.skipMiddlewareUrlNormalize ? normalizeNextDataRoute(true) : [],
15098
15237
  ...beforeFilesRewrites,
15099
15238
  // Make sure to 404 for the /404 path itself
@@ -15149,7 +15288,7 @@ ${JSON.stringify(
15149
15288
  // while middleware was in beta the order came right before
15150
15289
  // handle: 'filesystem' we maintain this for older versions
15151
15290
  // to prevent a local/deploy mismatch
15152
- ...!isCorrectMiddlewareOrder ? middleware.staticRoutes : [],
15291
+ ...!isCorrectMiddlewareOrder ? [...middleware.staticRoutes, ...nodeMiddleware?.routes || []] : [],
15153
15292
  ...appDir ? [
15154
15293
  ...isAppClientSegmentCacheEnabled && rscPrefetchHeader && prefetchSegmentHeader && prefetchSegmentDirSuffix && prefetchSegmentSuffix ? [
15155
15294
  {
@@ -15786,7 +15925,8 @@ var build = async (buildOptions) => {
15786
15925
  packageJsonPackageManager,
15787
15926
  nodeVersion,
15788
15927
  env: spawnOpts.env || {},
15789
- turboSupportsCorepackHome
15928
+ turboSupportsCorepackHome,
15929
+ projectCreatedAt: config.projectSettings?.createdAt
15790
15930
  });
15791
15931
  const nowJsonPath = await (0, import_find_up.default)(["now.json", "vercel.json"], {
15792
15932
  cwd: entryPath
@@ -15861,7 +16001,14 @@ var build = async (buildOptions) => {
15861
16001
  cwd: entryPath
15862
16002
  });
15863
16003
  } else {
15864
- await (0, import_build_utils3.runNpmInstall)(entryPath, [], spawnOpts, meta, nodeVersion);
16004
+ await (0, import_build_utils3.runNpmInstall)(
16005
+ entryPath,
16006
+ [],
16007
+ spawnOpts,
16008
+ meta,
16009
+ nodeVersion,
16010
+ config.projectSettings?.createdAt
16011
+ );
15865
16012
  }
15866
16013
  });
15867
16014
  } else {
@@ -15962,10 +16109,15 @@ More info: http://err.sh/vercel/vercel/next-functions-config-optimized-lambdas`
15962
16109
  env
15963
16110
  });
15964
16111
  } else if (buildScriptName) {
15965
- await (0, import_build_utils3.runPackageJsonScript)(entryPath, buildScriptName, {
15966
- ...spawnOpts,
15967
- env
15968
- });
16112
+ await (0, import_build_utils3.runPackageJsonScript)(
16113
+ entryPath,
16114
+ buildScriptName,
16115
+ {
16116
+ ...spawnOpts,
16117
+ env
16118
+ },
16119
+ config.projectSettings?.createdAt
16120
+ );
15969
16121
  }
15970
16122
  });
15971
16123
  (0, import_build_utils3.debug)("build command exited");
@@ -16367,7 +16519,8 @@ More info: http://err.sh/vercel/vercel/next-functions-config-optimized-lambdas`
16367
16519
  ["--production"],
16368
16520
  spawnOpts,
16369
16521
  meta,
16370
- nodeVersion
16522
+ nodeVersion,
16523
+ config.projectSettings?.createdAt
16371
16524
  );
16372
16525
  }
16373
16526
  if (process.env.NPM_AUTH_TOKEN) {
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+
3
+ // src/vercel-request-context.ts
4
+ var SYMBOL_FOR_REQ_CONTEXT = Symbol.for("@vercel/request-context");
5
+ function getContext() {
6
+ const fromSymbol = globalThis;
7
+ return fromSymbol[SYMBOL_FOR_REQ_CONTEXT]?.get?.() ?? {};
8
+ }
9
+
10
+ // src/next-request-context.ts
11
+ var import_async_hooks = require("async_hooks");
12
+ var name = "@next/request-context";
13
+ var NEXT_REQUEST_CONTEXT_SYMBOL = Symbol.for(name);
14
+ var INTERNAL_STORAGE_FIELD_SYMBOL = Symbol.for("internal.storage");
15
+ function getOrCreateContextSingleton() {
16
+ const _globalThis = globalThis;
17
+ if (!_globalThis[NEXT_REQUEST_CONTEXT_SYMBOL]) {
18
+ const storage = new import_async_hooks.AsyncLocalStorage();
19
+ const Context = {
20
+ get: () => storage.getStore(),
21
+ [INTERNAL_STORAGE_FIELD_SYMBOL]: storage
22
+ };
23
+ _globalThis[NEXT_REQUEST_CONTEXT_SYMBOL] = Context;
24
+ }
25
+ return _globalThis[NEXT_REQUEST_CONTEXT_SYMBOL];
26
+ }
27
+ var NextRequestContext = getOrCreateContextSingleton();
28
+ function withNextRequestContext(value, callback) {
29
+ const storage = NextRequestContext[INTERNAL_STORAGE_FIELD_SYMBOL];
30
+ return storage.run(value, callback);
31
+ }
32
+
33
+ // src/edge-function-source/to-plain-headers.ts
34
+ function toPlainHeaders(headers) {
35
+ const result = {};
36
+ if (!headers)
37
+ return result;
38
+ headers.forEach((value, key) => {
39
+ result[key] = value;
40
+ if (key.toLowerCase() === "set-cookie") {
41
+ result[key] = splitCookiesString(value);
42
+ }
43
+ });
44
+ return result;
45
+ }
46
+ function splitCookiesString(cookiesString) {
47
+ const cookiesStrings = [];
48
+ let pos = 0;
49
+ let start;
50
+ let ch;
51
+ let lastComma;
52
+ let nextStart;
53
+ let cookiesSeparatorFound;
54
+ function skipWhitespace() {
55
+ while (pos < cookiesString.length && /\s/.test(cookiesString.charAt(pos)))
56
+ pos += 1;
57
+ return pos < cookiesString.length;
58
+ }
59
+ function notSpecialChar() {
60
+ ch = cookiesString.charAt(pos);
61
+ return ch !== "=" && ch !== ";" && ch !== ",";
62
+ }
63
+ while (pos < cookiesString.length) {
64
+ start = pos;
65
+ cookiesSeparatorFound = false;
66
+ while (skipWhitespace()) {
67
+ ch = cookiesString.charAt(pos);
68
+ if (ch === ",") {
69
+ lastComma = pos;
70
+ pos += 1;
71
+ skipWhitespace();
72
+ nextStart = pos;
73
+ while (pos < cookiesString.length && notSpecialChar()) {
74
+ pos += 1;
75
+ }
76
+ if (pos < cookiesString.length && cookiesString.charAt(pos) === "=") {
77
+ cookiesSeparatorFound = true;
78
+ pos = nextStart;
79
+ cookiesStrings.push(cookiesString.substring(start, lastComma));
80
+ start = pos;
81
+ } else {
82
+ pos = lastComma + 1;
83
+ }
84
+ } else {
85
+ pos += 1;
86
+ }
87
+ }
88
+ if (!cookiesSeparatorFound || pos >= cookiesString.length) {
89
+ cookiesStrings.push(cookiesString.substring(start, cookiesString.length));
90
+ }
91
+ }
92
+ return cookiesStrings;
93
+ }
94
+
95
+ // src/middleware-launcher.ts
96
+ process.chdir(__dirname);
97
+ var region = process.env.VERCEL_REGION || process.env.NOW_REGION;
98
+ if (!process.env.NODE_ENV) {
99
+ process.env.NODE_ENV = region === "dev1" ? "development" : "production";
100
+ }
101
+ if (process.env.NODE_ENV !== "production" && region !== "dev1") {
102
+ console.warn(
103
+ `Warning: NODE_ENV was incorrectly set to "${process.env.NODE_ENV}", this value is being overridden to "production"`
104
+ );
105
+ process.env.NODE_ENV = "production";
106
+ }
107
+ var conf = __NEXT_CONFIG__;
108
+ globalThis.AsyncLocalStorage = require("async_hooks").AsyncLocalStorage;
109
+ var middlewareHandler = require("__NEXT_MIDDLEWARE_PATH__").default;
110
+ var serve = async (request) => {
111
+ try {
112
+ const context = getContext();
113
+ return await withNextRequestContext(
114
+ { waitUntil: context.waitUntil },
115
+ async () => {
116
+ const result = await middlewareHandler({
117
+ request: {
118
+ url: request.url,
119
+ method: request.method,
120
+ headers: toPlainHeaders(request.headers),
121
+ nextConfig: conf,
122
+ page: "/middleware",
123
+ body: request.method !== "GET" && request.method !== "HEAD" ? request.body : void 0,
124
+ waitUntil: context.waitUntil
125
+ }
126
+ });
127
+ if (result.waitUntil && context.waitUntil) {
128
+ context.waitUntil(result.waitUntil);
129
+ }
130
+ return result.response;
131
+ }
132
+ );
133
+ } catch (err) {
134
+ console.error(err);
135
+ process.exit(1);
136
+ }
137
+ };
138
+ module.exports = serve;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vercel/next",
3
- "version": "4.6.2",
3
+ "version": "4.7.1",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index",
6
6
  "homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js",
@@ -30,7 +30,7 @@
30
30
  "@types/semver": "6.0.0",
31
31
  "@types/text-table": "0.2.1",
32
32
  "@types/webpack-sources": "3.2.0",
33
- "@vercel/build-utils": "10.0.1",
33
+ "@vercel/build-utils": "10.2.0",
34
34
  "@vercel/routing-utils": "5.0.4",
35
35
  "async-sema": "3.0.1",
36
36
  "buffer-crc32": "0.2.13",