UNPKG

lesslint

Version:
119 lines (100 loc) 10.2 kB
'use strict'; 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 }; } 'use strict'; /** * 规则名称 * * @const * @type {string} */ /** * @file 0 值检验 * 属性值为 0 时,必须省略可省的单位(长度单位如 px、em,不包括时间、角度等如 s、deg) * https://github.com/ecomfe/spec/blob/master/less-code-style.md#0-%E5%80%BC * @author ielgnaw(wuji0223@gmail.com) */ var RULENAME = 'zero-unit'; /** * css 长度单位集合 * https://developer.mozilla.org/en-US/docs/Web/CSS/length * * @const * @type {Array} */ var LENGTH_UNITS = [ // Relative length units 'em', 'ex', 'ch', 'rem', // Font-relative lengths 'vh', 'vw', 'vmin', 'vmax', // Viewport-percentage lengths // Absolute length units 'px', 'mm', 'cm', 'in', 'pt', 'pc']; /** * 数字正则 * * @const * @type {RegExp} */ var PATTERN_NUMERIC = /\d+[\.\d]*/; /** * 错误信息 * * @const * @type {string} */ var MSG = 'Values of 0 shouldn\'t have units specified'; /** * 行号的缓存,防止同一行多次报错 * * @type {number} */ var lineCache = 0; /** * 具体的检测逻辑 * * @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) { var parts = _postcss2.default.list.space(decl.value); for (var i = 0, len = parts.length; i < len; i++) { var part = parts[i]; var numericVal = parseFloat(part); // TODO: background-color: darken(#fff, 0px); if (numericVal === 0) { var unit = part.replace(PATTERN_NUMERIC, ''); var source = decl.source; var line = source.start.line; if (LENGTH_UNITS.indexOf(unit) > -1 && lineCache !== line) { lineCache = line; var lineContent = (0, _util.getLineContent)(line, source.input.css); result.warn(RULENAME, { node: decl, ruleName: RULENAME, line: line, col: source.start.column + decl.prop.length + decl.raws.between.length, message: MSG, colorMessage: '`' + lineContent.replace(decl.value, _chalk2.default.magenta(decl.value)) + '` ' + _chalk2.default.grey(MSG) }); } } } }); }; }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlL3plcm8tdW5pdC5qcyJdLCJuYW1lcyI6WyJSVUxFTkFNRSIsIkxFTkdUSF9VTklUUyIsIlBBVFRFUk5fTlVNRVJJQyIsIk1TRyIsImxpbmVDYWNoZSIsImNoZWNrIiwicG9zdGNzcyIsInBsdWdpbiIsImNzcyIsInJlc3VsdCIsIm9wdHMiLCJydWxlVmFsIiwid2Fsa0RlY2xzIiwicGFydHMiLCJsaXN0Iiwic3BhY2UiLCJkZWNsIiwidmFsdWUiLCJpIiwibGVuIiwibGVuZ3RoIiwicGFydCIsIm51bWVyaWNWYWwiLCJwYXJzZUZsb2F0IiwidW5pdCIsInJlcGxhY2UiLCJzb3VyY2UiLCJsaW5lIiwic3RhcnQiLCJpbmRleE9mIiwibGluZUNvbnRlbnQiLCJpbnB1dCIsIndhcm4iLCJub2RlIiwicnVsZU5hbWUiLCJjb2wiLCJjb2x1bW4iLCJwcm9wIiwicmF3cyIsImJldHdlZW4iLCJtZXNzYWdlIiwiY29sb3JNZXNzYWdlIiwiY2hhbGsiLCJtYWdlbnRhIiwiZ3JleSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQU9BOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUVBOztBQUVBOzs7Ozs7QUFiQTs7Ozs7OztBQW1CQSxJQUFNQSxXQUFXLFdBQWpCOztBQUVBOzs7Ozs7O0FBT0EsSUFBTUMsZUFBZTtBQUNqQjtBQUNBLElBRmlCLEVBRVgsSUFGVyxFQUVMLElBRkssRUFFQyxLQUZELEVBRVE7QUFDekIsSUFIaUIsRUFHWCxJQUhXLEVBR0wsTUFISyxFQUdHLE1BSEgsRUFHVzs7QUFFNUI7QUFDQSxJQU5pQixFQU1YLElBTlcsRUFNTCxJQU5LLEVBTUMsSUFORCxFQU1PLElBTlAsRUFNYSxJQU5iLENBQXJCOztBQVNBOzs7Ozs7QUFNQSxJQUFNQyxrQkFBa0IsWUFBeEI7O0FBRUE7Ozs7OztBQU1BLElBQU1DLE1BQU0sNkNBQVo7O0FBRUE7Ozs7O0FBS0EsSUFBSUMsWUFBWSxDQUFoQjs7QUFFQTs7Ozs7Ozs7QUFRTyxJQUFNQyx3QkFBUUMsa0JBQVFDLE1BQVIsQ0FBZVAsUUFBZixFQUF5QjtBQUFBLFdBQzFDLFVBQUNRLEdBQUQsRUFBTUMsTUFBTixFQUFpQjtBQUNiLFlBQUksQ0FBQ0MsS0FBS0MsT0FBVixFQUFtQjtBQUNmO0FBQ0g7O0FBRURQLG9CQUFZLENBQVo7O0FBRUFJLFlBQUlJLFNBQUosQ0FBYyxnQkFBUTtBQUNsQixnQkFBTUMsUUFBUVAsa0JBQVFRLElBQVIsQ0FBYUMsS0FBYixDQUFtQkMsS0FBS0MsS0FBeEIsQ0FBZDtBQUNBLGlCQUFLLElBQUlDLElBQUksQ0FBUixFQUFXQyxNQUFNTixNQUFNTyxNQUE1QixFQUFvQ0YsSUFBSUMsR0FBeEMsRUFBNkNELEdBQTdDLEVBQWtEO0FBQzlDLG9CQUFNRyxPQUFPUixNQUFNSyxDQUFOLENBQWI7QUFDQSxvQkFBTUksYUFBYUMsV0FBV0YsSUFBWCxDQUFuQjs7QUFFQTtBQUNBLG9CQUFJQyxlQUFlLENBQW5CLEVBQXNCO0FBQ2xCLHdCQUFNRSxPQUFPSCxLQUFLSSxPQUFMLENBQWF2QixlQUFiLEVBQThCLEVBQTlCLENBQWI7QUFDQSx3QkFBTXdCLFNBQVNWLEtBQUtVLE1BQXBCO0FBQ0Esd0JBQU1DLE9BQU9ELE9BQU9FLEtBQVAsQ0FBYUQsSUFBMUI7QUFDQSx3QkFBSTFCLGFBQWE0QixPQUFiLENBQXFCTCxJQUFyQixJQUE2QixDQUFDLENBQTlCLElBQW1DcEIsY0FBY3VCLElBQXJELEVBQTJEO0FBQ3ZEdkIsb0NBQVl1QixJQUFaO0FBQ0EsNEJBQU1HLGNBQWMsMEJBQWVILElBQWYsRUFBcUJELE9BQU9LLEtBQVAsQ0FBYXZCLEdBQWxDLENBQXBCO0FBQ0FDLCtCQUFPdUIsSUFBUCxDQUFZaEMsUUFBWixFQUFzQjtBQUNsQmlDLGtDQUFNakIsSUFEWTtBQUVsQmtCLHNDQUFVbEMsUUFGUTtBQUdsQjJCLGtDQUFNQSxJQUhZO0FBSWxCUSxpQ0FBS1QsT0FBT0UsS0FBUCxDQUFhUSxNQUFiLEdBQXNCcEIsS0FBS3FCLElBQUwsQ0FBVWpCLE1BQWhDLEdBQXlDSixLQUFLc0IsSUFBTCxDQUFVQyxPQUFWLENBQWtCbkIsTUFKOUM7QUFLbEJvQixxQ0FBU3JDLEdBTFM7QUFNbEJzQywwQ0FBYyxNQUNSWCxZQUFZTCxPQUFaLENBQ0VULEtBQUtDLEtBRFAsRUFFRXlCLGdCQUFNQyxPQUFOLENBQWMzQixLQUFLQyxLQUFuQixDQUZGLENBRFEsR0FLUixJQUxRLEdBTVJ5QixnQkFBTUUsSUFBTixDQUFXekMsR0FBWDtBQVpZLHlCQUF0QjtBQWNIO0FBQ0o7QUFDSjtBQUNKLFNBL0JEO0FBZ0NILEtBeEN5QztBQUFBLENBQXpCLENBQWQiLCJmaWxlIjoiemVyby11bml0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSAwIOWAvOajgOmqjFxuICogICAgICAg5bGe5oCn5YC85Li6IDAg5pe277yM5b+F6aG755yB55Wl5Y+v55yB55qE5Y2V5L2N77yI6ZW/5bqm5Y2V5L2N5aaCIHB444CBZW3vvIzkuI3ljIXmi6zml7bpl7TjgIHop5LluqbnrYnlpoIgc+OAgWRlZ++8iVxuICogICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2Vjb21mZS9zcGVjL2Jsb2IvbWFzdGVyL2xlc3MtY29kZS1zdHlsZS5tZCMwLSVFNSU4MCVCQ1xuICogQGF1dGhvciBpZWxnbmF3KHd1amkwMjIzQGdtYWlsLmNvbSlcbiAqL1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHBvc3Rjc3MgZnJvbSAncG9zdGNzcyc7XG5pbXBvcnQge2dldExpbmVDb250ZW50fSBmcm9tICcuLi91dGlsJztcblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIOinhOWImeWQjeensFxuICpcbiAqIEBjb25zdFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgUlVMRU5BTUUgPSAnemVyby11bml0JztcblxuLyoqXG4gKiBjc3Mg6ZW/5bqm5Y2V5L2N6ZuG5ZCIXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvbGVuZ3RoXG4gKlxuICogQGNvbnN0XG4gKiBAdHlwZSB7QXJyYXl9XG4gKi9cbmNvbnN0IExFTkdUSF9VTklUUyA9IFtcbiAgICAvLyBSZWxhdGl2ZSBsZW5ndGggdW5pdHNcbiAgICAnZW0nLCAnZXgnLCAnY2gnLCAncmVtJywgLy8gRm9udC1yZWxhdGl2ZSBsZW5ndGhzXG4gICAgJ3ZoJywgJ3Z3JywgJ3ZtaW4nLCAndm1heCcsIC8vIFZpZXdwb3J0LXBlcmNlbnRhZ2UgbGVuZ3Roc1xuXG4gICAgLy8gQWJzb2x1dGUgbGVuZ3RoIHVuaXRzXG4gICAgJ3B4JywgJ21tJywgJ2NtJywgJ2luJywgJ3B0JywgJ3BjJ1xuXTtcblxuLyoqXG4gKiDmlbDlrZfmraPliJlcbiAqXG4gKiBAY29uc3RcbiAqIEB0eXBlIHtSZWdFeHB9XG4gKi9cbmNvbnN0IFBBVFRFUk5fTlVNRVJJQyA9IC9cXGQrW1xcLlxcZF0qLztcblxuLyoqXG4gKiDplJnor6/kv6Hmga9cbiAqXG4gKiBAY29uc3RcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IE1TRyA9ICdWYWx1ZXMgb2YgMCBzaG91bGRuXFwndCBoYXZlIHVuaXRzIHNwZWNpZmllZCc7XG5cbi8qKlxuICog6KGM5Y+355qE57yT5a2Y77yM6Ziy5q2i5ZCM5LiA6KGM5aSa5qyh5oql6ZSZXG4gKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xubGV0IGxpbmVDYWNoZSA9IDA7XG5cbi8qKlxuICog5YW35L2T55qE5qOA5rWL6YC76L6RXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMg5Y+C5pWwXG4gKiBAcGFyYW0geyp9IG9wdHMucnVsZVZhbCDlvZPliY3op4TliJnlhbfkvZPphY3nva7nmoTlgLxcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmZpbGVDb250ZW50IOaWh+S7tuWGheWuuVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdHMuZmlsZVBhdGgg5paH5Lu26Lev5b6EXG4gKi9cbmV4cG9ydCBjb25zdCBjaGVjayA9IHBvc3Rjc3MucGx1Z2luKFJVTEVOQU1FLCBvcHRzID0+XG4gICAgKGNzcywgcmVzdWx0KSA9PiB7XG4gICAgICAgIGlmICghb3B0cy5ydWxlVmFsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsaW5lQ2FjaGUgPSAwO1xuXG4gICAgICAgIGNzcy53YWxrRGVjbHMoZGVjbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHBvc3Rjc3MubGlzdC5zcGFjZShkZWNsLnZhbHVlKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBwYXJ0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBudW1lcmljVmFsID0gcGFyc2VGbG9hdChwYXJ0KTtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE86IGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigjZmZmLCAwcHgpO1xuICAgICAgICAgICAgICAgIGlmIChudW1lcmljVmFsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaXQgPSBwYXJ0LnJlcGxhY2UoUEFUVEVSTl9OVU1FUklDLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGRlY2wuc291cmNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lID0gc291cmNlLnN0YXJ0LmxpbmU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChMRU5HVEhfVU5JVFMuaW5kZXhPZih1bml0KSA+IC0xICYmIGxpbmVDYWNoZSAhPT0gbGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZUNhY2hlID0gbGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVDb250ZW50ID0gZ2V0TGluZUNvbnRlbnQobGluZSwgc291cmNlLmlucHV0LmNzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQud2FybihSVUxFTkFNRSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IGRlY2wsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU5hbWU6IFJVTEVOQU1FLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IGxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sOiBzb3VyY2Uuc3RhcnQuY29sdW1uICsgZGVjbC5wcm9wLmxlbmd0aCArIGRlY2wucmF3cy5iZXR3ZWVuLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBNU0csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JNZXNzYWdlOiAnYCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsaW5lQ29udGVudC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYWxrLm1hZ2VudGEoZGVjbC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICdgICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjaGFsay5ncmV5KE1TRylcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4pO1xuIl19