easygo
Version:
110 lines (92 loc) • 3.18 kB
JavaScript
/**
* @file: file 验证入口
* @author: cuihonglei(cuihonglei2xj@gmail.com)
* @Date: 2017-06-22 17:57:51
*/
;
const Reporter = require('./util/reporter');
const Context = require('./util/context');
const Rule = require('./util/rule');
const config = require('./util/config');
function createRuleProcessor(rules, reporter) {
return rules.map(rule => {
let RuleConstructor = rule;
if (typeof rule === 'string') {
let proto = require('./rule/' + rule);
RuleConstructor = Rule.create(proto);
}
else if (typeof rule === 'object') {
RuleConstructor = Rule.create(rule);
}
return new RuleConstructor(reporter);
});
}
function processOptions(options) {
options = options || {};
let reporter;
let validateRules;
// 报告设置
reporter = options.reporter ? options.reporter : new Reporter();
// 验证规则设置
validateRules = options.rules ? options.rules : config.extensionValidateRules;
if (options.additionalRules) {
validateRules = validateRules.concat(options.additionalRules);
}
return {
reporter: reporter,
validateRules: validateRules,
exportFiles: options.exportFiles || false,
ignore: Array.isArray(options.ignore) ? options.ignore : []
};
}
function validate(context, opts) {
const reporter = opts.reporter;
context.ignore = opts.ignore.map(pattern => '*/' + pattern);
try {
const ruleProcessors = createRuleProcessor(opts.validateRules, reporter);
for (let i = 0, processor; processor = ruleProcessors[i]; i++) {
// 记录警告和错误的个数,以便于控制验证流程
let errorCount = reporter.errors.length;
processor.exec(context);
if (reporter.errors.length - errorCount > 0 && processor.stopOnError) {
break;
}
}
}
catch (e) {
reporter.error('', e.message);
}
// 如果需要附加文件,则校验的文件列表附加到数据中
const data = reporter.getReport();
data.name = context.name;
if (opts.exportFiles) {
data.files = context.getFiles();
}
return data;
}
exports.validate = function (dirPath, options) {
const opts = processOptions(options);
return new Promise(resolve => {
Context.load(dirPath)
.then(context => {
const data = validate(context, opts);
resolve(data);
}, e => {
opts.reporter.error('', e.message || '读取目录错误!');
resolve(opts.reporter.getReport());
});
});
};
exports.validateZip = function (filePath, options) {
const opts = processOptions(options);
return new Promise(resolve => {
Context.loadZip(filePath)
.then(context => {
const data = validate(context, opts);
resolve(data);
}, e => {
opts.reporter.error('', e.message || '读取zip文件错误!');
resolve(opts.reporter.getReport());
});
});
};