Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,13 +180,18 @@ promised content.

#### `skipDuplicates`

Type: `Boolean`
Type: `Boolean` or `"content"`
Default: `true`

By default, similar files (based on the same content) are being skipped.
It's to optimize output and skip similar files like `normalize.css` for example.
If this behavior is not what you want, just set this option to `false` to
disable it.
By default, repeated imports of the same file are being skipped.

Set this option to `"content"` to skip similar files based on their content
instead, so that copies of the same stylesheet (`normalize.css` for example)
imported from different paths are also skipped. Files can contain at-rules
whose paths resolve relative to the file's own location, which is why this
is not the default.

If you don't want any duplicates to be skipped, set this option to `false`.

#### `addModulesDirectories`

Expand Down
4 changes: 2 additions & 2 deletions lib/parse-styles.js
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ async function loadImportContent(

// skip previous imported files not containing @import rules
if (
options.skipDuplicates &&
options.skipDuplicates === "content" &&
state.hashFiles[content]?.[stmtDuplicateCheckKey]
) {
return
Expand All @@ -196,7 +196,7 @@ async function loadImportContent(
const styles = importedResult.root
result.messages = result.messages.concat(importedResult.messages)

if (options.skipDuplicates) {
if (options.skipDuplicates === "content") {
const hasImport = styles.some(child => {
return child.type === "atrule" && child.name === "import"
})
Expand Down
3 changes: 3 additions & 0 deletions test/fixtures/content-dedup.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
@import "same-file-dedup/a/shared.css";
@import "same-file-dedup/b/shared.css";
@import "same-file-dedup/a/shared.css";
1 change: 1 addition & 0 deletions test/fixtures/content-dedup.expected.css
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
shared {}
1 change: 1 addition & 0 deletions test/fixtures/imports/same-file-dedup/a/shared.css
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
shared {}
1 change: 1 addition & 0 deletions test/fixtures/imports/same-file-dedup/b/shared.css
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
shared {}
3 changes: 3 additions & 0 deletions test/fixtures/same-file-dedup.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
@import "same-file-dedup/a/shared.css";
@import "same-file-dedup/b/shared.css";
@import "same-file-dedup/a/shared.css";
2 changes: 2 additions & 0 deletions test/fixtures/same-file-dedup.expected.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
shared {}
shared {}
15 changes: 15 additions & 0 deletions test/import.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,21 @@ test(

test("should import stylesheets with same content", checkFixture, "same")

test(
"should not skip different files with the same content by default",
checkFixture,
"same-file-dedup",
)

test(
"should skip files with the same content with skipDuplicates: content",
checkFixture,
"content-dedup",
{
skipDuplicates: "content",
},
)

test("should ignore & adjust external import", checkFixture, "ignore")

test("should not fail with only one absolute import", t => {
Expand Down
Loading