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 <johannes.ewald@peerigon.com>2017-11-11 04:23:18 +0300
committerJohannes Ewald <johannes.ewald@peerigon.com>2017-11-11 04:47:48 +0300
commitb6cc4071f67d47596901c01506eeeff138ab059e (patch)
tree18fd5e8f2627907cd85ee874a1d78519c2f7e779
parent501e4c29bd16eaafae348b8faba6e5b061b98bc4 (diff)
Refactor code
-rw-r--r--lib/moduleEnv.js54
-rw-r--r--lib/rewire.js8
-rw-r--r--package-lock.json127
-rw-r--r--package.json6
-rw-r--r--test/getImportGlobalsSrc.test.js3
-rw-r--r--test/rewire.test.js4
-rw-r--r--testLib/constModule.js (renamed from testLib/ES2015Module.js)1
-rw-r--r--testLib/sharedTestCases.js57
-rw-r--r--testLib/throwError.js5
9 files changed, 74 insertions, 191 deletions
diff --git a/lib/moduleEnv.js b/lib/moduleEnv.js
index dd003d7..09bfd39 100644
--- a/lib/moduleEnv.js
+++ b/lib/moduleEnv.js
@@ -3,12 +3,14 @@
var Module = require("module"),
fs = require("fs"),
babelCore = require("babel-core"),
+ // Requiring the babel plugin here because otherwise it will be lazy-loaded by Babel during rewire()
+ transformBlockScoping = require("babel-plugin-transform-es2015-block-scoping"),
coffee;
- // caching original wrapper
var moduleWrapper0 = Module.wrapper[0],
moduleWrapper1 = Module.wrapper[1],
originalExtensions = {},
+ matchCoffeeExt = /\.coffee$/,
nodeRequire,
currentModule;
@@ -18,32 +20,30 @@ function load(targetModule) {
currentModule = targetModule;
registerExtensions();
-
targetModule.load(targetModule.id);
// This is only necessary if nothing has been required within the module
reset();
}
-function compile(targetModule, src, filename) {
- nodeRequire = targetModule.require;
- targetModule.require = requireProxy;
- targetModule.filename = filename;
- currentModule = targetModule;
+function compileJavaScript(src, targetPath) {
+ return babelCore.transform(stripBOM(src), {
+ plugins: [transformBlockScoping],
+ retainLines: true,
+ filename: targetPath
+ }).code;
+}
- var convertedSrc = babelCore.transform(stripBOM(src), {
- plugins: ["transform-es2015-constants"]
+function compileCoffeeScript(src, targetPath) {
+ return coffee.compile(stripBOM(src), {
+ filename: targetPath,
+ bare: true
});
-
- targetModule._compile(convertedSrc.code, filename);
-
- reset();
}
function reset() {
Module.wrapper[0] = moduleWrapper0;
Module.wrapper[1] = moduleWrapper1;
- restoreExtensions();
}
function inject(prelude, appendix) {
@@ -64,23 +64,48 @@ function requireProxy(path) {
}
function registerExtensions() {
+ var originalJsExtension = require.extensions[".js"];
var originalCoffeeExtension = require.extensions[".coffee"];
+ if (originalJsExtension) {
+ originalExtensions.js = originalJsExtension;
+ }
if (originalCoffeeExtension) {
originalExtensions.coffee = originalCoffeeExtension;
}
+ require.extensions[".js"] = jsExtension;
require.extensions[".coffee"] = coffeeExtension;
}
function restoreExtensions() {
+ if ("js" in originalExtensions) {
+ require.extensions[".js"] = originalExtensions.js;
+ }
if ("coffee" in originalExtensions) {
require.extensions[".coffee"] = originalExtensions.coffee;
}
}
+function jsExtension(module, filename) {
+ var _compile = module._compile;
+
+ module._compile = function (content, filename) {
+ content = babelCore.transform(content, {
+ plugins: ["transform-es2015-block-scoping"],
+ retainLines: true,
+ filename: filename
+ }).code;
+ _compile.call(module, content, filename);
+ };
+
+ restoreExtensions();
+ originalExtensions.js(module, filename);
+}
+
function coffeeExtension(module, filename) {
var content = stripBOM(fs.readFileSync(filename, "utf8"));
+ restoreExtensions();
content = coffee.compile(content, {
filename: filename,
bare: true
@@ -108,5 +133,4 @@ try {
}
exports.load = load;
-exports.compile = compile;
exports.inject = inject;
diff --git a/lib/rewire.js b/lib/rewire.js
index 536929d..cbd24c2 100644
--- a/lib/rewire.js
+++ b/lib/rewire.js
@@ -55,13 +55,7 @@ function internalRewire(parentModulePath, targetPath) {
}
moduleEnv.inject(prelude, appendix);
-
- if (targetPath.match(/\.coffee$/)) {
- moduleEnv.load(targetModule);
- } else {
- moduleEnv.compile(targetModule, src, targetPath);
- }
-
+ moduleEnv.load(targetModule);
return targetModule.exports;
}
diff --git a/package-lock.json b/package-lock.json
index 18e4793..1352c44 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -105,27 +105,16 @@
"babel-runtime": "6.26.0"
}
},
- "babel-plugin-transform-es2015-constants": {
- "version": "6.1.4",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-constants/-/babel-plugin-transform-es2015-constants-6.1.4.tgz",
- "integrity": "sha1-5LjHj7SKuYsBB/Mp+rYEDnnDWjM=",
+ "babel-plugin-transform-es2015-block-scoping": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
"requires": {
- "babel-runtime": "5.8.38"
- },
- "dependencies": {
- "babel-runtime": {
- "version": "5.8.38",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz",
- "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=",
- "requires": {
- "core-js": "1.2.7"
- }
- },
- "core-js": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
- "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
- }
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.4"
}
},
"babel-register": {
@@ -243,45 +232,12 @@
}
}
},
- "coffee": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/coffee/-/coffee-4.1.0.tgz",
- "integrity": "sha512-u+FW/4zAddbyKhyMz1A/2pbxmBTbGLdx6U3rzl7m6X1qUkrL6CKvt9b1oEGpmMVQKljWSqivPMf9BNQObmZhaQ==",
- "dev": true,
- "requires": {
- "cross-spawn": "5.1.0",
- "debug": "2.6.9"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
"coffee-script": {
"version": "1.12.7",
"resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz",
"integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==",
"dev": true
},
- "coffeescript": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.0.1.tgz",
- "integrity": "sha512-mrgXUOwRocrvSRwIi/2tAesQOJz2KxSyMNMlLSVhnJk/eZHKinYSJGcgUYZkzmSQZtpb3UhGJeZv0AAUeh7yyQ==",
- "dev": true
- },
"commander": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz",
@@ -303,29 +259,6 @@
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz",
"integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs="
},
- "cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
- "dev": true,
- "requires": {
- "lru-cache": "4.1.1",
- "shebang-command": "1.2.0",
- "which": "1.3.0"
- },
- "dependencies": {
- "lru-cache": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
- "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
- "dev": true,
- "requires": {
- "pseudomap": "1.0.2",
- "yallist": "2.1.2"
- }
- }
- }
- },
"debug": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
@@ -425,12 +358,6 @@
"number-is-nan": "1.0.1"
}
},
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
- },
"jade": {
"version": "0.26.3",
"resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz",
@@ -561,12 +488,6 @@
"resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
"integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
},
- "pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
- "dev": true
- },
"regenerator-runtime": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz",
@@ -580,21 +501,6 @@
"is-finite": "1.0.2"
}
},
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
- "dev": true,
- "requires": {
- "shebang-regex": "1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
- "dev": true
- },
"sigmund": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
@@ -648,21 +554,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
"integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
- },
- "which": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
- "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
- "dev": true,
- "requires": {
- "isexe": "2.0.0"
- }
- },
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
- "dev": true
}
}
}
diff --git a/package.json b/package.json
index 3987512..16ba88e 100644
--- a/package.json
+++ b/package.json
@@ -36,11 +36,11 @@
},
"license": "MIT",
"scripts": {
- "test": "mocha -R spec --check-leaks --globals __core-js_shared__",
+ "test": "mocha -R spec",
"coverage": "istanbul cover ./node_modules/mocha/bin/_mocha"
},
"dependencies": {
- "babel-core": "~6.26.0",
- "babel-plugin-transform-es2015-constants": "~6.1.4"
+ "babel-core": "^6.26.0",
+ "babel-plugin-transform-es2015-block-scoping": "^6.26.0"
}
}
diff --git a/test/getImportGlobalsSrc.test.js b/test/getImportGlobalsSrc.test.js
index ab9e946..28ac50c 100644
--- a/test/getImportGlobalsSrc.test.js
+++ b/test/getImportGlobalsSrc.test.js
@@ -25,6 +25,7 @@ describe("getImportGlobalsSrc", function () {
delete global.module;
delete global.exports;
delete global.require;
+ delete global['__core-js_shared__'];
delete global['a-b'];
expectedGlobals = Object.keys(global);
@@ -60,7 +61,7 @@ describe("getImportGlobalsSrc", function () {
// node v0.10 does not set a constructor property on the context
// node v0.11 does set a constructor property
// so just lets filter it, because it doesn't make sense to mock it anyway
- return key !== "constructor";
+ return key !== "constructor"
});
actualGlobals.sort();
expectedGlobals.sort();
diff --git a/test/rewire.test.js b/test/rewire.test.js
index ecf3cc9..4d3b985 100644
--- a/test/rewire.test.js
+++ b/test/rewire.test.js
@@ -16,9 +16,7 @@ describe("rewire", function () {
fs.renameSync(fakeNodeModules, path.resolve(__dirname, "../testLib/node_modules"));
}
});
- it("should pass all shared test cases", function () {
- require("../testLib/sharedTestCases.js");
- });
+ require("../testLib/sharedTestCases.js");
it("should also work with CoffeeScript", function () {
var coffeeModule;
diff --git a/testLib/ES2015Module.js b/testLib/constModule.js
index 81eba2b..042b797 100644
--- a/testLib/ES2015Module.js
+++ b/testLib/constModule.js
@@ -1,4 +1,3 @@
-
const someOtherModule = require("./someOtherModule");
const language = "nl";
diff --git a/testLib/sharedTestCases.js b/testLib/sharedTestCases.js
index ddb8b04..06dcb11 100644
--- a/testLib/sharedTestCases.js
+++ b/testLib/sharedTestCases.js
@@ -17,7 +17,7 @@ function checkForTypeError(err) {
expect(err.constructor).to.be(TypeError);
}
-describe("rewire " + (typeof testEnv === "undefined"? "(node)": "(" + testEnv + ")"), function () {
+describe(typeof testEnv === "undefined"? "(node)": "(" + testEnv + ")", function () {
it("should work like require()", function () {
rewire("./moduleA.js").getFilename();
@@ -265,7 +265,7 @@ describe("rewire " + (typeof testEnv === "undefined"? "(node)": "(" + testEnv +
throwError();
} catch (err) {
if (err.stack) {
- expect(err.stack.split("\n")[1]).to.match(/:2:11/);
+ expect(err.stack.split("\n")[1]).to.match(/:7:11/);
}
}
});
@@ -372,51 +372,22 @@ describe("rewire " + (typeof testEnv === "undefined"? "(node)": "(" + testEnv +
revert();
});
- it("Should be possible to mock a const variable using __with__ syntax", function() {
- var ES2015Module = rewire("./ES2015Module", {
- convertConst: true
- });
-
- ES2015Module.__with__({
- language: "en"
- })(function() {
- expect(ES2015Module.getLang()).to.equal("en");
- expect(ES2015Module.getOtherModuleName()).to.equal("somOtherModule");
- });
- });
+ it("should be possible to mock a set a const variable using __set__ syntax", function() {
+ var constModule = rewire("./constModule");
- it("Should be possible to mock a const required variable using __with__ syntax", function() {
- var ES2015Module = rewire("./ES2015Module", {
- convertConst: true
+ constModule.__set__("language", "de");
+ constModule.__set__("someOtherModule", {
+ name: "differentModule"
});
-
- ES2015Module.__with__({
- someOtherModule: {
- name: "mocked"
- }
- })(function() {
- expect(ES2015Module.getLang()).to.equal("nl");
- expect(ES2015Module.getOtherModuleName()).to.equal("mocked");
- });
- });
-
- it("Should be possible to mock a set a const variable using __set__ syntax", function() {
- var ES2015Module = rewire("./ES2015Module", {
- convertConst: true
- });
-
- ES2015Module.__set__("language", "de");
-
- expect(ES2015Module.getLang()).to.equal("de");
-
- ES2015Module.__set__("language", "nl");
-
- expect(ES2015Module.getLang()).to.equal("nl");
+ expect(constModule.getLang()).to.equal("de");
+ expect(constModule.getOtherModuleName()).to.equal("differentModule");
})
- it("Should have correct __filename and __dirname when mocked using convertConst", function() {
- expect(rewire("./ES2015Module", { convertConst: true }).filename).to.equal(require("./ES2015Module").filename);
- expect(rewire("./ES2015Module", { convertConst: true }).dirname).to.equal(require("./ES2015Module").dirname);
+ it("should have correct __filename and __dirname when mocked using convertConst", function() {
+ var constModule = rewire("./constModule");
+
+ expect(constModule.filename).to.equal(require("./constModule").filename);
+ expect(constModule.dirname).to.equal(require("./constModule").dirname);
});
});
diff --git a/testLib/throwError.js b/testLib/throwError.js
index 9bdf68b..ffb6a71 100644
--- a/testLib/throwError.js
+++ b/testLib/throwError.js
@@ -1,3 +1,8 @@
+// Using const here because we know that Babel will transform that part
+const test = 1;
+
module.exports = function () {
+ let test = 1;
+
throw new Error();
};