diff --git a/src/file-system-loader.js b/src/file-system-loader.js index 98c1d4f..2f9ab02 100644 --- a/src/file-system-loader.js +++ b/src/file-system-loader.js @@ -25,6 +25,7 @@ export default class FileSystemLoader { this.sources = {} this.importNr = 0 this.core = new Core(plugins) + this.tokensByFile = {}; } fetch( _newPath, relativeTo, _trace ) { @@ -35,11 +36,15 @@ export default class FileSystemLoader { rootRelativePath = path.resolve( relativeDir, newPath ), fileRelativePath = path.resolve( path.join( this.root, relativeDir ), newPath ) + const tokens = this.tokensByFile[fileRelativePath] + if (tokens) { return resolve(tokens) } + fs.readFile( fileRelativePath, "utf-8", ( err, source ) => { if ( err ) reject( err ) this.core.load( source, rootRelativePath, trace, this.fetch.bind( this ) ) .then( ( { injectableSource, exportTokens } ) => { this.sources[trace] = injectableSource + this.tokensByFile[fileRelativePath] = exportTokens resolve( exportTokens ) }, reject ) } ) diff --git a/test/test-cases.js b/test/test-cases.js index a457e87..c6adcff 100644 --- a/test/test-cases.js +++ b/test/test-cases.js @@ -32,3 +32,24 @@ Object.keys( pipelines ).forEach( dirname => { } ); } ); } ) + +// special case for testing multiple sources +describe( 'multiple sources', () => { + let testDir = path.join( __dirname, 'test-cases' ) + let testCase = 'multiple-sources'; + let dirname = 'test-cases'; + if ( fs.existsSync( path.join( testDir, testCase, "source1.css" ) ) ) { + it( "should " + testCase.replace( /-/g, " " ), done => { + let expected = normalize( fs.readFileSync( path.join( testDir, testCase, "expected.css" ), "utf-8" ) ) + let loader = new FileSystemLoader( testDir, pipelines[dirname] ) + let expectedTokens = JSON.parse( fs.readFileSync( path.join( testDir, testCase, "expected.json" ), "utf-8" ) ) + loader.fetch( `${testCase}/source1.css`, "/" ).then( tokens1 => { + loader.fetch( `${testCase}/source2.css`, "/" ).then( tokens2 => { + assert.equal( loader.finalSource, expected ) + const tokens = Object.assign({}, tokens1, tokens2); + assert.equal( JSON.stringify( tokens ), JSON.stringify( expectedTokens ) ) + } ).then( done, done ) + }) + } ); + } +} ); diff --git a/test/test-cases/multiple-sources/b.css b/test/test-cases/multiple-sources/b.css new file mode 100644 index 0000000..c4dcd92 --- /dev/null +++ b/test/test-cases/multiple-sources/b.css @@ -0,0 +1,4 @@ +.b { + composes: d from "./d.css"; + color: #bbb; +} diff --git a/test/test-cases/multiple-sources/c.css b/test/test-cases/multiple-sources/c.css new file mode 100644 index 0000000..e5a7b52 --- /dev/null +++ b/test/test-cases/multiple-sources/c.css @@ -0,0 +1,3 @@ +.c { + color: #ccc; +} diff --git a/test/test-cases/multiple-sources/d.css b/test/test-cases/multiple-sources/d.css new file mode 100644 index 0000000..4638a27 --- /dev/null +++ b/test/test-cases/multiple-sources/d.css @@ -0,0 +1,3 @@ +.d { + color: #ddd; +} diff --git a/test/test-cases/multiple-sources/expected.css b/test/test-cases/multiple-sources/expected.css new file mode 100644 index 0000000..37ca57f --- /dev/null +++ b/test/test-cases/multiple-sources/expected.css @@ -0,0 +1,20 @@ + +._multiple_sources_d__d { + color: #ddd; +} + +._multiple_sources_b__b { + color: #bbb; +} + +._multiple_sources_c__c { + color: #ccc; +} + +._multiple_sources_source1__a { + color: #aaa; +} + +._multiple_sources_source2__foo { + color: #f00; +} diff --git a/test/test-cases/multiple-sources/expected.json b/test/test-cases/multiple-sources/expected.json new file mode 100644 index 0000000..074abf9 --- /dev/null +++ b/test/test-cases/multiple-sources/expected.json @@ -0,0 +1,4 @@ +{ + "a": "_multiple_sources_source1__a _multiple_sources_b__b _multiple_sources_d__d _multiple_sources_c__c", + "foo": "_multiple_sources_source2__foo _multiple_sources_b__b _multiple_sources_d__d" +} diff --git a/test/test-cases/multiple-sources/source1.css b/test/test-cases/multiple-sources/source1.css new file mode 100644 index 0000000..983c7fd --- /dev/null +++ b/test/test-cases/multiple-sources/source1.css @@ -0,0 +1,5 @@ +.a { + composes: b from "./b.css"; + composes: c from "./c.css"; + color: #aaa; +} diff --git a/test/test-cases/multiple-sources/source2.css b/test/test-cases/multiple-sources/source2.css new file mode 100644 index 0000000..151a720 --- /dev/null +++ b/test/test-cases/multiple-sources/source2.css @@ -0,0 +1,4 @@ +.foo { + composes: b from "./b.css"; + color: #f00; +}