@vercel/build-utils 14.2.0 → 14.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 +43 -0
- package/dist/fs/run-user-scripts.d.ts +19 -10
- package/dist/fs/run-user-scripts.js +266 -85
- package/dist/index.d.ts +2 -2
- package/dist/index.js +295 -107
- package/dist/prerender.d.ts +24 -15
- package/dist/prerender.js +2 -2
- package/dist/service-path-utils.d.ts +2 -0
- package/dist/service-path-utils.js +13 -2
- package/dist/types.d.ts +9 -0
- package/package.json +3 -3
|
@@ -29,6 +29,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
29
29
|
var run_user_scripts_exports = {};
|
|
30
30
|
__export(run_user_scripts_exports, {
|
|
31
31
|
PNPM_10_PREFERRED_AT: () => PNPM_10_PREFERRED_AT,
|
|
32
|
+
PNPM_11_PREFERRED_AT: () => PNPM_11_PREFERRED_AT,
|
|
32
33
|
detectPackageManager: () => detectPackageManager,
|
|
33
34
|
execCommand: () => execCommand,
|
|
34
35
|
findPackageJson: () => findPackageJson,
|
|
@@ -51,6 +52,7 @@ __export(run_user_scripts_exports, {
|
|
|
51
52
|
scanParentDirs: () => scanParentDirs,
|
|
52
53
|
spawnAsync: () => spawnAsync,
|
|
53
54
|
spawnCommand: () => spawnCommand,
|
|
55
|
+
stripPnpmVersionFooter: () => stripPnpmVersionFooter,
|
|
54
56
|
traverseUpDirectories: () => traverseUpDirectories,
|
|
55
57
|
turboVersionSpecifierSupportsCorepack: () => turboVersionSpecifierSupportsCorepack,
|
|
56
58
|
usingCorepack: () => usingCorepack,
|
|
@@ -63,6 +65,7 @@ var import_path = __toESM(require("path"));
|
|
|
63
65
|
var import_async_sema = __toESM(require("async-sema"));
|
|
64
66
|
var import_cross_spawn = __toESM(require("cross-spawn"));
|
|
65
67
|
var import_semver = require("semver");
|
|
68
|
+
var import_stream = require("stream");
|
|
66
69
|
var import_util = require("util");
|
|
67
70
|
var import_debug = __toESM(require("../debug"));
|
|
68
71
|
var import_errors = require("../errors");
|
|
@@ -327,7 +330,8 @@ async function scanParentDirs(destPath, readPackageJson = false, base = "/") {
|
|
|
327
330
|
bunLockBinPath,
|
|
328
331
|
vltLockPath
|
|
329
332
|
],
|
|
330
|
-
packageJsonPackageManager
|
|
333
|
+
packageJsonPackageManager,
|
|
334
|
+
packageJsonDevEngines
|
|
331
335
|
} = await walkParentDirsMulti({
|
|
332
336
|
base,
|
|
333
337
|
start: destPath,
|
|
@@ -394,6 +398,7 @@ async function scanParentDirs(destPath, readPackageJson = false, base = "/") {
|
|
|
394
398
|
cliType,
|
|
395
399
|
packageJson,
|
|
396
400
|
packageJsonPackageManager,
|
|
401
|
+
packageJsonDevEngines,
|
|
397
402
|
lockfilePath,
|
|
398
403
|
lockfileVersion,
|
|
399
404
|
packageJsonPath,
|
|
@@ -509,6 +514,7 @@ async function walkParentDirsMulti({
|
|
|
509
514
|
filenames
|
|
510
515
|
}) {
|
|
511
516
|
let packageManager;
|
|
517
|
+
let devEngines;
|
|
512
518
|
for (const dir of traverseUpDirectories({ start, base })) {
|
|
513
519
|
const fullPaths = filenames.map((f) => import_path.default.join(dir, f));
|
|
514
520
|
const existResults = await Promise.all(
|
|
@@ -520,14 +526,22 @@ async function walkParentDirsMulti({
|
|
|
520
526
|
if (packageJson?.packageManager) {
|
|
521
527
|
packageManager = packageJson.packageManager;
|
|
522
528
|
}
|
|
529
|
+
if (packageJson?.devEngines) {
|
|
530
|
+
devEngines = packageJson.devEngines;
|
|
531
|
+
}
|
|
523
532
|
if (foundOneOrMore) {
|
|
524
533
|
return {
|
|
525
534
|
paths: fullPaths.map((f, i) => existResults[i] ? f : void 0),
|
|
526
|
-
packageJsonPackageManager: packageManager
|
|
535
|
+
packageJsonPackageManager: packageManager,
|
|
536
|
+
packageJsonDevEngines: devEngines
|
|
527
537
|
};
|
|
528
538
|
}
|
|
529
539
|
}
|
|
530
|
-
return {
|
|
540
|
+
return {
|
|
541
|
+
paths: [],
|
|
542
|
+
packageJsonPackageManager: packageManager,
|
|
543
|
+
packageJsonDevEngines: devEngines
|
|
544
|
+
};
|
|
531
545
|
}
|
|
532
546
|
function isSet(v) {
|
|
533
547
|
return v?.constructor?.name === "Set";
|
|
@@ -564,6 +578,29 @@ function getInstallCommandForPackageManager(packageManager, args) {
|
|
|
564
578
|
};
|
|
565
579
|
}
|
|
566
580
|
}
|
|
581
|
+
function stripPnpmVersionFooter(line) {
|
|
582
|
+
return line.replace(/ using pnpm v\d+\.\d+\.\d+(?=\r?$)/, "");
|
|
583
|
+
}
|
|
584
|
+
function createPnpmOutputFilter(destination) {
|
|
585
|
+
let incompleteLine = "";
|
|
586
|
+
return new import_stream.Transform({
|
|
587
|
+
transform(chunk, _encoding, callback) {
|
|
588
|
+
const lines = `${incompleteLine}${chunk.toString()}`.split("\n");
|
|
589
|
+
incompleteLine = lines.pop() ?? "";
|
|
590
|
+
for (const line of lines) {
|
|
591
|
+
destination.write(`${stripPnpmVersionFooter(line)}
|
|
592
|
+
`);
|
|
593
|
+
}
|
|
594
|
+
callback();
|
|
595
|
+
},
|
|
596
|
+
flush(callback) {
|
|
597
|
+
if (incompleteLine) {
|
|
598
|
+
destination.write(stripPnpmVersionFooter(incompleteLine));
|
|
599
|
+
}
|
|
600
|
+
callback();
|
|
601
|
+
}
|
|
602
|
+
});
|
|
603
|
+
}
|
|
567
604
|
async function runInstallCommand({
|
|
568
605
|
packageManager,
|
|
569
606
|
args,
|
|
@@ -575,8 +612,9 @@ async function runInstallCommand({
|
|
|
575
612
|
if (process.env.NPM_ONLY_PRODUCTION) {
|
|
576
613
|
commandArguments.push("--production");
|
|
577
614
|
}
|
|
578
|
-
|
|
579
|
-
opts.
|
|
615
|
+
const shouldFilterPnpmOutput = packageManager === "pnpm";
|
|
616
|
+
opts.outputStream = shouldFilterPnpmOutput ? createPnpmOutputFilter(output?.stdout ?? process.stdout) : output?.stdout;
|
|
617
|
+
opts.errorStream = shouldFilterPnpmOutput ? output?.stderr ?? process.stderr : output?.stderr;
|
|
580
618
|
await spawnAsync(packageManager, commandArguments, opts);
|
|
581
619
|
}
|
|
582
620
|
function initializeSet(set) {
|
|
@@ -620,6 +658,7 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, projectCreate
|
|
|
620
658
|
packageJson,
|
|
621
659
|
lockfileVersion,
|
|
622
660
|
packageJsonPackageManager,
|
|
661
|
+
packageJsonDevEngines,
|
|
623
662
|
turboSupportsCorepackHome
|
|
624
663
|
} = await scanParentDirs(destPath, true);
|
|
625
664
|
if (!packageJsonPath) {
|
|
@@ -658,12 +697,6 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, projectCreate
|
|
|
658
697
|
}
|
|
659
698
|
}
|
|
660
699
|
const installTime = Date.now();
|
|
661
|
-
if (output?.stdout) {
|
|
662
|
-
output.stdout.write("Installing dependencies...\n");
|
|
663
|
-
} else {
|
|
664
|
-
console.log("Installing dependencies...");
|
|
665
|
-
}
|
|
666
|
-
(0, import_debug.default)(`Installing to ${destPath}`);
|
|
667
700
|
const opts = { cwd: destPath, ...spawnOpts };
|
|
668
701
|
const env = (0, import_clone_env.cloneEnv)(opts.env || process.env);
|
|
669
702
|
delete env.NODE_ENV;
|
|
@@ -671,11 +704,26 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, projectCreate
|
|
|
671
704
|
cliType,
|
|
672
705
|
lockfileVersion,
|
|
673
706
|
packageJsonPackageManager,
|
|
707
|
+
packageJsonDevEngines,
|
|
674
708
|
env,
|
|
675
709
|
packageJsonEngines: packageJson?.engines,
|
|
676
710
|
turboSupportsCorepackHome,
|
|
677
711
|
projectCreatedAt
|
|
678
712
|
});
|
|
713
|
+
const packageManager = getPackageManagerDisplayName({
|
|
714
|
+
cliType,
|
|
715
|
+
lockfileVersion,
|
|
716
|
+
packageJsonPackageManager,
|
|
717
|
+
env: opts.env
|
|
718
|
+
});
|
|
719
|
+
const installMessage = `Installing dependencies with ${packageManager}`;
|
|
720
|
+
if (output?.stdout) {
|
|
721
|
+
output.stdout.write(`${installMessage}
|
|
722
|
+
`);
|
|
723
|
+
} else {
|
|
724
|
+
console.log(installMessage);
|
|
725
|
+
}
|
|
726
|
+
(0, import_debug.default)(`Installing to ${destPath}`);
|
|
679
727
|
const maySeeDynamicRequireYarnBug = process.env?.ENABLE_EXPERIMENTAL_COREPACK && packageJson?.packageManager?.startsWith("yarn") && packageJson?.type === "module";
|
|
680
728
|
if (maySeeDynamicRequireYarnBug) {
|
|
681
729
|
console.warn(
|
|
@@ -694,10 +742,42 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, projectCreate
|
|
|
694
742
|
runNpmInstallSema.release();
|
|
695
743
|
}
|
|
696
744
|
}
|
|
745
|
+
function getPackageManagerDisplayName({
|
|
746
|
+
cliType,
|
|
747
|
+
lockfileVersion,
|
|
748
|
+
packageJsonPackageManager,
|
|
749
|
+
env
|
|
750
|
+
}) {
|
|
751
|
+
const versionResult = import_cross_spawn.default.sync(cliType, ["--version"], {
|
|
752
|
+
env,
|
|
753
|
+
encoding: "utf8"
|
|
754
|
+
});
|
|
755
|
+
const version = versionResult.status === 0 ? versionResult.stdout.trim() : "";
|
|
756
|
+
if (version) {
|
|
757
|
+
return `${cliType} ${version}`;
|
|
758
|
+
}
|
|
759
|
+
if (packageJsonPackageManager && env.ENABLE_EXPERIMENTAL_COREPACK) {
|
|
760
|
+
return packageJsonPackageManager.replace("@", " ");
|
|
761
|
+
}
|
|
762
|
+
if (cliType === "pnpm") {
|
|
763
|
+
const selectedPath = env.PATH?.split(import_path.default.delimiter).find(
|
|
764
|
+
(segment) => /^\/pnpm\d+\/node_modules\/\.bin$/.test(segment)
|
|
765
|
+
);
|
|
766
|
+
const major = selectedPath?.match(/^\/pnpm(\d+)\//)?.[1];
|
|
767
|
+
if (major) {
|
|
768
|
+
return `pnpm ${major}`;
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
if (cliType === "yarn") {
|
|
772
|
+
return detectYarnVersion(lockfileVersion).replace("@", " ").replace(/\.x$/, "");
|
|
773
|
+
}
|
|
774
|
+
return cliType;
|
|
775
|
+
}
|
|
697
776
|
function getEnvForPackageManager({
|
|
698
777
|
cliType,
|
|
699
778
|
lockfileVersion,
|
|
700
779
|
packageJsonPackageManager,
|
|
780
|
+
packageJsonDevEngines,
|
|
701
781
|
nodeVersion,
|
|
702
782
|
env,
|
|
703
783
|
packageJsonEngines,
|
|
@@ -717,6 +797,7 @@ function getEnvForPackageManager({
|
|
|
717
797
|
cliType,
|
|
718
798
|
lockfileVersion,
|
|
719
799
|
corepackPackageManager: packageJsonPackageManager,
|
|
800
|
+
packageJsonDevEngines,
|
|
720
801
|
corepackEnabled,
|
|
721
802
|
nodeVersion,
|
|
722
803
|
packageJsonEngines,
|
|
@@ -750,28 +831,6 @@ function getEnvForPackageManager({
|
|
|
750
831
|
if (pathsToPrepend.length > 0) {
|
|
751
832
|
const oldPath = env.PATH + "";
|
|
752
833
|
newEnv.PATH = `${pathsToPrepend.join(import_path.default.delimiter)}${oldPath ? import_path.default.delimiter : ""}${oldPath}`;
|
|
753
|
-
if (newPath && pathsToPrepend.includes(newPath) && detectedLockfile && detectedPackageManager) {
|
|
754
|
-
const detectedV9PnpmLockfile = detectedLockfile === "pnpm-lock.yaml" && lockfileVersion === 9;
|
|
755
|
-
const pnpm10UsingPackageJsonPackageManager = detectedPackageManager === "pnpm@10.x" && packageJsonPackageManager;
|
|
756
|
-
if (pnpm10UsingPackageJsonPackageManager) {
|
|
757
|
-
const versionString = cliType === "pnpm" ? `version ${lockfileVersion} ` : "";
|
|
758
|
-
console.log(
|
|
759
|
-
`Detected \`${detectedLockfile}\` ${versionString}generated by ${detectedPackageManager} with package.json#packageManager ${packageJsonPackageManager}`
|
|
760
|
-
);
|
|
761
|
-
} else if (detectedV9PnpmLockfile) {
|
|
762
|
-
const otherVersion = detectedPackageManager === "pnpm@10.x" ? `pnpm@9.x` : `pnpm@10.x`;
|
|
763
|
-
console.log(
|
|
764
|
-
`Detected \`${detectedLockfile}\` ${lockfileVersion} which may be generated by pnpm@9.x or pnpm@10.x
|
|
765
|
-
Using ${detectedPackageManager} based on project creation date
|
|
766
|
-
To use ${otherVersion}, manually opt in using corepack (https://vercel.com/docs/deployments/configure-a-build#corepack)`
|
|
767
|
-
);
|
|
768
|
-
} else {
|
|
769
|
-
const versionString = cliType === "pnpm" ? `version ${lockfileVersion} ` : "";
|
|
770
|
-
console.log(
|
|
771
|
-
`Detected \`${detectedLockfile}\` ${versionString}generated by ${detectedPackageManager}`
|
|
772
|
-
);
|
|
773
|
-
}
|
|
774
|
-
}
|
|
775
834
|
}
|
|
776
835
|
if (cliType === "yarn" && !env.YARN_NODE_LINKER) {
|
|
777
836
|
newEnv.YARN_NODE_LINKER = "node-modules";
|
|
@@ -779,7 +838,29 @@ To use ${otherVersion}, manually opt in using corepack (https://vercel.com/docs/
|
|
|
779
838
|
return newEnv;
|
|
780
839
|
}
|
|
781
840
|
const PNPM_10_PREFERRED_AT = /* @__PURE__ */ new Date("2025-02-27T20:00:00Z");
|
|
782
|
-
|
|
841
|
+
const PNPM_11_PREFERRED_AT = /* @__PURE__ */ new Date("2026-08-19T20:00:00Z");
|
|
842
|
+
const INSTALLED_PNPM_MAJORS = [11, 10, 9, 8, 7, 6];
|
|
843
|
+
function pnpmPathOverride(major) {
|
|
844
|
+
return {
|
|
845
|
+
path: `/pnpm${major}/node_modules/.bin`,
|
|
846
|
+
detectedLockfile: "pnpm-lock.yaml",
|
|
847
|
+
detectedPackageManager: `pnpm@${major}.x`,
|
|
848
|
+
pnpmVersionRange: `${major}.x`
|
|
849
|
+
};
|
|
850
|
+
}
|
|
851
|
+
function isPnpmMajorAvailable(major) {
|
|
852
|
+
if (major <= 10) {
|
|
853
|
+
return true;
|
|
854
|
+
}
|
|
855
|
+
return import_fs_extra.default.existsSync(`/pnpm${major}`);
|
|
856
|
+
}
|
|
857
|
+
function nodeSupportsPnpm11Default(nodeVersion) {
|
|
858
|
+
if (!nodeVersion || (0, import_node_version.isBunVersion)(nodeVersion)) {
|
|
859
|
+
return true;
|
|
860
|
+
}
|
|
861
|
+
return nodeVersion.major >= 22;
|
|
862
|
+
}
|
|
863
|
+
function detectPnpmVersion(lockfileVersion, projectCreatedAt, nodeVersion) {
|
|
783
864
|
switch (true) {
|
|
784
865
|
case lockfileVersion === void 0:
|
|
785
866
|
return "not found";
|
|
@@ -792,8 +873,13 @@ function detectPnpmVersion(lockfileVersion, projectCreatedAt) {
|
|
|
792
873
|
case lockfileVersion === 7:
|
|
793
874
|
return "pnpm 9";
|
|
794
875
|
case lockfileVersion === 9: {
|
|
795
|
-
|
|
796
|
-
|
|
876
|
+
if (projectCreatedAt && projectCreatedAt >= PNPM_11_PREFERRED_AT.getTime() && nodeSupportsPnpm11Default(nodeVersion) && isPnpmMajorAvailable(11)) {
|
|
877
|
+
return "pnpm 11";
|
|
878
|
+
}
|
|
879
|
+
if (projectCreatedAt && projectCreatedAt >= PNPM_10_PREFERRED_AT.getTime()) {
|
|
880
|
+
return "pnpm 10";
|
|
881
|
+
}
|
|
882
|
+
return "pnpm 9";
|
|
797
883
|
}
|
|
798
884
|
default:
|
|
799
885
|
return "not found";
|
|
@@ -823,6 +909,7 @@ function validLockfileForPackageManager(cliType, lockfileVersion, packageManager
|
|
|
823
909
|
return true;
|
|
824
910
|
case "pnpm":
|
|
825
911
|
switch (packageManagerMajorVersion) {
|
|
912
|
+
case 11:
|
|
826
913
|
case 10:
|
|
827
914
|
return lockfileVersion === 9;
|
|
828
915
|
case 9:
|
|
@@ -841,10 +928,75 @@ function validLockfileForPackageManager(cliType, lockfileVersion, packageManager
|
|
|
841
928
|
}
|
|
842
929
|
}
|
|
843
930
|
}
|
|
931
|
+
function lockfileCompatibleWithPnpm(lockfileVersion, packageManagerVersion) {
|
|
932
|
+
if (lockfileVersion === void 0) {
|
|
933
|
+
return true;
|
|
934
|
+
}
|
|
935
|
+
return validLockfileForPackageManager(
|
|
936
|
+
"pnpm",
|
|
937
|
+
lockfileVersion,
|
|
938
|
+
packageManagerVersion
|
|
939
|
+
);
|
|
940
|
+
}
|
|
941
|
+
function highestInstalledPnpmMajor(versionRange, lockfileVersion) {
|
|
942
|
+
if (!(0, import_semver.validRange)(versionRange)) {
|
|
943
|
+
return void 0;
|
|
944
|
+
}
|
|
945
|
+
for (const major of INSTALLED_PNPM_MAJORS) {
|
|
946
|
+
if (!isPnpmMajorAvailable(major)) {
|
|
947
|
+
continue;
|
|
948
|
+
}
|
|
949
|
+
if (!(0, import_semver.intersects)(`${major}.x`, versionRange)) {
|
|
950
|
+
continue;
|
|
951
|
+
}
|
|
952
|
+
const versionForLockfile = (0, import_semver.parse)(major === 9 ? "9.0.1" : `${major}.0.0`);
|
|
953
|
+
if (!versionForLockfile || !lockfileCompatibleWithPnpm(lockfileVersion, versionForLockfile)) {
|
|
954
|
+
continue;
|
|
955
|
+
}
|
|
956
|
+
return major;
|
|
957
|
+
}
|
|
958
|
+
return void 0;
|
|
959
|
+
}
|
|
960
|
+
function resolveDevEnginesPnpmRange(devEngines) {
|
|
961
|
+
if (!devEngines?.packageManager) {
|
|
962
|
+
return void 0;
|
|
963
|
+
}
|
|
964
|
+
const entries = Array.isArray(devEngines.packageManager) ? devEngines.packageManager : [devEngines.packageManager];
|
|
965
|
+
const pnpm = entries.find((entry) => entry.name === "pnpm" && entry.version);
|
|
966
|
+
return pnpm?.version;
|
|
967
|
+
}
|
|
968
|
+
function resolveCompatiblePnpmPin({
|
|
969
|
+
cliType,
|
|
970
|
+
lockfileVersion,
|
|
971
|
+
packageJsonDevEngines,
|
|
972
|
+
corepackPackageManager
|
|
973
|
+
}) {
|
|
974
|
+
if (cliType !== "pnpm") {
|
|
975
|
+
return void 0;
|
|
976
|
+
}
|
|
977
|
+
const devEnginesRange = resolveDevEnginesPnpmRange(packageJsonDevEngines);
|
|
978
|
+
if (devEnginesRange) {
|
|
979
|
+
const major = highestInstalledPnpmMajor(devEnginesRange, lockfileVersion);
|
|
980
|
+
if (major !== void 0) {
|
|
981
|
+
return { override: pnpmPathOverride(major), source: "devEngines" };
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
const parsed = validateVersionSpecifier(corepackPackageManager);
|
|
985
|
+
if (parsed?.packageName === "pnpm") {
|
|
986
|
+
if (lockfileCompatibleWithPnpm(lockfileVersion, parsed.packageVersion) && isPnpmMajorAvailable(parsed.packageVersion.major)) {
|
|
987
|
+
return {
|
|
988
|
+
override: pnpmPathOverride(parsed.packageVersion.major),
|
|
989
|
+
source: "packageManager"
|
|
990
|
+
};
|
|
991
|
+
}
|
|
992
|
+
}
|
|
993
|
+
return void 0;
|
|
994
|
+
}
|
|
844
995
|
function getPathOverrideForPackageManager({
|
|
845
996
|
cliType,
|
|
846
997
|
lockfileVersion,
|
|
847
998
|
corepackPackageManager,
|
|
999
|
+
packageJsonDevEngines,
|
|
848
1000
|
corepackEnabled = true,
|
|
849
1001
|
nodeVersion,
|
|
850
1002
|
packageJsonEngines,
|
|
@@ -853,7 +1005,8 @@ function getPathOverrideForPackageManager({
|
|
|
853
1005
|
const detectedPackageManger = detectPackageManager(
|
|
854
1006
|
cliType,
|
|
855
1007
|
lockfileVersion,
|
|
856
|
-
projectCreatedAt
|
|
1008
|
+
projectCreatedAt,
|
|
1009
|
+
nodeVersion
|
|
857
1010
|
);
|
|
858
1011
|
const usingCorepack2 = corepackPackageManager && corepackEnabled;
|
|
859
1012
|
if (usingCorepack2) {
|
|
@@ -865,14 +1018,20 @@ function getPathOverrideForPackageManager({
|
|
|
865
1018
|
);
|
|
866
1019
|
return NO_OVERRIDE;
|
|
867
1020
|
}
|
|
1021
|
+
const pin = resolveCompatiblePnpmPin({
|
|
1022
|
+
cliType,
|
|
1023
|
+
lockfileVersion,
|
|
1024
|
+
packageJsonDevEngines,
|
|
1025
|
+
corepackPackageManager
|
|
1026
|
+
});
|
|
1027
|
+
let selected = pin?.override ?? detectedPackageManger;
|
|
868
1028
|
if (cliType === "pnpm" && packageJsonEngines?.pnpm) {
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
}
|
|
1029
|
+
selected = applyEnginesPnpm({
|
|
1030
|
+
enginesPnpm: packageJsonEngines.pnpm,
|
|
1031
|
+
selected,
|
|
1032
|
+
usedPin: Boolean(pin),
|
|
1033
|
+
lockfileVersion
|
|
1034
|
+
});
|
|
876
1035
|
}
|
|
877
1036
|
if (cliType === "bun" && detectedPackageManger && nodeVersion && (0, import_node_version.isBunVersion)(nodeVersion)) {
|
|
878
1037
|
const minor = nodeVersion.minor;
|
|
@@ -882,20 +1041,53 @@ function getPathOverrideForPackageManager({
|
|
|
882
1041
|
detectedPackageManager: `bun@${nodeVersion.range}`
|
|
883
1042
|
};
|
|
884
1043
|
}
|
|
885
|
-
return
|
|
1044
|
+
return selected ?? NO_OVERRIDE;
|
|
886
1045
|
}
|
|
887
|
-
function
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
1046
|
+
function applyEnginesPnpm({
|
|
1047
|
+
enginesPnpm,
|
|
1048
|
+
selected,
|
|
1049
|
+
usedPin,
|
|
1050
|
+
lockfileVersion
|
|
1051
|
+
}) {
|
|
1052
|
+
const selectedRange = selected && "pnpmVersionRange" in selected ? selected.pnpmVersionRange : void 0;
|
|
1053
|
+
if (selectedRange && (0, import_semver.validRange)(selectedRange) && (0, import_semver.validRange)(enginesPnpm)) {
|
|
1054
|
+
if ((0, import_semver.intersects)(selectedRange, enginesPnpm)) {
|
|
1055
|
+
if (!usedPin) {
|
|
1056
|
+
warnEnginesPnpmWithoutPin();
|
|
1057
|
+
}
|
|
1058
|
+
return selected;
|
|
893
1059
|
}
|
|
1060
|
+
if (!usedPin) {
|
|
1061
|
+
const major = highestInstalledPnpmMajor(enginesPnpm, lockfileVersion);
|
|
1062
|
+
if (major !== void 0) {
|
|
1063
|
+
return pnpmPathOverride(major);
|
|
1064
|
+
}
|
|
1065
|
+
if (shouldDeferPnpm11UntilImageHasBinary(enginesPnpm, lockfileVersion)) {
|
|
1066
|
+
warnEnginesPnpmWithoutPin();
|
|
1067
|
+
return selected;
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
throw new Error(
|
|
1071
|
+
`Detected pnpm "${selectedRange}" is not compatible with the engines.pnpm "${enginesPnpm}" in your package.json. Set package.json#packageManager or package.json#devEngines.packageManager to a compatible pnpm version, or remove package.json#engines.pnpm.`
|
|
1072
|
+
);
|
|
1073
|
+
}
|
|
1074
|
+
if (!usedPin) {
|
|
1075
|
+
warnEnginesPnpmWithoutPin();
|
|
894
1076
|
}
|
|
1077
|
+
return selected;
|
|
1078
|
+
}
|
|
1079
|
+
function warnEnginesPnpmWithoutPin() {
|
|
895
1080
|
console.warn(
|
|
896
1081
|
`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`
|
|
897
1082
|
);
|
|
898
1083
|
}
|
|
1084
|
+
function shouldDeferPnpm11UntilImageHasBinary(enginesPnpm, lockfileVersion) {
|
|
1085
|
+
if (isPnpmMajorAvailable(11) || !(0, import_semver.intersects)("11.x", enginesPnpm)) {
|
|
1086
|
+
return false;
|
|
1087
|
+
}
|
|
1088
|
+
const pnpm11 = (0, import_semver.parse)("11.0.0");
|
|
1089
|
+
return Boolean(pnpm11 && lockfileCompatibleWithPnpm(lockfileVersion, pnpm11));
|
|
1090
|
+
}
|
|
899
1091
|
function validateCorepackPackageManager(cliType, lockfileVersion, corepackPackageManager, enginesPnpmVersionRange) {
|
|
900
1092
|
const validatedCorepackPackageManager = validateVersionSpecifier(
|
|
901
1093
|
corepackPackageManager
|
|
@@ -957,50 +1149,33 @@ function validateVersionSpecifier(version) {
|
|
|
957
1149
|
packageVersion
|
|
958
1150
|
};
|
|
959
1151
|
}
|
|
960
|
-
function detectPackageManager(cliType, lockfileVersion, projectCreatedAt) {
|
|
1152
|
+
function detectPackageManager(cliType, lockfileVersion, projectCreatedAt, nodeVersion) {
|
|
961
1153
|
switch (cliType) {
|
|
962
1154
|
case "npm":
|
|
963
1155
|
return void 0;
|
|
964
|
-
case "pnpm":
|
|
965
|
-
|
|
1156
|
+
case "pnpm": {
|
|
1157
|
+
const detected = detectPnpmVersion(
|
|
1158
|
+
lockfileVersion,
|
|
1159
|
+
projectCreatedAt,
|
|
1160
|
+
nodeVersion
|
|
1161
|
+
);
|
|
1162
|
+
switch (detected) {
|
|
1163
|
+
case "pnpm 6":
|
|
1164
|
+
return pnpmPathOverride(6);
|
|
966
1165
|
case "pnpm 7":
|
|
967
|
-
return
|
|
968
|
-
path: "/pnpm7/node_modules/.bin",
|
|
969
|
-
detectedLockfile: "pnpm-lock.yaml",
|
|
970
|
-
detectedPackageManager: "pnpm@7.x",
|
|
971
|
-
pnpmVersionRange: "7.x"
|
|
972
|
-
};
|
|
1166
|
+
return pnpmPathOverride(7);
|
|
973
1167
|
case "pnpm 8":
|
|
974
|
-
return
|
|
975
|
-
path: "/pnpm8/node_modules/.bin",
|
|
976
|
-
detectedLockfile: "pnpm-lock.yaml",
|
|
977
|
-
detectedPackageManager: "pnpm@8.x",
|
|
978
|
-
pnpmVersionRange: "8.x"
|
|
979
|
-
};
|
|
1168
|
+
return pnpmPathOverride(8);
|
|
980
1169
|
case "pnpm 9":
|
|
981
|
-
return
|
|
982
|
-
path: "/pnpm9/node_modules/.bin",
|
|
983
|
-
detectedLockfile: "pnpm-lock.yaml",
|
|
984
|
-
detectedPackageManager: "pnpm@9.x",
|
|
985
|
-
pnpmVersionRange: "9.x"
|
|
986
|
-
};
|
|
1170
|
+
return pnpmPathOverride(9);
|
|
987
1171
|
case "pnpm 10":
|
|
988
|
-
return
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
detectedPackageManager: "pnpm@10.x",
|
|
992
|
-
pnpmVersionRange: "10.x"
|
|
993
|
-
};
|
|
994
|
-
case "pnpm 6":
|
|
995
|
-
return {
|
|
996
|
-
path: "/pnpm6/node_modules/.bin",
|
|
997
|
-
detectedLockfile: "pnpm-lock.yaml",
|
|
998
|
-
detectedPackageManager: "pnpm@6.x",
|
|
999
|
-
pnpmVersionRange: "6.x"
|
|
1000
|
-
};
|
|
1172
|
+
return pnpmPathOverride(10);
|
|
1173
|
+
case "pnpm 11":
|
|
1174
|
+
return pnpmPathOverride(11);
|
|
1001
1175
|
default:
|
|
1002
1176
|
return void 0;
|
|
1003
1177
|
}
|
|
1178
|
+
}
|
|
1004
1179
|
case "bun":
|
|
1005
1180
|
return {
|
|
1006
1181
|
path: "/bun1",
|
|
@@ -1077,6 +1252,7 @@ async function runCustomInstallCommand({
|
|
|
1077
1252
|
packageJson,
|
|
1078
1253
|
packageJsonPath,
|
|
1079
1254
|
packageJsonPackageManager,
|
|
1255
|
+
packageJsonDevEngines,
|
|
1080
1256
|
turboSupportsCorepackHome
|
|
1081
1257
|
} = await scanParentDirs(destPath, true);
|
|
1082
1258
|
if (installCompletedCovers(packageJsonPath)) {
|
|
@@ -1090,6 +1266,7 @@ async function runCustomInstallCommand({
|
|
|
1090
1266
|
cliType,
|
|
1091
1267
|
lockfileVersion,
|
|
1092
1268
|
packageJsonPackageManager,
|
|
1269
|
+
packageJsonDevEngines,
|
|
1093
1270
|
env: spawnOpts?.env || {},
|
|
1094
1271
|
packageJsonEngines: packageJson?.engines,
|
|
1095
1272
|
turboSupportsCorepackHome,
|
|
@@ -1110,6 +1287,7 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts, projectCre
|
|
|
1110
1287
|
cliType,
|
|
1111
1288
|
lockfileVersion,
|
|
1112
1289
|
packageJsonPackageManager,
|
|
1290
|
+
packageJsonDevEngines,
|
|
1113
1291
|
turboSupportsCorepackHome
|
|
1114
1292
|
} = await scanParentDirs(destPath, true);
|
|
1115
1293
|
const scriptName = getScriptName(
|
|
@@ -1127,6 +1305,7 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts, projectCre
|
|
|
1127
1305
|
cliType,
|
|
1128
1306
|
lockfileVersion,
|
|
1129
1307
|
packageJsonPackageManager,
|
|
1308
|
+
packageJsonDevEngines,
|
|
1130
1309
|
env: (0, import_clone_env.cloneEnv)(process.env, spawnOpts?.env),
|
|
1131
1310
|
packageJsonEngines: packageJson?.engines,
|
|
1132
1311
|
turboSupportsCorepackHome,
|
|
@@ -1194,6 +1373,7 @@ const installDependencies = (0, import_util.deprecate)(
|
|
|
1194
1373
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1195
1374
|
0 && (module.exports = {
|
|
1196
1375
|
PNPM_10_PREFERRED_AT,
|
|
1376
|
+
PNPM_11_PREFERRED_AT,
|
|
1197
1377
|
detectPackageManager,
|
|
1198
1378
|
execCommand,
|
|
1199
1379
|
findPackageJson,
|
|
@@ -1216,6 +1396,7 @@ const installDependencies = (0, import_util.deprecate)(
|
|
|
1216
1396
|
scanParentDirs,
|
|
1217
1397
|
spawnAsync,
|
|
1218
1398
|
spawnCommand,
|
|
1399
|
+
stripPnpmVersionFooter,
|
|
1219
1400
|
traverseUpDirectories,
|
|
1220
1401
|
turboVersionSpecifierSupportsCorepack,
|
|
1221
1402
|
usingCorepack,
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import FileFsRef from './file-fs-ref';
|
|
|
3
3
|
import FileRef from './file-ref';
|
|
4
4
|
import { Lambda, createLambda, getLambdaOptionsFromFunction, sanitizeConsumerName } from './lambda';
|
|
5
5
|
import { NodejsLambda, type NodejsLambdaOptions } from './nodejs-lambda';
|
|
6
|
-
import { Prerender, type
|
|
6
|
+
import { Prerender, type PrerenderInitialMetadata } from './prerender';
|
|
7
7
|
import download, { downloadFile, DownloadedFiles, isSymbolicLink, isDirectory, isExternalSymlink, isExternalSymlinkTarget, getSymlinkTarget } from './fs/download';
|
|
8
8
|
import getWriteableDirectory from './fs/get-writable-directory';
|
|
9
9
|
import glob, { GlobOptions } from './fs/glob';
|
|
@@ -20,7 +20,7 @@ import { getServiceUrlEnvVars, getExperimentalServiceUrlEnvVars } from './get-se
|
|
|
20
20
|
import { cloneEnv } from './clone-env';
|
|
21
21
|
import { hardLinkDir } from './hard-link-dir';
|
|
22
22
|
import { validateNpmrc } from './validate-npmrc';
|
|
23
|
-
export type { NodejsLambdaOptions,
|
|
23
|
+
export type { NodejsLambdaOptions, PrerenderInitialMetadata };
|
|
24
24
|
export { FileBlob, FileFsRef, FileRef, Lambda, NodejsLambda, createLambda, Prerender, download, downloadFile, DownloadedFiles, getWriteableDirectory, glob, GlobOptions, rename, spawnAsync, getScriptName, installDependencies, runPackageJsonScript, execCommand, spawnCommand, walkParentDirs, getNodeBinPath, getNodeBinPaths, getSupportedNodeVersion, isBunVersion, getSupportedBunVersion, getOrCreateBunBinary, detectPackageManager, runNpmInstall, NpmInstallOutput, runBundleInstall, runPipInstall, PipInstallResult, runShellScript, runCustomInstallCommand, resetCustomInstallCommandSet, getEnvForPackageManager, getNodeVersion, getPathForPackageManager, getLatestNodeVersion, getDiscontinuedNodeVersions, getSpawnOptions, getPlatformEnv, getPrefixedEnvVars, getServiceUrlEnvVars, getExperimentalServiceUrlEnvVars, streamToBuffer, streamToBufferChunks, debug, isSymbolicLink, isDirectory, isExternalSymlink, isExternalSymlinkTarget, getSymlinkTarget, getLambdaOptionsFromFunction, sanitizeConsumerName, scanParentDirs, findPackageJson, getIgnoreFilter, cloneEnv, hardLinkDir, traverseUpDirectories, validateNpmrc, type CliType, };
|
|
25
25
|
export { EdgeFunction } from './edge-function';
|
|
26
26
|
export { ContainerImage } from './container-image';
|