webproxy
Version:
Modify http request/response in javascript config file easily.
70 lines (55 loc) • 1.86 kB
JavaScript
var RcLoader = require('rcloader');
var jshint = require('jshint').JSHINT;
var jshintcli = require('jshint/src/cli');
var minimatch = require("minimatch");
var _ = require("lodash");
module.exports = function createLintFunction(userOpts) {
var rcLoader = new RcLoader('.jshintrc', userOpts, {
loader: function (path) {
var cfg = jshintcli.loadConfig(path);
delete cfg.dirname;
return cfg;
}
});
var reportErrors = function (file, out, cfg) {
var filePath = (file.path || 'stdin');
out.results = jshint.errors.map(function (err) {
if (!err) return;
return { file: filePath, error: err };
}).filter(Boolean);
out.opt = cfg;
out.data = [jshint.data()];
out.data[0].file = filePath;
};
return function lint(file, cb) {
// pass through dirs, streaming files, etc.
if (!file.isBuffer()) {
return cb(null, file);
}
rcLoader.for(file.path, function (err, cfg) {
if (err) return cb(err);
var globals = {};
if (cfg.globals) {
globals = cfg.globals;
delete cfg.globals;
}
if (cfg.overrides) {
_.each(cfg.overrides, function (options, pattern) {
if (!minimatch(file.path, pattern, { nocase: true, matchBase: true })) return;
if (options.globals) {
globals = _.extend(globals, options.globals);
delete options.globals;
}
_.extend(cfg, options);
});
delete cfg.overrides;
}
// get or create file.jshint, we will write all output here
var out = file.jshint || (file.jshint = {});
var str = _.isString(out.extracted) ? out.extracted : file.contents.toString('utf8');
out.success = jshint(str, cfg, globals);
if (!out.success) reportErrors(file, out, cfg);
return cb(null, file);
});
};
};