@manypkg/cli
Version:
Manypkg is a linter for `package.json` files in Yarn, npm, Lerna, pnpm or Rush monorepos.
61 lines (56 loc) • 2.04 kB
text/typescript
import {
makeCheck,
NORMAL_DEPENDENCY_TYPES,
versionRangeToRangeType,
} from "./utils.ts";
import semver from "semver";
import type { Package } from "@manypkg/get-packages";
export type ErrorType = {
type: "INTERNAL_MISMATCH";
workspace: Package;
dependencyWorkspace: Package;
dependencyRange: string;
};
export default makeCheck<ErrorType>({
validate: (workspace, allWorkspaces) => {
let errors: ErrorType[] = [];
for (let depType of NORMAL_DEPENDENCY_TYPES) {
let deps = workspace.packageJson[depType];
if (deps) {
for (let depName in deps) {
let range = deps[depName];
let dependencyWorkspace = allWorkspaces.get(depName);
if (
dependencyWorkspace !== undefined &&
!range.startsWith("npm:") &&
!range.startsWith("workspace:") &&
!semver.satisfies(dependencyWorkspace.packageJson.version, range)
) {
errors.push({
type: "INTERNAL_MISMATCH",
workspace,
dependencyWorkspace,
dependencyRange: range,
});
}
}
}
}
return errors;
},
fix: (error) => {
for (let depType of NORMAL_DEPENDENCY_TYPES) {
let deps = error.workspace.packageJson[depType];
if (deps && deps[error.dependencyWorkspace.packageJson.name]) {
deps[error.dependencyWorkspace.packageJson.name] =
versionRangeToRangeType(
deps[error.dependencyWorkspace.packageJson.name]
) + error.dependencyWorkspace.packageJson.version;
}
}
return { requiresInstall: true };
},
print: (error) =>
`${error.workspace.packageJson.name} has a dependency on ${error.dependencyWorkspace.packageJson.name}@${error.dependencyRange} but the version of ${error.dependencyWorkspace.packageJson.name} in the repo is ${error.dependencyWorkspace.packageJson.version} which is not within range of the depended on version, please update the dependency version`,
type: "all",
});