jsc
Version:
Javascript complexity tool
132 lines (110 loc) • 3.42 kB
JavaScript
var path = require('path');
var fs = require('fs');
var check = require('check-types');
var discoverSourceFiles = require('./sourceFiles');
function prepareExcludedFilenames(config) {
config = config || {};
if (!Array.isArray(config.skip)) {
config.skip = [config.skip];
}
console.assert(Array.isArray(config.skip), 'expected skip to be an array');
log.debug("preparing excluded paths", config.skip);
config.skip.forEach(function(name, index) {
var fullname = path.resolve(config.path, name);
fullname = fullname.toLowerCase();
config.skip[index] = fullname;
});
log.debug("excluded files", config.skip);
}
function isJsExcluded(filename, config) {
check.verifyString(filename, 'filename should be a string, not ' + filename);
console.assert(config, 'missing config');
check.verifyArray(config.skip, "config.skip should be an array");
if (!config.skip.length) {
return false;
}
// assuming both files are lowercase
var found = config.skip.some(function (name) {
return filename === name;
});
return found;
}
var js = /\.js$/i;
var allJsFiles = {};
function checkFile(filename, config) {
filename = filename.toLowerCase();
if (filename.match(js)) {
if (!isJsExcluded(filename, config)) {
var fullPath = path.resolve(filename);
allJsFiles[fullPath] = fullPath;
// console.log('full path', fullPath);
} else {
log.debug('skipping file', filename);
}
} else {
try {
var stats = fs.lstatSync(filename);
if (stats.isDirectory()) {
if (!isJsExcluded(filename) && config.recursive) {
collectJsFiles([filename], config);
} else {
log.debug('skipping folder', filename);
}
}
}
catch (e) {}
}
}
function checkFolder(folder, config) {
check.verifyString(folder, folder + ' should be a string folder name');
console.assert(config, 'missing config');
var stats = fs.lstatSync(folder);
if (!stats.isDirectory()) {
// console.log(folder, 'is a filename');
checkFile(folder, config);
return;
}
var files = fs.readdirSync(folder);
files.forEach(function (filename) {
filename = path.resolve(folder, filename);
checkFile(filename, config);
});
}
function collectJsFiles(config) {
console.assert(config, 'missing config');
check.verifyArray(config.path, 'expected list of files');
log.debug('checking folders', config.path);
config.path.forEach(function (folder) {
var fullFolder = path.resolve(folder);
checkFolder(fullFolder, config);
});
}
function discoverSourceFiles(files) {
console.assert(Array.isArray(files), 'expect list of filenames, not', JSON.stringify(files));
var glob = require("glob");
var filenames = [];
files.forEach(function (shortName) {
var files = glob.sync(shortName);
filenames = filenames.concat(files);
});
filenames = filenames.map(function (shortName) {
return path.resolve(shortName);
});
return filenames;
}
module.exports = {
collect: function(config) {
console.assert(config, 'missing config');
config.skip = config.skip || [];
var files = discoverSourceFiles(config.path);
console.assert(Array.isArray(files), 'could not discover input files from path', config.path);
config.path = files;
var skipFiles = discoverSourceFiles(config.skip);
console.assert(Array.isArray(skipFiles), 'could not find skip files');
config.skip = skipFiles;
prepareExcludedFilenames(config);
allJsFiles = {};
collectJsFiles(config);
return allJsFiles;
}
};