From b64342e36635507305b9ae033e7d396ceb96bebb Mon Sep 17 00:00:00 2001 From: RyanZim Date: Tue, 8 Nov 2016 17:50:47 -0500 Subject: [PATCH] Warn about all @imports after other CSS declarations Fixes #176 --- lib/parse-statements.js | 38 ++++++++++++++++++++++++-------------- test/lint.js | 17 +++++++++++++++++ 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/lib/parse-statements.js b/lib/parse-statements.js index 727ad29f..c22dd9bd 100644 --- a/lib/parse-statements.js +++ b/lib/parse-statements.js @@ -69,21 +69,23 @@ function parseMedia(result, atRule) { } function parseImport(result, atRule) { - var prev = atRule.prev() - while (prev && prev.type === "comment") { - prev = prev.prev() - } + var prev = getPrev(atRule) if (prev) { - if ( - prev.type !== "atrule" || - prev.name !== "import" && - prev.name !== "charset" - ) { - return result.warn( - "@import must precede all other statements (besides @charset)", - { node: atRule } - ) - } + do { + if ( + prev.type !== "atrule" || + prev.name !== "import" && + prev.name !== "charset" + ) { + return result.warn( + "@import must precede all other statements (besides @charset)", + { node: atRule } + ) + } + else { + prev = getPrev(prev) + } + } while (prev) } if (atRule.nodes) { @@ -140,3 +142,11 @@ function parseImport(result, atRule) { return stmt } + +function getPrev(item) { + var prev = item.prev() + while (prev && prev.type === "comment") { + prev = prev.prev() + } + return prev +} diff --git a/test/lint.js b/test/lint.js index c4e4bb53..b4eb1a4a 100644 --- a/test/lint.js +++ b/test/lint.js @@ -21,6 +21,23 @@ test("should warn when not @charset and not @import statement before", t => { }) }) +test("should warn about all imports after some other CSS declaration", t => { + return processor.process( + `a {} + @import "a.css"; + @import "b.css";` + ) + .then(function(result) { + t.plan(2) + result.warnings().forEach(function(warning) { + t.is( + warning.text, + "@import must precede all other statements (besides @charset)" + ) + }) + }) +}) + test("should not warn if comments before @import", t => { return processor.process(`/* skipped comment */ @import "";`) .then(function(result) {