84 lines
2.6 KiB
JavaScript
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,
|
|
};
|