@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 +8 -0
- package/dist/fs/run-user-scripts.d.ts +12 -0
- package/dist/fs/run-user-scripts.js +36 -15
- package/dist/index.js +36 -15
- package/package.json +1 -1
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
|
-
|
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
|
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
|
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
|
-
|
583
|
+
const lockfileValid = validLockfileForPackageManager(
|
570
584
|
cliType,
|
571
585
|
lockfileVersion,
|
572
586
|
validatedCorepackPackageManager.packageVersion
|
573
587
|
);
|
574
|
-
|
575
|
-
|
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
|
-
|
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
|
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
|
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
|
-
|
22304
|
+
const lockfileValid = validLockfileForPackageManager(
|
22291
22305
|
cliType,
|
22292
22306
|
lockfileVersion,
|
22293
22307
|
validatedCorepackPackageManager.packageVersion
|
22294
22308
|
);
|
22295
|
-
|
22296
|
-
|
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;
|