@vercel/build-utils 8.3.8 → 8.3.9

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,13 @@
1
1
  # @vercel/build-utils
2
2
 
3
+ ## 8.3.9
4
+
5
+ ### Patch Changes
6
+
7
+ - Provide help when users get ERR_PNPM_UNSUPPORTED_ENGINE errors without corepack ([#12034](https://github.com/vercel/vercel/pull/12034))
8
+
9
+ - Fix package-manager-warning-1 to happen only happen in correct cases ([#12050](https://github.com/vercel/vercel/pull/12050))
10
+
3
11
  ## 8.3.8
4
12
 
5
13
  ### 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,20 +524,34 @@ 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
@@ -546,13 +560,13 @@ function validateCorepackPackageManager(cliType, lockfileVersion, corepackPackag
546
560
  console.warn(
547
561
  `WARN [package-manager-warning-2] Intended corepack defined package manager "${corepackPackageManager}" is not a valid semver value.`
548
562
  );
549
- return false;
563
+ return;
550
564
  }
551
565
  if (cliType !== validatedCorepackPackageManager.packageName) {
552
566
  console.warn(
553
567
  `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
568
  );
555
- return false;
569
+ return;
556
570
  }
557
571
  if (cliType === "pnpm" && enginesPnpmVersionRange) {
558
572
  const pnpmWithinEngineRange = (0, import_semver.satisfies)(
@@ -566,13 +580,16 @@ function validateCorepackPackageManager(cliType, lockfileVersion, corepackPackag
566
580
  }
567
581
  }
568
582
  if (lockfileVersion) {
569
- return validLockfileForPackageManager(
583
+ const lockfileValid = validLockfileForPackageManager(
570
584
  cliType,
571
585
  lockfileVersion,
572
586
  validatedCorepackPackageManager.packageVersion
573
587
  );
574
- } else {
575
- return true;
588
+ if (!lockfileValid) {
589
+ console.warn(
590
+ `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.`
591
+ );
592
+ }
576
593
  }
577
594
  }
578
595
  function validateVersionSpecifier(version) {
@@ -608,26 +625,30 @@ function detectPackageManager(cliType, lockfileVersion) {
608
625
  return {
609
626
  path: "/pnpm7/node_modules/.bin",
610
627
  detectedLockfile: "pnpm-lock.yaml",
611
- detectedPackageManager: "pnpm@7.x"
628
+ detectedPackageManager: "pnpm@7.x",
629
+ pnpmVersionRange: "7.x"
612
630
  };
613
631
  case "pnpm 8":
614
632
  return {
615
633
  path: "/pnpm8/node_modules/.bin",
616
634
  detectedLockfile: "pnpm-lock.yaml",
617
- detectedPackageManager: "pnpm@8.x"
635
+ detectedPackageManager: "pnpm@8.x",
636
+ pnpmVersionRange: "8.x"
618
637
  };
619
638
  case "pnpm 9":
620
639
  return {
621
640
  path: "/pnpm9/node_modules/.bin",
622
641
  detectedLockfile: "pnpm-lock.yaml",
623
- detectedPackageManager: "pnpm@9.x"
642
+ detectedPackageManager: "pnpm@9.x",
643
+ pnpmVersionRange: "9.x"
624
644
  };
625
645
  case "pnpm 6":
626
646
  return {
627
647
  // undefined because pnpm@6 is the current default in the build container
628
648
  path: void 0,
629
649
  detectedLockfile: "pnpm-lock.yaml",
630
- detectedPackageManager: "pnpm@6.x"
650
+ detectedPackageManager: "pnpm@6.x",
651
+ pnpmVersionRange: "6.x"
631
652
  };
632
653
  default:
633
654
  return void 0;
package/dist/index.js CHANGED
@@ -22245,20 +22245,34 @@ 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
@@ -22267,13 +22281,13 @@ function validateCorepackPackageManager(cliType, lockfileVersion, corepackPackag
22267
22281
  console.warn(
22268
22282
  `WARN [package-manager-warning-2] Intended corepack defined package manager "${corepackPackageManager}" is not a valid semver value.`
22269
22283
  );
22270
- return false;
22284
+ return;
22271
22285
  }
22272
22286
  if (cliType !== validatedCorepackPackageManager.packageName) {
22273
22287
  console.warn(
22274
22288
  `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.`
22275
22289
  );
22276
- return false;
22290
+ return;
22277
22291
  }
22278
22292
  if (cliType === "pnpm" && enginesPnpmVersionRange) {
22279
22293
  const pnpmWithinEngineRange = (0, import_semver2.satisfies)(
@@ -22287,13 +22301,16 @@ function validateCorepackPackageManager(cliType, lockfileVersion, corepackPackag
22287
22301
  }
22288
22302
  }
22289
22303
  if (lockfileVersion) {
22290
- return validLockfileForPackageManager(
22304
+ const lockfileValid = validLockfileForPackageManager(
22291
22305
  cliType,
22292
22306
  lockfileVersion,
22293
22307
  validatedCorepackPackageManager.packageVersion
22294
22308
  );
22295
- } else {
22296
- return true;
22309
+ if (!lockfileValid) {
22310
+ console.warn(
22311
+ `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.`
22312
+ );
22313
+ }
22297
22314
  }
22298
22315
  }
22299
22316
  function validateVersionSpecifier(version) {
@@ -22329,26 +22346,30 @@ function detectPackageManager(cliType, lockfileVersion) {
22329
22346
  return {
22330
22347
  path: "/pnpm7/node_modules/.bin",
22331
22348
  detectedLockfile: "pnpm-lock.yaml",
22332
- detectedPackageManager: "pnpm@7.x"
22349
+ detectedPackageManager: "pnpm@7.x",
22350
+ pnpmVersionRange: "7.x"
22333
22351
  };
22334
22352
  case "pnpm 8":
22335
22353
  return {
22336
22354
  path: "/pnpm8/node_modules/.bin",
22337
22355
  detectedLockfile: "pnpm-lock.yaml",
22338
- detectedPackageManager: "pnpm@8.x"
22356
+ detectedPackageManager: "pnpm@8.x",
22357
+ pnpmVersionRange: "8.x"
22339
22358
  };
22340
22359
  case "pnpm 9":
22341
22360
  return {
22342
22361
  path: "/pnpm9/node_modules/.bin",
22343
22362
  detectedLockfile: "pnpm-lock.yaml",
22344
- detectedPackageManager: "pnpm@9.x"
22363
+ detectedPackageManager: "pnpm@9.x",
22364
+ pnpmVersionRange: "9.x"
22345
22365
  };
22346
22366
  case "pnpm 6":
22347
22367
  return {
22348
22368
  // undefined because pnpm@6 is the current default in the build container
22349
22369
  path: void 0,
22350
22370
  detectedLockfile: "pnpm-lock.yaml",
22351
- detectedPackageManager: "pnpm@6.x"
22371
+ detectedPackageManager: "pnpm@6.x",
22372
+ pnpmVersionRange: "6.x"
22352
22373
  };
22353
22374
  default:
22354
22375
  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.3.9",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.js",