diff --git a/.gitignore b/.gitignore index 2897913..e802a0c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ output .sass-cache test.js .nyc_output +*.swp +package-lock.json + diff --git a/readme.md b/readme.md index 1cb67fb..7c14914 100644 --- a/readme.md +++ b/readme.md @@ -82,6 +82,13 @@ Default: `false` Follow symbolic links. +#### exclude + +Type: `RegExp` +Default: `undefined` + +Exclude files matching regular expression. + ## Example ```js diff --git a/sass-graph.js b/sass-graph.js index 0d22050..01c7fa5 100644 --- a/sass-graph.js +++ b/sass-graph.js @@ -42,6 +42,7 @@ function resolveSassPath(sassPath, loadPaths, extensions) { function Graph(options, dir) { this.dir = dir; this.extensions = options.extensions || []; + this.exclude = options.exclude instanceof RegExp ? options.exclude : null; this.index = {}; this.follow = options.follow || false; this.loadPaths = _(options.loadPaths).map(function(p) { @@ -58,6 +59,8 @@ function Graph(options, dir) { // add a sass file to the graph Graph.prototype.addFile = function(filepath, parent) { + if (this.exclude !== null && this.exclude.test(filepath)) return; + var entry = this.index[filepath] = this.index[filepath] || { imports: [], importedBy: [], @@ -75,6 +78,9 @@ Graph.prototype.addFile = function(filepath, parent) { resolved = resolveSassPath(imports[i], loadPaths, this.extensions); if (!resolved) continue; + // check exclcude regex + if (this.exclude !== null && this.exclude.test(resolved)) continue; + // recurse into dependencies if not already enumerated if (!_.includes(entry.imports, resolved)) { entry.imports.push(resolved); @@ -92,7 +98,10 @@ Graph.prototype.addFile = function(filepath, parent) { resolvedParent = parent; } - entry.importedBy.push(resolvedParent); + // check exclcude regex + if (!(this.exclude !== null && this.exclude.test(resolvedParent))) { + entry.importedBy.push(resolvedParent); + } } }; diff --git a/test/fixtures/exclusion-pattern/also-exclude-me.scss b/test/fixtures/exclusion-pattern/also-exclude-me.scss new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/test/fixtures/exclusion-pattern/also-exclude-me.scss @@ -0,0 +1 @@ + diff --git a/test/fixtures/exclusion-pattern/dont-exclude.scss b/test/fixtures/exclusion-pattern/dont-exclude.scss new file mode 100644 index 0000000..aab961d --- /dev/null +++ b/test/fixtures/exclusion-pattern/dont-exclude.scss @@ -0,0 +1,2 @@ +@import 'also-exclude-me'; + diff --git a/test/fixtures/exclusion-pattern/exclude-me.scss b/test/fixtures/exclusion-pattern/exclude-me.scss new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/exclusion-pattern/index.scss b/test/fixtures/exclusion-pattern/index.scss new file mode 100644 index 0000000..bf6c6ee --- /dev/null +++ b/test/fixtures/exclusion-pattern/index.scss @@ -0,0 +1,3 @@ +@import "dont-exclude"; +@import "exclude-me"; + diff --git a/test/parse-file.js b/test/parse-file.js index a0a5691..80ebcff 100644 --- a/test/parse-file.js +++ b/test/parse-file.js @@ -160,5 +160,15 @@ describe('sass-graph', function(){ }); }); }); + + describe('with exclusion pattern', function() { + it('should exclude all files matching the regular expression', function() { + graph({ exclude: /exclude-/ }) + .fromFixtureFile('exclusion-pattern') + .assertDecendents([ + 'dont-exclude.scss', + ]); + }); + }); }); });