@vercel/build-utils 8.1.3 → 8.2.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,15 @@
1
1
  # @vercel/build-utils
2
2
 
3
+ ## 8.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - fix corepack detection for package manager version determination ([#11596](https://github.com/vercel/vercel/pull/11596))
8
+
9
+ ### Patch Changes
10
+
11
+ - Fix triggering of ignored project settings node version warning ([#11550](https://github.com/vercel/vercel/pull/11550))
12
+
3
13
  ## 8.1.3
4
14
 
5
15
  ### Patch Changes
@@ -74,7 +74,7 @@ export declare function getNodeBinPath({ cwd, }: {
74
74
  export declare function getNodeBinPaths({ start, base, }: TraverseUpDirectoriesProps): string[];
75
75
  export declare function runShellScript(fsPath: string, args?: string[], spawnOpts?: SpawnOptions): Promise<boolean>;
76
76
  export declare function getSpawnOptions(meta: Meta, nodeVersion: NodeVersion): SpawnOptions;
77
- export declare function getNodeVersion(destPath: string, nodeVersionFallback?: string | undefined, config?: Config, meta?: Meta, availableVersions?: number[]): Promise<NodeVersion>;
77
+ export declare function getNodeVersion(destPath: string, fallbackVersion?: string | undefined, config?: Config, meta?: Meta, availableVersions?: number[]): Promise<NodeVersion>;
78
78
  export declare function scanParentDirs(destPath: string, readPackageJson?: boolean, base?: string): Promise<ScanParentDirsResult>;
79
79
  export declare function walkParentDirs({ base, start, filename, }: WalkParentDirsProps): Promise<string | null>;
80
80
  export declare function runNpmInstall(destPath: string, args?: string[], spawnOpts?: SpawnOptions, meta?: Meta, nodeVersion?: NodeVersion): Promise<boolean>;
@@ -82,9 +82,10 @@ export declare function runNpmInstall(destPath: string, args?: string[], spawnOp
82
82
  * Prepares the input environment based on the used package manager and lockfile
83
83
  * versions.
84
84
  */
85
- export declare function getEnvForPackageManager({ cliType, lockfileVersion, nodeVersion, env, }: {
85
+ export declare function getEnvForPackageManager({ cliType, lockfileVersion, packageJsonPackageManager, nodeVersion, env, }: {
86
86
  cliType: CliType;
87
87
  lockfileVersion: number | undefined;
88
+ packageJsonPackageManager?: string | undefined;
88
89
  nodeVersion: NodeVersion | undefined;
89
90
  env: {
90
91
  [x: string]: string | undefined;
@@ -96,13 +97,11 @@ export declare function getEnvForPackageManager({ cliType, lockfileVersion, node
96
97
  * Helper to get the binary paths that link to the used package manager.
97
98
  * Note: Make sure it doesn't contain any `console.log` calls.
98
99
  */
99
- export declare function getPathOverrideForPackageManager({ cliType, lockfileVersion, nodeVersion, env, }: {
100
+ export declare function getPathOverrideForPackageManager({ cliType, lockfileVersion, corepackEnabled, nodeVersion, }: {
100
101
  cliType: CliType;
101
102
  lockfileVersion: number | undefined;
103
+ corepackEnabled: boolean;
102
104
  nodeVersion: NodeVersion | undefined;
103
- env: {
104
- [x: string]: string | undefined;
105
- };
106
105
  }): {
107
106
  /**
108
107
  * Which lockfile was detected.
@@ -121,6 +120,7 @@ export declare function getPathOverrideForPackageManager({ cliType, lockfileVers
121
120
  /**
122
121
  * Helper to get the binary paths that link to the used package manager.
123
122
  * Note: Make sure it doesn't contain any `console.log` calls.
123
+ * @deprecated use `getEnvForPackageManager` instead
124
124
  */
125
125
  export declare function getPathForPackageManager({ cliType, lockfileVersion, nodeVersion, env, }: {
126
126
  cliType: CliType;
@@ -173,33 +173,37 @@ function getSpawnOptions(meta, nodeVersion) {
173
173
  }
174
174
  return opts;
175
175
  }
176
- async function getNodeVersion(destPath, nodeVersionFallback = process.env.VERCEL_PROJECT_SETTINGS_NODE_VERSION, config = {}, meta = {}, availableVersions = (0, import_node_version.getAvailableNodeVersions)()) {
177
- const latest = (0, import_node_version.getLatestNodeVersion)(availableVersions);
176
+ async function getNodeVersion(destPath, fallbackVersion = process.env.VERCEL_PROJECT_SETTINGS_NODE_VERSION, config = {}, meta = {}, availableVersions = (0, import_node_version.getAvailableNodeVersions)()) {
177
+ const latestVersion = (0, import_node_version.getLatestNodeVersion)(availableVersions);
178
178
  if (meta.isDev) {
179
- return { ...latest, runtime: "nodejs" };
179
+ return { ...latestVersion, runtime: "nodejs" };
180
180
  }
181
181
  const { packageJson } = await scanParentDirs(destPath, true);
182
- let nodeVersion = config.nodeVersion || nodeVersionFallback;
183
- let isAuto = true;
182
+ const configuredVersion = config.nodeVersion || fallbackVersion;
183
+ const packageJsonVersion = packageJson?.engines?.node;
184
+ const supportedNodeVersion = await (0, import_node_version.getSupportedNodeVersion)(
185
+ packageJsonVersion || configuredVersion,
186
+ !packageJsonVersion,
187
+ availableVersions
188
+ );
184
189
  if (packageJson?.engines?.node) {
185
190
  const { node } = packageJson.engines;
186
- if (nodeVersion && (0, import_semver.validRange)(node) && !(0, import_semver.intersects)(nodeVersion, node)) {
191
+ if (configuredVersion && !(0, import_semver.intersects)(configuredVersion, supportedNodeVersion.range)) {
187
192
  console.warn(
188
- `Warning: Due to "engines": { "node": "${node}" } in your \`package.json\` file, the Node.js Version defined in your Project Settings ("${nodeVersion}") will not apply. Learn More: http://vercel.link/node-version`
193
+ `Warning: Due to "engines": { "node": "${node}" } in your \`package.json\` file, the Node.js Version defined in your Project Settings ("${configuredVersion}") will not apply. Learn More: http://vercel.link/node-version`
189
194
  );
190
- } else if ((0, import_semver.coerce)(node)?.raw === node) {
195
+ }
196
+ if ((0, import_semver.coerce)(node)?.raw === node) {
191
197
  console.warn(
192
198
  `Warning: Detected "engines": { "node": "${node}" } in your \`package.json\` with major.minor.patch, but only major Node.js Version can be selected. Learn More: http://vercel.link/node-version`
193
199
  );
194
- } else if ((0, import_semver.validRange)(node) && (0, import_semver.intersects)(`${latest.major + 1}.x`, node)) {
200
+ } else if ((0, import_semver.validRange)(node) && (0, import_semver.intersects)(`${latestVersion.major + 1}.x`, node)) {
195
201
  console.warn(
196
202
  `Warning: Detected "engines": { "node": "${node}" } in your \`package.json\` that will automatically upgrade when a new major Node.js Version is released. Learn More: http://vercel.link/node-version`
197
203
  );
198
204
  }
199
- nodeVersion = node;
200
- isAuto = false;
201
205
  }
202
- return (0, import_node_version.getSupportedNodeVersion)(nodeVersion, isAuto, availableVersions);
206
+ return supportedNodeVersion;
203
207
  }
204
208
  async function scanParentDirs(destPath, readPackageJson = false, base = "/") {
205
209
  (0, import_assert.default)(import_path.default.isAbsolute(destPath));
@@ -302,9 +306,7 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
302
306
  (0, import_assert.default)(import_path.default.isAbsolute(destPath));
303
307
  try {
304
308
  await runNpmInstallSema.acquire();
305
- const { cliType, packageJsonPath, lockfileVersion } = await scanParentDirs(
306
- destPath
307
- );
309
+ const { cliType, packageJsonPath, packageJson, lockfileVersion } = await scanParentDirs(destPath, true);
308
310
  if (!packageJsonPath) {
309
311
  (0, import_debug.default)(
310
312
  `Skipping dependency installation because no package.json was found for ${destPath}`
@@ -333,6 +335,7 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
333
335
  opts.env = getEnvForPackageManager({
334
336
  cliType,
335
337
  lockfileVersion,
338
+ packageJsonPackageManager: packageJson?.packageManager,
336
339
  nodeVersion,
337
340
  env
338
341
  });
@@ -384,9 +387,12 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
384
387
  function getEnvForPackageManager({
385
388
  cliType,
386
389
  lockfileVersion,
390
+ packageJsonPackageManager,
387
391
  nodeVersion,
388
392
  env
389
393
  }) {
394
+ const corepackFlagged = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
395
+ const corepackEnabled = corepackFlagged && Boolean(packageJsonPackageManager);
390
396
  const {
391
397
  detectedLockfile,
392
398
  detectedPackageManager,
@@ -394,13 +400,18 @@ function getEnvForPackageManager({
394
400
  } = getPathOverrideForPackageManager({
395
401
  cliType,
396
402
  lockfileVersion,
397
- nodeVersion,
398
- env
403
+ corepackEnabled,
404
+ nodeVersion
399
405
  });
400
- const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
401
- (0, import_debug.default)(
402
- `Detected ${detectedPackageManager} given lockfileVersion "${lockfileVersion}", package manager cli "${cliType}", and corepack enabled? ${corepackEnabled}: ${newPath}`
403
- );
406
+ if (corepackEnabled) {
407
+ (0, import_debug.default)(
408
+ `Detected corepack use for "${packageJsonPackageManager}". Not overriding package manager version.`
409
+ );
410
+ } else {
411
+ (0, import_debug.default)(
412
+ `Detected ${detectedPackageManager}. Added "${newPath}" to path. Based on assumed package manager "${cliType}", lockfile "${detectedLockfile}", and lockfileVersion "${lockfileVersion}"`
413
+ );
414
+ }
404
415
  const newEnv = {
405
416
  ...env
406
417
  };
@@ -454,15 +465,14 @@ function shouldUseNpm7(lockfileVersion, nodeVersion) {
454
465
  function getPathOverrideForPackageManager({
455
466
  cliType,
456
467
  lockfileVersion,
457
- nodeVersion,
458
- env
468
+ corepackEnabled,
469
+ nodeVersion
459
470
  }) {
460
471
  const no_override = {
461
472
  detectedLockfile: void 0,
462
473
  detectedPackageManager: void 0,
463
474
  path: void 0
464
475
  };
465
- const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
466
476
  switch (cliType) {
467
477
  case "npm":
468
478
  switch (true) {
@@ -524,11 +534,12 @@ function getPathForPackageManager({
524
534
  nodeVersion,
525
535
  env
526
536
  }) {
537
+ const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
527
538
  const overrides = getPathOverrideForPackageManager({
528
539
  cliType,
529
540
  lockfileVersion,
530
- nodeVersion,
531
- env
541
+ corepackEnabled,
542
+ nodeVersion
532
543
  });
533
544
  const alreadyInPath = (newPath) => {
534
545
  const oldPath = env.PATH ?? "";
@@ -555,10 +566,14 @@ async function runCustomInstallCommand({
555
566
  spawnOpts
556
567
  }) {
557
568
  console.log(`Running "install" command: \`${installCommand}\`...`);
558
- const { cliType, lockfileVersion } = await scanParentDirs(destPath);
569
+ const { cliType, lockfileVersion, packageJson } = await scanParentDirs(
570
+ destPath,
571
+ true
572
+ );
559
573
  const env = getEnvForPackageManager({
560
574
  cliType,
561
575
  lockfileVersion,
576
+ packageJsonPackageManager: packageJson?.packageManager,
562
577
  nodeVersion,
563
578
  env: spawnOpts?.env || {}
564
579
  });
@@ -589,6 +604,7 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
589
604
  env: getEnvForPackageManager({
590
605
  cliType,
591
606
  lockfileVersion,
607
+ packageJsonPackageManager: packageJson?.packageManager,
592
608
  nodeVersion: void 0,
593
609
  env: (0, import_clone_env.cloneEnv)(process.env, spawnOpts?.env)
594
610
  })
package/dist/index.js CHANGED
@@ -21895,33 +21895,37 @@ function getSpawnOptions(meta, nodeVersion) {
21895
21895
  }
21896
21896
  return opts;
21897
21897
  }
21898
- async function getNodeVersion(destPath, nodeVersionFallback = process.env.VERCEL_PROJECT_SETTINGS_NODE_VERSION, config = {}, meta = {}, availableVersions = getAvailableNodeVersions()) {
21899
- const latest = getLatestNodeVersion(availableVersions);
21898
+ async function getNodeVersion(destPath, fallbackVersion = process.env.VERCEL_PROJECT_SETTINGS_NODE_VERSION, config = {}, meta = {}, availableVersions = getAvailableNodeVersions()) {
21899
+ const latestVersion = getLatestNodeVersion(availableVersions);
21900
21900
  if (meta.isDev) {
21901
- return { ...latest, runtime: "nodejs" };
21901
+ return { ...latestVersion, runtime: "nodejs" };
21902
21902
  }
21903
21903
  const { packageJson } = await scanParentDirs(destPath, true);
21904
- let nodeVersion = config.nodeVersion || nodeVersionFallback;
21905
- let isAuto = true;
21904
+ const configuredVersion = config.nodeVersion || fallbackVersion;
21905
+ const packageJsonVersion = packageJson?.engines?.node;
21906
+ const supportedNodeVersion = await getSupportedNodeVersion(
21907
+ packageJsonVersion || configuredVersion,
21908
+ !packageJsonVersion,
21909
+ availableVersions
21910
+ );
21906
21911
  if (packageJson?.engines?.node) {
21907
21912
  const { node } = packageJson.engines;
21908
- if (nodeVersion && (0, import_semver2.validRange)(node) && !(0, import_semver2.intersects)(nodeVersion, node)) {
21913
+ if (configuredVersion && !(0, import_semver2.intersects)(configuredVersion, supportedNodeVersion.range)) {
21909
21914
  console.warn(
21910
- `Warning: Due to "engines": { "node": "${node}" } in your \`package.json\` file, the Node.js Version defined in your Project Settings ("${nodeVersion}") will not apply. Learn More: http://vercel.link/node-version`
21915
+ `Warning: Due to "engines": { "node": "${node}" } in your \`package.json\` file, the Node.js Version defined in your Project Settings ("${configuredVersion}") will not apply. Learn More: http://vercel.link/node-version`
21911
21916
  );
21912
- } else if ((0, import_semver2.coerce)(node)?.raw === node) {
21917
+ }
21918
+ if ((0, import_semver2.coerce)(node)?.raw === node) {
21913
21919
  console.warn(
21914
21920
  `Warning: Detected "engines": { "node": "${node}" } in your \`package.json\` with major.minor.patch, but only major Node.js Version can be selected. Learn More: http://vercel.link/node-version`
21915
21921
  );
21916
- } else if ((0, import_semver2.validRange)(node) && (0, import_semver2.intersects)(`${latest.major + 1}.x`, node)) {
21922
+ } else if ((0, import_semver2.validRange)(node) && (0, import_semver2.intersects)(`${latestVersion.major + 1}.x`, node)) {
21917
21923
  console.warn(
21918
21924
  `Warning: Detected "engines": { "node": "${node}" } in your \`package.json\` that will automatically upgrade when a new major Node.js Version is released. Learn More: http://vercel.link/node-version`
21919
21925
  );
21920
21926
  }
21921
- nodeVersion = node;
21922
- isAuto = false;
21923
21927
  }
21924
- return getSupportedNodeVersion(nodeVersion, isAuto, availableVersions);
21928
+ return supportedNodeVersion;
21925
21929
  }
21926
21930
  async function scanParentDirs(destPath, readPackageJson = false, base = "/") {
21927
21931
  (0, import_assert6.default)(import_path5.default.isAbsolute(destPath));
@@ -22024,9 +22028,7 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
22024
22028
  (0, import_assert6.default)(import_path5.default.isAbsolute(destPath));
22025
22029
  try {
22026
22030
  await runNpmInstallSema.acquire();
22027
- const { cliType, packageJsonPath, lockfileVersion } = await scanParentDirs(
22028
- destPath
22029
- );
22031
+ const { cliType, packageJsonPath, packageJson, lockfileVersion } = await scanParentDirs(destPath, true);
22030
22032
  if (!packageJsonPath) {
22031
22033
  debug(
22032
22034
  `Skipping dependency installation because no package.json was found for ${destPath}`
@@ -22055,6 +22057,7 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
22055
22057
  opts.env = getEnvForPackageManager({
22056
22058
  cliType,
22057
22059
  lockfileVersion,
22060
+ packageJsonPackageManager: packageJson?.packageManager,
22058
22061
  nodeVersion,
22059
22062
  env
22060
22063
  });
@@ -22106,9 +22109,12 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
22106
22109
  function getEnvForPackageManager({
22107
22110
  cliType,
22108
22111
  lockfileVersion,
22112
+ packageJsonPackageManager,
22109
22113
  nodeVersion,
22110
22114
  env
22111
22115
  }) {
22116
+ const corepackFlagged = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
22117
+ const corepackEnabled = corepackFlagged && Boolean(packageJsonPackageManager);
22112
22118
  const {
22113
22119
  detectedLockfile,
22114
22120
  detectedPackageManager,
@@ -22116,13 +22122,18 @@ function getEnvForPackageManager({
22116
22122
  } = getPathOverrideForPackageManager({
22117
22123
  cliType,
22118
22124
  lockfileVersion,
22119
- nodeVersion,
22120
- env
22125
+ corepackEnabled,
22126
+ nodeVersion
22121
22127
  });
22122
- const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
22123
- debug(
22124
- `Detected ${detectedPackageManager} given lockfileVersion "${lockfileVersion}", package manager cli "${cliType}", and corepack enabled? ${corepackEnabled}: ${newPath}`
22125
- );
22128
+ if (corepackEnabled) {
22129
+ debug(
22130
+ `Detected corepack use for "${packageJsonPackageManager}". Not overriding package manager version.`
22131
+ );
22132
+ } else {
22133
+ debug(
22134
+ `Detected ${detectedPackageManager}. Added "${newPath}" to path. Based on assumed package manager "${cliType}", lockfile "${detectedLockfile}", and lockfileVersion "${lockfileVersion}"`
22135
+ );
22136
+ }
22126
22137
  const newEnv = {
22127
22138
  ...env
22128
22139
  };
@@ -22176,15 +22187,14 @@ function shouldUseNpm7(lockfileVersion, nodeVersion) {
22176
22187
  function getPathOverrideForPackageManager({
22177
22188
  cliType,
22178
22189
  lockfileVersion,
22179
- nodeVersion,
22180
- env
22190
+ corepackEnabled,
22191
+ nodeVersion
22181
22192
  }) {
22182
22193
  const no_override = {
22183
22194
  detectedLockfile: void 0,
22184
22195
  detectedPackageManager: void 0,
22185
22196
  path: void 0
22186
22197
  };
22187
- const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
22188
22198
  switch (cliType) {
22189
22199
  case "npm":
22190
22200
  switch (true) {
@@ -22246,11 +22256,12 @@ function getPathForPackageManager({
22246
22256
  nodeVersion,
22247
22257
  env
22248
22258
  }) {
22259
+ const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
22249
22260
  const overrides = getPathOverrideForPackageManager({
22250
22261
  cliType,
22251
22262
  lockfileVersion,
22252
- nodeVersion,
22253
- env
22263
+ corepackEnabled,
22264
+ nodeVersion
22254
22265
  });
22255
22266
  const alreadyInPath = (newPath) => {
22256
22267
  const oldPath = env.PATH ?? "";
@@ -22277,10 +22288,14 @@ async function runCustomInstallCommand({
22277
22288
  spawnOpts
22278
22289
  }) {
22279
22290
  console.log(`Running "install" command: \`${installCommand}\`...`);
22280
- const { cliType, lockfileVersion } = await scanParentDirs(destPath);
22291
+ const { cliType, lockfileVersion, packageJson } = await scanParentDirs(
22292
+ destPath,
22293
+ true
22294
+ );
22281
22295
  const env = getEnvForPackageManager({
22282
22296
  cliType,
22283
22297
  lockfileVersion,
22298
+ packageJsonPackageManager: packageJson?.packageManager,
22284
22299
  nodeVersion,
22285
22300
  env: spawnOpts?.env || {}
22286
22301
  });
@@ -22311,6 +22326,7 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
22311
22326
  env: getEnvForPackageManager({
22312
22327
  cliType,
22313
22328
  lockfileVersion,
22329
+ packageJsonPackageManager: packageJson?.packageManager,
22314
22330
  nodeVersion: void 0,
22315
22331
  env: cloneEnv(process.env, spawnOpts?.env)
22316
22332
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vercel/build-utils",
3
- "version": "8.1.3",
3
+ "version": "8.2.0",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.js",