Skip to content

Commit

Permalink
Provide error if different module is required
Browse files Browse the repository at this point in the history
  • Loading branch information
brokentone committed Sep 25, 2018
1 parent 9a3e2f4 commit a7b7c38
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 40 deletions.
84 changes: 47 additions & 37 deletions lib/moduleEnv.js
Expand Up @@ -51,7 +51,7 @@ function load(targetModule) {
targetModule.require = requireProxy;
currentModule = targetModule;

registerExtensions();
registerExtensions(targetModule.id);
targetModule.load(targetModule.id);

// This is only necessary if nothing has been required within the module
Expand Down Expand Up @@ -80,7 +80,7 @@ function requireProxy(path) {
return nodeRequire.call(currentModule, path); // node's require only works when "this" points to the module
}

function registerExtensions() {
function registerExtensions(targetFilename) {
var originalJsExtension = require.extensions[".js"];
var originalCoffeeExtension = require.extensions[".coffee"];

Expand All @@ -90,8 +90,8 @@ function registerExtensions() {
if (originalCoffeeExtension) {
originalExtensions.coffee = originalCoffeeExtension;
}
require.extensions[".js"] = jsExtension;
require.extensions[".coffee"] = coffeeExtension;
require.extensions[".js"] = jsExtension(targetFilename);
require.extensions[".coffee"] = coffeeExtension(targetFilename);
}

function restoreExtensions() {
Expand All @@ -107,44 +107,54 @@ function isNoConstAssignMessage(message) {
return message.ruleId === "no-const-assign";
}

function jsExtension(module, filename) {
var _compile = module._compile;

module._compile = function (content, filename) {
var noConstAssignMessage = linter.verify(content, eslintOptions).find(isNoConstAssignMessage);
var line;
var column;

if (noConstAssignMessage !== undefined) {
line = noConstAssignMessage.line;
column = noConstAssignMessage.column;
throw new TypeError(`Assignment to constant variable at ${ filename }:${ line }:${ column }`);
function jsExtension(targetFilename) {
return function (module, filename) {
if (targetFilename !== filename) {
throw new Error(`Required module ${filename} rather than expected ${targetFilename}`)
}

_compile.call(
module,
content.replace(matchConst, "$1let $2"), // replace const with let, while maintaining the column width
filename
);
};

restoreExtensions();
originalExtensions.js(module, filename);
var _compile = module._compile;

module._compile = function (content, filename) {
var noConstAssignMessage = linter.verify(content, eslintOptions).find(isNoConstAssignMessage);
var line;
var column;

if (noConstAssignMessage !== undefined) {
line = noConstAssignMessage.line;
column = noConstAssignMessage.column;
throw new TypeError(`Assignment to constant variable at ${ filename }:${ line }:${ column }`);
}

_compile.call(
module,
content.replace(matchConst, "$1let $2"), // replace const with let, while maintaining the column width
filename
);
};

restoreExtensions();
originalExtensions.js(module, filename);
}
}

function coffeeExtension(module, filename) {
if (!coffee) {
throw new Error("Cannot rewire module written in CoffeeScript: Please install 'coffeescript' package first.");
}
function coffeeExtension(targetFilename) {
return function (module, filename) {
if (targetFilename !== filename) {
throw new Error(`Required module ${filename} rather than expected ${targetFilename}`)
}
if (!coffee) {
throw new Error("Cannot rewire module written in CoffeeScript: Please install 'coffeescript' package first.");
}

var content = stripBOM(fs.readFileSync(filename, "utf8"));
var content = stripBOM(fs.readFileSync(filename, "utf8"));

restoreExtensions();
content = coffee.compile(content, {
filename: filename,
bare: true
});
module._compile(content, filename);
restoreExtensions();
content = coffee.compile(content, {
filename: filename,
bare: true
});
module._compile(content, filename);
}
}

/**
Expand Down
5 changes: 2 additions & 3 deletions test/rewire.test.js
Expand Up @@ -47,8 +47,7 @@ describe("rewire", function () {
require.extensions['.ts'] = require.extensions['.js'];

rewire = require("../");
tsModule = rewire("../testLib/module.ts");
tsModule.__set__("testModuleB", "Different Thing");
expect(tsModule.testModuleB()).to.be("Different Thing");
tsModule = rewire.bind(null, "../testLib/module.ts");
expect(tsModule).to.throwException(/rather than expected/);
});
});

0 comments on commit a7b7c38

Please sign in to comment.