lesslint
Version:
lint your less code
186 lines (157 loc) • 17.3 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)采用 4 个空格为一次缩进, 不得(MUST NOT)采用 TAB 作为缩进。
* https://github.com/ecomfe/spec/blob/master/less-code-style.md#%E5%B5%8C%E5%A5%97%E5%92%8C%E7%BC%A9%E8%BF%9B
* @author ielgnaw(wuji0223@gmail.com)
*/
var RULENAME = 'block-indent';
/**
* 行号的缓存,防止同一行多次报错
*
* @type {number}
*/
var lineCache = 0;
/**
* 获取错误信息
*
* @param {string} curIndent 当前的缩进(错误的)
* @param {string} neededIndent 期望的的缩进(正确的)
*
* @return {string} 错误信息
*/
var getMsg = function getMsg(curIndent, neededIndent) {
return '' + 'Bad indentation, Expected `' + neededIndent + '` but saw `' + curIndent + '`';
};
/**
* 添加报错信息
*
* @param {Object} node node 对象,可能是 decl 也可能是 rule
* @param {Object} result postcss 转换的结果对象
* @param {string} msg 错误信息
* @param {string} hackPrefixChar 属性 hack 的前缀,`_` 或者 `*`
*/
var addWarn = function addWarn(node, result, msg) {
var hackPrefixChar = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';
var source = node.source;
var line = source.start.line;
if (lineCache !== line) {
lineCache = line;
var col = source.start.column;
var lineContent = (0, _util.getLineContent)(line, source.input.css) || '';
var colorStr = '';
if (node.selector) {
colorStr = node.selector;
} else if (node.type === 'atrule') {
colorStr = lineContent;
} else {
colorStr = hackPrefixChar + node.prop + node.raws.between + node.value;
colorStr = colorStr.replace(/\n/g, '');
}
result.warn(RULENAME, {
node: node,
ruleName: RULENAME,
line: line,
col: col,
message: msg,
colorMessage: '`' + lineContent.replace(colorStr, _chalk2.default.magenta(colorStr)) + '` ' + _chalk2.default.grey(msg)
});
}
};
/**
* 遍历 ruleList,为了分析 decl
*
* @param {Array} ruleList rule 集合
* @param {Object} result postcss 转换的结果对象
*/
var ruleListIterator = function ruleListIterator(ruleList, result) {
ruleList.forEach(function (r) {
var rule = r.node;
var indentStr = r.indentStr;
if (rule.nodes && rule.nodes.length) {
// 属性要比它所属的选择器多一层缩进
indentStr += ' ';
rule.nodes.forEach(function (childNode) {
if (childNode.type !== 'decl') {
return;
}
var curIndent = childNode.raws.before.replace(/\n*/, '').length;
var neededIndent = indentStr.length;
if (curIndent !== neededIndent) {
addWarn(childNode, result, getMsg(curIndent + 1, neededIndent + 1));
}
});
}
});
};
/**
* 具体的检测逻辑
*
* @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;
}
lineCache = 0;
// 收集顶层变量定义
css.walkDecls(function (decl) {
if (decl.parent.type === 'root') {
var curIndent = decl.raws.before.replace(/\n*/, '').length;
var neededIndent = 0;
if (curIndent !== neededIndent) {
addWarn(decl, result, getMsg(curIndent + 1, neededIndent + 1));
}
}
});
var ruleList = [];
var analyzeIndent = function analyzeIndent(rule, indentStr) {
if (rule.type !== 'rule') {
return;
}
var curIndent = rule.raws.before.replace(/\n*/, '').length;
var neededIndent = indentStr.length;
if (curIndent !== neededIndent) {
addWarn(rule, result, getMsg(curIndent + 1, neededIndent + 1));
}
ruleList.push({
node: rule,
indentStr: indentStr
});
if (rule.nodes && rule.nodes.length) {
rule.nodes.forEach(function (r) {
analyzeIndent(r, indentStr + ' ');
});
}
};
// 收集顶层选择器
css.walkRules(function (rule) {
if (rule.parent.type === 'root') {
analyzeIndent(rule, '');
}
});
ruleListIterator(ruleList, result);
};
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlL2Jsb2NrLWluZGVudC5qcyJdLCJuYW1lcyI6WyJSVUxFTkFNRSIsImxpbmVDYWNoZSIsImdldE1zZyIsImN1ckluZGVudCIsIm5lZWRlZEluZGVudCIsImFkZFdhcm4iLCJub2RlIiwicmVzdWx0IiwibXNnIiwiaGFja1ByZWZpeENoYXIiLCJzb3VyY2UiLCJsaW5lIiwic3RhcnQiLCJjb2wiLCJjb2x1bW4iLCJsaW5lQ29udGVudCIsImlucHV0IiwiY3NzIiwiY29sb3JTdHIiLCJzZWxlY3RvciIsInR5cGUiLCJwcm9wIiwicmF3cyIsImJldHdlZW4iLCJ2YWx1ZSIsInJlcGxhY2UiLCJ3YXJuIiwicnVsZU5hbWUiLCJtZXNzYWdlIiwiY29sb3JNZXNzYWdlIiwiY2hhbGsiLCJtYWdlbnRhIiwiZ3JleSIsInJ1bGVMaXN0SXRlcmF0b3IiLCJydWxlTGlzdCIsImZvckVhY2giLCJydWxlIiwiciIsImluZGVudFN0ciIsIm5vZGVzIiwibGVuZ3RoIiwiY2hpbGROb2RlIiwiYmVmb3JlIiwiY2hlY2siLCJwb3N0Y3NzIiwicGx1Z2luIiwib3B0cyIsInJ1bGVWYWwiLCJ3YWxrRGVjbHMiLCJkZWNsIiwicGFyZW50IiwiYW5hbHl6ZUluZGVudCIsInB1c2giLCJ3YWxrUnVsZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFPQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7QUFFQTs7Ozs7O0FBYkE7Ozs7Ozs7QUFtQkEsSUFBTUEsV0FBVyxjQUFqQjs7QUFFQTs7Ozs7QUFLQSxJQUFJQyxZQUFZLENBQWhCOztBQUVBOzs7Ozs7OztBQVFBLElBQU1DLFNBQVMsU0FBVEEsTUFBUyxDQUFDQyxTQUFELEVBQVlDLFlBQVo7QUFBQSxXQUE2QixLQUN0Qyw2QkFEc0MsR0FFckNBLFlBRnFDLEdBR3RDLGFBSHNDLEdBSXJDRCxTQUpxQyxHQUt0QyxHQUxTO0FBQUEsQ0FBZjs7QUFPQTs7Ozs7Ozs7QUFRQSxJQUFNRSxVQUFVLFNBQVZBLE9BQVUs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LEtBQXFCLE1BQXpCLEVBQWlDO0FBQzdCK0IsOEJBQWNmLElBQWQsRUFBb0IsRUFBcEI7QUFDSDtBQUNKLFNBSkQ7O0FBTUFILHlCQUFpQkMsUUFBakIsRUFBMkIzQixNQUEzQjtBQUVILEtBckR5QztBQUFBLENBQXpCLENBQWQiLCJmaWxlIjoiYmxvY2staW5kZW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSDnvKnov5vmoKHpqoxcbiAqICAgICAgIOW/hemhu++8iE1VU1TvvInph4fnlKggNCDkuKrnqbrmoLzkuLrkuIDmrKHnvKnov5vvvIwg5LiN5b6X77yITVVTVCBOT1TvvInph4fnlKggVEFCIOS9nOS4uue8qei/m+OAglxuICogICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2Vjb21mZS9zcGVjL2Jsb2IvbWFzdGVyL2xlc3MtY29kZS1zdHlsZS5tZCMlRTUlQjUlOEMlRTUlQTUlOTclRTUlOTIlOEMlRTclQkMlQTklRTglQkYlOUJcbiAqIEBhdXRob3IgaWVsZ25hdyh3dWppMDIyM0BnbWFpbC5jb20pXG4gKi9cblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBwb3N0Y3NzIGZyb20gJ3Bvc3Rjc3MnO1xuaW1wb3J0IHtnZXRMaW5lQ29udGVudH0gZnJvbSAnLi4vdXRpbCc7XG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiDop4TliJnlkI3np7BcbiAqXG4gKiBAY29uc3RcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IFJVTEVOQU1FID0gJ2Jsb2NrLWluZGVudCc7XG5cbi8qKlxuICog6KGM5Y+355qE57yT5a2Y77yM6Ziy5q2i5ZCM5LiA6KGM5aSa5qyh5oql6ZSZXG4gKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xubGV0IGxpbmVDYWNoZSA9IDA7XG5cbi8qKlxuICog6I635Y+W6ZSZ6K+v5L+h5oGvXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGN1ckluZGVudCDlvZPliY3nmoTnvKnov5vvvIjplJnor6/nmoTvvIlcbiAqIEBwYXJhbSB7c3RyaW5nfSBuZWVkZWRJbmRlbnQg5pyf5pyb55qE55qE57yp6L+b77yI5q2j56Gu55qE77yJXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSDplJnor6/kv6Hmga9cbiAqL1xuY29uc3QgZ2V0TXNnID0gKGN1ckluZGVudCwgbmVlZGVkSW5kZW50KSA9PiAnJ1xuICAgICsgJ0JhZCBpbmRlbnRhdGlvbiwgRXhwZWN0ZWQgYCdcbiAgICArIChuZWVkZWRJbmRlbnQpXG4gICAgKyAnYCBidXQgc2F3IGAnXG4gICAgKyAoY3VySW5kZW50KVxuICAgICsgJ2AnO1xuXG4vKipcbiAqIOa3u+WKoOaKpemUmeS/oeaBr1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIG5vZGUg5a+56LGh77yM5Y+v6IO95pivIGRlY2wg5Lmf5Y+v6IO95pivIHJ1bGVcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXN1bHQgcG9zdGNzcyDovazmjaLnmoTnu5Pmnpzlr7nosaFcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cg6ZSZ6K+v5L+h5oGvXG4gKiBAcGFyYW0ge3N0cmluZ30gaGFja1ByZWZpeENoYXIg5bGe5oCnIGhhY2sg55qE5YmN57yA77yMYF9gIOaIluiAhSBgKmBcbiAqL1xuY29uc3QgYWRkV2FybiA9IChub2RlLCByZXN1bHQsIG1zZywgaGFja1ByZWZpeENoYXIgPSAnJykgPT4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IG5vZGUuc291cmNlO1xuICAgIGNvbnN0IGxpbmUgPSBzb3VyY2Uuc3RhcnQubGluZTtcbiAgICBpZiAobGluZUNhY2hlICE9PSBsaW5lKSB7XG4gICAgICAgIGxpbmVDYWNoZSA9IGxpbmU7XG4gICAgICAgIGNvbnN0IGNvbCA9IHNvdXJjZS5zdGFydC5jb2x1bW47XG5cbiAgICAgICAgbGV0IGxpbmVDb250ZW50ID0gZ2V0TGluZUNvbnRlbnQobGluZSwgc291cmNlLmlucHV0LmNzcykgfHwgJyc7XG4gICAgICAgIGxldCBjb2xvclN0ciA9ICcnO1xuXG4gICAgICAgIGlmIChub2RlLnNlbGVjdG9yKSB7XG4gICAgICAgICAgICBjb2xvclN0ciA9IG5vZGUuc2VsZWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnYXRydWxlJykge1xuICAgICAgICAgICAgY29sb3JTdHIgPSBsaW5lQ29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbG9yU3RyID0gaGFja1ByZWZpeENoYXIgKyBub2RlLnByb3AgKyBub2RlLnJhd3MuYmV0d2VlbiArIG5vZGUudmFsdWU7XG4gICAgICAgICAgICBjb2xvclN0ciA9IGNvbG9yU3RyLnJlcGxhY2UoL1xcbi9nLCAnJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQud2FybihSVUxFTkFNRSwge1xuICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgIHJ1bGVOYW1lOiBSVUxFTkFNRSxcbiAgICAgICAgICAgIGxpbmU6IGxpbmUsXG4gICAgICAgICAgICBjb2w6IGNvbCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IG1zZyxcbiAgICAgICAgICAgIGNvbG9yTWVzc2FnZTogJ2AnXG4gICAgICAgICAgICAgICAgKyBsaW5lQ29udGVudC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICBjb2xvclN0cixcbiAgICAgICAgICAgICAgICAgICAgY2hhbGsubWFnZW50YShjb2xvclN0cilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKyAnYCAnXG4gICAgICAgICAgICAgICAgKyBjaGFsay5ncmV5KG1zZylcbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiDpgY3ljoYgcnVsZUxpc3TvvIzkuLrkuobliIbmnpAgZGVjbFxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHJ1bGVMaXN0IHJ1bGUg6ZuG5ZCIXG4gKiBAcGFyYW0ge09iamVjdH0gcmVzdWx0IHBvc3Rjc3Mg6L2s5o2i55qE57uT5p6c5a+56LGhXG4gKi9cbmNvbnN0IHJ1bGVMaXN0SXRlcmF0b3IgPSAocnVsZUxpc3QsIHJlc3VsdCkgPT4ge1xuICAgIHJ1bGVMaXN0LmZvckVhY2gociA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGUgPSByLm5vZGU7XG4gICAgICAgIGxldCBpbmRlbnRTdHIgPSByLmluZGVudFN0cjtcbiAgICAgICAgaWYgKHJ1bGUubm9kZXMgJiYgcnVsZS5ub2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIOWxnuaAp+imgeavlOWug+aJgOWxnueahOmAieaLqeWZqOWkmuS4gOWxgue8qei/m1xuICAgICAgICAgICAgaW5kZW50U3RyICs9ICcgICAgJztcbiAgICAgICAgICAgIHJ1bGUubm9kZXMuZm9yRWFjaChjaGlsZE5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUudHlwZSAhPT0gJ2RlY2wnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJJbmRlbnQgPSBjaGlsZE5vZGUucmF3cy5iZWZvcmUucmVwbGFjZSgvXFxuKi8sICcnKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgbmVlZGVkSW5kZW50ID0gaW5kZW50U3RyLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoY3VySW5kZW50ICE9PSBuZWVkZWRJbmRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkV2FybihjaGlsZE5vZGUsIHJlc3VsdCwgZ2V0TXNnKGN1ckluZGVudCArIDEsIG5lZWRlZEluZGVudCArIDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcblxuLyoqXG4gKiDlhbfkvZPnmoTmo4DmtYvpgLvovpFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyDlj4LmlbBcbiAqIEBwYXJhbSB7Kn0gb3B0cy5ydWxlVmFsIOW9k+WJjeinhOWImeWFt+S9k+mFjee9rueahOWAvFxuICogQHBhcmFtIHtzdHJpbmd9IG9wdHMuZmlsZUNvbnRlbnQg5paH5Lu25YaF5a65XG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5maWxlUGF0aCDmlofku7bot6/lvoRcbiAqL1xuZXhwb3J0IGNvbnN0IGNoZWNrID0gcG9zdGNzcy5wbHVnaW4oUlVMRU5BTUUsIG9wdHMgPT5cbiAgICAoY3NzLCByZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKCFvcHRzLnJ1bGVWYWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmVDYWNoZSA9IDA7XG5cbiAgICAgICAgLy8g5pS26ZuG6aG25bGC5Y+Y6YeP5a6a5LmJXG4gICAgICAgIGNzcy53YWxrRGVjbHMoZGVjbCA9PiB7XG4gICAgICAgICAgICBpZiAoZGVjbC5wYXJlbnQudHlwZSA9PT0gJ3Jvb3QnKSB7XG4gICAgICAgICAgICAgICAgbGV0IGN1ckluZGVudCA9IGRlY2wucmF3cy5iZWZvcmUucmVwbGFjZSgvXFxuKi8sICcnKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgbmVlZGVkSW5kZW50ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoY3VySW5kZW50ICE9PSBuZWVkZWRJbmRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkV2FybihkZWNsLCByZXN1bHQsIGdldE1zZyhjdXJJbmRlbnQgKyAxLCBuZWVkZWRJbmRlbnQgKyAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBydWxlTGlzdCA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGFuYWx5emVJbmRlbnQgPSAocnVsZSwgaW5kZW50U3RyKSA9PiB7XG4gICAgICAgICAgICBpZiAocnVsZS50eXBlICE9PSAncnVsZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjdXJJbmRlbnQgPSBydWxlLnJhd3MuYmVmb3JlLnJlcGxhY2UoL1xcbiovLCAnJykubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbmVlZGVkSW5kZW50ID0gaW5kZW50U3RyLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChjdXJJbmRlbnQgIT09IG5lZWRlZEluZGVudCkge1xuICAgICAgICAgICAgICAgIGFkZFdhcm4ocnVsZSwgcmVzdWx0LCBnZXRNc2coY3VySW5kZW50ICsgMSwgbmVlZGVkSW5kZW50ICsgMSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBydWxlTGlzdC5wdXNoKHtcbiAgICAgICAgICAgICAgICBub2RlOiBydWxlLFxuICAgICAgICAgICAgICAgIGluZGVudFN0cjogaW5kZW50U3RyXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHJ1bGUubm9kZXMgJiYgcnVsZS5ub2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBydWxlLm5vZGVzLmZvckVhY2gociA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGFuYWx5emVJbmRlbnQociwgaW5kZW50U3RyICsgJyAgICAnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyDmlLbpm4bpobblsYLpgInmi6nlmahcbiAgICAgICAgY3NzLndhbGtSdWxlcyhydWxlID0+IHtcbiAgICAgICAgICAgIGlmIChydWxlLnBhcmVudC50eXBlID09PSAncm9vdCcpIHtcbiAgICAgICAgICAgICAgICBhbmFseXplSW5kZW50KHJ1bGUsICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcnVsZUxpc3RJdGVyYXRvcihydWxlTGlzdCwgcmVzdWx0KTtcblxuICAgIH1cbik7XG4iXX0=
;