From e4ab13be61a5a8c54392892fc84e067d6900bb7f Mon Sep 17 00:00:00 2001 From: Drew Hays Date: Thu, 4 Mar 2021 21:33:31 -0800 Subject: [PATCH 1/2] Create utils for getting and setting declaration values This change adds two utility functions, `getDeclarationValue` and `setDeclarationValue`, that replace a pattern found across many rule files. --- lib/rules/alpha-value-notation/index.js | 17 ++++------------ lib/rules/color-function-notation/index.js | 17 ++++------------ lib/rules/color-hex-case/index.js | 15 ++++---------- lib/rules/color-hex-length/index.js | 15 ++++---------- .../declaration-bang-space-after/index.js | 10 ++++------ .../declaration-bang-space-before/index.js | 10 ++++------ .../index.js | 12 +++++------ lib/rules/function-max-empty-lines/index.js | 10 ++++------ lib/rules/function-name-case/index.js | 12 ++++------- .../index.js | 11 ++++------ .../index.js | 11 ++++------ lib/rules/function-whitespace-after/index.js | 10 ++++------ lib/rules/functionCommaSpaceChecker.js | 11 ++++------ lib/rules/hue-degree-notation/index.js | 17 ++++------------ lib/rules/value-keyword-case/index.js | 3 ++- .../value-list-comma-newline-after/index.js | 10 ++++------ .../value-list-comma-space-after/index.js | 10 ++++------ .../value-list-comma-space-before/index.js | 10 ++++------ lib/rules/value-list-max-empty-lines/index.js | 10 ++++------ lib/utils/getDeclarationValue.js | 11 ++++++++++ lib/utils/setDeclarationValue.js | 20 +++++++++++++++++++ 21 files changed, 106 insertions(+), 146 deletions(-) create mode 100644 lib/utils/getDeclarationValue.js create mode 100644 lib/utils/setDeclarationValue.js diff --git a/lib/rules/alpha-value-notation/index.js b/lib/rules/alpha-value-notation/index.js index 9244a7359a..066e957fb5 100644 --- a/lib/rules/alpha-value-notation/index.js +++ b/lib/rules/alpha-value-notation/index.js @@ -6,10 +6,12 @@ const _ = require('lodash'); const valueParser = require('postcss-value-parser'); const declarationValueIndex = require('../../utils/declarationValueIndex'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const isStandardSyntaxValue = require('../../utils/isStandardSyntaxValue'); const optionsMatches = require('../../utils/optionsMatches'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); +const setDeclarationValue = require('../../utils/setDeclarationValue'); const validateOptions = require('../../utils/validateOptions'); const ruleName = 'alpha-value-notation'; @@ -43,7 +45,7 @@ function rule(primary, options, context) { root.walkDecls((decl) => { let needsFix = false; - const parsedValue = valueParser(getValue(decl)); + const parsedValue = valueParser(getDeclarationValue(decl)); parsedValue.walk((node) => { let alpha; @@ -105,7 +107,7 @@ function rule(primary, options, context) { }); if (needsFix) { - setValue(decl, parsedValue.toString()); + setDeclarationValue(decl, parsedValue.toString()); } }); }; @@ -153,17 +155,6 @@ function isNumber(value) { return unit === ''; } -function getValue(decl) { - return decl.raws.value ? decl.raws.value.raw : decl.value; -} - -function setValue(decl, value) { - if (decl.raws.value) decl.raws.value.raw = value; - else decl.value = value; - - return decl; -} - rule.ruleName = ruleName; rule.messages = messages; module.exports = rule; diff --git a/lib/rules/color-function-notation/index.js b/lib/rules/color-function-notation/index.js index f6b881104c..46c07ecf50 100644 --- a/lib/rules/color-function-notation/index.js +++ b/lib/rules/color-function-notation/index.js @@ -5,8 +5,10 @@ const valueParser = require('postcss-value-parser'); const declarationValueIndex = require('../../utils/declarationValueIndex'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); +const setDeclarationValue = require('../../utils/setDeclarationValue'); const validateOptions = require('../../utils/validateOptions'); const ruleName = 'color-function-notation'; @@ -29,7 +31,7 @@ function rule(primary, secondary, context) { root.walkDecls((decl) => { let needsFix = false; - const parsedValue = valueParser(getValue(decl)); + const parsedValue = valueParser(getDeclarationValue(decl)); parsedValue.walk((node) => { const { value, type, sourceIndex, nodes } = node; @@ -83,7 +85,7 @@ function rule(primary, secondary, context) { }); if (needsFix) { - setValue(decl, parsedValue.toString()); + setDeclarationValue(decl, parsedValue.toString()); } }); }; @@ -101,17 +103,6 @@ function hasCommas(node) { return node.nodes && node.nodes.some((childNode) => isComma(childNode)); } -function getValue(decl) { - return decl.raws.value ? decl.raws.value.raw : decl.value; -} - -function setValue(decl, value) { - if (decl.raws.value) decl.raws.value.raw = value; - else decl.value = value; - - return decl; -} - rule.ruleName = ruleName; rule.messages = messages; module.exports = rule; diff --git a/lib/rules/color-hex-case/index.js b/lib/rules/color-hex-case/index.js index 2d55ce67e8..dd628f468e 100644 --- a/lib/rules/color-hex-case/index.js +++ b/lib/rules/color-hex-case/index.js @@ -5,8 +5,10 @@ const valueParser = require('postcss-value-parser'); const declarationValueIndex = require('../../utils/declarationValueIndex'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); +const setDeclarationValue = require('../../utils/setDeclarationValue'); const validateOptions = require('../../utils/validateOptions'); const ruleName = 'color-hex-case'; @@ -30,7 +32,7 @@ function rule(expectation, options, context) { } root.walkDecls((decl) => { - const parsedValue = valueParser(getValue(decl)); + const parsedValue = valueParser(getDeclarationValue(decl)); let needsFix = false; parsedValue.walk((node) => { @@ -61,7 +63,7 @@ function rule(expectation, options, context) { }); if (needsFix) { - setValue(decl, parsedValue.toString()); + setDeclarationValue(decl, parsedValue.toString()); } }); }; @@ -75,15 +77,6 @@ function isHexColor({ type, value }) { return type === 'word' && HEX.test(value); } -function getValue(decl) { - return decl.raws.value ? decl.raws.value.raw : decl.value; -} - -function setValue(decl, value) { - if (decl.raws.value) decl.raws.value.raw = value; - else decl.value = value; -} - rule.ruleName = ruleName; rule.messages = messages; module.exports = rule; diff --git a/lib/rules/color-hex-length/index.js b/lib/rules/color-hex-length/index.js index 0eff2d9189..2d2ecefcbf 100644 --- a/lib/rules/color-hex-length/index.js +++ b/lib/rules/color-hex-length/index.js @@ -5,8 +5,10 @@ const valueParser = require('postcss-value-parser'); const declarationValueIndex = require('../../utils/declarationValueIndex'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); +const setDeclarationValue = require('../../utils/setDeclarationValue'); const validateOptions = require('../../utils/validateOptions'); const ruleName = 'color-hex-length'; @@ -30,7 +32,7 @@ function rule(expectation, _, context) { } root.walkDecls((decl) => { - const parsedValue = valueParser(getValue(decl)); + const parsedValue = valueParser(getDeclarationValue(decl)); let needsFix = false; parsedValue.walk((node) => { @@ -68,7 +70,7 @@ function rule(expectation, _, context) { }); if (needsFix) { - setValue(decl, parsedValue.toString()); + setDeclarationValue(decl, parsedValue.toString()); } }); }; @@ -113,15 +115,6 @@ function isHexColor({ type, value }) { return type === 'word' && HEX.test(value); } -function getValue(decl) { - return decl.raws.value ? decl.raws.value.raw : decl.value; -} - -function setValue(decl, value) { - if (decl.raws.value) decl.raws.value.raw = value; - else decl.value = value; -} - rule.ruleName = ruleName; rule.messages = messages; module.exports = rule; diff --git a/lib/rules/declaration-bang-space-after/index.js b/lib/rules/declaration-bang-space-after/index.js index 0b64cd4b91..c01b3322c0 100644 --- a/lib/rules/declaration-bang-space-after/index.js +++ b/lib/rules/declaration-bang-space-after/index.js @@ -4,7 +4,9 @@ const declarationBangSpaceChecker = require('../declarationBangSpaceChecker'); const declarationValueIndex = require('../../utils/declarationValueIndex'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const ruleMessages = require('../../utils/ruleMessages'); +const setDeclarationValue = require('../../utils/setDeclarationValue'); const validateOptions = require('../../utils/validateOptions'); const whitespaceChecker = require('../../utils/whitespaceChecker'); @@ -36,7 +38,7 @@ function rule(expectation, options, context) { fix: context.fix ? (decl, index) => { let bangIndex = index - declarationValueIndex(decl); - const value = decl.raws.value ? decl.raws.value.raw : decl.value; + const value = getDeclarationValue(decl); let target; let setFixed; @@ -45,11 +47,7 @@ function rule(expectation, options, context) { // TODO: Issue #4985 // eslint-disable-next-line no-shadow setFixed = (value) => { - if (decl.raws.value) { - decl.raws.value.raw = value; - } else { - decl.value = value; - } + setDeclarationValue(decl, value); }; } else if (decl.important) { target = decl.raws.important || ' !important'; diff --git a/lib/rules/declaration-bang-space-before/index.js b/lib/rules/declaration-bang-space-before/index.js index 0ecbb09680..f3e81baa51 100644 --- a/lib/rules/declaration-bang-space-before/index.js +++ b/lib/rules/declaration-bang-space-before/index.js @@ -4,7 +4,9 @@ const declarationBangSpaceChecker = require('../declarationBangSpaceChecker'); const declarationValueIndex = require('../../utils/declarationValueIndex'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const ruleMessages = require('../../utils/ruleMessages'); +const setDeclarationValue = require('../../utils/setDeclarationValue'); const validateOptions = require('../../utils/validateOptions'); const whitespaceChecker = require('../../utils/whitespaceChecker'); @@ -36,18 +38,14 @@ function rule(expectation, options, context) { fix: context.fix ? (decl, index) => { let bangIndex = index - declarationValueIndex(decl); - const value = decl.raws.value ? decl.raws.value.raw : decl.value; + const value = getDeclarationValue(decl); let target; let setFixed; if (bangIndex < value.length) { target = value; setFixed = (val) => { - if (decl.raws.value) { - decl.raws.value.raw = val; - } else { - decl.value = val; - } + setDeclarationValue(decl, val); }; } else if (decl.important) { target = decl.raws.important || ' !important'; diff --git a/lib/rules/declaration-block-semicolon-space-before/index.js b/lib/rules/declaration-block-semicolon-space-before/index.js index c140b1584c..2ba8e71b3e 100644 --- a/lib/rules/declaration-block-semicolon-space-before/index.js +++ b/lib/rules/declaration-block-semicolon-space-before/index.js @@ -3,8 +3,10 @@ 'use strict'; const blockString = require('../../utils/blockString'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); +const setDeclarationValue = require('../../utils/setDeclarationValue'); const validateOptions = require('../../utils/validateOptions'); const whitespaceChecker = require('../../utils/whitespaceChecker'); @@ -48,15 +50,13 @@ function rule(expectation, options, context) { lineCheckStr: blockString(parentRule), err: (m) => { if (context.fix) { - const value = decl.raws.value ? decl.raws.value.raw : decl.value; + const value = getDeclarationValue(decl); if (expectation.startsWith('always')) { if (decl.important) { decl.raws.important = ' !important '; - } else if (decl.raws.value) { - decl.raws.value.raw = value.replace(/\s*$/, ' '); } else { - decl.value = value.replace(/\s*$/, ' '); + setDeclarationValue(decl, value.replace(/\s*$/, ' ')); } return; @@ -65,10 +65,8 @@ function rule(expectation, options, context) { if (expectation.startsWith('never')) { if (decl.important) { decl.raws.important = decl.raws.important.replace(/\s*$/, ''); - } else if (decl.raws.value) { - decl.raws.value.raw = value.replace(/\s*$/, ''); } else { - decl.value = value.replace(/\s*$/, ''); + setDeclarationValue(decl, value.replace(/\s*$/, '')); } return; diff --git a/lib/rules/function-max-empty-lines/index.js b/lib/rules/function-max-empty-lines/index.js index 6bbc472956..9533c142c5 100644 --- a/lib/rules/function-max-empty-lines/index.js +++ b/lib/rules/function-max-empty-lines/index.js @@ -3,8 +3,10 @@ 'use strict'; const _ = require('lodash'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); +const setDeclarationValue = require('../../utils/setDeclarationValue'); const validateOptions = require('../../utils/validateOptions'); const valueParser = require('postcss-value-parser'); @@ -41,7 +43,7 @@ function rule(max, options, context) { return; } - const stringValue = decl.raws.value ? decl.raws.value.raw : decl.value; + const stringValue = getDeclarationValue(decl); const splittedValue = []; let sourceIndexStart = 0; @@ -88,11 +90,7 @@ function rule(max, options, context) { splittedValue.reduce((acc, curr) => acc + curr[0] + curr[1], '') + stringValue.slice(sourceIndexStart); - if (decl.raws.value) { - decl.raws.value.raw = updatedValue; - } else { - decl.value = updatedValue; - } + setDeclarationValue(decl, updatedValue); } }); }; diff --git a/lib/rules/function-name-case/index.js b/lib/rules/function-name-case/index.js index 39c6377d14..e5e865144d 100644 --- a/lib/rules/function-name-case/index.js +++ b/lib/rules/function-name-case/index.js @@ -4,11 +4,13 @@ const _ = require('lodash'); const declarationValueIndex = require('../../utils/declarationValueIndex'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const isStandardSyntaxFunction = require('../../utils/isStandardSyntaxFunction'); const keywordSets = require('../../reference/keywordSets'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); +const setDeclarationValue = require('../../utils/setDeclarationValue'); const validateOptions = require('../../utils/validateOptions'); const valueParser = require('postcss-value-parser'); @@ -48,7 +50,7 @@ function rule(expectation, options, context) { root.walkDecls((decl) => { let needFix = false; - const parsed = valueParser(decl.raws.value ? decl.raws.value.raw : decl.value); + const parsed = valueParser(getDeclarationValue(decl)); parsed.walk((node) => { if (node.type !== 'function' || !isStandardSyntaxFunction(node)) { @@ -98,13 +100,7 @@ function rule(expectation, options, context) { }); if (context.fix && needFix) { - const statement = parsed.toString(); - - if (decl.raws.value) { - decl.raws.value.raw = statement; - } else { - decl.value = statement; - } + setDeclarationValue(decl, parsed.toString()); } }); }; diff --git a/lib/rules/function-parentheses-newline-inside/index.js b/lib/rules/function-parentheses-newline-inside/index.js index 9ec93ee512..71774d02c4 100644 --- a/lib/rules/function-parentheses-newline-inside/index.js +++ b/lib/rules/function-parentheses-newline-inside/index.js @@ -2,12 +2,13 @@ 'use strict'; -const _ = require('lodash'); const declarationValueIndex = require('../../utils/declarationValueIndex'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const isSingleLineString = require('../../utils/isSingleLineString'); const isStandardSyntaxFunction = require('../../utils/isStandardSyntaxFunction'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); +const setDeclarationValue = require('../../utils/setDeclarationValue'); const validateOptions = require('../../utils/validateOptions'); const valueParser = require('postcss-value-parser'); @@ -39,7 +40,7 @@ function rule(expectation, options, context) { } let hasFixed = false; - const declValue = _.get(decl, 'raws.value.raw', decl.value); + const declValue = getDeclarationValue(decl); const parsedValue = valueParser(declValue); parsedValue.walk((valueNode) => { @@ -124,11 +125,7 @@ function rule(expectation, options, context) { }); if (hasFixed) { - if (!decl.raws.value) { - decl.value = parsedValue.toString(); - } else { - decl.raws.value.raw = parsedValue.toString(); - } + setDeclarationValue(decl, parsedValue.toString()); } function complain(message, offset) { diff --git a/lib/rules/function-parentheses-space-inside/index.js b/lib/rules/function-parentheses-space-inside/index.js index 7875c5c533..a7806de753 100644 --- a/lib/rules/function-parentheses-space-inside/index.js +++ b/lib/rules/function-parentheses-space-inside/index.js @@ -2,12 +2,13 @@ 'use strict'; -const _ = require('lodash'); const declarationValueIndex = require('../../utils/declarationValueIndex'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const isSingleLineString = require('../../utils/isSingleLineString'); const isStandardSyntaxFunction = require('../../utils/isStandardSyntaxFunction'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); +const setDeclarationValue = require('../../utils/setDeclarationValue'); const validateOptions = require('../../utils/validateOptions'); const valueParser = require('postcss-value-parser'); @@ -41,7 +42,7 @@ function rule(expectation, options, context) { } let hasFixed = false; - const declValue = _.get(decl, 'raws.value.raw', decl.value); + const declValue = getDeclarationValue(decl); const parsedValue = valueParser(declValue); parsedValue.walk((valueNode) => { @@ -143,11 +144,7 @@ function rule(expectation, options, context) { }); if (hasFixed) { - if (!decl.raws.value) { - decl.value = parsedValue.toString(); - } else { - decl.raws.value.raw = parsedValue.toString(); - } + setDeclarationValue(decl, parsedValue.toString()); } function complain(message, offset) { diff --git a/lib/rules/function-whitespace-after/index.js b/lib/rules/function-whitespace-after/index.js index bff0590afa..0ab3f8e287 100644 --- a/lib/rules/function-whitespace-after/index.js +++ b/lib/rules/function-whitespace-after/index.js @@ -5,9 +5,11 @@ const _ = require('lodash'); const atRuleParamIndex = require('../../utils/atRuleParamIndex'); const declarationValueIndex = require('../../utils/declarationValueIndex'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const isWhitespace = require('../../utils/isWhitespace'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); +const setDeclarationValue = require('../../utils/setDeclarationValue'); const styleSearch = require('style-search'); const validateOptions = require('../../utils/validateOptions'); @@ -148,17 +150,13 @@ function rule(expectation, options, context) { } }); root.walkDecls((decl) => { - const value = _.get(decl, 'raws.value.raw', decl.value); + const value = getDeclarationValue(decl); const fixer = context.fix && createFixer(value); check(decl, value, declarationValueIndex, fixer && fixer.applyFix); if (fixer && fixer.hasFixed) { - if (decl.raws.value) { - decl.raws.value.raw = fixer.fixed; - } else { - decl.value = fixer.fixed; - } + setDeclarationValue(decl, fixer.fixed); } }); }; diff --git a/lib/rules/functionCommaSpaceChecker.js b/lib/rules/functionCommaSpaceChecker.js index e3ccdd3a76..a4a237035b 100644 --- a/lib/rules/functionCommaSpaceChecker.js +++ b/lib/rules/functionCommaSpaceChecker.js @@ -2,15 +2,16 @@ 'use strict'; -const _ = require('lodash'); const declarationValueIndex = require('../utils/declarationValueIndex'); +const getDeclarationValue = require('../utils/getDeclarationValue'); const isStandardSyntaxFunction = require('../utils/isStandardSyntaxFunction'); const report = require('../utils/report'); +const setDeclarationValue = require('../utils/setDeclarationValue'); const valueParser = require('postcss-value-parser'); module.exports = function (opts) { opts.root.walkDecls((decl) => { - const declValue = _.get(decl, 'raws.value.raw', decl.value); + const declValue = getDeclarationValue(decl); let hasFixed; const parsedValue = valueParser(declValue); @@ -102,11 +103,7 @@ module.exports = function (opts) { }); if (hasFixed) { - if (!decl.raws.value) { - decl.value = parsedValue.toString(); - } else { - decl.raws.value.raw = parsedValue.toString(); - } + setDeclarationValue(decl, parsedValue.toString()); } }); }; diff --git a/lib/rules/hue-degree-notation/index.js b/lib/rules/hue-degree-notation/index.js index 69c6d28f24..ee31599650 100644 --- a/lib/rules/hue-degree-notation/index.js +++ b/lib/rules/hue-degree-notation/index.js @@ -5,9 +5,11 @@ const valueParser = require('postcss-value-parser'); const declarationValueIndex = require('../../utils/declarationValueIndex'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const isStandardSyntaxValue = require('../../utils/isStandardSyntaxValue'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); +const setDeclarationValue = require('../../utils/setDeclarationValue'); const validateOptions = require('../../utils/validateOptions'); const ruleName = 'hue-degree-notation'; @@ -31,7 +33,7 @@ function rule(primary, secondary, context) { root.walkDecls((decl) => { let needsFix = false; - const parsedValue = valueParser(getValue(decl)); + const parsedValue = valueParser(getDeclarationValue(decl)); parsedValue.walk((node) => { if (node.type !== 'function') return; @@ -72,7 +74,7 @@ function rule(primary, secondary, context) { }); if (needsFix) { - setValue(decl, parsedValue.toString()); + setDeclarationValue(decl, parsedValue.toString()); } }); }; @@ -115,17 +117,6 @@ function isNumber(value) { return unit === ''; } -function getValue(decl) { - return decl.raws.value ? decl.raws.value.raw : decl.value; -} - -function setValue(decl, value) { - if (decl.raws.value) decl.raws.value.raw = value; - else decl.value = value; - - return decl; -} - rule.ruleName = ruleName; rule.messages = messages; module.exports = rule; diff --git a/lib/rules/value-keyword-case/index.js b/lib/rules/value-keyword-case/index.js index 8c57a6d283..d4f0d969ff 100644 --- a/lib/rules/value-keyword-case/index.js +++ b/lib/rules/value-keyword-case/index.js @@ -4,6 +4,7 @@ const _ = require('lodash'); const declarationValueIndex = require('../../utils/declarationValueIndex'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const getUnitFromValueNode = require('../../utils/getUnitFromValueNode'); const isCounterIncrementCustomIdentValue = require('../../utils/isCounterIncrementCustomIdentValue'); const isCounterResetCustomIdentValue = require('../../utils/isCounterResetCustomIdentValue'); @@ -61,7 +62,7 @@ function rule(expectation, options, context) { const propLowerCase = decl.prop.toLowerCase(); const value = decl.value; - const parsed = valueParser(decl.raws.value ? decl.raws.value.raw : decl.value); + const parsed = valueParser(getDeclarationValue(decl)); let needFix = false; diff --git a/lib/rules/value-list-comma-newline-after/index.js b/lib/rules/value-list-comma-newline-after/index.js index b6992b7399..a090593beb 100644 --- a/lib/rules/value-list-comma-newline-after/index.js +++ b/lib/rules/value-list-comma-newline-after/index.js @@ -3,7 +3,9 @@ 'use strict'; const declarationValueIndex = require('../../utils/declarationValueIndex'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const ruleMessages = require('../../utils/ruleMessages'); +const setDeclarationValue = require('../../utils/setDeclarationValue'); const validateOptions = require('../../utils/validateOptions'); const valueListCommaWhitespaceChecker = require('../valueListCommaWhitespaceChecker'); const whitespaceChecker = require('../../utils/whitespaceChecker'); @@ -75,7 +77,7 @@ function rule(expectation, options, context) { .sort((a, b) => a - b) .reverse() .forEach((index) => { - const value = decl.raws.value ? decl.raws.value.raw : decl.value; + const value = getDeclarationValue(decl); const valueIndex = index - declarationValueIndex(decl); const beforeValue = value.slice(0, valueIndex + 1); let afterValue = value.slice(valueIndex + 1); @@ -86,11 +88,7 @@ function rule(expectation, options, context) { afterValue = afterValue.replace(/^\s*/, ''); } - if (decl.raws.value) { - decl.raws.value.raw = beforeValue + afterValue; - } else { - decl.value = beforeValue + afterValue; - } + setDeclarationValue(decl, beforeValue + afterValue); }); }); } diff --git a/lib/rules/value-list-comma-space-after/index.js b/lib/rules/value-list-comma-space-after/index.js index 4ae54a4c6f..3bfd1b782c 100644 --- a/lib/rules/value-list-comma-space-after/index.js +++ b/lib/rules/value-list-comma-space-after/index.js @@ -3,7 +3,9 @@ 'use strict'; const declarationValueIndex = require('../../utils/declarationValueIndex'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const ruleMessages = require('../../utils/ruleMessages'); +const setDeclarationValue = require('../../utils/setDeclarationValue'); const validateOptions = require('../../utils/validateOptions'); const valueListCommaWhitespaceChecker = require('../valueListCommaWhitespaceChecker'); const whitespaceChecker = require('../../utils/whitespaceChecker'); @@ -61,7 +63,7 @@ function rule(expectation, options, context) { commaIndices .sort((a, b) => b - a) .forEach((index) => { - const value = decl.raws.value ? decl.raws.value.raw : decl.value; + const value = getDeclarationValue(decl); const valueIndex = index - declarationValueIndex(decl); const beforeValue = value.slice(0, valueIndex + 1); let afterValue = value.slice(valueIndex + 1); @@ -72,11 +74,7 @@ function rule(expectation, options, context) { afterValue = afterValue.replace(/^\s*/, ''); } - if (decl.raws.value) { - decl.raws.value.raw = beforeValue + afterValue; - } else { - decl.value = beforeValue + afterValue; - } + setDeclarationValue(decl, beforeValue + afterValue); }); }); } diff --git a/lib/rules/value-list-comma-space-before/index.js b/lib/rules/value-list-comma-space-before/index.js index 33f2335a66..b16c99ea93 100644 --- a/lib/rules/value-list-comma-space-before/index.js +++ b/lib/rules/value-list-comma-space-before/index.js @@ -3,7 +3,9 @@ 'use strict'; const declarationValueIndex = require('../../utils/declarationValueIndex'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const ruleMessages = require('../../utils/ruleMessages'); +const setDeclarationValue = require('../../utils/setDeclarationValue'); const validateOptions = require('../../utils/validateOptions'); const valueListCommaWhitespaceChecker = require('../valueListCommaWhitespaceChecker'); const whitespaceChecker = require('../../utils/whitespaceChecker'); @@ -61,7 +63,7 @@ function rule(expectation, options, context) { commaIndices .sort((a, b) => b - a) .forEach((index) => { - const value = decl.raws.value ? decl.raws.value.raw : decl.value; + const value = getDeclarationValue(decl); const valueIndex = index - declarationValueIndex(decl); let beforeValue = value.slice(0, valueIndex); const afterValue = value.slice(valueIndex); @@ -72,11 +74,7 @@ function rule(expectation, options, context) { beforeValue = beforeValue.replace(/\s*$/, ''); } - if (decl.raws.value) { - decl.raws.value.raw = beforeValue + afterValue; - } else { - decl.value = beforeValue + afterValue; - } + setDeclarationValue(decl, beforeValue + afterValue); }); }); } diff --git a/lib/rules/value-list-max-empty-lines/index.js b/lib/rules/value-list-max-empty-lines/index.js index 03297f1082..b7022c898e 100644 --- a/lib/rules/value-list-max-empty-lines/index.js +++ b/lib/rules/value-list-max-empty-lines/index.js @@ -3,8 +3,10 @@ 'use strict'; const _ = require('lodash'); +const getDeclarationValue = require('../../utils/getDeclarationValue'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); +const setDeclarationValue = require('../../utils/setDeclarationValue'); const validateOptions = require('../../utils/validateOptions'); const ruleName = 'value-list-max-empty-lines'; @@ -32,18 +34,14 @@ function rule(max, options, context) { const allowedCRLFNewLinesString = context.fix ? '\r\n'.repeat(maxAdjacentNewlines) : ''; root.walkDecls((decl) => { - const value = decl.raws.value ? decl.raws.value.raw : decl.value; + const value = getDeclarationValue(decl); if (context.fix) { const newValueString = value .replace(new RegExp(violatedLFNewLinesRegex, 'gm'), allowedLFNewLinesString) .replace(new RegExp(violatedCRLFNewLinesRegex, 'gm'), allowedCRLFNewLinesString); - if (decl.raws.value) { - decl.raws.value.raw = newValueString; - } else { - decl.value = newValueString; - } + setDeclarationValue(decl, newValueString); } else if (violatedLFNewLinesRegex.test(value) || violatedCRLFNewLinesRegex.test(value)) { report({ message: messages.expected(max), diff --git a/lib/utils/getDeclarationValue.js b/lib/utils/getDeclarationValue.js new file mode 100644 index 0000000000..e8bc5d1830 --- /dev/null +++ b/lib/utils/getDeclarationValue.js @@ -0,0 +1,11 @@ +'use strict'; + +const _ = require('lodash'); + +/** + * @param {import('postcss').Declaration} decl + * @returns {string} + */ +module.exports = function getDeclarationValue(decl) { + return _.get(decl, 'raws.value.raw', decl.value); +}; diff --git a/lib/utils/setDeclarationValue.js b/lib/utils/setDeclarationValue.js new file mode 100644 index 0000000000..35a2a03350 --- /dev/null +++ b/lib/utils/setDeclarationValue.js @@ -0,0 +1,20 @@ +'use strict'; + +const _ = require('lodash'); + +/** @typedef {import('postcss').Declaration} Declaration */ + +/** + * @param {Declaration} decl + * @param {string} value + * @returns {Declaration} The declaration that was passed in. + */ +module.exports = function getDeclarationValue(decl, value) { + if (_.has(decl, 'raws.value')) { + _.set(decl, 'raws.value.raw', value); + } else { + decl.value = value; + } + + return decl; +}; From 040f5bfe63d271608abc5d5b71a3843e843204c4 Mon Sep 17 00:00:00 2001 From: Drew Hays Date: Fri, 5 Mar 2021 09:11:35 -0800 Subject: [PATCH 2/2] fix typo and add comment about why lodash is used --- lib/utils/setDeclarationValue.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/utils/setDeclarationValue.js b/lib/utils/setDeclarationValue.js index 35a2a03350..f714545058 100644 --- a/lib/utils/setDeclarationValue.js +++ b/lib/utils/setDeclarationValue.js @@ -9,7 +9,10 @@ const _ = require('lodash'); * @param {string} value * @returns {Declaration} The declaration that was passed in. */ -module.exports = function getDeclarationValue(decl, value) { +module.exports = function setDeclarationValue(decl, value) { + // Lodash is necessary here because the declaration may not strictly adhere + // to the current version of PostCSS's Declaration interface. + // See also: https://github.com/stylelint/stylelint/pull/5183/files#r588047494 if (_.has(decl, 'raws.value')) { _.set(decl, 'raws.value.raw', value); } else {