diff --git a/lib/rules/length-zero-no-unit/index.js b/lib/rules/length-zero-no-unit/index.js index d92c67df5a..b5acc33aaf 100644 --- a/lib/rules/length-zero-no-unit/index.js +++ b/lib/rules/length-zero-no-unit/index.js @@ -5,6 +5,7 @@ const beforeBlockString = require('../../utils/beforeBlockString'); const blurComments = require('../../utils/blurComments'); const hasBlock = require('../../utils/hasBlock'); const isCustomProperty = require('../../utils/isCustomProperty'); +const isLessVariable = require('../../utils/isLessVariable'); const isMathFunction = require('../../utils/isMathFunction'); const keywordSets = require('../../reference/keywordSets'); const optionsMatches = require('../../utils/optionsMatches'); @@ -66,7 +67,7 @@ const rule = function(actual, secondary, context) { root.walkAtRules((atRule) => { // Ignore Less variables - if (atRule.variable && !hasBlock(atRule)) { + if (isLessVariable(atRule)) { return; } diff --git a/lib/utils/__tests__/isLessVariable.test.js b/lib/utils/__tests__/isLessVariable.test.js new file mode 100644 index 0000000000..a49c83c7cc --- /dev/null +++ b/lib/utils/__tests__/isLessVariable.test.js @@ -0,0 +1,46 @@ +'use strict'; + +const isLessVariable = require('../isLessVariable'); +const less = require('postcss-less'); + +describe('isLessVariable', () => { + it('is less variable', () => { + lessAtRules('@var: 10px;', (atRule) => { + expect(isLessVariable(atRule)).toBeTruthy(); + }); + }); + + it('is less variable with function', () => { + lessAtRules('@hover-color: darken(@color, 10%);', (atRule) => { + expect(isLessVariable(atRule)).toBeTruthy(); + }); + }); + + it('@charset is not a less variable', () => { + lessAtRules('@charset UTF-8;', (atRule) => { + expect(isLessVariable(atRule)).toBeFalsy(); + }); + }); + + it('@import is not a less variable', () => { + lessAtRules('@import url("some-styles.css");', (atRule) => { + expect(isLessVariable(atRule)).toBeFalsy(); + }); + }); + + it('@media is not a less variable', () => { + lessAtRules('@media (min-width: 100px) {};', (atRule) => { + expect(isLessVariable(atRule)).toBeFalsy(); + }); + }); + + it('detached ruleset is not a less variable', () => { + lessAtRules('@detached-ruleset: { margin: 0 };', (atRule) => { + expect(isLessVariable(atRule)).toBeFalsy(); + }); + }); +}); + +function lessAtRules(css, cb) { + less.parse(css).walkAtRules(cb); +} diff --git a/lib/utils/isLessVariable.js b/lib/utils/isLessVariable.js new file mode 100644 index 0000000000..e873a4266c --- /dev/null +++ b/lib/utils/isLessVariable.js @@ -0,0 +1,8 @@ +/* @flow */ +'use strict'; + +const hasBlock = require('./hasBlock'); + +module.exports = function(atRule /*: Object*/) /*: boolean*/ { + return atRule.type === 'atrule' && atRule.variable && !hasBlock(atRule); +};