libyear
Version:
A simple measure of software dependency freshness
47 lines (46 loc) • 1.7 kB
JavaScript
import { merge } from "lodash-es";
import { default as semver } from "semver";
import { execute } from "./execute.js";
const { valid } = semver;
const getParsedDependencies = async (packageManager, cmd) => {
const stdout = await execute(cmd);
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):/)[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 ${flags?.all ? "recursive" : ""} list --depth=0 --json`,
}[packageManager] ?? "npm ls --depth=0 --json --silent";
const json = await getParsedDependencies(packageManager, cmd);
return new Map(Object.entries({
...json.dependencies,
...json.devDependencies,
})
.map(([dependency, data]) => [
dependency,
data.version ??
(data.required?.version ||
data.required).replace(/[<=>^~]+/u, ""),
])
.filter(([_, version]) => valid(version)));
};