in src/file-finder.ts [29:105]
export function findFilesAndDirectories(
directoryOrFileToScan: File.AbsoluteFilePath,
fileExtension: string,
): Promise.Future<Either.Either<Error.Error, FilesAndDirectories>> {
const promise =
Promise.pending<Either.Either<Error.Error, FilesAndDirectories>>();
const fileExtensionPath: string = '.' + fileExtension;
const absolutePath: string = File.getAbsolutePathString(
directoryOrFileToScan,
);
if (pathIsToFileWithExtensionType(fileExtensionPath, absolutePath)) {
fs.stat(absolutePath, function (err, stats) {
if (err) {
const message = absolutePath + ' does not exist';
promise.setValue(
Either.Left<Error.Error, FilesAndDirectories>(Error.Error(message)),
);
} else {
const result: FilesAndDirectories = {
foundPotentialDirectories: [],
foundFilePaths: [directoryOrFileToScan],
};
promise.setValue(
Either.Right<Error.Error, FilesAndDirectories>(result),
);
}
});
} else {
fs.readdir(
File.getAbsolutePathString(directoryOrFileToScan),
function (err, files) {
if (err) {
promise.setValue(
Either.Left<Error.Error, FilesAndDirectories>(
Error.Error(err.message),
),
);
} else {
const stats = files.reduce(
function (
soFar: FilesAndDirectories,
str: string,
): FilesAndDirectories {
const fullPath: File.AbsoluteFilePath =
PathUtils.getAbsolutePathFromDirectoryAndRelativePath(
directoryOrFileToScan,
str,
);
const indexOfPeriod = str.indexOf('.');
if (indexOfPeriod === -1) {
soFar.foundPotentialDirectories.push(fullPath);
return soFar;
} else if (indexOfPeriod === 0) {
return soFar;
} else {
if (
str.indexOf(
fileExtensionPath,
str.length - fileExtensionPath.length,
) !== -1
) {
soFar.foundFilePaths.push(fullPath);
}
return soFar;
}
},
{foundPotentialDirectories: [], foundFilePaths: []},
);
promise.setValue(
Either.Right<Error.Error, FilesAndDirectories>(stats),
);
}
},
);
}
return promise.getFuture();
}