From a8e96f1efbf5bd9c0ba52fcd83cb81cf61a73312 Mon Sep 17 00:00:00 2001 From: Romain Menke Date: Sun, 23 Jul 2023 11:14:41 +0200 Subject: [PATCH 1/2] ignore urls with a fragment or query --- lib/parse-styles.js | 23 ++++++++++++++++++++++- test/fixtures/filter-ignore.css | 2 ++ test/fixtures/filter-ignore.expected.css | 2 ++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/parse-styles.js b/lib/parse-styles.js index d021dd4d..0c35f5e7 100644 --- a/lib/parse-styles.js +++ b/lib/parse-styles.js @@ -28,7 +28,7 @@ async function parseStyles( stmt.layer = joinLayer(layer, stmt.layer || []) // skip protocol base uri (protocol://url) or protocol-relative - if (stmt.type !== "import" || /^(?:[a-z]+:)?\/\//i.test(stmt.uri)) { + if (stmt.type !== "import" || !isProcessableURL(stmt.uri)) { continue } @@ -219,4 +219,25 @@ async function loadImportContent( ) } +function isProcessableURL(uri) { + if (/^(?:[a-z]+:)?\/\//i.test(uri)) { + return false + } + + try { + // needs a base to parse properly + const url = new URL(uri, "https://example.com") + + if (url.hash) { + return false + } + + if (url.search) { + return false + } + } catch {} // Ignore + + return true +} + module.exports = parseStyles diff --git a/test/fixtures/filter-ignore.css b/test/fixtures/filter-ignore.css index d134503d..923d64d4 100644 --- a/test/fixtures/filter-ignore.css +++ b/test/fixtures/filter-ignore.css @@ -12,4 +12,6 @@ @import url("//css"); @import url('//css'); @import url(//css); +@import url('foo.css?query=string'); +@import url('foo.css#hash'); content{} diff --git a/test/fixtures/filter-ignore.expected.css b/test/fixtures/filter-ignore.expected.css index a9791220..03093e41 100644 --- a/test/fixtures/filter-ignore.expected.css +++ b/test/fixtures/filter-ignore.expected.css @@ -13,6 +13,8 @@ @import url("//css"); @import url('//css'); @import url(//css); +@import url('foo.css?query=string'); +@import url('foo.css#hash'); @media (min-width: 25em){ ignore{} } From fb55a4847c77fd91b3c334104bdf35672c06bedc Mon Sep 17 00:00:00 2001 From: Romain Menke <11521496+romainmenke@users.noreply.github.com> Date: Tue, 1 Aug 2023 16:31:57 +0200 Subject: [PATCH 2/2] Apply suggestions from code review Co-authored-by: Ryan Zimmerman --- lib/parse-styles.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/parse-styles.js b/lib/parse-styles.js index 0c35f5e7..834b4f8f 100644 --- a/lib/parse-styles.js +++ b/lib/parse-styles.js @@ -27,7 +27,6 @@ async function parseStyles( stmt.parentMedia = media stmt.layer = joinLayer(layer, stmt.layer || []) - // skip protocol base uri (protocol://url) or protocol-relative if (stmt.type !== "import" || !isProcessableURL(stmt.uri)) { continue } @@ -220,10 +219,12 @@ async function loadImportContent( } function isProcessableURL(uri) { + // skip protocol base uri (protocol://url) or protocol-relative if (/^(?:[a-z]+:)?\/\//i.test(uri)) { return false } + // check for fragment or query try { // needs a base to parse properly const url = new URL(uri, "https://example.com")