canonical
Version:
Canonical code style linter and formatter for JavaScript, SCSS and CSS.
106 lines (82 loc) • 2.54 kB
JavaScript
import jscs from 'jscs';
import _ from 'lodash';
let checker,
reportValidateSourceCode,
validateSourceCode;
checker = new jscs();
checker.configure({
"esnext": true,
"plugins": [
require.resolve('jscs-jsdoc'),
]
});
/**
* @typedef {Object} validateRule~error
* @property {String} message
* @property {Number} line
* @property {Number} column
*/
/**
* Validates a source code using a specific jscs-jsdoc rule and return an array of errors.
*
* @param {String} sourceCode
* @param {String} ruleName
* @param {Boolean|String|Object} ruleOptions
* @returns {validateRule~error[]}
*/
validateSourceCode = (sourceCode, ruleName, ruleOptions) => {
let results,
errors;
// console.log('ruleName', ruleName, 'ruleOptions', ruleOptions);
checker.configure({
"jsDoc": {
[ruleName]: ruleOptions
}
});
// console.log('checker._configuredRules', checker._configuredRules);
results = checker.checkString(sourceCode);
errors = results.getErrorList();
// console.log('errors', errors);
errors = _.map(errors, (error) => {
return {
message: error.message,
line: error.line,
column: error.column
};
});
// console.log('errors', errors);
return errors;
};
/**
* @param {Object} context
* @param {String} ruleName
* @param {Boolean|String|Object} ruleOptions
* @param {undefined|function} translate
* @returns {undefined}
*/
reportValidateSourceCode = (context, ruleName, ruleOptions, translate) => {
let errors,
sourceCode;
sourceCode = context.getSourceCode().text;
errors = validateSourceCode(sourceCode, ruleName, ruleOptions);
// console.log('errors', errors, sourceCode, ruleName, ruleOptions);
_.forEach(errors, (error) => {
let node;
node = {
loc: {
start: {
line: error.line,
// "Ah... the parser (espree) is using 0-based column and eslint is using 1-based column, so context.report is 0-based then eslint transforms it to 1-based."
// @see https://gitter.im/eslint/eslint?at=55fc8a81463feefb419d4798
column: error.column - 1
}
}
};
// console.log('node', node)
if (translate) {
error.message = translate(error.message);
}
context.report(node, error.message);
});
};
export default reportValidateSourceCode;