@vercel/build-utils 8.3.6 → 8.3.8

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,19 @@
1
1
  # @vercel/build-utils
2
2
 
3
+ ## 8.3.8
4
+
5
+ ### Patch Changes
6
+
7
+ - Limit `package.json#packageManager` parsing to concrete versions ([#12025](https://github.com/vercel/vercel/pull/12025))
8
+
9
+ - Catch PNPM_UNSUPPORTED_ENGINE when corepack is enabled and throw a more helpful error ([#12017](https://github.com/vercel/vercel/pull/12017))
10
+
11
+ ## 8.3.7
12
+
13
+ ### Patch Changes
14
+
15
+ - Revert "Revert "warn on mismatched corepack and detected package managers"" ([#11887](https://github.com/vercel/vercel/pull/11887))
16
+
3
17
  ## 8.3.6
4
18
 
5
19
  ### Patch Changes
@@ -82,7 +82,7 @@ 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, packageJsonPackageManager, nodeVersion, env, }: {
85
+ export declare function getEnvForPackageManager({ cliType, lockfileVersion, packageJsonPackageManager, nodeVersion, env, packageJsonEngines, }: {
86
86
  cliType: CliType;
87
87
  lockfileVersion: number | undefined;
88
88
  packageJsonPackageManager?: string | undefined;
@@ -90,6 +90,7 @@ export declare function getEnvForPackageManager({ cliType, lockfileVersion, pack
90
90
  env: {
91
91
  [x: string]: string | undefined;
92
92
  };
93
+ packageJsonEngines?: PackageJson.Engines;
93
94
  }): {
94
95
  [x: string]: string | undefined;
95
96
  };
@@ -97,11 +98,13 @@ export declare function getEnvForPackageManager({ cliType, lockfileVersion, pack
97
98
  * Helper to get the binary paths that link to the used package manager.
98
99
  * Note: Make sure it doesn't contain any `console.log` calls.
99
100
  */
100
- export declare function getPathOverrideForPackageManager({ cliType, lockfileVersion, corepackEnabled, nodeVersion, }: {
101
+ export declare function getPathOverrideForPackageManager({ cliType, lockfileVersion, corepackPackageManager, corepackEnabled, packageJsonEngines, }: {
101
102
  cliType: CliType;
102
103
  lockfileVersion: number | undefined;
103
- corepackEnabled: boolean;
104
+ corepackPackageManager: string | undefined;
104
105
  nodeVersion: NodeVersion | undefined;
106
+ corepackEnabled?: boolean;
107
+ packageJsonEngines?: PackageJson.Engines;
105
108
  }): {
106
109
  /**
107
110
  * Which lockfile was detected.
@@ -117,6 +120,15 @@ export declare function getPathOverrideForPackageManager({ cliType, lockfileVers
117
120
  */
118
121
  path: string | undefined;
119
122
  };
123
+ export declare function detectPackageManager(cliType: CliType, lockfileVersion: number | undefined): {
124
+ path: string;
125
+ detectedLockfile: string;
126
+ detectedPackageManager: string;
127
+ } | {
128
+ path: undefined;
129
+ detectedLockfile: string;
130
+ detectedPackageManager: string;
131
+ } | undefined;
120
132
  /**
121
133
  * Helper to get the binary paths that link to the used package manager.
122
134
  * 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 = [];
@@ -363,7 +369,8 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
363
369
  lockfileVersion,
364
370
  packageJsonPackageManager: packageJson?.packageManager,
365
371
  nodeVersion,
366
- env
372
+ env,
373
+ packageJsonEngines: packageJson?.engines
367
374
  });
368
375
  let commandArgs;
369
376
  const isPotentiallyBrokenNpm = cliType === "npm" && (nodeVersion?.major === 16 || opts.env.PATH?.includes("/node16/bin-npm7")) && !args.includes("--legacy-peer-deps") && spawnOpts?.env?.ENABLE_EXPERIMENTAL_COREPACK !== "1";
@@ -415,7 +422,8 @@ function getEnvForPackageManager({
415
422
  lockfileVersion,
416
423
  packageJsonPackageManager,
417
424
  nodeVersion,
418
- env
425
+ env,
426
+ packageJsonEngines
419
427
  }) {
420
428
  const corepackEnabled = usingCorepack(env, packageJsonPackageManager);
421
429
  const {
@@ -425,8 +433,10 @@ function getEnvForPackageManager({
425
433
  } = getPathOverrideForPackageManager({
426
434
  cliType,
427
435
  lockfileVersion,
436
+ corepackPackageManager: packageJsonPackageManager,
437
+ nodeVersion,
428
438
  corepackEnabled,
429
- nodeVersion
439
+ packageJsonEngines
430
440
  });
431
441
  if (corepackEnabled) {
432
442
  (0, import_debug.default)(
@@ -464,10 +474,8 @@ function getEnvForPackageManager({
464
474
  }
465
475
  return newEnv;
466
476
  }
467
- function detectPnpmVersion(lockfileVersion, corepackEnabled) {
477
+ function detectPnpmVersion(lockfileVersion) {
468
478
  switch (true) {
469
- case corepackEnabled:
470
- return "corepack_enabled";
471
479
  case lockfileVersion === void 0:
472
480
  return "not found";
473
481
  case lockfileVersion === 5.3:
@@ -482,98 +490,161 @@ function detectPnpmVersion(lockfileVersion, corepackEnabled) {
482
490
  return "not found";
483
491
  }
484
492
  }
485
- function shouldUseNpm7(lockfileVersion, nodeVersion) {
486
- if (lockfileVersion === void 0)
487
- return false;
488
- return lockfileVersion >= 2 && (nodeVersion?.major || 0) < 16;
493
+ function validLockfileForPackageManager(cliType, lockfileVersion, packageManagerVersion) {
494
+ const packageManagerMajorVersion = packageManagerVersion.major;
495
+ switch (cliType) {
496
+ case "npm":
497
+ case "bun":
498
+ case "yarn":
499
+ return true;
500
+ case "pnpm":
501
+ switch (packageManagerMajorVersion) {
502
+ case 9:
503
+ if ("9.0.0" === packageManagerVersion.version && lockfileVersion === 6) {
504
+ return false;
505
+ }
506
+ return [6, 7, 9].includes(lockfileVersion);
507
+ case 8:
508
+ return [6, 6.1].includes(lockfileVersion);
509
+ case 7:
510
+ return [5.3, 5.4].includes(lockfileVersion);
511
+ case 6:
512
+ return [5.3, 5.4].includes(lockfileVersion);
513
+ default:
514
+ return true;
515
+ }
516
+ }
489
517
  }
490
518
  function getPathOverrideForPackageManager({
491
519
  cliType,
492
520
  lockfileVersion,
493
- corepackEnabled,
494
- nodeVersion
521
+ corepackPackageManager,
522
+ corepackEnabled = true,
523
+ packageJsonEngines
495
524
  }) {
496
- const no_override = {
497
- detectedLockfile: void 0,
498
- detectedPackageManager: void 0,
499
- path: void 0
525
+ const detectedPackageManger = detectPackageManager(cliType, lockfileVersion);
526
+ if (!corepackPackageManager || !corepackEnabled) {
527
+ return detectedPackageManger ?? NO_OVERRIDE;
528
+ }
529
+ if (!validateCorepackPackageManager(
530
+ cliType,
531
+ lockfileVersion,
532
+ corepackPackageManager,
533
+ packageJsonEngines?.pnpm
534
+ )) {
535
+ console.warn(
536
+ `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.`
537
+ );
538
+ }
539
+ return NO_OVERRIDE;
540
+ }
541
+ function validateCorepackPackageManager(cliType, lockfileVersion, corepackPackageManager, enginesPnpmVersionRange) {
542
+ const validatedCorepackPackageManager = validateVersionSpecifier(
543
+ corepackPackageManager
544
+ );
545
+ if (!validatedCorepackPackageManager) {
546
+ console.warn(
547
+ `WARN [package-manager-warning-2] Intended corepack defined package manager "${corepackPackageManager}" is not a valid semver value.`
548
+ );
549
+ return false;
550
+ }
551
+ if (cliType !== validatedCorepackPackageManager.packageName) {
552
+ console.warn(
553
+ `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.`
554
+ );
555
+ return false;
556
+ }
557
+ if (cliType === "pnpm" && enginesPnpmVersionRange) {
558
+ const pnpmWithinEngineRange = (0, import_semver.satisfies)(
559
+ validatedCorepackPackageManager.packageVersion,
560
+ enginesPnpmVersionRange
561
+ );
562
+ if (!pnpmWithinEngineRange) {
563
+ throw new Error(
564
+ `The version of pnpm specified in package.json#packageManager (${validatedCorepackPackageManager.packageVersion}) must satisfy the version range in package.json#engines.pnpm (${enginesPnpmVersionRange}).`
565
+ );
566
+ }
567
+ }
568
+ if (lockfileVersion) {
569
+ return validLockfileForPackageManager(
570
+ cliType,
571
+ lockfileVersion,
572
+ validatedCorepackPackageManager.packageVersion
573
+ );
574
+ } else {
575
+ return true;
576
+ }
577
+ }
578
+ function validateVersionSpecifier(version) {
579
+ if (!version) {
580
+ return void 0;
581
+ }
582
+ const [before, after, ...extra] = version.split("@");
583
+ if (extra.length) {
584
+ return void 0;
585
+ }
586
+ if (!before) {
587
+ return void 0;
588
+ }
589
+ if (!after) {
590
+ return void 0;
591
+ }
592
+ const packageVersion = (0, import_semver.parse)(after);
593
+ if (!packageVersion) {
594
+ return void 0;
595
+ }
596
+ return {
597
+ packageName: before,
598
+ packageVersion
500
599
  };
600
+ }
601
+ function detectPackageManager(cliType, lockfileVersion) {
501
602
  switch (cliType) {
502
603
  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
- }
604
+ return void 0;
515
605
  case "pnpm":
516
- switch (detectPnpmVersion(lockfileVersion, corepackEnabled)) {
517
- case "corepack_enabled":
518
- return no_override;
606
+ switch (detectPnpmVersion(lockfileVersion)) {
519
607
  case "pnpm 7":
520
608
  return {
521
609
  path: "/pnpm7/node_modules/.bin",
522
610
  detectedLockfile: "pnpm-lock.yaml",
523
- detectedPackageManager: "pnpm 7"
611
+ detectedPackageManager: "pnpm@7.x"
524
612
  };
525
613
  case "pnpm 8":
526
614
  return {
527
615
  path: "/pnpm8/node_modules/.bin",
528
616
  detectedLockfile: "pnpm-lock.yaml",
529
- detectedPackageManager: "pnpm 8"
617
+ detectedPackageManager: "pnpm@8.x"
530
618
  };
531
619
  case "pnpm 9":
532
620
  return {
533
621
  path: "/pnpm9/node_modules/.bin",
534
622
  detectedLockfile: "pnpm-lock.yaml",
535
- detectedPackageManager: "pnpm 9"
623
+ detectedPackageManager: "pnpm@9.x"
536
624
  };
537
625
  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
626
  return {
547
- path: "/bun1",
548
- detectedLockfile: "bun.lockb",
549
- detectedPackageManager: "Bun"
627
+ // undefined because pnpm@6 is the current default in the build container
628
+ path: void 0,
629
+ detectedLockfile: "pnpm-lock.yaml",
630
+ detectedPackageManager: "pnpm@6.x"
550
631
  };
632
+ default:
633
+ return void 0;
551
634
  }
635
+ case "bun":
636
+ return {
637
+ path: "/bun1",
638
+ detectedLockfile: "bun.lockb",
639
+ detectedPackageManager: "bun@1.x"
640
+ };
552
641
  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;
642
+ return {
643
+ path: void 0,
644
+ detectedLockfile: "yarn.lock",
645
+ detectedPackageManager: "yarn"
646
+ };
572
647
  }
573
- return {
574
- packageName: before,
575
- packageVersionRange: after
576
- };
577
648
  }
578
649
  function getPathForPackageManager({
579
650
  cliType,
@@ -582,12 +653,15 @@ function getPathForPackageManager({
582
653
  env
583
654
  }) {
584
655
  const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
585
- const overrides = getPathOverrideForPackageManager({
656
+ let overrides = getPathOverrideForPackageManager({
586
657
  cliType,
587
658
  lockfileVersion,
588
- corepackEnabled,
659
+ corepackPackageManager: void 0,
589
660
  nodeVersion
590
661
  });
662
+ if (corepackEnabled) {
663
+ overrides = NO_OVERRIDE;
664
+ }
591
665
  const alreadyInPath = (newPath) => {
592
666
  const oldPath = env.PATH ?? "";
593
667
  return oldPath.split(import_path.default.delimiter).includes(newPath);
@@ -622,7 +696,8 @@ async function runCustomInstallCommand({
622
696
  lockfileVersion,
623
697
  packageJsonPackageManager: packageJson?.packageManager,
624
698
  nodeVersion,
625
- env: spawnOpts?.env || {}
699
+ env: spawnOpts?.env || {},
700
+ packageJsonEngines: packageJson?.engines
626
701
  });
627
702
  (0, import_debug.default)(`Running with $PATH:`, env?.PATH || "");
628
703
  await execCommand(installCommand, {
@@ -653,7 +728,8 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
653
728
  lockfileVersion,
654
729
  packageJsonPackageManager: packageJson?.packageManager,
655
730
  nodeVersion: void 0,
656
- env: (0, import_clone_env.cloneEnv)(process.env, spawnOpts?.env)
731
+ env: (0, import_clone_env.cloneEnv)(process.env, spawnOpts?.env),
732
+ packageJsonEngines: packageJson?.engines
657
733
  })
658
734
  };
659
735
  if (cliType === "npm") {
@@ -708,6 +784,7 @@ const installDependencies = (0, import_util.deprecate)(
708
784
  );
709
785
  // Annotate the CommonJS export names for ESM import in node:
710
786
  0 && (module.exports = {
787
+ detectPackageManager,
711
788
  execCommand,
712
789
  getEnvForPackageManager,
713
790
  getNodeBinPath,