var Module = require("module"), fs = require("fs"), getImportGlobalsSrc = require("./getImportGlobalsSrc.js"), getDefinePropertySrc = require("./getDefinePropertySrc.js"), detectStrictMode = require("./detectStrictMode.js"), moduleEnv = require("./moduleEnv.js"); /** * Does actual rewiring the module. For further documentation @see index.js */ function internalRewire(parentModulePath, targetPath) { var targetModule, prelude, appendix, src; // Checking params if (typeof targetPath !== "string") { throw new TypeError("Filename must be a string"); } // Resolve full filename relative to the parent module targetPath = Module._resolveFilename(targetPath, parentModulePath); // Create testModule as it would be created by require() targetModule = new Module(targetPath, parentModulePath); // We prepend a list of all globals declared with var so they can be overridden (without changing original globals) prelude = getImportGlobalsSrc(); // Wrap module src inside IIFE so that function declarations do not clash with global variables // @see https://github.com/jhnns/rewire/issues/56 prelude += "(function () { "; // We append our special setter and getter. appendix = "\n" + getDefinePropertySrc(); // End of IIFE appendix += "})();"; // Check if the module uses the strict mode. // If so we must ensure that "use strict"; stays at the beginning of the module. src = fs.readFileSync(targetPath, "utf8"); if (detectStrictMode(src) === true) { prelude = ' "use strict"; ' + prelude; } moduleEnv.inject(prelude, appendix); moduleEnv.load(targetModule); return targetModule.exports; } module.exports = internalRewire;