diff --git a/README.md b/README.md index 8005b3f..e2fe903 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ var bar = require('foo/bar.js') ### Attentions - Require hook will pollute `Module._load()`. You must be knowing this, and there's a `requere/deregister` to help you disable require hook. -- `requere`'s require hook may conflict with other package's require hook, e.g. [`CoffeeScript`](http://coffeescript.org/), [`Babel`](https://babeljs.io/). Though my test looks fine when using `requere`, `CoffeeScript` and `Babel` together. +- `requere`'s require hook may conflict with other package's require hook, e.g. [`CoffeeScript`](http://coffeescript.org/), [`Babel`](https://babeljs.io/). If you use `requere()` instead register hook, everything goes fine. # Contributors diff --git a/lib/resolver.js b/lib/resolver.js index c7e6a80..5547d8d 100644 --- a/lib/resolver.js +++ b/lib/resolver.js @@ -1,16 +1,20 @@ +var Module = require('module') var path = require('path') var fs = require('fs') -function exists (target) { - var found = false - - found = fs.existsSync(target) - - if (!found && path.extname(target) === '') { - found = fs.existsSync(target + '.js') +function exists (target, extensions) { + if (fs.existsSync(target)) { + return target } - return found + if (path.extname(target) === '') { + for (var i = 0; i < extensions.length; i++) { + var resolvedPath = target + extensions[i] + if (fs.existsSync(resolvedPath)) { + return resolvedPath + } + } + } } module.exports = function resolver (request, parent) { @@ -20,17 +24,19 @@ module.exports = function resolver (request, parent) { var resolvedPath var i = 0 + var extensions = Object.keys(Module._extensions) for (i = 0; i < parent.paths.length; i++) { - resolvedPath = path.resolve(parent.paths[i], request) - if (fs.existsSync(resolvedPath)) { + resolvedPath = exists(path.resolve(parent.paths[i], request), extensions) + if (resolvedPath) { return resolvedPath } } for (i = 0; i < parent.paths.length; i++) { resolvedPath = path.resolve(parent.paths[i].slice(0, parent.paths[i].lastIndexOf('node_modules')), request) - if (exists(resolvedPath)) { + resolvedPath = exists(resolvedPath, extensions) + if (resolvedPath) { return resolvedPath } } diff --git a/package.json b/package.json index 0a58bc9..6f58142 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "lint": "./node_modules/eslint/bin/eslint.js .", - "test": "node node_modules/istanbul/lib/cli.js cover node_modules/mocha/bin/_mocha --check-leaks test/*.js", + "test": "node node_modules/istanbul/lib/cli.js cover node_modules/mocha/bin/_mocha --check-leaks test/standalone/index.js test/register/index.js", "test-travis": "npm run lint && npm test" }, "repository": { @@ -19,7 +19,6 @@ }, "homepage": "https://github.com/chrisyip/requere", "devDependencies": { - "babel": "^5.0.12", "chai": "^2.2.0", "coffee-script": "^1.9.1", "eslint": "^0.19.0", diff --git a/test/index.js b/test/index.js deleted file mode 100644 index f932977..0000000 --- a/test/index.js +++ /dev/null @@ -1,79 +0,0 @@ -var expect = require('chai').expect -var requere = require('../') - -describe('requere()', function () { - afterEach(function () { - require('../deregister.js') - }) - - it('should be a function', function () { - expect(requere).to.be.a('function') - }) - - it('should require module correctly', function () { - var path = requere('path') - expect(path).to.equal(require('path')) - expect(require('./textual/a.js')).to.equal(requere('test/textual/a.js')) - }) - - it('should resolve module start from module root', function () { - var res1 = requere('test/textual/nested/nested') - var res2 = require('../test/textual/nested/nested.js') - - expect(res1).to.be.equal(res2) - }) - - it('should work with transipler', function () { - require('babel/register') - - require('coffee-script/register') - - var b = requere('test/textual/b.coffee') - expect(b()).to.equal('Module B') - - var es = requere('test/textual/es6.js').func - expect(es()).to.equal('ES 6 Module') - }) - - it('should throw exception if module cannot found', function () { - var func = function () { - requere('module_not_found') - } - expect(func).to.throw('Cannot find module \'module_not_found\'') - }) -}) - -describe('requere/register', function () { - var path = require('path') - requere('register.js') - - it('should require module correctly', function () { - var _path = require('path') - expect(path).to.equal(_path) - }) - - it('should resolve module start from module root', function () { - var res = require('test/textual/nested/nested') - - expect(res).to.be.equal('foo.js in nested folders') - }) - - it('should work with transipler', function () { - require('babel/register') - - require('coffee-script/register') - - var b = require('test/textual/b.coffee') - expect(b()).to.equal('Module B') - - var es = require('test/textual/es6.js').func - expect(es()).to.equal('ES 6 Module') - }) - - it('should throw exception if module cannot found', function () { - var func = function () { - require('module_not_found') - } - expect(func).to.throw('Cannot find module \'module_not_found\'') - }) -}) diff --git a/test/register/index.js b/test/register/index.js new file mode 100644 index 0000000..c50a283 --- /dev/null +++ b/test/register/index.js @@ -0,0 +1,31 @@ +var expect = require('chai').expect +var path = require('path') + +require('../../register.js') + +describe('requere/register', function () { + it('should require module correctly', function () { + var _path = require('path') + expect(path).to.equal(_path) + }) + + it('should resolve module start from module root', function () { + var res = require('test/textual/nested/nested') + + expect(res).to.be.equal('foo.js in nested folders') + }) + + it('should work with transipler', function () { + require('coffee-script/register') + + var b = require('test/textual/b.coffee') + expect(b()).to.equal('Module B') + }) + + it('should throw exception if module cannot found', function () { + var func = function () { + require('module_not_found') + } + expect(func).to.throw('Cannot find module \'module_not_found\'') + }) +}) diff --git a/test/standalone/index.js b/test/standalone/index.js new file mode 100644 index 0000000..a671907 --- /dev/null +++ b/test/standalone/index.js @@ -0,0 +1,35 @@ +var expect = require('chai').expect +var requere = require('../../index.js') + +describe('requere()', function () { + it('should be a function', function () { + expect(requere).to.be.a('function') + }) + + it('should require module correctly', function () { + var path = requere('path') + expect(path).to.equal(require('path')) + expect(require('../textual/a.js')).to.equal(requere('test/textual/a.js')) + }) + + it('should resolve module start from module root', function () { + var res1 = requere('test/textual/nested/nested') + var res2 = require('../../test/textual/nested/nested.js') + + expect(res1).to.be.equal(res2) + }) + + it('should work with transipler', function () { + require('coffee-script/register') + + var b = requere('test/textual/b.coffee') + expect(b()).to.equal('Module B') + }) + + it('should throw exception if module cannot found', function () { + var func = function () { + requere('module_not_found') + } + expect(func).to.throw('Cannot find module \'module_not_found\'') + }) +}) diff --git a/test/textual/es6.js b/test/textual/es6.js deleted file mode 100644 index 3ebcb6d..0000000 --- a/test/textual/es6.js +++ /dev/null @@ -1,5 +0,0 @@ -function func() { - return 'ES 6 Module' -} - -export {func} diff --git a/test/textual/nested/nested.js b/test/textual/nested/nested.js index 7b11892..ee136b2 100644 --- a/test/textual/nested/nested.js +++ b/test/textual/nested/nested.js @@ -1 +1,2 @@ -module.exports = require('test/textual/nested/foo.js') +var requere = require('../../../index.js') +module.exports = requere('test/textual/nested/foo.js')