cosmos-explorer/strict-null-checks/find.js

64 lines
2.0 KiB
JavaScript

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
// @ts-check
const path = require("path");
const process = require("process");
const { srcRoot } = require("./config");
const { getUncheckedLeafFiles, getAllEligibleFiles } = require("./eligible-file-finder");
const { getImportsForFile } = require("./import-finder");
if (process.argv.includes("--help")) {
console.log("yarn null:find [--sort=name|count] [--show-count] [--filter file_path_substring]");
process.exit(0);
}
const sortBy = process.argv.includes("--sort=name") ? "name" : "count";
const printDependedOnCount = process.argv.includes("--show-count");
const filterArgIndex = process.argv.indexOf("--filter") + 1;
const filterArg = filterArgIndex === 0 ? null : process.argv[filterArgIndex];
const filter = filterArg && ((file) => file.includes(filterArg));
async function main() {
const eligibleFiles = await getUncheckedLeafFiles();
const eligibleSet = new Set(eligibleFiles);
const dependedOnCount = new Map(eligibleFiles.map((file) => [file, 0]));
for (const file of await getAllEligibleFiles()) {
if (eligibleSet.has(file)) {
// Already added
continue;
}
for (const imp of getImportsForFile(file, srcRoot)) {
if (dependedOnCount.has(imp)) {
dependedOnCount.set(imp, dependedOnCount.get(imp) + 1);
}
}
}
let out = Array.from(dependedOnCount.entries());
if (filter) {
out = out.filter((x) => filter(x[0]));
}
if (sortBy === "count") {
out = out.sort((a, b) => b[1] - a[1]);
} else if (sortBy === "name") {
out = out.sort((a, b) => a[0].localeCompare(b[0]));
}
for (const pair of out) {
console.log(toFormattedFilePath(pair[0]) + (printDependedOnCount ? ` — Depended on by **${pair[1]}** files` : ""));
}
}
function toFormattedFilePath(file) {
const relativePath = path.relative(srcRoot, file).replace(/\\/g, "/");
return `"./src/${relativePath}",`;
}
main().catch((error) => {
console.error(error.stack);
process.exit(1);
});