Skip to content

Instantly share code, notes, and snippets.

@nickstenning
Created August 4, 2010 20:47
Show Gist options
  • Save nickstenning/508771 to your computer and use it in GitHub Desktop.
Save nickstenning/508771 to your computer and use it in GitHub Desktop.
diff --git a/lib/module.js b/lib/module.js
index 72814a7..1db1cb4 100644
--- a/lib/module.js
+++ b/lib/module.js
@@ -83,17 +83,6 @@ var pathFn = process.compile("(function (exports) {" + natives.path + "\n})",
var pathModule = createInternalModule('path', pathFn);
var path = pathModule.exports;
-function existsSync (path) {
- try {
- process.binding('fs').stat(path);
- return true;
- } catch (e) {
- return false;
- }
-}
-
-
-
var modulePaths = [path.join(process.execPath, "..", "..", "lib", "node")];
if (process.env["HOME"]) {
@@ -104,7 +93,6 @@ if (process.env["NODE_PATH"]) {
modulePaths = process.env["NODE_PATH"].split(":").concat(modulePaths);
}
-
/* Sync unless callback given */
function findModulePath (id, dirs, callback) {
process.assert(dirs.constructor == Array);
@@ -154,32 +142,47 @@ function findModulePath (id, dirs, callback) {
locations.push(path.join(dir, id, 'index' + ext));
}
+ var fs = requireNative('fs');
+
function searchLocations () {
var location = locations.shift();
- if (!location) {
- return findModulePath(id, rest, callback);
+
+ if (!location && rest.length > 0) {
+ return findModulePath(id, rest);
+ } else if (location) {
+ try {
+ var stats = fs.statSync(location);
+ if (stats && !stats.isDirectory()) return location;
+ } catch(e) {}
+ return searchLocations();
+ } else {
+ return false;
}
+ }
- // if async
- if (callback) {
- path.exists(location, function (found) {
- if (found) {
- callback(location);
+ function searchLocationsAsync (cb) {
+ var location = locations.shift();
+
+ if (!location && rest.length > 0) {
+ findModulePath(id, rest, cb);
+ } else if (location) {
+ fs.stat(location, function (err, stats) {
+ if (stats && !stats.isDirectory()) {
+ cb(location);
} else {
- return searchLocations();
+ searchLocationsAsync(cb);
}
});
-
- // if sync
} else {
- if (existsSync(location)) {
- return location;
- } else {
- return searchLocations();
- }
+ cb(false);
}
}
- return searchLocations();
+
+ if (callback) {
+ return searchLocationsAsync(callback);
+ } else {
+ return searchLocations();
+ }
}
diff --git a/test/fixtures/empty/.gitkeep b/test/fixtures/empty/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/test/simple/test-module-loading.js b/test/simple/test-module-loading.js
index 5245e4e..7405c08 100644
--- a/test/simple/test-module-loading.js
+++ b/test/simple/test-module-loading.js
@@ -106,6 +106,23 @@ process.assert(foo.bar.expect === foo.bar.actual);
assert.equal(require('../fixtures/foo').foo, 'ok',
'require module with no extension');
+// Should not attempt to load a directory
+try {
+ require("../fixtures/empty");
+} catch(err) {
+ assert.equal(err.message, "Cannot find module '../fixtures/empty'");
+}
+
+var asyncRequireDir = false;
+require.async("../fixtures/empty", function (err, a) {
+ assert.ok(err);
+
+ if (err) {
+ asyncRequireDir = true;
+ assert.equal(err.message, "Cannot find module '../fixtures/empty'");
+ }
+});
+
process.addListener("exit", function () {
assert.equal(true, a.A instanceof Function);
assert.equal("A done", a.A());
@@ -128,5 +145,7 @@ process.addListener("exit", function () {
assert.equal(true, errorThrownAsync);
+ assert.equal(true, asyncRequireDir);
+
console.log("exit");
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment