Upgrade npm to 1.1.18
authorisaacs <i@izs.me>
Fri, 27 Apr 2012 22:01:31 +0000 (15:01 -0700)
committerisaacs <i@izs.me>
Mon, 30 Apr 2012 20:09:31 +0000 (13:09 -0700)
135 files changed:
deps/npm/AUTHORS
deps/npm/doc/cli/config.md
deps/npm/doc/cli/install.md
deps/npm/html/api/bin.html
deps/npm/html/api/bugs.html
deps/npm/html/api/commands.html
deps/npm/html/api/config.html
deps/npm/html/api/deprecate.html
deps/npm/html/api/docs.html
deps/npm/html/api/edit.html
deps/npm/html/api/explore.html
deps/npm/html/api/help-search.html
deps/npm/html/api/init.html
deps/npm/html/api/install.html
deps/npm/html/api/link.html
deps/npm/html/api/load.html
deps/npm/html/api/ls.html
deps/npm/html/api/npm.html
deps/npm/html/api/outdated.html
deps/npm/html/api/owner.html
deps/npm/html/api/pack.html
deps/npm/html/api/prefix.html
deps/npm/html/api/prune.html
deps/npm/html/api/publish.html
deps/npm/html/api/rebuild.html
deps/npm/html/api/restart.html
deps/npm/html/api/root.html
deps/npm/html/api/run-script.html
deps/npm/html/api/search.html
deps/npm/html/api/shrinkwrap.html
deps/npm/html/api/start.html
deps/npm/html/api/stop.html
deps/npm/html/api/submodule.html
deps/npm/html/api/tag.html
deps/npm/html/api/test.html
deps/npm/html/api/uninstall.html
deps/npm/html/api/unpublish.html
deps/npm/html/api/update.html
deps/npm/html/api/version.html
deps/npm/html/api/view.html
deps/npm/html/api/whoami.html
deps/npm/html/doc/README.html
deps/npm/html/doc/adduser.html
deps/npm/html/doc/bin.html
deps/npm/html/doc/bugs.html
deps/npm/html/doc/build.html
deps/npm/html/doc/bundle.html
deps/npm/html/doc/cache.html
deps/npm/html/doc/changelog.html
deps/npm/html/doc/coding-style.html
deps/npm/html/doc/completion.html
deps/npm/html/doc/config.html
deps/npm/html/doc/deprecate.html
deps/npm/html/doc/developers.html
deps/npm/html/doc/disputes.html
deps/npm/html/doc/docs.html
deps/npm/html/doc/edit.html
deps/npm/html/doc/explore.html
deps/npm/html/doc/faq.html
deps/npm/html/doc/folders.html
deps/npm/html/doc/help-search.html
deps/npm/html/doc/help.html
deps/npm/html/doc/index.html
deps/npm/html/doc/init.html
deps/npm/html/doc/install.html
deps/npm/html/doc/json.html
deps/npm/html/doc/link.html
deps/npm/html/doc/list.html
deps/npm/html/doc/npm.html
deps/npm/html/doc/outdated.html
deps/npm/html/doc/owner.html
deps/npm/html/doc/pack.html
deps/npm/html/doc/prefix.html
deps/npm/html/doc/prune.html
deps/npm/html/doc/publish.html
deps/npm/html/doc/rebuild.html
deps/npm/html/doc/registry.html
deps/npm/html/doc/removing-npm.html
deps/npm/html/doc/restart.html
deps/npm/html/doc/root.html
deps/npm/html/doc/run-script.html
deps/npm/html/doc/scripts.html
deps/npm/html/doc/search.html
deps/npm/html/doc/semver.html
deps/npm/html/doc/shrinkwrap.html
deps/npm/html/doc/star.html
deps/npm/html/doc/start.html
deps/npm/html/doc/stop.html
deps/npm/html/doc/submodule.html
deps/npm/html/doc/tag.html
deps/npm/html/doc/test.html
deps/npm/html/doc/uninstall.html
deps/npm/html/doc/unpublish.html
deps/npm/html/doc/update.html
deps/npm/html/doc/version.html
deps/npm/html/doc/view.html
deps/npm/html/doc/whoami.html
deps/npm/html/index.html
deps/npm/html/n-64.png [deleted file]
deps/npm/html/n-large.png [deleted file]
deps/npm/html/npm-16.png [deleted file]
deps/npm/html/npm-256-square.png [deleted file]
deps/npm/html/npm-256w.png [deleted file]
deps/npm/html/npm-64-square.png [deleted file]
deps/npm/html/npm-fin.png [deleted file]
deps/npm/html/npm-large.png [deleted file]
deps/npm/html/npm.png [deleted file]
deps/npm/lib/install.js
deps/npm/lib/npm.js
deps/npm/lib/utils/config-defs.js
deps/npm/lib/utils/exec.js
deps/npm/lib/utils/read-installed.js
deps/npm/man/man1/config.1
deps/npm/man/man1/install.1
deps/npm/man/man1/npm.1
deps/npm/man/man3/npm.3
deps/npm/node_modules/fstream-npm/fstream-npm.js
deps/npm/node_modules/fstream-npm/node_modules/fstream-ignore/package.json
deps/npm/node_modules/fstream-npm/package.json
deps/npm/node_modules/node-gyp/LICENSE [new file with mode: 0644]
deps/npm/node_modules/node-gyp/bin/node-gyp.js
deps/npm/node_modules/node-gyp/legacy/common.gypi
deps/npm/node_modules/node-gyp/lib/build.js
deps/npm/node_modules/node-gyp/lib/clean.js
deps/npm/node_modules/node-gyp/lib/configure.js
deps/npm/node_modules/node-gyp/lib/install.js
deps/npm/node_modules/node-gyp/lib/list.js
deps/npm/node_modules/node-gyp/lib/node-gyp.js
deps/npm/node_modules/node-gyp/lib/remove.js
deps/npm/node_modules/node-gyp/lib/util/asyncEmit.js [deleted file]
deps/npm/node_modules/node-gyp/lib/util/hook.js [deleted file]
deps/npm/node_modules/node-gyp/node_modules/ansi/package.json
deps/npm/node_modules/node-gyp/node_modules/glob/package.json
deps/npm/node_modules/node-gyp/package.json
deps/npm/package.json

index 340c4bd..8bd425c 100644 (file)
@@ -63,3 +63,4 @@ Adam Blackburn <regality@gmail.com>
 Kris Windham <kriswindham@gmail.com>
 Jens Grunert <jens.grunert@gmail.com>
 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>
+Dalmais Maxence <github@maxired.fr>
index 8cd03a7..3fd9cb8 100644 (file)
@@ -115,6 +115,8 @@ The following shorthands are parsed on the command-line:
 * `-l`: `--long`
 * `-desc`: `--description`
 * `-S`: `--save`
+* `-D`: `--save-dev`
+* `-O`: `--save-optional`
 * `-y`: `--yes`
 * `-n`: `--yes false`
 * `ll` and `la` commands: `ls --long`
@@ -584,6 +586,24 @@ Save installed packages to a package.json file as dependencies.
 
 Only works if there is already a package.json file present.
 
+### save-dev
+
+* Default: false
+* Type: Boolean
+
+Save installed packages to a package.json file as devDependencies.
+
+Only works if there is already a package.json file present.
+
+### save-optional
+
+* Default: false
+* Type: Boolean
+
+Save installed packages to a package.json file as optionalDependencies.
+
+Only works if there is already a package.json file present.
+
 ### searchopts
 
 * Default: ""
index 903844a..cfa95e7 100644 (file)
@@ -7,10 +7,11 @@ npm-install(1) -- Install a package
     npm install <tarball file>
     npm install <tarball url>
     npm install <folder>
-    npm install <name>
+    npm install <name> [--save|--save-dev|--save-optional]
     npm install <name>@<tag>
     npm install <name>@<version>
     npm install <name>@<version range>
+    npm install <name>@<version range>
 
 ## DESCRIPTION
 
@@ -35,88 +36,116 @@ after packing it up into a tarball (b).
 
 
 * `npm install` (in package directory, no arguments):
-  Install the dependencies in the local node_modules folder.
 
-  In global mode (ie, with `-g` or `--global` appended to the command),
-  it installs the current package context (ie, the current working
-  directory) as a global package.
+    Install the dependencies in the local node_modules folder.
+
+    In global mode (ie, with `-g` or `--global` appended to the command),
+    it installs the current package context (ie, the current working
+    directory) as a global package.
+
 
 * `npm install <folder>`:
-  Install a package that is sitting in a folder on the filesystem.
+
+    Install a package that is sitting in a folder on the filesystem.
 
 * `npm install <tarball file>`:
-  Install a package that is sitting on the filesystem.  Note: if you just want
-  to link a dev directory into your npm root, you can do this more easily by
-  using `npm link`.
 
-  Example:
+    Install a package that is sitting on the filesystem.  Note: if you just want
+    to link a dev directory into your npm root, you can do this more easily by
+    using `npm link`.
+
+    Example:
 
-        npm install ./package.tgz
+          npm install ./package.tgz
 
 * `npm install <tarball url>`:
-  Fetch the tarball url, and then install it.  In order to distinguish between
-  this and other options, the argument must start with "http://" or "https://"
 
-  Example:
+    Fetch the tarball url, and then install it.  In order to distinguish between
+    this and other options, the argument must start with "http://" or "https://"
+
+    Example:
+
+          npm install https://github.com/indexzero/forever/tarball/v0.5.6
+
+* `npm install <name> [--save|--save-dev|--save-optional]`:
+
+    Do a `<name>@<tag>` install, where `<tag>` is the "tag" config. (See
+    `npm-config(1)`.)
 
-        npm install https://github.com/indexzero/forever/tarball/v0.5.6
+    In most cases, this will install the latest version
+    of the module published on npm.
 
-* `npm install <name>`:
-  Do a `<name>@<tag>` install, where `<tag>` is the "tag" config. (See
-  `npm-config(1)`)
+    Example:
 
-  Example:
+          npm install sax
 
-        npm install sax
+    `npm install` takes 3 exclusive, optional flags which save or update
+    the package version in your main package.json:
 
-  **Note**: If there is a file or folder named `<name>` in the current
-  working directory, then it will try to install that, and only try to
-  fetch the package by name if it is not valid.
+    * `--save`: Package will appear in your `dependencies`.
+
+    * `--save-dev`: Package will appear in your `devDependencies`.
+
+    * `--save-optional`: Package will appear in your `optionalDependencies`.
+
+    Examples:
+
+          npm install sax --save
+          npm install node-tap --save-dev
+          npm install dtrace-provider --save-optional
+
+
+    **Note**: If there is a file or folder named `<name>` in the current
+    working directory, then it will try to install that, and only try to
+    fetch the package by name if it is not valid.
 
 * `npm install <name>@<tag>`:
-  Install the version of the package that is referenced by the specified tag.
-  If the tag does not exist in the registry data for that package, then this
-  will fail.
 
-  Example:
+    Install the version of the package that is referenced by the specified tag.
+    If the tag does not exist in the registry data for that package, then this
+    will fail.
+
+    Example:
 
-        npm install sax@latest
+          npm install sax@latest
 
 * `npm install <name>@<version>`:
-  Install the specified version of the package.  This will fail if the version
-  has not been published to the registry.
 
-  Example:
+    Install the specified version of the package.  This will fail if the version
+    has not been published to the registry.
 
-        npm install sax@0.1.1
+    Example:
+
+          npm install sax@0.1.1
 
 * `npm install <name>@<version range>`:
-  Install a version of the package matching the specified version range.  This
-  will follow the same rules for resolving dependencies described in `npm-json(1)`.
 
-  Note that most version ranges must be put in quotes so that your shell will
-  treat it as a single argument.
+    Install a version of the package matching the specified version range.  This
+    will follow the same rules for resolving dependencies described in `npm-json(1)`.
+
+    Note that most version ranges must be put in quotes so that your shell will
+    treat it as a single argument.
 
-  Example:
+    Example:
 
-        npm install sax@">=0.1.0 <0.2.0"
+          npm install sax@">=0.1.0 <0.2.0"
 
 * `npm install <git remote url>`:
 
-  Install a package by cloning a git remote url.  The format of the git
-  url is:
+    Install a package by cloning a git remote url.  The format of the git
+    url is:
 
-        <protocol>://[<user>@]<hostname><separator><path>[#<commit-ish>]
+          <protocol>://[<user>@]<hostname><separator><path>[#<commit-ish>]
 
-  `<protocol>` is one of `git`, `git+ssh`, `git+http`, or
-  `git+https`.  If no `<commit-ish>` is specified, then `master` is
-  used.
+    `<protocol>` is one of `git`, `git+ssh`, `git+http`, or
+    `git+https`.  If no `<commit-ish>` is specified, then `master` is
+    used.
 
-  Examples:
+    Examples:
 
-        git+ssh://git@github.com:isaacs/npm.git#v1.0.27
-        git+https://isaacs@github.com/isaacs/npm.git
-        git://github.com/isaacs/npm.git#v1.0.27
+          git+ssh://git@github.com:isaacs/npm.git#v1.0.27
+          git+https://isaacs@github.com/isaacs/npm.git
+          git://github.com/isaacs/npm.git#v1.0.27
 
 You may combine multiple arguments, and even multiple types of arguments.
 For example:
index c5d56c1..6def10f 100644 (file)
@@ -19,7 +19,7 @@
 <p>This function should not be used programmatically.  Instead, just refer
 to the <code>npm.bin</code> member.</p>
 </div>
-<p id="footer">bin &mdash; npm@1.1.16</p>
+<p id="footer">bin &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index dda6be2..4edce50 100644 (file)
@@ -25,7 +25,7 @@ optional version number.</p>
 <p>This command will launch a browser, so this command may not be the most
 friendly for programmatic use.</p>
 </div>
-<p id="footer">bugs &mdash; npm@1.1.16</p>
+<p id="footer">bugs &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 23232a4..20285bf 100644 (file)
@@ -28,7 +28,7 @@ usage, or <code>man 3 npm-&lt;command&gt;</code> for programmatic usage.</p>
 
 <ul><li><a href="../doc/index.html">index(1)</a></li></ul>
 </div>
