Skip to content

Commit 9a0b6f6

Browse files
committed
Initial commit
0 parents  commit 9a0b6f6

4 files changed

Lines changed: 135 additions & 0 deletions

File tree

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
node_modules
2+

README.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# node-module-importer
2+
3+
>Node Sass importer for npm packages
4+
5+
## Install
6+
7+
This package has a peer dependency on Node Sass for ensure import API compatibility.
8+
9+
```sh
10+
npm install @node-sass/node-module-importer node-sass
11+
```
12+
13+
## Usage
14+
15+
Install an npm package with the Sass files you want to import.
16+
```js
17+
npm install foundation
18+
```
19+
20+
When Node Sass parses an `@import` in will try to match the first part of the URL with an installed npm package. The rest of the URL will be resolved relative to the where the package is installed.
21+
22+
```css
23+
@import "foundation/scss/foundation.scss";
24+
```
25+
26+
### Node Sass API
27+
28+
```js
29+
var sass = require('node-sass');
30+
var nodeModuleImport = require('@node-sass/node-module-importer');
31+
32+
sass.render({
33+
file: 'index.scss',
34+
importer: [nodeModuleImport],
35+
}, function (err, result) {
36+
if (err) throw err;
37+
console.log(result.css.toString());
38+
});
39+
```
40+
41+
### Node Sass CLI
42+
43+
```sh
44+
$ node-sass index.scss --importer node_modules/node-module-importer/index.js
45+
```
46+
47+
## FAQ
48+
49+
### Why is this different from adding `node_modules` to `includePaths`?
50+
51+
npm can install packages in nested `node_modules` folders i.e. `node_modules/package_1/node_modules/package_2`.

index.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
var fs = require('fs');
2+
var path = require('path');
3+
var exts = ['.sass', '.scss'];
4+
5+
function exists(file) {
6+
try {
7+
fs.accessSync(file, fs.constants.F_OK);
8+
return true;
9+
} catch (e) {
10+
return false;
11+
}
12+
}
13+
14+
module.exports = function(url, prev, done) {
15+
if (!url) return done(null);
16+
17+
var urlParts = url.split('/');
18+
var packageName = urlParts[0];
19+
20+
try {
21+
var packagePath = require.resolve(packageName, { paths: [process.cwd()] });
22+
} catch (e) {
23+
return done(null);
24+
}
25+
26+
if (!packagePath) return done(null);
27+
28+
var parts = packagePath.split(path.sep);
29+
30+
for (var i = parts.length; i >= 0; i--) {
31+
if (parts[i] !== packageName || parts[i - 1] === packageName) continue;
32+
33+
var before = parts.splice(0, i + 1);
34+
var after = urlParts.splice(1);
35+
36+
var resolved = [].concat(before, after).join(path.sep);
37+
var relative = path.relative(process.cwd(), resolved);
38+
var ext = path.extname(relative);
39+
var basename = path.basename(relative, ext);
40+
41+
console.log({ resolved, relative, basename, ext })
42+
43+
if (ext) {
44+
if (basename[0] === '_') {
45+
if (exists(relative)) return done({ file: relative });
46+
} else {
47+
if (exists(relative)) return done({ file: relative });
48+
var partial = relative.split(path.sep).splice(-1, 1, '_' + basename).join(path.sep);
49+
if (exists(partial)) return done({ file: partial });
50+
}
51+
} else {
52+
for (var j = 0; j < exts.length; j++) {
53+
if (basename[0] === '_') {
54+
if (exists(relative + exts[j])) return done({ file: relative + exts[j] });
55+
} else {
56+
if (exists(relative + exts[j])) return done({ file: relative + exts[j] });
57+
var partial = relative.split(path.sep);
58+
partial.splice(-1, 1, '_' + basename);
59+
partial = partial.join(path.sep);
60+
if (exists(partial + exts[j])) return done({ file: partial + exts[j] });
61+
}
62+
}
63+
}
64+
}
65+
66+
return done(null);
67+
};

package.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"name": "@node-sass/node-module-importer",
3+
"version": "0.0.0",
4+
"description": "Node Sass importer for npm packages",
5+
"repository": "https://github.com/sasstools/node-module-importer",
6+
"main": "index.js",
7+
"scripts": {
8+
"test": "echo \"Error: no test specified\" && exit 1"
9+
},
10+
"author": "xzyfer",
11+
"license": "ISC",
12+
"peerDependencies": {
13+
"node-sass": "^4"
14+
}
15+
}

0 commit comments

Comments
 (0)