mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-06 04:22:01 +00:00
[build-utils] Handle case of not having lockfile (#11697)
In the scenario where we don't have a lockfile, cliType was detected by build utils as npm regardless of what's set in corepack. This fixes that.
This commit is contained in:
6
.changeset/tender-bags-tell.md
Normal file
6
.changeset/tender-bags-tell.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
"@vercel/build-utils": patch
|
||||||
|
"vercel": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
[built-utils] Handle case of not having lockfile when corepack is enabled
|
||||||
@@ -353,7 +353,9 @@ export async function scanParentDirs(
|
|||||||
// TODO: read "bun-lockfile-format-v0"
|
// TODO: read "bun-lockfile-format-v0"
|
||||||
lockfileVersion = 0;
|
lockfileVersion = 0;
|
||||||
} else {
|
} else {
|
||||||
cliType = 'npm';
|
cliType = packageJson
|
||||||
|
? detectPackageManagerNameWithoutLockfile(packageJson)
|
||||||
|
: 'npm';
|
||||||
}
|
}
|
||||||
|
|
||||||
const packageJsonPath = pkgJsonPath || undefined;
|
const packageJsonPath = pkgJsonPath || undefined;
|
||||||
@@ -366,6 +368,37 @@ export async function scanParentDirs(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function detectPackageManagerNameWithoutLockfile(packageJson: PackageJson) {
|
||||||
|
const packageJsonPackageManager = packageJson.packageManager;
|
||||||
|
if (usingCorepack(process.env, packageJsonPackageManager)) {
|
||||||
|
const corepackPackageManager = validateVersionSpecifier(
|
||||||
|
packageJsonPackageManager as string
|
||||||
|
);
|
||||||
|
switch (corepackPackageManager?.packageName) {
|
||||||
|
case 'npm':
|
||||||
|
case 'pnpm':
|
||||||
|
case 'yarn':
|
||||||
|
case 'bun':
|
||||||
|
return corepackPackageManager.packageName;
|
||||||
|
case undefined:
|
||||||
|
return 'npm';
|
||||||
|
default:
|
||||||
|
throw new Error(
|
||||||
|
`Unknown package manager "${corepackPackageManager?.packageName}". Change your package.json "packageManager" field to a known package manager.`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 'npm';
|
||||||
|
}
|
||||||
|
|
||||||
|
function usingCorepack(
|
||||||
|
env: { [x: string]: string | undefined },
|
||||||
|
packageJsonPackageManager: string | undefined
|
||||||
|
) {
|
||||||
|
const corepackFlagged = env.ENABLE_EXPERIMENTAL_COREPACK === '1';
|
||||||
|
return corepackFlagged && Boolean(packageJsonPackageManager);
|
||||||
|
}
|
||||||
|
|
||||||
export async function walkParentDirs({
|
export async function walkParentDirs({
|
||||||
base,
|
base,
|
||||||
start,
|
start,
|
||||||
@@ -557,8 +590,7 @@ export function getEnvForPackageManager({
|
|||||||
nodeVersion: NodeVersion | undefined;
|
nodeVersion: NodeVersion | undefined;
|
||||||
env: { [x: string]: string | undefined };
|
env: { [x: string]: string | undefined };
|
||||||
}) {
|
}) {
|
||||||
const corepackFlagged = env.ENABLE_EXPERIMENTAL_COREPACK === '1';
|
const corepackEnabled = usingCorepack(env, packageJsonPackageManager);
|
||||||
const corepackEnabled = corepackFlagged && Boolean(packageJsonPackageManager);
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
detectedLockfile,
|
detectedLockfile,
|
||||||
@@ -753,6 +785,39 @@ export function getPathOverrideForPackageManager({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function validateVersionSpecifier(version: string) {
|
||||||
|
if (!version) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
const [before, after, ...extra] = version.split('@');
|
||||||
|
|
||||||
|
if (extra.length) {
|
||||||
|
// should not have more than one `@`
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!before) {
|
||||||
|
// should have a package before the `@`
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!after) {
|
||||||
|
// should have a version after the `@`
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!validRange(after)) {
|
||||||
|
// the version after the `@` should be a valid semver value
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
packageName: before,
|
||||||
|
packageVersionRange: after,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper to get the binary paths that link to the used package manager.
|
* Helper to get the binary paths that link to the used package manager.
|
||||||
* Note: Make sure it doesn't contain any `console.log` calls.
|
* Note: Make sure it doesn't contain any `console.log` calls.
|
||||||
|
|||||||
2
packages/cli/test/integration-1.test.ts
vendored
2
packages/cli/test/integration-1.test.ts
vendored
@@ -263,6 +263,7 @@ test('[vc build] should build project with corepack and select pnpm@7.1.0', asyn
|
|||||||
path.join(directory, '.vercel/cache/corepack')
|
path.join(directory, '.vercel/cache/corepack')
|
||||||
);
|
);
|
||||||
expect(contents).toEqual(['home', 'shim']);
|
expect(contents).toEqual(['home', 'shim']);
|
||||||
|
expect(output.stdout).toMatch(/Running "pnpm run build"/gm);
|
||||||
} finally {
|
} finally {
|
||||||
delete process.env.ENABLE_EXPERIMENTAL_COREPACK;
|
delete process.env.ENABLE_EXPERIMENTAL_COREPACK;
|
||||||
}
|
}
|
||||||
@@ -291,6 +292,7 @@ test('[vc build] should build project with corepack and select yarn@2.4.3', asyn
|
|||||||
path.join(directory, '.vercel/cache/corepack')
|
path.join(directory, '.vercel/cache/corepack')
|
||||||
);
|
);
|
||||||
expect(contents).toEqual(['home', 'shim']);
|
expect(contents).toEqual(['home', 'shim']);
|
||||||
|
expect(output.stdout).toMatch(/Running "yarn run build"/gm);
|
||||||
} finally {
|
} finally {
|
||||||
delete process.env.ENABLE_EXPERIMENTAL_COREPACK;
|
delete process.env.ENABLE_EXPERIMENTAL_COREPACK;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user