diff --git a/lib/RequireContext.js b/lib/RequireContext.js index 24ed035..428569e 100644 --- a/lib/RequireContext.js +++ b/lib/RequireContext.js @@ -251,10 +251,15 @@ RequireContext.prototype.theDefine = function theDefine(dependencies, fn, arg3) parent.exports = fn; } else { fn = dependencies; - if(typeof fn == "function") - fn(reqFn, parent.exports, parent); - else + if(typeof fn == "function"){ + var orignalExports = parent.exports; + var fnReturnExports = fn(reqFn, parent.exports, parent); + if(orignalExports === parent.exports && Object.keys(orignalExports).length === 0 && fnReturnExports !== undefined) { + parent.exports = fnReturnExports; + } + }else{ parent.exports = fn; + } } } diff --git a/test/commonjs.js b/test/commonjs.js index df85629..287dd5e 100644 --- a/test/commonjs.js +++ b/test/commonjs.js @@ -77,4 +77,43 @@ describe("commonjs", function() { fs.should.be.equal(require("fs")); }); -}); \ No newline at end of file + it("should define a module by returning a value from a define wrapper", function(done) { + var data = req('./fixtures/commonjs/wrappedReturn'); + data.a.should.be.equal(1); + done(); + }); + + it("should give priority to 'module.exports' or 'exports' instead of the value returned", function(done) { + var data = req('./fixtures/commonjs/wrappedReturnAndSetExports'); + data.a.should.be.equal(1); + done(); + }); + + it("should return an empty object if nothing is returned or set on 'module.exports' or 'exports'", function(done) { + var data = req('./fixtures/commonjs/wrappedEmpty'); + data.should.be.a("object"); + done(); + }); + + it("should be able to return a falsy value", function(done) { + var data = req('./fixtures/commonjs/wrappedFalsy'); + data.should.be.equal(false); + done(); + }); + + it("should return an empty object when returns undefined", function(done) { + var data = req('./fixtures/commonjs/wrappedModuleExportsUndefined'); + should.not.exist(data); + done(); + }); + + it("should define a module with exports when wrapped", function(done) { + var data = req('./fixtures/commonjs/wrappedModuleExportsValue'); + data.test.should.be.equal(1); + done(); + }); + + + + +}); diff --git a/test/fixtures/commonjs/wrappedEmpty.js b/test/fixtures/commonjs/wrappedEmpty.js new file mode 100644 index 0000000..11a3cc7 --- /dev/null +++ b/test/fixtures/commonjs/wrappedEmpty.js @@ -0,0 +1,2 @@ +define(function(require, exports, module){ +}); diff --git a/test/fixtures/commonjs/wrappedFalsy.js b/test/fixtures/commonjs/wrappedFalsy.js new file mode 100644 index 0000000..a4b6f1b --- /dev/null +++ b/test/fixtures/commonjs/wrappedFalsy.js @@ -0,0 +1,3 @@ +define(function(require, exports, module){ + return false; +}); diff --git a/test/fixtures/commonjs/wrappedModuleExportsUndefined.js b/test/fixtures/commonjs/wrappedModuleExportsUndefined.js new file mode 100644 index 0000000..50e52a1 --- /dev/null +++ b/test/fixtures/commonjs/wrappedModuleExportsUndefined.js @@ -0,0 +1,3 @@ +define(function(require, exports, module) { + module.exports = undefined; +}); diff --git a/test/fixtures/commonjs/wrappedModuleExportsValue.js b/test/fixtures/commonjs/wrappedModuleExportsValue.js new file mode 100644 index 0000000..1336dc5 --- /dev/null +++ b/test/fixtures/commonjs/wrappedModuleExportsValue.js @@ -0,0 +1,3 @@ +define(function(require, exports, module) { + module.exports = {test: 1} +}); diff --git a/test/fixtures/commonjs/wrappedReturn.js b/test/fixtures/commonjs/wrappedReturn.js new file mode 100644 index 0000000..13b4e63 --- /dev/null +++ b/test/fixtures/commonjs/wrappedReturn.js @@ -0,0 +1,5 @@ +define(function(require, exports, module){ + return { + a: 1 + } +}); diff --git a/test/fixtures/commonjs/wrappedReturnAndSetExports.js b/test/fixtures/commonjs/wrappedReturnAndSetExports.js new file mode 100644 index 0000000..ee07617 --- /dev/null +++ b/test/fixtures/commonjs/wrappedReturnAndSetExports.js @@ -0,0 +1,6 @@ +define(function(require, exports, module){ + exports.a = 1; + return { + a: 2 + } +}); diff --git a/test/fixtures/hot/counter-value.js b/test/fixtures/hot/counter-value.js new file mode 100644 index 0000000..944faf1 --- /dev/null +++ b/test/fixtures/hot/counter-value.js @@ -0,0 +1 @@ +module.exports = 3 \ No newline at end of file