Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/twbs/rewire.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Ewald <mail@johannesewald.de>2013-02-23 17:52:22 +0400
committerJohannes Ewald <mail@johannesewald.de>2013-02-23 17:52:22 +0400
commit6040974a2f0bc91b3aed0a389584c967831dd1dd (patch)
tree6fe8a1c3aaafaf7a7aca989e369ca38222498d82 /lib/moduleEnv.js
parent5fcb70fd718abc7b3f556932c68f7d3a3cbcde34 (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.js82
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