-<p id="footer">commands &mdash; npm@1.1.16</p>
+<p id="footer">commands &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 0e86fb0..b259429 100644 (file)
@@ -33,7 +33,7 @@ functions instead.</p>
 
 <ul><li><a href="../api/npm.html">npm(3)</a></li></ul>
 </div>
-<p id="footer">config &mdash; npm@1.1.16</p>
+<p id="footer">config &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 487eed7..a7d1a3a 100644 (file)
@@ -30,7 +30,7 @@ install the package.</p></li></ul>
 
 <ul><li><a href="../api/publish.html">publish(3)</a></li><li><a href="../api/unpublish.html">unpublish(3)</a></li><li><a href="../doc/registry.html">registry(1)</a></li></ul>
 </div>
-<p id="footer">deprecate &mdash; npm@1.1.16</p>
+<p id="footer">deprecate &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 52b1684..bc1142e 100644 (file)
@@ -25,7 +25,7 @@ optional version number.</p>
 <p>This command will launch a browser, so this command may not be the most
 friendly for programmatic use.</p>
 </div>
-<p id="footer">docs &mdash; npm@1.1.16</p>
+<p id="footer">docs &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 54fc61d..6d4fc44 100644 (file)
@@ -30,7 +30,7 @@ to open. The package can optionally have a version number attached.</p>
 <p>Since this command opens an editor in a new process, be careful about where
 and how this is used.</p>
 </div>
-<p id="footer">edit &mdash; npm@1.1.16</p>
+<p id="footer">edit &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 8dcdf98..94b459b 100644 (file)
@@ -24,7 +24,7 @@ sure to use <code>npm rebuild &lt;pkg&gt;</code> if you make any changes.</p>
 
 <p>The first element in the 'args' parameter must be a package name.  After that is the optional command, which can be any number of strings. All of the strings will be combined into one, space-delimited command.</p>
 </div>
-<p id="footer">explore &mdash; npm@1.1.16</p>
+<p id="footer">explore &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 93a8aa4..0d44abf 100644 (file)
@@ -32,7 +32,7 @@ Name of the file that matched</li></ul>
 
 <p>The silent parameter is not neccessary not used, but it may in the future.</p>
 </div>
-<p id="footer">help-search &mdash; npm@1.1.16</p>
+<p id="footer">help-search &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 94610f0..79aad62 100644 (file)
@@ -35,7 +35,7 @@ then go ahead and use this programmatically.</p>
 
 <p><a href="../doc/json.html">json(1)</a></p>
 </div>
-<p id="footer">init &mdash; npm@1.1.16</p>
+<p id="footer">init &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 8928977..f236997 100644 (file)
@@ -25,7 +25,7 @@ the name of a package to be installed.</p>
 <p>Finally, 'callback' is a function that will be called when all packages have been
 installed or when an error has been encountered.</p>
 </div>
-<p id="footer">install &mdash; npm@1.1.16</p>
+<p id="footer">install &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 3efed3a..6f28e5c 100644 (file)
@@ -39,7 +39,7 @@ npm.commands.link('redis', cb)  # link-install the package</code></pre>
 <p>Now, any changes to the redis package will be reflected in
 the package in the current working directory</p>
 </div>
-<p id="footer">link &mdash; npm@1.1.16</p>
+<p id="footer">link &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index a50e1d2..b52328a 100644 (file)
@@ -32,7 +32,7 @@ config object.</p>
 
 <p>For a list of all the available command-line configs, see <code>npm help config</code></p>
 </div>
-<p id="footer">load &mdash; npm@1.1.16</p>
+<p id="footer">load &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 4d16c7c..302372b 100644 (file)
@@ -59,7 +59,7 @@ project.</p>
 This means that if a submodule a same dependency as a parent module, then the
 dependency will only be output once.</p>
 </div>
