node-vitals
Version:
Do more with less. A simple, high-performing, functional JavaScript library.
124 lines (110 loc) • 2.76 kB
JavaScript
/**
* -----------------------------------------------------------------------------
* VITALS UNIT TESTS HELPER: getFilepaths
* -----------------------------------------------------------------------------
* @author Adam Smith <adam@imaginate.life> (https://github.com/imaginate)
* @copyright 2017 Adam A Smith <adam@imaginate.life> (https://github.com/imaginate)
*
* Annotations:
* @see [JSDoc3](http://usejsdoc.org)
* @see [Closure Compiler JSDoc Syntax](https://developers.google.com/closure/compiler/docs/js-for-compiler)
*/
'use strict';
module.exports = getFilepaths;
var fs = require('fs');
var isFile = require('./is-file');
var getDirs = require('./get-dirpaths');
var slashDir = require('./slash-dir');
/**
* @param {string} base
* @param {boolean=} deep
* @param {!RegExp=} valid
* @param {!RegExp=} invalid
* @return {!Array<string>}
*/
function getFilepaths(base, deep, valid, invalid) {
/** @type {function(string): boolean} */
var isValid;
base = slashDir(base);
isValid = mkCheck(valid, invalid);
return deep
? getFilesDeep(base, isValid)
: getFiles(base, isValid);
}
/**
* @private
* @param {string} base
* @param {function(string): boolean} isValid
* @return {!Array<string>}
*/
function getFiles(base, isValid) {
/** @type {!Array<string>} */
var paths;
/** @type {!Array<string>} */
var files;
/** @type {string} */
var path;
/** @type {string} */
var file;
/** @type {number} */
var len;
/** @type {number} */
var i;
paths = fs.readdirSync(base);
files = [];
len = paths.length;
i = -1;
while (++i < len) {
file = paths[i];
path = base + file;
if ( isFile(path) && isValid(file) ) files.push(file);
}
return files;
}
/**
* @private
* @param {string} base
* @param {function(string): boolean} isValid
* @return {!Array<string>}
*/
function getFilesDeep(base, isValid) {
/** @type {!Array<string>} */
var paths;
/** @type {!Array<string>} */
var files;
/** @type {!Array<string>} */
var dirs;
/** @type {string} */
var dir;
/** @type {number} */
var end;
/** @type {number} */
var len;
/** @type {number} */
var ii;
/** @type {number} */
var i;
files = getFiles(base, isValid);
dirs = getDirs(base, true);
end = dirs.length;
i = -1;
while (++i < end) {
dir = slashDir(dirs[i]);
paths = getFiles(base + dir, isValid);
len = paths.length;
ii = -1;
while (++ii < len) files.push(dir + paths[ii]);
}
return files;
}
/**
* @private
* @param {!RegExp=} valid
* @param {!RegExp=} invalid
* @return {function}
*/
function mkCheck(valid, invalid) {
return function isValid(str) {
return ( !valid || valid.test(str) ) && ( !invalid || !invalid.test(str) );
};
}