From 8d7d59826d6943abe4a190c0bb235b3017ca2f3f Mon Sep 17 00:00:00 2001 From: Alexey Litvinov Date: Thu, 13 Aug 2015 01:58:02 +0300 Subject: [PATCH 1/4] using path.parse() method to check if the provided path is relative or not --- package.json | 3 +++ src/file-system-loader.js | 11 ++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index ecec1f9..3fa1d3f 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,9 @@ "directories": { "test": "test" }, + "engines": { + "node": ">0.12" + }, "dependencies": { "postcss": "^4.1.11", "postcss-modules-extract-imports": "^0.0.5", diff --git a/src/file-system-loader.js b/src/file-system-loader.js index 2a3f47d..01bb00e 100644 --- a/src/file-system-loader.js +++ b/src/file-system-loader.js @@ -2,6 +2,15 @@ import Core from './index.js' import fs from 'fs' import path from 'path' +const escapedSeparator = path.sep.replace(/(.)/g, '\\$1'); +const relativePathPattern = new RegExp(`^.{1,2}$|^.{1,2}${escapedSeparator}`); + +// Checks if the provided path is relative or not +const isModule = pathname => { + const parsed = path.parse(pathname); + return !parsed.root && !relativePathPattern.test(parsed.dir); +} + // Sorts dependencies in the following way: // AAA comes before AA and A // AB comes after AA and before A @@ -37,7 +46,7 @@ export default class FileSystemLoader { fileRelativePath = path.resolve( path.join( this.root, relativeDir ), newPath ) // if the path is not relative or absolute, try to resolve it in node_modules - if (newPath[0] !== '.' && newPath[0] !== '/') { + if (isModule(newPath)) { try { fileRelativePath = require.resolve(newPath); } From bcca3045fa6622626e255e4b03c8c33b716d28a1 Mon Sep 17 00:00:00 2001 From: Alexey Litvinov Date: Sat, 15 Aug 2015 11:39:50 +0300 Subject: [PATCH 2/4] codestyle update --- src/file-system-loader.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/file-system-loader.js b/src/file-system-loader.js index 01bb00e..79ca0c0 100644 --- a/src/file-system-loader.js +++ b/src/file-system-loader.js @@ -5,10 +5,10 @@ import path from 'path' const escapedSeparator = path.sep.replace(/(.)/g, '\\$1'); const relativePathPattern = new RegExp(`^.{1,2}$|^.{1,2}${escapedSeparator}`); -// Checks if the provided path is relative or not +// Checks if the path to the external module given const isModule = pathname => { - const parsed = path.parse(pathname); - return !parsed.root && !relativePathPattern.test(parsed.dir); + const parsed = path.parse( pathname ); + return !parsed.root && !relativePathPattern.test( parsed.dir ); } // Sorts dependencies in the following way: @@ -48,7 +48,7 @@ export default class FileSystemLoader { // if the path is not relative or absolute, try to resolve it in node_modules if (isModule(newPath)) { try { - fileRelativePath = require.resolve(newPath); + fileRelativePath = require.resolve( newPath ); } catch (e) {} } From 02759ead91f159a8a8e5b193816e0974fe406151 Mon Sep 17 00:00:00 2001 From: Alexey Litvinov Date: Sun, 16 Aug 2015 12:52:41 +0300 Subject: [PATCH 3/4] engines version update --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3fa1d3f..649518f 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "test": "test" }, "engines": { - "node": ">0.12" + "node": ">=0.12" }, "dependencies": { "postcss": "^4.1.11", From 20e11a5f89c603c1e9fd965fc235cf4a399bfd17 Mon Sep 17 00:00:00 2001 From: Alexey Litvinov Date: Mon, 31 Aug 2015 01:13:33 +0300 Subject: [PATCH 4/4] possible solution --- node_modules/cool-styles/bar.css | 4 +++ node_modules/cool-styles/foo.css | 1 + src/file-system-loader.js | 25 ++++++------------- .../compose-node-module/expected.css | 5 +++- .../compose-node-module/expected.json | 2 +- 5 files changed, 18 insertions(+), 19 deletions(-) create mode 100644 node_modules/cool-styles/bar.css diff --git a/node_modules/cool-styles/bar.css b/node_modules/cool-styles/bar.css new file mode 100644 index 0000000..71c33de --- /dev/null +++ b/node_modules/cool-styles/bar.css @@ -0,0 +1,4 @@ +.example +{ + background: #F00; +} diff --git a/node_modules/cool-styles/foo.css b/node_modules/cool-styles/foo.css index 65f95db..e584fbf 100644 --- a/node_modules/cool-styles/foo.css +++ b/node_modules/cool-styles/foo.css @@ -1,3 +1,4 @@ .example { color: #F00; + composes: example from './bar.css'; } diff --git a/src/file-system-loader.js b/src/file-system-loader.js index 79ca0c0..4cf3d8e 100644 --- a/src/file-system-loader.js +++ b/src/file-system-loader.js @@ -2,15 +2,6 @@ import Core from './index.js' import fs from 'fs' import path from 'path' -const escapedSeparator = path.sep.replace(/(.)/g, '\\$1'); -const relativePathPattern = new RegExp(`^.{1,2}$|^.{1,2}${escapedSeparator}`); - -// Checks if the path to the external module given -const isModule = pathname => { - const parsed = path.parse( pathname ); - return !parsed.root && !relativePathPattern.test( parsed.dir ); -} - // Sorts dependencies in the following way: // AAA comes before AA and A // AB comes after AA and before A @@ -42,26 +33,26 @@ export default class FileSystemLoader { trace = _trace || String.fromCharCode( this.importNr++ ) return new Promise( ( resolve, reject ) => { let relativeDir = path.dirname( relativeTo ), - rootRelativePath = path.resolve( relativeDir, newPath ), - fileRelativePath = path.resolve( path.join( this.root, relativeDir ), newPath ) + filename = path.resolve( this.root + relativeDir, newPath ) // if the path is not relative or absolute, try to resolve it in node_modules - if (isModule(newPath)) { + if ( newPath[0] !== '.' && newPath[0] !== path.sep ) { try { - fileRelativePath = require.resolve( newPath ); + filename = require.resolve( newPath ); } catch (e) {} } - const tokens = this.tokensByFile[fileRelativePath] - if (tokens) { return resolve(tokens) } + const rootRelativePath = path.sep + path.relative( this.root, filename ) + const tokens = this.tokensByFile[filename] + if ( tokens ) { return resolve( tokens ) } - fs.readFile( fileRelativePath, "utf-8", ( err, source ) => { + fs.readFile( filename, "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 + this.tokensByFile[filename] = exportTokens resolve( exportTokens ) }, reject ) } ) diff --git a/test/test-cases/compose-node-module/expected.css b/test/test-cases/compose-node-module/expected.css index 0667b94..20f498c 100644 --- a/test/test-cases/compose-node-module/expected.css +++ b/test/test-cases/compose-node-module/expected.css @@ -1,4 +1,7 @@ -._compose_node_module_cool_styles_foo__example { +:import("./bar.css") { + i__imported_example_0: example; +} +._node_modules_cool_styles_foo__example { color: #F00; } ._compose_node_module_source__foo { diff --git a/test/test-cases/compose-node-module/expected.json b/test/test-cases/compose-node-module/expected.json index a57448c..0da68b2 100644 --- a/test/test-cases/compose-node-module/expected.json +++ b/test/test-cases/compose-node-module/expected.json @@ -1,3 +1,3 @@ { - "foo": "_compose_node_module_source__foo _compose_node_module_cool_styles_foo__example" + "foo": "_compose_node_module_source__foo _node_modules_cool_styles_foo__example _node_modules_cool_styles_foo__example i__imported_example_0" }