lesslint
Version:
lint your less code
142 lines (121 loc) • 10.5 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 _less = require('less');
var _less2 = _interopRequireDefault(_less);
var _util = require('../util');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @file 颜色检验
* 颜色定义必须(MUST)使用 #RRGGBB 格式定义,并在可能时尽量(SHOULD)缩写为 #RGB 形式,且避免直接使用颜色名称与 rgb() 表达式。
* https://github.com/ecomfe/spec/blob/master/less-code-style.md#%E9%A2%9C%E8%89%B2
* @author ielgnaw(wuji0223@gmail.com)
*/
;
/**
* 规则名称
*
* @const
* @type {string}
*/
var RULENAME = 'hex-color';
/**
* Less 中的所有颜色值
*
* @const
* @type {Object}
*/
var LESS_COLORS = _less2.default.data.colors;
/**
* 对 Less 中的所有颜色值做处理,便于之后正则
*
* @const
* @return {string} 字符串
*/
// const namedColors = (function () {
// let ret = '';
// for (let key of Object.keys(LESS_COLORS)) {
// ret += key + '|';
// }
// return ret.slice(0, -1); // 去掉最后一个 |
// })();
/**
* 匹配颜色名的正则
*
* @const
* @type {RegExp}
*/
// const PATTERN_NAMED_COLOR_EXP = new RegExp('\\b\\s?:\\s*(' + namedColors + ')', 'g');
// console.log(PATTERN_NAMED_COLOR_EXP);
// console.log();
/**
* 匹配 rgb, hsl 颜色表达式的正则
*
* @const
* @type {RegExp}
*/
var PATTERN_COLOR_EXP = /(\brgb\b|\bhsl\b)/gi;
/**
* 错误信息
*
* @const
* @type {string}
*/
var MSG = '' + 'Color value must use the hexadecimal mark forms such as `#RRGGBB`.' + ' Don\'t use RGB、HSL expression';
/**
* 添加报错信息
*
* @param {Object} node decl 对象
* @param {Object} result postcss 转换的结果对象
*/
var addWarn = function addWarn(decl, result) {
var source = decl.source,
prop = decl.prop,
raws = decl.raws;
var line = source.start.line;
var lineContent = (0, _util.getLineContent)(line, source.input.css, true);
var col = source.start.column + prop.length + raws.between.length;
result.warn(RULENAME, {
node: decl,
ruleName: RULENAME,
line: line,
col: col,
message: MSG,
colorMessage: '`' + (0, _util.changeColorByStartAndEndIndex)(lineContent, col, source.end.column) + '` ' + _chalk2.default.grey(MSG)
});
};
/**
* 具体的检测逻辑
*
* @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) {
if (!opts.ruleVal) {
return;
}
css.walkDecls(function (decl) {
var value = decl.value;
if (LESS_COLORS[value]) {
addWarn(decl, result);
} else {
var match = null;
/* eslint-disable no-extra-boolean-cast */
while (!!(match = PATTERN_COLOR_EXP.exec(value))) {
addWarn(decl, result);
}
/* eslint-enable no-extra-boolean-cast */
}
});
};
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlL2hleC1jb2xvci5qcyJdLCJuYW1lcyI6WyJSVUxFTkFNRSIsIkxFU1NfQ09MT1JTIiwibGVzcyIsImRhdGEiLCJjb2xvcnMiLCJQQVRURVJOX0NPTE9SX0VYUCIsIk1TRyIsImFkZFdhcm4iLCJkZWNsIiwicmVzdWx0Iiwic291cmNlIiwicHJvcCIsInJhd3MiLCJsaW5lIiwic3RhcnQiLCJsaW5lQ29udGVudCIsImlucHV0IiwiY3NzIiwiY29sIiwiY29sdW1uIiwibGVuZ3RoIiwiYmV0d2VlbiIsIndhcm4iLCJub2RlIiwicnVsZU5hbWUiLCJtZXNzYWdlIiwiY29sb3JNZXNzYWdlIiwiZW5kIiwiY2hhbGsiLCJncmV5IiwiY2hlY2siLCJwb3N0Y3NzIiwicGx1Z2luIiwib3B0cyIsInJ1bGVWYWwiLCJ3YWxrRGVjbHMiLCJ2YWx1ZSIsIm1hdGNoIiwiZXhlYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQU9BOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBVkE7Ozs7Ozs7QUFZQTs7QUFFQTs7Ozs7O0FBTUEsSUFBTUEsV0FBVyxXQUFqQjs7QUFFQTs7Ozs7O0FBTUEsSUFBTUMsY0FBY0MsZUFBS0MsSUFBTCxDQUFVQyxNQUE5Qjs7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7O0FBTUEsSUFBTUMsb0JBQW9CLHFCQUExQjs7QUFFQTs7Ozs7O0FBTUEsSUFBTUMsTUFBTSxLQUNOLG9FQURNLEdBRU4sZ0NBRk47O0FBSUE7Ozs7OztBQU1BLElBQU1DLFVBQVUsU0FBVkEsT0FBVSxDQUFDQyxJQUFELEVBQU9DLE1BQVAsRUFBa0I7QUFBQSxRQUN2QkMsTUFEdUIsR0FDREYsSUFEQyxDQUN2QkUsTUFEdUI7QUFBQSxRQUNmQyxJQURlLEdBQ0RILElBREMsQ0FDZkcsSUFEZTtBQUFBLFFBQ1RDLElBRFMsR0FDREosSUFEQyxDQUNUSSxJQURTOztBQUU5QixRQUFNQyxPQUFPSCxPQUFPSSxLQUFQLENBQWFELElBQTFCO0FBQ0EsUUFBTUUsY0FBYywwQkFBZUYsSUFBZixFQUFxQkgsT0FBT00sS0FBUCxDQUFhQyxHQUFsQyxFQUF1QyxJQUF2QyxDQUFwQjtBQUNBLFFBQU1DLE1BQU1SLE9BQU9JLEtBQVAsQ0FBYUssTUFBYixHQUFzQlIsS0FBS1MsTUFBM0IsR0FBb0NSLEtBQUtTLE9BQUwsQ0FBYUQsTUFBN0Q7QUFDQVgsV0FBT2EsSUFBUCxDQUFZdEIsUUFBWixFQUFzQjtBQUNsQnVCLGNBQU1mLElBRFk7QUFFbEJnQixrQkFBVXhCLFFBRlE7QUFHbEJhLGNBQU1BLElBSFk7QUFJbEJLLGFBQUtBLEdBSmE7QUFLbEJPLGlCQUFTbkIsR0FMUztBQU1sQm9CLHNCQUFjLE1BQ1IseUNBQ0VYLFdBREYsRUFDZUcsR0FEZixFQUNvQlIsT0FBT2lCLEdBQVAsQ0FBV1IsTUFEL0IsQ0FEUSxHQUlSLElBSlEsR0FLUlMsZ0JBQU1DLElBQU4sQ0FBV3ZCLEdBQVg7QUFYWSxLQUF0QjtBQWFILENBbEJEOztBQW9CQTs7Ozs7Ozs7QUFRTyxJQUFNd0Isd0JBQVFDLGtCQUFRQyxNQUFSLENBQWVoQyxRQUFmLEVBQXlCO0FBQUEsV0FDMUMsVUFBQ2lCLEdBQUQsRUFBTVIsTUFBTixFQUFpQjtBQUNiLFlBQUksQ0FBQ3dCLEtBQUtDLE9BQVYsRUFBbUI7QUFDZjtBQUNIOztBQUVEakIsWUFBSWtCLFNBQUosQ0FBYyxnQkFBUTtBQUNsQixnQkFBTUMsUUFBUTVCLEtBQUs0QixLQUFuQjtBQUNBLGdCQUFJbkMsWUFBWW1DLEtBQVosQ0FBSixFQUF3QjtBQUNwQjdCLHdCQUFRQyxJQUFSLEVBQWNDLE1BQWQ7QUFDSCxhQUZELE1BR0s7QUFDRCxvQkFBSTRCLFFBQVEsSUFBWjtBQUNBO0FBQ0EsdUJBQU8sQ0FBQyxFQUFFQSxRQUFRaEMsa0JBQWtCaUMsSUFBbEIsQ0FBdUJGLEtBQXZCLENBQVYsQ0FBUixFQUFrRDtBQUM5QzdCLDRCQUFRQyxJQUFSLEVBQWNDLE1BQWQ7QUFDSDtBQUNEO0FBQ0g7QUFDSixTQWJEO0FBY0gsS0FwQnlDO0FBQUEsQ0FBekIsQ0FBZCIsImZpbGUiOiJoZXgtY29sb3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIOminOiJsuajgOmqjFxuICogICAgICAg6aKc6Imy5a6a5LmJ5b+F6aG777yITVVTVO+8ieS9v+eUqCAjUlJHR0JCIOagvOW8j+WumuS5ie+8jOW5tuWcqOWPr+iDveaXtuWwvemHj++8iFNIT1VMRO+8iee8qeWGmeS4uiAjUkdCIOW9ouW8j++8jOS4lOmBv+WFjeebtOaOpeS9v+eUqOminOiJsuWQjeensOS4jiByZ2IoKSDooajovr7lvI/jgIJcbiAqICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9lY29tZmUvc3BlYy9ibG9iL21hc3Rlci9sZXNzLWNvZGUtc3R5bGUubWQjJUU5JUEyJTlDJUU4JTg5JUIyXG4gKiBAYXV0aG9yIGllbGduYXcod3VqaTAyMjNAZ21haWwuY29tKVxuICovXG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgcG9zdGNzcyBmcm9tICdwb3N0Y3NzJztcbmltcG9ydCBsZXNzIGZyb20gJ2xlc3MnO1xuaW1wb3J0IHtnZXRMaW5lQ29udGVudCwgY2hhbmdlQ29sb3JCeVN0YXJ0QW5kRW5kSW5kZXh9IGZyb20gJy4uL3V0aWwnO1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICog6KeE5YiZ5ZCN56ewXG4gKlxuICogQGNvbnN0XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBSVUxFTkFNRSA9ICdoZXgtY29sb3InO1xuXG4vKipcbiAqIExlc3Mg5Lit55qE5omA5pyJ6aKc6Imy5YC8XG4gKlxuICogQGNvbnN0XG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5jb25zdCBMRVNTX0NPTE9SUyA9IGxlc3MuZGF0YS5jb2xvcnM7XG5cbi8qKlxuICog5a+5IExlc3Mg5Lit55qE5omA5pyJ6aKc6Imy5YC85YGa5aSE55CG77yM5L6/5LqO5LmL5ZCO5q2j5YiZXG4gKlxuICogQGNvbnN0XG4gKiBAcmV0dXJuIHtzdHJpbmd9IOWtl+espuS4slxuICovXG4vLyBjb25zdCBuYW1lZENvbG9ycyA9IChmdW5jdGlvbiAoKSB7XG4vLyAgICAgbGV0IHJldCA9ICcnO1xuLy8gICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhMRVNTX0NPTE9SUykpIHtcbi8vICAgICAgICAgcmV0ICs9IGtleSArICd8Jztcbi8vICAgICB9XG4vLyAgICAgcmV0dXJuIHJldC5zbGljZSgwLCAtMSk7IC8vIOWOu+aOieacgOWQjuS4gOS4qiB8XG4vLyB9KSgpO1xuXG4vKipcbiAqIOWMuemFjeminOiJsuWQjeeahOato+WImVxuICpcbiAqIEBjb25zdFxuICogQHR5cGUge1JlZ0V4cH1cbiAqL1xuLy8gY29uc3QgUEFUVEVSTl9OQU1FRF9DT0xPUl9FWFAgPSBuZXcgUmVnRXhwKCdcXFxcYlxcXFxzPzpcXFxccyooJyArIG5hbWVkQ29sb3JzICsgJyknLCAnZycpO1xuLy8gY29uc29sZS5sb2coUEFUVEVSTl9OQU1FRF9DT0xPUl9FWFApO1xuLy8gY29uc29sZS5sb2coKTtcblxuLyoqXG4gKiDljLnphY0gcmdiLCBoc2wg6aKc6Imy6KGo6L6+5byP55qE5q2j5YiZXG4gKlxuICogQGNvbnN0XG4gKiBAdHlwZSB7UmVnRXhwfVxuICovXG5jb25zdCBQQVRURVJOX0NPTE9SX0VYUCA9IC8oXFxicmdiXFxifFxcYmhzbFxcYikvZ2k7XG5cbi8qKlxuICog6ZSZ6K+v5L+h5oGvXG4gKlxuICogQGNvbnN0XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBNU0cgPSAnJ1xuICAgICsgJ0NvbG9yIHZhbHVlIG11c3QgdXNlIHRoZSBoZXhhZGVjaW1hbCBtYXJrIGZvcm1zIHN1Y2ggYXMgYCNSUkdHQkJgLidcbiAgICArICcgRG9uXFwndCB1c2UgUkdC44CBSFNMIGV4cHJlc3Npb24nO1xuXG4vKipcbiAqIOa3u+WKoOaKpemUmeS/oeaBr1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIGRlY2wg5a+56LGhXG4gKiBAcGFyYW0ge09iamVjdH0gcmVzdWx0IHBvc3Rjc3Mg6L2s5o2i55qE57uT5p6c5a+56LGhXG4gKi9cbmNvbnN0IGFkZFdhcm4gPSAoZGVjbCwgcmVzdWx0KSA9PiB7XG4gICAgY29uc3Qge3NvdXJjZSwgcHJvcCwgcmF3c30gPSBkZWNsO1xuICAgIGNvbnN0IGxpbmUgPSBzb3VyY2Uuc3RhcnQubGluZTtcbiAgICBjb25zdCBsaW5lQ29udGVudCA9IGdldExpbmVDb250ZW50KGxpbmUsIHNvdXJjZS5pbnB1dC5jc3MsIHRydWUpO1xuICAgIGNvbnN0IGNvbCA9IHNvdXJjZS5zdGFydC5jb2x1bW4gKyBwcm9wLmxlbmd0aCArIHJhd3MuYmV0d2Vlbi5sZW5ndGg7XG4gICAgcmVzdWx0Lndhcm4oUlVMRU5BTUUsIHtcbiAgICAgICAgbm9kZTogZGVjbCxcbiAgICAgICAgcnVsZU5hbWU6IFJVTEVOQU1FLFxuICAgICAgICBsaW5lOiBsaW5lLFxuICAgICAgICBjb2w6IGNvbCxcbiAgICAgICAgbWVzc2FnZTogTVNHLFxuICAgICAgICBjb2xvck1lc3NhZ2U6ICdgJ1xuICAgICAgICAgICAgKyBjaGFuZ2VDb2xvckJ5U3RhcnRBbmRFbmRJbmRleChcbiAgICAgICAgICAgICAgICBsaW5lQ29udGVudCwgY29sLCBzb3VyY2UuZW5kLmNvbHVtblxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgKyAnYCAnXG4gICAgICAgICAgICArIGNoYWxrLmdyZXkoTVNHKVxuICAgIH0pO1xufTtcblxuLyoqXG4gKiDlhbfkvZPnmoTmo4DmtYvpgLvovpFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyDlj4LmlbBcbiAqIEBwYXJhbSB7Kn0gb3B0cy5ydWxlVmFsIOW9k+WJjeinhOWImeWFt+S9k+mFjee9rueahOWAvFxuICogQHBhcmFtIHtzdHJpbmd9IG9wdHMuZmlsZUNvbnRlbnQg5paH5Lu25YaF5a65XG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5maWxlUGF0aCDmlofku7bot6/lvoRcbiAqL1xuZXhwb3J0IGNvbnN0IGNoZWNrID0gcG9zdGNzcy5wbHVnaW4oUlVMRU5BTUUsIG9wdHMgPT5cbiAgICAoY3NzLCByZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKCFvcHRzLnJ1bGVWYWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNzcy53YWxrRGVjbHMoZGVjbCA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRlY2wudmFsdWU7XG4gICAgICAgICAgICBpZiAoTEVTU19DT0xPUlNbdmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgYWRkV2FybihkZWNsLCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gbnVsbDtcbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1leHRyYS1ib29sZWFuLWNhc3QgKi9cbiAgICAgICAgICAgICAgICB3aGlsZSAoISEobWF0Y2ggPSBQQVRURVJOX0NPTE9SX0VYUC5leGVjKHZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkV2FybihkZWNsLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWV4dHJhLWJvb2xlYW4tY2FzdCAqL1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4pO1xuIl19
;