@vercel/build-utils 8.3.8 → 8.4.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,19 @@
1
1
  # @vercel/build-utils
2
2
 
3
+ ## 8.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Change warnings to errors in invalid corepack package manager states ([#12062](https://github.com/vercel/vercel/pull/12062))
8
+
9
+ ## 8.3.9
10
+
11
+ ### Patch Changes
12
+
13
+ - Provide help when users get ERR_PNPM_UNSUPPORTED_ENGINE errors without corepack ([#12034](https://github.com/vercel/vercel/pull/12034))
14
+
15
+ - Fix package-manager-warning-1 to happen only happen in correct cases ([#12050](https://github.com/vercel/vercel/pull/12050))
16
+
3
17
  ## 8.3.8
4
18
 
5
19
  ### Patch Changes
@@ -124,10 +124,22 @@ export declare function detectPackageManager(cliType: CliType, lockfileVersion:
124
124
  path: string;
125
125
  detectedLockfile: string;
126
126
  detectedPackageManager: string;
127
+ pnpmVersionRange: string;
127
128
  } | {
128
129
  path: undefined;
129
130
  detectedLockfile: string;
130
131
  detectedPackageManager: string;
132
+ pnpmVersionRange: string;
133
+ } | {
134
+ path: string;
135
+ detectedLockfile: string;
136
+ detectedPackageManager: string;
137
+ pnpmVersionRange?: undefined;
138
+ } | {
139
+ path: undefined;
140
+ detectedLockfile: string;
141
+ detectedPackageManager: string;
142
+ pnpmVersionRange?: undefined;
131
143
  } | undefined;
132
144
  /**
133
145
  * Helper to get the binary paths that link to the used package manager.
@@ -524,35 +524,47 @@ function getPathOverrideForPackageManager({
524
524
  }) {
525
525
  const detectedPackageManger = detectPackageManager(cliType, lockfileVersion);
526
526
  if (!corepackPackageManager || !corepackEnabled) {
527
+ if (cliType === "pnpm" && packageJsonEngines?.pnpm) {
528
+ checkEnginesPnpmAgainstDetected(
529
+ packageJsonEngines.pnpm,
530
+ detectedPackageManger
531
+ );
532
+ }
527
533
  return detectedPackageManger ?? NO_OVERRIDE;
528
534
  }
529
- if (!validateCorepackPackageManager(
535
+ validateCorepackPackageManager(
530
536
  cliType,
531
537
  lockfileVersion,
532
538
  corepackPackageManager,
533
539
  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
- }
540
+ );
539
541
  return NO_OVERRIDE;
540
542
  }
543
+ function checkEnginesPnpmAgainstDetected(enginesPnpm, detectedPackageManger) {
544
+ if (detectedPackageManger?.pnpmVersionRange && (0, import_semver.validRange)(detectedPackageManger.pnpmVersionRange) && (0, import_semver.validRange)(enginesPnpm)) {
545
+ if (!(0, import_semver.intersects)(detectedPackageManger.pnpmVersionRange, enginesPnpm)) {
546
+ throw new Error(
547
+ `Detected pnpm "${detectedPackageManger.pnpmVersionRange}" is not compatible with the engines.pnpm "${enginesPnpm}" in your package.json. Either enable corepack with a valid package.json#packageManager value (https://vercel.com/docs/deployments/configure-a-build#corepack) or remove your package.json#engines.pnpm.`
548
+ );
549
+ }
550
+ }
551
+ console.warn(
552
+ `Using package.json#engines.pnpm without corepack and package.json#packageManager could lead to failed builds with ERR_PNPM_UNSUPPORTED_ENGINE. Learn more: https://vercel.com/docs/errors/error-list#pnpm-engine-unsupported`
553
+ );
554
+ }
541
555
  function validateCorepackPackageManager(cliType, lockfileVersion, corepackPackageManager, enginesPnpmVersionRange) {
542
556
  const validatedCorepackPackageManager = validateVersionSpecifier(
543
557
  corepackPackageManager
544
558
  );
545
559
  if (!validatedCorepackPackageManager) {
546
- console.warn(
547
- `WARN [package-manager-warning-2] Intended corepack defined package manager "${corepackPackageManager}" is not a valid semver value.`
560
+ throw new Error(
561
+ `Intended corepack defined package manager "${corepackPackageManager}" is not a valid semver value.`
548
562
  );
549
- return false;
550
563
  }
551
564
  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.`
565
+ throw new Error(
566
+ `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
567
  );
555
- return false;
556
568
  }
557
569
  if (cliType === "pnpm" && enginesPnpmVersionRange) {
558
570
  const pnpmWithinEngineRange = (0, import_semver.satisfies)(
@@ -566,13 +578,16 @@ function validateCorepackPackageManager(cliType, lockfileVersion, corepackPackag
566
578
  }
567
579
  }
568
580
  if (lockfileVersion) {
569
- return validLockfileForPackageManager(
581
+ const lockfileValid = validLockfileForPackageManager(
570
582
  cliType,
571
583
  lockfileVersion,
572
584
  validatedCorepackPackageManager.packageVersion
573
585
  );
574
- } else {
575
- return true;
586
+ if (!lockfileValid) {
587
+ throw new Error(
588
+ `Detected lockfile "${lockfileVersion}" which is not compatible with the intended corepack package manager "${corepackPackageManager}". Update your lockfile or change to a compatible corepack version.`
589
+ );
590
+ }
576
591
  }
577
592
  }
578
593
  function validateVersionSpecifier(version) {
@@ -608,26 +623,30 @@ function detectPackageManager(cliType, lockfileVersion) {
608
623
  return {
609
624
  path: "/pnpm7/node_modules/.bin",
610
625
  detectedLockfile: "pnpm-lock.yaml",
611
- detectedPackageManager: "pnpm@7.x"
626
+ detectedPackageManager: "pnpm@7.x",
627
+ pnpmVersionRange: "7.x"
612
628
  };
613
629
  case "pnpm 8":
614
630
  return {
615
631
  path: "/pnpm8/node_modules/.bin",
616
632
  detectedLockfile: "pnpm-lock.yaml",
617
- detectedPackageManager: "pnpm@8.x"
633
+ detectedPackageManager: "pnpm@8.x",
634
+ pnpmVersionRange: "8.x"
618
635
  };
619
636
  case "pnpm 9":
620
637
  return {
621
638
  path: "/pnpm9/node_modules/.bin",
622
639
  detectedLockfile: "pnpm-lock.yaml",
623
- detectedPackageManager: "pnpm@9.x"
640
+ detectedPackageManager: "pnpm@9.x",
641
+ pnpmVersionRange: "9.x"
624
642
  };
625
643
  case "pnpm 6":
626
644
  return {
627
645
  // undefined because pnpm@6 is the current default in the build container
628
646
  path: void 0,
629
647
  detectedLockfile: "pnpm-lock.yaml",
630
- detectedPackageManager: "pnpm@6.x"
648
+ detectedPackageManager: "pnpm@6.x",
649
+ pnpmVersionRange: "6.x"
631
650
  };
632
651
  default:
633
652
  return void 0;
package/dist/index.js CHANGED
@@ -22245,35 +22245,47 @@ function getPathOverrideForPackageManager({
22245
22245
  }) {
22246
22246
  const detectedPackageManger = detectPackageManager(cliType, lockfileVersion);
22247
22247
  if (!corepackPackageManager || !corepackEnabled) {
22248
+ if (cliType === "pnpm" && packageJsonEngines?.pnpm) {
22249
+ checkEnginesPnpmAgainstDetected(
22250
+ packageJsonEngines.pnpm,
22251
+ detectedPackageManger
22252
+ );
22253
+ }
22248
22254
  return detectedPackageManger ?? NO_OVERRIDE;
22249
22255
  }
22250
- if (!validateCorepackPackageManager(
22256
+ validateCorepackPackageManager(
22251
22257
  cliType,
22252
22258
  lockfileVersion,
22253
22259
  corepackPackageManager,
22254
22260
  packageJsonEngines?.pnpm
22255
- )) {
22256
- console.warn(
22257
- `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.`
22258
- );
22259
- }
22261
+ );
22260
22262
  return NO_OVERRIDE;
22261
22263
  }
22264
+ function checkEnginesPnpmAgainstDetected(enginesPnpm, detectedPackageManger) {
22265
+ if (detectedPackageManger?.pnpmVersionRange && (0, import_semver2.validRange)(detectedPackageManger.pnpmVersionRange) && (0, import_semver2.validRange)(enginesPnpm)) {
22266
+ if (!(0, import_semver2.intersects)(detectedPackageManger.pnpmVersionRange, enginesPnpm)) {
22267
+ throw new Error(
22268
+ `Detected pnpm "${detectedPackageManger.pnpmVersionRange}" is not compatible with the engines.pnpm "${enginesPnpm}" in your package.json. Either enable corepack with a valid package.json#packageManager value (https://vercel.com/docs/deployments/configure-a-build#corepack) or remove your package.json#engines.pnpm.`
22269
+ );
22270
+ }
22271
+ }
22272
+ console.warn(
22273
+ `Using package.json#engines.pnpm without corepack and package.json#packageManager could lead to failed builds with ERR_PNPM_UNSUPPORTED_ENGINE. Learn more: https://vercel.com/docs/errors/error-list#pnpm-engine-unsupported`
22274
+ );
22275
+ }
22262
22276
  function validateCorepackPackageManager(cliType, lockfileVersion, corepackPackageManager, enginesPnpmVersionRange) {
22263
22277
  const validatedCorepackPackageManager = validateVersionSpecifier(
22264
22278
  corepackPackageManager
22265
22279
  );
22266
22280
  if (!validatedCorepackPackageManager) {
22267
- console.warn(
22268
- `WARN [package-manager-warning-2] Intended corepack defined package manager "${corepackPackageManager}" is not a valid semver value.`
22281
+ throw new Error(
22282
+ `Intended corepack defined package manager "${corepackPackageManager}" is not a valid semver value.`
22269
22283
  );
22270
- return false;
22271
22284
  }
22272
22285
  if (cliType !== validatedCorepackPackageManager.packageName) {
22273
- console.warn(
22274
- `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.`
22286
+ throw new Error(
22287
+ `Detected package manager "${cliType}" does not match intended corepack defined package manager "${validatedCorepackPackageManager.packageName}". Change your lockfile or "package.json#packageManager" value to match.`
22275
22288
  );
22276
- return false;
22277
22289
  }
22278
22290
  if (cliType === "pnpm" && enginesPnpmVersionRange) {
22279
22291
  const pnpmWithinEngineRange = (0, import_semver2.satisfies)(
@@ -22287,13 +22299,16 @@ function validateCorepackPackageManager(cliType, lockfileVersion, corepackPackag
22287
22299
  }
22288
22300
  }
22289
22301
  if (lockfileVersion) {
22290
- return validLockfileForPackageManager(
22302
+ const lockfileValid = validLockfileForPackageManager(
22291
22303
  cliType,
22292
22304
  lockfileVersion,
22293
22305
  validatedCorepackPackageManager.packageVersion
22294
22306
  );
22295
- } else {
22296
- return true;
22307
+ if (!lockfileValid) {
22308
+ throw new Error(
22309
+ `Detected lockfile "${lockfileVersion}" which is not compatible with the intended corepack package manager "${corepackPackageManager}". Update your lockfile or change to a compatible corepack version.`
22310
+ );
22311
+ }
22297
22312
  }
22298
22313
  }
22299
22314
  function validateVersionSpecifier(version) {
@@ -22329,26 +22344,30 @@ function detectPackageManager(cliType, lockfileVersion) {
22329
22344
  return {
22330
22345
  path: "/pnpm7/node_modules/.bin",
22331
22346
  detectedLockfile: "pnpm-lock.yaml",
22332
- detectedPackageManager: "pnpm@7.x"
22347
+ detectedPackageManager: "pnpm@7.x",
22348
+ pnpmVersionRange: "7.x"
22333
22349
  };
22334
22350
  case "pnpm 8":
22335
22351
  return {
22336
22352
  path: "/pnpm8/node_modules/.bin",
22337
22353
  detectedLockfile: "pnpm-lock.yaml",
22338
- detectedPackageManager: "pnpm@8.x"
22354
+ detectedPackageManager: "pnpm@8.x",
22355
+ pnpmVersionRange: "8.x"
22339
22356
  };
22340
22357
  case "pnpm 9":
22341
22358
  return {
22342
22359
  path: "/pnpm9/node_modules/.bin",
22343
22360
  detectedLockfile: "pnpm-lock.yaml",
22344
- detectedPackageManager: "pnpm@9.x"
22361
+ detectedPackageManager: "pnpm@9.x",
22362
+ pnpmVersionRange: "9.x"
22345
22363
  };
22346
22364
  case "pnpm 6":
22347
22365
  return {
22348
22366
  // undefined because pnpm@6 is the current default in the build container
22349
22367
  path: void 0,
22350
22368
  detectedLockfile: "pnpm-lock.yaml",
22351
- detectedPackageManager: "pnpm@6.x"
22369
+ detectedPackageManager: "pnpm@6.x",
22370
+ pnpmVersionRange: "6.x"
22352
22371
  };
22353
22372
  default:
22354
22373
  return void 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vercel/build-utils",
3
- "version": "8.3.8",
3
+ "version": "8.4.0",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.js",