solid-code
Version:
JavaScript code quality front-end
103 lines (88 loc) • 2.91 kB
JavaScript
var path = require('path');
var fs = require('fs');
var check = require('check-types');
function discoverSourceFiles(files) {
check.verifyArray(files, 'expect list of filenames');
var glob = require("glob");
var filenames = [];
files.forEach(function (shortName) {
if (fs.existsSync(shortName)) {
var stat = fs.lstatSync(shortName);
if (stat.isDirectory()) {
log.debug(shortName, 'is a folder');
shortName = path.join(shortName, '*.js');
}
}
var foundMatches = glob.sync(shortName);
var discovered = [];
foundMatches.forEach(function (match) {
if (!fs.lstatSync(match).isDirectory(match)) {
discovered.push(match);
}
});
filenames = filenames.concat(discovered);
});
filenames = filenames.map(function (shortName) {
return path.resolve(shortName);
});
return filenames;
}
var testing = require('./testing');
var preload = require('./preload');
var complexity = require('./complexity');
var reqs = require('./reqs');
var jshint = require('./jshint-wrapper');
function solidFiles(files, callback) {
check.verifyArray(files, 'expect list of filenames');
if (callback) {
check.verifyFunction(callback, 'expected call back function');
}
preload.run(files);
testing(files, function (failed, sourceAndTestFiles) {
check.verifyArray(sourceAndTestFiles, 'expected to get back list of filenames');
console.log();
complexity.run(sourceAndTestFiles);
console.log();
/* enable once required score makes sense for AMD
reqs.run(files, {
colors: true
});
console.log();
*/
files.forEach(function (filename) {
jshint.run({
filename: filename
});
});
if (callback) {
callback(sourceAndTestFiles);
}
});
}
function watchFilesForChanges(filenames, sourceAndTestFiles)
{
console.assert(Array.isArray(filenames), 'could not discover source files');
console.assert(Array.isArray(sourceAndTestFiles), 'expected to get back list of filenames');
if (args.watch && sourceAndTestFiles.length) {
console.log('watching', sourceAndTestFiles.length, 'files...');
var watch = require('nodewatch');
sourceAndTestFiles.forEach(function (filename) {
watch.add(filename);
});
watch.onChange(function (file, prev, curr, action){
log.warn('file', file, action);
solidFiles(filenames);
});
}
}
function run(options) {
console.assert(options, 'missing options');
console.assert(Array.isArray(options.files), 'expect list of files in options.files');
var filenames = discoverSourceFiles(options.files);
console.assert(Array.isArray(filenames), 'could not discover source files');
solidFiles(filenames, function (sourceAndTestFiles) {
check.verifyArray(sourceAndTestFiles, 'expected to get back list of filenames');
watchFilesForChanges(filenames, sourceAndTestFiles);
});
}
module.exports.run = run;