From b6cc4071f67d47596901c01506eeeff138ab059e Mon Sep 17 00:00:00 2001 From: Johannes Ewald Date: Sat, 11 Nov 2017 02:23:18 +0100 Subject: Refactor code --- lib/moduleEnv.js | 54 ++++++++++++----- lib/rewire.js | 8 +-- package-lock.json | 127 +++------------------------------------ package.json | 6 +- test/getImportGlobalsSrc.test.js | 3 +- test/rewire.test.js | 4 +- testLib/ES2015Module.js | 14 ----- testLib/constModule.js | 13 ++++ testLib/sharedTestCases.js | 57 +++++------------- testLib/throwError.js | 5 ++ 10 files changed, 87 insertions(+), 204 deletions(-) delete mode 100644 testLib/ES2015Module.js create mode 100644 testLib/constModule.js 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/ES2015Module.js deleted file mode 100644 index 81eba2b..0000000 --- a/testLib/ES2015Module.js +++ /dev/null @@ -1,14 +0,0 @@ - -const someOtherModule = require("./someOtherModule"); -const language = "nl"; - -module.exports.getLang = () => { - return language; -} - -exports.getOtherModuleName = () => { - return someOtherModule.name; -} - -exports.filename = __filename; -exports.dirname = __dirname; diff --git a/testLib/constModule.js b/testLib/constModule.js new file mode 100644 index 0000000..042b797 --- /dev/null +++ b/testLib/constModule.js @@ -0,0 +1,13 @@ +const someOtherModule = require("./someOtherModule"); +const language = "nl"; + +module.exports.getLang = () => { + return language; +} + +exports.getOtherModuleName = () => { + return someOtherModule.name; +} + +exports.filename = __filename; +exports.dirname = __dirname; 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(); }; -- cgit v1.2.3