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
path: root/lib
diff options
context:
space:
mode:
authorJohannes Ewald <johannes.ewald@peerigon.com>2015-02-23 03:31:08 +0300
committerJohannes Ewald <johannes.ewald@peerigon.com>2015-02-23 03:31:08 +0300
commite70efd18f9e1d5993fc0a7f1decb5fe6720b3bd8 (patch)
tree78fd4ec2d58346f17aaf19b313d5864896143052 /lib
parent52e914dc8b447d1cf99dd946869e8eafb5b53ae4 (diff)
Fix problems when global objects like JSON, etc. have been rewired
Fixes #40
Diffstat (limited to 'lib')
-rw-r--r--lib/__set__.js28
1 files changed, 21 insertions, 7 deletions
diff --git a/lib/__set__.js b/lib/__set__.js
index bdb5042..3e66b42 100644
--- a/lib/__set__.js
+++ b/lib/__set__.js
@@ -12,19 +12,30 @@
function __set__() {
arguments.varName = arguments[0];
arguments.varValue = arguments[1];
+ // Saving references to global objects and functions. Thus a test may even change these variables
+ // without interfering with rewire().
+ // @see https://github.com/jhnns/rewire/issues/40
+ arguments.refs = arguments[2] || {
+ isArray: Array.isArray,
+ TypeError: TypeError,
+ stringify: JSON.stringify
+ // We can't save eval() because eval() is a *special* global function
+ // That's why it can't be re-assigned in strict mode
+ //eval: eval
+ };
arguments.src = "";
arguments.revertArgs = [];
- if (typeof arguments[0] === "object" && arguments.length === 1) {
+ if (typeof arguments[0] === "object") {
arguments.env = arguments.varName;
- if (!arguments.env || Array.isArray(arguments.env)) {
- throw new TypeError("__set__ expects an object as env");
+ if (!arguments.env || arguments.refs.isArray(arguments.env)) {
+ throw new arguments.refs.TypeError("__set__ expects an object as env");
}
arguments.revertArgs[0] = {};
for (arguments.varName in arguments.env) {
if (arguments.env.hasOwnProperty(arguments.varName)) {
arguments.varValue = arguments.env[arguments.varName];
- arguments.src += arguments.varName + " = arguments.env[" + JSON.stringify(arguments.varName) + "]; ";
+ arguments.src += arguments.varName + " = arguments.env[" + arguments.refs.stringify(arguments.varName) + "]; ";
try {
// Allow tests to mock implicit globals
// @see https://github.com/jhnns/rewire/issues/35
@@ -34,9 +45,9 @@ function __set__() {
}
}
}
- } else if (typeof arguments.varName === "string" && arguments.length === 2) {
+ } else if (typeof arguments.varName === "string") {
if (!arguments.varName) {
- throw new TypeError("__set__ expects a non-empty string as a variable name");
+ throw new arguments.refs.TypeError("__set__ expects a non-empty string as a variable name");
}
arguments.src = arguments.varName + " = arguments.varValue;";
try {
@@ -47,9 +58,12 @@ function __set__() {
arguments.revertArgs = [arguments.varName, undefined];
}
} else {
- throw new TypeError("__set__ expects an environment object or a non-empty string as a variable name");
+ throw new arguments.refs.TypeError("__set__ expects an environment object or a non-empty string as a variable name");
}
+ // Passing our saved references on to the revert function
+ arguments.revertArgs[2] = arguments.refs;
+
eval(arguments.src);
return function (revertArgs) {