| var path = require('path'); |
| |
| var extension = require('./lib/extension'); |
| var normalize = require('./lib/normalize'); |
| var register = require('./lib/register'); |
| |
| exports.prepare = function(extensions, filepath, cwd, nothrow) { |
| var config, usedExtension, err, option, attempt, error; |
| var attempts = []; |
| var onlyErrors = true; |
| var exts = extension(filepath); |
| |
| if (exts) { |
| exts.some(function(ext) { |
| usedExtension = ext; |
| config = normalize(extensions[ext]); |
| return !!config; |
| }); |
| } |
| |
| if (Object.keys(require.extensions).indexOf(usedExtension) !== -1) { |
| return true; |
| } |
| |
| if (!config) { |
| if (nothrow) { |
| return; |
| } |
| |
| throw new Error('No module loader found for "' + usedExtension + '".'); |
| } |
| |
| 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; |
| } |
| } |
| if (onlyErrors) { |
| err = new Error('Unable to use specified module loaders for "' + usedExtension + '".'); |
| err.failures = attempts; |
| if (nothrow) { |
| return err; |
| } |
| |
| throw err; |
| } |
| return attempts; |
| }; |