Spaces:
Running
Running
var path = require('path'); | |
var parse = path.parse || require('path-parse'); // eslint-disable-line global-require | |
var getNodeModulesDirs = function getNodeModulesDirs(absoluteStart, modules) { | |
var prefix = '/'; | |
if ((/^([A-Za-z]:)/).test(absoluteStart)) { | |
prefix = ''; | |
} else if ((/^\\\\/).test(absoluteStart)) { | |
prefix = '\\\\'; | |
} | |
var paths = [absoluteStart]; | |
var parsed = parse(absoluteStart); | |
while (parsed.dir !== paths[paths.length - 1]) { | |
paths.push(parsed.dir); | |
parsed = parse(parsed.dir); | |
} | |
return paths.reduce(function (dirs, aPath) { | |
return dirs.concat(modules.map(function (moduleDir) { | |
return path.resolve(prefix, aPath, moduleDir); | |
})); | |
}, []); | |
}; | |
module.exports = function nodeModulesPaths(start, opts, request) { | |
var modules = opts && opts.moduleDirectory | |
? [].concat(opts.moduleDirectory) | |
: ['node_modules']; | |
if (opts && typeof opts.paths === 'function') { | |
return opts.paths( | |
request, | |
start, | |
function () { return getNodeModulesDirs(start, modules); }, | |
opts | |
); | |
} | |
var dirs = getNodeModulesDirs(start, modules); | |
return opts && opts.paths ? dirs.concat(opts.paths) : dirs; | |
}; | |