You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

60 lines
2.2 KiB

var fs = require('fs-extra');
var path = require('path');
var config = require('./fetchRequires.config.js');
function checkConfig () {
if (!config.requirePattern) {
throw new Error("requirePattern needed at fetchRequires.config.js - Use it to define the regular expression to use for finding require invocations. Example: require\\('(\\..+)'\\)");
}
if (!config.defaultExt) {
throw new Error("defaultExt needed at fetchRequires.config.js - Use it to define the default extension to use for modules. Example: '.js'");
}
if (!config.validExtensions) {
throw new Error("validExtensions needed at fetchRequires.config.js - Use it to laod modules as is. That's it, to define valid extensions that don't need appending the default extension. Example: ['.tpl', '.json']");
}
}
var fetchRequires = function (absoluteFilePath) {
checkConfig();
var requirePattern = config.requirePattern;
var requireGlobalRegex = new RegExp(requirePattern, 'g');
var requireRegex = new RegExp(requirePattern);
var defaultExt = config.defaultExt;
var validExtensions = config.validExtensions;
return new Promise(function (resolve, reject) {
fs.readFile(absoluteFilePath, 'utf8', function (err, data) {
if (err) {
if (err.code && err.code === 'ENOENT') {
var error = new Error("ENOENT: no such file '" + err.path + "'. Perhaps we're adding the default extension to a valid file. Check `validExtensions` in fetchRequires.config.js and add a new one if needed.");
reject(error);
return;
}
reject(err);
return;
}
var requires = [];
if (data) {
var matchData = data.match(requireGlobalRegex);
if (matchData) {
matchData.forEach(function (require) {
var exec = requireRegex.exec(require);
if (exec) {
var absolutePath = path.resolve(path.dirname(absoluteFilePath), exec[1]);
var ext = path.extname(absolutePath);
if (validExtensions.indexOf(ext) === -1) {
absolutePath += defaultExt;
}
requires.push(absolutePath);
}
});
}
}
resolve(requires);
});
});
};
module.exports = fetchRequires;