diff options
author | Domenic Denicola <domenic@domenicdenicola.com> | 2012-12-16 08:22:32 +0400 |
---|---|---|
committer | isaacs <i@izs.me> | 2013-01-09 22:48:30 +0400 |
commit | 35144bb8df35f09f067167a3b72c9ef31d35f39b (patch) | |
tree | d2728fb2fc63cabb8a4c0f78caa453c6ad39e155 | |
parent | 955a95d21e3abce87d50fd29a86b32ffe92d0fb9 (diff) |
Install peerDependencies.
-rw-r--r-- | lib/install.js | 84 | ||||
-rw-r--r-- | test/packages/npm-test-peer-deps/README | 1 | ||||
-rw-r--r-- | test/packages/npm-test-peer-deps/npm-ls.json | 18 | ||||
-rw-r--r-- | test/packages/npm-test-peer-deps/package.json | 11 | ||||
-rw-r--r-- | test/packages/npm-test-peer-deps/test.js | 20 |
5 files changed, 105 insertions, 29 deletions
diff --git a/lib/install.js b/lib/install.js index 5e616e1fd..45d985f8b 100644 --- a/lib/install.js +++ b/lib/install.js @@ -905,39 +905,65 @@ function write (target, targetFolder, context, cb_) { // before continuing to installing dependencies, check for a shrinkwrap. var opt = { dev: npm.config.get("dev") } readDependencies(context, targetFolder, opt, function (er, data, wrap) { - var deps = Object.keys(data.dependencies || {}) - - // don't install bundleDependencies, unless they're missing. - if (data.bundleDependencies) { - deps = deps.filter(function (d) { - return data.bundleDependencies.indexOf(d) === -1 || - bundled.indexOf(d) === -1 - }) - } - - var newcontext = { family: family + var deps = prepareForInstallMany(data, "dependencies", bundled, wrap, + family) + var depsTargetFolder = targetFolder + var depsContext = { family: family , ancestors: context.ancestors , parent: target , explicit: false , wrap: wrap } - installMany(deps.filter(function (d) { - // prefer to not install things that are satisfied by - // something in the "family" list, unless we're installing - // from a shrinkwrap. - return wrap || !semver.satisfies(family[d], data.dependencies[d]) - }).map(function (d) { - var t = data.dependencies[d] - , parsed = url.parse(t.replace(/^git\+/, "git")) - t = d + "@" + t - return t - }), targetFolder, newcontext, function (er, d) { - log.verbose("about to build", targetFolder) - if (er) return cb(er) - npm.commands.build( [targetFolder] - , npm.config.get("global") - , true - , function (er) { return cb(er, d) }) - }) + + var peerDeps = prepareForInstallMany(data, "peerDependencies", bundled, + wrap, family) + var pdTargetFolder = path.resolve(targetFolder, "..", "..") + var pdContext = context + + var actions = + [ [ installManyAndBuild, deps, depsTargetFolder, depsContext ] ] + + if (peerDeps.length > 0) { + actions.push( + [ installManyAndBuild, peerDeps, pdTargetFolder, pdContext ] + ) + } + + chain(actions, cb) }) }) } + +function installManyAndBuild (deps, targetFolder, context, cb) { + installMany(deps, targetFolder, context, function (er, d) { + log.verbose("about to build", targetFolder) + if (er) return cb(er) + npm.commands.build( [targetFolder] + , npm.config.get("global") + , true + , function (er) { return cb(er, d) }) + }) +} + +function prepareForInstallMany (packageData, depsKey, bundled, wrap, family) { + var deps = Object.keys(packageData[depsKey] || {}) + + // don't install bundleDependencies, unless they're missing. + if (packageData.bundleDependencies) { + deps = deps.filter(function (d) { + return packageData.bundleDependencies.indexOf(d) === -1 || + bundled.indexOf(d) === -1 + }) + } + + return deps.filter(function (d) { + // prefer to not install things that are satisfied by + // something in the "family" list, unless we're installing + // from a shrinkwrap. + return wrap || !semver.satisfies(family[d], packageData[depsKey][d]) + }).map(function (d) { + var t = packageData[depsKey][d] + , parsed = url.parse(t.replace(/^git\+/, "git")) + t = d + "@" + t + return t + }) +} diff --git a/test/packages/npm-test-peer-deps/README b/test/packages/npm-test-peer-deps/README new file mode 100644 index 000000000..8848f0786 --- /dev/null +++ b/test/packages/npm-test-peer-deps/README @@ -0,0 +1 @@ +just an npm test diff --git a/test/packages/npm-test-peer-deps/npm-ls.json b/test/packages/npm-test-peer-deps/npm-ls.json new file mode 100644 index 000000000..05dda4163 --- /dev/null +++ b/test/packages/npm-test-peer-deps/npm-ls.json @@ -0,0 +1,18 @@ +{ + "name": "npm-test-peer-deps", + "version": "0.0.0", + "dependencies": { + "npm-test-peer-deps-file": { + "version": "1.2.3", + "from": "https://raw.github.com/gist/3971128/3f6aa37b4fa1186c2f47da9b77dcc4ec496e3483/index.js", + "dependencies": { + "opener": { + "version": "1.3.0" + } + } + }, + "dict": { + "version": "1.1.0" + } + } +} diff --git a/test/packages/npm-test-peer-deps/package.json b/test/packages/npm-test-peer-deps/package.json new file mode 100644 index 000000000..a132fe1b2 --- /dev/null +++ b/test/packages/npm-test-peer-deps/package.json @@ -0,0 +1,11 @@ +{ + "author": "Domenic Denicola <domenic@domenicdenicola.com> (http://domenicdenicola.com/)", + "name": "npm-test-peer-deps", + "version": "0.0.0", + "dependencies": { + "npm-test-peer-deps-file": "https://raw.github.com/gist/3971128/3f6aa37b4fa1186c2f47da9b77dcc4ec496e3483/index.js" + }, + "scripts": { + "test": "node test.js" + } +} diff --git a/test/packages/npm-test-peer-deps/test.js b/test/packages/npm-test-peer-deps/test.js new file mode 100644 index 000000000..645d4023a --- /dev/null +++ b/test/packages/npm-test-peer-deps/test.js @@ -0,0 +1,20 @@ +var path = require("path") +var assert = require("assert") + +process.env.npm_config_prefix = process.cwd() +delete process.env.npm_config_global +delete process.env.npm_config_depth + +var npm = path.resolve(process.env.npm_config_prefix, "../../npm") + +require("child_process").exec(npm + " ls --json", { + env: process.env, cwd: process.cwd() }, + function (err, stdout, stderr) { + + if (err) throw err + + var actual = JSON.parse(stdout).dependencies + var expected = require("./npm-ls.json").dependencies + + assert.deepEqual(actual, expected) +}) |