@vercel/build-utils 9.0.0 → 9.1.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @vercel/build-utils
2
2
 
3
+ ## 9.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Add `useWebApi` property to `NodejsLambda` class ([#12873](https://github.com/vercel/vercel/pull/12873))
8
+
9
+ - [build-utils] convert NodeVersion to class and add state getter ([#12883](https://github.com/vercel/vercel/pull/12883))
10
+ [ruby] convert RubyVersion to class and add state getter
11
+
12
+ ## 9.0.1
13
+
14
+ ### Patch Changes
15
+
16
+ - Revert build utils refactor ([#12818](https://github.com/vercel/vercel/pull/12818))
17
+
3
18
  ## 9.0.0
4
19
 
5
20
  ### Major Changes
@@ -37,42 +37,55 @@ __export(node_version_exports, {
37
37
  module.exports = __toCommonJS(node_version_exports);
38
38
  var import_fs = require("fs");
39
39
  var import_semver = require("semver");
40
+ var import_types = require("../types");
40
41
  var import_errors = require("../errors");
41
42
  var import_debug = __toESM(require("../debug"));
42
43
  const NODE_VERSIONS = [
43
- { major: 22, range: "22.x", runtime: "nodejs22.x" },
44
- { major: 20, range: "20.x", runtime: "nodejs20.x" },
45
- { major: 18, range: "18.x", runtime: "nodejs18.x" },
46
- {
44
+ new import_types.NodeVersion({
45
+ major: 22,
46
+ range: "22.x",
47
+ runtime: "nodejs22.x"
48
+ }),
49
+ new import_types.NodeVersion({
50
+ major: 20,
51
+ range: "20.x",
52
+ runtime: "nodejs20.x"
53
+ }),
54
+ new import_types.NodeVersion({
55
+ major: 18,
56
+ range: "18.x",
57
+ runtime: "nodejs18.x"
58
+ }),
59
+ new import_types.NodeVersion({
47
60
  major: 16,
48
61
  range: "16.x",
49
62
  runtime: "nodejs16.x",
50
63
  discontinueDate: /* @__PURE__ */ new Date("2025-01-31")
51
- },
52
- {
64
+ }),
65
+ new import_types.NodeVersion({
53
66
  major: 14,
54
67
  range: "14.x",
55
68
  runtime: "nodejs14.x",
56
69
  discontinueDate: /* @__PURE__ */ new Date("2023-08-15")
57
- },
58
- {
70
+ }),
71
+ new import_types.NodeVersion({
59
72
  major: 12,
60
73
  range: "12.x",
61
74
  runtime: "nodejs12.x",
62
75
  discontinueDate: /* @__PURE__ */ new Date("2022-10-03")
63
- },
64
- {
76
+ }),
77
+ new import_types.NodeVersion({
65
78
  major: 10,
66
79
  range: "10.x",
67
80
  runtime: "nodejs10.x",
68
81
  discontinueDate: /* @__PURE__ */ new Date("2021-04-20")
69
- },
70
- {
82
+ }),
83
+ new import_types.NodeVersion({
71
84
  major: 8,
72
85
  range: "8.10.x",
73
86
  runtime: "nodejs8.10",
74
87
  discontinueDate: /* @__PURE__ */ new Date("2020-01-06")
75
- }
88
+ })
76
89
  ];
77
90
  function getOptions() {
78
91
  return NODE_VERSIONS;
@@ -105,7 +118,9 @@ function getLatestNodeVersion(availableVersions) {
105
118
  return all[0];
106
119
  }
107
120
  function getDiscontinuedNodeVersions() {
108
- return getOptions().filter(isDiscontinued);
121
+ return getOptions().filter((version) => {
122
+ return version.state === "discontinued";
123
+ });
109
124
  }
110
125
  async function getSupportedNodeVersion(engineRange, isAuto = false, availableVersions) {
111
126
  let selection;
@@ -128,7 +143,7 @@ async function getSupportedNodeVersion(engineRange, isAuto = false, availableVer
128
143
  if (!selection) {
129
144
  selection = getLatestNodeVersion(availableVersions);
130
145
  }
131
- if (isDiscontinued(selection)) {
146
+ if (selection.state === "discontinued") {
132
147
  const intro = `Node.js Version "${selection.range}" is discontinued and must be upgraded.`;
133
148
  throw new import_errors.NowBuildError({
134
149
  code: "BUILD_UTILS_NODE_VERSION_DISCONTINUED",
@@ -137,20 +152,24 @@ async function getSupportedNodeVersion(engineRange, isAuto = false, availableVer
137
152
  });
138
153
  }
139
154
  (0, import_debug.default)(`Selected Node.js ${selection.range}`);
140
- if (selection.discontinueDate) {
141
- const d = selection.discontinueDate.toISOString().split("T")[0];
142
- console.warn(
143
- `Error: Node.js version ${selection.range} has reached End-of-Life. Deployments created on or after ${d} will fail to build. ${getHint(
144
- isAuto
145
- )}`
146
- );
155
+ if (selection.state === "deprecated") {
156
+ const d = selection.formattedDate;
157
+ if (d) {
158
+ console.warn(
159
+ `Error: Node.js version ${selection.range} is deprecated. Deployments created on or after ${d} will fail to build. ${getHint(
160
+ isAuto
161
+ )}`
162
+ );
163
+ } else {
164
+ console.warn(
165
+ `Error: Node.js version ${selection.range} is deprecated. ${getHint(
166
+ isAuto
167
+ )}`
168
+ );
169
+ }
147
170
  }
148
171
  return selection;
149
172
  }
150
- function isDiscontinued({ discontinueDate }) {
151
- const today = Date.now();
152
- return discontinueDate !== void 0 && discontinueDate.getTime() <= today;
153
- }
154
173
  // Annotate the CommonJS export names for ESM import in node:
155
174
  0 && (module.exports = {
156
175
  NODE_VERSIONS,
@@ -37,11 +37,6 @@ export interface ScanParentDirsResult {
37
37
  * `undefined` if not a Turborepo project.
38
38
  */
39
39
  turboSupportsCorepackHome?: boolean;
40
- /**
41
- * Name of the lockfile (`yarn.lock`, `package-lock.json`, ...) detected
42
- * or `undefined` if no lockfile was detected.
43
- */
44
- detectedLockfile?: string;
45
40
  }
46
41
  export interface TraverseUpDirectoriesProps {
47
42
  /**
@@ -102,7 +97,7 @@ export declare function runNpmInstall(destPath: string, args?: string[], spawnOp
102
97
  * Prepares the input environment based on the used package manager and lockfile
103
98
  * versions.
104
99
  */
105
- export declare function getEnvForPackageManager({ cliType, lockfileVersion, packageJsonPackageManager, nodeVersion, env, packageJsonEngines, turboSupportsCorepackHome, detectedLockfile, }: {
100
+ export declare function getEnvForPackageManager({ cliType, lockfileVersion, packageJsonPackageManager, nodeVersion, env, packageJsonEngines, turboSupportsCorepackHome, }: {
106
101
  cliType: CliType;
107
102
  lockfileVersion: number | undefined;
108
103
  packageJsonPackageManager?: string | undefined;
@@ -112,7 +107,6 @@ export declare function getEnvForPackageManager({ cliType, lockfileVersion, pack
112
107
  };
113
108
  packageJsonEngines?: PackageJson.Engines;
114
109
  turboSupportsCorepackHome?: boolean | undefined;
115
- detectedLockfile: string | undefined;
116
110
  }): {
117
111
  [x: string]: string | undefined;
118
112
  };
@@ -120,14 +114,13 @@ export declare function getEnvForPackageManager({ cliType, lockfileVersion, pack
120
114
  * Helper to get the binary paths that link to the used package manager.
121
115
  * Note: Make sure it doesn't contain any `console.log` calls.
122
116
  */
123
- export declare function getPathOverrideForPackageManager({ cliType, lockfileVersion, corepackPackageManager, corepackEnabled, packageJsonEngines, detectedLockfile, }: {
117
+ export declare function getPathOverrideForPackageManager({ cliType, lockfileVersion, corepackPackageManager, corepackEnabled, packageJsonEngines, }: {
124
118
  cliType: CliType;
125
119
  lockfileVersion: number | undefined;
126
120
  corepackPackageManager: string | undefined;
127
121
  nodeVersion: NodeVersion | undefined;
128
122
  corepackEnabled?: boolean;
129
123
  packageJsonEngines?: PackageJson.Engines;
130
- detectedLockfile?: string;
131
124
  }): {
132
125
  /**
133
126
  * Which lockfile was detected.
@@ -143,24 +136,24 @@ export declare function getPathOverrideForPackageManager({ cliType, lockfileVers
143
136
  */
144
137
  path: string | undefined;
145
138
  };
146
- export declare function detectPackageManager(cliType: CliType, lockfileVersion: number | undefined, detectedLockfile: string | undefined): {
139
+ export declare function detectPackageManager(cliType: CliType, lockfileVersion: number | undefined): {
147
140
  path: string;
148
- detectedLockfile: string | undefined;
141
+ detectedLockfile: string;
149
142
  detectedPackageManager: string;
150
143
  pnpmVersionRange: string;
151
144
  } | {
152
145
  path: undefined;
153
- detectedLockfile: string | undefined;
146
+ detectedLockfile: string;
154
147
  detectedPackageManager: string;
155
148
  pnpmVersionRange: string;
156
149
  } | {
157
150
  path: string;
158
- detectedLockfile: string | undefined;
151
+ detectedLockfile: string;
159
152
  detectedPackageManager: string;
160
153
  pnpmVersionRange?: undefined;
161
154
  } | {
162
155
  path: undefined;
163
- detectedLockfile: string | undefined;
156
+ detectedLockfile: string;
164
157
  detectedPackageManager: string;
165
158
  pnpmVersionRange?: undefined;
166
159
  } | undefined;
@@ -169,14 +162,13 @@ export declare function detectPackageManager(cliType: CliType, lockfileVersion:
169
162
  * Note: Make sure it doesn't contain any `console.log` calls.
170
163
  * @deprecated use `getEnvForPackageManager` instead
171
164
  */
172
- export declare function getPathForPackageManager({ cliType, lockfileVersion, nodeVersion, env, detectedLockfile, }: {
165
+ export declare function getPathForPackageManager({ cliType, lockfileVersion, nodeVersion, env, }: {
173
166
  cliType: CliType;
174
167
  lockfileVersion: number | undefined;
175
168
  nodeVersion: NodeVersion | undefined;
176
169
  env: {
177
170
  [x: string]: string | undefined;
178
171
  };
179
- detectedLockfile: string;
180
172
  }): {
181
173
  /**
182
174
  * Which lockfile was detected.
@@ -201,7 +201,8 @@ function getSpawnOptions(meta, nodeVersion) {
201
201
  async function getNodeVersion(destPath, fallbackVersion = process.env.VERCEL_PROJECT_SETTINGS_NODE_VERSION, config = {}, meta = {}, availableVersions = (0, import_node_version.getAvailableNodeVersions)()) {
202
202
  const latestVersion = (0, import_node_version.getLatestNodeVersion)(availableVersions);
203
203
  if (meta.isDev) {
204
- return { ...latestVersion, runtime: "nodejs" };
204
+ latestVersion.runtime = "nodejs";
205
+ return latestVersion;
205
206
  }
206
207
  const { packageJson } = await scanParentDirs(destPath, true);
207
208
  const configuredVersion = config.nodeVersion || fallbackVersion;
@@ -280,6 +281,7 @@ async function scanParentDirs(destPath, readPackageJson = false, base = "/") {
280
281
  if (bunLock && hasYarnLock) {
281
282
  cliType = "bun";
282
283
  lockfilePath = bunLockPath;
284
+ lockfileVersion = bunLockTextPath ? 1 : 0;
283
285
  } else if (hasYarnLock) {
284
286
  cliType = "yarn";
285
287
  lockfilePath = yarnLockPath;
@@ -294,6 +296,7 @@ async function scanParentDirs(destPath, readPackageJson = false, base = "/") {
294
296
  } else if (bunLock) {
295
297
  cliType = "bun";
296
298
  lockfilePath = bunLockPath;
299
+ lockfileVersion = bunLockTextPath ? 1 : 0;
297
300
  } else {
298
301
  cliType = detectPackageManagerNameWithoutLockfile(
299
302
  packageJsonPackageManager,
@@ -308,8 +311,7 @@ async function scanParentDirs(destPath, readPackageJson = false, base = "/") {
308
311
  lockfilePath,
309
312
  lockfileVersion,
310
313
  packageJsonPath,
311
- turboSupportsCorepackHome,
312
- detectedLockfile: lockfilePath ? import_path.default.basename(lockfilePath) : void 0
314
+ turboSupportsCorepackHome
313
315
  };
314
316
  }
315
317
  async function checkTurboSupportsCorepack(turboVersionRange, rootDir) {
@@ -435,8 +437,7 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
435
437
  packageJson,
436
438
  lockfileVersion,
437
439
  packageJsonPackageManager,
438
- turboSupportsCorepackHome,
439
- detectedLockfile
440
+ turboSupportsCorepackHome
440
441
  } = await scanParentDirs(destPath, true);
441
442
  if (!packageJsonPath) {
442
443
  (0, import_debug.default)(
@@ -470,8 +471,7 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
470
471
  nodeVersion,
471
472
  env,
472
473
  packageJsonEngines: packageJson?.engines,
473
- turboSupportsCorepackHome,
474
- detectedLockfile
474
+ turboSupportsCorepackHome
475
475
  });
476
476
  let commandArgs;
477
477
  const isPotentiallyBrokenNpm = cliType === "npm" && (nodeVersion?.major === 16 || opts.env.PATH?.includes("/node16/bin-npm7")) && !args.includes("--legacy-peer-deps") && spawnOpts?.env?.ENABLE_EXPERIMENTAL_COREPACK !== "1";
@@ -525,22 +525,24 @@ function getEnvForPackageManager({
525
525
  nodeVersion,
526
526
  env,
527
527
  packageJsonEngines,
528
- turboSupportsCorepackHome,
529
- detectedLockfile
528
+ turboSupportsCorepackHome
530
529
  }) {
531
530
  const corepackEnabled = usingCorepack(
532
531
  env,
533
532
  packageJsonPackageManager,
534
533
  turboSupportsCorepackHome
535
534
  );
536
- const { detectedPackageManager, path: newPath } = getPathOverrideForPackageManager({
535
+ const {
536
+ detectedLockfile,
537
+ detectedPackageManager,
538
+ path: newPath
539
+ } = getPathOverrideForPackageManager({
537
540
  cliType,
538
541
  lockfileVersion,
539
542
  corepackPackageManager: packageJsonPackageManager,
540
543
  nodeVersion,
541
544
  corepackEnabled,
542
- packageJsonEngines,
543
- detectedLockfile
545
+ packageJsonEngines
544
546
  });
545
547
  if (corepackEnabled) {
546
548
  (0, import_debug.default)(
@@ -624,14 +626,9 @@ function getPathOverrideForPackageManager({
624
626
  lockfileVersion,
625
627
  corepackPackageManager,
626
628
  corepackEnabled = true,
627
- packageJsonEngines,
628
- detectedLockfile
629
+ packageJsonEngines
629
630
  }) {
630
- const detectedPackageManger = detectPackageManager(
631
- cliType,
632
- lockfileVersion,
633
- detectedLockfile
634
- );
631
+ const detectedPackageManger = detectPackageManager(cliType, lockfileVersion);
635
632
  if (!corepackPackageManager || !corepackEnabled) {
636
633
  if (cliType === "pnpm" && packageJsonEngines?.pnpm) {
637
634
  checkEnginesPnpmAgainstDetected(
@@ -722,7 +719,7 @@ function validateVersionSpecifier(version) {
722
719
  packageVersion
723
720
  };
724
721
  }
725
- function detectPackageManager(cliType, lockfileVersion, detectedLockfile) {
722
+ function detectPackageManager(cliType, lockfileVersion) {
726
723
  switch (cliType) {
727
724
  case "npm":
728
725
  return void 0;
@@ -731,21 +728,21 @@ function detectPackageManager(cliType, lockfileVersion, detectedLockfile) {
731
728
  case "pnpm 7":
732
729
  return {
733
730
  path: "/pnpm7/node_modules/.bin",
734
- detectedLockfile,
731
+ detectedLockfile: "pnpm-lock.yaml",
735
732
  detectedPackageManager: "pnpm@7.x",
736
733
  pnpmVersionRange: "7.x"
737
734
  };
738
735
  case "pnpm 8":
739
736
  return {
740
737
  path: "/pnpm8/node_modules/.bin",
741
- detectedLockfile,
738
+ detectedLockfile: "pnpm-lock.yaml",
742
739
  detectedPackageManager: "pnpm@8.x",
743
740
  pnpmVersionRange: "8.x"
744
741
  };
745
742
  case "pnpm 9":
746
743
  return {
747
744
  path: "/pnpm9/node_modules/.bin",
748
- detectedLockfile,
745
+ detectedLockfile: "pnpm-lock.yaml",
749
746
  detectedPackageManager: "pnpm@9.x",
750
747
  pnpmVersionRange: "9.x"
751
748
  };
@@ -753,7 +750,7 @@ function detectPackageManager(cliType, lockfileVersion, detectedLockfile) {
753
750
  return {
754
751
  // undefined because pnpm@6 is the current default in the build container
755
752
  path: void 0,
756
- detectedLockfile,
753
+ detectedLockfile: "pnpm-lock.yaml",
757
754
  detectedPackageManager: "pnpm@6.x",
758
755
  pnpmVersionRange: "6.x"
759
756
  };
@@ -763,13 +760,13 @@ function detectPackageManager(cliType, lockfileVersion, detectedLockfile) {
763
760
  case "bun":
764
761
  return {
765
762
  path: "/bun1",
766
- detectedLockfile,
763
+ detectedLockfile: lockfileVersion === 0 ? "bun.lockb" : "bun.lock",
767
764
  detectedPackageManager: "bun@1.x"
768
765
  };
769
766
  case "yarn":
770
767
  return {
771
768
  path: void 0,
772
- detectedLockfile,
769
+ detectedLockfile: "yarn.lock",
773
770
  detectedPackageManager: "yarn"
774
771
  };
775
772
  }
@@ -778,16 +775,14 @@ function getPathForPackageManager({
778
775
  cliType,
779
776
  lockfileVersion,
780
777
  nodeVersion,
781
- env,
782
- detectedLockfile
778
+ env
783
779
  }) {
784
780
  const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
785
781
  let overrides = getPathOverrideForPackageManager({
786
782
  cliType,
787
783
  lockfileVersion,
788
784
  corepackPackageManager: void 0,
789
- nodeVersion,
790
- detectedLockfile
785
+ nodeVersion
791
786
  });
792
787
  if (corepackEnabled) {
793
788
  overrides = NO_OVERRIDE;
@@ -822,8 +817,7 @@ async function runCustomInstallCommand({
822
817
  lockfileVersion,
823
818
  packageJson,
824
819
  packageJsonPackageManager,
825
- turboSupportsCorepackHome,
826
- detectedLockfile
820
+ turboSupportsCorepackHome
827
821
  } = await scanParentDirs(destPath, true);
828
822
  const env = getEnvForPackageManager({
829
823
  cliType,
@@ -832,8 +826,7 @@ async function runCustomInstallCommand({
832
826
  nodeVersion,
833
827
  env: spawnOpts?.env || {},
834
828
  packageJsonEngines: packageJson?.engines,
835
- turboSupportsCorepackHome,
836
- detectedLockfile
829
+ turboSupportsCorepackHome
837
830
  });
838
831
  (0, import_debug.default)(`Running with $PATH:`, env?.PATH || "");
839
832
  await execCommand(installCommand, {
@@ -849,8 +842,7 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
849
842
  cliType,
850
843
  lockfileVersion,
851
844
  packageJsonPackageManager,
852
- turboSupportsCorepackHome,
853
- detectedLockfile
845
+ turboSupportsCorepackHome
854
846
  } = await scanParentDirs(destPath, true);
855
847
  const scriptName = getScriptName(
856
848
  packageJson,
@@ -870,8 +862,7 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
870
862
  nodeVersion: void 0,
871
863
  env: (0, import_clone_env.cloneEnv)(process.env, spawnOpts?.env),
872
864
  packageJsonEngines: packageJson?.engines,
873
- turboSupportsCorepackHome,
874
- detectedLockfile
865
+ turboSupportsCorepackHome
875
866
  })
876
867
  };
877
868
  if (cliType === "npm") {
package/dist/index.js CHANGED
@@ -21851,9 +21851,11 @@ __export(src_exports, {
21851
21851
  FileRef: () => FileRef,
21852
21852
  Lambda: () => Lambda,
21853
21853
  NODE_VERSIONS: () => NODE_VERSIONS,
21854
+ NodeVersion: () => NodeVersion,
21854
21855
  NodejsLambda: () => NodejsLambda,
21855
21856
  NowBuildError: () => NowBuildError,
21856
21857
  Prerender: () => Prerender,
21858
+ Version: () => Version,
21857
21859
  buildsSchema: () => buildsSchema,
21858
21860
  cloneEnv: () => cloneEnv,
21859
21861
  createLambda: () => createLambda,
@@ -22581,6 +22583,7 @@ var NodejsLambda = class extends Lambda {
22581
22583
  shouldAddHelpers,
22582
22584
  shouldAddSourcemapSupport,
22583
22585
  awsLambdaHandler,
22586
+ useWebApi,
22584
22587
  ...opts
22585
22588
  }) {
22586
22589
  super(opts);
@@ -22588,6 +22591,7 @@ var NodejsLambda = class extends Lambda {
22588
22591
  this.shouldAddHelpers = shouldAddHelpers;
22589
22592
  this.shouldAddSourcemapSupport = shouldAddSourcemapSupport;
22590
22593
  this.awsLambdaHandler = awsLambdaHandler;
22594
+ this.useWebApi = useWebApi;
22591
22595
  }
22592
22596
  };
22593
22597
 
@@ -22853,40 +22857,78 @@ var import_util2 = require("util");
22853
22857
  // src/fs/node-version.ts
22854
22858
  var import_fs = require("fs");
22855
22859
  var import_semver = __toESM(require_semver2());
22860
+
22861
+ // src/types.ts
22862
+ var Version = class {
22863
+ constructor(version) {
22864
+ this.major = version.major;
22865
+ this.minor = version.minor;
22866
+ this.range = version.range;
22867
+ this.runtime = version.runtime;
22868
+ this.discontinueDate = version.discontinueDate;
22869
+ }
22870
+ get state() {
22871
+ if (this.discontinueDate && this.discontinueDate.getTime() <= Date.now()) {
22872
+ return "discontinued";
22873
+ } else if (this.discontinueDate) {
22874
+ return "deprecated";
22875
+ }
22876
+ return "active";
22877
+ }
22878
+ get formattedDate() {
22879
+ return this.discontinueDate && this.discontinueDate.toISOString().split("T")[0];
22880
+ }
22881
+ };
22882
+ var NodeVersion = class extends Version {
22883
+ };
22884
+
22885
+ // src/fs/node-version.ts
22856
22886
  var NODE_VERSIONS = [
22857
- { major: 22, range: "22.x", runtime: "nodejs22.x" },
22858
- { major: 20, range: "20.x", runtime: "nodejs20.x" },
22859
- { major: 18, range: "18.x", runtime: "nodejs18.x" },
22860
- {
22887
+ new NodeVersion({
22888
+ major: 22,
22889
+ range: "22.x",
22890
+ runtime: "nodejs22.x"
22891
+ }),
22892
+ new NodeVersion({
22893
+ major: 20,
22894
+ range: "20.x",
22895
+ runtime: "nodejs20.x"
22896
+ }),
22897
+ new NodeVersion({
22898
+ major: 18,
22899
+ range: "18.x",
22900
+ runtime: "nodejs18.x"
22901
+ }),
22902
+ new NodeVersion({
22861
22903
  major: 16,
22862
22904
  range: "16.x",
22863
22905
  runtime: "nodejs16.x",
22864
22906
  discontinueDate: /* @__PURE__ */ new Date("2025-01-31")
22865
- },
22866
- {
22907
+ }),
22908
+ new NodeVersion({
22867
22909
  major: 14,
22868
22910
  range: "14.x",
22869
22911
  runtime: "nodejs14.x",
22870
22912
  discontinueDate: /* @__PURE__ */ new Date("2023-08-15")
22871
- },
22872
- {
22913
+ }),
22914
+ new NodeVersion({
22873
22915
  major: 12,
22874
22916
  range: "12.x",
22875
22917
  runtime: "nodejs12.x",
22876
22918
  discontinueDate: /* @__PURE__ */ new Date("2022-10-03")
22877
- },
22878
- {
22919
+ }),
22920
+ new NodeVersion({
22879
22921
  major: 10,
22880
22922
  range: "10.x",
22881
22923
  runtime: "nodejs10.x",
22882
22924
  discontinueDate: /* @__PURE__ */ new Date("2021-04-20")
22883
- },
22884
- {
22925
+ }),
22926
+ new NodeVersion({
22885
22927
  major: 8,
22886
22928
  range: "8.10.x",
22887
22929
  runtime: "nodejs8.10",
22888
22930
  discontinueDate: /* @__PURE__ */ new Date("2020-01-06")
22889
- }
22931
+ })
22890
22932
  ];
22891
22933
  function getOptions() {
22892
22934
  return NODE_VERSIONS;
@@ -22919,7 +22961,9 @@ function getLatestNodeVersion(availableVersions) {
22919
22961
  return all[0];
22920
22962
  }
22921
22963
  function getDiscontinuedNodeVersions() {
22922
- return getOptions().filter(isDiscontinued);
22964
+ return getOptions().filter((version) => {
22965
+ return version.state === "discontinued";
22966
+ });
22923
22967
  }
22924
22968
  async function getSupportedNodeVersion(engineRange, isAuto = false, availableVersions) {
22925
22969
  let selection;
@@ -22942,7 +22986,7 @@ async function getSupportedNodeVersion(engineRange, isAuto = false, availableVer
22942
22986
  if (!selection) {
22943
22987
  selection = getLatestNodeVersion(availableVersions);
22944
22988
  }
22945
- if (isDiscontinued(selection)) {
22989
+ if (selection.state === "discontinued") {
22946
22990
  const intro = `Node.js Version "${selection.range}" is discontinued and must be upgraded.`;
22947
22991
  throw new NowBuildError({
22948
22992
  code: "BUILD_UTILS_NODE_VERSION_DISCONTINUED",
@@ -22951,20 +22995,24 @@ async function getSupportedNodeVersion(engineRange, isAuto = false, availableVer
22951
22995
  });
22952
22996
  }
22953
22997
  debug(`Selected Node.js ${selection.range}`);
22954
- if (selection.discontinueDate) {
22955
- const d = selection.discontinueDate.toISOString().split("T")[0];
22956
- console.warn(
22957
- `Error: Node.js version ${selection.range} has reached End-of-Life. Deployments created on or after ${d} will fail to build. ${getHint(
22958
- isAuto
22959
- )}`
22960
- );
22998
+ if (selection.state === "deprecated") {
22999
+ const d = selection.formattedDate;
23000
+ if (d) {
23001
+ console.warn(
23002
+ `Error: Node.js version ${selection.range} is deprecated. Deployments created on or after ${d} will fail to build. ${getHint(
23003
+ isAuto
23004
+ )}`
23005
+ );
23006
+ } else {
23007
+ console.warn(
23008
+ `Error: Node.js version ${selection.range} is deprecated. ${getHint(
23009
+ isAuto
23010
+ )}`
23011
+ );
23012
+ }
22961
23013
  }
22962
23014
  return selection;
22963
23015
  }
22964
- function isDiscontinued({ discontinueDate }) {
22965
- const today = Date.now();
22966
- return discontinueDate !== void 0 && discontinueDate.getTime() <= today;
22967
- }
22968
23016
 
22969
23017
  // src/fs/read-config-file.ts
22970
23018
  var import_js_yaml = __toESM(require_js_yaml2());
@@ -23161,7 +23209,8 @@ function getSpawnOptions(meta, nodeVersion) {
23161
23209
  async function getNodeVersion(destPath, fallbackVersion = process.env.VERCEL_PROJECT_SETTINGS_NODE_VERSION, config = {}, meta = {}, availableVersions = getAvailableNodeVersions()) {
23162
23210
  const latestVersion = getLatestNodeVersion(availableVersions);
23163
23211
  if (meta.isDev) {
23164
- return { ...latestVersion, runtime: "nodejs" };
23212
+ latestVersion.runtime = "nodejs";
23213
+ return latestVersion;
23165
23214
  }
23166
23215
  const { packageJson } = await scanParentDirs(destPath, true);
23167
23216
  const configuredVersion = config.nodeVersion || fallbackVersion;
@@ -23240,6 +23289,7 @@ async function scanParentDirs(destPath, readPackageJson = false, base = "/") {
23240
23289
  if (bunLock && hasYarnLock) {
23241
23290
  cliType = "bun";
23242
23291
  lockfilePath = bunLockPath;
23292
+ lockfileVersion = bunLockTextPath ? 1 : 0;
23243
23293
  } else if (hasYarnLock) {
23244
23294
  cliType = "yarn";
23245
23295
  lockfilePath = yarnLockPath;
@@ -23254,6 +23304,7 @@ async function scanParentDirs(destPath, readPackageJson = false, base = "/") {
23254
23304
  } else if (bunLock) {
23255
23305
  cliType = "bun";
23256
23306
  lockfilePath = bunLockPath;
23307
+ lockfileVersion = bunLockTextPath ? 1 : 0;
23257
23308
  } else {
23258
23309
  cliType = detectPackageManagerNameWithoutLockfile(
23259
23310
  packageJsonPackageManager,
@@ -23268,8 +23319,7 @@ async function scanParentDirs(destPath, readPackageJson = false, base = "/") {
23268
23319
  lockfilePath,
23269
23320
  lockfileVersion,
23270
23321
  packageJsonPath,
23271
- turboSupportsCorepackHome,
23272
- detectedLockfile: lockfilePath ? import_path5.default.basename(lockfilePath) : void 0
23322
+ turboSupportsCorepackHome
23273
23323
  };
23274
23324
  }
23275
23325
  async function checkTurboSupportsCorepack(turboVersionRange, rootDir) {
@@ -23395,8 +23445,7 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
23395
23445
  packageJson,
23396
23446
  lockfileVersion,
23397
23447
  packageJsonPackageManager,
23398
- turboSupportsCorepackHome,
23399
- detectedLockfile
23448
+ turboSupportsCorepackHome
23400
23449
  } = await scanParentDirs(destPath, true);
23401
23450
  if (!packageJsonPath) {
23402
23451
  debug(
@@ -23430,8 +23479,7 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
23430
23479
  nodeVersion,
23431
23480
  env,
23432
23481
  packageJsonEngines: packageJson?.engines,
23433
- turboSupportsCorepackHome,
23434
- detectedLockfile
23482
+ turboSupportsCorepackHome
23435
23483
  });
23436
23484
  let commandArgs;
23437
23485
  const isPotentiallyBrokenNpm = cliType === "npm" && (nodeVersion?.major === 16 || opts.env.PATH?.includes("/node16/bin-npm7")) && !args.includes("--legacy-peer-deps") && spawnOpts?.env?.ENABLE_EXPERIMENTAL_COREPACK !== "1";
@@ -23485,22 +23533,24 @@ function getEnvForPackageManager({
23485
23533
  nodeVersion,
23486
23534
  env,
23487
23535
  packageJsonEngines,
23488
- turboSupportsCorepackHome,
23489
- detectedLockfile
23536
+ turboSupportsCorepackHome
23490
23537
  }) {
23491
23538
  const corepackEnabled = usingCorepack(
23492
23539
  env,
23493
23540
  packageJsonPackageManager,
23494
23541
  turboSupportsCorepackHome
23495
23542
  );
23496
- const { detectedPackageManager, path: newPath } = getPathOverrideForPackageManager({
23543
+ const {
23544
+ detectedLockfile,
23545
+ detectedPackageManager,
23546
+ path: newPath
23547
+ } = getPathOverrideForPackageManager({
23497
23548
  cliType,
23498
23549
  lockfileVersion,
23499
23550
  corepackPackageManager: packageJsonPackageManager,
23500
23551
  nodeVersion,
23501
23552
  corepackEnabled,
23502
- packageJsonEngines,
23503
- detectedLockfile
23553
+ packageJsonEngines
23504
23554
  });
23505
23555
  if (corepackEnabled) {
23506
23556
  debug(
@@ -23584,14 +23634,9 @@ function getPathOverrideForPackageManager({
23584
23634
  lockfileVersion,
23585
23635
  corepackPackageManager,
23586
23636
  corepackEnabled = true,
23587
- packageJsonEngines,
23588
- detectedLockfile
23637
+ packageJsonEngines
23589
23638
  }) {
23590
- const detectedPackageManger = detectPackageManager(
23591
- cliType,
23592
- lockfileVersion,
23593
- detectedLockfile
23594
- );
23639
+ const detectedPackageManger = detectPackageManager(cliType, lockfileVersion);
23595
23640
  if (!corepackPackageManager || !corepackEnabled) {
23596
23641
  if (cliType === "pnpm" && packageJsonEngines?.pnpm) {
23597
23642
  checkEnginesPnpmAgainstDetected(
@@ -23682,7 +23727,7 @@ function validateVersionSpecifier(version) {
23682
23727
  packageVersion
23683
23728
  };
23684
23729
  }
23685
- function detectPackageManager(cliType, lockfileVersion, detectedLockfile) {
23730
+ function detectPackageManager(cliType, lockfileVersion) {
23686
23731
  switch (cliType) {
23687
23732
  case "npm":
23688
23733
  return void 0;
@@ -23691,21 +23736,21 @@ function detectPackageManager(cliType, lockfileVersion, detectedLockfile) {
23691
23736
  case "pnpm 7":
23692
23737
  return {
23693
23738
  path: "/pnpm7/node_modules/.bin",
23694
- detectedLockfile,
23739
+ detectedLockfile: "pnpm-lock.yaml",
23695
23740
  detectedPackageManager: "pnpm@7.x",
23696
23741
  pnpmVersionRange: "7.x"
23697
23742
  };
23698
23743
  case "pnpm 8":
23699
23744
  return {
23700
23745
  path: "/pnpm8/node_modules/.bin",
23701
- detectedLockfile,
23746
+ detectedLockfile: "pnpm-lock.yaml",
23702
23747
  detectedPackageManager: "pnpm@8.x",
23703
23748
  pnpmVersionRange: "8.x"
23704
23749
  };
23705
23750
  case "pnpm 9":
23706
23751
  return {
23707
23752
  path: "/pnpm9/node_modules/.bin",
23708
- detectedLockfile,
23753
+ detectedLockfile: "pnpm-lock.yaml",
23709
23754
  detectedPackageManager: "pnpm@9.x",
23710
23755
  pnpmVersionRange: "9.x"
23711
23756
  };
@@ -23713,7 +23758,7 @@ function detectPackageManager(cliType, lockfileVersion, detectedLockfile) {
23713
23758
  return {
23714
23759
  // undefined because pnpm@6 is the current default in the build container
23715
23760
  path: void 0,
23716
- detectedLockfile,
23761
+ detectedLockfile: "pnpm-lock.yaml",
23717
23762
  detectedPackageManager: "pnpm@6.x",
23718
23763
  pnpmVersionRange: "6.x"
23719
23764
  };
@@ -23723,13 +23768,13 @@ function detectPackageManager(cliType, lockfileVersion, detectedLockfile) {
23723
23768
  case "bun":
23724
23769
  return {
23725
23770
  path: "/bun1",
23726
- detectedLockfile,
23771
+ detectedLockfile: lockfileVersion === 0 ? "bun.lockb" : "bun.lock",
23727
23772
  detectedPackageManager: "bun@1.x"
23728
23773
  };
23729
23774
  case "yarn":
23730
23775
  return {
23731
23776
  path: void 0,
23732
- detectedLockfile,
23777
+ detectedLockfile: "yarn.lock",
23733
23778
  detectedPackageManager: "yarn"
23734
23779
  };
23735
23780
  }
@@ -23738,16 +23783,14 @@ function getPathForPackageManager({
23738
23783
  cliType,
23739
23784
  lockfileVersion,
23740
23785
  nodeVersion,
23741
- env,
23742
- detectedLockfile
23786
+ env
23743
23787
  }) {
23744
23788
  const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
23745
23789
  let overrides = getPathOverrideForPackageManager({
23746
23790
  cliType,
23747
23791
  lockfileVersion,
23748
23792
  corepackPackageManager: void 0,
23749
- nodeVersion,
23750
- detectedLockfile
23793
+ nodeVersion
23751
23794
  });
23752
23795
  if (corepackEnabled) {
23753
23796
  overrides = NO_OVERRIDE;
@@ -23782,8 +23825,7 @@ async function runCustomInstallCommand({
23782
23825
  lockfileVersion,
23783
23826
  packageJson,
23784
23827
  packageJsonPackageManager,
23785
- turboSupportsCorepackHome,
23786
- detectedLockfile
23828
+ turboSupportsCorepackHome
23787
23829
  } = await scanParentDirs(destPath, true);
23788
23830
  const env = getEnvForPackageManager({
23789
23831
  cliType,
@@ -23792,8 +23834,7 @@ async function runCustomInstallCommand({
23792
23834
  nodeVersion,
23793
23835
  env: spawnOpts?.env || {},
23794
23836
  packageJsonEngines: packageJson?.engines,
23795
- turboSupportsCorepackHome,
23796
- detectedLockfile
23837
+ turboSupportsCorepackHome
23797
23838
  });
23798
23839
  debug(`Running with $PATH:`, env?.PATH || "");
23799
23840
  await execCommand(installCommand, {
@@ -23809,8 +23850,7 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
23809
23850
  cliType,
23810
23851
  lockfileVersion,
23811
23852
  packageJsonPackageManager,
23812
- turboSupportsCorepackHome,
23813
- detectedLockfile
23853
+ turboSupportsCorepackHome
23814
23854
  } = await scanParentDirs(destPath, true);
23815
23855
  const scriptName = getScriptName(
23816
23856
  packageJson,
@@ -23830,8 +23870,7 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
23830
23870
  nodeVersion: void 0,
23831
23871
  env: cloneEnv(process.env, spawnOpts?.env),
23832
23872
  packageJsonEngines: packageJson?.engines,
23833
- turboSupportsCorepackHome,
23834
- detectedLockfile
23873
+ turboSupportsCorepackHome
23835
23874
  })
23836
23875
  };
23837
23876
  if (cliType === "npm") {
@@ -24209,9 +24248,11 @@ async function getInstalledPackageVersion(packageName, path7) {
24209
24248
  FileRef,
24210
24249
  Lambda,
24211
24250
  NODE_VERSIONS,
24251
+ NodeVersion,
24212
24252
  NodejsLambda,
24213
24253
  NowBuildError,
24214
24254
  Prerender,
24255
+ Version,
24215
24256
  buildsSchema,
24216
24257
  cloneEnv,
24217
24258
  createLambda,
@@ -3,12 +3,14 @@ interface NodejsLambdaOptions extends LambdaOptionsWithFiles {
3
3
  shouldAddHelpers: boolean;
4
4
  shouldAddSourcemapSupport: boolean;
5
5
  awsLambdaHandler?: string;
6
+ useWebApi?: boolean;
6
7
  }
7
8
  export declare class NodejsLambda extends Lambda {
8
9
  launcherType: 'Nodejs';
9
10
  shouldAddHelpers: boolean;
10
11
  shouldAddSourcemapSupport: boolean;
11
12
  awsLambdaHandler?: string;
12
- constructor({ shouldAddHelpers, shouldAddSourcemapSupport, awsLambdaHandler, ...opts }: NodejsLambdaOptions);
13
+ useWebApi?: boolean;
14
+ constructor({ shouldAddHelpers, shouldAddSourcemapSupport, awsLambdaHandler, useWebApi, ...opts }: NodejsLambdaOptions);
13
15
  }
14
16
  export {};
@@ -27,6 +27,7 @@ class NodejsLambda extends import_lambda.Lambda {
27
27
  shouldAddHelpers,
28
28
  shouldAddSourcemapSupport,
29
29
  awsLambdaHandler,
30
+ useWebApi,
30
31
  ...opts
31
32
  }) {
32
33
  super(opts);
@@ -34,6 +35,7 @@ class NodejsLambda extends import_lambda.Lambda {
34
35
  this.shouldAddHelpers = shouldAddHelpers;
35
36
  this.shouldAddSourcemapSupport = shouldAddSourcemapSupport;
36
37
  this.awsLambdaHandler = awsLambdaHandler;
38
+ this.useWebApi = useWebApi;
37
39
  }
38
40
  }
39
41
  // Annotate the CommonJS export names for ESM import in node:
package/dist/types.d.ts CHANGED
@@ -283,16 +283,32 @@ export interface PackageJson {
283
283
  readonly publishConfig?: PackageJson.PublishConfig;
284
284
  readonly packageManager?: string;
285
285
  }
286
- export interface NodeVersion {
286
+ export interface ConstructorVersion {
287
287
  /** major version number: 18 */
288
288
  major: number;
289
+ /** minor version number: 18 */
290
+ minor?: number;
289
291
  /** major version range: "18.x" */
290
292
  range: string;
291
293
  /** runtime descriptor: "nodejs18.x" */
292
294
  runtime: string;
293
- /** date beyond which this version is discontinued: 2023-08-17T19:05:45.951Z */
294
295
  discontinueDate?: Date;
295
296
  }
297
+ interface BaseVersion extends ConstructorVersion {
298
+ state: 'active' | 'deprecated' | 'discontinued';
299
+ }
300
+ export declare class Version implements BaseVersion {
301
+ major: number;
302
+ minor?: number;
303
+ range: string;
304
+ runtime: string;
305
+ discontinueDate?: Date;
306
+ constructor(version: ConstructorVersion);
307
+ get state(): "active" | "deprecated" | "discontinued";
308
+ get formattedDate(): string | undefined;
309
+ }
310
+ export declare class NodeVersion extends Version {
311
+ }
296
312
  export interface Builder {
297
313
  use: string;
298
314
  src?: string;
package/dist/types.js CHANGED
@@ -3,6 +3,10 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
6
10
  var __copyProps = (to, from, except, desc) => {
7
11
  if (from && typeof from === "object" || typeof from === "function") {
8
12
  for (let key of __getOwnPropNames(from))
@@ -13,4 +17,35 @@ var __copyProps = (to, from, except, desc) => {
13
17
  };
14
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
19
  var types_exports = {};
20
+ __export(types_exports, {
21
+ NodeVersion: () => NodeVersion,
22
+ Version: () => Version
23
+ });
16
24
  module.exports = __toCommonJS(types_exports);
25
+ class Version {
26
+ constructor(version) {
27
+ this.major = version.major;
28
+ this.minor = version.minor;
29
+ this.range = version.range;
30
+ this.runtime = version.runtime;
31
+ this.discontinueDate = version.discontinueDate;
32
+ }
33
+ get state() {
34
+ if (this.discontinueDate && this.discontinueDate.getTime() <= Date.now()) {
35
+ return "discontinued";
36
+ } else if (this.discontinueDate) {
37
+ return "deprecated";
38
+ }
39
+ return "active";
40
+ }
41
+ get formattedDate() {
42
+ return this.discontinueDate && this.discontinueDate.toISOString().split("T")[0];
43
+ }
44
+ }
45
+ class NodeVersion extends Version {
46
+ }
47
+ // Annotate the CommonJS export names for ESM import in node:
48
+ 0 && (module.exports = {
49
+ NodeVersion,
50
+ Version
51
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vercel/build-utils",
3
- "version": "9.0.0",
3
+ "version": "9.1.0",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.js",