diff options
author | Johannes Ewald <johannes.ewald@peerigon.com> | 2017-11-11 04:23:18 +0300 |
---|---|---|
committer | Johannes Ewald <johannes.ewald@peerigon.com> | 2017-11-11 04:47:48 +0300 |
commit | b6cc4071f67d47596901c01506eeeff138ab059e (patch) | |
tree | 18fd5e8f2627907cd85ee874a1d78519c2f7e779 | |
parent | 501e4c29bd16eaafae348b8faba6e5b061b98bc4 (diff) |
Refactor code
-rw-r--r-- | lib/moduleEnv.js | 54 | ||||
-rw-r--r-- | lib/rewire.js | 8 | ||||
-rw-r--r-- | package-lock.json | 127 | ||||
-rw-r--r-- | package.json | 6 | ||||
-rw-r--r-- | test/getImportGlobalsSrc.test.js | 3 | ||||
-rw-r--r-- | test/rewire.test.js | 4 | ||||
-rw-r--r-- | testLib/constModule.js (renamed from testLib/ES2015Module.js) | 1 | ||||
-rw-r--r-- | testLib/sharedTestCases.js | 57 | ||||
-rw-r--r-- | testLib/throwError.js | 5 |
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(); }; |