@@ -10,6 +10,7 @@ var clone = require("clone")
1010var resolve = require ( "resolve" )
1111var postcss = require ( "postcss" )
1212var 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}
0 commit comments