mano
Version:
Web application framework
63 lines (58 loc) • 2.12 kB
JavaScript
;
var primitiveSet = require('es5-ext/object/primitive-set')
, includes = require('es5-ext/string/#/contains')
, last = require('es5-ext/string/#/last')
, path = require('path')
, readdir = require('fs2/readdir')
, basename = path.basename, sep = path.sep
, isValid = RegExp.prototype.test.bind(/^[a-z0-9.\-\\\/]+$/)
, exceptions = primitiveSet('CHANGES', 'LICENSE', 'README.md');
require('fs2/lib/ignore-modes').lint = require('xlint/lib/lintignore-mode');
module.exports = function (root/*, options*/) {
var options = Object(arguments[1]), log = options.log || Function.prototype
, preBroken = false, total = 0, broken = 0, result = [];
log("Search started ");
var promise = readdir(root, { ignoreRules: ['git', 'lint'], depth: Infinity, type: { file: true },
stream: true });
promise.on('change', function (event) {
event.added.forEach(function (filename) {
var valid = (exceptions[basename(filename)] || isValid(filename)), tokens, base
, original = filename;
++total;
if (!valid) {
tokens = filename.split(sep);
base = tokens.pop();
tokens = tokens.map(function (token) {
if (token === 'node_modules') return;
if (last.call(token) === '#') return token.slice(0, -1);
while (token[0] === '@') token = token.slice(1);
return token;
}).filter(Boolean);
tokens.push(base);
tokens = tokens.map(function (token) {
while (token[0] === '_') token = token.slice(1);
while (last.call(token) === '_') token = token.slice(0, -1);
return token;
}).filter(Boolean);
filename = tokens.join(sep);
if (isValid(filename)) valid = true;
}
if (!valid) {
if (includes.call(original, sep + 'test' + sep + '__playground' + sep)) valid = true;
}
if (valid) {
preBroken = false;
log('.');
return;
}
++broken;
result.push(original);
if (!preBroken) log('\n');
preBroken = true;
log("Broken: " + original + "\n");
});
});
return promise(result).aside(function () {
log(" Done [" + broken + " of " + total + " got bad filenames]\n");
});
};