diff options
Diffstat (limited to 'lib/module.js')
-rw-r--r-- | lib/module.js | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/lib/module.js b/lib/module.js index 11c518922..daf73d96f 100644 --- a/lib/module.js +++ b/lib/module.js @@ -20,7 +20,7 @@ // USE OR OTHER DEALINGS IN THE SOFTWARE. var NativeModule = require('native_module'); -var Script = process.binding('evals').Script; +var Script = process.binding('evals').NodeScript; var runInThisContext = Script.runInThisContext; var runInNewContext = Script.runInNewContext; var assert = require('assert').ok; @@ -360,6 +360,7 @@ Module.prototype._compile = function(content, filename) { require.cache = Module._cache; var dirname = path.dirname(filename); + var define = makeDefine(require, self); if (Module._contextLoad) { if (self.id !== '.') { @@ -376,6 +377,7 @@ Module.prototype._compile = function(content, filename) { sandbox.module = self; sandbox.global = sandbox; sandbox.root = root; + sandbox.define = define; return runInNewContext(content, sandbox, filename, true); } @@ -387,6 +389,7 @@ Module.prototype._compile = function(content, filename) { global.__filename = filename; global.__dirname = dirname; global.module = self; + global.define = define; return runInThisContext(content, filename, true); } @@ -398,10 +401,44 @@ Module.prototype._compile = function(content, filename) { if (filename === process.argv[1] && global.v8debug) { global.v8debug.Debug.setBreakPoint(compiledWrapper, 0, 0); } - var args = [self.exports, require, self, filename, dirname]; + + var args = [self.exports, require, self, filename, dirname, define]; return compiledWrapper.apply(self.exports, args); }; +// AMD compatibility +function makeDefine(require, module) { + var called = false; + function define() { + if (called) { + throw new Error("define() may only be called once."); + } + called = true; + + // only care about the last argument + var cb = arguments[ arguments.length - 1 ]; + + // set exports immediately: + // define({ foo: "bar" }) + if (typeof cb !== 'function') { + module.exports = cb; + return; + } + + var ret = cb(require, module.exports, module); + + if (ret !== undefined) { + // set exports with return statement + // define(function () { return { foo: "bar" } }) + module.exports = ret; + } + } + + return define; +} + + + // Native extension for .js Module._extensions['.js'] = function(module, filename) { var content = NativeModule.require('fs').readFileSync(filename, 'utf8'); |