60 lines
2.2 KiB
JavaScript
60 lines
2.2 KiB
JavaScript
|
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;
|