From e6ef28b3b30bb82e78167543ea775e33aebacc7e Mon Sep 17 00:00:00 2001 From: Aleks Hudochenkov Date: Tue, 3 Apr 2018 00:20:19 +0200 Subject: [PATCH] Make a playground --- .../__tests__/index.js | 1334 +---------------- lib/rules/at-rule-empty-line-before/index.js | 158 +- 2 files changed, 20 insertions(+), 1472 deletions(-) diff --git a/lib/rules/at-rule-empty-line-before/__tests__/index.js b/lib/rules/at-rule-empty-line-before/__tests__/index.js index f79cb66501..2114815006 100644 --- a/lib/rules/at-rule-empty-line-before/__tests__/index.js +++ b/lib/rules/at-rule-empty-line-before/__tests__/index.js @@ -1,1318 +1,20 @@ "use strict"; -const mergeTestDescriptions = require("../../../testUtils/mergeTestDescriptions"); - -const rule = require(".."); -const { messages, ruleName } = rule; -const stripIndent = require("common-tags").stripIndent; - -const sharedAlwaysTests = { - accept: [ - { - code: "a {} b {}", - description: "rule ignored" - }, - { - code: "@font-face {}", - description: "first node ignored" - }, - { - code: "a {}\n\n@media {}" - }, - { - code: "a {}\n\n@mEdIa {}" - }, - { - code: "a {}\n\n@MEDIA {}" - }, - { - code: "@keyframes foo {}\n\n@media {}" - }, - { - code: "@kEyFrAmEs foo {}\n\n@MeDia {}" - }, - { - code: "@KEYFRAMES foo {}\n\n@MEDIA {}" - }, - { - code: "@-webkit-keyframes foo {}\n\n@media {}" - }, - { - code: "@-webkit-keyframes foo {}\n\n@-webkit-keyframes bar {}" - }, - { - code: "a {}\r\n\r\n@media {}", - description: "windows" - }, - { - code: "a {}\n\r\n@media {}", - description: "mixed" - } - ], - - reject: [ - { - code: "a {} @media {}", - fixed: "a {}\n\n @media {}", - message: messages.expected - }, - { - code: "a {} @mEdIa {}", - fixed: "a {}\n\n @mEdIa {}", - message: messages.expected - }, - { - code: "a {} @MEDIA {}", - fixed: "a {}\n\n @MEDIA {}", - message: messages.expected - }, - { - code: "@keyframes foo {} @media {}", - fixed: "@keyframes foo {}\n\n @media {}", - message: messages.expected - }, - { - code: "@-webkit-keyframes foo {} @media {}", - fixed: "@-webkit-keyframes foo {}\n\n @media {}", - message: messages.expected - }, - { - code: "@-webkit-keyframes foo {} @-webkit-keyframes bar {}", - fixed: "@-webkit-keyframes foo {}\n\n @-webkit-keyframes bar {}", - message: messages.expected - }, - { - code: "a {}\n@media {}", - fixed: "a {}\n\n@media {}", - message: messages.expected - }, - { - code: "a {}\r\n@media {}", - fixed: "a {}\r\n\r\n@media {}", - message: messages.expected - }, - { - code: "a {}\n\n/* comment */\n@media {}", - fixed: "a {}\n\n/* comment */\n\n@media {}", - message: messages.expected - }, - { - code: "a {}\r\n\r\n/* comment */\r\n@media {}", - fixed: "a {}\r\n\r\n/* comment */\r\n\r\n@media {}", - message: messages.expected - } - ] -}; - -const sharedNeverTests = { - accept: [ - { - code: "a {}\n\nb {}", - description: "rule ignored" - }, - { - code: "\n\n@font-face {}", - description: "first node ignored" - }, - { - code: "a {}\n@media {}" - }, - { - code: "a {} @media {}" - }, - { - code: "@keyframes foo {}\n@media {}" - }, - { - code: "@keyframes foo {} @media {}" - } - ], - - reject: [ - { - code: "a {}\n\n@media {}", - fixed: "a {}\n@media {}", - message: messages.rejected - }, - { - code: "a {}\r\n\r\n@media {}", - fixed: "a {}\r\n@media {}", - message: messages.rejected - }, - { - code: "@keyframes foo {}\n/* comment */\n\n@media {}", - fixed: "@keyframes foo {}\n/* comment */\n@media {}", - message: messages.rejected - }, - { - code: "@keyframes foo {}\r\n/* comment */\r\n\r\n@media {}", - fixed: "@keyframes foo {}\r\n/* comment */\r\n@media {}", - message: messages.rejected - } - ] -}; - -testRule( - rule, - mergeTestDescriptions(sharedAlwaysTests, { - ruleName, - config: ["always"], - fix: true, - - accept: [ - { - code: "a {\n\n @mixin foo;\n}" - } - ] - }) -); - -testRule( - rule, - mergeTestDescriptions(sharedAlwaysTests, { - ruleName, - config: ["always", { except: ["blockless-after-blockless"] }], - fix: true, - - accept: [ - { - code: "a {\n\n @mixin foo;\n}" - }, - { - code: "@keyframes foo {}\n\n@import 'x.css'", - description: "empty line not blockless pair" - }, - { - code: "@import 'x.css';\n@import 'y.css'", - description: "no empty line blockless pair" - }, - { - code: "@import 'x.css';", - description: "single blockless rule" - } - ], - - reject: [ - { - code: "@keyframes foo {}\n@import 'x.css'", - fixed: "@keyframes foo {}\n\n@import 'x.css'", - message: messages.expected - }, - { - code: "@import 'x.css';\n\n@import 'y.css'", - fixed: "@import 'x.css';\n@import 'y.css'", - message: messages.rejected - } - ] - }) -); - -testRule(rule, { - ruleName, - config: ["always", { except: ["blockless-after-blockless"] }], - fix: true, - - accept: [ - { - code: "@import 'y.css'; @import 'x.css';" - }, - { - code: stripIndent` - @charset "UTF-8"; - @import url(x.css); /* comment */ - @import url(y.css);`, - description: "shared-line comment accepted" - } - ], - - reject: [ - { - code: "@keyframes foo {}\n@import 'x.css'", - fixed: "@keyframes foo {}\n\n@import 'x.css'", - message: messages.expected - }, - { - code: "@import 'x.css';\n\n@import 'y.css'", - fixed: "@import 'x.css';\n@import 'y.css'", - message: messages.rejected - } - ] -}); - -testRule(rule, { - ruleName, - config: ["always", { ignore: ["blockless-after-blockless"] }], - fix: true, - - accept: [ - { - code: "@charset 'UTF-8'; @import 'x.css';" - } - ], - - reject: [ - { - code: "@import 'x.css'; @media {};", - fixed: "@import 'x.css';\n\n @media {};", - message: messages.expected, - line: 1, - column: 18 - }, - { - code: "@import 'test'; @include mixin(1) { @content; };", - fixed: "@import 'test';\n\n @include mixin(1) {\n\n @content; };", - message: messages.expected - } - ] -}); - -testRule(rule, { - ruleName, - config: ["always", { ignore: ["after-comment"] }], - fix: true, - - accept: [ - { - code: "/* foo */\n@media {}" - }, - { - code: "/* foo */\n\n@media{}" - }, - { - code: "/* foo */\r\n\r\n@media {}", - description: "CRLF" - } - ], - - reject: [ - { - code: "a {} @media {}", - fixed: "a {}\n\n @media {}", - message: messages.expected - }, - { - code: "bar {} /* foo */\n@media {}", - fixed: "bar {} /* foo */\n\n@media {}", - message: messages.expected, - line: 2, - column: 1, - description: "after shared-line comment" - } - ] -}); - -testRule(rule, { - ruleName, - config: ["always", { ignore: ["first-nested"] }], - fix: true, - - accept: [ - { - code: "@supports {\n @media {}\n}" - }, - { - code: "@supports {\n\n @media {}\n}" - } - ], - - reject: [ - { - code: "@supports {\n @media {}\n @media{}\n}", - fixed: "@supports {\n @media {}\n\n @media{}\n}", - message: messages.expected, - line: 3, - column: 3 - } - ] -}); - -testRule( - rule, - mergeTestDescriptions(sharedAlwaysTests, { - ruleName, - config: ["always", { except: ["inside-block"] }], - fix: true, - - accept: [ - { - code: "a {\n @mixin foo;\n color: pink;\n}" - }, - { - code: "a {\n color: pink;\n @mixin foo;\n}" - } - ], - - reject: [ - { - code: "a {\n\n @mixin foo;\n color: pink;\n}", - fixed: "a {\n @mixin foo;\n color: pink;\n}", - message: messages.rejected - }, - { - code: "a {\n\n color: pink;\n\n @mixin foo;\n}", - fixed: "a {\n\n color: pink;\n @mixin foo;\n}", - message: messages.rejected - } - ] - }) -); - -testRule( - rule, - mergeTestDescriptions(sharedAlwaysTests, { - ruleName, - config: ["always", { except: ["first-nested"] }], - fix: true, - - accept: [ - { - code: "a {\n @mixin foo;\n color: pink;\n}" - }, - { - code: "a { /* comment */\n @mixin foo;\n color: pink;\n}", - description: "shared-line comment" - } - ], - - reject: [ - { - code: "a {\n color: pink;\n @mixin foo;\n}", - fixed: "a {\n color: pink;\n\n @mixin foo;\n}", - message: messages.expected - }, - { - code: "a {\n\n @mixin foo;\n color: pink;\n}", - fixed: "a {\n @mixin foo;\n color: pink;\n}", - message: messages.rejected - }, - { - code: "a {/* comment */\n\n @mixin foo;\n color: pink;\n}", - fixed: "a {/* comment */\n @mixin foo;\n color: pink;\n}", - message: messages.rejected - } - ] - }) -); - -testRule( - rule, - mergeTestDescriptions(sharedAlwaysTests, { - ruleName, - config: ["always", { ignore: ["inside-block"] }], - fix: true, - - accept: [ - { - code: "a {\n @mixin foo;\n color: pink;\n}" - }, - { - code: "a {\n color: pink;\n @mixin foo;\n}" - }, - { - code: "a {\n\n @mixin foo;\n color: pink;\n}" - }, - { - code: "a {\n\n color: pink;\n\n @mixin foo;\n}" - } - ] - }) -); - -testRule( - rule, - mergeTestDescriptions(sharedAlwaysTests, { - ruleName, - config: [ - "always", - { except: ["blockless-after-blockless", "inside-block"] } - ], - fix: true, - - accept: [ - { - code: "a {\n @mixin foo;\n color: pink;\n}" - }, - { - code: "a {\n color: pink;\n @mixin foo;\n}" - }, - { - code: "@keyframes foo {}\n\n@import 'x.css'", - description: "empty line not blockless pair" - }, - { - code: "@import 'x.css';\n@import 'y.css'", - description: "no empty line blockless pair" - }, - { - code: "@import 'x.css';", - description: "single blockless rule" - }, - { - code: "a {\n @mixin foo;\n @mixin bar;\n}" - } - ], - - reject: [ - { - code: "@keyframes foo {}\n@import 'x.css'", - fixed: "@keyframes foo {}\n\n@import 'x.css'", - message: messages.expected - }, - { - code: "@import 'x.css';\n\n@import 'y.css'", - fixed: "@import 'x.css';\n@import 'y.css'", - message: messages.rejected - }, - { - code: "a {\n\n @mixin foo;\n color: pink;\n}", - fixed: "a {\n @mixin foo;\n color: pink;\n}", - message: messages.rejected - }, - { - code: "a {\n\n color: pink;\n\n @mixin foo;\n}", - fixed: "a {\n\n color: pink;\n @mixin foo;\n}", - message: messages.rejected - } - ] - }) -); - -testRule( - rule, - mergeTestDescriptions(sharedNeverTests, { - ruleName, - config: ["never"], - fix: true, - - accept: [ - { - code: "a {\n @mixin foo;\n}" - } - ] - }) -); - -testRule( - rule, - mergeTestDescriptions(sharedNeverTests, { - ruleName, - config: ["never", { except: ["blockless-after-blockless"] }], - fix: true, - - accept: [ - { - code: "a {\n @mixin foo;\n}" - }, - { - code: "@keyframes foo {}\n@import 'x.css'", - description: "no empty line not blockless pair" - }, - { - code: "@import 'x.css';\n\n@import 'y.css'", - description: "empty line blockless pair" - }, - { - code: "@import 'x.css';", - description: "single blockless rule" - } - ], - - reject: [ - { - code: "@keyframes foo {}\n\n@import 'x.css'", - fixed: "@keyframes foo {}\n@import 'x.css'", - message: messages.rejected - }, - { - code: "@import 'x.css';\n@import 'y.css'", - fixed: "@import 'x.css';\n\n@import 'y.css'", - message: messages.expected - } - ] - }) -); - -testRule( - rule, - mergeTestDescriptions(sharedNeverTests, { - ruleName, - config: ["never", { except: ["inside-block"] }], - fix: true, - - accept: [ - { - code: "a {\n\n @mixin foo;\n color: pink;\n}" - }, - { - code: "a {\n color: pink;\n\n @mixin foo;\n}" - } - ], - - reject: [ - { - code: "a {\n @mixin foo;\n color: pink;\n}", - fixed: "a {\n\n @mixin foo;\n color: pink;\n}", - message: messages.expected - }, - { - code: "a {\n\n color: pink;\n @mixin foo;\n}", - fixed: "a {\n\n color: pink;\n\n @mixin foo;\n}", - message: messages.expected - } - ] - }) -); - -testRule( - rule, - mergeTestDescriptions(sharedNeverTests, { - ruleName, - config: ["never", { except: ["first-nested"] }], - fix: true, - - accept: [ - { - code: "a {\n\n @mixin foo;\n color: pink;\n}" - } - ], - - reject: [ - { - code: "a {\n color: pink;\n\n @mixin foo;\n}", - fixed: "a {\n color: pink;\n @mixin foo;\n}", - message: messages.rejected - }, - { - code: "a {\n @mixin foo;\n color: pink;\n}", - fixed: "a {\n\n @mixin foo;\n color: pink;\n}", - message: messages.expected - } - ] - }) -); - -testRule(rule, { - ruleName, - config: ["never", { ignore: ["blockless-after-blockless"] }], - fix: true, - - accept: [ - { - code: ` - @media {}; - @import 'x.css'; - ` - }, - { - code: ` - @import 'x.css'; - @import 'y.css'; - ` - }, - { - code: ` - @import 'x.css'; - - @import 'y.css'; - ` - } - ], - - reject: [ - { - code: ` - @import 'x.css'; - - @media {}; - `, - fixed: ` - @import 'x.css'; - @media {}; - `, - message: messages.rejected, - line: 4, - column: 7 - } - ] -}); - -testRule(rule, { - ruleName, - config: ["never", { ignore: ["after-comment"] }], - fix: true, - - accept: [ - { - code: "/* foo */\n@media {}" - }, - { - code: "/* foo */\r\n\r\n@media {}", - description: "CRLF" - }, - { - code: "/* foo */\n\n@media {}" - } - ], - - reject: [ - { - code: "b {}\n\n@media {}", - fixed: "b {}\n@media {}", - message: messages.rejected - }, - { - code: "b {}\r\n\r\n@media {}", - fixed: "b {}\r\n@media {}", - description: "CRLF", - message: messages.rejected - }, - { - code: "b {} /* comment */\n\n@media {}", - fixed: "b {} /* comment */\n@media {}", - description: "after shared-line comment", - message: messages.rejected, - line: 3, - column: 1 - } - ] -}); - -testRule( - rule, - mergeTestDescriptions(sharedNeverTests, { - ruleName, - config: ["never", { ignore: ["inside-block"] }], - fix: true, - - accept: [ - { - code: "a {\n @mixin foo;\n color: pink;\n}" - }, - { - code: "a {\n color: pink;\n @mixin foo;\n}" - }, - { - code: "a {\n\n @mixin foo;\n color: pink;\n}" - }, - { - code: "a {\n\n color: pink;\n\n @mixin foo;\n}" - } - ] - }) -); - -testRule(rule, { - ruleName, - config: ["always", { ignoreAtRules: ["else"] }], - fix: true, - - accept: [ - { - code: ` - @if(true) { - } @else { - } - ` - }, - { - code: ` - @if(true) { - } - - @else { - } - ` - }, - { - code: ` - @if(true) {} - @else if(true) { - } @else { - } - ` - } - ], - - reject: [ - { - code: ` - @if(true) { - } @else-mixin { - } - `, - fixed: ` - @if(true) { - } - - @else-mixin { - } - `, - message: messages.expected, - line: 3, - column: 9 - }, - { - code: ` - @if (true) {} - @if (false) { - } - `, - fixed: ` - @if (true) {} - - @if (false) { - } - `, - message: messages.expected, - line: 3, - column: 7 - } - ] -}); - -testRule(rule, { - ruleName, - config: ["always", { ignoreAtRules: "/el/" }], - fix: true, - - accept: [ - { - code: "@keyframes {}; @an-element-mixin();" - }, - { - code: ` - @if true {} - @else { - } - ` - } - ], - - reject: [ - { - code: ` - @else { - color: pink; - } - @if true {} - `, - fixed: ` - @else { - color: pink; - } - - @if true {} - `, - message: messages.expected, - line: 5, - column: 7 - } - ] -}); - -testRule(rule, { - ruleName, - config: ["never", { ignoreAtRules: ["else"] }], - fix: true, - - accept: [ - { - code: ` - @if(true) { - } @else { - } - ` - }, - { - code: ` - @if(true) { - } - - @else { - } - ` - }, - { - code: ` - @if(true) {} - - @else if(true) {} - - @else {} - ` - } - ], - - reject: [ - { - code: ` - @if(true) { - } - - @else-mixin {} - `, - fixed: ` - @if(true) { - } - @else-mixin {} - `, - message: messages.rejected, - line: 5, - column: 7 - }, - { - code: ` - @if (true) - {} - - @if (false) { - } - `, - fixed: ` - @if (true) - {} - @if (false) { - } - `, - message: messages.rejected, - line: 5, - column: 7 - } - ] -}); - -testRule(rule, { - ruleName, - config: ["never", { ignoreAtRules: "/el/" }], - fix: true, - - accept: [ - { - code: ` - @keyframes {} - - @someelement-mixin(); - ` - }, - { - code: ` - @if true {} - - @else { - } - ` - } - ], - - reject: [ - { - code: ` - @else { - color: pink; - } - - @if true {} - `, - fixed: ` - @else { - color: pink; - } - @if true {} - `, - message: messages.rejected, - line: 6, - column: 7 - } - ] -}); - -testRule( - rule, - mergeTestDescriptions(sharedAlwaysTests, { - ruleName, - config: [ - "always", - { - ignore: ["blockless-after-same-name-blockless"] - } - ], - fix: true, - - accept: [ - { - code: stripIndent` - @charset "UTF-8"; - - @import url(x.css); - @import url(y.css);` - }, - { - code: stripIndent` - a { - - @extends .foo; - @extends .bar; - - @include loop; - @include doo; - }` - }, - { - code: stripIndent` - @charset "UTF-8"; - - @import url(x.css); /* comment */ - @import url(y.css);`, - description: "shared-line comment accepted" - } - ], - - reject: [ - { - code: stripIndent` - @charset "UTF-8"; - @import url(x.css); - @import url(y.css);`, - fixed: stripIndent` - @charset "UTF-8"; - - @import url(x.css); - @import url(y.css);`, - message: messages.expected, - line: 2, - column: 1 - }, - { - code: stripIndent` - a { - - @extends .foo; - @extends .bar; - @include loop; - @include doo; - }`, - fixed: stripIndent` - a { - - @extends .foo; - @extends .bar; - - @include loop; - @include doo; - }`, - message: messages.expected, - line: 5, - column: 3 - } - ] - }) -); - -testRule( - rule, - mergeTestDescriptions(sharedAlwaysTests, { - ruleName, - config: [ - "always", - { - except: ["blockless-after-same-name-blockless"] - } - ], - fix: true, - - accept: [ - { - code: stripIndent` - @charset "UTF-8"; - - @import url(x.css); - @import url(y.css);` - }, - { - code: stripIndent` - a { - - @extends .foo; - @extends .bar; - - @include loop; - @include doo; - }` - }, - { - code: stripIndent` - @charset "UTF-8"; - - @import url(x.css); /* comment */ - @import url(y.css);`, - description: "shared-line comment accepted" - } - ], - - reject: [ - { - code: stripIndent` - @charset "UTF-8"; - @import url(x.css); - @import url(y.css);`, - fixed: stripIndent` - @charset "UTF-8"; - - @import url(x.css); - @import url(y.css);`, - message: messages.expected, - line: 2, - column: 1 - }, - { - code: stripIndent` - a { - - @extends .foo; - @extends .bar; - @include loop; - @include doo; - }`, - fixed: stripIndent` - a { - - @extends .foo; - @extends .bar; - - @include loop; - @include doo; - }`, - message: messages.expected, - line: 5, - column: 3 - } - ] - }) -); - -testRule( - rule, - mergeTestDescriptions(sharedNeverTests, { - ruleName, - config: [ - "never", - { - except: ["blockless-after-same-name-blockless"] - } - ], - fix: true, - - accept: [ - { - code: stripIndent` - @charset "UTF-8"; - @import url(x.css); - - @import url(y.css);` - }, - { - code: stripIndent` - a { - @extends .foo; - - @extends .bar; - @include loop; - - @include doo; - }` - } - ], - - reject: [ - { - code: stripIndent` - @charset "UTF-8"; - @import url(x.css); - @import url(y.css);`, - fixed: stripIndent` - @charset "UTF-8"; - @import url(x.css); - - @import url(y.css);`, - message: messages.expected, - line: 3, - column: 1 - }, - { - code: stripIndent` - a { - @extends .bar; - @include loop; - @include doo; - }`, - fixed: stripIndent` - a { - @extends .bar; - @include loop; - - @include doo; - }`, - message: messages.expected, - line: 4, - column: 3 - } - ] - }) -); - -testRule(rule, { - ruleName, - config: [ - "always", - { - except: ["after-same-name"] - } - ], - fix: true, - - accept: [ - { - code: stripIndent` - @charset "UTF-8"; - - @include x; - @include y {}` - }, - { - code: stripIndent` - a { - - @extends .foo; - @extends .bar; - - @include y {} - @include x; - }` - } - ], - - reject: [ - { - code: stripIndent` - @charset "UTF-8"; - @include x; - @include y {}`, - fixed: stripIndent` - @charset "UTF-8"; - - @include x; - @include y {}`, - message: messages.expected, - line: 2, - column: 1 - }, - { - code: stripIndent` - a { - - @extends .foo; - @extends .bar; - @include y {} - @include x; - }`, - fixed: stripIndent` - a { - - @extends .foo; - @extends .bar; - - @include y {} - @include x; - }`, - message: messages.expected, - line: 5, - column: 3 - } - ] -}); - -testRule( - rule, - mergeTestDescriptions(sharedNeverTests, { - ruleName, - config: [ - "never", - { - except: ["after-same-name"] - } - ], - fix: true, - - accept: [ - { - code: stripIndent` - @charset "UTF-8"; - @include x; - - @include y {}` - }, - { - code: stripIndent` - a { - @extends .foo; - - @extends .bar; - @include y {} - - @include x; - }` - } - ], - - reject: [ - { - code: stripIndent` - @charset "UTF-8"; - @include x; - @include y {}`, - fixed: stripIndent` - @charset "UTF-8"; - @include x; - - @include y {}`, - message: messages.expected, - line: 3, - column: 1 - }, - { - code: stripIndent` - a { - @extends .bar; - @include x; - @include y {} - }`, - fixed: stripIndent` - a { - @extends .bar; - @include x; - - @include y {} - }`, - message: messages.expected, - line: 4, - column: 3 - } - ] - }) -); - -testRule(rule, { - ruleName, - config: ["always"], - syntax: "less", - - accept: [ - { - code: stripIndent` - @media {} - @import 'x.css'; - `, - description: "ignore less @imports" - } - ] -}); +const stylelint = require("../../../standalone"); + +for (let i = 0; i < 700; i++) { + it("no description", () => { + return stylelint({ + code: "a {\n\n @mixin foo;\n}", + config: { + rules: { + "at-rule-empty-line-before": ["always"] + } + } + }).then(() => { + // expect(output.results[0].warnings).toEqual([]); + // expect(output.results[0].parseErrors).toEqual([]); + expect(true).toBeTruthy(); + }); + }); +} diff --git a/lib/rules/at-rule-empty-line-before/index.js b/lib/rules/at-rule-empty-line-before/index.js index 673ee16e16..fd7932269f 100644 --- a/lib/rules/at-rule-empty-line-before/index.js +++ b/lib/rules/at-rule-empty-line-before/index.js @@ -1,19 +1,6 @@ "use strict"; -const _ = require("lodash"); -const addEmptyLineBefore = require("../../utils/addEmptyLineBefore"); -const getPreviousNonSharedLineCommentNode = require("../../utils/getPreviousNonSharedLineCommentNode"); -const hasEmptyLine = require("../../utils/hasEmptyLine"); -const isAfterComment = require("../../utils/isAfterComment"); -const isBlocklessAtRuleAfterBlocklessAtRule = require("../../utils/isBlocklessAtRuleAfterBlocklessAtRule"); -const isBlocklessAtRuleAfterSameNameBlocklessAtRule = require("../../utils/isBlocklessAtRuleAfterSameNameBlocklessAtRule"); -const isFirstNested = require("../../utils/isFirstNested"); -const isFirstNodeOfRoot = require("../../utils/isFirstNodeOfRoot"); -const optionsMatches = require("../../utils/optionsMatches"); -const removeEmptyLinesBefore = require("../../utils/removeEmptyLinesBefore"); -const report = require("../../utils/report"); const ruleMessages = require("../../utils/ruleMessages"); -const validateOptions = require("../../utils/validateOptions"); const ruleName = "at-rule-empty-line-before"; @@ -22,151 +9,10 @@ const messages = ruleMessages(ruleName, { rejected: "Unexpected empty line before at-rule" }); -const rule = function(expectation, options, context) { - return (root, result) => { - const validOptions = validateOptions( - result, - ruleName, - { - actual: expectation, - possible: ["always", "never"] - }, - { - actual: options, - possible: { - except: [ - "after-same-name", - "inside-block", - "blockless-after-same-name-blockless", - "blockless-after-blockless", - "first-nested" - ], - ignore: [ - "after-comment", - "first-nested", - "inside-block", - "blockless-after-same-name-blockless", - "blockless-after-blockless" - ], - ignoreAtRules: [_.isString] - }, - optional: true - } - ); - if (!validOptions) { - return; - } - - root.walkAtRules(atRule => { - const isNested = atRule.parent.type !== "root"; - // Ignore the first node - if (isFirstNodeOfRoot(atRule)) { - return; - } - - // Return early if at-rule is to be ignored - if (optionsMatches(options, "ignoreAtRules", atRule.name)) { - return; - } - - // Optionally ignore the expectation if the node is blockless - if ( - optionsMatches(options, "ignore", "blockless-after-blockless") && - isBlocklessAtRuleAfterBlocklessAtRule(atRule) - ) { - return; - } - - // Optionally ignore the node if it is the first nested - if ( - optionsMatches(options, "ignore", "first-nested") && - isFirstNested(atRule) - ) { - return; - } - - // Optionally ignore the expection if the node is blockless - // and following another blockless at-rule with the same name - if ( - optionsMatches( - options, - "ignore", - "blockless-after-same-name-blockless" - ) && - isBlocklessAtRuleAfterSameNameBlocklessAtRule(atRule) - ) { - return; - } - - // Optionally ignore the expectation if the node is inside a block - if (optionsMatches(options, "ignore", "inside-block") && isNested) { - return; - } - - // Optionally ignore the expectation if a comment precedes this node - if ( - optionsMatches(options, "ignore", "after-comment") && - isAfterComment(atRule) - ) { - return; - } - - const hasEmptyLineBefore = hasEmptyLine(atRule.raws.before); - let expectEmptyLineBefore = expectation === "always" ? true : false; - - // Optionally reverse the expectation if any exceptions apply - if ( - (optionsMatches(options, "except", "after-same-name") && - isAtRuleAfterSameNameAtRule(atRule)) || - (optionsMatches(options, "except", "inside-block") && isNested) || - (optionsMatches(options, "except", "first-nested") && - isFirstNested(atRule)) || - (optionsMatches(options, "except", "blockless-after-blockless") && - isBlocklessAtRuleAfterBlocklessAtRule(atRule)) || - (optionsMatches( - options, - "except", - "blockless-after-same-name-blockless" - ) && - isBlocklessAtRuleAfterSameNameBlocklessAtRule(atRule)) - ) { - expectEmptyLineBefore = !expectEmptyLineBefore; - } - - // Return if the expectation is met - if (expectEmptyLineBefore === hasEmptyLineBefore) { - return; - } - - // Fix - if (context.fix) { - if (expectEmptyLineBefore) { - addEmptyLineBefore(atRule, context.newline); - } else { - removeEmptyLinesBefore(atRule, context.newline); - } - - return; - } - - const message = expectEmptyLineBefore - ? messages.expected - : messages.rejected; - - report({ message, node: atRule, result, ruleName }); - }); - }; +const rule = function() { + return () => {}; }; -function isAtRuleAfterSameNameAtRule(atRule) { - const previousNode = getPreviousNonSharedLineCommentNode(atRule); - return ( - previousNode && - previousNode.type === "atrule" && - previousNode.name === atRule.name - ); -} - rule.ruleName = ruleName; rule.messages = messages; module.exports = rule;