diff --git a/CHANGELOG.md b/CHANGELOG.md index 52f0dd2c..8af948eb 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,8 @@ postcssImport({ - Changed: support promise in `transform` option and `undefined` result will be skipped ([#147](https://github.com/postcss/postcss-import/pull/147)) +- Added: detect css extension in package.json `main` field +([153](https://github.com/postcss/postcss-import/pull/153)) # 7.1.3 - 2015-11-05 diff --git a/README.md b/README.md index 8f5824bc..c4cd4579 100755 --- a/README.md +++ b/README.md @@ -92,17 +92,17 @@ Checkout [tests](test) for more examples. #### `root` Type: `String` -Default: `process.cwd()` +Default: `process.cwd()` or _dirname of [the postcss `from`](https://github.com/postcss/postcss#node-source)_ -Define the root where to resolve path (eg: place where `node_modules` are). Should not be used that much. +Define the root where to resolve path (eg: place where `node_modules` are). Should not be used that much. +_Note: nested `@import` will additionally benefit of the relative dirname of imported files._ #### `path` Type: `String|Array` -Default: `process.cwd()` or _dirname of [the postcss `from`](https://github.com/postcss/postcss#node-source)_ +Default: `[]` -A string or an array of paths in where to look for files. -_Note: nested `@import` will additionally benefit of the relative dirname of imported files._ +A string or an array of paths in where to look for files. #### `transform` diff --git a/index.js b/index.js index 72d32615..c6e678ec 100755 --- a/index.js +++ b/index.js @@ -22,8 +22,12 @@ function AtImport(options) { options.path = [ options.path ] } + if (!Array.isArray(options.path)) { + options.path = [] + } + options.path = options.path.map(function(p) { - return path.resolve(p) + return path.resolve(options.root, p) }) return function(styles, result) { diff --git a/lib/resolve-id.js b/lib/resolve-id.js index 0dc4cc75..c1b5dc5d 100644 --- a/lib/resolve-id.js +++ b/lib/resolve-id.js @@ -1,5 +1,3 @@ -var fs = require("fs") -var path = require("path") var resolve = require("resolve") var moduleDirectories = [ @@ -7,20 +5,6 @@ var moduleDirectories = [ "node_modules", ] -function isFile(path) { - return new Promise(function(resolve, reject) { - fs.stat(path, function(err, stat) { - if (err) { - if (err.code === "ENOENT") { - return resolve(false) - } - return reject(err) - } - resolve(stat.isFile() || stat.isFIFO()) - }) - }) -} - function resolveModule(id, opts) { return new Promise(function(res, rej) { resolve(id, opts, function(err, path) { @@ -41,36 +25,30 @@ module.exports = function(id, base, options) { paths: paths, extensions: [ ".css" ], packageFilter: function processPackage(pkg) { - pkg.main = pkg.style || "index.css" + if (pkg.style) { + pkg.main = pkg.style + } + else if (!pkg.main || !/\.css$/.test(pkg.main)) { + pkg.main = "index.css" + } return pkg }, } - // local detect - return resolveModule("./" + id, resolveOpts).catch(function() { - // modules and paths detect + return resolveModule("./" + id, resolveOpts) + .catch(function() { return resolveModule(id, resolveOpts) - }).catch(function() { - // LAST HOPE - return Promise.all(paths.map(function(p) { - return isFile(path.resolve(p, id)) - })).then(function(results) { - for (var i = 0; i < results.length; i += 1) { - if (results[i]) { - return path.resolve(paths[i], id) - } - } - - if (paths.indexOf(base) === -1) { - paths.unshift(base) - } - - throw new Error([ - "Failed to find '" + id + "'", - "in [ ", - " " + paths.join(",\n "), - "]", - ].join("\n ")) - }) + }) + .catch(function() { + if (paths.indexOf(base) === -1) { + paths.unshift(base) + } + + throw new Error([ + "Failed to find '" + id + "'", + "in [ ", + " " + paths.join(",\n "), + "]", + ].join("\n ")) }) } diff --git a/test/fixtures/imports/local-module/main.css b/test/fixtures/imports/local-module/main.css deleted file mode 100644 index 68c41250..00000000 --- a/test/fixtures/imports/local-module/main.css +++ /dev/null @@ -1 +0,0 @@ -.local-module{} diff --git a/test/fixtures/imports/local-module/package.json b/test/fixtures/imports/local-module/package.json deleted file mode 100644 index ae14fa6b..00000000 --- a/test/fixtures/imports/local-module/package.json +++ /dev/null @@ -1 +0,0 @@ -{"style": "main.css"} diff --git a/test/fixtures/imports/modules/empty/index.css b/test/fixtures/imports/modules/empty/index.css new file mode 100644 index 00000000..983b6170 --- /dev/null +++ b/test/fixtures/imports/modules/empty/index.css @@ -0,0 +1 @@ +empty {} diff --git a/test/fixtures/imports/modules/empty/package.json b/test/fixtures/imports/modules/empty/package.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/test/fixtures/imports/modules/empty/package.json @@ -0,0 +1 @@ +{} diff --git a/test/fixtures/imports/modules/main-js/index.css b/test/fixtures/imports/modules/main-js/index.css new file mode 100644 index 00000000..b70c1c75 --- /dev/null +++ b/test/fixtures/imports/modules/main-js/index.css @@ -0,0 +1 @@ +main-js {} diff --git a/test/fixtures/imports/modules/main-js/main.js b/test/fixtures/imports/modules/main-js/main.js new file mode 100644 index 00000000..4ba52ba2 --- /dev/null +++ b/test/fixtures/imports/modules/main-js/main.js @@ -0,0 +1 @@ +module.exports = {} diff --git a/test/fixtures/imports/modules/main-js/package.json b/test/fixtures/imports/modules/main-js/package.json new file mode 100644 index 00000000..c13b8cf6 --- /dev/null +++ b/test/fixtures/imports/modules/main-js/package.json @@ -0,0 +1,3 @@ +{ + "main": "main.js" +} diff --git a/test/fixtures/imports/modules/main-style/main.css b/test/fixtures/imports/modules/main-style/main.css new file mode 100644 index 00000000..30381c75 --- /dev/null +++ b/test/fixtures/imports/modules/main-style/main.css @@ -0,0 +1 @@ +style-mained {} diff --git a/test/fixtures/imports/modules/main-style/package.json b/test/fixtures/imports/modules/main-style/package.json new file mode 100644 index 00000000..39fd5f3c --- /dev/null +++ b/test/fixtures/imports/modules/main-style/package.json @@ -0,0 +1,4 @@ +{ + "main": "main.css", + "style": "style.css" +} diff --git a/test/fixtures/imports/modules/main-style/style.css b/test/fixtures/imports/modules/main-style/style.css new file mode 100644 index 00000000..0d9e85bd --- /dev/null +++ b/test/fixtures/imports/modules/main-style/style.css @@ -0,0 +1 @@ +main-styled {} diff --git a/test/fixtures/imports/modules/main/main.css b/test/fixtures/imports/modules/main/main.css new file mode 100644 index 00000000..99358f44 --- /dev/null +++ b/test/fixtures/imports/modules/main/main.css @@ -0,0 +1 @@ +main {} diff --git a/test/fixtures/imports/modules/main/package.json b/test/fixtures/imports/modules/main/package.json new file mode 100644 index 00000000..93731918 --- /dev/null +++ b/test/fixtures/imports/modules/main/package.json @@ -0,0 +1,3 @@ +{ + "main": "main.css" +} diff --git a/test/fixtures/imports/modules/simple/index.css b/test/fixtures/imports/modules/simple/index.css new file mode 100644 index 00000000..edf99844 --- /dev/null +++ b/test/fixtures/imports/modules/simple/index.css @@ -0,0 +1 @@ +simple {} diff --git a/test/fixtures/imports/modules/style/package.json b/test/fixtures/imports/modules/style/package.json new file mode 100644 index 00000000..9785e0d5 --- /dev/null +++ b/test/fixtures/imports/modules/style/package.json @@ -0,0 +1,3 @@ +{ + "style": "style.css" +} diff --git a/test/fixtures/imports/modules/style/style.css b/test/fixtures/imports/modules/style/style.css new file mode 100644 index 00000000..e44f0fb0 --- /dev/null +++ b/test/fixtures/imports/modules/style/style.css @@ -0,0 +1 @@ +style {} diff --git a/test/fixtures/imports/relative/baz.css b/test/fixtures/imports/relative/baz.css deleted file mode 100755 index b82a6aa0..00000000 --- a/test/fixtures/imports/relative/baz.css +++ /dev/null @@ -1,5 +0,0 @@ -@import "qux.css"; - -baz{ - is: relative -} \ No newline at end of file diff --git a/test/fixtures/imports/relative/import.css b/test/fixtures/imports/relative/import.css deleted file mode 100644 index a37a7222..00000000 --- a/test/fixtures/imports/relative/import.css +++ /dev/null @@ -1 +0,0 @@ -@import "../bar.css"; diff --git a/test/fixtures/imports/relative/qux.css b/test/fixtures/imports/relative/qux.css deleted file mode 100755 index 6697c874..00000000 --- a/test/fixtures/imports/relative/qux.css +++ /dev/null @@ -1,3 +0,0 @@ -qux{ - is: relative -} diff --git a/test/fixtures/relative-to-source.css b/test/fixtures/relative-to-source.css deleted file mode 100755 index 095d80c5..00000000 --- a/test/fixtures/relative-to-source.css +++ /dev/null @@ -1,3 +0,0 @@ -@import "imports/foo.css"; - -content{} diff --git a/test/fixtures/relative-to-source.expected.css b/test/fixtures/relative-to-source.expected.css deleted file mode 100755 index 09fd6d47..00000000 --- a/test/fixtures/relative-to-source.expected.css +++ /dev/null @@ -1,3 +0,0 @@ -foo{} - -content{} diff --git a/test/fixtures/relative.css b/test/fixtures/relative.css deleted file mode 100755 index d4fe624a..00000000 --- a/test/fixtures/relative.css +++ /dev/null @@ -1,3 +0,0 @@ -@import "relative/baz.css"; -@import "qux.css"; -content{} diff --git a/test/fixtures/relative.expected.css b/test/fixtures/relative.expected.css deleted file mode 100755 index a2ecf40a..00000000 --- a/test/fixtures/relative.expected.css +++ /dev/null @@ -1,13 +0,0 @@ -qux{ - is: relative -} - -baz{ - is: relative -} - -quux{ - not: "relative/qux" -} - -content{} diff --git a/test/fixtures/cwd.css b/test/fixtures/resolve-cwd.css old mode 100755 new mode 100644 similarity index 100% rename from test/fixtures/cwd.css rename to test/fixtures/resolve-cwd.css diff --git a/test/fixtures/cwd.expected.css b/test/fixtures/resolve-cwd.expected.css old mode 100755 new mode 100644 similarity index 100% rename from test/fixtures/cwd.expected.css rename to test/fixtures/resolve-cwd.expected.css diff --git a/test/fixtures/resolve-from.css b/test/fixtures/resolve-from.css new file mode 100644 index 00000000..bdc682c0 --- /dev/null +++ b/test/fixtures/resolve-from.css @@ -0,0 +1,2 @@ +@import "imports/foo.css"; +@import "imports/foo-recursive.css"; diff --git a/test/fixtures/resolve-from.expected.css b/test/fixtures/resolve-from.expected.css new file mode 100644 index 00000000..ead37b55 --- /dev/null +++ b/test/fixtures/resolve-from.expected.css @@ -0,0 +1,3 @@ +foo{} +bar{} +foo.recursive{} diff --git a/test/fixtures/resolve-local-modules.css b/test/fixtures/resolve-local-modules.css new file mode 100644 index 00000000..98887ddf --- /dev/null +++ b/test/fixtures/resolve-local-modules.css @@ -0,0 +1,6 @@ +@import "fixtures/imports/modules/simple"; +@import "fixtures/imports/modules/empty"; +@import "fixtures/imports/modules/style"; +@import "fixtures/imports/modules/main"; +@import "fixtures/imports/modules/main-js"; +@import "fixtures/imports/modules/main-style"; diff --git a/test/fixtures/resolve-local-modules.expected.css b/test/fixtures/resolve-local-modules.expected.css new file mode 100644 index 00000000..3aa72d80 --- /dev/null +++ b/test/fixtures/resolve-local-modules.expected.css @@ -0,0 +1,6 @@ +simple {} +empty {} +style {} +main {} +main-js {} +main-styled {} diff --git a/test/fixtures/modules.css b/test/fixtures/resolve-modules.css similarity index 89% rename from test/fixtures/modules.css rename to test/fixtures/resolve-modules.css index 06f6c88f..99a4816b 100644 --- a/test/fixtures/modules.css +++ b/test/fixtures/resolve-modules.css @@ -13,7 +13,3 @@ @import "web-use-dep"; @import "web-use-dep-too"; @import "web-use-dep" screen; - -@import "local-module"; - -content{} diff --git a/test/fixtures/modules.expected.css b/test/fixtures/resolve-modules.expected.css similarity index 85% rename from test/fixtures/modules.expected.css rename to test/fixtures/resolve-modules.expected.css index 74427364..572ab9b1 100644 --- a/test/fixtures/modules.expected.css +++ b/test/fixtures/resolve-modules.expected.css @@ -14,5 +14,3 @@ @media screen{ .web-dep{} } -.local-module{} -content{} diff --git a/test/fixtures/resolve-path-cwd.css b/test/fixtures/resolve-path-cwd.css new file mode 100644 index 00000000..3f2e57dd --- /dev/null +++ b/test/fixtures/resolve-path-cwd.css @@ -0,0 +1,2 @@ +@import "foo.css"; +@import "foo-recursive.css"; diff --git a/test/fixtures/resolve-path-cwd.expected.css b/test/fixtures/resolve-path-cwd.expected.css new file mode 100644 index 00000000..ead37b55 --- /dev/null +++ b/test/fixtures/resolve-path-cwd.expected.css @@ -0,0 +1,3 @@ +foo{} +bar{} +foo.recursive{} diff --git a/test/fixtures/resolve-path-modules.css b/test/fixtures/resolve-path-modules.css new file mode 100644 index 00000000..b95cb98c --- /dev/null +++ b/test/fixtures/resolve-path-modules.css @@ -0,0 +1,6 @@ +@import "simple"; +@import "empty"; +@import "style"; +@import "main"; +@import "main-js"; +@import "main-style"; diff --git a/test/fixtures/resolve-path-modules.expected.css b/test/fixtures/resolve-path-modules.expected.css new file mode 100644 index 00000000..3aa72d80 --- /dev/null +++ b/test/fixtures/resolve-path-modules.expected.css @@ -0,0 +1,6 @@ +simple {} +empty {} +style {} +main {} +main-js {} +main-styled {} diff --git a/test/fixtures/resolve-path-root.css b/test/fixtures/resolve-path-root.css new file mode 100644 index 00000000..3f2e57dd --- /dev/null +++ b/test/fixtures/resolve-path-root.css @@ -0,0 +1,2 @@ +@import "foo.css"; +@import "foo-recursive.css"; diff --git a/test/fixtures/resolve-path-root.expected.css b/test/fixtures/resolve-path-root.expected.css new file mode 100644 index 00000000..ead37b55 --- /dev/null +++ b/test/fixtures/resolve-path-root.expected.css @@ -0,0 +1,3 @@ +foo{} +bar{} +foo.recursive{} diff --git a/test/fixtures/resolve-root.css b/test/fixtures/resolve-root.css new file mode 100644 index 00000000..bdc682c0 --- /dev/null +++ b/test/fixtures/resolve-root.css @@ -0,0 +1,2 @@ +@import "imports/foo.css"; +@import "imports/foo-recursive.css"; diff --git a/test/fixtures/resolve-root.expected.css b/test/fixtures/resolve-root.expected.css new file mode 100644 index 00000000..ead37b55 --- /dev/null +++ b/test/fixtures/resolve-root.expected.css @@ -0,0 +1,3 @@ +foo{} +bar{} +foo.recursive{} diff --git a/test/import.js b/test/import.js index 9a66bd30..75d3da8c 100644 --- a/test/import.js +++ b/test/import.js @@ -27,26 +27,6 @@ test("should ignore & adjust external import", t => { return compareFixtures(t, "ignore") }) -test("should import stylsheets relatively", t => { - return compareFixtures(t, "relative") -}) - -test("should work without a specified path", t => { - return compareFixtures(t, "cwd") -}) - -test("should not need `path` option if `source` option has been passed", t => { - return compareFixtures(t, "relative-to-source", null, { - from: "fixtures/relative-to-source.css", - }) -}) - -test("should be able to consume npm package or local modules", t => { - return compareFixtures(t, "modules", { - root: ".", - }) -}) - test("should not fail with only one absolute import", t => { var base = "@import url(http://)" return postcss() @@ -100,15 +80,6 @@ test("should contain a correct sourcemap", t => { }) }) -test("import relative files using path option only", t => { - return postcss() - .use(atImport({ path: "fixtures/imports/relative" })) - .process(readFileSync("fixtures/imports/relative/import.css")) - .then(result => { - t.is(result.css, readFileSync("fixtures/imports/bar.css", "utf-8")) - }) -}) - test("inlined @import should keep PostCSS AST references clean", t => { return postcss() .use(atImport()) diff --git a/test/resolve.js b/test/resolve.js new file mode 100644 index 00000000..153e36f2 --- /dev/null +++ b/test/resolve.js @@ -0,0 +1,56 @@ +import test from "ava" +import compareFixtures from "./lib/compare-fixtures" + +test("should resolve relative to cwd", t => { + return compareFixtures(t, "resolve-cwd", { + path: null, + }) +}) + +test(`should resolve relative to 'root' option`, t => { + return compareFixtures(t, "resolve-root", { + root: "fixtures", + path: null, + }) +}) + +test(`should resolve relative to postcss 'from' option`, t => { + return compareFixtures(t, "resolve-from", { + path: null, + }, { + from: "fixtures/file.css", + }) +}) + +test(`should resolve relative to 'path' which resolved with cwd`, t => { + return compareFixtures(t, "resolve-path-cwd", { + path: "fixtures/imports", + }) +}) + +test(`should resolve relative to 'path' which resolved with 'root'`, t => { + return compareFixtures(t, "resolve-path-root", { + root: "fixtures", + path: "imports", + }) +}) + +test("should resolve local modules", t => { + return compareFixtures(t, "resolve-local-modules", { + path: null, + }) +}) + +test("should resolve local modules", t => { + return compareFixtures(t, "resolve-path-modules", { + path: "fixtures/imports/modules", + }) +}) + +test("should be able to consume npm package or local modules", t => { + return compareFixtures(t, "resolve-modules", { + path: null, + }, { + from: "fixtures/imports/foo.css", + }) +})