cosmos-explorer/strict-null-checks/collapse-completed-director...

84 lines
2.6 KiB
JavaScript

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
// @ts-check
const fs = require("fs");
const path = require("path");
const config = require("./config");
const { writeTsconfigSync } = require("./write-tsconfig");
const repoRoot = config.repoRoot;
function collapseCompletedDirectories(tsconfigPath) {
const tsconfigContent = JSON.parse(fs.readFileSync(tsconfigPath).toString());
const listedFiles = Array.from(new Set(tsconfigContent.files.sort()));
const listedIncludes = Array.from(new Set(tsconfigContent.include.sort()));
const listedDirectories = listedIncludes.map(includeToDirectory);
const completedSet = new Set([...listedFiles, ...listedDirectories]);
reduceCompletedSet(completedSet, "./src");
const completedPaths = Array.from(completedSet).sort();
tsconfigContent.files = completedPaths.filter(isTsFile);
tsconfigContent.include = completedPaths.filter(isSourceDirectory).map(directoryToInclude);
writeTsconfigSync(tsconfigPath, tsconfigContent);
}
// convert from src/common/styles/**/* to ./src/common/styles
function includeToDirectory(include) {
return "./" + include.replace("/**/*", "");
}
// convert from ./src/common/styles to src/common/styles/**/*
function directoryToInclude(directory) {
return directory.substring(2) + "/**/*";
}
function reduceCompletedSet(completedSet, root) {
if (completedSet.has(root)) {
return true;
}
if (!isSourceDirectory(root)) {
return false;
}
const children = listRelevantChildren(root);
let allChildrenReduced = true;
for (const child of children) {
const childReduced = reduceCompletedSet(completedSet, child);
allChildrenReduced = allChildrenReduced && childReduced;
}
if (allChildrenReduced) {
for (const child of children) {
completedSet.delete(child);
}
completedSet.add(root);
}
return allChildrenReduced;
}
function isSourceDirectory(relativePath) {
// this assumes directories don't have .s in their names, which isn't robust generally
// but happens to be true in our repo
const isDirectory = -1 === relativePath.indexOf(".", 1);
return isDirectory && !relativePath.includes("__snapshots__");
}
const isTsFileRegex = /\.(ts|tsx)$/;
function isTsFile(relativePath) {
return isTsFileRegex.test(relativePath);
}
function listRelevantChildren(relativePath) {
const rawReaddir = fs.readdirSync(path.join(repoRoot, relativePath));
const directories = rawReaddir.filter(isSourceDirectory);
const tsFiles = rawReaddir.filter(isTsFile);
return [...directories, ...tsFiles].map((name) => relativePath + "/" + name);
}
module.exports = {
collapseCompletedDirectories,
};