| 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; | 
| }; |