Files
tasks/tests/node_modules/nightwatch/lib/runner/walk.js

174 lines
4.5 KiB
JavaScript

var path = require('path');
var fs = require('fs');
var minimatch = require('minimatch');
var fileMatcher = require('./filematcher.js');
var Matchers = {};
function isFolderExcluded(resource, opts) {
if (!opts.exclude) {
return false;
}
if (Matchers.exclude) {
return Matchers.exclude.some(function(item) {
if (item.indexOf(resource) === -1) {
return false;
}
try {
return fs.statSync(item).isDirectory();
} catch (err) {
return false;
}
});
}
return false;
}
function addMatcher(type, filePath, opts) {
Matchers[type] = Matchers[type] || [];
var matchers = fileMatcher[type].adaptFilePath(filePath, opts[type]);
if (Array.isArray(matchers)) {
Matchers[type].push.apply(Matchers[type], matchers);
} else {
Matchers[type].push(matchers);
}
}
function walk(dir, done, opts) {
var results = [];
fs.readdir(dir, function(err, list) {
if (err) {
return done(err);
}
var pending = list.length;
if (pending === 0) {
return done(null, results);
}
list.forEach(function(resource) {
resource = path.join(dir, resource);
fs.stat(resource, function(err, stat) {
if (stat && stat.isDirectory()) {
var dirName = resource.split(path.sep).slice(-1)[0];
var isExcluded = isFolderExcluded(resource, opts); // prevent loading of files from an excluded folder
var isSkipped = opts.skipgroup && opts.skipgroup.indexOf(dirName) > -1;
if (isExcluded || isSkipped) {
pending = pending-1;
} else {
walk(resource, function(err, res) {
results = results.concat(res);
pending = pending-1;
if (!pending) {
done(null, results);
}
}, opts);
}
} else {
results.push(resource);
pending = pending-1;
if (!pending) {
done(null, results);
}
}
});
});
});
}
module.exports = {
readPaths : function (paths, cb, opts) {
Matchers.exclude = [];
Matchers.filter = [];
var allmodules = [];
var extensionPattern = /\.js$/;
var modulePaths = paths.slice(0);
(function readSourcePaths() {
var sourcePath = modulePaths.shift();
fs.stat(sourcePath, function(err, stat) {
if (err) {
return cb(err);
}
if (stat.isFile() && extensionPattern.test(sourcePath)) {
sourcePath = sourcePath.replace(extensionPattern, '');
if (allmodules.indexOf(sourcePath) === -1) {
allmodules.push(sourcePath);
}
if (modulePaths.length) {
readSourcePaths();
} else {
cb(null, allmodules);
}
} else if (stat.isDirectory()) {
if (opts.exclude) {
addMatcher('exclude', sourcePath, opts);
}
if (opts.filter) {
addMatcher('filter', sourcePath, opts);
}
walk(sourcePath, function (err, list) {
if (err) {
return cb(err);
}
list.sort();
var modules = list.filter(function (filePath) {
if (!extensionPattern.test(filePath)) {
return false;
}
if (opts.exclude && fileMatcher.exclude.match(filePath, Matchers.exclude)) {
return false;
}
if (opts.filter && !fileMatcher.filter.match(filePath, Matchers.filter)) {
return false;
}
var filename = filePath.split(path.sep).slice(-1)[0];
if (opts.filename_filter) {
return minimatch(filename, opts.filename_filter);
}
if (opts.tag_filter || opts.skiptags) {
return fileMatcher.tags.match(filePath, opts);
}
return true;
});
modules.forEach(function(item) {
var filename = item.replace(extensionPattern, '');
if (allmodules.indexOf(filename) === -1) {
allmodules.push(filename);
}
});
if (modulePaths.length) {
readSourcePaths();
} else {
cb(null, allmodules);
}
}, opts);
} else {
if (modulePaths.length) {
readSourcePaths();
} else {
cb(null, allmodules);
}
}
});
})();
}
};