@vercel/build-utils 8.3.1 → 8.3.3

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,17 @@
1
1
  # @vercel/build-utils
2
2
 
3
+ ## 8.3.3
4
+
5
+ ### Patch Changes
6
+
7
+ - Fix corepack `packageManager` detection on monorepos ([#11811](https://github.com/vercel/vercel/pull/11811))
8
+
9
+ ## 8.3.2
10
+
11
+ ### Patch Changes
12
+
13
+ - reject mismatched corepack and detected package managers ([#11603](https://github.com/vercel/vercel/pull/11603))
14
+
3
15
  ## 8.3.1
4
16
 
5
17
  ### Patch Changes
@@ -26,6 +26,12 @@ export interface ScanParentDirsResult {
26
26
  * or `undefined` if not found.
27
27
  */
28
28
  lockfileVersion?: number;
29
+ /**
30
+ * The contents of the `packageManager` field from `package.json` if found.
31
+ * The value may come from a different `package.json` file than the one
32
+ * specified by `packageJsonPath`, in the case of a monorepo.
33
+ */
34
+ packageJsonPackageManager?: string;
29
35
  }
30
36
  export interface TraverseUpDirectoriesProps {
31
37
  /**
@@ -97,11 +103,12 @@ export declare function getEnvForPackageManager({ cliType, lockfileVersion, pack
97
103
  * Helper to get the binary paths that link to the used package manager.
98
104
  * Note: Make sure it doesn't contain any `console.log` calls.
99
105
  */
100
- export declare function getPathOverrideForPackageManager({ cliType, lockfileVersion, corepackEnabled, nodeVersion, }: {
106
+ export declare function getPathOverrideForPackageManager({ cliType, lockfileVersion, corepackPackageManager, corepackEnabled, }: {
101
107
  cliType: CliType;
102
108
  lockfileVersion: number | undefined;
103
- corepackEnabled: boolean;
109
+ corepackPackageManager: string | undefined;
104
110
  nodeVersion: NodeVersion | undefined;
111
+ corepackEnabled?: boolean;
105
112
  }): {
106
113
  /**
107
114
  * Which lockfile was detected.
@@ -117,6 +124,15 @@ export declare function getPathOverrideForPackageManager({ cliType, lockfileVers
117
124
  */
118
125
  path: string | undefined;
119
126
  };
127
+ export declare function detectPackageManager(cliType: CliType, lockfileVersion: number | undefined): {
128
+ path: string;
129
+ detectedLockfile: string;
130
+ detectedPackageManager: string;
131
+ } | {
132
+ path: undefined;
133
+ detectedLockfile: string;
134
+ detectedPackageManager: string;
135
+ } | undefined;
120
136
  /**
121
137
  * Helper to get the binary paths that link to the used package manager.
122
138
  * Note: Make sure it doesn't contain any `console.log` calls.
@@ -28,6 +28,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
  var run_user_scripts_exports = {};
30
30
  __export(run_user_scripts_exports, {
31
+ detectPackageManager: () => detectPackageManager,
31
32
  execCommand: () => execCommand,
32
33
  getEnvForPackageManager: () => getEnvForPackageManager,
33
34
  getNodeBinPath: () => getNodeBinPath,
@@ -64,6 +65,11 @@ var import_node_version = require("./node-version");
64
65
  var import_read_config_file = require("./read-config-file");
65
66
  var import_clone_env = require("../clone-env");
66
67
  const runNpmInstallSema = new import_async_sema.default(1);
68
+ const NO_OVERRIDE = {
69
+ detectedLockfile: void 0,
70
+ detectedPackageManager: void 0,
71
+ path: void 0
72
+ };
67
73
  function spawnAsync(command, args, opts = {}) {
68
74
  return new Promise((resolve, reject) => {
69
75
  const stderrLogs = [];
@@ -213,7 +219,10 @@ async function scanParentDirs(destPath, readPackageJson = false, base = "/") {
213
219
  filename: "package.json"
214
220
  });
215
221
  const packageJson = readPackageJson && pkgJsonPath ? JSON.parse(await import_fs_extra.default.readFile(pkgJsonPath, "utf8")) : void 0;
216
- const [yarnLockPath, npmLockPath, pnpmLockPath, bunLockPath] = await walkParentDirsMulti({
222
+ const {
223
+ paths: [yarnLockPath, npmLockPath, pnpmLockPath, bunLockPath],
224
+ packageJsonPackageManager
225
+ } = await walkParentDirsMulti({
217
226
  base,
218
227
  start: destPath,
219
228
  filenames: [
@@ -252,19 +261,21 @@ async function scanParentDirs(destPath, readPackageJson = false, base = "/") {
252
261
  lockfilePath = bunLockPath;
253
262
  lockfileVersion = 0;
254
263
  } else {
255
- cliType = packageJson ? detectPackageManagerNameWithoutLockfile(packageJson) : "npm";
264
+ cliType = detectPackageManagerNameWithoutLockfile(
265
+ packageJsonPackageManager
266
+ );
256
267
  }
257
268
  const packageJsonPath = pkgJsonPath || void 0;
258
269
  return {
259
270
  cliType,
260
271
  packageJson,
272
+ packageJsonPackageManager,
261
273
  lockfilePath,
262
274
  lockfileVersion,
263
275
  packageJsonPath
264
276
  };
265
277
  }
266
- function detectPackageManagerNameWithoutLockfile(packageJson) {
267
- const packageJsonPackageManager = packageJson.packageManager;
278
+ function detectPackageManagerNameWithoutLockfile(packageJsonPackageManager) {
268
279
  if (usingCorepack(process.env, packageJsonPackageManager)) {
269
280
  const corepackPackageManager = validateVersionSpecifier(
270
281
  packageJsonPackageManager
@@ -309,17 +320,26 @@ async function walkParentDirsMulti({
309
320
  start,
310
321
  filenames
311
322
  }) {
323
+ let packageManager;
312
324
  for (const dir of traverseUpDirectories({ start, base })) {
313
325
  const fullPaths = filenames.map((f) => import_path.default.join(dir, f));
314
326
  const existResults = await Promise.all(
315
327
  fullPaths.map((f) => import_fs_extra.default.pathExists(f))
316
328
  );
317
329
  const foundOneOrMore = existResults.some((b) => b);
330
+ const packageJsonPath = import_path.default.join(dir, "package.json");
331
+ const packageJson = await import_fs_extra.default.readJSON(packageJsonPath).catch(() => null);
332
+ if (packageJson?.packageManager) {
333
+ packageManager = packageJson.packageManager;
334
+ }
318
335
  if (foundOneOrMore) {
319
- return fullPaths.map((f, i) => existResults[i] ? f : void 0);
336
+ return {
337
+ paths: fullPaths.map((f, i) => existResults[i] ? f : void 0),
338
+ packageJsonPackageManager: packageManager
339
+ };
320
340
  }
321
341
  }
322
- return [];
342
+ return { paths: [], packageJsonPackageManager: packageManager };
323
343
  }
324
344
  function isSet(v) {
325
345
  return v?.constructor?.name === "Set";
@@ -332,7 +352,12 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
332
352
  (0, import_assert.default)(import_path.default.isAbsolute(destPath));
333
353
  try {
334
354
  await runNpmInstallSema.acquire();
335
- const { cliType, packageJsonPath, packageJson, lockfileVersion } = await scanParentDirs(destPath, true);
355
+ const {
356
+ cliType,
357
+ packageJsonPath,
358
+ lockfileVersion,
359
+ packageJsonPackageManager
360
+ } = await scanParentDirs(destPath);
336
361
  if (!packageJsonPath) {
337
362
  (0, import_debug.default)(
338
363
  `Skipping dependency installation because no package.json was found for ${destPath}`
@@ -361,7 +386,7 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
361
386
  opts.env = getEnvForPackageManager({
362
387
  cliType,
363
388
  lockfileVersion,
364
- packageJsonPackageManager: packageJson?.packageManager,
389
+ packageJsonPackageManager,
365
390
  nodeVersion,
366
391
  env
367
392
  });
@@ -425,8 +450,9 @@ function getEnvForPackageManager({
425
450
  } = getPathOverrideForPackageManager({
426
451
  cliType,
427
452
  lockfileVersion,
428
- corepackEnabled,
429
- nodeVersion
453
+ corepackPackageManager: packageJsonPackageManager,
454
+ nodeVersion,
455
+ corepackEnabled
430
456
  });
431
457
  if (corepackEnabled) {
432
458
  (0, import_debug.default)(
@@ -464,10 +490,8 @@ function getEnvForPackageManager({
464
490
  }
465
491
  return newEnv;
466
492
  }
467
- function detectPnpmVersion(lockfileVersion, corepackEnabled) {
493
+ function detectPnpmVersion(lockfileVersion) {
468
494
  switch (true) {
469
- case corepackEnabled:
470
- return "corepack_enabled";
471
495
  case lockfileVersion === void 0:
472
496
  return "not found";
473
497
  case lockfileVersion === 5.3:
@@ -482,98 +506,154 @@ function detectPnpmVersion(lockfileVersion, corepackEnabled) {
482
506
  return "not found";
483
507
  }
484
508
  }
485
- function shouldUseNpm7(lockfileVersion, nodeVersion) {
486
- if (lockfileVersion === void 0)
487
- return false;
488
- return lockfileVersion >= 2 && (nodeVersion?.major || 0) < 16;
509
+ function validLockfileForPackageManager(cliType, lockfileVersion, packageManagerVersion) {
510
+ const packageManagerMajorVersion = packageManagerVersion.major;
511
+ switch (cliType) {
512
+ case "npm":
513
+ case "bun":
514
+ case "yarn":
515
+ return true;
516
+ case "pnpm":
517
+ switch (packageManagerMajorVersion) {
518
+ case 9:
519
+ if ("9.0.0" === packageManagerVersion.version && lockfileVersion === 6) {
520
+ return false;
521
+ }
522
+ return [6, 7, 9].includes(lockfileVersion);
523
+ case 8:
524
+ return [6, 6.1].includes(lockfileVersion);
525
+ case 7:
526
+ return [5.3, 5.4].includes(lockfileVersion);
527
+ case 6:
528
+ return [5.3, 5.4].includes(lockfileVersion);
529
+ default:
530
+ return true;
531
+ }
532
+ }
489
533
  }
490
534
  function getPathOverrideForPackageManager({
491
535
  cliType,
492
536
  lockfileVersion,
493
- corepackEnabled,
494
- nodeVersion
537
+ corepackPackageManager,
538
+ corepackEnabled = true
495
539
  }) {
496
- const no_override = {
497
- detectedLockfile: void 0,
498
- detectedPackageManager: void 0,
499
- path: void 0
540
+ const detectedPackageManger = detectPackageManager(cliType, lockfileVersion);
541
+ if (!corepackPackageManager) {
542
+ return detectedPackageManger ?? NO_OVERRIDE;
543
+ }
544
+ if (lockfileVersion === void 0 || !corepackEnabled) {
545
+ return NO_OVERRIDE;
546
+ }
547
+ if (validateCorepackPackageManager(
548
+ cliType,
549
+ lockfileVersion,
550
+ corepackPackageManager
551
+ )) {
552
+ return NO_OVERRIDE;
553
+ }
554
+ console.warn(
555
+ `WARN [package-manager-warning-1] Detected lockfile "${lockfileVersion}" which is not compatible with the intended corepack package manager "${corepackPackageManager}". Update your lockfile or change to a compatible corepack version.`
556
+ );
557
+ return NO_OVERRIDE;
558
+ }
559
+ function validateCorepackPackageManager(cliType, lockfileVersion, corepackPackageManager) {
560
+ const validatedCorepackPackageManager = validateVersionSpecifier(
561
+ corepackPackageManager
562
+ );
563
+ if (!validatedCorepackPackageManager) {
564
+ console.warn(
565
+ `WARN [package-manager-warning-2] Intended corepack defined package manager "${corepackPackageManager}" is not a valid semver value.`
566
+ );
567
+ return false;
568
+ }
569
+ if (cliType !== validatedCorepackPackageManager.packageName) {
570
+ console.warn(
571
+ `WARN [package-manager-warning-3] Detected package manager "${cliType}" does not match intended corepack defined package manager "${validatedCorepackPackageManager.packageName}". Change your lockfile or "package.json#packageManager" value to match.`
572
+ );
573
+ return false;
574
+ }
575
+ const corepackPackageManagerVersion = (0, import_semver.coerce)(
576
+ validatedCorepackPackageManager.packageVersionRange
577
+ );
578
+ if (corepackPackageManagerVersion === null) {
579
+ return true;
580
+ } else {
581
+ return validLockfileForPackageManager(
582
+ cliType,
583
+ lockfileVersion,
584
+ corepackPackageManagerVersion
585
+ );
586
+ }
587
+ }
588
+ function validateVersionSpecifier(version) {
589
+ if (!version) {
590
+ return void 0;
591
+ }
592
+ const [before, after, ...extra] = version.split("@");
593
+ if (extra.length) {
594
+ return void 0;
595
+ }
596
+ if (!before) {
597
+ return void 0;
598
+ }
599
+ if (!after) {
600
+ return void 0;
601
+ }
602
+ if (!(0, import_semver.validRange)(after)) {
603
+ return void 0;
604
+ }
605
+ return {
606
+ packageName: before,
607
+ packageVersionRange: after
500
608
  };
609
+ }
610
+ function detectPackageManager(cliType, lockfileVersion) {
501
611
  switch (cliType) {
502
612
  case "npm":
503
- switch (true) {
504
- case corepackEnabled:
505
- return no_override;
506
- case shouldUseNpm7(lockfileVersion, nodeVersion):
507
- return {
508
- path: "/node16/bin-npm7",
509
- detectedLockfile: "package-lock.json",
510
- detectedPackageManager: "npm 7+"
511
- };
512
- default:
513
- return no_override;
514
- }
613
+ return void 0;
515
614
  case "pnpm":
516
- switch (detectPnpmVersion(lockfileVersion, corepackEnabled)) {
517
- case "corepack_enabled":
518
- return no_override;
615
+ switch (detectPnpmVersion(lockfileVersion)) {
519
616
  case "pnpm 7":
520
617
  return {
521
618
  path: "/pnpm7/node_modules/.bin",
522
619
  detectedLockfile: "pnpm-lock.yaml",
523
- detectedPackageManager: "pnpm 7"
620
+ detectedPackageManager: "pnpm@7.x"
524
621
  };
525
622
  case "pnpm 8":
526
623
  return {
527
624
  path: "/pnpm8/node_modules/.bin",
528
625
  detectedLockfile: "pnpm-lock.yaml",
529
- detectedPackageManager: "pnpm 8"
626
+ detectedPackageManager: "pnpm@8.x"
530
627
  };
531
628
  case "pnpm 9":
532
629
  return {
533
630
  path: "/pnpm9/node_modules/.bin",
534
631
  detectedLockfile: "pnpm-lock.yaml",
535
- detectedPackageManager: "pnpm 9"
632
+ detectedPackageManager: "pnpm@9.x"
536
633
  };
537
634
  case "pnpm 6":
538
- default:
539
- return no_override;
540
- }
541
- case "bun":
542
- switch (true) {
543
- case corepackEnabled:
544
- return no_override;
545
- default:
546
635
  return {
547
- path: "/bun1",
548
- detectedLockfile: "bun.lockb",
549
- detectedPackageManager: "Bun"
636
+ // undefined because pnpm@6 is the current default in the build container
637
+ path: void 0,
638
+ detectedLockfile: "pnpm-lock.yaml",
639
+ detectedPackageManager: "pnpm 6"
550
640
  };
641
+ default:
642
+ return void 0;
551
643
  }
644
+ case "bun":
645
+ return {
646
+ path: "/bun1",
647
+ detectedLockfile: "bun.lockb",
648
+ detectedPackageManager: "bun@1.x"
649
+ };
552
650
  case "yarn":
553
- return no_override;
554
- }
555
- }
556
- function validateVersionSpecifier(version) {
557
- if (!version) {
558
- return void 0;
559
- }
560
- const [before, after, ...extra] = version.split("@");
561
- if (extra.length) {
562
- return void 0;
563
- }
564
- if (!before) {
565
- return void 0;
566
- }
567
- if (!after) {
568
- return void 0;
569
- }
570
- if (!(0, import_semver.validRange)(after)) {
571
- return void 0;
651
+ return {
652
+ path: void 0,
653
+ detectedLockfile: "yarn.lock",
654
+ detectedPackageManager: "yarn"
655
+ };
572
656
  }
573
- return {
574
- packageName: before,
575
- packageVersionRange: after
576
- };
577
657
  }
578
658
  function getPathForPackageManager({
579
659
  cliType,
@@ -582,12 +662,15 @@ function getPathForPackageManager({
582
662
  env
583
663
  }) {
584
664
  const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
585
- const overrides = getPathOverrideForPackageManager({
665
+ let overrides = getPathOverrideForPackageManager({
586
666
  cliType,
587
667
  lockfileVersion,
588
- corepackEnabled,
668
+ corepackPackageManager: void 0,
589
669
  nodeVersion
590
670
  });
671
+ if (corepackEnabled) {
672
+ overrides = NO_OVERRIDE;
673
+ }
591
674
  const alreadyInPath = (newPath) => {
592
675
  const oldPath = env.PATH ?? "";
593
676
  return oldPath.split(import_path.default.delimiter).includes(newPath);
@@ -613,14 +696,11 @@ async function runCustomInstallCommand({
613
696
  spawnOpts
614
697
  }) {
615
698
  console.log(`Running "install" command: \`${installCommand}\`...`);
616
- const { cliType, lockfileVersion, packageJson } = await scanParentDirs(
617
- destPath,
618
- true
619
- );
699
+ const { cliType, lockfileVersion, packageJsonPackageManager } = await scanParentDirs(destPath);
620
700
  const env = getEnvForPackageManager({
621
701
  cliType,
622
702
  lockfileVersion,
623
- packageJsonPackageManager: packageJson?.packageManager,
703
+ packageJsonPackageManager,
624
704
  nodeVersion,
625
705
  env: spawnOpts?.env || {}
626
706
  });
@@ -633,10 +713,7 @@ async function runCustomInstallCommand({
633
713
  }
634
714
  async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
635
715
  (0, import_assert.default)(import_path.default.isAbsolute(destPath));
636
- const { packageJson, cliType, lockfileVersion } = await scanParentDirs(
637
- destPath,
638
- true
639
- );
716
+ const { packageJson, cliType, lockfileVersion, packageJsonPackageManager } = await scanParentDirs(destPath, true);
640
717
  const scriptName = getScriptName(
641
718
  packageJson,
642
719
  typeof scriptNames === "string" ? [scriptNames] : scriptNames
@@ -651,7 +728,7 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
651
728
  env: getEnvForPackageManager({
652
729
  cliType,
653
730
  lockfileVersion,
654
- packageJsonPackageManager: packageJson?.packageManager,
731
+ packageJsonPackageManager,
655
732
  nodeVersion: void 0,
656
733
  env: (0, import_clone_env.cloneEnv)(process.env, spawnOpts?.env)
657
734
  })
@@ -708,6 +785,7 @@ const installDependencies = (0, import_util.deprecate)(
708
785
  );
709
786
  // Annotate the CommonJS export names for ESM import in node:
710
787
  0 && (module.exports = {
788
+ detectPackageManager,
711
789
  execCommand,
712
790
  getEnvForPackageManager,
713
791
  getNodeBinPath,
package/dist/index.js CHANGED
@@ -13072,7 +13072,7 @@ var require_readShebang = __commonJS({
13072
13072
  // ../../node_modules/.pnpm/semver@5.7.2/node_modules/semver/semver.js
13073
13073
  var require_semver = __commonJS({
13074
13074
  "../../node_modules/.pnpm/semver@5.7.2/node_modules/semver/semver.js"(exports2, module2) {
13075
- exports2 = module2.exports = SemVer;
13075
+ exports2 = module2.exports = SemVer2;
13076
13076
  var debug2;
13077
13077
  if (typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG)) {
13078
13078
  debug2 = function() {
@@ -13205,7 +13205,7 @@ var require_semver = __commonJS({
13205
13205
  includePrerelease: false
13206
13206
  };
13207
13207
  }
13208
- if (version instanceof SemVer) {
13208
+ if (version instanceof SemVer2) {
13209
13209
  return version;
13210
13210
  }
13211
13211
  if (typeof version !== "string") {
@@ -13219,7 +13219,7 @@ var require_semver = __commonJS({
13219
13219
  return null;
13220
13220
  }
13221
13221
  try {
13222
- return new SemVer(version, options);
13222
+ return new SemVer2(version, options);
13223
13223
  } catch (er) {
13224
13224
  return null;
13225
13225
  }
@@ -13234,15 +13234,15 @@ var require_semver = __commonJS({
13234
13234
  var s = parse2(version.trim().replace(/^[=v]+/, ""), options);
13235
13235
  return s ? s.version : null;
13236
13236
  }
13237
- exports2.SemVer = SemVer;
13238
- function SemVer(version, options) {
13237
+ exports2.SemVer = SemVer2;
13238
+ function SemVer2(version, options) {
13239
13239
  if (!options || typeof options !== "object") {
13240
13240
  options = {
13241
13241
  loose: !!options,
13242
13242
  includePrerelease: false
13243
13243
  };
13244
13244
  }
13245
- if (version instanceof SemVer) {
13245
+ if (version instanceof SemVer2) {
13246
13246
  if (version.loose === options.loose) {
13247
13247
  return version;
13248
13248
  } else {
@@ -13254,8 +13254,8 @@ var require_semver = __commonJS({
13254
13254
  if (version.length > MAX_LENGTH) {
13255
13255
  throw new TypeError("version is longer than " + MAX_LENGTH + " characters");
13256
13256
  }
13257
- if (!(this instanceof SemVer)) {
13258
- return new SemVer(version, options);
13257
+ if (!(this instanceof SemVer2)) {
13258
+ return new SemVer2(version, options);
13259
13259
  }
13260
13260
  debug2("SemVer", version, options);
13261
13261
  this.options = options;
@@ -13293,32 +13293,32 @@ var require_semver = __commonJS({
13293
13293
  this.build = m[5] ? m[5].split(".") : [];
13294
13294
  this.format();
13295
13295
  }
13296
- SemVer.prototype.format = function() {
13296
+ SemVer2.prototype.format = function() {
13297
13297
  this.version = this.major + "." + this.minor + "." + this.patch;
13298
13298
  if (this.prerelease.length) {
13299
13299
  this.version += "-" + this.prerelease.join(".");
13300
13300
  }
13301
13301
  return this.version;
13302
13302
  };
13303
- SemVer.prototype.toString = function() {
13303
+ SemVer2.prototype.toString = function() {
13304
13304
  return this.version;
13305
13305
  };
13306
- SemVer.prototype.compare = function(other) {
13306
+ SemVer2.prototype.compare = function(other) {
13307
13307
  debug2("SemVer.compare", this.version, this.options, other);
13308
- if (!(other instanceof SemVer)) {
13309
- other = new SemVer(other, this.options);
13308
+ if (!(other instanceof SemVer2)) {
13309
+ other = new SemVer2(other, this.options);
13310
13310
  }
13311
13311
  return this.compareMain(other) || this.comparePre(other);
13312
13312
  };
13313
- SemVer.prototype.compareMain = function(other) {
13314
- if (!(other instanceof SemVer)) {
13315
- other = new SemVer(other, this.options);
13313
+ SemVer2.prototype.compareMain = function(other) {
13314
+ if (!(other instanceof SemVer2)) {
13315
+ other = new SemVer2(other, this.options);
13316
13316
  }
13317
13317
  return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch);
13318
13318
  };
13319
- SemVer.prototype.comparePre = function(other) {
13320
- if (!(other instanceof SemVer)) {
13321
- other = new SemVer(other, this.options);
13319
+ SemVer2.prototype.comparePre = function(other) {
13320
+ if (!(other instanceof SemVer2)) {
13321
+ other = new SemVer2(other, this.options);
13322
13322
  }
13323
13323
  if (this.prerelease.length && !other.prerelease.length) {
13324
13324
  return -1;
@@ -13345,7 +13345,7 @@ var require_semver = __commonJS({
13345
13345
  }
13346
13346
  } while (++i2);
13347
13347
  };
13348
- SemVer.prototype.inc = function(release, identifier) {
13348
+ SemVer2.prototype.inc = function(release, identifier) {
13349
13349
  switch (release) {
13350
13350
  case "premajor":
13351
13351
  this.prerelease.length = 0;
@@ -13431,7 +13431,7 @@ var require_semver = __commonJS({
13431
13431
  loose = void 0;
13432
13432
  }
13433
13433
  try {
13434
- return new SemVer(version, loose).inc(release, identifier).version;
13434
+ return new SemVer2(version, loose).inc(release, identifier).version;
13435
13435
  } catch (er) {
13436
13436
  return null;
13437
13437
  }
@@ -13475,19 +13475,19 @@ var require_semver = __commonJS({
13475
13475
  }
13476
13476
  exports2.major = major;
13477
13477
  function major(a, loose) {
13478
- return new SemVer(a, loose).major;
13478
+ return new SemVer2(a, loose).major;
13479
13479
  }
13480
13480
  exports2.minor = minor;
13481
13481
  function minor(a, loose) {
13482
- return new SemVer(a, loose).minor;
13482
+ return new SemVer2(a, loose).minor;
13483
13483
  }
13484
13484
  exports2.patch = patch;
13485
13485
  function patch(a, loose) {
13486
- return new SemVer(a, loose).patch;
13486
+ return new SemVer2(a, loose).patch;
13487
13487
  }
13488
13488
  exports2.compare = compare;
13489
13489
  function compare(a, b, loose) {
13490
- return new SemVer(a, loose).compare(new SemVer(b, loose));
13490
+ return new SemVer2(a, loose).compare(new SemVer2(b, loose));
13491
13491
  }
13492
13492
  exports2.compareLoose = compareLoose;
13493
13493
  function compareLoose(a, b) {
@@ -13610,7 +13610,7 @@ var require_semver = __commonJS({
13610
13610
  if (!m[2]) {
13611
13611
  this.semver = ANY;
13612
13612
  } else {
13613
- this.semver = new SemVer(m[2], this.options.loose);
13613
+ this.semver = new SemVer2(m[2], this.options.loose);
13614
13614
  }
13615
13615
  };
13616
13616
  Comparator.prototype.toString = function() {
@@ -13622,7 +13622,7 @@ var require_semver = __commonJS({
13622
13622
  return true;
13623
13623
  }
13624
13624
  if (typeof version === "string") {
13625
- version = new SemVer(version, this.options);
13625
+ version = new SemVer2(version, this.options);
13626
13626
  }
13627
13627
  return cmp(version, this.operator, this.semver, this.options);
13628
13628
  };
@@ -13919,7 +13919,7 @@ var require_semver = __commonJS({
13919
13919
  return false;
13920
13920
  }
13921
13921
  if (typeof version === "string") {
13922
- version = new SemVer(version, this.options);
13922
+ version = new SemVer2(version, this.options);
13923
13923
  }
13924
13924
  for (var i2 = 0; i2 < this.set.length; i2++) {
13925
13925
  if (testSet(this.set[i2], version, this.options)) {
@@ -13973,7 +13973,7 @@ var require_semver = __commonJS({
13973
13973
  if (rangeObj.test(v)) {
13974
13974
  if (!max || maxSV.compare(v) === -1) {
13975
13975
  max = v;
13976
- maxSV = new SemVer(max, options);
13976
+ maxSV = new SemVer2(max, options);
13977
13977
  }
13978
13978
  }
13979
13979
  });
@@ -13992,7 +13992,7 @@ var require_semver = __commonJS({
13992
13992
  if (rangeObj.test(v)) {
13993
13993
  if (!min || minSV.compare(v) === 1) {
13994
13994
  min = v;
13995
- minSV = new SemVer(min, options);
13995
+ minSV = new SemVer2(min, options);
13996
13996
  }
13997
13997
  }
13998
13998
  });
@@ -14001,11 +14001,11 @@ var require_semver = __commonJS({
14001
14001
  exports2.minVersion = minVersion;
14002
14002
  function minVersion(range, loose) {
14003
14003
  range = new Range(range, loose);
14004
- var minver = new SemVer("0.0.0");
14004
+ var minver = new SemVer2("0.0.0");
14005
14005
  if (range.test(minver)) {
14006
14006
  return minver;
14007
14007
  }
14008
- minver = new SemVer("0.0.0-0");
14008
+ minver = new SemVer2("0.0.0-0");
14009
14009
  if (range.test(minver)) {
14010
14010
  return minver;
14011
14011
  }
@@ -14013,7 +14013,7 @@ var require_semver = __commonJS({
14013
14013
  for (var i2 = 0; i2 < range.set.length; ++i2) {
14014
14014
  var comparators = range.set[i2];
14015
14015
  comparators.forEach(function(comparator) {
14016
- var compver = new SemVer(comparator.semver.version);
14016
+ var compver = new SemVer2(comparator.semver.version);
14017
14017
  switch (comparator.operator) {
14018
14018
  case ">":
14019
14019
  if (compver.prerelease.length === 0) {
@@ -14059,7 +14059,7 @@ var require_semver = __commonJS({
14059
14059
  }
14060
14060
  exports2.outside = outside;
14061
14061
  function outside(version, range, hilo, options) {
14062
- version = new SemVer(version, options);
14062
+ version = new SemVer2(version, options);
14063
14063
  range = new Range(range, options);
14064
14064
  var gtfn, ltefn, ltfn, comp, ecomp;
14065
14065
  switch (hilo) {
@@ -14123,7 +14123,7 @@ var require_semver = __commonJS({
14123
14123
  }
14124
14124
  exports2.coerce = coerce2;
14125
14125
  function coerce2(version) {
14126
- if (version instanceof SemVer) {
14126
+ if (version instanceof SemVer2) {
14127
14127
  return version;
14128
14128
  }
14129
14129
  if (typeof version !== "string") {
@@ -14304,7 +14304,7 @@ var require_cross_spawn = __commonJS({
14304
14304
  // ../../node_modules/.pnpm/semver@6.3.1/node_modules/semver/semver.js
14305
14305
  var require_semver2 = __commonJS({
14306
14306
  "../../node_modules/.pnpm/semver@6.3.1/node_modules/semver/semver.js"(exports2, module2) {
14307
- exports2 = module2.exports = SemVer;
14307
+ exports2 = module2.exports = SemVer2;
14308
14308
  var debug2;
14309
14309
  if (typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG)) {
14310
14310
  debug2 = function() {
@@ -14446,7 +14446,7 @@ var require_semver2 = __commonJS({
14446
14446
  includePrerelease: false
14447
14447
  };
14448
14448
  }
14449
- if (version instanceof SemVer) {
14449
+ if (version instanceof SemVer2) {
14450
14450
  return version;
14451
14451
  }
14452
14452
  if (typeof version !== "string") {
@@ -14460,7 +14460,7 @@ var require_semver2 = __commonJS({
14460
14460
  return null;
14461
14461
  }
14462
14462
  try {
14463
- return new SemVer(version, options);
14463
+ return new SemVer2(version, options);
14464
14464
  } catch (er) {
14465
14465
  return null;
14466
14466
  }
@@ -14475,15 +14475,15 @@ var require_semver2 = __commonJS({
14475
14475
  var s = parse2(version.trim().replace(/^[=v]+/, ""), options);
14476
14476
  return s ? s.version : null;
14477
14477
  }
14478
- exports2.SemVer = SemVer;
14479
- function SemVer(version, options) {
14478
+ exports2.SemVer = SemVer2;
14479
+ function SemVer2(version, options) {
14480
14480
  if (!options || typeof options !== "object") {
14481
14481
  options = {
14482
14482
  loose: !!options,
14483
14483
  includePrerelease: false
14484
14484
  };
14485
14485
  }
14486
- if (version instanceof SemVer) {
14486
+ if (version instanceof SemVer2) {
14487
14487
  if (version.loose === options.loose) {
14488
14488
  return version;
14489
14489
  } else {
@@ -14495,8 +14495,8 @@ var require_semver2 = __commonJS({
14495
14495
  if (version.length > MAX_LENGTH) {
14496
14496
  throw new TypeError("version is longer than " + MAX_LENGTH + " characters");
14497
14497
  }
14498
- if (!(this instanceof SemVer)) {
14499
- return new SemVer(version, options);
14498
+ if (!(this instanceof SemVer2)) {
14499
+ return new SemVer2(version, options);
14500
14500
  }
14501
14501
  debug2("SemVer", version, options);
14502
14502
  this.options = options;
@@ -14534,32 +14534,32 @@ var require_semver2 = __commonJS({
14534
14534
  this.build = m[5] ? m[5].split(".") : [];
14535
14535
  this.format();
14536
14536
  }
14537
- SemVer.prototype.format = function() {
14537
+ SemVer2.prototype.format = function() {
14538
14538
  this.version = this.major + "." + this.minor + "." + this.patch;
14539
14539
  if (this.prerelease.length) {
14540
14540
  this.version += "-" + this.prerelease.join(".");
14541
14541
  }
14542
14542
  return this.version;
14543
14543
  };
14544
- SemVer.prototype.toString = function() {
14544
+ SemVer2.prototype.toString = function() {
14545
14545
  return this.version;
14546
14546
  };
14547
- SemVer.prototype.compare = function(other) {
14547
+ SemVer2.prototype.compare = function(other) {
14548
14548
  debug2("SemVer.compare", this.version, this.options, other);
14549
- if (!(other instanceof SemVer)) {
14550
- other = new SemVer(other, this.options);
14549
+ if (!(other instanceof SemVer2)) {
14550
+ other = new SemVer2(other, this.options);
14551
14551
  }
14552
14552
  return this.compareMain(other) || this.comparePre(other);
14553
14553
  };
14554
- SemVer.prototype.compareMain = function(other) {
14555
- if (!(other instanceof SemVer)) {
14556
- other = new SemVer(other, this.options);
14554
+ SemVer2.prototype.compareMain = function(other) {
14555
+ if (!(other instanceof SemVer2)) {
14556
+ other = new SemVer2(other, this.options);
14557
14557
  }
14558
14558
  return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch);
14559
14559
  };
14560
- SemVer.prototype.comparePre = function(other) {
14561
- if (!(other instanceof SemVer)) {
14562
- other = new SemVer(other, this.options);
14560
+ SemVer2.prototype.comparePre = function(other) {
14561
+ if (!(other instanceof SemVer2)) {
14562
+ other = new SemVer2(other, this.options);
14563
14563
  }
14564
14564
  if (this.prerelease.length && !other.prerelease.length) {
14565
14565
  return -1;
@@ -14586,9 +14586,9 @@ var require_semver2 = __commonJS({
14586
14586
  }
14587
14587
  } while (++i2);
14588
14588
  };
14589
- SemVer.prototype.compareBuild = function(other) {
14590
- if (!(other instanceof SemVer)) {
14591
- other = new SemVer(other, this.options);
14589
+ SemVer2.prototype.compareBuild = function(other) {
14590
+ if (!(other instanceof SemVer2)) {
14591
+ other = new SemVer2(other, this.options);
14592
14592
  }
14593
14593
  var i2 = 0;
14594
14594
  do {
@@ -14608,7 +14608,7 @@ var require_semver2 = __commonJS({
14608
14608
  }
14609
14609
  } while (++i2);
14610
14610
  };
14611
- SemVer.prototype.inc = function(release, identifier) {
14611
+ SemVer2.prototype.inc = function(release, identifier) {
14612
14612
  switch (release) {
14613
14613
  case "premajor":
14614
14614
  this.prerelease.length = 0;
@@ -14694,7 +14694,7 @@ var require_semver2 = __commonJS({
14694
14694
  loose = void 0;
14695
14695
  }
14696
14696
  try {
14697
- return new SemVer(version, loose).inc(release, identifier).version;
14697
+ return new SemVer2(version, loose).inc(release, identifier).version;
14698
14698
  } catch (er) {
14699
14699
  return null;
14700
14700
  }
@@ -14738,19 +14738,19 @@ var require_semver2 = __commonJS({
14738
14738
  }
14739
14739
  exports2.major = major;
14740
14740
  function major(a, loose) {
14741
- return new SemVer(a, loose).major;
14741
+ return new SemVer2(a, loose).major;
14742
14742
  }
14743
14743
  exports2.minor = minor;
14744
14744
  function minor(a, loose) {
14745
- return new SemVer(a, loose).minor;
14745
+ return new SemVer2(a, loose).minor;
14746
14746
  }
14747
14747
  exports2.patch = patch;
14748
14748
  function patch(a, loose) {
14749
- return new SemVer(a, loose).patch;
14749
+ return new SemVer2(a, loose).patch;
14750
14750
  }
14751
14751
  exports2.compare = compare;
14752
14752
  function compare(a, b, loose) {
14753
- return new SemVer(a, loose).compare(new SemVer(b, loose));
14753
+ return new SemVer2(a, loose).compare(new SemVer2(b, loose));
14754
14754
  }
14755
14755
  exports2.compareLoose = compareLoose;
14756
14756
  function compareLoose(a, b) {
@@ -14758,8 +14758,8 @@ var require_semver2 = __commonJS({
14758
14758
  }
14759
14759
  exports2.compareBuild = compareBuild;
14760
14760
  function compareBuild(a, b, loose) {
14761
- var versionA = new SemVer(a, loose);
14762
- var versionB = new SemVer(b, loose);
14761
+ var versionA = new SemVer2(a, loose);
14762
+ var versionB = new SemVer2(b, loose);
14763
14763
  return versionA.compare(versionB) || versionA.compareBuild(versionB);
14764
14764
  }
14765
14765
  exports2.rcompare = rcompare;
@@ -14879,7 +14879,7 @@ var require_semver2 = __commonJS({
14879
14879
  if (!m[2]) {
14880
14880
  this.semver = ANY;
14881
14881
  } else {
14882
- this.semver = new SemVer(m[2], this.options.loose);
14882
+ this.semver = new SemVer2(m[2], this.options.loose);
14883
14883
  }
14884
14884
  };
14885
14885
  Comparator.prototype.toString = function() {
@@ -14892,7 +14892,7 @@ var require_semver2 = __commonJS({
14892
14892
  }
14893
14893
  if (typeof version === "string") {
14894
14894
  try {
14895
- version = new SemVer(version, this.options);
14895
+ version = new SemVer2(version, this.options);
14896
14896
  } catch (er) {
14897
14897
  return false;
14898
14898
  }
@@ -15213,7 +15213,7 @@ var require_semver2 = __commonJS({
15213
15213
  }
15214
15214
  if (typeof version === "string") {
15215
15215
  try {
15216
- version = new SemVer(version, this.options);
15216
+ version = new SemVer2(version, this.options);
15217
15217
  } catch (er) {
15218
15218
  return false;
15219
15219
  }
@@ -15270,7 +15270,7 @@ var require_semver2 = __commonJS({
15270
15270
  if (rangeObj.test(v)) {
15271
15271
  if (!max || maxSV.compare(v) === -1) {
15272
15272
  max = v;
15273
- maxSV = new SemVer(max, options);
15273
+ maxSV = new SemVer2(max, options);
15274
15274
  }
15275
15275
  }
15276
15276
  });
@@ -15289,7 +15289,7 @@ var require_semver2 = __commonJS({
15289
15289
  if (rangeObj.test(v)) {
15290
15290
  if (!min || minSV.compare(v) === 1) {
15291
15291
  min = v;
15292
- minSV = new SemVer(min, options);
15292
+ minSV = new SemVer2(min, options);
15293
15293
  }
15294
15294
  }
15295
15295
  });
@@ -15298,11 +15298,11 @@ var require_semver2 = __commonJS({
15298
15298
  exports2.minVersion = minVersion;
15299
15299
  function minVersion(range, loose) {
15300
15300
  range = new Range(range, loose);
15301
- var minver = new SemVer("0.0.0");
15301
+ var minver = new SemVer2("0.0.0");
15302
15302
  if (range.test(minver)) {
15303
15303
  return minver;
15304
15304
  }
15305
- minver = new SemVer("0.0.0-0");
15305
+ minver = new SemVer2("0.0.0-0");
15306
15306
  if (range.test(minver)) {
15307
15307
  return minver;
15308
15308
  }
@@ -15310,7 +15310,7 @@ var require_semver2 = __commonJS({
15310
15310
  for (var i2 = 0; i2 < range.set.length; ++i2) {
15311
15311
  var comparators = range.set[i2];
15312
15312
  comparators.forEach(function(comparator) {
15313
- var compver = new SemVer(comparator.semver.version);
15313
+ var compver = new SemVer2(comparator.semver.version);
15314
15314
  switch (comparator.operator) {
15315
15315
  case ">":
15316
15316
  if (compver.prerelease.length === 0) {
@@ -15356,7 +15356,7 @@ var require_semver2 = __commonJS({
15356
15356
  }
15357
15357
  exports2.outside = outside;
15358
15358
  function outside(version, range, hilo, options) {
15359
- version = new SemVer(version, options);
15359
+ version = new SemVer2(version, options);
15360
15360
  range = new Range(range, options);
15361
15361
  var gtfn, ltefn, ltfn, comp, ecomp;
15362
15362
  switch (hilo) {
@@ -15420,7 +15420,7 @@ var require_semver2 = __commonJS({
15420
15420
  }
15421
15421
  exports2.coerce = coerce2;
15422
15422
  function coerce2(version, options) {
15423
- if (version instanceof SemVer) {
15423
+ if (version instanceof SemVer2) {
15424
15424
  return version;
15425
15425
  }
15426
15426
  if (typeof version === "number") {
@@ -21786,6 +21786,11 @@ function cloneEnv(...envs) {
21786
21786
 
21787
21787
  // src/fs/run-user-scripts.ts
21788
21788
  var runNpmInstallSema = new import_async_sema4.default(1);
21789
+ var NO_OVERRIDE = {
21790
+ detectedLockfile: void 0,
21791
+ detectedPackageManager: void 0,
21792
+ path: void 0
21793
+ };
21789
21794
  function spawnAsync(command, args, opts = {}) {
21790
21795
  return new Promise((resolve, reject) => {
21791
21796
  const stderrLogs = [];
@@ -21935,7 +21940,10 @@ async function scanParentDirs(destPath, readPackageJson = false, base = "/") {
21935
21940
  filename: "package.json"
21936
21941
  });
21937
21942
  const packageJson = readPackageJson && pkgJsonPath ? JSON.parse(await import_fs_extra7.default.readFile(pkgJsonPath, "utf8")) : void 0;
21938
- const [yarnLockPath, npmLockPath, pnpmLockPath, bunLockPath] = await walkParentDirsMulti({
21943
+ const {
21944
+ paths: [yarnLockPath, npmLockPath, pnpmLockPath, bunLockPath],
21945
+ packageJsonPackageManager
21946
+ } = await walkParentDirsMulti({
21939
21947
  base,
21940
21948
  start: destPath,
21941
21949
  filenames: [
@@ -21974,19 +21982,21 @@ async function scanParentDirs(destPath, readPackageJson = false, base = "/") {
21974
21982
  lockfilePath = bunLockPath;
21975
21983
  lockfileVersion = 0;
21976
21984
  } else {
21977
- cliType = packageJson ? detectPackageManagerNameWithoutLockfile(packageJson) : "npm";
21985
+ cliType = detectPackageManagerNameWithoutLockfile(
21986
+ packageJsonPackageManager
21987
+ );
21978
21988
  }
21979
21989
  const packageJsonPath = pkgJsonPath || void 0;
21980
21990
  return {
21981
21991
  cliType,
21982
21992
  packageJson,
21993
+ packageJsonPackageManager,
21983
21994
  lockfilePath,
21984
21995
  lockfileVersion,
21985
21996
  packageJsonPath
21986
21997
  };
21987
21998
  }
21988
- function detectPackageManagerNameWithoutLockfile(packageJson) {
21989
- const packageJsonPackageManager = packageJson.packageManager;
21999
+ function detectPackageManagerNameWithoutLockfile(packageJsonPackageManager) {
21990
22000
  if (usingCorepack(process.env, packageJsonPackageManager)) {
21991
22001
  const corepackPackageManager = validateVersionSpecifier(
21992
22002
  packageJsonPackageManager
@@ -22031,17 +22041,26 @@ async function walkParentDirsMulti({
22031
22041
  start,
22032
22042
  filenames
22033
22043
  }) {
22044
+ let packageManager;
22034
22045
  for (const dir of traverseUpDirectories({ start, base })) {
22035
22046
  const fullPaths = filenames.map((f) => import_path5.default.join(dir, f));
22036
22047
  const existResults = await Promise.all(
22037
22048
  fullPaths.map((f) => import_fs_extra7.default.pathExists(f))
22038
22049
  );
22039
22050
  const foundOneOrMore = existResults.some((b) => b);
22051
+ const packageJsonPath = import_path5.default.join(dir, "package.json");
22052
+ const packageJson = await import_fs_extra7.default.readJSON(packageJsonPath).catch(() => null);
22053
+ if (packageJson?.packageManager) {
22054
+ packageManager = packageJson.packageManager;
22055
+ }
22040
22056
  if (foundOneOrMore) {
22041
- return fullPaths.map((f, i) => existResults[i] ? f : void 0);
22057
+ return {
22058
+ paths: fullPaths.map((f, i) => existResults[i] ? f : void 0),
22059
+ packageJsonPackageManager: packageManager
22060
+ };
22042
22061
  }
22043
22062
  }
22044
- return [];
22063
+ return { paths: [], packageJsonPackageManager: packageManager };
22045
22064
  }
22046
22065
  function isSet(v) {
22047
22066
  return v?.constructor?.name === "Set";
@@ -22054,7 +22073,12 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
22054
22073
  (0, import_assert6.default)(import_path5.default.isAbsolute(destPath));
22055
22074
  try {
22056
22075
  await runNpmInstallSema.acquire();
22057
- const { cliType, packageJsonPath, packageJson, lockfileVersion } = await scanParentDirs(destPath, true);
22076
+ const {
22077
+ cliType,
22078
+ packageJsonPath,
22079
+ lockfileVersion,
22080
+ packageJsonPackageManager
22081
+ } = await scanParentDirs(destPath);
22058
22082
  if (!packageJsonPath) {
22059
22083
  debug(
22060
22084
  `Skipping dependency installation because no package.json was found for ${destPath}`
@@ -22083,7 +22107,7 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
22083
22107
  opts.env = getEnvForPackageManager({
22084
22108
  cliType,
22085
22109
  lockfileVersion,
22086
- packageJsonPackageManager: packageJson?.packageManager,
22110
+ packageJsonPackageManager,
22087
22111
  nodeVersion,
22088
22112
  env
22089
22113
  });
@@ -22147,8 +22171,9 @@ function getEnvForPackageManager({
22147
22171
  } = getPathOverrideForPackageManager({
22148
22172
  cliType,
22149
22173
  lockfileVersion,
22150
- corepackEnabled,
22151
- nodeVersion
22174
+ corepackPackageManager: packageJsonPackageManager,
22175
+ nodeVersion,
22176
+ corepackEnabled
22152
22177
  });
22153
22178
  if (corepackEnabled) {
22154
22179
  debug(
@@ -22186,10 +22211,8 @@ function getEnvForPackageManager({
22186
22211
  }
22187
22212
  return newEnv;
22188
22213
  }
22189
- function detectPnpmVersion(lockfileVersion, corepackEnabled) {
22214
+ function detectPnpmVersion(lockfileVersion) {
22190
22215
  switch (true) {
22191
- case corepackEnabled:
22192
- return "corepack_enabled";
22193
22216
  case lockfileVersion === void 0:
22194
22217
  return "not found";
22195
22218
  case lockfileVersion === 5.3:
@@ -22204,98 +22227,154 @@ function detectPnpmVersion(lockfileVersion, corepackEnabled) {
22204
22227
  return "not found";
22205
22228
  }
22206
22229
  }
22207
- function shouldUseNpm7(lockfileVersion, nodeVersion) {
22208
- if (lockfileVersion === void 0)
22209
- return false;
22210
- return lockfileVersion >= 2 && (nodeVersion?.major || 0) < 16;
22230
+ function validLockfileForPackageManager(cliType, lockfileVersion, packageManagerVersion) {
22231
+ const packageManagerMajorVersion = packageManagerVersion.major;
22232
+ switch (cliType) {
22233
+ case "npm":
22234
+ case "bun":
22235
+ case "yarn":
22236
+ return true;
22237
+ case "pnpm":
22238
+ switch (packageManagerMajorVersion) {
22239
+ case 9:
22240
+ if ("9.0.0" === packageManagerVersion.version && lockfileVersion === 6) {
22241
+ return false;
22242
+ }
22243
+ return [6, 7, 9].includes(lockfileVersion);
22244
+ case 8:
22245
+ return [6, 6.1].includes(lockfileVersion);
22246
+ case 7:
22247
+ return [5.3, 5.4].includes(lockfileVersion);
22248
+ case 6:
22249
+ return [5.3, 5.4].includes(lockfileVersion);
22250
+ default:
22251
+ return true;
22252
+ }
22253
+ }
22211
22254
  }
22212
22255
  function getPathOverrideForPackageManager({
22213
22256
  cliType,
22214
22257
  lockfileVersion,
22215
- corepackEnabled,
22216
- nodeVersion
22258
+ corepackPackageManager,
22259
+ corepackEnabled = true
22217
22260
  }) {
22218
- const no_override = {
22219
- detectedLockfile: void 0,
22220
- detectedPackageManager: void 0,
22221
- path: void 0
22261
+ const detectedPackageManger = detectPackageManager(cliType, lockfileVersion);
22262
+ if (!corepackPackageManager) {
22263
+ return detectedPackageManger ?? NO_OVERRIDE;
22264
+ }
22265
+ if (lockfileVersion === void 0 || !corepackEnabled) {
22266
+ return NO_OVERRIDE;
22267
+ }
22268
+ if (validateCorepackPackageManager(
22269
+ cliType,
22270
+ lockfileVersion,
22271
+ corepackPackageManager
22272
+ )) {
22273
+ return NO_OVERRIDE;
22274
+ }
22275
+ console.warn(
22276
+ `WARN [package-manager-warning-1] Detected lockfile "${lockfileVersion}" which is not compatible with the intended corepack package manager "${corepackPackageManager}". Update your lockfile or change to a compatible corepack version.`
22277
+ );
22278
+ return NO_OVERRIDE;
22279
+ }
22280
+ function validateCorepackPackageManager(cliType, lockfileVersion, corepackPackageManager) {
22281
+ const validatedCorepackPackageManager = validateVersionSpecifier(
22282
+ corepackPackageManager
22283
+ );
22284
+ if (!validatedCorepackPackageManager) {
22285
+ console.warn(
22286
+ `WARN [package-manager-warning-2] Intended corepack defined package manager "${corepackPackageManager}" is not a valid semver value.`
22287
+ );
22288
+ return false;
22289
+ }
22290
+ if (cliType !== validatedCorepackPackageManager.packageName) {
22291
+ console.warn(
22292
+ `WARN [package-manager-warning-3] Detected package manager "${cliType}" does not match intended corepack defined package manager "${validatedCorepackPackageManager.packageName}". Change your lockfile or "package.json#packageManager" value to match.`
22293
+ );
22294
+ return false;
22295
+ }
22296
+ const corepackPackageManagerVersion = (0, import_semver2.coerce)(
22297
+ validatedCorepackPackageManager.packageVersionRange
22298
+ );
22299
+ if (corepackPackageManagerVersion === null) {
22300
+ return true;
22301
+ } else {
22302
+ return validLockfileForPackageManager(
22303
+ cliType,
22304
+ lockfileVersion,
22305
+ corepackPackageManagerVersion
22306
+ );
22307
+ }
22308
+ }
22309
+ function validateVersionSpecifier(version) {
22310
+ if (!version) {
22311
+ return void 0;
22312
+ }
22313
+ const [before, after, ...extra] = version.split("@");
22314
+ if (extra.length) {
22315
+ return void 0;
22316
+ }
22317
+ if (!before) {
22318
+ return void 0;
22319
+ }
22320
+ if (!after) {
22321
+ return void 0;
22322
+ }
22323
+ if (!(0, import_semver2.validRange)(after)) {
22324
+ return void 0;
22325
+ }
22326
+ return {
22327
+ packageName: before,
22328
+ packageVersionRange: after
22222
22329
  };
22330
+ }
22331
+ function detectPackageManager(cliType, lockfileVersion) {
22223
22332
  switch (cliType) {
22224
22333
  case "npm":
22225
- switch (true) {
22226
- case corepackEnabled:
22227
- return no_override;
22228
- case shouldUseNpm7(lockfileVersion, nodeVersion):
22229
- return {
22230
- path: "/node16/bin-npm7",
22231
- detectedLockfile: "package-lock.json",
22232
- detectedPackageManager: "npm 7+"
22233
- };
22234
- default:
22235
- return no_override;
22236
- }
22334
+ return void 0;
22237
22335
  case "pnpm":
22238
- switch (detectPnpmVersion(lockfileVersion, corepackEnabled)) {
22239
- case "corepack_enabled":
22240
- return no_override;
22336
+ switch (detectPnpmVersion(lockfileVersion)) {
22241
22337
  case "pnpm 7":
22242
22338
  return {
22243
22339
  path: "/pnpm7/node_modules/.bin",
22244
22340
  detectedLockfile: "pnpm-lock.yaml",
22245
- detectedPackageManager: "pnpm 7"
22341
+ detectedPackageManager: "pnpm@7.x"
22246
22342
  };
22247
22343
  case "pnpm 8":
22248
22344
  return {
22249
22345
  path: "/pnpm8/node_modules/.bin",
22250
22346
  detectedLockfile: "pnpm-lock.yaml",
22251
- detectedPackageManager: "pnpm 8"
22347
+ detectedPackageManager: "pnpm@8.x"
22252
22348
  };
22253
22349
  case "pnpm 9":
22254
22350
  return {
22255
22351
  path: "/pnpm9/node_modules/.bin",
22256
22352
  detectedLockfile: "pnpm-lock.yaml",
22257
- detectedPackageManager: "pnpm 9"
22353
+ detectedPackageManager: "pnpm@9.x"
22258
22354
  };
22259
22355
  case "pnpm 6":
22260
- default:
22261
- return no_override;
22262
- }
22263
- case "bun":
22264
- switch (true) {
22265
- case corepackEnabled:
22266
- return no_override;
22267
- default:
22268
22356
  return {
22269
- path: "/bun1",
22270
- detectedLockfile: "bun.lockb",
22271
- detectedPackageManager: "Bun"
22357
+ // undefined because pnpm@6 is the current default in the build container
22358
+ path: void 0,
22359
+ detectedLockfile: "pnpm-lock.yaml",
22360
+ detectedPackageManager: "pnpm 6"
22272
22361
  };
22362
+ default:
22363
+ return void 0;
22273
22364
  }
22365
+ case "bun":
22366
+ return {
22367
+ path: "/bun1",
22368
+ detectedLockfile: "bun.lockb",
22369
+ detectedPackageManager: "bun@1.x"
22370
+ };
22274
22371
  case "yarn":
22275
- return no_override;
22276
- }
22277
- }
22278
- function validateVersionSpecifier(version) {
22279
- if (!version) {
22280
- return void 0;
22281
- }
22282
- const [before, after, ...extra] = version.split("@");
22283
- if (extra.length) {
22284
- return void 0;
22285
- }
22286
- if (!before) {
22287
- return void 0;
22288
- }
22289
- if (!after) {
22290
- return void 0;
22291
- }
22292
- if (!(0, import_semver2.validRange)(after)) {
22293
- return void 0;
22372
+ return {
22373
+ path: void 0,
22374
+ detectedLockfile: "yarn.lock",
22375
+ detectedPackageManager: "yarn"
22376
+ };
22294
22377
  }
22295
- return {
22296
- packageName: before,
22297
- packageVersionRange: after
22298
- };
22299
22378
  }
22300
22379
  function getPathForPackageManager({
22301
22380
  cliType,
@@ -22304,12 +22383,15 @@ function getPathForPackageManager({
22304
22383
  env
22305
22384
  }) {
22306
22385
  const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
22307
- const overrides = getPathOverrideForPackageManager({
22386
+ let overrides = getPathOverrideForPackageManager({
22308
22387
  cliType,
22309
22388
  lockfileVersion,
22310
- corepackEnabled,
22389
+ corepackPackageManager: void 0,
22311
22390
  nodeVersion
22312
22391
  });
22392
+ if (corepackEnabled) {
22393
+ overrides = NO_OVERRIDE;
22394
+ }
22313
22395
  const alreadyInPath = (newPath) => {
22314
22396
  const oldPath = env.PATH ?? "";
22315
22397
  return oldPath.split(import_path5.default.delimiter).includes(newPath);
@@ -22335,14 +22417,11 @@ async function runCustomInstallCommand({
22335
22417
  spawnOpts
22336
22418
  }) {
22337
22419
  console.log(`Running "install" command: \`${installCommand}\`...`);
22338
- const { cliType, lockfileVersion, packageJson } = await scanParentDirs(
22339
- destPath,
22340
- true
22341
- );
22420
+ const { cliType, lockfileVersion, packageJsonPackageManager } = await scanParentDirs(destPath);
22342
22421
  const env = getEnvForPackageManager({
22343
22422
  cliType,
22344
22423
  lockfileVersion,
22345
- packageJsonPackageManager: packageJson?.packageManager,
22424
+ packageJsonPackageManager,
22346
22425
  nodeVersion,
22347
22426
  env: spawnOpts?.env || {}
22348
22427
  });
@@ -22355,10 +22434,7 @@ async function runCustomInstallCommand({
22355
22434
  }
22356
22435
  async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
22357
22436
  (0, import_assert6.default)(import_path5.default.isAbsolute(destPath));
22358
- const { packageJson, cliType, lockfileVersion } = await scanParentDirs(
22359
- destPath,
22360
- true
22361
- );
22437
+ const { packageJson, cliType, lockfileVersion, packageJsonPackageManager } = await scanParentDirs(destPath, true);
22362
22438
  const scriptName = getScriptName(
22363
22439
  packageJson,
22364
22440
  typeof scriptNames === "string" ? [scriptNames] : scriptNames
@@ -22373,7 +22449,7 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
22373
22449
  env: getEnvForPackageManager({
22374
22450
  cliType,
22375
22451
  lockfileVersion,
22376
- packageJsonPackageManager: packageJson?.packageManager,
22452
+ packageJsonPackageManager,
22377
22453
  nodeVersion: void 0,
22378
22454
  env: cloneEnv(process.env, spawnOpts?.env)
22379
22455
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vercel/build-utils",
3
- "version": "8.3.1",
3
+ "version": "8.3.3",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.js",