60 lines
1.3 KiB
JavaScript
60 lines
1.3 KiB
JavaScript
const path = require('path');
|
|
|
|
const extension = require('./lib/extension');
|
|
const normalize = require('./lib/normalize');
|
|
const register = require('./lib/register');
|
|
|
|
exports.prepare = function (extensions, filepath, cwd, nothrow) {
|
|
var option, attempt;
|
|
var attempts = [];
|
|
var err;
|
|
var onlyErrors = false;
|
|
var ext = extension(filepath);
|
|
if (Object.keys(require.extensions).indexOf(ext) !== -1) {
|
|
return true;
|
|
}
|
|
var config = normalize(extensions[ext]);
|
|
if (!config) {
|
|
if (nothrow) {
|
|
return;
|
|
} else {
|
|
throw new Error('No module loader found for "'+ext+'".');
|
|
}
|
|
}
|
|
if (!cwd) {
|
|
cwd = path.dirname(path.resolve(filepath));
|
|
}
|
|
if (!Array.isArray(config)) {
|
|
config = [config];
|
|
}
|
|
for (var i in config) {
|
|
option = config[i];
|
|
attempt = register(cwd, option.module, option.register);
|
|
error = (attempt instanceof Error) ? attempt : null;
|
|
if (error) {
|
|
attempt = null;
|
|
}
|
|
attempts.push({
|
|
moduleName: option.module,
|
|
module: attempt,
|
|
error: error
|
|
});
|
|
if (!error) {
|
|
onlyErrors = false;
|
|
break;
|
|
} else {
|
|
onlyErrors = true;
|
|
}
|
|
}
|
|
if (onlyErrors) {
|
|
err = new Error('Unable to use specified module loaders for "'+ext+'".');
|
|
err.failures = attempts;
|
|
if (nothrow) {
|
|
return err;
|
|
} else {
|
|
throw err;
|
|
}
|
|
}
|
|
return attempts;
|
|
};
|