I want to check if file is "requirable" or not, how can I do it?
I checked npm packages, googled stackoverflow and read nodejs documentation, but still has no answer.
I search the way to write isRequirable()
function, which will work as in the examples
Obvious examples:
isRequirable('./package.json') // true
isRequirable('./asd.txt') // false
Not so obvious examples:
$ cat normal.js
module.exports = function();
$ cat eval.js
({
evil: true
})
then
isRequirable('./normal.js') // true
isRequirable('./eval.js') // false
As not an expert in Node i suggest to use two step checking with regular expression and try-catch module request.
It covers most cases including file bundled with Browserify or another packer.
Check it out:
// isRequirable.js
var fs = require('fs');
var isRequirable = function (filename) {
var result;
var content;
var rex = /(?:^|\s*;|\s*=)\s*(?:module\.)*exports(\..+)*\s*=\s*.+/gm;
try {
content = fs.readFileSync(filename).toString();
} catch (err) {
content = '';
console.log(err);
}
result = content.match(rex) ? true : false;
if (result) {
try {
var temp = require(filename);
} catch (err) {
result = false;
console.log(err);
}
}
return result;
};
module.exports = isRequirable;
in another place
var isRequirable = require('./isRequirable');
console.log(isRequirable('./isRequirable.js'));
// true
console.log(isRequirable('./eval.js'));
// false
console.log(isRequirable('./test.js')); // where test.js is (function () {})();
// false
console.log(isRequirable('nonexistent'));
// { ... no such file or directory ... ]
// false
console.log(isRequirable('./browserify/bundle.js'));
// [ReferenceError: document is not defined]
// false