libyear
Version:
A simple measure of software dependency freshness
47 lines (46 loc) • 1.8 kB
JavaScript
import { merge } from "lodash-es";
import { valid } from "semver";
import { execute } from "./execute.js";
const getParsedDependencies = async (packageManager, cmd) => execute(cmd).then((stdout) => {
switch (packageManager) {
case "pnpm":
return merge(...JSON.parse(stdout));
case "berry":
return {
dependencies: merge(...stdout
.split("\n")
.map((dependency) => JSON.parse(dependency))
.filter((dependency) => !/@workspace:/.test(dependency.value))
.map((dependency) => ({
[dependency.value
.split(/@(npm|patch|workspace):/)
.at(0)]: {
version: dependency.children.Version,
},
}))),
devDependencies: {},
};
case "npm":
case "yarn":
default:
return JSON.parse(stdout);
}
});
export const getDependencies = async (packageManager, flags) => {
const cmd = {
berry: `yarn info ${flags?.all ? "--all" : ""} --json`,
pnpm: `pnpm list ${flags?.all ? "--recursive" : ""} --json`,
}[packageManager] ??
`npm ls --depth=0 --json ${flags?.dev ? "" : "--omit=dev"} --silent ${flags?.all ? "--workspaces" : ""}`;
return getParsedDependencies(packageManager, cmd).then((json) => Object.fromEntries(Object.entries({
...json.dependencies,
...(flags?.dev ? json.devDependencies : {}),
})
.map(([dependency, data]) => [
dependency,
data.version ??
(data.required?.version ||
data.required)?.replace(/[<=>^~]+/u, ""),
])
.filter(([, version]) => valid(version))));
};