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 <johannes.ewald@roomieplanet.de>2012-06-21 02:24:09 +0400
committerJohannes <johannes.ewald@roomieplanet.de>2012-06-21 02:24:09 +0400
commit0c860734dc28a679d9214ee9c5b5ff95e00eed55 (patch)
tree2b76efd42c12f331b79e61fb88ac480119d971c3
parentce972e2b1a9a43f6c19a68a5701b1b3b1bcc67f8 (diff)
removed "use strict"; to avoid influencing not-strict modules
-rw-r--r--lib/__get__.js2
-rw-r--r--lib/__set__.js4
-rw-r--r--lib/getImportGlobalsSrc.js2
-rw-r--r--lib/index.js21
-rw-r--r--lib/rewire.js16
-rw-r--r--test/__get__.test.js2
-rw-r--r--test/__set__.test.js2
-rw-r--r--test/debug.test.js2
-rw-r--r--test/getImportGlobalsSrc.test.js2
-rw-r--r--test/rewire.test.js19
10 files changed, 43 insertions, 29 deletions
diff --git a/lib/__get__.js b/lib/__get__.js
index f6212d9..47bfb66 100644
--- a/lib/__get__.js
+++ b/lib/__get__.js
@@ -1,5 +1,3 @@
-"use strict"; // run code in ES5 strict mode
-
/**
* This function will be stringified and then injected into every rewired module.
* Then you can leak private variables by calling myModule.__get__("myPrivateVar");
diff --git a/lib/__set__.js b/lib/__set__.js
index 219b381..49e4494 100644
--- a/lib/__set__.js
+++ b/lib/__set__.js
@@ -1,5 +1,3 @@
-"use strict"; // run code in ES5 strict mode
-
/**
* This function will be stringified and then injected into every rewired module.
* Then you can set private variables by calling myModule.__set__("myPrivateVar", newValue);
@@ -17,7 +15,7 @@ module.exports = function __set__() {
arguments.varValue = arguments[1];
arguments.src = "";
arguments.checkExistsSrc = function (varName) {
- return "if (typeof " + varName + " === 'undefined') { throw new ReferenceError('" + varName + " is not defined');} ";
+ return "if (typeof " + varName + " === 'undefined') { throw new ReferenceError('Cannot __set__(): " + varName + " is not declared within the module.');} ";
};
if (typeof arguments[0] === "object") {
diff --git a/lib/getImportGlobalsSrc.js b/lib/getImportGlobalsSrc.js
index 1bcfed4..dc40a4b 100644
--- a/lib/getImportGlobalsSrc.js
+++ b/lib/getImportGlobalsSrc.js
@@ -1,5 +1,3 @@
-"use strict"; // run code in ES5 strict mode
-
/**
* Declares all globals with a var and assigns the global object. Thus you're able to
* override globals without changing the global object itself.
diff --git a/lib/index.js b/lib/index.js
index a6dbcd6..0960dd6 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -1,15 +1,10 @@
-"use strict"; // run code in ES5 strict mode
-
-var rewireModule = require("./rewire.js");
+var rewireModule;
/**
* This function is needed to determine the calling parent module.
* Thus rewire acts exactly the same like require() in the test module.
*
* @param {!String} request Path to the module that shall be rewired. Use it exactly like require().
- * @param {Object} mocks An object with mocks. Keys should be the exactly same like they're required in the target module. So if you write require("../../myModules/myModuleA.js") you need to pass {"../../myModules/myModuleA.js": myModuleAMock}.
- * @param {Object} injections If you pass an object, all keys of the object will be vars within the module. You can also eval a string. Please note: All scripts are injected at the end of the module. So if there is any code in your module that is executed during require(), your injected variables will be undefined at this point. For example: passing {console: {...}} will cause all calls of console.log() to throw an exception if they're executed during require().
- * @param {Array} leaks An array with variable names that should be exported. These variables are accessible via myModule.__
* @param {Boolean} cache Indicates whether the rewired module should be cached by node so subsequent calls of require() will return the rewired module. Subsequent calls of rewire() will always overwrite the cache.
* @return {*} the rewired module
*/
@@ -23,6 +18,16 @@ function rewire(request, cache) {
return rewireModule(module.parent, request, cache);
}
-rewire.reset = rewireModule.reset;
+// Conditional require for different environments
+if (process.title === "browser") {
+ module.exports = require("./browserify/browserifyRewire.js");
+} else {
+ // Putting (require) within brackets is a hack to disable browserify require sniffing
+ // @see https://github.com/substack/node-browserify/issues/132#issuecomment-5281470
+ rewireModule = (require)("./rewire.js");
+
+ rewire.reset = rewireModule.reset;
+ rewire.browserify = (require)("./browserify/browserifyMiddleware.js");
-module.exports = rewire; \ No newline at end of file
+ module.exports = rewire;
+}
diff --git a/lib/rewire.js b/lib/rewire.js
index ae23fb1..2a51e26 100644
--- a/lib/rewire.js
+++ b/lib/rewire.js
@@ -1,9 +1,9 @@
-"use strict"; // run code in ES5 strict mode
-
var Module = require("module"),
+ fs = require("fs"),
__get__ = require("./__get__.js"),
__set__ = require("./__set__.js"),
getImportGlobalsSrc = require("./getImportGlobalsSrc.js"),
+ detectStrictMode = require("./detectStrictMode.js"),
moduleWrapper0 = Module.wrapper[0], // caching original wrapper
moduleWrapper1 = Module.wrapper[1], // caching original wrapper
@@ -21,7 +21,8 @@ function rewire(parentModule, filename, cache) {
var testModule,
nodeRequire,
prepend,
- append;
+ append,
+ src;
/**
* Proxies the first require call in order to draw back all changes.
@@ -63,7 +64,14 @@ function rewire(parentModule, filename, cache) {
append = "module.exports.__set__ = " + __set__.toString() + "; ";
append += "module.exports.__get__ = " + __get__.toString() + "; ";
- // Apply prepend and append
+ // Check if the module uses the strict mode.
+ // If so we must ensure that "use strict"; stays at the beginning of the module.
+ src = fs.readFileSync(filename, "utf8");
+ if (detectStrictMode(src) === true) {
+ prepend = ' "use strict"; ' + prepend;
+ }
+
+ // Apply prepend and appends
Module.wrapper[0] = moduleWrapper0 + prepend;
Module.wrapper[1] = append + moduleWrapper1;
diff --git a/test/__get__.test.js b/test/__get__.test.js
index 6506e84..53e909c 100644
--- a/test/__get__.test.js
+++ b/test/__get__.test.js
@@ -1,5 +1,3 @@
-"use strict"; // run code in ES5 strict mode
-
var expect = require("expect.js"),
vm = require("vm"),
__get__ = require("../lib/__get__.js"),
diff --git a/test/__set__.test.js b/test/__set__.test.js
index e1565c7..28e3e8d 100644
--- a/test/__set__.test.js
+++ b/test/__set__.test.js
@@ -1,5 +1,3 @@
-"use strict"; // run code in ES5 strict mode
-
var expect = require("expect.js"),
__set__ = require("../lib/__set__.js"),
vm = require("vm"),
diff --git a/test/debug.test.js b/test/debug.test.js
index acd16ee..0ffbacf 100644
--- a/test/debug.test.js
+++ b/test/debug.test.js
@@ -1,5 +1,3 @@
-"use strict"; // run code in ES5 strict mode
-
var rewire = require("../lib/index.js");
// add breakpoints in testModules/debuggerModule.js and debug this file with your IDE to
diff --git a/test/getImportGlobalsSrc.test.js b/test/getImportGlobalsSrc.test.js
index b6f8576..065bd59 100644
--- a/test/getImportGlobalsSrc.test.js
+++ b/test/getImportGlobalsSrc.test.js
@@ -1,5 +1,3 @@
-"use strict"; // run code in ES5 strict mode
-
var expect = require("expect.js"),
vm = require("vm"),
getImportGlobalsSrc = require("../lib/getImportGlobalsSrc.js");
diff --git a/test/rewire.test.js b/test/rewire.test.js
index 1e40041..fa17088 100644
--- a/test/rewire.test.js
+++ b/test/rewire.test.js
@@ -1,4 +1,6 @@
-"use strict"; // run code in ES5 strict mode
+// Don't run code in ES5 strict mode.
+// In case this module was in strict mode, all other modules called by this would also be strict.
+// But when testing if the strict mode is preserved, we must ensure that this module is NOT strict.
var path = require("path"),
expect = require("expect.js"),
@@ -8,9 +10,15 @@ var testModules = {
A: path.resolve(__dirname, "./testModules/moduleA.js"),
B: path.resolve(__dirname, "./testModules/moduleB.js"),
someOtherModule: path.resolve(__dirname, "./testModules/someOtherModule.js"),
- emptyModule: path.resolve(__dirname, "./testModules/emptyModule.js")
+ emptyModule: path.resolve(__dirname, "./testModules/emptyModule.js"),
+ strictModule: path.resolve(__dirname, "./testModules/strictModule.js")
};
+
+function checkForTypeError(err) {
+ expect(err.constructor).to.be(TypeError);
+}
+
function cleanRequireCache() {
var moduleName,
modulePath;
@@ -140,6 +148,13 @@ describe("rewire", function () {
it("subsequent calls of rewire should always return a new instance", function () {
expect(rewire(testModules.A)).not.to.be(rewire(testModules.A));
});
+ it("should preserve the strict mode", function () {
+ var strictModule = rewire(testModules.strictModule);
+
+ expect(function () {
+ strictModule.doSomethingUnstrict();
+ }).to.throwException(checkForTypeError);
+ });
describe("#reset", function () {
it("should remove all rewired modules from cache", function () {
var rewiredModuleA = rewire(testModules.A),