Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDomenic Denicola <domenic@domenicdenicola.com>2012-12-16 08:22:32 +0400
committerisaacs <i@izs.me>2013-01-09 22:48:30 +0400
commit35144bb8df35f09f067167a3b72c9ef31d35f39b (patch)
treed2728fb2fc63cabb8a4c0f78caa453c6ad39e155
parent955a95d21e3abce87d50fd29a86b32ffe92d0fb9 (diff)
Install peerDependencies.
-rw-r--r--lib/install.js84
-rw-r--r--test/packages/npm-test-peer-deps/README1
-rw-r--r--test/packages/npm-test-peer-deps/npm-ls.json18
-rw-r--r--test/packages/npm-test-peer-deps/package.json11
-rw-r--r--test/packages/npm-test-peer-deps/test.js20
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)
+})