dependency-cruiser
Version:
Validate and visualize dependencies. With your rules. JavaScript, TypeScript, CoffeeScript. ES6, CommonJS, AMD.
57 lines (51 loc) • 1.45 kB
JavaScript
// @ts-check
/* eslint-disable security/detect-object-injection */
import { scannableExtensions } from "#extract/transpile/meta.mjs";
import getExtension from "#utl/get-extension.mjs";
import findAllFiles from "#utl/find-all-files.mjs";
/**
* @param {Record<string,number>} pAll
* @param {string} pExtension
*/
function reduceToCounts(pAll, pExtension) {
if (pAll[pExtension]) {
pAll[pExtension] += 1;
} else {
pAll[pExtension] = 1;
}
return pAll;
}
/**
* @param {Record<string,number>} pCountsObject
* @returns {(pLeft: string, pRight: string) => number}
*/
function compareByCount(pCountsObject) {
return function compare(pLeft, pRight) {
return pCountsObject[pRight] - pCountsObject[pLeft];
};
}
/**
* @param {string[]} pDirectories
* @param {{baseDir?: string; ignoreFileContents?: string}=} pOptions
* @returns {string[]}
*/
export default function findExtensions(pDirectories, pOptions) {
const lOptions = {
baseDir: process.cwd(),
scannableExtensions,
...pOptions,
};
const lExtensionsWithCounts = pDirectories
.flatMap((pDirectory) =>
findAllFiles(pDirectory, {
baseDir: lOptions.baseDir,
ignoreFileContents: lOptions?.ignoreFileContents,
})
.map(getExtension)
.filter(Boolean),
)
.reduce(reduceToCounts, {});
return Object.keys(lExtensionsWithCounts)
.filter((pExtension) => lOptions.scannableExtensions.includes(pExtension))
.sort(compareByCount(lExtensionsWithCounts));
}