@vercel/build-utils
Advanced tools
Comparing version 10.1.0 to 10.2.0
# @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 @@ |
@@ -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
1319944
30094