Skip to content

Commit

Permalink
Merge pull request #12 from dylang/bypass-bad-js
Browse files Browse the repository at this point in the history
don't throw error when esprima can't parse a file
  • Loading branch information
rumpl committed Sep 9, 2014
2 parents ee058f5 + 4dd53fa commit ff0d34a
Show file tree
Hide file tree
Showing 7 changed files with 67 additions and 24 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ var root = path.resolve("some path");
depcheck(root, options, function(unused) {
console.log(unused.dependencies);
console.log(unused.devDependencies);
console.log(unused.invalidFiles); // JS files that couldn't be parsed
});
```

Expand Down
50 changes: 32 additions & 18 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,35 @@ var q = require('q');
var walkdir = require("walkdir");
var _ = require('lodash');
var minimatch = require('minimatch');
var util = require('util');

function getModulesRequiredFromFilename(filename) {
var content = fs.readFileSync(filename, "utf-8");
return detective(content, {
word: '',
isRequire: function(node) {
var callee = node.callee;
return callee &&
(
(node.type === 'CallExpression' && callee.type === 'Identifier'
&& callee.name === 'require')
||
(callee.property && callee.property.name === 'loadNpmTasks')
);
}
});
try {
return detective(content, {
word: '',
isRequire: function(node) {
var callee = node.callee;
return callee &&
(
(node.type === 'CallExpression' && callee.type === 'Identifier'
&& callee.name === 'require')
||
(callee.property && callee.property.name === 'loadNpmTasks')
);
}
});
} catch (err) {
return err;
}
}

function checkDirectory(dir, ignoreDirs, deps, devDeps) {

var deferred = q.defer();
var directoryPromises = [];
var finder = walkdir(dir, { "no_recurse": true });
var invalidFiles = {};

finder.on("directory", function (subdir) {
if (ignoreDirs.contains(path.basename(subdir))
Expand All @@ -41,8 +47,12 @@ function checkDirectory(dir, ignoreDirs, deps, devDeps) {
finder.on("file", function (filename) {
if (path.extname(filename) === ".js") {
var modulesRequired = getModulesRequiredFromFilename(filename);
deps = deps.difference(modulesRequired);
devDeps = devDeps.difference(modulesRequired);
if (util.isError(modulesRequired)) {
invalidFiles[filename] = modulesRequired;
} else {
deps = deps.difference(modulesRequired.valueOf());
devDeps = devDeps.difference(modulesRequired);
}
}
});

Expand All @@ -51,14 +61,17 @@ function checkDirectory(dir, ignoreDirs, deps, devDeps) {

_(directoryResults).each(function(result) {
if (result.state === 'fulfilled') {
invalidFiles = _.merge(invalidFiles, result.value.invalidFiles, {});
deps = deps.intersection(result.value.dependencies);
devDeps = devDeps.intersection(result.value.devDependencies);
}
});

return {
dependencies: deps.valueOf(),
devDependencies: devDeps.valueOf()};
devDependencies: devDeps.valueOf(),
invalidFiles: invalidFiles
};
}));
});

Expand All @@ -75,7 +88,8 @@ function depCheck(rootDir, options, cb) {
'.svn',
'.hg',
'.idea',
'node_modules'
'node_modules',
'bower_components'
])
.concat(options.ignoreDirs)
.flatten()
Expand Down Expand Up @@ -106,4 +120,4 @@ function depCheck(rootDir, options, cb) {
.done();
}

module.exports = depCheck;
module.exports = depCheck;
11 changes: 5 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,14 @@
"readmeFilename": "README.md",
"dependencies": {
"detective": "^3.1.0",
"esprima": "~1.0.4",
"lodash": "^2.4.1",
"minimatch": "^0.3.0",
"minimatch": "^1.0.0",
"optimist": "~0.6.0",
"q": "^1.0.1",
"walkdir": "0.0.7",
"optimist": "~0.6.0"
"walkdir": "0.0.7"
},
"devDependencies": {
"should": "~1.2.2",
"mocha": "~1.8.1"
"mocha": "^1.21.4",
"should": "^4.0.4"
}
}
7 changes: 7 additions & 0 deletions test/fake_modules/bad_js/deeper/also_bad_js.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@

// there's a ) missing which will make it impossible parse
;["util","assert"].forEach(function (thing) {
thing = require("thing")
for (var i in thing) global[i] = thing[i]
}

7 changes: 7 additions & 0 deletions test/fake_modules/bad_js/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@

// there's a ) missing which will make it impossible parse
;["util","assert"].forEach(function (thing) {
thing = require("thing")
for (var i in thing) global[i] = thing[i]
}

5 changes: 5 additions & 0 deletions test/fake_modules/bad_js/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"dependencies": {
"optimist": "~0.6.0"
}
}
10 changes: 10 additions & 0 deletions test/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,4 +66,14 @@ describe("depcheck", function () {
});
});

it("should should ignore bad javascript", function testBadJS(done) {
var absolutePath = path.resolve("test/fake_modules/bad_js");

depcheck(absolutePath, { }, function checked(unused) {
assert.equal(unused.dependencies.length, 1);
assert.deepEqual(Object.keys(unused.invalidFiles).length, 2);
done();
});
});

});

0 comments on commit ff0d34a

Please sign in to comment.