diff --git a/lib/require-module-hook.js b/lib/require-module-hook.js index 55011cb5b8953b5e7b942598875419eb4d940ee5..508bcbf102366746806b61321e2eb99b215fb811 100644 --- a/lib/require-module-hook.js +++ b/lib/require-module-hook.js @@ -20,6 +20,7 @@ const Module = require("module"); const resolve = require("resolve"); const path = require("path"); +const fs = require("fs"); module.exports = hook; @@ -38,7 +39,8 @@ function hook(modules, requireCallback) { let moduleName = ""; let matchModuleName = ""; let enhanceFile = ""; - let version = ""; + let version = undefined; + let basedir = undefined; if (enhancedModuleCache.hasOwnProperty(filename)) { return enhancedModuleCache[filename]; @@ -56,7 +58,7 @@ function hook(modules, requireCallback) { moduleName = isWithScope ? pathSegment[index + 1] + "/" + pathSegment[index + 2] : pathSegment[index + 1]; - let basedir = pathSegment.slice(0, index + (isWithScope ? 3 : 2)).join(path.sep); + basedir = pathSegment.slice(0, index + (isWithScope ? 3 : 2)).join(path.sep); try { let res = resolve.sync(moduleName, {basedir: basedir}); if (res !== filename) { @@ -73,6 +75,17 @@ function hook(modules, requireCallback) { } if (modules && modules.indexOf(matchModuleName) === -1) return exports; + + // get version. Because of we enhance Module.prototype.require, so we can't fetch the version by execute + // `require(basedir + path.sep + "package.json")` method + if (basedir) { + const packageJson = path.join(basedir, "package.json"); + try { + version = JSON.parse(fs.readFileSync(packageJson)).version; + } catch (e) { + } + } + if (!enhancedModuleCache.hasOwnProperty(filename)) { enhancedModuleCache[filename] = exports; enhancedModuleCache[filename] = requireCallback(exports, moduleName, version, enhanceFile);