diff --git a/History.md b/History.md index b884b41c5d..aabdd4a7ce 100644 --- a/History.md +++ b/History.md @@ -1,3 +1,7 @@ +## vNEXT + +* Support `Npm.require('foo/bar')`. #3505 #3526 + ## v.1.0.3.1, 2015-Jan-20 * Rewrite `meteor show` and `meteor search` to show package information for diff --git a/tools/bundler.js b/tools/bundler.js index b2b46bb1e7..95a3529bd7 100644 --- a/tools/bundler.js +++ b/tools/bundler.js @@ -1319,17 +1319,20 @@ _.extend(JsImage.prototype, { var nodeModuleDir = files.pathJoin(item.nodeModulesDirectory.sourcePath, name); - - if (files.exists(nodeModuleDir)) { + var nodeModuleTopDir = + files.pathJoin(item.nodeModulesDirectory.sourcePath, + name.split("/")[0]); + if (files.exists(nodeModuleTopDir)) { return require(nodeModuleDir); } try { return require(name); } catch (e) { - throw new Error("Can't load npm module '" + name + - "' while loading " + item.targetPath + - ". Check your Npm.depends().'"); + buildmessage.error( + "Can't load npm module '" + name + "' from " + + item.targetPath + ". Check your Npm.depends()."); + return undefined; } } }, diff --git a/tools/server/boot.js b/tools/server/boot.js index a8cc49bf1c..917b9a780e 100644 --- a/tools/server/boot.js +++ b/tools/server/boot.js @@ -129,12 +129,17 @@ Fiber(function () { return require(name); } - var nodeModuleDir = - path.resolve(serverDir, fileInfo.node_modules, name); + var nodeModuleBase = path.resolve(serverDir, fileInfo.node_modules); - if (fs.existsSync(nodeModuleDir)) { + var nodeModuleDir = path.resolve(nodeModuleBase, name); + + // If the user does `Npm.require('foo/bar')`, then we should resolve to + // the package's node modules if `foo` was one of the modules we + // installed. (`foo/bar` might be implemented as `foo/bar.js` so we + // can't just naively see if all of nodeModuleDir exists. + if (fs.existsSync(path.resolve(nodeModuleBase, name.split("/")[0]))) { return require(nodeModuleDir); - } + } try { return require(name); } catch (e) {