New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@vercel/build-utils

Package Overview
Dependencies
Maintainers
9
Versions
337
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@vercel/build-utils - npm Package Compare versions

Comparing version 10.1.0 to 10.2.0

14

CHANGELOG.md
# @vercel/build-utils
## 10.2.0
### Minor Changes
- Detect v9 pnpm lock files as pnpm 10 for new projects ([#13072](https://github.com/vercel/vercel/pull/13072))
### Patch Changes
- Improve build log messages surrounding pnpm 10 ([#13088](https://github.com/vercel/vercel/pull/13088))
- [build-utils] extract checkIfAlreadyInstalled helper to clarify intent ([#13060](https://github.com/vercel/vercel/pull/13060))
- Allow pnpm 10 to use package.json#packageManager without an engines error ([#13083](https://github.com/vercel/vercel/pull/13083))
## 10.1.0

@@ -4,0 +18,0 @@

16

dist/fs/run-user-scripts.d.ts

@@ -95,3 +95,3 @@ /// <reference types="node" />

export declare function walkParentDirs({ base, start, filename, }: WalkParentDirsProps): Promise<string | null>;
export declare function runNpmInstall(destPath: string, args?: string[], spawnOpts?: SpawnOptions, meta?: Meta, nodeVersion?: NodeVersion): Promise<boolean>;
export declare function runNpmInstall(destPath: string, args?: string[], spawnOpts?: SpawnOptions, meta?: Meta, nodeVersion?: NodeVersion, projectCreatedAt?: number): Promise<boolean>;
/**

@@ -101,3 +101,3 @@ * Prepares the input environment based on the used package manager and lockfile

*/
export declare function getEnvForPackageManager({ cliType, lockfileVersion, packageJsonPackageManager, nodeVersion, env, packageJsonEngines, turboSupportsCorepackHome, }: {
export declare function getEnvForPackageManager({ cliType, lockfileVersion, packageJsonPackageManager, nodeVersion, env, packageJsonEngines, turboSupportsCorepackHome, projectCreatedAt, }: {
cliType: CliType;

@@ -112,5 +112,7 @@ lockfileVersion: number | undefined;

turboSupportsCorepackHome?: boolean | undefined;
projectCreatedAt?: number | undefined;
}): {
[x: string]: string | undefined;
};
export declare const PNPM_10_PREFERRED_AT: Date;
/**

@@ -120,3 +122,3 @@ * Helper to get the binary paths that link to the used package manager.

*/
export declare function getPathOverrideForPackageManager({ cliType, lockfileVersion, corepackPackageManager, corepackEnabled, packageJsonEngines, }: {
export declare function getPathOverrideForPackageManager({ cliType, lockfileVersion, corepackPackageManager, corepackEnabled, packageJsonEngines, projectCreatedAt, }: {
cliType: CliType;

@@ -128,2 +130,3 @@ lockfileVersion: number | undefined;

packageJsonEngines?: PackageJson.Engines;
projectCreatedAt?: number;
}): {

@@ -144,3 +147,3 @@ /**

};
export declare function detectPackageManager(cliType: CliType, lockfileVersion: number | undefined): {
export declare function detectPackageManager(cliType: CliType, lockfileVersion: number | undefined, projectCreatedAt?: number): {
path: string;

@@ -198,3 +201,3 @@ detectedLockfile: string;

};
export declare function runCustomInstallCommand({ destPath, installCommand, nodeVersion, spawnOpts, }: {
export declare function runCustomInstallCommand({ destPath, installCommand, nodeVersion, spawnOpts, projectCreatedAt, }: {
destPath: string;

@@ -204,4 +207,5 @@ installCommand: string;

spawnOpts?: SpawnOptions;
projectCreatedAt?: number;
}): Promise<void>;
export declare function runPackageJsonScript(destPath: string, scriptNames: string | Iterable<string>, spawnOpts?: SpawnOptions): Promise<boolean>;
export declare function runPackageJsonScript(destPath: string, scriptNames: string | Iterable<string>, spawnOpts?: SpawnOptions, projectCreatedAt?: number): Promise<boolean>;
export declare function runBundleInstall(destPath: string, args?: string[], spawnOpts?: SpawnOptions, meta?: Meta): Promise<void>;

@@ -208,0 +212,0 @@ export declare function runPipInstall(destPath: string, args?: string[], spawnOpts?: SpawnOptions, meta?: Meta): Promise<void>;

@@ -31,2 +31,3 @@ "use strict";

__export(run_user_scripts_exports, {
PNPM_10_PREFERRED_AT: () => PNPM_10_PREFERRED_AT,
detectPackageManager: () => detectPackageManager,

@@ -465,4 +466,16 @@ execCommand: () => execCommand,

}
function initializeSet(set) {
if (!isSet(set)) {
return /* @__PURE__ */ new Set();
}
return set;
}
function checkIfAlreadyInstalled(runNpmInstallSet, packageJsonPath) {
const initializedRunNpmInstallSet = initializeSet(runNpmInstallSet);
const alreadyInstalled = initializedRunNpmInstallSet.has(packageJsonPath);
initializedRunNpmInstallSet.add(packageJsonPath);
return { alreadyInstalled, runNpmInstallSet: initializedRunNpmInstallSet };
}
const runNpmInstallSema = new import_async_sema.default(1);
async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion) {
async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion, projectCreatedAt) {
if (meta?.isDev) {

@@ -489,13 +502,12 @@ (0, import_debug.default)("Skipping dependency installation because dev mode is enabled");

}
if (meta && packageJsonPath && args.length === 0) {
if (!isSet(meta.runNpmInstallSet)) {
meta.runNpmInstallSet = /* @__PURE__ */ new Set();
const defaultInstall = args.length === 0;
if (meta && packageJsonPath && defaultInstall) {
const { alreadyInstalled, runNpmInstallSet } = checkIfAlreadyInstalled(
meta.runNpmInstallSet,
packageJsonPath
);
if (alreadyInstalled) {
return false;
}
if (isSet(meta.runNpmInstallSet)) {
if (meta.runNpmInstallSet.has(packageJsonPath)) {
return false;
} else {
meta.runNpmInstallSet.add(packageJsonPath);
}
}
meta.runNpmInstallSet = runNpmInstallSet;
}

@@ -515,3 +527,4 @@ const installTime = Date.now();

packageJsonEngines: packageJson?.engines,
turboSupportsCorepackHome
turboSupportsCorepackHome,
projectCreatedAt
});

@@ -536,3 +549,4 @@ await runInstallCommand({

packageJsonEngines,
turboSupportsCorepackHome
turboSupportsCorepackHome,
projectCreatedAt
}) {

@@ -554,3 +568,4 @@ const corepackEnabled = usingCorepack(

corepackEnabled,
packageJsonEngines
packageJsonEngines,
projectCreatedAt
});

@@ -577,6 +592,22 @@ if (corepackEnabled) {

if (detectedLockfile && detectedPackageManager) {
const versionString = cliType === "pnpm" ? `version ${lockfileVersion} ` : "";
console.log(
`Detected \`${detectedLockfile}\` ${versionString}generated by ${detectedPackageManager}`
);
const detectedV9PnpmLockfile = detectedLockfile === "pnpm-lock.yaml" && lockfileVersion === 9;
const pnpm10UsingPackageJsonPackageManager = detectedPackageManager === "pnpm@10.x" && packageJsonPackageManager;
if (pnpm10UsingPackageJsonPackageManager) {
const versionString = cliType === "pnpm" ? `version ${lockfileVersion} ` : "";
console.log(
`Detected \`${detectedLockfile}\` ${versionString}generated by ${detectedPackageManager} with package.json#packageManager ${packageJsonPackageManager}`
);
} else if (detectedV9PnpmLockfile) {
const otherVersion = detectedPackageManager === "pnpm@10.x" ? `pnpm@9.x` : `pnpm@10.x`;
console.log(
`Detected \`${detectedLockfile}\` ${lockfileVersion} which may be generated by pnpm@9.x or pnpm@10.x
Using ${detectedPackageManager} based on project creation date
To use ${otherVersion}, manually opt in using corepack (https://vercel.com/docs/deployments/configure-a-build#corepack)`
);
} else {
const versionString = cliType === "pnpm" ? `version ${lockfileVersion} ` : "";
console.log(
`Detected \`${detectedLockfile}\` ${versionString}generated by ${detectedPackageManager}`
);
}
if (cliType === "bun") {

@@ -594,3 +625,4 @@ console.warn(

}
function detectPnpmVersion(lockfileVersion) {
const PNPM_10_PREFERRED_AT = /* @__PURE__ */ new Date("2025-02-24T20:00:00Z");
function detectPnpmVersion(lockfileVersion, projectCreatedAt) {
switch (true) {

@@ -605,4 +637,8 @@ case lockfileVersion === void 0:

return "pnpm 8";
case (lockfileVersion === 7 || lockfileVersion === 9):
case lockfileVersion === 7:
return "pnpm 9";
case lockfileVersion === 9: {
const projectPrefersPnpm10 = projectCreatedAt && projectCreatedAt >= PNPM_10_PREFERRED_AT.getTime();
return projectPrefersPnpm10 ? "pnpm 10" : "pnpm 9";
}
default:

@@ -621,2 +657,4 @@ return "not found";

switch (packageManagerMajorVersion) {
case 10:
return lockfileVersion === 9;
case 9:

@@ -643,7 +681,23 @@ if ("9.0.0" === packageManagerVersion.version && lockfileVersion === 6) {

corepackEnabled = true,
packageJsonEngines
packageJsonEngines,
projectCreatedAt
}) {
const detectedPackageManger = detectPackageManager(cliType, lockfileVersion);
if (!corepackPackageManager || !corepackEnabled) {
if (cliType === "pnpm" && packageJsonEngines?.pnpm) {
const detectedPackageManger = detectPackageManager(
cliType,
lockfileVersion,
projectCreatedAt
);
const usingCorepack2 = corepackPackageManager && corepackEnabled;
if (usingCorepack2) {
validateCorepackPackageManager(
cliType,
lockfileVersion,
corepackPackageManager,
packageJsonEngines?.pnpm
);
return NO_OVERRIDE;
}
if (cliType === "pnpm" && packageJsonEngines?.pnpm) {
const usingDetected = detectedPackageManger?.pnpmVersionRange !== "10.x" || !corepackPackageManager;
if (usingDetected) {
checkEnginesPnpmAgainstDetected(

@@ -654,11 +708,4 @@ packageJsonEngines.pnpm,

}
return detectedPackageManger ?? NO_OVERRIDE;
}
validateCorepackPackageManager(
cliType,
lockfileVersion,
corepackPackageManager,
packageJsonEngines?.pnpm
);
return NO_OVERRIDE;
return detectedPackageManger ?? NO_OVERRIDE;
}

@@ -738,3 +785,3 @@ function checkEnginesPnpmAgainstDetected(enginesPnpm, detectedPackageManger) {

}
function detectPackageManager(cliType, lockfileVersion) {
function detectPackageManager(cliType, lockfileVersion, projectCreatedAt) {
switch (cliType) {

@@ -744,3 +791,3 @@ case "npm":

case "pnpm":
switch (detectPnpmVersion(lockfileVersion)) {
switch (detectPnpmVersion(lockfileVersion, projectCreatedAt)) {
case "pnpm 7":

@@ -767,2 +814,9 @@ return {

};
case "pnpm 10":
return {
path: "/pnpm10/node_modules/.bin",
detectedLockfile: "pnpm-lock.yaml",
detectedPackageManager: "pnpm@10.x",
pnpmVersionRange: "10.x"
};
case "pnpm 6":

@@ -831,3 +885,4 @@ return {

nodeVersion,
spawnOpts
spawnOpts,
projectCreatedAt
}) {

@@ -849,3 +904,4 @@ console.log(`Running "install" command: \`${installCommand}\`...`);

packageJsonEngines: packageJson?.engines,
turboSupportsCorepackHome
turboSupportsCorepackHome,
projectCreatedAt
});

@@ -859,3 +915,3 @@ (0, import_debug.default)(`Running with $PATH:`, env?.PATH || "");

}
async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
async function runPackageJsonScript(destPath, scriptNames, spawnOpts, projectCreatedAt) {
(0, import_assert.default)(import_path.default.isAbsolute(destPath));

@@ -887,3 +943,4 @@ const {

packageJsonEngines: packageJson?.engines,
turboSupportsCorepackHome
turboSupportsCorepackHome,
projectCreatedAt
})

@@ -943,2 +1000,3 @@ };

0 && (module.exports = {
PNPM_10_PREFERRED_AT,
detectPackageManager,

@@ -945,0 +1003,0 @@ execCommand,

{
"name": "@vercel/build-utils",
"version": "10.1.0",
"version": "10.2.0",
"license": "Apache-2.0",

@@ -5,0 +5,0 @@ "main": "./dist/index.js",

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc