@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 +14 -0
- package/dist/fs/run-user-scripts.d.ts +15 -3
- package/dist/fs/run-user-scripts.js +149 -72
- package/dist/index.js +256 -181
- package/dist/types.d.ts +1 -0
- package/package.json +1 -1
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,
|
101
|
+
export declare function getPathOverrideForPackageManager({ cliType, lockfileVersion, corepackPackageManager, corepackEnabled, packageJsonEngines, }: {
|
101
102
|
cliType: CliType;
|
102
103
|
lockfileVersion: number | undefined;
|
103
|
-
|
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
|
-
|
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
|
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
|
486
|
-
|
487
|
-
|
488
|
-
|
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
|
-
|
494
|
-
|
521
|
+
corepackPackageManager,
|
522
|
+
corepackEnabled = true,
|
523
|
+
packageJsonEngines
|
495
524
|
}) {
|
496
|
-
const
|
497
|
-
|
498
|
-
|
499
|
-
|
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
|
-
|
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
|
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
|
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
|
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
|
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
|
-
|
548
|
-
|
549
|
-
|
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
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
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
|
-
|
656
|
+
let overrides = getPathOverrideForPackageManager({
|
586
657
|
cliType,
|
587
658
|
lockfileVersion,
|
588
|
-
|
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,
|