@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 +14 -0
- package/dist/fs/run-user-scripts.d.ts +12 -0
- package/dist/fs/run-user-scripts.js +38 -19
- package/dist/index.js +38 -19
- package/package.json +1 -1
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
|
-
|
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
|
-
|
547
|
-
`
|
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
|
-
|
553
|
-
`
|
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
|
-
|
581
|
+
const lockfileValid = validLockfileForPackageManager(
|
570
582
|
cliType,
|
571
583
|
lockfileVersion,
|
572
584
|
validatedCorepackPackageManager.packageVersion
|
573
585
|
);
|
574
|
-
|
575
|
-
|
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
|
-
|
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
|
-
|
22268
|
-
`
|
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
|
-
|
22274
|
-
`
|
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
|
-
|
22302
|
+
const lockfileValid = validLockfileForPackageManager(
|
22291
22303
|
cliType,
|
22292
22304
|
lockfileVersion,
|
22293
22305
|
validatedCorepackPackageManager.packageVersion
|
22294
22306
|
);
|
22295
|
-
|
22296
|
-
|
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;
|