Files

58 lines
1.4 KiB
JavaScript

#!/usr/bin/env node
import fs from "node:fs/promises";
import styleText from "node-style-text";
const PROJECT_ROOT = new URL("../", import.meta.url);
const ERROR = styleText.bgRed.black(" ERROR ");
const PASS = "✅ All dependency versions are pinned.";
for (const [index, directory] of [
"./",
"./website/",
"./scripts/release/",
"./scripts/tools/bundle-test/",
"./scripts/tools/eslint-plugin-prettier-internal-rules/",
].entries()) {
const file = new URL(`${directory}package.json`, PROJECT_ROOT);
if (index > 0) {
console.log();
}
console.log(
`Checking '${styleText.gray(file.href.slice(PROJECT_ROOT.href.length - 1))}'...`,
);
const ok = await validatePackageJson(file);
if (ok) {
console.log(PASS);
}
}
async function validatePackageJson(packageJsonFile) {
const packageJson = JSON.parse(await fs.readFile(packageJsonFile));
let ok = true;
for (const property of ["dependencies", "devDependencies", "resolutions"]) {
const value = packageJson[property];
if (!value) {
continue;
}
for (const [name, version] of Object.entries(value)) {
if (version[0] === "^" || version[0] === "~") {
console.error(
ERROR,
`Dependency "${styleText.bold.blue(name)}" in "${styleText.gray.underline(property)}" should be pinned.`,
);
ok = false;
process.exitCode = 1;
}
}
}
return ok;
}