UNPKG

mano

Version:

Web application framework

63 lines (58 loc) 2.12 kB
'use strict'; 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"); }); };