diff --git a/src/node.js b/src/node.js index f8b53add8d..571755b4e0 100644 --- a/src/node.js +++ b/src/node.js @@ -146,46 +146,56 @@ removed('require.registerExtension() removed.' + ' Use require.extensions instead'); - // Which files to traverse while finding id? Returns generator function. - function traverser(id, dirs) { - var head = [], inDir = [], dirs = dirs.slice(), + // given a module name, and a list of paths to test, returns the first + // matching file in the following precedence. + // + // require("a.") + // -> a. + // + // require("a") + // -> a + // -> a. + // -> a/index. + function findModulePath(request, paths) { + var fs = requireNative('fs'), exts = Object.keys(extensions); - return function next() { - var result = head.shift(); - if (result) { return result; } - - var gen = inDir.shift(); - if (gen) { head = gen(); return next(); } - - var dir = dirs.shift(); - if (dir !== undefined) { - function direct(ext) { return path.join(dir, id + ext); } - function index(ext) { return path.join(dir, id, 'index' + ext); } - inDir = [ - function() { return exts.map(direct); }, - function() { return exts.map(index); } - ]; - head = [path.join(dir, id)]; - return next(); - } - }; - } - function findModulePath(request, paths) { - var nextLoc = - traverser(request, request.charAt(0) === '/' ? [''] : paths); + paths = request.charAt(0) === '/' ? [''] : paths; - var fs = requireNative('fs'); + // check if the file exists and is not a directory + var tryFile = function(requestPath) { + try { + stats = fs.statSync(requestPath); + if (stats && !stats.isDirectory()) { + return requestPath; + } + } catch (e) {} + return false; + }; - var location, stats; - while (location = nextLoc()) { - try { stats = fs.statSync(location); } catch (e) { continue; } - if (stats && !stats.isDirectory()) return location; + // given a path check a the file exists with any of the set extensions + var tryExtensions = function(p, extension) { + for (var i = 0, EL = exts.length; i < EL; i++) { + f = tryFile(p + exts[i]); + if (f) { return f; } + } + return false; + }; + + // For each path + for (var i = 0, PL = paths.length; i < PL; i++) { + var p = paths[i], + // try to join the request to the path + f = tryFile(path.join(p, request)) || + // try it with each of the extensions + tryExtensions(path.join(p, request)) || + // try it with each of the extensions at "index" + tryExtensions(path.join(p, request, 'index')); + if (f) { return f; } } return false; } - // sync - no i/o performed function resolveModuleLookupPaths(request, parent) {