-<p id="footer">ls &mdash; npm@1.1.16</p>
+<p id="footer">ls &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index e735e41..4bec420 100644 (file)
@@ -24,7 +24,7 @@ npm.load(configObject, function (er, npm) {
 
 <h2 id="VERSION">VERSION</h2>
 
-<p>1.1.16</p>
+<p>1.1.19</p>
 
 <h2 id="DESCRIPTION">DESCRIPTION</h2>
 
@@ -91,7 +91,7 @@ method names.  Use the <code>npm.deref</code> method to find the real name.</p>
 
 <pre><code>var cmd = npm.deref("unp") // cmd === "unpublish"</code></pre>
 </div>
-<p id="footer">npm &mdash; npm@1.1.16</p>
+<p id="footer">npm &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 1d317a4..e8cc015 100644 (file)
@@ -19,7 +19,7 @@ currently outdated.</p>
 
 <p>If the 'packages' parameter is left out, npm will check all packages.</p>
 </div>
-<p id="footer">outdated &mdash; npm@1.1.16</p>
+<p id="footer">outdated &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 4704db6..7cb11bd 100644 (file)
@@ -34,7 +34,7 @@ that is not implemented at this time.</p>
 
 <ul><li><a href="../api/publish.html">publish(3)</a></li><li><a href="../doc/registry.html">registry(1)</a></li></ul>
 </div>
-<p id="footer">owner &mdash; npm@1.1.16</p>
+<p id="footer">owner &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 933e0fd..f2d1368 100644 (file)
@@ -25,7 +25,7 @@ overwritten the second time.</p>
 
 <p>If no arguments are supplied, then npm packs the current package folder.</p>
 </div>
-<p id="footer">pack &mdash; npm@1.1.16</p>
+<p id="footer">pack &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 3c2697d..f47c198 100644 (file)
@@ -21,7 +21,7 @@
 
 <p>This function is not useful programmatically</p>
 </div>
-<p id="footer">prefix &mdash; npm@1.1.16</p>
+<p id="footer">prefix &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index c178d52..989f008 100644 (file)
@@ -23,7 +23,7 @@
 <p>Extraneous packages are packages that are not listed on the parent
 package's dependencies list.</p>
 </div>
-<p id="footer">prune &mdash; npm@1.1.16</p>
+<p id="footer">prune &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index cacb9e4..58bba8b 100644 (file)
@@ -32,7 +32,7 @@ the registry.  Overwrites when the "force" environment variable is set.</p>
 
 <ul><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li><li><a href="../api/owner.html">owner(3)</a></li></ul>
 </div>
-<p id="footer">publish &mdash; npm@1.1.16</p>
+<p id="footer">publish &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 26182e3..91e66a6 100644 (file)
@@ -22,7 +22,7 @@ the new binary. If no 'packages' parameter is specify, every package will be reb
 
 <p>See <code>npm help build</code></p>
 </div>
-<p id="footer">rebuild &mdash; npm@1.1.16</p>
+<p id="footer">rebuild &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 7a90c90..72dc758 100644 (file)
@@ -27,7 +27,7 @@ in the <code>packages</code> parameter.</p>
 
 <ul><li><a href="../api/start.html">start(3)</a></li><li><a href="../api/stop.html">stop(3)</a></li></ul>
 </div>
-<p id="footer">restart &mdash; npm@1.1.16</p>
+<p id="footer">restart &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 1b53031..5adb8eb 100644 (file)
@@ -21,7 +21,7 @@
 
 <p>This function is not useful programmatically.</p>
 </div>
-<p id="footer">root &mdash; npm@1.1.16</p>
+<p id="footer">root &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 4d35498..88ceb44 100644 (file)
@@ -29,7 +29,7 @@ assumed to be the command to run. All other elements are ignored.</p>
 
 <ul><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../api/test.html">test(3)</a></li><li><a href="../api/start.html">start(3)</a></li><li><a href="../api/restart.html">restart(3)</a></li><li><a href="../api/stop.html">stop(3)</a></li></ul>
 </div>
-<p id="footer">run-script &mdash; npm@1.1.16</p>
+<p id="footer">run-script &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index a32fd94..0d86d5a 100644 (file)
@@ -32,7 +32,7 @@ excluded term (the "searchexclude" config). The search is case insensitive
 and doesn't try to read your mind (it doesn't do any verb tense matching or the
 like).</p>
 </div>
-<p id="footer">search &mdash; npm@1.1.16</p>
+<p id="footer">search &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index fb9d91f..ef7ac00 100644 (file)
@@ -26,7 +26,7 @@ but the shrinkwrap file will still be written.</p>
 <p>Finally, 'callback' is a function that will be called when the shrinkwrap has
 been saved.</p>
 </div>
-<p id="footer">shrinkwrap &mdash; npm@1.1.16</p>
+<p id="footer">shrinkwrap &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index e829922..6e007c5 100644 (file)
@@ -19,7 +19,7 @@
 <p>npm can run tests on multiple packages. Just specify multiple packages
 in the <code>packages</code> parameter.</p>
 </div>
-<p id="footer">start &mdash; npm@1.1.16</p>
+<p id="footer">start &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 4515c5e..4928244 100644 (file)
@@ -19,7 +19,7 @@
 <p>npm can run stop on multiple packages. Just specify multiple packages
 in the <code>packages</code> parameter.</p>
 </div>
-<p id="footer">stop &mdash; npm@1.1.16</p>
+<p id="footer">stop &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 7d5cdd2..93fe0c3 100644 (file)
@@ -33,7 +33,7 @@ dependencies into the submodule folder.</p>
 
 <ul><li>npm help json</li><li>git help submodule</li></ul>
 </div>
-<p id="footer">submodule &mdash; npm@1.1.16</p>
+<p id="footer">submodule &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 11c039d..8e3b564 100644 (file)
@@ -29,7 +29,7 @@ parameter is missing or falsey (empty), the default froom the config will be
 used. For more information about how to set this config, check
 <code>man 3 npm-config</code> for programmatic usage or <code>man npm-config</code> for cli usage.</p>
 </div>
-<p id="footer">tag &mdash; npm@1.1.16</p>
+<p id="footer">tag &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index acab6fb..89fdcda 100644 (file)
@@ -22,7 +22,7 @@ true.</p>
 <p>npm can run tests on multiple packages. Just specify multiple packages
 in the <code>packages</code> parameter.</p>
 </div>
-<p id="footer">test &mdash; npm@1.1.16</p>
+<p id="footer">test &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index daa244e..fb4fc24 100644 (file)
@@ -22,7 +22,7 @@ the name of a package to be uninstalled.</p>
 <p>Finally, 'callback' is a function that will be called when all packages have been
 uninstalled or when an error has been encountered.</p>
 </div>
-<p id="footer">uninstall &mdash; npm@1.1.16</p>
+<p id="footer">uninstall &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index cf2a3a6..e01b355 100644 (file)
@@ -26,7 +26,7 @@ is what is meant.</p>
 <p>If no version is specified, or if all versions are removed then
 the root package entry is removed from the registry entirely.</p>
 </div>
-<p id="footer">unpublish &mdash; npm@1.1.16</p>
+<p id="footer">unpublish &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 1b4a212..4032128 100644 (file)
@@ -18,7 +18,7 @@
 
 <p>The 'packages' argument is an array of packages to update. The 'callback' parameter will be called when done or when an error occurs.</p>
 </div>
-<p id="footer">update &mdash; npm@1.1.16</p>
+<p id="footer">update &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 39dd6d3..e30ab56 100644 (file)
@@ -24,7 +24,7 @@ fail if the repo is not clean.</p>
 parameter. The difference, however, is this function will fail if it does
 not have exactly one element. The only element should be a version number.</p>
 </div>
-<p id="footer">version &mdash; npm@1.1.16</p>
+<p id="footer">version &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index a7558a9..b085bed 100644 (file)
@@ -99,7 +99,7 @@ the field name.</p>
 
 <p>corresponding to the list of fields selected.</p>
 </div>
-<p id="footer">view &mdash; npm@1.1.16</p>
+<p id="footer">view &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 672ed6c..ec0b611 100644 (file)
@@ -21,7 +21,7 @@
 
 <p>This function is not useful programmatically</p>
 </div>
-<p id="footer">whoami &mdash; npm@1.1.16</p>
+<p id="footer">whoami &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 71350ac..79d44da 100644 (file)
@@ -267,7 +267,7 @@ will no doubt tell you to put the output in a gist or email.</p>
 
 <ul><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/help.html">help(1)</a></li><li><a href="../doc/index.html">index(1)</a></li></ul>
 </div>
-<p id="footer"><a href="../doc/README.html">README</a> &mdash; npm@1.1.16</p>
+<p id="footer"><a href="../doc/README.html">README</a> &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index c67b9e2..286528d 100644 (file)
@@ -39,7 +39,7 @@ authorize on a new machine.</p>
 
 <ul><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/owner.html">owner(1)</a></li><li><a href="../doc/whoami.html">whoami(1)</a></li></ul>
 </div>
-<p id="footer">adduser &mdash; npm@1.1.16</p>
+<p id="footer">adduser &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index ce60934..1889fbb 100644 (file)
@@ -20,7 +20,7 @@
 
 <ul><li><a href="../doc/prefix.html">prefix(1)</a></li><li><a href="../doc/root.html">root(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
 </div>
-<p id="footer">bin &mdash; npm@1.1.16</p>
+<p id="footer">bin &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 77d549f..34d4b31 100644 (file)
@@ -36,7 +36,7 @@ config param.</p>
 
 <ul><li><a href="../doc/docs.html">docs(1)</a></li><li><a href="../doc/view.html">view(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/json.html">json(1)</a></li></ul>
 </div>
-<p id="footer">bugs &mdash; npm@1.1.16</p>
+<p id="footer">bugs &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 381c92e..6acce09 100644 (file)
@@ -25,7 +25,7 @@ A folder containing a <code>package.json</code> file in its root.</li></ul>
 
 <ul><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/link.html">link(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/json.html">json(1)</a></li></ul>
 </div>
-<p id="footer">build &mdash; npm@1.1.16</p>
+<p id="footer">build &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index efd3202..a0c07ca 100644 (file)
@@ -20,7 +20,7 @@ install packages into the local space.</p>
 
 <ul><li><a href="../doc/install.html">install(1)</a></li></ul>
 </div>
-<p id="footer">bundle &mdash; npm@1.1.16</p>
+<p id="footer">bundle &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 4057136..60c0987 100644 (file)
@@ -66,7 +66,7 @@ they do not make an HTTP request to the registry.</p>
 
 <ul><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/pack.html">pack(1)</a></li></ul>
 </div>
-<p id="footer">cache &mdash; npm@1.1.16</p>
+<p id="footer">cache &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 1a5d0e8..c414210 100644 (file)
@@ -65,7 +65,7 @@
 
 <ul><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li></ul>
 </div>
-<p id="footer">changelog &mdash; npm@1.1.16</p>
+<p id="footer">changelog &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index a33b02c..82e069b 100644 (file)
@@ -191,7 +191,7 @@ set to anything."</p>
 
 <ul><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/npm.html">npm(1)</a></li></ul>
 </div>
-<p id="footer">coding-style &mdash; npm@1.1.16</p>
+<p id="footer">coding-style &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index bfa863e..335bbbb 100644 (file)
@@ -33,7 +33,7 @@ completions based on the arguments.</p>
 
 <ul><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/npm.html">npm(1)</a></li></ul>
 </div>
-<p id="footer">completion &mdash; npm@1.1.16</p>
+<p id="footer">completion &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index f5e4c5b..a2fbdf6 100644 (file)
@@ -105,7 +105,7 @@ global config.</p>
 
 <p>The following shorthands are parsed on the command-line:</p>
 
-<ul><li><code>-v</code>: <code>--version</code></li><li><code>-h</code>, <code>-?</code>, <code>--help</code>, <code>-H</code>: <code>--usage</code></li><li><code>-s</code>, <code>--silent</code>: <code>--loglevel silent</code></li><li><code>-q</code>, <code>--quiet</code>: <code>--loglevel warn</code></li><li><code>-d</code>: <code>--loglevel info</code></li><li><code>-dd</code>, <code>--verbose</code>: <code>--loglevel verbose</code></li><li><code>-ddd</code>: <code>--loglevel silly</code></li><li><code>-g</code>: <code>--global</code></li><li><code>-l</code>: <code>--long</code></li><li><code>-m</code>: <code>--message</code></li><li><code>-p</code>, <code>--porcelain</code>: <code>--parseable</code></li><li><code>-reg</code>: <code>--registry</code></li><li><code>-v</code>: <code>--version</code></li><li><code>-f</code>: <code>--force</code></li><li><code>-l</code>: <code>--long</code></li><li><code>-desc</code>: <code>--description</code></li><li><code>-S</code>: <code>--save</code></li><li><code>-y</code>: <code>--yes</code></li><li><code>-n</code>: <code>--yes false</code></li><li><code>ll</code> and <code>la</code> commands: <code>ls --long</code></li></ul>
+<ul><li><code>-v</code>: <code>--version</code></li><li><code>-h</code>, <code>-?</code>, <code>--help</code>, <code>-H</code>: <code>--usage</code></li><li><code>-s</code>, <code>--silent</code>: <code>--loglevel silent</code></li><li><code>-q</code>, <code>--quiet</code>: <code>--loglevel warn</code></li><li><code>-d</code>: <code>--loglevel info</code></li><li><code>-dd</code>, <code>--verbose</code>: <code>--loglevel verbose</code></li><li><code>-ddd</code>: <code>--loglevel silly</code></li><li><code>-g</code>: <code>--global</code></li><li><code>-l</code>: <code>--long</code></li><li><code>-m</code>: <code>--message</code></li><li><code>-p</code>, <code>--porcelain</code>: <code>--parseable</code></li><li><code>-reg</code>: <code>--registry</code></li><li><code>-v</code>: <code>--version</code></li><li><code>-f</code>: <code>--force</code></li><li><code>-l</code>: <code>--long</code></li><li><code>-desc</code>: <code>--description</code></li><li><code>-S</code>: <code>--save</code></li><li><code>-D</code>: <code>--save-dev</code></li><li><code>-O</code>: <code>--save-optional</code></li><li><code>-y</code>: <code>--yes</code></li><li><code>-n</code>: <code>--yes false</code></li><li><code>ll</code> and <code>la</code> commands: <code>ls --long</code></li></ul>
 
 <p>If the specified configuration param resolves unambiguously to a known
 configuration parameter, then it is expanded to that configuration
@@ -516,6 +516,22 @@ this as true.</p>
 
 <p>Only works if there is already a package.json file present.</p>
 
+<h3 id="save-dev">save-dev</h3>
+
+<ul><li>Default: false</li><li>Type: Boolean</li></ul>
+
+<p>Save installed packages to a package.json file as devDependencies.</p>
+
+<p>Only works if there is already a package.json file present.</p>
+
+<h3 id="save-optional">save-optional</h3>
+
+<ul><li>Default: false</li><li>Type: Boolean</li></ul>
+
+<p>Save installed packages to a package.json file as optionalDependencies.</p>
+
+<p>Only works if there is already a package.json file present.</p>
+
 <h3 id="searchopts">searchopts</h3>
 
 <ul><li>Default: ""</li><li>Type: String</li></ul>
@@ -668,7 +684,7 @@ then answer "no" to any prompt.</p>
 
 <ul><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/npm.html">npm(1)</a></li></ul>
 </div>
-<p id="footer">config &mdash; npm@1.1.16</p>
+<p id="footer">config &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index bc4d557..cfb989f 100644 (file)
@@ -29,7 +29,7 @@ something like this:</p>
 
 <ul><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li></ul>
 </div>
-<p id="footer">deprecate &mdash; npm@1.1.16</p>
+<p id="footer">deprecate &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 069d65b..f9674f3 100644 (file)
@@ -160,7 +160,7 @@ from a fresh checkout.</p>
 
 <ul><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/init.html">init(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li></ul>
 </div>
-<p id="footer">developers &mdash; npm@1.1.16</p>
+<p id="footer">developers &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index e0fdf18..71f775f 100644 (file)
@@ -80,7 +80,7 @@ license statement)</li><li>Illegal content.</li></ol>
 
 <ul><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/owner.html">owner(1)</a></li></ul>
 </div>
-<p id="footer">disputes &mdash; npm@1.1.16</p>
+<p id="footer">disputes &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index f01e600..688c071 100644 (file)
@@ -37,7 +37,7 @@ config param.</p>
 
 <ul><li><a href="../doc/view.html">view(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/json.html">json(1)</a></li></ul>
 </div>
-<p id="footer">docs &mdash; npm@1.1.16</p>
+<p id="footer">docs &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index b1220eb..eb477b5 100644 (file)
@@ -37,7 +37,7 @@ or <code>"notepad"</code> on Windows.</li><li>Type: path</li></ul>
 
 <ul><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/explore.html">explore(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
 </div>
-<p id="footer">edit &mdash; npm@1.1.16</p>
+<p id="footer">edit &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 1fa730f..e24b547 100644 (file)
@@ -40,7 +40,7 @@ Windows</li><li>Type: path</li></ul>
 
 <ul><li><a href="../doc/submodule.html">submodule(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/edit.html">edit(1)</a></li><li><a href="../doc/rebuild.html">rebuild(1)</a></li><li><a href="../doc/build.html">build(1)</a></li><li><a href="../doc/install.html">install(1)</a></li></ul>
 </div>
-<p id="footer">explore &mdash; npm@1.1.16</p>
+<p id="footer">explore &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index ace4928..fcde269 100644 (file)
@@ -241,7 +241,7 @@ We'll have someone kick it or something.</p>
 
 <ul><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li></ul>
 </div>
-<p id="footer">faq &mdash; npm@1.1.16</p>
+<p id="footer">faq &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 731dbe4..96f3a13 100644 (file)
@@ -205,7 +205,7 @@ cannot be found elsewhere.  See <code><a href="../doc/json.html">json(1)</a></co
 
 <ul><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/pack.html">pack(1)</a></li><li><a href="../doc/cache.html">cache(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li></ul>
 </div>
-<p id="footer">folders &mdash; npm@1.1.16</p>
+<p id="footer">folders &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index f203e43..7f5e967 100644 (file)
@@ -38,7 +38,7 @@ where the terms were found in the documentation.</p>
 
 <ul><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/help.html">help(1)</a></li></ul>
 </div>
-<p id="footer">help-search &mdash; npm@1.1.16</p>
+<p id="footer">help-search &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 455cafa..1a6e7f3 100644 (file)
@@ -36,7 +36,7 @@ matches are equivalent to specifying a topic name.</p>
 
 <ul><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/README.html">README</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/help-search.html">help-search(1)</a></li><li><a href="../doc/index.html">index(1)</a></li></ul>
 </div>
-<p id="footer">help &mdash; npm@1.1.16</p>
+<p id="footer">help &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 55672a5..0a3b05e 100644 (file)
 
 <p> Display npm username</p>
 </div>
-<p id="footer">index &mdash; npm@1.1.16</p>
+<p id="footer">index &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index f3215e5..bd12011 100644 (file)
@@ -29,7 +29,7 @@ without a really good reason to do so.</p>
 
 <ul><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/version.html">version(1)</a></li></ul>
 </div>
-<p id="footer">init &mdash; npm@1.1.16</p>
+<p id="footer">init &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index ffff9d3..6f767da 100644 (file)
 npm install &lt;tarball file&gt;
 npm install &lt;tarball url&gt;
 npm install &lt;folder&gt;
-npm install &lt;name&gt;
+npm install &lt;name&gt; [--save|--save-dev|--save-optional]
 npm install &lt;name&gt;@&lt;tag&gt;
 npm install &lt;name&gt;@&lt;version&gt;
+npm install &lt;name&gt;@&lt;version range&gt;
 npm install &lt;name&gt;@&lt;version range&gt;</code></pre>
 
 <h2 id="DESCRIPTION">DESCRIPTION</h2>
@@ -34,33 +35,29 @@ benefits of using npm if you just want to write a node program (a), and
 perhaps if you also want to be able to easily install it elsewhere
 after packing it up into a tarball (b).</p>
 
-<ul><li><p><code>npm install</code> (in package directory, no arguments):
-Install the dependencies in the local node_modules folder.</p><p>In global mode (ie, with <code>-g</code> or <code>--global</code> appended to the command),
+<ul><li><p><code>npm install</code> (in package directory, no arguments):</p><p>Install the dependencies in the local node_modules folder.</p><p>In global mode (ie, with <code>-g</code> or <code>--global</code> appended to the command),
 it installs the current package context (ie, the current working
-directory) as a global package.</p></li><li><p><code>npm install &lt;folder&gt;</code>:
-Install a package that is sitting in a folder on the filesystem.</p></li><li><p><code>npm install &lt;tarball file&gt;</code>:
-Install a package that is sitting on the filesystem.  Note: if you just want
+directory) as a global package.</p></li><li><p><code>npm install &lt;folder&gt;</code>:</p><p>Install a package that is sitting in a folder on the filesystem.</p></li><li><p><code>npm install &lt;tarball file&gt;</code>:</p><p>Install a package that is sitting on the filesystem.  Note: if you just want
 to link a dev directory into your npm root, you can do this more easily by
-using <code>npm link</code>.</p><p>Example:</p><pre><code>npm install ./package.tgz</code></pre></li><li><p><code>npm install &lt;tarball url&gt;</code>:
-Fetch the tarball url, and then install it.  In order to distinguish between
-this and other options, the argument must start with "http://" or "https://"</p><p>Example:</p><pre><code>npm install https://github.com/indexzero/forever/tarball/v0.5.6</code></pre></li><li><p><code>npm install &lt;name&gt;</code>:
-Do a <code>&lt;name&gt;@&lt;tag&gt;</code> install, where <code>&lt;tag&gt;</code> is the "tag" config. (See
-<code><a href="../doc/config.html">config(1)</a></code>)</p><p>Example:</p><pre><code>npm install sax</code></pre><p><strong>Note</strong>: If there is a file or folder named <code>&lt;name&gt;</code> in the current
+using <code>npm link</code>.</p><p>Example:</p><pre><code>  npm install ./package.tgz</code></pre></li><li><p><code>npm install &lt;tarball url&gt;</code>:</p><p>Fetch the tarball url, and then install it.  In order to distinguish between
+this and other options, the argument must start with "http://" or "https://"</p><p>Example:</p><pre><code>  npm install https://github.com/indexzero/forever/tarball/v0.5.6</code></pre></li><li><p><code>npm install &lt;name&gt; [--save|--save-dev|--save-optional]</code>:</p><p>Do a <code>&lt;name&gt;@&lt;tag&gt;</code> install, where <code>&lt;tag&gt;</code> is the "tag" config. (See
+<code><a href="../doc/config.html">config(1)</a></code>.)</p><p>In most cases, this will install the latest version
+of the module published on npm.</p><p>Example:</p><p>      npm install sax</p><p><code>npm install</code> takes 3 exclusive, optional flags which save or update
+the package version in your main package.json:</p><ul><li><p><code>--save</code>: Package will appear in your <code>dependencies</code>.</p></li><li><p><code>--save-dev</code>: Package will appear in your <code>devDependencies</code>.</p></li><li><p><code>--save-optional</code>: Package will appear in your <code>optionalDependencies</code>.</p><p>Examples:</p><p>  npm install sax --save
+  npm install node-tap --save-dev
+  npm install dtrace-provider --save-optional</p><p><strong>Note</strong>: If there is a file or folder named <code>&lt;name&gt;</code> in the current
 working directory, then it will try to install that, and only try to
-fetch the package by name if it is not valid.</p></li><li><p><code>npm install &lt;name&gt;@&lt;tag&gt;</code>:
-Install the version of the package that is referenced by the specified tag.
+fetch the package by name if it is not valid.</p></li></ul></li><li><p><code>npm install &lt;name&gt;@&lt;tag&gt;</code>:</p><p>Install the version of the package that is referenced by the specified tag.
 If the tag does not exist in the registry data for that package, then this
-will fail.</p><p>Example:</p><pre><code>npm install sax@latest</code></pre></li><li><p><code>npm install &lt;name&gt;@&lt;version&gt;</code>:
-Install the specified version of the package.  This will fail if the version
-has not been published to the registry.</p><p>Example:</p><pre><code>npm install sax@0.1.1</code></pre></li><li><p><code>npm install &lt;name&gt;@&lt;version range&gt;</code>:
-Install a version of the package matching the specified version range.  This
+will fail.</p><p>Example:</p><pre><code>  npm install sax@latest</code></pre></li><li><p><code>npm install &lt;name&gt;@&lt;version&gt;</code>:</p><p>Install the specified version of the package.  This will fail if the version
+has not been published to the registry.</p><p>Example:</p><pre><code>  npm install sax@0.1.1</code></pre></li><li><p><code>npm install &lt;name&gt;@&lt;version range&gt;</code>:</p><p>Install a version of the package matching the specified version range.  This
 will follow the same rules for resolving dependencies described in <code><a href="../doc/json.html">json(1)</a></code>.</p><p>Note that most version ranges must be put in quotes so that your shell will
-treat it as a single argument.</p><p>Example:</p><pre><code>npm install sax@"&gt;=0.1.0 &lt;0.2.0"</code></pre></li><li><p><code>npm install &lt;git remote url&gt;</code>:</p><p>Install a package by cloning a git remote url.  The format of the git
-url is:</p><pre><code>&lt;protocol&gt;://[&lt;user&gt;@]&lt;hostname&gt;&lt;separator&gt;&lt;path&gt;[#&lt;commit-ish&gt;]</code></pre><p><code>&lt;protocol&gt;</code> is one of <code>git</code>, <code>git+ssh</code>, <code>git+http</code>, or
+treat it as a single argument.</p><p>Example:</p><p>      npm install sax@"&gt;=0.1.0 &lt;0.2.0"</p></li><li><p><code>npm install &lt;git remote url&gt;</code>:</p><p>Install a package by cloning a git remote url.  The format of the git
+url is:</p><p>      &lt;protocol&gt;://[&lt;user&gt;@]&lt;hostname&gt;&lt;separator&gt;&lt;path&gt;[#&lt;commit-ish&gt;]</p><p><code>&lt;protocol&gt;</code> is one of <code>git</code>, <code>git+ssh</code>, <code>git+http</code>, or
 <code>git+https</code>.  If no <code>&lt;commit-ish&gt;</code> is specified, then <code>master</code> is
-used.</p><p>Examples:</p><pre><code>git+ssh://git@github.com:isaacs/npm.git#v1.0.27
-git+https://isaacs@github.com/isaacs/npm.git
-git://github.com/isaacs/npm.git#v1.0.27</code></pre></li></ul>
+used.</p><p>Examples:</p><pre><code>  git+ssh://git@github.com:isaacs/npm.git#v1.0.27
+  git+https://isaacs@github.com/isaacs/npm.git
+  git://github.com/isaacs/npm.git#v1.0.27</code></pre></li></ul>
 
 <p>You may combine multiple arguments, and even multiple types of arguments.
 For example:</p>
@@ -136,7 +133,7 @@ affects a real use-case, it will be investigated.</p>
 
 <ul><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/update.html">update(1)</a></li><li><a href="../doc/link.html">link(1)</a></li><li><a href="../doc/rebuild.html">rebuild(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/build.html">build(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/tag.html">tag(1)</a></li><li><a href="../doc/rm.html">rm(1)</a></li><li><a href="../doc/shrinkwrap.html">shrinkwrap(1)</a></li></ul>
 </div>
-<p id="footer">install &mdash; npm@1.1.16</p>
+<p id="footer">install &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 1695739..5889303 100644 (file)
@@ -478,7 +478,7 @@ overridden.</p>
 
 <ul><li><a href="../doc/semver.html">semver(1)</a></li><li><a href="../doc/init.html">init(1)</a></li><li><a href="../doc/version.html">version(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/help.html">help(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/rm.html">rm(1)</a></li></ul>
 </div>
-<p id="footer">json &mdash; npm@1.1.16</p>
+<p id="footer">json &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 2722106..dd44701 100644 (file)
@@ -58,7 +58,7 @@ installation target into your project's <code>node_modules</code> folder.</p>
 
 <ul><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
 </div>
-<p id="footer">link &mdash; npm@1.1.16</p>
+<p id="footer">link &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index a316573..1d4664c 100644 (file)
@@ -58,7 +58,7 @@ project.</p>
 
 <ul><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/link.html">link(1)</a></li><li><a href="../doc/prune.html">prune(1)</a></li><li><a href="../doc/outdated.html">outdated(1)</a></li><li><a href="../doc/update.html">update(1)</a></li></ul>
 </div>
-<p id="footer">list &mdash; npm@1.1.16</p>
+<p id="footer">list &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 44eb74d..7fcbe42 100644 (file)
@@ -14,7 +14,7 @@
 
 <h2 id="VERSION">VERSION</h2>
 
-<p>1.1.16</p>
+<p>1.1.19</p>
 
 <h2 id="DESCRIPTION">DESCRIPTION</h2>
 
@@ -135,7 +135,7 @@ will no doubt tell you to put the output in a gist or email.</p>
 
 <ul><li><a href="../doc/help.html">help(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/README.html">README</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/index.html">index(1)</a></li><li><a href="../api/npm.html">npm(3)</a></li></ul>
 </div>
-<p id="footer">npm &mdash; npm@1.1.16</p>
+<p id="footer">npm &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 980017b..1efc5bd 100644 (file)
@@ -21,7 +21,7 @@ packages are currently outdated.</p>
 
 <ul><li><a href="../doc/update.html">update(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li></ul>
 </div>
-<p id="footer">outdated &mdash; npm@1.1.16</p>
+<p id="footer">outdated &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index e9d2dca..f3db675 100644 (file)
@@ -34,7 +34,7 @@ that is not implemented at this time.</p>
 
 <ul><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li><li><a href="../doc/disputes.html">disputes(1)</a></li></ul>
 </div>
-<p id="footer">owner &mdash; npm@1.1.16</p>
+<p id="footer">owner &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 177d63e..a8f709d 100644 (file)
@@ -29,7 +29,7 @@ overwritten the second time.</p>
 
 <ul><li><a href="../doc/cache.html">cache(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
 </div>
-<p id="footer">pack &mdash; npm@1.1.16</p>
+<p id="footer">pack &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 3ca8920..87e29f9 100644 (file)
@@ -20,7 +20,7 @@
 
 <ul><li><a href="../doc/root.html">root(1)</a></li><li><a href="../doc/bin.html">bin(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
 </div>
-<p id="footer">prefix &mdash; npm@1.1.16</p>
+<p id="footer">prefix &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 852fab0..406b0e6 100644 (file)
@@ -25,7 +25,7 @@ package's dependencies list.</p>
 
 <ul><li><a href="../doc/rm.html">rm(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/list.html">list(1)</a></li></ul>
 </div>
-<p id="footer">prune &mdash; npm@1.1.16</p>
+<p id="footer">prune &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 9be5015..373ea5a 100644 (file)
@@ -29,7 +29,7 @@ the registry.  Overwrites when the "--force" flag is set.</p>
 
 <ul><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li><li><a href="../doc/owner.html">owner(1)</a></li><li><a href="../doc/deprecate.html">deprecate(1)</a></li><li><a href="../doc/tag.html">tag(1)</a></li></ul>
 </div>
-<p id="footer">publish &mdash; npm@1.1.16</p>
+<p id="footer">publish &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index cd60c3c..63ed110 100644 (file)
@@ -25,7 +25,7 @@ the new binary.</p>
 
 <ul><li><a href="../doc/build.html">build(1)</a></li><li><a href="../doc/install.html">install(1)</a></li></ul>
 </div>
-<p id="footer">rebuild &mdash; npm@1.1.16</p>
+<p id="footer">rebuild &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index b88470e..3c59811 100644 (file)
@@ -97,7 +97,7 @@ ask for help on the <a href="mailto:npm-@googlegroups.com">npm-@googlegroups.com
 
 <ul><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/disputes.html">disputes(1)</a></li></ul>
 </div>
-<p id="footer">registry &mdash; npm@1.1.16</p>
+<p id="footer">registry &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 99b4079..aacd6a3 100644 (file)
@@ -58,7 +58,7 @@ modules.  To track those down, you can do the following:</p>
 
 <ul><li><a href="../doc/README.html">README</a></li><li><a href="../doc/rm.html">rm(1)</a></li><li><a href="../doc/prune.html">prune(1)</a></li></ul>
 </div>
-<p id="footer">removing-npm &mdash; npm@1.1.16</p>
+<p id="footer">removing-npm &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index d9e510f..d7b0a64 100644 (file)
@@ -24,7 +24,7 @@ the "start" script.</p>
 
 <ul><li><a href="../doc/run-script.html">run-script(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/test.html">test(1)</a></li><li><a href="../doc/start.html">start(1)</a></li><li><a href="../doc/stop.html">stop(1)</a></li></ul>
 </div>
-<p id="footer">restart &mdash; npm@1.1.16</p>
+<p id="footer">restart &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 3d568a9..c8c48b0 100644 (file)
@@ -20,7 +20,7 @@
 
 <ul><li><a href="../doc/prefix.html">prefix(1)</a></li><li><a href="../doc/bin.html">bin(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
 </div>
-<p id="footer">root &mdash; npm@1.1.16</p>
+<p id="footer">root &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 16d60bf..eded963 100644 (file)
@@ -23,7 +23,7 @@ called directly, as well.</p>
 
 <ul><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/test.html">test(1)</a></li><li><a href="../doc/start.html">start(1)</a></li><li><a href="../doc/restart.html">restart(1)</a></li><li><a href="../doc/stop.html">stop(1)</a></li></ul>
 </div>
-<p id="footer">run-script &mdash; npm@1.1.16</p>
+<p id="footer">run-script &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index e95f7f3..53db847 100644 (file)
@@ -177,7 +177,7 @@ will sudo the npm command in question.</li></ul>
 
 <ul><li><a href="../doc/run-script.html">run-script(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/install.html">install(1)</a></li></ul>
 </div>
-<p id="footer">scripts &mdash; npm@1.1.16</p>
+<p id="footer">scripts &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 6e5cde8..83d180b 100644 (file)
@@ -24,7 +24,7 @@ expression characters must be escaped or quoted in most shells.)</p>
 
 <ul><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/view.html">view(1)</a></li></ul>
 </div>
-<p id="footer">search &mdash; npm@1.1.16</p>
+<p id="footer">search &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 79003ce..92195e3 100644 (file)
@@ -104,7 +104,7 @@ that satisfies the range, or null if none of them do.</li></ul>
 
 <ul><li><a href="../doc/json.html">json(1)</a></li></ul>
 </div>
-<p id="footer">semver &mdash; npm@1.1.16</p>
+<p id="footer">semver &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index a146e22..0fe1ee7 100644 (file)
@@ -169,7 +169,7 @@ versions.</p>
 
 <ul><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/list.html">list(1)</a></li></ul>
 </div>
-<p id="footer">shrinkwrap &mdash; npm@1.1.16</p>
+<p id="footer">shrinkwrap &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index ce76b96..617a4e5 100644 (file)
@@ -26,7 +26,7 @@ a vaguely positive way to show that you care.</p>
 
 <ul><li><a href="../doc/view.html">view(1)</a></li><li><a href="../doc/whoami.html">whoami(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li></ul>
 </div>
-<p id="footer">star &mdash; npm@1.1.16</p>
+<p id="footer">star &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index f35b6d6..1cab1b4 100644 (file)
@@ -20,7 +20,7 @@
 
 <ul><li><a href="../doc/run-script.html">run-script(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/test.html">test(1)</a></li><li><a href="../doc/restart.html">restart(1)</a></li><li><a href="../doc/stop.html">stop(1)</a></li></ul>
 </div>
-<p id="footer">start &mdash; npm@1.1.16</p>
+<p id="footer">start &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index d3780c3..434fbd9 100644 (file)
@@ -20,7 +20,7 @@
 
 <ul><li><a href="../doc/run-script.html">run-script(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/test.html">test(1)</a></li><li><a href="../doc/start.html">start(1)</a></li><li><a href="../doc/restart.html">restart(1)</a></li></ul>
 </div>
-<p id="footer">stop &mdash; npm@1.1.16</p>
+<p id="footer">stop &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index bcd2b5d..46a6051 100644 (file)
@@ -33,7 +33,7 @@ dependencies into the submodule folder.</p>
 
 <ul><li><a href="../doc/json.html">json(1)</a></li><li>git help submodule</li></ul>
 </div>
-<p id="footer">submodule &mdash; npm@1.1.16</p>
+<p id="footer">submodule &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 562858b..90cf359 100644 (file)
@@ -21,7 +21,7 @@
 
 <ul><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
 </div>
-<p id="footer">tag &mdash; npm@1.1.16</p>
+<p id="footer">tag &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index a1547fa..e396d78 100644 (file)
@@ -23,7 +23,7 @@ true.</p>
 
 <ul><li><a href="../doc/run-script.html">run-script(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/start.html">start(1)</a></li><li><a href="../doc/restart.html">restart(1)</a></li><li><a href="../doc/stop.html">stop(1)</a></li></ul>
 </div>
-<p id="footer">test &mdash; npm@1.1.16</p>
+<p id="footer">test &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index c95cca9..6256ce3 100644 (file)
@@ -22,7 +22,7 @@ on its behalf.</p>
 
 <ul><li><a href="../doc/prune.html">prune(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
 </div>
-<p id="footer">uninstall &mdash; npm@1.1.16</p>
+<p id="footer">uninstall &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index aded4d6..8a5a5a1 100644 (file)
@@ -34,7 +34,7 @@ the root package entry is removed from the registry entirely.</p>
 
 <ul><li><a href="../doc/deprecate.html">deprecate(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li><li><a href="../doc/owner.html">owner(1)</a></li></ul>
 </div>
-<p id="footer">unpublish &mdash; npm@1.1.16</p>
+<p id="footer">unpublish &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index b512451..4f2c261 100644 (file)
@@ -23,7 +23,7 @@
 
 <ul><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/outdated.html">outdated(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/list.html">list(1)</a></li></ul>
 </div>
-<p id="footer">update &mdash; npm@1.1.16</p>
+<p id="footer">update &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 846709a..952803f 100644 (file)
@@ -31,7 +31,7 @@ will use it as a commit message when creating a version commit.</p>
 
 <ul><li><a href="../doc/init.html">init(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/semver.html">semver(1)</a></li></ul>
 </div>
-<p id="footer">version &mdash; npm@1.1.16</p>
+<p id="footer">version &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index c88830a..763a3c7 100644 (file)
@@ -88,7 +88,7 @@ the field name.</p>
 
 <ul><li><a href="../doc/search.html">search(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/docs.html">docs(1)</a></li></ul>
 </div>
-<p id="footer">view &mdash; npm@1.1.16</p>
+<p id="footer">view &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index f63d142..640cae0 100644 (file)
@@ -20,7 +20,7 @@
 
 <ul><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li></ul>
 </div>
-<p id="footer">whoami &mdash; npm@1.1.16</p>
+<p id="footer">whoami &mdash; npm@1.1.19</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 9ccf28e..4a97cd3 100644 (file)
@@ -59,11 +59,14 @@ code { background:#fff ; outline: 1px solid #ccc; padding:0 2px; }
 <p>npm is a package manager for <a href="http://nodejs.org/">node</a>.  You can use it to install
   and publish your node programs.  It manages dependencies and does other cool stuff.</p>
 
-<h2>One Line Install</h2>
+<h2>Easy Zero Line Install</h2>
 
-<code>curl http://npmjs.org/install.sh | sh</code>
+<p><a href="http://nodejs.org/#download">Install Node.js</a> <br>
+(npm comes with it.)</p>
 
-<h2>More Than One Line Install</h2>
+<p>Because a one-line install is one too many.</p>
+
+<h2>Fancy Install</h2>
 
 <ol>
   <li><a href="https://github.com/isaacs/npm">Get the code.</a>
@@ -71,6 +74,12 @@ code { background:#fff ; outline: 1px solid #ccc; padding:0 2px; }
       says to do.
 </ol>
 
+<p>There's a pretty thorough install script at
+<a href="http://npmjs.org/install.sh">http://npmjs.org/install.sh</a></p>
+
+<p>For maximum security, make sure to thorougly inspect every
+program that you run on your computer!</p>
+
 <h2>Other Cool Stuff</h2>
 
 <ul>
diff --git a/deps/npm/html/n-64.png b/deps/npm/html/n-64.png
deleted file mode 100644 (file)
index d4145ef..0000000
Binary files a/deps/npm/html/n-64.png and /dev/null differ
diff --git a/deps/npm/html/n-large.png b/deps/npm/html/n-large.png
deleted file mode 100644 (file)
index 9e1525f..0000000
Binary files a/deps/npm/html/n-large.png and /dev/null differ
diff --git a/deps/npm/html/npm-16.png b/deps/npm/html/npm-16.png
deleted file mode 100644 (file)
index c3c9d05..0000000
Binary files a/deps/npm/html/npm-16.png and /dev/null differ
diff --git a/deps/npm/html/npm-256-square.png b/deps/npm/html/npm-256-square.png
deleted file mode 100644 (file)
index f7f18b5..0000000
Binary files a/deps/npm/html/npm-256-square.png and /dev/null differ
diff --git a/deps/npm/html/npm-256w.png b/deps/npm/html/npm-256w.png
deleted file mode 100644 (file)
index dac32c8..0000000
Binary files a/deps/npm/html/npm-256w.png and /dev/null differ
diff --git a/deps/npm/html/npm-64-square.png b/deps/npm/html/npm-64-square.png
deleted file mode 100644 (file)
index eef2629..0000000
Binary files a/deps/npm/html/npm-64-square.png and /dev/null differ
diff --git a/deps/npm/html/npm-fin.png b/deps/npm/html/npm-fin.png
deleted file mode 100644 (file)
index 7efbef6..0000000
Binary files a/deps/npm/html/npm-fin.png and /dev/null differ
diff --git a/deps/npm/html/npm-large.png b/deps/npm/html/npm-large.png
deleted file mode 100644 (file)
index 27d8317..0000000
Binary files a/deps/npm/html/npm-large.png and /dev/null differ
diff --git a/deps/npm/html/npm.png b/deps/npm/html/npm.png
deleted file mode 100644 (file)
index d78ff53..0000000
Binary files a/deps/npm/html/npm.png and /dev/null differ
index 4da66d3..5873ca9 100644 (file)
@@ -211,7 +211,7 @@ function readDependencies (context, where, opts, cb) {
         rv[key] = data[key]
       })
       rv.dependencies = {}
-      Object.keys(newwrap.dependencies).forEach(function (key) {
+      Object.keys(newwrap.dependencies || {}).forEach(function (key) {
         var w = newwrap.dependencies[key]
         rv.dependencies[key] = w.from || w.version
       })
@@ -225,7 +225,10 @@ function readDependencies (context, where, opts, cb) {
 // as dependencies to a package.json file.
 // This is experimental.
 function save (where, installed, tree, pretty, cb) {
-  if (!npm.config.get("save") || npm.config.get("global")) {
+  if (!npm.config.get("save") &&
+      !npm.config.get("save-dev") &&
+      !npm.config.get("save-optional") ||
+      npm.config.get("global")) {
     return cb(null, installed, tree, pretty)
   }
 
@@ -257,13 +260,18 @@ function save (where, installed, tree, pretty, cb) {
     } catch (ex) {
       er = ex
     }
-    if (er) return cb(null, installed, tree, pretty)
+    if (er) {
+      return cb(null, installed, tree, pretty)
 
-    var deps = npm.config.get("dev") ? "devDependencies" : "dependencies"
-    deps = data[deps] = data[deps] || {}
+    }
+
+    var deps = npm.config.get("save-optional") ? "optionalDependencies"
+             : npm.config.get("save-dev") ? "devDependencies"
+             : "dependencies"
 
+    data[deps] = data[deps] || {}
     Object.keys(things).forEach(function (t) {
-      deps[t] = things[t]
+      data[deps][t] = things[t]
     })
     data = JSON.stringify(data, null, 2) + "\n"
     fs.writeFile(saveTarget, data, function (er) {
index 456948a..2db21e3 100644 (file)
@@ -26,10 +26,27 @@ var EventEmitter = require("events").EventEmitter
   , semver = require("semver")
   , findPrefix = require("./utils/find-prefix.js")
   , getUid = require("uid-number")
-  , mkdir = require("mkdirp")
+  , mkdirp = require("mkdirp")
   , slide = require("slide")
   , chain = slide.chain
 
+// /usr/local is often a read-only fs, which is not
+// well handled by node or mkdirp.  Just double-check
+// in the case of errors when making the prefix dirs.
+function mkdir (p, cb) {
+  mkdirp(p, function (er, made) {
+    // it could be that we couldn't create it, because it
+    // already exists, and is on a read-only fs.
+    if (er) {
+      return fs.stat(p, function (er2, st) {
+        if (er2 || !st.isDirectory()) return cb(er)
+        return cb(null, made)
+      })
+    }
+    return cb(er, made)
+  })
+}
+
 npm.commands = {}
 npm.ELIFECYCLE = {}
 npm.E404 = {}
index 0b36afd..18b47ec 100644 (file)
@@ -189,6 +189,8 @@ Object.defineProperty(exports, "defaults", {get: function () {
     , registry : "http" + (httpsOk ? "s" : "") + "://registry.npmjs.org/"
     , rollback : true
     , save : false
+    , "save-dev" : false
+    , "save-optional" : false
     , searchopts: ""
     , searchexclude: null
     , searchsort: "name"
@@ -269,6 +271,8 @@ exports.types =
   , registry : [null, url]
   , rollback : Boolean
   , save : Boolean
+  , "save-dev" : Boolean
+  , "save-optional" : Boolean
   , searchopts : String
   , searchexclude: [null, String]
   , searchsort: [ "name", "-name"
@@ -324,6 +328,8 @@ exports.shorthands =
   , porcelain : ["--parseable"]
   , g : ["--global"]
   , S : ["--save"]
+  , D : ["--save-dev"]
+  , O : ["--save-optional"]
   , y : ["--yes"]
   , n : ["--no-yes"]
   }
index 0fa0371..8b75adb 100644 (file)
@@ -11,6 +11,7 @@ var log = require("./log.js")
   , myGID = process.getgid ? process.getgid() : null
   , isRoot = process.getuid && myUID === 0
   , constants = require("constants")
+  , uidNumber = require("uid-number")
 
 function exec (cmd, args, env, takeOver, cwd, uid, gid, cb) {
   if (typeof cb !== "function") cb = gid, gid = null
@@ -34,6 +35,15 @@ function exec (cmd, args, env, takeOver, cwd, uid, gid, cb) {
     log.verbose(uid, "Setting uid from "+myUID)
     log.verbose(new Error().stack, "stack at uid setting")
   }
+
+  if (isNaN(uid) || isNaN(gid)) {
+    // get the numeric values
+    return uidNumber(uid, gid, function (er, uid, gid) {
+      if (er) return cb(er)
+      exec(cmd, args, env, takeOver, cwd, uid, gid, cb)
+    })
+  }
+
   log.silly(cmd+" "+args.map(JSON.stringify).join(" "), "exec")
   var stdout = ""
     , stderr = ""
@@ -77,6 +87,7 @@ function pipe (cp1, cp2, cb) {
     cb(errState = new Error(
       "Failed "+(cp1.name || "<unknown>")+"\nexited with "+code))
   })
+
   cp2.on("exit", function (code) {
     cp2._exited = true
     if (errState) return
@@ -94,10 +105,14 @@ function spawn (c, a, env, takeOver, cwd, uid, gid) {
              , env : env || process.env
              , cwd : cwd || null }
     , cp
-  if (uid != null) opts.uid = uid
-  if (gid != null) opts.gid = gid
+
+  if (!isNaN(uid)) opts.uid = uid
+  if (!isNaN(gid)) opts.gid = gid
+
   if (!isNaN(opts.uid)) opts.uid = +opts.uid
+
   if (!isNaN(opts.gid)) opts.gid = +opts.gid
+
   var name = c +" "+ a.map(JSON.stringify).join(" ")
   log.silly([c, a, opts.cwd], "spawning")
   cp = child_process.spawn(c, a, opts)
index 60cbea1..ff22094 100644 (file)
@@ -94,6 +94,7 @@ var npm = require("../npm.js")
   , semver = require("semver")
   , readJson = require("./read-json.js")
   , log = require("./log.js")
+  , url = require("url")
 
 module.exports = readInstalled
 
@@ -254,6 +255,8 @@ function findUnmet (obj) {
           continue
         }
         if ( typeof deps[d] === "string"
+            // url deps presumed innocent.
+            && !url.parse(deps[d]).protocol
             && !semver.satisfies(found.version, deps[d])) {
           // the bad thing will happen
           log.warn(obj.path + " requires "+d+"@'"+deps[d]
index f39d7ff..65e09d0 100644 (file)
@@ -171,6 +171,12 @@ The following shorthands are parsed on the command\-line:
 \fB\-S\fR: \fB\-\-save\fR
 .
 .IP "\(bu" 4
+\fB\-D\fR: \fB\-\-save\-dev\fR
+.
+.IP "\(bu" 4
+\fB\-O\fR: \fB\-\-save\-optional\fR
+.
+.IP "\(bu" 4
 \fB\-y\fR: \fB\-\-yes\fR
 .
 .IP "\(bu" 4
@@ -1007,6 +1013,38 @@ Save installed packages to a package\.json file as dependencies\.
 .P
 Only works if there is already a package\.json file present\.
 .
+.SS "save\-dev"
+.
+.IP "\(bu" 4
+Default: false
+.
+.IP "\(bu" 4
+Type: Boolean
+.
+.IP "" 0
+.
+.P
+Save installed packages to a package\.json file as devDependencies\.
+.
+.P
+Only works if there is already a package\.json file present\.
+.
+.SS "save\-optional"
+.
+.IP "\(bu" 4
+Default: false
+.
+.IP "\(bu" 4
+Type: Boolean
+.
+.IP "" 0
+.
+.P
+Save installed packages to a package\.json file as optionalDependencies\.
+.
+.P
+Only works if there is already a package\.json file present\.
+.
 .SS "searchopts"
 .
 .IP "\(bu" 4
index 054172e..a9d8431 100644 (file)
@@ -13,10 +13,11 @@ npm install (with no args in a package dir)
 npm install <tarball file>
 npm install <tarball url>
 npm install <folder>
-npm install <name>
+npm install <name> [\-\-save|\-\-save\-dev|\-\-save\-optional]
 npm install <name>@<tag>
 npm install <name>@<version>
 npm install <name>@<version range>
+npm install <name>@<version range>
 .
 .fi
 .
@@ -59,6 +60,8 @@ after packing it up into a tarball (b)\.
 .
 .IP "\(bu" 4
 \fBnpm install\fR (in package directory, no arguments):
+.
+.IP
 Install the dependencies in the local node_modules folder\.
 .
 .IP
@@ -68,10 +71,14 @@ directory) as a global package\.
 .
 .IP "\(bu" 4
 \fBnpm install <folder>\fR:
+.
+.IP
 Install a package that is sitting in a folder on the filesystem\.
 .
 .IP "\(bu" 4
 \fBnpm install <tarball file>\fR:
+.
+.IP
 Install a package that is sitting on the filesystem\.  Note: if you just want
 to link a dev directory into your npm root, you can do this more easily by
 using \fBnpm link\fR\|\.
@@ -82,7 +89,7 @@ Example:
 .IP "" 4
 .
 .nf
-npm install \./package\.tgz
+  npm install \./package\.tgz
 .
 .fi
 .
@@ -91,6 +98,8 @@ npm install \./package\.tgz
 .
 .IP "\(bu" 4
 \fBnpm install <tarball url>\fR:
+.
+.IP
 Fetch the tarball url, and then install it\.  In order to distinguish between
 this and other options, the argument must start with "http://" or "https://"
 .
@@ -100,7 +109,7 @@ Example:
 .IP "" 4
 .
 .nf
-npm install https://github\.com/indexzero/forever/tarball/v0\.5\.6
+  npm install https://github\.com/indexzero/forever/tarball/v0\.5\.6
 .
 .fi
 .
@@ -108,28 +117,54 @@ npm install https://github\.com/indexzero/forever/tarball/v0\.5\.6
 
 .
 .IP "\(bu" 4
-\fBnpm install <name>\fR:
-Do a \fB<name>@<tag>\fR install, where \fB<tag>\fR is the "tag" config\. (See \fBnpm help config\fR)
+\fBnpm install <name> [\-\-save|\-\-save\-dev|\-\-save\-optional]\fR:
+.
+.IP
+Do a \fB<name>@<tag>\fR install, where \fB<tag>\fR is the "tag" config\. (See \fBnpm help config\fR\|\.)
+.
+.IP
+In most cases, this will install the latest version
+of the module published on npm\.
 .
 .IP
 Example:
 .
-.IP "" 4
+.IP
+      npm install sax
 .
-.nf
-npm install sax
+.IP
+\fBnpm install\fR takes 3 exclusive, optional flags which save or update
+the package version in your main package\.json:
 .
-.fi
+.IP "\(bu" 4
+\fB\-\-save\fR: Package will appear in your \fBdependencies\fR\|\.
 .
-.IP "" 0
+.IP "\(bu" 4
+\fB\-\-save\-dev\fR: Package will appear in your \fBdevDependencies\fR\|\.
+.
+.IP "\(bu" 4
+\fB\-\-save\-optional\fR: Package will appear in your \fBoptionalDependencies\fR\|\.
+.
+.IP
+Examples:
+.
+.IP
+  npm install sax \-\-save
+  npm install node\-tap \-\-save\-dev
+  npm install dtrace\-provider \-\-save\-optional
 .
 .IP
 \fBNote\fR: If there is a file or folder named \fB<name>\fR in the current
 working directory, then it will try to install that, and only try to
 fetch the package by name if it is not valid\.
 .
+.IP "" 0
+
+.
 .IP "\(bu" 4
 \fBnpm install <name>@<tag>\fR:
+.
+.IP
 Install the version of the package that is referenced by the specified tag\.
 If the tag does not exist in the registry data for that package, then this
 will fail\.
@@ -140,7 +175,7 @@ Example:
 .IP "" 4
 .
 .nf
-npm install sax@latest
+  npm install sax@latest
 .
 .fi
 .
@@ -149,6 +184,8 @@ npm install sax@latest
 .
 .IP "\(bu" 4
 \fBnpm install <name>@<version>\fR:
+.
+.IP
 Install the specified version of the package\.  This will fail if the version
 has not been published to the registry\.
 .
@@ -158,7 +195,7 @@ Example:
 .IP "" 4
 .
 .nf
-npm install sax@0\.1\.1
+  npm install sax@0\.1\.1
 .
 .fi
 .
@@ -167,6 +204,8 @@ npm install sax@0\.1\.1
 .
 .IP "\(bu" 4
 \fBnpm install <name>@<version range>\fR:
+.
+.IP
 Install a version of the package matching the specified version range\.  This
 will follow the same rules for resolving dependencies described in \fBnpm help json\fR\|\.
 .
@@ -177,15 +216,8 @@ treat it as a single argument\.
 .IP
 Example:
 .
-.IP "" 4
-.
-.nf
-npm install sax@">=0\.1\.0 <0\.2\.0"
-.
-.fi
-.
-.IP "" 0
-
+.IP
+      npm install sax@">=0\.1\.0 <0\.2\.0"
 .
 .IP "\(bu" 4
 \fBnpm install <git remote url>\fR:
@@ -194,14 +226,8 @@ npm install sax@">=0\.1\.0 <0\.2\.0"
 Install a package by cloning a git remote url\.  The format of the git
 url is:
 .
-.IP "" 4
-.
-.nf
-<protocol>://[<user>@]<hostname><separator><path>[#<commit\-ish>]
-.
-.fi
-.
-.IP "" 0
+.IP
+      <protocol>://[<user>@]<hostname><separator><path>[#<commit\-ish>]
 .
 .IP
 \fB<protocol>\fR is one of \fBgit\fR, \fBgit+ssh\fR, \fBgit+http\fR, or \fBgit+https\fR\|\.  If no \fB<commit\-ish>\fR is specified, then \fBmaster\fR is
@@ -213,9 +239,9 @@ Examples:
 .IP "" 4
 .
 .nf
-git+ssh://git@github\.com:isaacs/npm\.git#v1\.0\.27
-git+https://isaacs@github\.com/isaacs/npm\.git
-git://github\.com/isaacs/npm\.git#v1\.0\.27
+  git+ssh://git@github\.com:isaacs/npm\.git#v1\.0\.27
+  git+https://isaacs@github\.com/isaacs/npm\.git
+  git://github\.com/isaacs/npm\.git#v1\.0\.27
 .
 .fi
 .
index 9c56693..4aa0146 100644 (file)
@@ -14,7 +14,7 @@ npm <command> [args]
 .fi
 .
 .SH "VERSION"
-1.1.16
+1.1.19
 .
 .SH "DESCRIPTION"
 npm is the package manager for the Node JavaScript platform\.  It puts
index 5cc2a3e..c2a36bb 100644 (file)
@@ -21,7 +21,7 @@ npm\.load(configObject, function (er, npm) {
 .fi
 .
 .SH "VERSION"
-1.1.16
+1.1.19
 .
 .SH "DESCRIPTION"
 This is the API documentation for npm\.
index 4ad0012..39429d1 100644 (file)
@@ -171,7 +171,17 @@ Packer.prototype.readRules = function (buf, e) {
     return Ignore.prototype.readRules.call(this, buf, e)
   }
 
-  var p = this.package = JSON.parse(buf.toString())
+  buf = buf.toString().trim()
+
+  if (buf.length === 0) return []
+
+  try {
+    var p = this.package = JSON.parse(buf)
+  } catch (er) {
+    er.file = path.resolve(this.path, e)
+    this.error(er)
+    return
+  }
 
   if (this === this.root) {
     this.bundleLinks = this.bundleLinks || {}
@@ -262,7 +272,9 @@ Packer.prototype.emitEntry = function (entry) {
   }
 
   // all *.gyp files are renamed to binding.gyp for node-gyp
-  if (entry.basename.match(/\.gyp$/)) {
+  // but only when they are in the same folder as a package.json file.
+  if (entry.basename.match(/\.gyp$/) &&
+      this.entries.indexOf("package.json") !== -1) {
     entry.basename = "binding.gyp"
     entry.path = path.resolve(entry.dirname, entry.basename)
   }
index cc8cde0..53f3728 100644 (file)
@@ -35,8 +35,8 @@
     "node": "*"
   },
   "_engineSupported": true,
-  "_npmVersion": "1.1.13",
-  "_nodeVersion": "v0.7.7-pre",
+  "_npmVersion": "1.1.16",
+  "_nodeVersion": "v0.7.8-pre",
   "_defaultsLoaded": true,
   "_from": "fstream-ignore@~0.0.5"
 }
index 66dc932..83acd0d 100644 (file)
@@ -6,7 +6,7 @@
   },
   "name": "fstream-npm",
   "description": "fstream class for creating npm packages",
-  "version": "0.0.4",
+  "version": "0.0.6",
   "repository": {
     "type": "git",
     "url": "git://github.com/isaacs/fstream-npm.git"
     "name": "isaacs",
     "email": "i@izs.me"
   },
-  "_id": "fstream-npm@0.0.4",
+  "_id": "fstream-npm@0.0.6",
   "devDependencies": {},
   "optionalDependencies": {},
   "engines": {
     "node": "*"
   },
   "_engineSupported": true,
-  "_npmVersion": "1.1.13",
-  "_nodeVersion": "v0.7.7-pre",
+  "_npmVersion": "1.1.16",
+  "_nodeVersion": "v0.7.8-pre",
   "_defaultsLoaded": true,
-  "_from": "fstream-npm@0 >=0.0.3"
+  "_from": "fstream-npm@0 >=0.0.5"
 }
diff --git a/deps/npm/node_modules/node-gyp/LICENSE b/deps/npm/node_modules/node-gyp/LICENSE
new file mode 100644 (file)
index 0000000..2ea4dc5
--- /dev/null
@@ -0,0 +1,24 @@
+(The MIT License)
+
+Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
index 328e1a9..a7347cc 100755 (executable)
@@ -16,12 +16,17 @@ var gyp = require('../')
   , cursor = ansi(process.stderr)
 
 /**
- * Process and execute the selected command.
+ * Process and execute the selected commands.
  */
 
 var prog = gyp()
 prog.parseArgv(process.argv)
 
+if (prog.todo.length === 0) {
+  return prog.usageAndExit()
+}
+
+
 /**
  * Set up logging handlers.
  */
@@ -36,6 +41,18 @@ prog.on('info', function () {
   cursor.write('\n')
 })
 
+prog.on('warn', function () {
+  cursor.fg.yellow().bg.red().write('warn')
+        .fg.reset().bg.reset().write(' ')
+        .fg.grey().write(arguments[0])
+        .write(' ')
+        .reset()
+  for (var i=1, l=arguments.length; i<l; i++) {
+    cursor.write(arguments[i] + ' ')
+  }
+  cursor.write('\n')
+})
+
 if (prog.opts.verbose) {
   prog.on('verbose', function () {
     cursor.fg.cyan().write('verb ')
@@ -54,48 +71,63 @@ prog.on('spawn', function (command, args, proc) {
         .reset().write(inspect(args) + '\n')
 })
 
+prog.info('it worked if it ends with', 'ok')
+
 /**
- * Process and execute the selected command.
+ * Change dir if -C/--directory was passed.
  */
 
-if (!prog.command) {
-  return prog.usageAndExit()
-}
-
-prog.info('it worked if it ends with', 'ok')
-
-if (typeof prog.commands[prog.command] != 'function') {
-  cursor.fg.red().write('ERR! ')
-        .fg.reset().write('Unknown command "' + prog.command + '"\n')
-  cursor.fg.red().write('ERR! ')
-        .fg.reset().write('not ok\n')
-  process.exit(1)
+var dir = prog.opts.directory
+if (dir) {
+  var fs = require('fs')
+  try {
+    var stat = fs.statSync(dir)
+    if (stat.isDirectory()) {
+      prog.info('chdir:', dir)
+      process.chdir(dir)
+    } else {
+      prog.warn(dir + ' is not a directory')
+    }
+  } catch (e) {
+    prog.warn('directory:', e.message)
+  }
 }
 
+// start running the given commands!
 var completed = false
-prog.commands[prog.command](prog.argv, function (err) {
-  completed = true
-  if (err) {
-    cursor.fg.red().write('ERR! ')
-          .fg.reset().write(err.stack + '\n')
-    cursor.fg.red().write('ERR! ')
-          .fg.reset().write('not ok\n')
-    return process.exit(1)
+run()
+
+function run () {
+  if (prog.todo.length === 0) {
+    // done!
+    completed = true
+    prog.info('done', 'ok')
+    return
   }
-  if (prog.command == 'list') {
-    var versions = arguments[1]
-    if (versions.length > 0) {
-      versions.forEach(function (version) {
-        console.log(version)
-      })
-    } else {
-      prog.info('No node development files installed. Use `node-gyp install` to install a version.')
+  var command = prog.todo.shift()
+  prog.commands[command](prog.argv.slice(), function (err) {
+    if (err) {
+      cursor.fg.red().write('ERR! ')
+            .fg.reset().write(err.stack + '\n')
+      cursor.fg.red().write('ERR! ')
+            .fg.reset().write('not ok\n')
+      return process.exit(1)
     }
-  } else if (arguments.length >= 2) {
-    console.log.apply(console, [].slice.call(arguments, 1))
-  }
-  prog.info('done', 'ok')
-})
+    if (command == 'list') {
+      var versions = arguments[1]
+      if (versions.length > 0) {
+        versions.forEach(function (version) {
+          console.log(version)
+        })
+      } else {
+        prog.info('No node development files installed. Use `node-gyp install` to install a version.')
+      }
+    } else if (arguments.length >= 2) {
+      console.log.apply(console, [].slice.call(arguments, 1))
+    }
+    process.nextTick(run)
+  })
+}
 
 process.on('exit', function (code) {
   if (!completed && !code) {
index 6e13b60..f67e6da 100644 (file)
           'GCC_VERSION': '4.2',
           'GCC_WARN_ABOUT_MISSING_NEWLINE': 'YES',  # -Wnewline-eof
           'PREBINDING': 'NO',                       # No -Wl,-prebind
+          'MACOSX_DEPLOYMENT_TARGET': '10.5',
           'USE_HEADERMAP': 'NO',
           'OTHER_CFLAGS': [
             '-fno-strict-aliasing',
index 3ffc4c7..92f2133 100644 (file)
@@ -5,12 +5,11 @@ module.exports = exports = build
  * Module dependencies.
  */
 
-var fs = require('fs')
+var fs = require('graceful-fs')
   , path = require('path')
   , glob = require('glob')
   , which = require('which')
-  , asyncEmit = require('./util/asyncEmit')
-  , createHook = require('./util/hook')
+  , mkdirp = require('./util/mkdirp')
   , win = process.platform == 'win32'
 
 exports.usage = 'Invokes `' + (win ? 'msbuild' : 'make') + '` and builds the module'
@@ -21,14 +20,12 @@ function build (gyp, argv, callback) {
   var command = win ? 'msbuild' : 'make'
     , buildDir = path.resolve('build')
     , configPath = path.resolve(buildDir, 'config.gypi')
+    , buildType
     , config
-    , emitter
+    , arch
+    , version
 
-  createHook('gyp-build.js', function (err, _e) {
-    if (err) return callback(err)
-    emitter = _e
-    loadConfigGypi()
-  })
+  loadConfigGypi()
 
   /**
    * Load the "config.gypi" file that was generated during "configure".
@@ -45,6 +42,23 @@ function build (gyp, argv, callback) {
         return
       }
       config = JSON.parse(data.replace(/\#.+\n/, ''))
+
+      // get the 'arch', 'buildType', and 'version' vars from the config
+      buildType = config.target_defaults.default_configuration
+      arch = config.variables.target_arch
+      version = config.variables.target_version
+
+      if ('debug' in gyp.opts) {
+        buildType = gyp.opts.debug ? 'Debug' : 'Release'
+      }
+      if (!buildType) {
+        buildType = 'Release'
+      }
+
+      gyp.verbose('build type:', buildType)
+      gyp.verbose('architecture:', arch)
+      gyp.verbose('node version:', version)
+
       if (win) {
         findSolutionFile()
       } else {
@@ -54,7 +68,7 @@ function build (gyp, argv, callback) {
   }
 
   /**
-   * On Windows, find first build/*.sln file.
+   * On Windows, find the first build/*.sln file.
    */
 
   function findSolutionFile () {
@@ -69,6 +83,10 @@ function build (gyp, argv, callback) {
     })
   }
 
+  /**
+   * Uses node-which to locate the msbuild / make executable.
+   */
+
   function doWhich () {
     // First make sure we have the build command in the PATH
     which(command, function (err, execPath) {
@@ -83,7 +101,7 @@ function build (gyp, argv, callback) {
         return
       }
       gyp.verbose('`which` succeeded for `' + command + '`', execPath)
-      build()
+      copyNodeLib()
     })
   }
 
@@ -109,21 +127,40 @@ function build (gyp, argv, callback) {
         return
       }
       command = msbuild
-      build()
+      copyNodeLib()
     })
   }
 
   /**
-   * Actually spawn the process and compile the module.
+   * Copies the node.lib file for the current target architecture into the
+   * current proper dev dir location.
    */
 
-  function build () {
-    var buildType = config.target_defaults.default_configuration
-      , platform = config.variables.target_arch == 'x64' ? '64' : '32'
+  function copyNodeLib () {
+    if (!win) return doBuild()
 
-    if (gyp.opts.debug) {
-      buildType = 'Debug'
-    }
+    var devDir = path.resolve(gyp.devDir, version)
+      , buildDir = path.resolve(devDir, buildType)
+      , archNodeLibPath = path.resolve(devDir, arch, 'node.lib')
+      , buildNodeLibPath = path.resolve(buildDir, 'node.lib')
+
+    mkdirp(buildDir, function (err, isNew) {
+      if (err) return callback(err)
+      gyp.verbose('"' + buildType + '" dir needed to be created?', isNew)
+      var rs = fs.createReadStream(archNodeLibPath)
+        , ws = fs.createWriteStream(buildNodeLibPath)
+      rs.pipe(ws)
+      rs.on('error', callback)
+      ws.on('error', callback)
+      rs.on('end', doBuild)
+    })
+  }
+
+  /**
+   * Actually spawn the process and compile the module.
+   */
+
+  function doBuild () {
 
     // Enable Verbose build
     if (!win && gyp.opts.verbose) {
@@ -140,7 +177,8 @@ function build (gyp, argv, callback) {
 
     // Specify the build type, Release by default
     if (win) {
-      argv.push('/p:Configuration=' + buildType + ';Platform=Win' + platform)
+      var p = arch === 'x64' ? 'x64' : 'Win32'
+      argv.push('/p:Configuration=' + buildType + ';Platform=' + p)
     } else {
       argv.push('BUILDTYPE=' + buildType)
       // Invoke the Makefile in the 'build' dir.
@@ -158,11 +196,8 @@ function build (gyp, argv, callback) {
       }
     }
 
-    asyncEmit(emitter, 'before', function (err) {
-      if (err) return callback(err)
-      var proc = gyp.spawn(command, argv)
-      proc.on('exit', onExit)
-    })
+    var proc = gyp.spawn(command, argv)
+    proc.on('exit', onExit)
   }
 
   /**
@@ -170,16 +205,13 @@ function build (gyp, argv, callback) {
    */
 
   function onExit (code, signal) {
-    asyncEmit(emitter, 'after', function (err) {
-      if (err) return callback(err)
-      if (code !== 0) {
-        return callback(new Error('`' + command + '` failed with exit code: ' + code))
-      }
-      if (signal) {
-        return callback(new Error('`' + command + '` got signal: ' + signal))
-      }
-      callback()
-    })
+    if (code !== 0) {
+      return callback(new Error('`' + command + '` failed with exit code: ' + code))
+    }
+    if (signal) {
+      return callback(new Error('`' + command + '` got signal: ' + signal))
+    }
+    callback()
   }
 
 }
index a8efc1b..1e56114 100644 (file)
@@ -8,35 +8,14 @@ exports.usage = 'Removes any generated build files and the "out" dir'
  */
 
 var rm = require('rimraf')
-  , asyncEmit = require('./util/asyncEmit')
-  , createHook = require('./util/hook')
 
 
 function clean (gyp, argv, callback) {
 
   // Remove the 'build' dir
   var buildDir = 'build'
-    , emitter
-
-  createHook('gyp-clean.js', function (err, _e) {
-    if (err) return callback(err)
-    emitter = _e
-    asyncEmit(emitter, 'before', function (err) {
-      if (err) return callback(err)
-      doClean()
-    })
-  })
-
-  function doClean () {
-    gyp.verbose('removing "build" directory')
-    rm(buildDir, after)
-  }
-
-  function after () {
-    asyncEmit(emitter, 'after', function (err) {
-      if (err) return callback(err)
-      callback()
-    })
-  }
+
+  gyp.verbose('removing "build" directory')
+  rm(buildDir, callback)
 
 }
index c1c99e7..c25ad8f 100644 (file)
@@ -5,34 +5,25 @@ module.exports = exports = configure
  * Module dependencies.
  */
 
-var fs = require('fs')
+var fs = require('graceful-fs')
   , path = require('path')
   , glob = require('glob')
   , which = require('which')
   , semver = require('semver')
   , mkdirp = require('./util/mkdirp')
-  , createHook = require('./util/hook')
-  , asyncEmit = require('./util/asyncEmit')
   , win = process.platform == 'win32'
 
 exports.usage = 'Generates ' + (win ? 'MSVC project files' : 'a Makefile') + ' for the current module'
 
 function configure (gyp, argv, callback) {
 
-  var python = gyp.opts.python || 'python'
+  var python = process.env.PYTHON || gyp.opts.python || 'python'
     , buildDir = path.resolve('build')
     , configPath
-    , emitter
     , versionStr
     , version
 
-  // Very first step is to load up the user-defined 'gyp-configure.js' file if it
-  // exists. We relay filecycle events using the eventemitter returned from this
-  createHook('gyp-configure.js', function (err, _e) {
-    if (err) return callback(err)
-    emitter = _e
-    checkPython()
-  })
+  checkPython()
 
   // Make sure that Python is in the $PATH
   function checkPython () {
@@ -46,7 +37,7 @@ function configure (gyp, argv, callback) {
         return
       }
       gyp.verbose('`which` succeeded for `' + python + '`', execPath)
-      getVersion()
+      getTargetVersion()
     })
   }
 
@@ -54,7 +45,7 @@ function configure (gyp, argv, callback) {
   // We're gonna glob C:\python2*
   function guessPython () {
     gyp.verbose('could not find "' + python + '". guessing location')
-    var rootDir = process.env.HOMEDIR || process.env.SystemDrive || 'C:\\'
+    var rootDir = process.env.HOMEDRIVE || process.env.SystemDrive || 'C:\\'
     if (rootDir[rootDir.length - 1] !== '\\') {
       rootDir += '\\'
     }
@@ -70,15 +61,19 @@ function configure (gyp, argv, callback) {
         return
       }
       python = pythonPath
-      getVersion()
+      getTargetVersion()
     })
   }
 
   function failNoPython () {
-    callback(new Error('Python does not seem to be installed'))
+    callback(new Error('Can\'t find Python, you can set the PYTHON env variable.'))
   }
 
-  function getVersion () {
+  function getTargetVersion () {
+
+    // 'python' should be set by now
+    process.env.PYTHON = python
+
     if (gyp.opts.target) {
       // if --target was given, then ensure that version is installed
       versionStr = gyp.opts.target
@@ -114,23 +109,65 @@ function configure (gyp, argv, callback) {
     if (err) return callback(err)
     gyp.verbose('creating build/config.gypi file')
 
-    var config = {}
     configPath = path.resolve(buildDir, 'config.gypi')
 
-    config.target_defaults = {
-        cflags: []
-      , default_configuration: gyp.opts.debug ? 'Debug' : 'Release'
-      , defines: []
-      , include_dirs: []
-      , libraries: []
+    var config = process.config || {}
+      , defaults = config.target_defaults
+      , variables = config.variables
+
+    if (!defaults) {
+      defaults = config.target_defaults = {}
+    }
+    if (!variables) {
+      variables = config.variables = {}
+    }
+    if (!defaults.cflags) {
+      defaults.cflags = []
+    }
+    if (!defaults.defines) {
+      defaults.defines = []
+    }
+    if (!defaults.include_dirs) {
+      defaults.include_dirs = []
+    }
+    if (!defaults.libraries) {
+      defaults.libraries = []
     }
 
-    config.variables = {
-        target_arch: gyp.opts.arch || process.arch || 'ia32'
+    // set the default_configuration prop
+    if ('debug' in gyp.opts) {
+      defaults.default_configuration = gyp.opts.debug ? 'Debug' : 'Release'
+    }
+    if (!defaults.default_configuration) {
+      defaults.default_configuration = 'Release'
     }
 
+    // set the target_arch variable
+    variables.target_arch = gyp.opts.arch || process.arch || 'ia32'
+
+    // also set the target_version variable
+    variables.target_version = version
+
+    // loop through the rest of the opts and add the unknown ones as variables.
+    // this allows for module-specific configure flags like:
+    //
+    //   $ node-gyp configure --shared-libxml2
+    Object.keys(gyp.opts).forEach(function (opt) {
+      if (opt === 'argv') return
+      if (opt in gyp.configDefs) return
+      variables[opt.replace(/-/g, '_')] = gyp.opts[opt]
+    })
+
+    // ensures that any boolean values from `process.config` get stringified
+    function boolsToString (k, v) {
+      if (typeof v === 'boolean')
+        return String(v)
+      return v
+    }
+
+    // now write out the config.gypi file to the build/ dir
     var prefix = '# Do not edit. File was generated by node-gyp\'s "configure" step'
-      , json = JSON.stringify(config, null, 2)
+      , json = JSON.stringify(config, boolsToString, 2)
     gyp.verbose('writing out config file', configPath)
     fs.writeFile(configPath, [prefix, json, ''].join('\n'), runGypAddon)
   }
@@ -138,8 +175,8 @@ function configure (gyp, argv, callback) {
   function runGypAddon (err) {
     if (err) return callback(err)
 
-    var devDir = path.resolve(process.env.HOME, '.node-gyp', version)
-      , gyp_addon = path.resolve(devDir, 'tools', 'gyp_addon')
+    // location of the `gyp_addon` python script for the target node version
+    var gyp_addon = path.resolve(gyp.devDir, version, 'tools', 'gyp_addon')
 
     if (!~argv.indexOf('-f') && !~argv.indexOf('--format')) {
       if (win) {
@@ -176,12 +213,8 @@ function configure (gyp, argv, callback) {
     // execute `gyp_addon` from the current target node version
     argv.unshift(gyp_addon)
 
-    asyncEmit(emitter, 'before', function (err) {
-      if (err) return callback(err)
-
-      var cp = gyp.spawn(python, argv)
-      cp.on('exit', onCpExit)
-    })
+    var cp = gyp.spawn(python, argv)
+    cp.on('exit', onCpExit)
   }
 
   /**
@@ -189,16 +222,12 @@ function configure (gyp, argv, callback) {
    */
 
   function onCpExit (code, signal) {
-    asyncEmit(emitter, 'after', function (err) {
-      if (err) {
-        callback(err)
-      } else if (code !== 0) {
-        callback(new Error('`gyp_addon` failed with exit code: ' + code))
-      } else {
-        // we're done
-        callback()
-      }
-    })
+    if (code !== 0) {
+      callback(new Error('`gyp_addon` failed with exit code: ' + code))
+    } else {
+      // we're done
+      callback()
+    }
   }
 
 }
index 8ad484d..2cf3993 100644 (file)
@@ -7,16 +7,16 @@ exports.usage = 'Install node development files for the specified node version.'
  * Module dependencies.
  */
 
-var fs = require('fs')
+var fs = require('graceful-fs')
   , tar = require('tar')
   , rm = require('rimraf')
   , path = require('path')
   , zlib = require('zlib')
-  , mkdir = require('mkdirp')
   , semver = require('semver')
   , fstream = require('fstream')
   , request = require('request')
   , minimatch = require('minimatch')
+  , mkdir = require('./util/mkdirp')
   , distUrl = 'http://nodejs.org/dist'
   , win = process.platform == 'win32'
 
@@ -53,7 +53,7 @@ function install (gyp, argv, callback) {
   gyp.verbose('installing legacy version?', isLegacy)
 
   if (semver.lt(versionStr, '0.6.0')) {
-    return callback(new Error('Minimum target version is `0.6` or greater. Got: ' + versionStr))
+    return callback(new Error('Minimum target version is `0.6.0` or greater. Got: ' + versionStr))
   }
 
   // 0.x.y-pre versions are not published yet. Use previous release.
@@ -67,11 +67,10 @@ function install (gyp, argv, callback) {
   version = version.slice(1, 4).join('.')
   gyp.verbose('installing version', version)
 
+  // the directory where the dev files will be installed
+  var devDir = path.resolve(gyp.devDir, version)
 
-  // TODO: Make ~/.node-gyp configurable
-  var devDir = path.resolve(process.env.HOME, '.node-gyp', version)
-
-  // If '--ensure' was passed, then don't *always* install the version,
+  // If '--ensure' was passed, then don't *always* install the version;
   // check if it is already installed, and only install when needed
   if (gyp.opts.ensure) {
     gyp.verbose('--ensure was passed, so won\'t reinstall if already installed')
@@ -107,7 +106,7 @@ function install (gyp, argv, callback) {
     go()
   }
 
-  function download(url,onError) {
+  function download (url, onError) {
     gyp.info('downloading:', url)
     var requestOpts = {
         uri: url
@@ -129,11 +128,14 @@ function install (gyp, argv, callback) {
   function go () {
 
   // first create the dir for the node dev files
-  mkdir(devDir, function (err) {
+  mkdir(devDir, function (err, created) {
     if (err) return cb(err)
 
-    // TODO: Detect if it was actually created or if it already existed
-    gyp.verbose('created:', devDir)
+    if (created) {
+      gyp.verbose('created:', devDir)
+    } else {
+      gyp.verbose('directory already existed:', devDir)
+    }
 
     // now download the node tarball
     var tarballUrl = distUrl + '/v' + version + '/node-v' + version + '.tar.gz'
@@ -242,40 +244,56 @@ function install (gyp, argv, callback) {
 
     function downloadNodeLib (done) {
       gyp.verbose('on Windows; need to download `node.lib`...')
-      // TODO: windows 64-bit support
-      var releaseDir = path.resolve(devDir, 'Release')
-        , debugDir = path.resolve(devDir, 'Debug')
-        , nodeLibUrl = distUrl + '/v' + version + '/node.lib'
-
-      gyp.verbose('Release dir', releaseDir)
-      gyp.verbose('Debug dir', debugDir)
-      gyp.verbose('`node.lib` url', nodeLibUrl)
-      // TODO: parallelize mkdirs
-      mkdir(releaseDir, function (err) {
+      var dir32 = path.resolve(devDir, 'ia32')
+        , dir64 = path.resolve(devDir, 'x64')
+        , nodeLibPath32 = path.resolve(dir32, 'node.lib')
+        , nodeLibPath64 = path.resolve(dir64, 'node.lib')
+        , nodeLibUrl32 = distUrl + '/v' + version + '/node.lib'
+        , nodeLibUrl64 = distUrl + '/v' + version + '/x64/node.lib'
+
+      gyp.verbose('32-bit node.lib dir', dir32)
+      gyp.verbose('64-bit node.lib dir', dir64)
+      gyp.verbose('`node.lib` 32-bit url', nodeLibUrl32)
+      gyp.verbose('`node.lib` 64-bit url', nodeLibUrl64)
+
+      var async = 2
+      mkdir(dir32, function (err) {
+        if (err) return done(err)
+        gyp.verbose('streaming 32-bit node.lib to:', nodeLibPath32)
+
+        var req = download(nodeLibUrl32)
+        req.on('error', done)
+        req.on('response', function (res) {
+          if (res.statusCode !== 200) {
+            done(new Error(res.statusCode + ' status code downloading 32-bit node.lib'))
+          }
+        })
+        req.on('end', function () {
+          --async || done()
+        })
+
+        var ws = fs.createWriteStream(nodeLibPath32)
+        ws.on('error', cb)
+        req.pipe(ws)
+      })
+      mkdir(dir64, function (err) {
         if (err) return done(err)
-        mkdir(debugDir, function (err) {
-          if (err) return done(err)
-          // TODO: clean this mess up, written in a hastemode-9000
-          var badDownload = false
-          var res = download(nodeLibUrl, function (err, res) {
-            if (err || res.statusCode != 200) {
-              badDownload = true
-              done(err || new Error(res.statusCode + ' status code downloading node.lib'))
-            }
-          })
-          var releaseDirNodeLib = path.resolve(releaseDir, 'node.lib')
-            , debugDirNodeLib = path.resolve(debugDir, 'node.lib')
-            , rws = fs.createWriteStream(releaseDirNodeLib)
-            , dws = fs.createWriteStream(debugDirNodeLib)
-          gyp.verbose('streaming to', releaseDirNodeLib)
-          gyp.verbose('streaming to', debugDirNodeLib)
-          res.pipe(rws)
-          res.pipe(dws)
-          res.on('end', function () {
-            if (badDownload) return
-            done()
-          })
+        gyp.verbose('streaming 64-bit node.lib to:', nodeLibPath64)
+
+        var req = download(nodeLibUrl64)
+        req.on('error', done)
+        req.on('response', function (res) {
+          if (res.statusCode !== 200) {
+            done(new Error(res.statusCode + ' status code downloading 64-bit node.lib'))
+          }
         })
+        req.on('end', function () {
+          --async || done()
+        })
+
+        var ws = fs.createWriteStream(nodeLibPath64)
+        ws.on('error', cb)
+        req.pipe(ws)
       })
     }
 
index 6ecf1ba..64c4ef7 100644 (file)
@@ -7,18 +7,15 @@ exports.usage = 'Prints a listing of the currently installed node development fi
  * Module dependencies.
  */
 
-var fs = require('fs')
+var fs = require('graceful-fs')
   , path = require('path')
 
 function list (gyp, args, callback) {
 
-  // TODO: Make ~/.node-gyp configurable
-  var nodeGypDir = path.resolve(process.env.HOME, '.node-gyp')
-
-  gyp.verbose('using node-gyp dir', nodeGypDir)
+  gyp.verbose('using node-gyp dir', gyp.devDir)
 
   // readdir the node-gyp dir
-  fs.readdir(nodeGypDir, onreaddir)
+  fs.readdir(gyp.devDir, onreaddir)
 
   function onreaddir (err, versions) {
     if (err && err.code != 'ENOENT') {
index efa5343..1b014e6 100644 (file)
@@ -5,7 +5,7 @@ module.exports = exports = gyp
  * Module dependencies.
  */
 
-var fs = require('fs')
+var fs = require('graceful-fs')
   , path = require('path')
   , nopt = require('nopt')
   , child_process = require('child_process')
@@ -38,13 +38,24 @@ function gyp () {
 function Gyp () {
   var me = this
 
+  // set the dir where node-gyp dev files get installed
+  // TODO: make this configurable?
+  //       see: https://github.com/TooTallNate/node-gyp/issues/21
+  var homeDir = process.env.HOME || process.env.USERPROFILE
+  this.devDir = path.resolve(homeDir, '.node-gyp')
+
   this.commands = {}
+
   commands.forEach(function (command) {
     me.commands[command] = function (argv, callback) {
       me.verbose('command', command, argv)
       return require('./' + command)(me, argv, callback)
     }
   })
+
+  Object.keys(aliases).forEach(function (alias) {
+    me.commands[alias] = me.commands[aliases[alias]]
+  })
 }
 inherits(Gyp, EE)
 exports.Gyp = Gyp
@@ -56,9 +67,14 @@ var proto = Gyp.prototype
 
 proto.package = require('../package')
 
+/**
+ * nopt configuration definitions
+ */
+
 proto.configDefs = {
     help: Boolean    // everywhere
   , arch: String     // 'configure'
+  , directory: String // bin
   , msvs_version: String // 'configure'
   , debug: Boolean   // 'build'
   , ensure: Boolean  // 'install'
@@ -67,14 +83,33 @@ proto.configDefs = {
   , proxy: String // 'install'
 }
 
-proto.shorthands = {}
+/**
+ * nopt shorthands
+ */
+
+proto.shorthands = {
+    release: '--no-debug'
+  , C: '--directory'
+}
+
+/**
+ * Parses the given argv array and sets the 'opts',
+ * 'argv' and 'command' properties.
+ */
 
 proto.parseArgv = function parseOpts (argv) {
   this.opts = nopt(this.configDefs, this.shorthands, argv)
   this.argv = this.opts.argv.remain.slice()
 
-  var command = this.argv.shift()
-  this.command = aliases[command] || command
+  var commands = []
+  this.argv.slice().forEach(function (arg) {
+    if (arg in this.commands) {
+      this.argv.splice(this.argv.indexOf(arg), 1)
+      commands.push(arg)
+    }
+  }, this)
+
+  this.todo = commands
 }
 
 /**
@@ -100,6 +135,11 @@ proto.info = function info () {
   args.unshift('info')
   this.emit.apply(this, args)
 }
+proto.warn = function warn () {
+  var args = Array.prototype.slice.call(arguments)
+  args.unshift('warn')
+  this.emit.apply(this, args)
+}
 
 proto.verbose = function verbose () {
   var args = Array.prototype.slice.call(arguments)
index a194040..2844ec0 100644 (file)
@@ -14,10 +14,7 @@ var fs = require('fs')
 
 function remove (gyp, argv, callback) {
 
-  // TODO: Make ~/.node-gyp configurable
-  var nodeGypDir = path.resolve(process.env.HOME, '.node-gyp')
-
-  gyp.verbose('using node-gyp dir', nodeGypDir)
+  gyp.verbose('using node-gyp dir', gyp.devDir)
 
   // get the user-specified version to remove
   var v = argv[0] || gyp.opts.target
@@ -36,7 +33,7 @@ function remove (gyp, argv, callback) {
   // flatten the version Array into a String
   version = version.slice(1, 4).join('.')
 
-  var versionPath = path.resolve(nodeGypDir, version)
+  var versionPath = path.resolve(gyp.devDir, version)
   gyp.verbose('removing development files for version', version)
 
   // first check if its even installed
diff --git a/deps/npm/node_modules/node-gyp/lib/util/asyncEmit.js b/deps/npm/node_modules/node-gyp/lib/util/asyncEmit.js
deleted file mode 100644 (file)
index eb3d29f..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-
-/**
- * An `asyncEmit()` function that accepts an EventEmitter, an Array of args, and
- * a callback function. If the emitter listener function has an arity
- * > args.length then there is an assumed callback function on the emitter, which
- * means that it is doing some async work. We have to wait for the callbacks for
- * any async listener functions.
- *
- * It works like this:
- *
- *   var emitter = new EventEmitter
- *
- *   // this is an async listener
- *   emitter.on('something', function (val, done) {
- *     // val may be any number of input arguments
- *     setTimeout(function () {
- *       done()
- *     }, 1000)
- *   })
- *
- *   // this is a sync listener, no callback function
- *   emitter.on('something', function (val) {
- *
- *   })
- *
- *   asyncEmit(emitter, 'something', [ 5 ], function (err) {
- *     if (err) throw err
- *     console.log('DONE!')
- *   })
- */
-
-module.exports = asyncEmit
-function asyncEmit (emitter, eventName, args, callback) {
-
-  if (typeof args == 'function') {
-    callback = args
-    args = []
-  }
-
-  var async = emitter.listeners(eventName).filter(function (func) {
-    return func.length > args.length
-  }).length
-
-  var argv = [ eventName ].concat(args)
-
-  // callback function
-  argv.push(function (err) {
-    if (err && !callback.called) {
-      callback.called = true
-      callback(err)
-    }
-    --async || callback()
-  })
-
-  // no async listeners
-  if (async === 0) {
-    process.nextTick(callback)
-  }
-
-  return emitter.emit.apply(emitter, argv)
-}
diff --git a/deps/npm/node_modules/node-gyp/lib/util/hook.js b/deps/npm/node_modules/node-gyp/lib/util/hook.js
deleted file mode 100644 (file)
index d31cc2e..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-
-/**
- * This is our "Hook" class that allows a script to hook into the lifecyle of the
- * "configure", "build" and "clean" commands. It's basically a hack into the
- * module.js file to allow custom hooks into the module-space, specifically to
- * make the global scope act as an EventEmitter.
- */
-
-var fs = require('fs')
-  , path = require('path')
-  , Module = require('module')
-  , EventEmitter = require('events').EventEmitter
-  , functions = Object.keys(EventEmitter.prototype).filter(function (k) {
-      return typeof EventEmitter.prototype[k] == 'function'
-    })
-  , boilerplate = functions.map(function (k) {
-      return 'var ' + k + ' = module.emitter.' + k + '.bind(module.emitter);'
-    }).join('')
-
-module.exports = createHook
-function createHook (filename, callback) {
-
-  var emitter = new EventEmitter
-
-  // first read the file contents
-  fs.readFile(filename, 'utf8', function (err, code) {
-    if (err) {
-      if (err.code == 'ENOENT') {
-        // hook file doesn't exist, oh well
-        callback(null, emitter)
-      } else {
-        callback(err)
-      }
-      return
-    }
-    // got a hook file, now execute it
-    var mod = new Module(filename)
-    mod.filename = filename
-    mod.paths = Module._nodeModulePaths(filename)
-    mod.emitter = emitter
-    try {
-      mod._compile(boilerplate + code, filename)
-    } catch (e) {
-      return callback(e)
-    }
-    callback(null, emitter)
-  })
-}
index 259382f..9352a0b 100644 (file)
@@ -41,8 +41,8 @@
   "dependencies": {},
   "optionalDependencies": {},
   "_engineSupported": true,
-  "_npmVersion": "1.1.13",
-  "_nodeVersion": "v0.7.7-pre",
+  "_npmVersion": "1.1.16",
+  "_nodeVersion": "v0.7.8-pre",
   "_defaultsLoaded": true,
   "_from": "ansi@0.0.x"
 }
index 952ea1b..83e88f6 100644 (file)
@@ -36,8 +36,8 @@
   "_id": "glob@3.1.9",
   "optionalDependencies": {},
   "_engineSupported": true,
-  "_npmVersion": "1.1.13",
-  "_nodeVersion": "v0.7.7-pre",
+  "_npmVersion": "1.1.16",
+  "_nodeVersion": "v0.7.8-pre",
   "_defaultsLoaded": true,
   "_from": "glob@3"
 }
index 3dc0457..1962859 100644 (file)
@@ -10,8 +10,8 @@
     "bindings",
     "gyp"
   ],
-  "version": "0.3.9",
-  "installVersion": 5,
+  "version": "0.4.1",
+  "installVersion": 7,
   "author": {
     "name": "Nathan Rajlich",
     "email": "nathan@tootallnate.net",
     "name": "isaacs",
     "email": "i@izs.me"
   },
-  "_id": "node-gyp@0.3.9",
+  "_id": "node-gyp@0.4.1",
   "devDependencies": {},
   "optionalDependencies": {},
   "_engineSupported": true,
-  "_npmVersion": "1.1.13",
-  "_nodeVersion": "v0.7.7-pre",
+  "_npmVersion": "1.1.16",
+  "_nodeVersion": "v0.7.8-pre",
   "_defaultsLoaded": true,
   "dist": {
-    "shasum": "78c01d4b662c55607e7220b8c8e2a1f25390474a"
+    "shasum": "05a017b115527b63fdec1321d0b5888bc5d7b04f"
   },
-  "_from": "node-gyp@~0.3.7"
+  "_from": "node-gyp@latest"
 }
index 68a4942..f82bd03 100644 (file)
@@ -10,7 +10,7 @@
     "install",
     "package.json"
   ],
-  "version": "1.1.16",
+  "version": "1.1.19",
   "preferGlobal": true,
   "config": {
     "publishtest": false
@@ -53,8 +53,8 @@
     "mkdirp": "0.3",
     "read": "0",
     "lru-cache": "1",
-    "node-gyp": "~0.3.7",
-    "fstream-npm": "0 >=0.0.4",
+    "node-gyp": "~0.4.1",
+    "fstream-npm": "0 >=0.0.5",
     "uid-number": "0",
     "archy": "0",
     "chownr": "0"
@@ -77,7 +77,6 @@
     "block-stream",
     "inherits",
     "mkdirp",
-    "fast-list",
     "read",
     "lru-cache",
     "node-gyp",