diff --git a/lib/rules/declaration-block-trailing-semicolon/README.md b/lib/rules/declaration-block-trailing-semicolon/README.md index 6ad62d4026..0cd16c72b3 100644 --- a/lib/rules/declaration-block-trailing-semicolon/README.md +++ b/lib/rules/declaration-block-trailing-semicolon/README.md @@ -91,7 +91,7 @@ a { background: orange; color: pink } ## Optional secondary options -### `singleDeclaration: "never"` +### `singleDeclaration: "never"|"ignore-always"` #### `"never"` @@ -129,3 +129,35 @@ foo { property: value; bar: qux } ```css @keyframes name { from { property: 0 } to { property: 1; } } ``` + +#### `"ignore-always"` + +The following patterns are _not_ considered violations: + + +```css +foo { + property: value +} +``` + + +```css +foo { property: value } +``` + +With `"always"`: + +The following patterns are _not_ considered violations: + + +```css +foo { + property: value; +} +``` + + +```css +foo { property: value; } +``` diff --git a/lib/rules/declaration-block-trailing-semicolon/__tests__/index.js b/lib/rules/declaration-block-trailing-semicolon/__tests__/index.js index 656af3b5fe..6c4c5f56f7 100644 --- a/lib/rules/declaration-block-trailing-semicolon/__tests__/index.js +++ b/lib/rules/declaration-block-trailing-semicolon/__tests__/index.js @@ -125,6 +125,22 @@ testRule({ ], }); +testRule({ + ruleName, + config: ['always', { singleDeclaration: 'ignore-always' }], + + accept: [ + { + code: 'foo { property: value }', + description: 'single declaration without trailing semicolon', + }, + { + code: 'foo { property: value; }', + description: 'single declaration with trailing semicolon', + }, + ], +}); + testRule({ ruleName, config: ['never'], diff --git a/lib/rules/declaration-block-trailing-semicolon/index.js b/lib/rules/declaration-block-trailing-semicolon/index.js index ae64b9a90b..651c998f7f 100644 --- a/lib/rules/declaration-block-trailing-semicolon/index.js +++ b/lib/rules/declaration-block-trailing-semicolon/index.js @@ -27,7 +27,7 @@ function rule(expectation, options, context) { { actual: options, possible: { - singleDeclaration: 'never', + singleDeclaration: ['never', 'ignore-always'], }, optional: true, }, @@ -70,12 +70,19 @@ function rule(expectation, options, context) { let message; if (expectation === 'always') { - const singleDeclarationNeverEnabled = optionsMatches(options, 'singleDeclaration', 'never'); - const isNeverException = singleDeclarationNeverEnabled && node.parent.first === node; + const singleDeclarationNever = optionsMatches(options, 'singleDeclaration', 'never'); + const singleDeclarationIgnoreAlways = optionsMatches( + options, + 'singleDeclaration', + 'ignore-always', + ); + const hasOneDeclaration = node.parent.first === node; + const isNeverException = singleDeclarationNever && hasOneDeclaration; + const isIgnoreAlwaysException = singleDeclarationIgnoreAlways && hasOneDeclaration; if (isNeverException) { if (!hasSemicolon) return; - } else if (hasSemicolon) { + } else if (hasSemicolon || isIgnoreAlwaysException) { return; }