diff options
author | Johannes Ewald <mail@johannesewald.de> | 2013-02-23 17:52:22 +0400 |
---|---|---|
committer | Johannes Ewald <mail@johannesewald.de> | 2013-02-23 17:52:22 +0400 |
commit | 6040974a2f0bc91b3aed0a389584c967831dd1dd (patch) | |
tree | 6fe8a1c3aaafaf7a7aca989e369ca38222498d82 /lib/moduleEnv.js | |
parent | 5fcb70fd718abc7b3f556932c68f7d3a3cbcde34 (diff) |
- added Coffee-Script support closes #8 (jashkenas/coffee-script#2707)
- renamed internalRewire.js to simply rewire.js
- moved all the stuff related to manipulating the module environment to moduleEnv.js
Diffstat (limited to 'lib/moduleEnv.js')
-rw-r--r-- | lib/moduleEnv.js | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/lib/moduleEnv.js b/lib/moduleEnv.js new file mode 100644 index 0000000..d17918b --- /dev/null +++ b/lib/moduleEnv.js @@ -0,0 +1,82 @@ +"use strict"; + +var Module = require("module"), + fs = require("fs"); + + // caching original wrapper +var moduleWrapper0 = Module.wrapper[0], + moduleWrapper1 = Module.wrapper[1], + originalExtensions = {}, + nodeRequire, + currentModule; + +function load(targetModule) { + nodeRequire = targetModule.require; + targetModule.require = requireProxy; + currentModule = targetModule; + + registerExtensions(); + targetModule.load(targetModule.id); + + // This is only necessary if nothing has been required within the module + reset(); +} + +function reset() { + Module.wrapper[0] = moduleWrapper0; + Module.wrapper[1] = moduleWrapper1; + restoreExtensions(); +} + +function inject(prelude, appendix) { + Module.wrapper[0] = moduleWrapper0 + prelude; + Module.wrapper[1] = appendix + moduleWrapper1; +} + +/** + * Proxies the first require call in order to draw back all changes to the Module.wrapper. + * Thus our changes don't influence other modules + * + * @param {!String} path + */ +function requireProxy(path) { + reset(); + currentModule.require = nodeRequire; + return nodeRequire.call(currentModule, path); // node's require only works when "this" points to the module +} + +function registerExtensions() { + originalExtensions.coffee = require.extensions[".coffee"]; + require.extensions[".coffee"] = coffeeExtension; +} + +function restoreExtensions() { + require.extensions[".coffee"] = originalExtensions.coffee; +} + +function coffeeExtension(module, filename) { + var coffee = require("coffee-script"), + content = stripBOM(fs.readFileSync(filename, "utf8")); + + content = coffee.compile(content, { + filename: filename, + bare: true + }); + module._compile(content, filename); +} + +/** + * @see https://github.com/joyent/node/blob/master/lib/module.js + */ +function stripBOM(content) { + // Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) + // because the buffer-to-string conversion in `fs.readFileSync()` + // translates it to FEFF, the UTF-16 BOM. + if (content.charCodeAt(0) === 0xFEFF) { + content = content.slice(1); + } + return content; +} + +exports.load = load; +exports.inject = inject;
\ No newline at end of file |