Skip to content

Commit 08d2cc6

Browse files
committed
Merge pull request #28 from magsout/hash
Not import same hash files
2 parents cf7db01 + 6cf78d5 commit 08d2cc6

File tree

4 files changed

+29
-9
lines changed

4 files changed

+29
-9
lines changed

index.js

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ var clone = require("clone")
1010
var resolve = require("resolve")
1111
var postcss = require("postcss")
1212
var helpers = require("postcss-message-helpers")
13+
var hash = require("string-hash")
1314

1415
/**
1516
* Constants
@@ -61,7 +62,9 @@ function AtImport(options) {
6162
}
6263
var ignoredAtRules = []
6364

64-
parseStyles(styles, options, insertRules, importedFiles, ignoredAtRules)
65+
var hashFiles = {}
66+
67+
parseStyles(styles, options, insertRules, importedFiles, ignoredAtRules, null, hashFiles)
6568
addIgnoredAtRulesOnTop(styles, ignoredAtRules)
6669

6770
if (typeof options.onImport === "function") {
@@ -76,12 +79,12 @@ function AtImport(options) {
7679
* @param {Object} styles
7780
* @param {Object} options
7881
*/
79-
function parseStyles(styles, options, cb, importedFiles, ignoredAtRules, media) {
82+
function parseStyles(styles, options, cb, importedFiles, ignoredAtRules, media, hashFiles) {
8083
var imports = []
8184
styles.eachAtRule("import", function checkAtRule(atRule) {imports.push(atRule)})
8285
imports.forEach(function(atRule) {
8386
helpers.try(function transformAtImport() {
84-
readAtImport(atRule, options, cb, importedFiles, ignoredAtRules, media)
87+
readAtImport(atRule, options, cb, importedFiles, ignoredAtRules, media, hashFiles)
8588
}, atRule.source)
8689
})
8790
}
@@ -121,7 +124,7 @@ function addIgnoredAtRulesOnTop(styles, ignoredAtRules) {
121124
* @param {Object} atRule postcss atRule
122125
* @param {Object} options
123126
*/
124-
function readAtImport(atRule, options, cb, importedFiles, ignoredAtRules, media) {
127+
function readAtImport(atRule, options, cb, importedFiles, ignoredAtRules, media, hashFiles) {
125128
// parse-import module parse entire line
126129
// @todo extract what can be interesting from this one
127130
var parsedAtImport = parseImport(atRule.params, atRule.source)
@@ -158,7 +161,7 @@ function readAtImport(atRule, options, cb, importedFiles, ignoredAtRules, media)
158161
importedFiles[resolvedFilename][media] = true
159162

160163

161-
readImportedContent(atRule, parsedAtImport, clone(options), resolvedFilename, cb, importedFiles, ignoredAtRules)
164+
readImportedContent(atRule, parsedAtImport, clone(options), resolvedFilename, cb, importedFiles, ignoredAtRules, media, hashFiles)
162165
}
163166

164167
/**
@@ -170,7 +173,7 @@ function readAtImport(atRule, options, cb, importedFiles, ignoredAtRules, media)
170173
* @param {String} resolvedFilename
171174
* @param {Function} cb
172175
*/
173-
function readImportedContent(atRule, parsedAtImport, options, resolvedFilename, cb, importedFiles, ignoredAtRules) {
176+
function readImportedContent(atRule, parsedAtImport, options, resolvedFilename, cb, importedFiles, ignoredAtRules, media, hashFiles) {
174177
// add directory containing the @imported file in the paths
175178
// to allow local import from this file
176179
var dirname = path.dirname(resolvedFilename)
@@ -188,10 +191,24 @@ function readImportedContent(atRule, parsedAtImport, options, resolvedFilename,
188191
return
189192
}
190193

194+
var fileContentHash = hash(fileContent)
195+
196+
// skip files already imported at the same scope and same hash
197+
if (hashFiles[fileContentHash] && hashFiles[fileContentHash][media]) {
198+
detach(atRule)
199+
return
200+
}
201+
202+
// save hash files to skip them next time
203+
if (!hashFiles[fileContentHash]) {
204+
hashFiles[fileContentHash] = {}
205+
}
206+
hashFiles[fileContentHash][media] = true
207+
191208
var newStyles = postcss.parse(fileContent, options)
192209

193210
// recursion: import @import from imported file
194-
parseStyles(newStyles, options, cb, importedFiles, ignoredAtRules, parsedAtImport.media)
211+
parseStyles(newStyles, options, cb, importedFiles, ignoredAtRules, parsedAtImport.media, hashFiles)
195212

196213
cb(atRule, parsedAtImport, newStyles, resolvedFilename)
197214
}

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
"clone": "^0.1.17",
2626
"postcss": "^4.0.2",
2727
"postcss-message-helpers": "^2.0.0",
28-
"resolve": "^1.0.0"
28+
"resolve": "^1.0.0",
29+
"string-hash": "^1.1.0"
2930
},
3031
"devDependencies": {
3132
"css-whitespace": "^1.1.0",
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
foo{}

test/fixtures/no-duplicate.css

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
@import "foo.css";
22
@import "foo.css";
3+
@import "foo-duplicate.css";
34

4-
content{}
5+
content{}

0 commit comments

Comments
 (0)