module: test for directories, fix require with ..
authorRobert Kowalski <rok@kowalski.gd>
Mon, 10 Feb 2014 20:14:53 +0000 (21:14 +0100)
committerBen Noordhuis <info@bnoordhuis.nl>
Sat, 6 Dec 2014 21:14:05 +0000 (22:14 +0100)
Given my home-directory is `/Users/rocko` - and I have a file named
`npm.json` in it and also a repository with name `npm`, which is a
folder for the node-module.

When try to require the `/Users/rocko/npm/index.js` two direcotry
levels down in the npm folder (e.g. `/Users/rocko/npm/test/tap`)
with require("../../") node will load `/Users/rocko/npm/index.json`.

When I use require("../..") node will load `/Users/rocko/npm.json`
which is fixed by this commit.

PR-URL: https://github.com/iojs/io.js/pull/58
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-by: Chris Dickinson <christopher.s.dickinson@gmail.com>
Reviewed-By: Rod Vagg <rod@vagg.org>
lib/module.js
test/fixtures/json-with-directory-name-module/module-stub.json [new file with mode: 0644]
test/fixtures/json-with-directory-name-module/module-stub/index.js [new file with mode: 0644]
test/fixtures/json-with-directory-name-module/module-stub/one-trailing-slash/two/three.js [new file with mode: 0644]
test/fixtures/json-with-directory-name-module/module-stub/one/two/three.js [new file with mode: 0644]
test/fixtures/json-with-directory-name-module/module-stub/package.json [new file with mode: 0644]
test/simple/test-require-extensions-same-filename-as-dir-trailing-slash.js [new file with mode: 0644]
test/simple/test-require-extensions-same-filename-as-dir.js [new file with mode: 0644]

index 6dab491..8662b4e 100644 (file)
@@ -172,20 +172,21 @@ Module._findPath = function(request, paths) {
     var filename;
 
     if (!trailingSlash) {
+      var stats = statPath(basePath);
       // try to join the request to the path
       filename = tryFile(basePath);
 
-      if (!filename && !trailingSlash) {
+      if (!filename && stats && stats.isDirectory()) {
+        filename = tryPackage(basePath, exts);
+      }
+
+      if (!filename) {
         // try it with each of the extensions
         filename = tryExtensions(basePath, exts);
       }
     }
 
     if (!filename) {
-      filename = tryPackage(basePath, exts);
-    }
-
-    if (!filename) {
       // try it with each of the extensions at "index"
       filename = tryExtensions(path.resolve(basePath, 'index'), exts);
     }
diff --git a/test/fixtures/json-with-directory-name-module/module-stub.json b/test/fixtures/json-with-directory-name-module/module-stub.json
new file mode 100644 (file)
index 0000000..472a445
--- /dev/null
@@ -0,0 +1 @@
+{"rocko": "artischocko"}
diff --git a/test/fixtures/json-with-directory-name-module/module-stub/index.js b/test/fixtures/json-with-directory-name-module/module-stub/index.js
new file mode 100644 (file)
index 0000000..5cbb00b
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+module.exports = "hello from module-stub!"
diff --git a/test/fixtures/json-with-directory-name-module/module-stub/one-trailing-slash/two/three.js b/test/fixtures/json-with-directory-name-module/module-stub/one-trailing-slash/two/three.js
new file mode 100644 (file)
index 0000000..a02399e
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+module.exports = require('../../');
diff --git a/test/fixtures/json-with-directory-name-module/module-stub/one/two/three.js b/test/fixtures/json-with-directory-name-module/module-stub/one/two/three.js
new file mode 100644 (file)
index 0000000..19025cd
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+module.exports = require('../..');
diff --git a/test/fixtures/json-with-directory-name-module/module-stub/package.json b/test/fixtures/json-with-directory-name-module/module-stub/package.json
new file mode 100644 (file)
index 0000000..4c380f6
--- /dev/null
@@ -0,0 +1,7 @@
+{
+  "version": "1.1.12",
+  "name": "module-stub",
+  "main": "./index.js",
+  "description": "A stub for node tests",
+  "author": "Robert Kowalski <rok@kowalski.gd>"
+}
diff --git a/test/simple/test-require-extensions-same-filename-as-dir-trailing-slash.js b/test/simple/test-require-extensions-same-filename-as-dir-trailing-slash.js
new file mode 100644 (file)
index 0000000..6469d14
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+
+var content = require(common.fixturesDir +
+  '/json-with-directory-name-module/module-stub/one-trailing-slash/two/three.js');
+
+assert.notEqual(content.rocko, 'artischocko');
+assert.equal(content, 'hello from module-stub!');
diff --git a/test/simple/test-require-extensions-same-filename-as-dir.js b/test/simple/test-require-extensions-same-filename-as-dir.js
new file mode 100644 (file)
index 0000000..fbfba3b
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+
+var content = require(common.fixturesDir +
+  '/json-with-directory-name-module/module-stub/one/two/three.js');
+
+assert.notEqual(content.rocko, 'artischocko');
+assert.equal(content, 'hello from module-stub!');