lesslint
Version:
lint your less code
99 lines (83 loc) • 9.17 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.check = undefined;
var _chalk = require('chalk');
var _chalk2 = _interopRequireDefault(_chalk);
var _postcss = require('postcss');
var _postcss2 = _interopRequireDefault(_postcss);
var _util = require('../util');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
;
/**
* 规则名称
*
* @const
* @type {string}
*/
/**
* @file 选择器检验
* 当多个选择器共享一个声明块时,每个选择器声明必须(MUST)独占一行。
* https://github.com/ecomfe/spec/blob/master/less-code-style.md#%E9%80%89%E6%8B%A9%E5%99%A8
* @author ielgnaw(wuji0223@gmail.com)
*/
var RULENAME = 'require-newline';
/**
* 判断逗号后面没有跟着换行符的正则
* 如果未匹配,则说明逗号后面有换行符
*
* @const
* @type {RegExp}
*/
var PATTERN_NOTLF = /(,(?!\s*\n))/;
/**
* 错误信息
*
* @const
* @type {string}
*/
var MSG = 'When multiple selectors share a statement block, each selector statement must be per line';
/**
* 具体的检测逻辑
*
* @param {Object} opts 参数
* @param {*} opts.ruleVal 当前规则具体配置的值
* @param {string} opts.fileContent 文件内容
* @param {string} opts.filePath 文件路径
*/
var check = exports.check = _postcss2.default.plugin(RULENAME, function (opts) {
return function (css, result) {
var ruleVal = opts.ruleVal;
var realRuleVal = [];
Array.prototype.push[Array.isArray(ruleVal) ? 'apply' : 'call'](realRuleVal, ruleVal);
if (!realRuleVal.length) {
return;
}
if (realRuleVal.indexOf('selector') > -1) {
css.walkRules(function (rule) {
var selector = rule.selector;
if (!rule.ruleWithoutBody // 排除 mixin 调用
&& !rule.params // 排除 mixin 定义
&& PATTERN_NOTLF.test(selector)) {
var source = rule.source;
var line = source.start.line;
var lineContent = (0, _util.getLineContent)(line, source.input.css);
var col = source.start.column;
// 如果是 `p, i, \n.cc` 这样的选择器,那么高亮就应该把后面的 `\n.cc` 去掉
// 直接用 lineContent 来匹配 `p, i, \n.cc` 无法高亮
var colorStr = selector.replace(/\n.*/, '');
result.warn(RULENAME, {
node: rule,
ruleName: RULENAME,
line: line,
col: col,
message: MSG,
colorMessage: '`' + lineContent.replace(colorStr, _chalk2.default.magenta(colorStr)) + '` ' + _chalk2.default.grey(MSG)
});
}
});
}
};
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlL3JlcXVpcmUtbmV3bGluZS5qcyJdLCJuYW1lcyI6WyJSVUxFTkFNRSIsIlBBVFRFUk5fTk9UTEYiLCJNU0ciLCJjaGVjayIsInBvc3Rjc3MiLCJwbHVnaW4iLCJjc3MiLCJyZXN1bHQiLCJydWxlVmFsIiwib3B0cyIsInJlYWxSdWxlVmFsIiwiQXJyYXkiLCJwcm90b3R5cGUiLCJwdXNoIiwiaXNBcnJheSIsImxlbmd0aCIsImluZGV4T2YiLCJ3YWxrUnVsZXMiLCJzZWxlY3RvciIsInJ1bGUiLCJydWxlV2l0aG91dEJvZHkiLCJwYXJhbXMiLCJ0ZXN0Iiwic291cmNlIiwibGluZSIsInN0YXJ0IiwibGluZUNvbnRlbnQiLCJpbnB1dCIsImNvbCIsImNvbHVtbiIsImNvbG9yU3RyIiwicmVwbGFjZSIsIndhcm4iLCJub2RlIiwicnVsZU5hbWUiLCJtZXNzYWdlIiwiY29sb3JNZXNzYWdlIiwiY2hhbGsiLCJtYWdlbnRhIiwiZ3JleSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQU9BOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUVBOztBQUVBOzs7Ozs7QUFiQTs7Ozs7OztBQW1CQSxJQUFNQSxXQUFXLGlCQUFqQjs7QUFFQTs7Ozs7OztBQU9BLElBQU1DLGdCQUFnQixjQUF0Qjs7QUFFQTs7Ozs7O0FBTUEsSUFBTUMsTUFBTSwyRkFBWjs7QUFFQTs7Ozs7Ozs7QUFRTyxJQUFNQyx3QkFBUUMsa0JBQVFDLE1BQVIsQ0FBZUwsUUFBZixFQUF5QjtBQUFBLFdBQzFDLFVBQUNNLEdBQUQsRUFBTUMsTUFBTixFQUFpQjtBQUNiLFlBQU1DLFVBQVVDLEtBQUtELE9BQXJCO0FBQ0EsWUFBTUUsY0FBYyxFQUFwQjs7QUFFQUMsY0FBTUMsU0FBTixDQUFnQkMsSUFBaEIsQ0FBcUJGLE1BQU1HLE9BQU4sQ0FBY04sT0FBZCxJQUF5QixPQUF6QixHQUFtQyxNQUF4RCxFQUFnRUUsV0FBaEUsRUFBNkVGLE9BQTdFOztBQUVBLFlBQUksQ0FBQ0UsWUFBWUssTUFBakIsRUFBeUI7QUFDckI7QUFDSDs7QUFFRCxZQUFJTCxZQUFZTSxPQUFaLENBQW9CLFVBQXBCLElBQWtDLENBQUMsQ0FBdkMsRUFBMEM7QUFDdENWLGdCQUFJVyxTQUFKLENBQWMsZ0JBQVE7QUFDbEIsb0JBQU1DLFdBQVdDLEtBQUtELFFBQXRCO0FBQ0Esb0JBQ0ksQ0FBQ0MsS0FBS0MsZUFBTixDQUFzQjtBQUF0QixtQkFDRyxDQUFDRCxLQUFLRSxNQURULENBQ2dCO0FBRGhCLG1CQUVHcEIsY0FBY3FCLElBQWQsQ0FBbUJKLFFBQW5CLENBSFAsRUFJRTtBQUNFLHdCQUFNSyxTQUFTSixLQUFLSSxNQUFwQjtBQUNBLHdCQUFNQyxPQUFPRCxPQUFPRSxLQUFQLENBQWFELElBQTFCO0FBQ0Esd0JBQU1FLGNBQWMsMEJBQWVGLElBQWYsRUFBcUJELE9BQU9JLEtBQVAsQ0FBYXJCLEdBQWxDLENBQXBCO0FBQ0Esd0JBQU1zQixNQUFNTCxPQUFPRSxLQUFQLENBQWFJLE1BQXpCO0FBQ0E7QUFDQTtBQUNBLHdCQUFNQyxXQUFXWixTQUFTYSxPQUFULENBQWlCLE1BQWpCLEVBQXlCLEVBQXpCLENBQWpCO0FBQ0F4QiwyQkFBT3lCLElBQVAsQ0FBWWhDLFFBQVosRUFBc0I7QUFDbEJpQyw4QkFBTWQsSUFEWTtBQUVsQmUsa0NBQVVsQyxRQUZRO0FBR2xCd0IsOEJBQU1BLElBSFk7QUFJbEJJLDZCQUFLQSxHQUphO0FBS2xCTyxpQ0FBU2pDLEdBTFM7QUFNbEJrQyxzQ0FBYyxNQUNSVixZQUFZSyxPQUFaLENBQW9CRCxRQUFwQixFQUE4Qk8sZ0JBQU1DLE9BQU4sQ0FBY1IsUUFBZCxDQUE5QixDQURRLEdBRVIsSUFGUSxHQUdSTyxnQkFBTUUsSUFBTixDQUFXckMsR0FBWDtBQVRZLHFCQUF0QjtBQVdIO0FBQ0osYUExQkQ7QUEyQkg7QUFDSixLQXhDeUM7QUFBQSxDQUF6QixDQUFkIiwiZmlsZSI6InJlcXVpcmUtbmV3bGluZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUg6YCJ5oup5Zmo5qOA6aqMXG4gKiAgICAgICDlvZPlpJrkuKrpgInmi6nlmajlhbHkuqvkuIDkuKrlo7DmmI7lnZfml7bvvIzmr4/kuKrpgInmi6nlmajlo7DmmI7lv4XpobvvvIhNVVNU77yJ54us5Y2g5LiA6KGM44CCXG4gKiAgICAgICBodHRwczovL2dpdGh1Yi5jb20vZWNvbWZlL3NwZWMvYmxvYi9tYXN0ZXIvbGVzcy1jb2RlLXN0eWxlLm1kIyVFOSU4MCU4OSVFNiU4QiVBOSVFNSU5OSVBOFxuICogQGF1dGhvciBpZWxnbmF3KHd1amkwMjIzQGdtYWlsLmNvbSlcbiAqL1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHBvc3Rjc3MgZnJvbSAncG9zdGNzcyc7XG5pbXBvcnQge2dldExpbmVDb250ZW50fSBmcm9tICcuLi91dGlsJztcblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIOinhOWImeWQjeensFxuICpcbiAqIEBjb25zdFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgUlVMRU5BTUUgPSAncmVxdWlyZS1uZXdsaW5lJztcblxuLyoqXG4gKiDliKTmlq3pgJflj7flkI7pnaLmsqHmnInot5/nnYDmjaLooYznrKbnmoTmraPliJlcbiAqIOWmguaenOacquWMuemFje+8jOWImeivtOaYjumAl+WPt+WQjumdouacieaNouihjOesplxuICpcbiAqIEBjb25zdFxuICogQHR5cGUge1JlZ0V4cH1cbiAqL1xuY29uc3QgUEFUVEVSTl9OT1RMRiA9IC8oLCg/IVxccypcXG4pKS87XG5cbi8qKlxuICog6ZSZ6K+v5L+h5oGvXG4gKlxuICogQGNvbnN0XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBNU0cgPSAnV2hlbiBtdWx0aXBsZSBzZWxlY3RvcnMgc2hhcmUgYSBzdGF0ZW1lbnQgYmxvY2ssIGVhY2ggc2VsZWN0b3Igc3RhdGVtZW50IG11c3QgYmUgcGVyIGxpbmUnO1xuXG4vKipcbiAqIOWFt+S9k+eahOajgOa1i+mAu+i+kVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIOWPguaVsFxuICogQHBhcmFtIHsqfSBvcHRzLnJ1bGVWYWwg5b2T5YmN6KeE5YiZ5YW35L2T6YWN572u55qE5YC8XG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5maWxlQ29udGVudCDmlofku7blhoXlrrlcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmZpbGVQYXRoIOaWh+S7tui3r+W+hFxuICovXG5leHBvcnQgY29uc3QgY2hlY2sgPSBwb3N0Y3NzLnBsdWdpbihSVUxFTkFNRSwgb3B0cyA9PlxuICAgIChjc3MsIHJlc3VsdCkgPT4ge1xuICAgICAgICBjb25zdCBydWxlVmFsID0gb3B0cy5ydWxlVmFsO1xuICAgICAgICBjb25zdCByZWFsUnVsZVZhbCA9IFtdO1xuXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoW0FycmF5LmlzQXJyYXkocnVsZVZhbCkgPyAnYXBwbHknIDogJ2NhbGwnXShyZWFsUnVsZVZhbCwgcnVsZVZhbCk7XG5cbiAgICAgICAgaWYgKCFyZWFsUnVsZVZhbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWFsUnVsZVZhbC5pbmRleE9mKCdzZWxlY3RvcicpID4gLTEpIHtcbiAgICAgICAgICAgIGNzcy53YWxrUnVsZXMocnVsZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXJ1bGUucnVsZVdpdGhvdXRCb2R5IC8vIOaOkumZpCBtaXhpbiDosIPnlKhcbiAgICAgICAgICAgICAgICAgICAgJiYgIXJ1bGUucGFyYW1zIC8vIOaOkumZpCBtaXhpbiDlrprkuYlcbiAgICAgICAgICAgICAgICAgICAgJiYgUEFUVEVSTl9OT1RMRi50ZXN0KHNlbGVjdG9yKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBydWxlLnNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZSA9IHNvdXJjZS5zdGFydC5saW5lO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lQ29udGVudCA9IGdldExpbmVDb250ZW50KGxpbmUsIHNvdXJjZS5pbnB1dC5jc3MpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSBzb3VyY2Uuc3RhcnQuY29sdW1uO1xuICAgICAgICAgICAgICAgICAgICAvLyDlpoLmnpzmmK8gYHAsIGksIFxcbi5jY2Ag6L+Z5qC355qE6YCJ5oup5Zmo77yM6YKj5LmI6auY5Lqu5bCx5bqU6K+l5oqK5ZCO6Z2i55qEIGBcXG4uY2NgIOWOu+aOiVxuICAgICAgICAgICAgICAgICAgICAvLyDnm7TmjqXnlKggbGluZUNvbnRlbnQg5p2l5Yy56YWNIGBwLCBpLCBcXG4uY2NgIOaXoOazlemrmOS6rlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xvclN0ciA9IHNlbGVjdG9yLnJlcGxhY2UoL1xcbi4qLywgJycpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQud2FybihSVUxFTkFNRSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogcnVsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVOYW1lOiBSVUxFTkFNRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IGxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2w6IGNvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IE1TRyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTWVzc2FnZTogJ2AnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsaW5lQ29udGVudC5yZXBsYWNlKGNvbG9yU3RyLCBjaGFsay5tYWdlbnRhKGNvbG9yU3RyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArICdgICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNoYWxrLmdyZXkoTVNHKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbik7XG4iXX0=
;