@vercel/build-utils 8.1.2 → 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,21 @@
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
+
13
+ ## 8.1.3
14
+
15
+ ### Patch Changes
16
+
17
+ - [build-utils] log more around package manager detection ([#11594](https://github.com/vercel/vercel/pull/11594))
18
+
3
19
  ## 8.1.2
4
20
 
5
21
  ### 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,12 +400,18 @@ function getEnvForPackageManager({
394
400
  } = getPathOverrideForPackageManager({
395
401
  cliType,
396
402
  lockfileVersion,
397
- nodeVersion,
398
- env
403
+ corepackEnabled,
404
+ nodeVersion
399
405
  });
400
- (0, import_debug.default)(
401
- `Detected ${detectedPackageManager} with lockfileVersion ${lockfileVersion} (${typeof lockfileVersion}): ${newPath}`
402
- );
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
+ }
403
415
  const newEnv = {
404
416
  ...env
405
417
  };
@@ -453,15 +465,14 @@ function shouldUseNpm7(lockfileVersion, nodeVersion) {
453
465
  function getPathOverrideForPackageManager({
454
466
  cliType,
455
467
  lockfileVersion,
456
- nodeVersion,
457
- env
468
+ corepackEnabled,
469
+ nodeVersion
458
470
  }) {
459
471
  const no_override = {
460
472
  detectedLockfile: void 0,
461
473
  detectedPackageManager: void 0,
462
474
  path: void 0
463
475
  };
464
- const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
465
476
  switch (cliType) {
466
477
  case "npm":
467
478
  switch (true) {
@@ -523,15 +534,13 @@ function getPathForPackageManager({
523
534
  nodeVersion,
524
535
  env
525
536
  }) {
537
+ const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
526
538
  const overrides = getPathOverrideForPackageManager({
527
539
  cliType,
528
540
  lockfileVersion,
529
- nodeVersion,
530
- env
541
+ corepackEnabled,
542
+ nodeVersion
531
543
  });
532
- (0, import_debug.default)(
533
- `Detected ${overrides.detectedPackageManager} with lockfileVersion ${lockfileVersion} (${typeof lockfileVersion}): ${overrides.path}`
534
- );
535
544
  const alreadyInPath = (newPath) => {
536
545
  const oldPath = env.PATH ?? "";
537
546
  return oldPath.split(import_path.default.delimiter).includes(newPath);
@@ -557,10 +566,14 @@ async function runCustomInstallCommand({
557
566
  spawnOpts
558
567
  }) {
559
568
  console.log(`Running "install" command: \`${installCommand}\`...`);
560
- const { cliType, lockfileVersion } = await scanParentDirs(destPath);
569
+ const { cliType, lockfileVersion, packageJson } = await scanParentDirs(
570
+ destPath,
571
+ true
572
+ );
561
573
  const env = getEnvForPackageManager({
562
574
  cliType,
563
575
  lockfileVersion,
576
+ packageJsonPackageManager: packageJson?.packageManager,
564
577
  nodeVersion,
565
578
  env: spawnOpts?.env || {}
566
579
  });
@@ -591,6 +604,7 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
591
604
  env: getEnvForPackageManager({
592
605
  cliType,
593
606
  lockfileVersion,
607
+ packageJsonPackageManager: packageJson?.packageManager,
594
608
  nodeVersion: void 0,
595
609
  env: (0, import_clone_env.cloneEnv)(process.env, spawnOpts?.env)
596
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,12 +22122,18 @@ function getEnvForPackageManager({
22116
22122
  } = getPathOverrideForPackageManager({
22117
22123
  cliType,
22118
22124
  lockfileVersion,
22119
- nodeVersion,
22120
- env
22125
+ corepackEnabled,
22126
+ nodeVersion
22121
22127
  });
22122
- debug(
22123
- `Detected ${detectedPackageManager} with lockfileVersion ${lockfileVersion} (${typeof lockfileVersion}): ${newPath}`
22124
- );
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
+ }
22125
22137
  const newEnv = {
22126
22138
  ...env
22127
22139
  };
@@ -22175,15 +22187,14 @@ function shouldUseNpm7(lockfileVersion, nodeVersion) {
22175
22187
  function getPathOverrideForPackageManager({
22176
22188
  cliType,
22177
22189
  lockfileVersion,
22178
- nodeVersion,
22179
- env
22190
+ corepackEnabled,
22191
+ nodeVersion
22180
22192
  }) {
22181
22193
  const no_override = {
22182
22194
  detectedLockfile: void 0,
22183
22195
  detectedPackageManager: void 0,
22184
22196
  path: void 0
22185
22197
  };
22186
- const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
22187
22198
  switch (cliType) {
22188
22199
  case "npm":
22189
22200
  switch (true) {
@@ -22245,15 +22256,13 @@ function getPathForPackageManager({
22245
22256
  nodeVersion,
22246
22257
  env
22247
22258
  }) {
22259
+ const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
22248
22260
  const overrides = getPathOverrideForPackageManager({
22249
22261
  cliType,
22250
22262
  lockfileVersion,
22251
- nodeVersion,
22252
- env
22263
+ corepackEnabled,
22264
+ nodeVersion
22253
22265
  });
22254
- debug(
22255
- `Detected ${overrides.detectedPackageManager} with lockfileVersion ${lockfileVersion} (${typeof lockfileVersion}): ${overrides.path}`
22256
- );
22257
22266
  const alreadyInPath = (newPath) => {
22258
22267
  const oldPath = env.PATH ?? "";
22259
22268
  return oldPath.split(import_path5.default.delimiter).includes(newPath);
@@ -22279,10 +22288,14 @@ async function runCustomInstallCommand({
22279
22288
  spawnOpts
22280
22289
  }) {
22281
22290
  console.log(`Running "install" command: \`${installCommand}\`...`);
22282
- const { cliType, lockfileVersion } = await scanParentDirs(destPath);
22291
+ const { cliType, lockfileVersion, packageJson } = await scanParentDirs(
22292
+ destPath,
22293
+ true
22294
+ );
22283
22295
  const env = getEnvForPackageManager({
22284
22296
  cliType,
22285
22297
  lockfileVersion,
22298
+ packageJsonPackageManager: packageJson?.packageManager,
22286
22299
  nodeVersion,
22287
22300
  env: spawnOpts?.env || {}
22288
22301
  });
@@ -22313,6 +22326,7 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
22313
22326
  env: getEnvForPackageManager({
22314
22327
  cliType,
22315
22328
  lockfileVersion,
22329
+ packageJsonPackageManager: packageJson?.packageManager,
22316
22330
  nodeVersion: void 0,
22317
22331
  env: cloneEnv(process.env, spawnOpts?.env)
22318
22332
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vercel/build-utils",
3
- "version": "8.1.2",
3
+ "version": "8.2.0",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.js",