123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- "use strict";
- const fs = require("fs"),
- path = require("path");
- function getDirectoryEntries(directory) {
- try {
- return fs.readdirSync(directory);
- } catch (ex) {
- return [];
- }
- }
- function normalizeDirectoryEntries(entries, directory, supportedConfigs) {
- const fileHash = {};
- entries.forEach(entry => {
- if (supportedConfigs.indexOf(entry) >= 0) {
- const resolvedEntry = path.resolve(directory, entry);
- if (fs.statSync(resolvedEntry).isFile()) {
- fileHash[entry] = resolvedEntry;
- }
- }
- });
- return fileHash;
- }
- class FileFinder {
-
- constructor(files, cwd) {
- this.fileNames = Array.isArray(files) ? files : [files];
- this.cwd = cwd || process.cwd();
- this.cache = {};
- }
-
- *findAllInDirectoryAndParents(relativeDirectory) {
- const cache = this.cache;
- const initialDirectory = relativeDirectory
- ? path.resolve(this.cwd, relativeDirectory)
- : this.cwd;
- if (Object.prototype.hasOwnProperty.call(cache, initialDirectory)) {
- yield* cache[initialDirectory];
- return;
- }
- const dirs = [];
- const fileNames = this.fileNames;
- let searched = 0;
- let directory = initialDirectory;
- do {
- dirs[searched++] = directory;
- cache[directory] = [];
- const filesMap = normalizeDirectoryEntries(getDirectoryEntries(directory), directory, fileNames);
- if (Object.keys(filesMap).length) {
- for (let k = 0; k < fileNames.length; k++) {
- if (filesMap[fileNames[k]]) {
- const filePath = filesMap[fileNames[k]];
-
- for (let j = 0; j < searched; j++) {
- cache[dirs[j]].push(filePath);
- }
- yield filePath;
- break;
- }
- }
- }
- const child = directory;
-
- directory = path.dirname(directory);
- if (directory === child) {
- return;
- }
- } while (!Object.prototype.hasOwnProperty.call(cache, directory));
-
- for (let i = 0; i < searched; i++) {
- cache[dirs[i]].push(...cache[directory]);
- }
- yield* cache[dirs[0]];
- }
- }
- module.exports = FileFinder;
|