From 78170a8b3718248c6a675bce05c734c7d0cf27ec Mon Sep 17 00:00:00 2001 From: sethamus Date: Tue, 30 Sep 2025 09:05:37 +0300 Subject: [PATCH] fix: handle all CSS newlines in rules --- src/rules/no-duplicate-imports.js | 14 +++++- src/rules/no-important.js | 2 +- tests/rules/no-duplicate-imports.test.js | 42 ++++++++++++++++++ tests/rules/no-important.test.js | 54 ++++++++++++++++++++++++ 4 files changed, 109 insertions(+), 3 deletions(-) diff --git a/src/rules/no-duplicate-imports.js b/src/rules/no-duplicate-imports.js index 05801564..d16a247a 100644 --- a/src/rules/no-duplicate-imports.js +++ b/src/rules/no-duplicate-imports.js @@ -52,9 +52,19 @@ export default { data: { url }, fix(fixer) { const [start, end] = sourceCode.getRange(node); + const text = sourceCode.text; // Remove the node, and also remove a following newline if present - const removeEnd = - sourceCode.text[end] === "\n" ? end + 1 : end; + let removeEnd = end; + if (text[removeEnd] === "\r") { + removeEnd += + text[removeEnd + 1] === "\n" ? 2 : 1; + } else if ( + text[removeEnd] === "\n" || + text[removeEnd] === "\f" + ) { + removeEnd += 1; + } + return fixer.removeRange([start, removeEnd]); }, }); diff --git a/src/rules/no-important.js b/src/rules/no-important.js index 48e17420..a723275a 100644 --- a/src/rules/no-important.js +++ b/src/rules/no-important.js @@ -54,7 +54,7 @@ export default { const declarationText = sourceCode.getText(node); const textWithoutComments = declarationText.replace( commentPattern, - match => match.replace(/[^\n]/gu, " "), + match => match.replace(/[^\r\n\f]/gu, " "), ); const importantMatch = importantPattern.exec(textWithoutComments); diff --git a/tests/rules/no-duplicate-imports.test.js b/tests/rules/no-duplicate-imports.test.js index f670bb89..6b2bb3ce 100644 --- a/tests/rules/no-duplicate-imports.test.js +++ b/tests/rules/no-duplicate-imports.test.js @@ -238,5 +238,47 @@ ruleTester.run("no-duplicate-imports", rule, { }, ], }, + { + code: "@import url('a.css');\r\n@import url('a.css');\r\n@import url('b.css');", + output: "@import url('a.css');\r\n@import url('b.css');", + errors: [ + { + messageId: "duplicateImport", + data: { url: "a.css" }, + line: 2, + column: 1, + endLine: 2, + endColumn: 22, + }, + ], + }, + { + code: "@import url('a.css');\r@import url('a.css');\r@import url('b.css');", + output: "@import url('a.css');\r@import url('b.css');", + errors: [ + { + messageId: "duplicateImport", + data: { url: "a.css" }, + line: 2, + column: 1, + endLine: 2, + endColumn: 22, + }, + ], + }, + { + code: "@import url('a.css');\f@import url('a.css');\f@import url('b.css');", + output: "@import url('a.css');\f@import url('b.css');", + errors: [ + { + messageId: "duplicateImport", + data: { url: "a.css" }, + line: 2, + column: 1, + endLine: 2, + endColumn: 22, + }, + ], + }, ], }); diff --git a/tests/rules/no-important.test.js b/tests/rules/no-important.test.js index 9dce5e4d..a05116fe 100644 --- a/tests/rules/no-important.test.js +++ b/tests/rules/no-important.test.js @@ -200,6 +200,60 @@ ruleTester.run("no-important", rule, { }, ], }, + { + code: "a { color: red\r\n!important; }", + errors: [ + { + messageId: "unexpectedImportant", + line: 2, + column: 1, + endLine: 2, + endColumn: 11, + suggestions: [ + { + messageId: "removeImportant", + output: "a { color: red; }", + }, + ], + }, + ], + }, + { + code: "a { color: red\r!important; }", + errors: [ + { + messageId: "unexpectedImportant", + line: 2, + column: 1, + endLine: 2, + endColumn: 11, + suggestions: [ + { + messageId: "removeImportant", + output: "a { color: red; }", + }, + ], + }, + ], + }, + { + code: "a { color: red\f!important; }", + errors: [ + { + messageId: "unexpectedImportant", + line: 2, + column: 1, + endLine: 2, + endColumn: 11, + suggestions: [ + { + messageId: "removeImportant", + output: "a { color: red; }", + }, + ], + }, + ], + }, { code: dedent` a {