npm: upgrade to 1.4.3
authorisaacs <i@izs.me>
Mon, 17 Feb 2014 04:43:16 +0000 (20:43 -0800)
committerTimothy J Fontaine <tjfontaine@gmail.com>
Tue, 18 Feb 2014 03:37:33 +0000 (19:37 -0800)
175 files changed:
deps/npm/AUTHORS
deps/npm/CONTRIBUTING.md
deps/npm/README.md
deps/npm/doc/misc/npm-disputes.md
deps/npm/doc/misc/npm-faq.md
deps/npm/html/doc/README.html
deps/npm/html/doc/api/npm-bin.html
deps/npm/html/doc/api/npm-bugs.html
deps/npm/html/doc/api/npm-commands.html
deps/npm/html/doc/api/npm-config.html
deps/npm/html/doc/api/npm-deprecate.html
deps/npm/html/doc/api/npm-docs.html
deps/npm/html/doc/api/npm-edit.html
deps/npm/html/doc/api/npm-explore.html
deps/npm/html/doc/api/npm-help-search.html
deps/npm/html/doc/api/npm-init.html
deps/npm/html/doc/api/npm-install.html
deps/npm/html/doc/api/npm-link.html
deps/npm/html/doc/api/npm-load.html
deps/npm/html/doc/api/npm-ls.html
deps/npm/html/doc/api/npm-outdated.html
deps/npm/html/doc/api/npm-owner.html
deps/npm/html/doc/api/npm-pack.html
deps/npm/html/doc/api/npm-prefix.html
deps/npm/html/doc/api/npm-prune.html
deps/npm/html/doc/api/npm-publish.html
deps/npm/html/doc/api/npm-rebuild.html
deps/npm/html/doc/api/npm-repo.html
deps/npm/html/doc/api/npm-restart.html
deps/npm/html/doc/api/npm-root.html
deps/npm/html/doc/api/npm-run-script.html
deps/npm/html/doc/api/npm-search.html
deps/npm/html/doc/api/npm-shrinkwrap.html
deps/npm/html/doc/api/npm-start.html
deps/npm/html/doc/api/npm-stop.html
deps/npm/html/doc/api/npm-submodule.html
deps/npm/html/doc/api/npm-tag.html
deps/npm/html/doc/api/npm-test.html
deps/npm/html/doc/api/npm-uninstall.html
deps/npm/html/doc/api/npm-unpublish.html
deps/npm/html/doc/api/npm-update.html
deps/npm/html/doc/api/npm-version.html
deps/npm/html/doc/api/npm-view.html
deps/npm/html/doc/api/npm-whoami.html
deps/npm/html/doc/api/npm.html
deps/npm/html/doc/cli/npm-adduser.html
deps/npm/html/doc/cli/npm-bin.html
deps/npm/html/doc/cli/npm-bugs.html
deps/npm/html/doc/cli/npm-build.html
deps/npm/html/doc/cli/npm-bundle.html
deps/npm/html/doc/cli/npm-cache.html
deps/npm/html/doc/cli/npm-completion.html
deps/npm/html/doc/cli/npm-config.html
deps/npm/html/doc/cli/npm-dedupe.html
deps/npm/html/doc/cli/npm-deprecate.html
deps/npm/html/doc/cli/npm-docs.html
deps/npm/html/doc/cli/npm-edit.html
deps/npm/html/doc/cli/npm-explore.html
deps/npm/html/doc/cli/npm-help-search.html
deps/npm/html/doc/cli/npm-help.html
deps/npm/html/doc/cli/npm-init.html
deps/npm/html/doc/cli/npm-install.html
deps/npm/html/doc/cli/npm-link.html
deps/npm/html/doc/cli/npm-ls.html
deps/npm/html/doc/cli/npm-outdated.html
deps/npm/html/doc/cli/npm-owner.html
deps/npm/html/doc/cli/npm-pack.html
deps/npm/html/doc/cli/npm-prefix.html
deps/npm/html/doc/cli/npm-prune.html
deps/npm/html/doc/cli/npm-publish.html
deps/npm/html/doc/cli/npm-rebuild.html
deps/npm/html/doc/cli/npm-repo.html
deps/npm/html/doc/cli/npm-restart.html
deps/npm/html/doc/cli/npm-rm.html
deps/npm/html/doc/cli/npm-root.html
deps/npm/html/doc/cli/npm-run-script.html
deps/npm/html/doc/cli/npm-search.html
deps/npm/html/doc/cli/npm-shrinkwrap.html
deps/npm/html/doc/cli/npm-star.html
deps/npm/html/doc/cli/npm-stars.html
deps/npm/html/doc/cli/npm-start.html
deps/npm/html/doc/cli/npm-stop.html
deps/npm/html/doc/cli/npm-submodule.html
deps/npm/html/doc/cli/npm-tag.html
deps/npm/html/doc/cli/npm-test.html
deps/npm/html/doc/cli/npm-uninstall.html
deps/npm/html/doc/cli/npm-unpublish.html
deps/npm/html/doc/cli/npm-update.html
deps/npm/html/doc/cli/npm-version.html
deps/npm/html/doc/cli/npm-view.html
deps/npm/html/doc/cli/npm-whoami.html
deps/npm/html/doc/cli/npm.html
deps/npm/html/doc/files/npm-folders.html
deps/npm/html/doc/files/npm-global.html
deps/npm/html/doc/files/npm-json.html
deps/npm/html/doc/files/npmrc.html
deps/npm/html/doc/files/package.json.html
deps/npm/html/doc/index.html
deps/npm/html/doc/misc/npm-coding-style.html
deps/npm/html/doc/misc/npm-config.html
deps/npm/html/doc/misc/npm-developers.html
deps/npm/html/doc/misc/npm-disputes.html
deps/npm/html/doc/misc/npm-faq.html
deps/npm/html/doc/misc/npm-index.html
deps/npm/html/doc/misc/npm-registry.html
deps/npm/html/doc/misc/npm-scripts.html
deps/npm/html/doc/misc/removing-npm.html
deps/npm/html/doc/misc/semver.html
deps/npm/lib/cache.js
deps/npm/lib/dedupe.js
deps/npm/lib/install.js
deps/npm/lib/link.js
deps/npm/lib/ls.js
deps/npm/lib/npm.js
deps/npm/lib/outdated.js
deps/npm/lib/prune.js
deps/npm/lib/rebuild.js
deps/npm/lib/shrinkwrap.js
deps/npm/lib/unbuild.js
deps/npm/lib/utils/completion/installed-deep.js
deps/npm/lib/utils/gently-rm.js
deps/npm/lib/utils/tar.js
deps/npm/lib/view.js
deps/npm/man/man1/npm-README.1
deps/npm/man/man1/npm-ls.1
deps/npm/man/man1/npm.1
deps/npm/man/man3/npm.3
deps/npm/man/man7/npm-disputes.7
deps/npm/man/man7/npm-faq.7
deps/npm/node_modules/glob/package.json
deps/npm/node_modules/graceful-fs/graceful-fs.js
deps/npm/node_modules/graceful-fs/package.json
deps/npm/node_modules/graceful-fs/test/readdir-sort.js [new file with mode: 0644]
deps/npm/node_modules/nopt/README.md
deps/npm/node_modules/nopt/lib/nopt.js
deps/npm/node_modules/nopt/package.json
deps/npm/node_modules/nopt/test/basic.js [new file with mode: 0644]
deps/npm/node_modules/npm-registry-client/lib/adduser.js
deps/npm/node_modules/npm-registry-client/lib/deprecate.js
deps/npm/node_modules/npm-registry-client/lib/get.js
deps/npm/node_modules/npm-registry-client/lib/publish.js
deps/npm/node_modules/npm-registry-client/lib/star.js
deps/npm/node_modules/npm-registry-client/lib/unpublish.js
deps/npm/node_modules/npm-registry-client/package.json
deps/npm/node_modules/npm-registry-client/test/adduser-update.js
deps/npm/node_modules/npm-registry-client/test/publish-again.js
deps/npm/node_modules/read-installed/README.md
deps/npm/node_modules/read-installed/package.json
deps/npm/node_modules/read-installed/read-installed.js
deps/npm/node_modules/read-installed/test/basic.js
deps/npm/node_modules/read-installed/test/dev.js [new file with mode: 0644]
deps/npm/node_modules/read-installed/test/fixtures/peer-at-latest/node_modules/strong-task-emitter/package.json [new file with mode: 0644]
deps/npm/node_modules/read-installed/test/noargs.js [new file with mode: 0644]
deps/npm/node_modules/read-installed/test/peer-dep-at-latest.js [new file with mode: 0644]
deps/npm/package.json
deps/npm/scripts/install.sh
deps/npm/test/tap/dedupe.js
deps/npm/test/tap/dedupe/package.json
deps/npm/test/tap/git-cache-locking.js [new file with mode: 0644]
deps/npm/test/tap/install-at-locally.js [new file with mode: 0644]
deps/npm/test/tap/install-at-locally/package@1.2.3/package.json [new file with mode: 0644]
deps/npm/test/tap/npm-api-not-loaded-error.js [new file with mode: 0644]
deps/npm/test/tap/outdated-color.js [new file with mode: 0644]
deps/npm/test/tap/outdated-git.js
deps/npm/test/tap/outdated-git/package.json
deps/npm/test/tap/outdated.js
deps/npm/test/tap/prune.js [new file with mode: 0644]
deps/npm/test/tap/prune/package.json [new file with mode: 0644]
deps/npm/test/tap/repo.js [new file with mode: 0644]
deps/npm/test/tap/shrinkwrap-dev-dependency.js [new file with mode: 0644]
deps/npm/test/tap/shrinkwrap-dev-dependency/desired-shrinkwrap-results.json [new file with mode: 0644]
deps/npm/test/tap/shrinkwrap-dev-dependency/package.json [new file with mode: 0644]
deps/npm/test/tap/shrinkwrap-shared-dev-dependency.js [new file with mode: 0644]
deps/npm/test/tap/shrinkwrap-shared-dev-dependency/desired-shrinkwrap-results.json [new file with mode: 0644]
deps/npm/test/tap/shrinkwrap-shared-dev-dependency/package.json [new file with mode: 0644]

index 890b29f..3c0c0b0 100644 (file)
@@ -115,3 +115,44 @@ Vaz Allen <vaz@tryptid.com>
 elisee <elisee@sparklin.org>
 Evan You <yyx990803@gmail.com>
 Wil Moore III <wil.moore@wilmoore.com>
+Dylan Greene <dylang@gmail.com>
+zeke <zeke@sikelianos.com>
+Andrew Horton <andrew.j.horton@gmail.com>
+Denis Gladkikh <outcoldman@gmail.com>
+Daniel Santiago <daniel.santiago@highlevelwebs.com>
+Alex Kocharin <alex@kocharin.ru>
+Evan Lucas <evanlucas@me.com>
+Steve Mason <stevem@brandwatch.com>
+Quinn Slack <qslack@qslack.com>
+Sébastien Santoro <dereckson@espace-win.org>
+CamilleM <camille.moulin@alterway.fr>
+Tom Huang <hzlhu.dargon@gmail.com>
+Sergey Belov <peimei@ya.ru>
+Younghoon Park <sola92@gmail.com>
+Yazhong Liu <yorkiefixer@gmail.com>
+Mikola Lysenko <mikolalysenko@gmail.com>
+Rafael de Oleza <rafa@spotify.com>
+Yeonghoon Park <sola92@gmail.com>
+Franck Cuny <franck.cuny@gmail.com>
+Alan Shaw <alan@freestyle-developments.co.uk>
+Alex Rodionov <p0deje@gmail.com>
+Alexej Yaroshevich <alex@qfox.ru>
+Elan Shanker <elan.shanker@gmail.com>
+François Frisch <francoisfrisch@gmail.com>
+Gabriel Falkenberg <gabriel.falkenberg@gmail.com>
+Jason Diamond <jason@diamond.name>
+Jess Martin <jessmartin@gmail.com>
+Jon Spencer <jon@jonspencer.ca>
+Matt Colyer <matt@colyer.name>
+Matt McClure <matt.mcclure@mapmyfitness.com>
+Maximilian Antoni <maximilian.antoni@juliusbaer.com>
+Nicholas Kinsey <pyro@feisty.io>
+Paulo Cesar <pauloc062@gmail.com>
+Quim Calpe <quim@kalpe.com>
+Robert Gieseke <robert.gieseke@gmail.com>
+Spain Train <michael.spainhower@opower.com>
+TJ Holowaychuk <tj@vision-media.ca>
+Thom Blake <tblake@brightroll.com>
+Trevor Burnham <tburnham@hubspot.com>
+bitspill <bitspill+github@bitspill.net>
+Neil Gentleman <ngentleman@gmail.com>
index 7a60ed2..0a5b53a 100644 (file)
@@ -1,5 +1,9 @@
 ## Before you submit a new issue
 
-* Check if there's a simple solution in the [Troubleshooting](https://github.com/npm/npm/wiki/Troubleshooting) wiki.
-* [Search for similar issues](https://github.com/npm/npm/search?q=Similar%20issues&type=Issues).
-* Ensure your new issue conforms to the [Contributing Guidelines](https://github.com/npm/npm/wiki/Contributing-Guidelines).
+* Check if there's a simple solution in the
+  [Troubleshooting](https://github.com/npm/npm/wiki/Troubleshooting)
+  wiki.
+* [Search for similar
+  issues](https://github.com/npm/npm/search?q=Similar%20issues&type=Issues).
+* Ensure your new issue conforms to the [Contributing
+  Guidelines](https://github.com/npm/npm/wiki/Contributing-Guidelines).
index e2f0f79..ceea97e 100644 (file)
@@ -169,51 +169,54 @@ help config` to learn about all the options you can set there.
 
 ## More Docs
 
-Check out the [docs](https://npmjs.org/doc/),
-especially the [faq](https://npmjs.org/doc/faq.html).
+Check out the [docs](https://www.npmjs.org/doc/),
+especially the [faq](https://www.npmjs.org/doc/faq.html).
 
 You can use the `npm help` command to read any of them.
 
 If you're a developer, and you want to use npm to publish your program,
-you should [read this](https://npmjs.org/doc/developers.html)
+you should [read this](https://www.npmjs.org/doc/developers.html)
 
 ## Legal Stuff
 
-"npm" and "the npm registry" are owned by Isaac Z. Schlueter.
+"npm" and "The npm Registry" are owned by npm, Inc.
 All rights reserved.  See the included LICENSE file for more details.
 
-"Node.js" and "node" are trademarks owned by Joyent, Inc.  npm is not
-officially part of the Node.js project, and is neither owned by nor
-officially affiliated with Joyent, Inc.
+"Node.js" and "node" are trademarks owned by Joyent, Inc.
 
-The packages in the npm registry are not part of npm itself, and are the
-sole property of their respective maintainers.  While every effort is
-made to ensure accountability, there is absolutely no guarantee,
-warrantee, or assertion made as to the quality, fitness for a specific
-purpose, or lack of malice in any given npm package.  Modules
-published on the npm registry are not affiliated with or endorsed by
-Joyent, Inc., Isaac Z. Schlueter, Ryan Dahl, or the Node.js project.
+Modules published on the npm registry are not officially endorsed by
+npm, Inc. or the Node.js project.
 
-If you have a complaint about a package in the npm registry, and cannot
-resolve it with the package owner, please express your concerns to
-Isaac Z. Schlueter at <i@izs.me>.
+Data published to the npm registry is not part of npm itself, and is
+the sole property of the publisher.  While every effort is made to
+ensure accountability, there is absolutely no guarantee, warrantee, or
+assertion expressed or implied as to the quality, fitness for a
+specific purpose, or lack of malice in any given npm package.
 
-### In plain english
+If you have a complaint about a package in the public npm registry,
+and cannot [resolve it with the package
+owner](https://www.npmjs.org/doc/misc/npm-disputes.html), please email
+<support@npmjs.com> and explain the situation.
 
-This is mine; not my employer's, not Node's, not Joyent's, not Ryan
-Dahl's.
+Any data published to The npm Registry (including user account
+information) may be removed or modified at the sole discretion of the
+npm server administrators.
+
+### In plainer english
+
+npm is the property of npm, Inc.
 
 If you publish something, it's yours, and you are solely accountable
-for it.  Not me, not Node, not Joyent, not Ryan Dahl.
+for it.
 
-If other people publish something, it's theirs.  Not mine, not Node's,
-not Joyent's, not Ryan Dahl's.
+If other people publish something, it's theirs.
 
-Yes, you can publish something evil.  It will be removed promptly if
-reported, and we'll lose respect for you.  But there is no vetting
-process for published modules.
+Users can publish Bad Stuff.  It will be removed promptly if reported.
+But there is no vetting process for published modules, and you use
+them at your own risk.  Please inspect the source.
 
-If this concerns you, inspect the source before using packages.
+If you publish Bad Stuff, we may delete it from the registry, or even
+ban your account in extreme cases.  So don't do that.
 
 ## BUGS
 
index 6e9f4bf..9fb1eaa 100644 (file)
@@ -4,7 +4,7 @@ npm-disputes(7) -- Handling Module Name Disputes
 ## SYNOPSIS
 
 1. Get the author email with `npm owner ls <pkgname>`
-2. Email the author, CC <i@izs.me>.
+2. Email the author, CC <support@npmjs.com>
 3. After a few weeks, if there's no resolution, we'll sort it out.
 
 Don't squat on package names.  Publish code or move out of the way.
@@ -42,15 +42,16 @@ Joe's appropriate course of action in each case is the same.
 
 1. `npm owner ls foo`.  This will tell Joe the email address of the
    owner (Bob).
-2. Joe emails Bob, explaining the situation **as respectfully as possible**,
-   and what he would like to do with the module name.  He adds
-   isaacs <i@izs.me> to the CC list of the email.  Mention in the email
-   that Bob can run `npm owner add joe foo` to add Joe as an owner of
-   the `foo` package.
+2. Joe emails Bob, explaining the situation **as respectfully as
+   possible**, and what he would like to do with the module name.  He
+   adds the npm support staff <support@npmjs.com> to the CC list of
+   the email.  Mention in the email that Bob can run `npm owner add
+   joe foo` to add Joe as an owner of the `foo` package.
 3. After a reasonable amount of time, if Bob has not responded, or if
-   Bob and Joe can't come to any sort of resolution, email isaacs
-   <i@izs.me> and we'll sort it out.  ("Reasonable" is usually about 4
-   weeks, but extra time is allowed around common holidays.)
+   Bob and Joe can't come to any sort of resolution, email support
+   <support@npmjs.com> and we'll sort it out.  ("Reasonable" is
+   usually at least 4 weeks, but extra time is allowed around common
+   holidays.)
 
 ## REASONING
 
index c228838..80e3d1a 100644 (file)
@@ -3,7 +3,7 @@ npm-faq(7) -- Frequently Asked Questions
 
 ## Where can I find these docs in HTML?
 
-<https://npmjs.org/doc/>, or run:
+<https://www.npmjs.org/doc/>, or run:
 
     npm config set viewer browser
 
@@ -68,7 +68,8 @@ program that uses it.
 
 ## Whatever, I really want the old style 'everything global' style.
 
-Write your own package manager, then.  It's not that hard.
+Write your own package manager.  You could probably even wrap up `npm`
+in a shell script if you really wanted to.
 
 npm will not help you do something that is known to be a bad idea.
 
@@ -310,13 +311,17 @@ Go to <https://npmjs.org/forgot>.
 
 Either the registry is down, or node's DNS isn't able to reach out.
 
-To check if the registry is down, open up <http://registry.npmjs.org/>
-in a web browser.  This will also tell you if you are just unable to
-access the internet for some reason.
+To check if the registry is down, open up
+<https://registry.npmjs.org/> in a web browser.  This will also tell
+you if you are just unable to access the internet for some reason.
 
-If the registry IS down, let me know by emailing <i@izs.me> or posting
-an issue at <https://github.com/npm/npm/issues>.  We'll have
-someone kick it or something.
+If the registry IS down, let us know by emailing <support@npmjs.com>
+or posting an issue at <https://github.com/npm/npm/issues>.  If it's
+down for the world (and not just on your local network) then we're
+probably already being pinged about it.
+
+You can also often get a faster response by visiting the #npm channel
+on Freenode IRC.
 
 ## Why no namespaces?
 
@@ -330,9 +335,12 @@ There is not sufficient need to impose namespace rules on everyone.
 
 ## Who does npm?
 
-`npm view npm author`
+npm was originally written by Isaac Z. Schlueter, and many others have
+contributed to it, some of them quite substantially.
 
-`npm view npm contributors`
+The npm open source project, The npm Registry, and [the community
+website](https://www.npmjs.org) are maintained and operated by the
+good folks at [npm, Inc.](https://www.npmjs.com)
 
 ## I have a question or request not addressed here. Where should I put it?
 
index d457ec9..747c1c2 100644 (file)
@@ -175,51 +175,54 @@ help config</code> to learn about all the options you can set there.</p>
 
 <h2 id="More-Docs">More Docs</h2>
 
-<p>Check out the <a href="https://npmjs.org/doc/">docs</a>,
-especially the <a href="https://npmjs.org/doc/faq.html">faq</a>.</p>
+<p>Check out the <a href="https://www.npmjs.org/doc/">docs</a>,
+especially the <a href="https://www.npmjs.org/doc/faq.html">faq</a>.</p>
 
 <p>You can use the <code>npm help</code> command to read any of them.</p>
 
 <p>If you&#39;re a developer, and you want to use npm to publish your program,
-you should <a href="https://npmjs.org/doc/developers.html">read this</a></p>
+you should <a href="https://www.npmjs.org/doc/developers.html">read this</a></p>
 
 <h2 id="Legal-Stuff">Legal Stuff</h2>
 
-<p>&quot;npm&quot; and &quot;the npm registry&quot; are owned by Isaac Z. Schlueter.
+<p>&quot;npm&quot; and &quot;The npm Registry&quot; are owned by npm, Inc.
 All rights reserved.  See the included LICENSE file for more details.</p>
 
-<p>&quot;Node.js&quot; and &quot;node&quot; are trademarks owned by Joyent, Inc.  npm is not
-officially part of the Node.js project, and is neither owned by nor
-officially affiliated with Joyent, Inc.</p>
+<p>&quot;Node.js&quot; and &quot;node&quot; are trademarks owned by Joyent, Inc.</p>
 
-<p>The packages in the npm registry are not part of npm itself, and are the
-sole property of their respective maintainers.  While every effort is
-made to ensure accountability, there is absolutely no guarantee,
-warrantee, or assertion made as to the quality, fitness for a specific
-purpose, or lack of malice in any given npm package.  Modules
-published on the npm registry are not affiliated with or endorsed by
-Joyent, Inc., Isaac Z. Schlueter, Ryan Dahl, or the Node.js project.</p>
+<p>Modules published on the npm registry are not officially endorsed by
+npm, Inc. or the Node.js project.</p>
 
-<p>If you have a complaint about a package in the npm registry, and cannot
-resolve it with the package owner, please express your concerns to
-Isaac Z. Schlueter at <a href="mailto:i@izs.me">i@izs.me</a>.</p>
+<p>Data published to the npm registry is not part of npm itself, and is
+the sole property of the publisher.  While every effort is made to
+ensure accountability, there is absolutely no guarantee, warrantee, or
+assertion expressed or implied as to the quality, fitness for a
+specific purpose, or lack of malice in any given npm package.</p>
 
-<h3 id="In-plain-english">In plain english</h3>
+<p>If you have a complaint about a package in the public npm registry,
+and cannot <a href="https://www.npmjs.org/doc/misc/npm-disputes.html">resolve it with the package
+owner</a>, please email
+<a href="mailto:support@npmjs.com">support@npmjs.com</a> and explain the situation.</p>
 
-<p>This is mine; not my employer&#39;s, not Node&#39;s, not Joyent&#39;s, not Ryan
-Dahl&#39;s.</p>
+<p>Any data published to The npm Registry (including user account
+information) may be removed or modified at the sole discretion of the
+npm server administrators.</p>
+
+<h3 id="In-plainer-english">In plainer english</h3>
+
+<p>npm is the property of npm, Inc.</p>
 
 <p>If you publish something, it&#39;s yours, and you are solely accountable
-for it.  Not me, not Node, not Joyent, not Ryan Dahl.</p>
+for it.</p>
 
-<p>If other people publish something, it&#39;s theirs.  Not mine, not Node&#39;s,
-not Joyent&#39;s, not Ryan Dahl&#39;s.</p>
+<p>If other people publish something, it&#39;s theirs.</p>
 
-<p>Yes, you can publish something evil.  It will be removed promptly if
-reported, and we&#39;ll lose respect for you.  But there is no vetting
-process for published modules.</p>
+<p>Users can publish Bad Stuff.  It will be removed promptly if reported.
+But there is no vetting process for published modules, and you use
+them at your own risk.  Please inspect the source.</p>
 
-<p>If this concerns you, inspect the source before using packages.</p>
+<p>If you publish Bad Stuff, we may delete it from the registry, or even
+ban your account in extreme cases.  So don&#39;t do that.</p>
 
 <h2 id="BUGS">BUGS</h2>
 
@@ -239,7 +242,7 @@ will no doubt tell you to put the output in a gist or email.</p>
 
 <ul><li><a href="cli/npm.html">npm(1)</a></li><li><a href="misc/npm-faq.html">npm-faq(7)</a></li><li><a href="cli/npm-help.html">npm-help(1)</a></li><li><a href="misc/npm-index.html">npm-index(7)</a></li></ul>
 </div>
-<p id="footer"><a href="../doc/README.html">README</a> &mdash; npm@1.4.0</p>
+<p id="footer"><a href="../doc/README.html">README</a> &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index eb1b17b..3279386 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">npm-bin &mdash; npm@1.4.0</p>
+<p id="footer">npm-bin &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 8ced308..bea19a3 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">npm-bugs &mdash; npm@1.4.0</p>
+<p id="footer">npm-bugs &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index dd90b46..32a4b5e 100644 (file)
@@ -28,7 +28,7 @@ usage, or <code>man 3 npm-&lt;command&gt;</code> for programmatic usage.</p>
 
 <ul><li><a href="../misc/npm-index.html">npm-index(7)</a></li></ul>
 </div>
-<p id="footer">npm-commands &mdash; npm@1.4.0</p>
+<p id="footer">npm-commands &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index e3768af..16d2777 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">npm-config &mdash; npm@1.4.0</p>
+<p id="footer">npm-config &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index da93046..304fb93 100644 (file)
@@ -32,7 +32,7 @@ install the package.</p></li></ul>
 
 <ul><li><a href="../api/npm-publish.html">npm-publish(3)</a></li><li><a href="../api/npm-unpublish.html">npm-unpublish(3)</a></li><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li></ul>
 </div>
-<p id="footer">npm-deprecate &mdash; npm@1.4.0</p>
+<p id="footer">npm-deprecate &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index bc9989c..7b79856 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">npm-docs &mdash; npm@1.4.0</p>
+<p id="footer">npm-docs &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 8712057..66bfcda 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">npm-edit &mdash; npm@1.4.0</p>
+<p id="footer">npm-edit &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 55eb138..bd79398 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 &#39;args&#39; 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">npm-explore &mdash; npm@1.4.0</p>
+<p id="footer">npm-explore &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 09e3df5..c50c773 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">npm-help-search &mdash; npm@1.4.0</p>
+<p id="footer">npm-help-search &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index f42122f..1e91dfc 100644 (file)
@@ -35,7 +35,7 @@ then go ahead and use this programmatically.</p>
 
 <p><a href="../files/package.json.html">package.json(5)</a></p>
 </div>
-<p id="footer">npm-init &mdash; npm@1.4.0</p>
+<p id="footer">npm-init &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 9028bad..b407715 100644 (file)
@@ -25,7 +25,7 @@ the name of a package to be installed.</p>
 <p>Finally, &#39;callback&#39; 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">npm-install &mdash; npm@1.4.0</p>
+<p id="footer">npm-install &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index ef77b19..072f3de 100644 (file)
@@ -39,7 +39,7 @@ npm.commands.link(&#39;redis&#39;, 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">npm-link &mdash; npm@1.4.0</p>
+<p id="footer">npm-link &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 7685f00..af8ec7d 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">npm-load &mdash; npm@1.4.0</p>
+<p id="footer">npm-load &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 14df981..7a477f9 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">npm-ls &mdash; npm@1.4.0</p>
+<p id="footer">npm-ls &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 16b3e69..2677809 100644 (file)
@@ -19,7 +19,7 @@ currently outdated.</p>
 
 <p>If the &#39;packages&#39; parameter is left out, npm will check all packages.</p>
 </div>
-<p id="footer">npm-outdated &mdash; npm@1.4.0</p>
+<p id="footer">npm-outdated &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 9357f6d..d7b1e50 100644 (file)
@@ -34,7 +34,7 @@ that is not implemented at this time.</p>
 
 <ul><li><a href="../api/npm-publish.html">npm-publish(3)</a></li><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li></ul>
 </div>
-<p id="footer">npm-owner &mdash; npm@1.4.0</p>
+<p id="footer">npm-owner &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 70cd37e..258f559 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">npm-pack &mdash; npm@1.4.0</p>
+<p id="footer">npm-pack &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 3a9028d..fff7960 100644 (file)
@@ -21,7 +21,7 @@
 
 <p>This function is not useful programmatically</p>
 </div>
-<p id="footer">npm-prefix &mdash; npm@1.4.0</p>
+<p id="footer">npm-prefix &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index e74d96e..a315d38 100644 (file)
@@ -23,7 +23,7 @@
 <p>Extraneous packages are packages that are not listed on the parent
 package&#39;s dependencies list.</p>
 </div>
-<p id="footer">npm-prune &mdash; npm@1.4.0</p>
+<p id="footer">npm-prune &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 96635af..5dc8996 100644 (file)
@@ -32,7 +32,7 @@ the registry.  Overwrites when the &quot;force&quot; environment variable is set
 
 <ul><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li><li><a href="../cli/npm-adduser.html">npm-adduser(1)</a></li><li><a href="../api/npm-owner.html">npm-owner(3)</a></li></ul>
 </div>
-<p id="footer">npm-publish &mdash; npm@1.4.0</p>
+<p id="footer">npm-publish &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 3239084..82eaa18 100644 (file)
@@ -22,7 +22,7 @@ the new binary. If no &#39;packages&#39; parameter is specify, every package wil
 
 <p>See <code>npm help build</code></p>
 </div>
-<p id="footer">npm-rebuild &mdash; npm@1.4.0</p>
+<p id="footer">npm-rebuild &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 8287142..38fdef8 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">npm-repo &mdash; npm@1.4.0</p>
+<p id="footer">npm-repo &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index ff909ad..24c172e 100644 (file)
@@ -27,7 +27,7 @@ in the <code>packages</code> parameter.</p>
 
 <ul><li><a href="../api/npm-start.html">npm-start(3)</a></li><li><a href="../api/npm-stop.html">npm-stop(3)</a></li></ul>
 </div>
-<p id="footer">npm-restart &mdash; npm@1.4.0</p>
+<p id="footer">npm-restart &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 44aac68..dcdda1c 100644 (file)
@@ -21,7 +21,7 @@
 
 <p>This function is not useful programmatically.</p>
 </div>
-<p id="footer">npm-root &mdash; npm@1.4.0</p>
+<p id="footer">npm-root &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 2f58aa2..03a17fd 100644 (file)
@@ -29,7 +29,7 @@ assumed to be the command to run. All other elements are ignored.</p>
 
 <ul><li><a href="../misc/npm-scripts.html">npm-scripts(7)</a></li><li><a href="../api/npm-test.html">npm-test(3)</a></li><li><a href="../api/npm-start.html">npm-start(3)</a></li><li><a href="../api/npm-restart.html">npm-restart(3)</a></li><li><a href="../api/npm-stop.html">npm-stop(3)</a></li></ul>
 </div>
-<p id="footer">npm-run-script &mdash; npm@1.4.0</p>
+<p id="footer">npm-run-script &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 5415b5f..cc7fc54 100644 (file)
@@ -32,7 +32,7 @@ excluded term (the &quot;searchexclude&quot; config). The search is case insensi
 and doesn&#39;t try to read your mind (it doesn&#39;t do any verb tense matching or the
 like).</p>
 </div>
-<p id="footer">npm-search &mdash; npm@1.4.0</p>
+<p id="footer">npm-search &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index d007ade..0499539 100644 (file)
@@ -26,7 +26,7 @@ but the shrinkwrap file will still be written.</p>
 <p>Finally, &#39;callback&#39; is a function that will be called when the shrinkwrap has
 been saved.</p>
 </div>
-<p id="footer">npm-shrinkwrap &mdash; npm@1.4.0</p>
+<p id="footer">npm-shrinkwrap &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 626cbfa..9a883d0 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">npm-start &mdash; npm@1.4.0</p>
+<p id="footer">npm-start &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 0bf5d3f..7db64de 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">npm-stop &mdash; npm@1.4.0</p>
+<p id="footer">npm-stop &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 6665c1c..86c1d88 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">npm-submodule &mdash; npm@1.4.0</p>
+<p id="footer">npm-submodule &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index d2d0d04..6e1367a 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">npm-tag &mdash; npm@1.4.0</p>
+<p id="footer">npm-tag &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index a22a071..a8eb416 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">npm-test &mdash; npm@1.4.0</p>
+<p id="footer">npm-test &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index b309dd6..d17313f 100644 (file)
@@ -22,7 +22,7 @@ the name of a package to be uninstalled.</p>
 <p>Finally, &#39;callback&#39; 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">npm-uninstall &mdash; npm@1.4.0</p>
+<p id="footer">npm-uninstall &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 1bb31b6..09bfd7c 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">npm-unpublish &mdash; npm@1.4.0</p>
+<p id="footer">npm-unpublish &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 1769afc..8494181 100644 (file)
@@ -18,7 +18,7 @@
 
 <p>The &#39;packages&#39; argument is an array of packages to update. The &#39;callback&#39; parameter will be called when done or when an error occurs.</p>
 </div>
-<p id="footer">npm-update &mdash; npm@1.4.0</p>
+<p id="footer">npm-update &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 183f78a..a5132c5 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">npm-version &mdash; npm@1.4.0</p>
+<p id="footer">npm-version &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 5cbb298..22db08e 100644 (file)
@@ -99,7 +99,7 @@ the field name.</p>
 
 <p>corresponding to the list of fields selected.</p>
 </div>
-<p id="footer">npm-view &mdash; npm@1.4.0</p>
+<p id="footer">npm-view &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 6622361..4aebabe 100644 (file)
@@ -21,7 +21,7 @@
 
 <p>This function is not useful programmatically</p>
 </div>
-<p id="footer">npm-whoami &mdash; npm@1.4.0</p>
+<p id="footer">npm-whoami &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 400a037..2f1d64e 100644 (file)
@@ -24,7 +24,7 @@ npm.load([configObject], function (er, npm) {
 
 <h2 id="VERSION">VERSION</h2>
 
-<p>1.4.0</p>
+<p>1.4.3</p>
 
 <h2 id="DESCRIPTION">DESCRIPTION</h2>
 
@@ -92,7 +92,7 @@ method names.  Use the <code>npm.deref</code> method to find the real name.</p>
 
 <pre><code>var cmd = npm.deref(&quot;unp&quot;) // cmd === &quot;unpublish&quot;</code></pre>
 </div>
-<p id="footer">npm &mdash; npm@1.4.0</p>
+<p id="footer">npm &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 09af391..8c6eee1 100644 (file)
@@ -39,7 +39,7 @@ authorize on a new machine.</p>
 
 <ul><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li><li><a href="../cli/npm-owner.html">npm-owner(1)</a></li><li><a href="../cli/npm-whoami.html">npm-whoami(1)</a></li></ul>
 </div>
-<p id="footer">npm-adduser &mdash; npm@1.4.0</p>
+<p id="footer">npm-adduser &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index d3d5bc3..dfc8fcd 100644 (file)
@@ -20,7 +20,7 @@
 
 <ul><li><a href="../cli/npm-prefix.html">npm-prefix(1)</a></li><li><a href="../cli/npm-root.html">npm-root(1)</a></li><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li></ul>
 </div>
-<p id="footer">npm-bin &mdash; npm@1.4.0</p>
+<p id="footer">npm-bin &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 2b881c2..fb263ee 100644 (file)
@@ -38,7 +38,7 @@ a <code>package.json</code> in the current folder and use the <code>name</code>
 
 <ul><li><a href="../cli/npm-docs.html">npm-docs(1)</a></li><li><a href="../cli/npm-view.html">npm-view(1)</a></li><li><a href="../cli/npm-publish.html">npm-publish(1)</a></li><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li><li><a href="../files/package.json.html">package.json(5)</a></li></ul>
 </div>
-<p id="footer">npm-bugs &mdash; npm@1.4.0</p>
+<p id="footer">npm-bugs &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 9bf37e2..b26cf27 100644 (file)
@@ -25,7 +25,7 @@ A folder containing a <code>package.json</code> file in its root.</li></ul>
 
 <ul><li><a href="../cli/npm-install.html">npm-install(1)</a></li><li><a href="../cli/npm-link.html">npm-link(1)</a></li><li><a href="../misc/npm-scripts.html">npm-scripts(7)</a></li><li><a href="../files/package.json.html">package.json(5)</a></li></ul>
 </div>
-<p id="footer">npm-build &mdash; npm@1.4.0</p>
+<p id="footer">npm-build &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 2ba6db8..aeb3ccd 100644 (file)
@@ -20,7 +20,7 @@ install packages into the local space.</p>
 
 <ul><li><a href="../cli/npm-install.html">npm-install(1)</a></li></ul>
 </div>
-<p id="footer">npm-bundle &mdash; npm@1.4.0</p>
+<p id="footer">npm-bundle &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 86fe20e..b8b3501 100644 (file)
@@ -66,7 +66,7 @@ they do not make an HTTP request to the registry.</p>
 
 <ul><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li><li><a href="../cli/npm-install.html">npm-install(1)</a></li><li><a href="../cli/npm-publish.html">npm-publish(1)</a></li><li><a href="../cli/npm-pack.html">npm-pack(1)</a></li></ul>
 </div>
-<p id="footer">npm-cache &mdash; npm@1.4.0</p>
+<p id="footer">npm-cache &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index a10118c..8259029 100644 (file)
@@ -33,7 +33,7 @@ completions based on the arguments.</p>
 
 <ul><li><a href="../misc/npm-developers.html">npm-developers(7)</a></li><li><a href="../misc/npm-faq.html">npm-faq(7)</a></li><li><a href="../cli/npm.html">npm(1)</a></li></ul>
 </div>
-<p id="footer">npm-completion &mdash; npm@1.4.0</p>
+<p id="footer">npm-completion &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 525952e..a8fe05f 100644 (file)
@@ -73,7 +73,7 @@ global config.</p>
 
 <ul><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/package.json.html">package.json(5)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li><li><a href="../cli/npm.html">npm(1)</a></li></ul>
 </div>
-<p id="footer">npm-config &mdash; npm@1.4.0</p>
+<p id="footer">npm-config &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 3948618..cf8c50a 100644 (file)
@@ -62,7 +62,7 @@ versions.</p>
 
 <ul><li><a href="../cli/npm-ls.html">npm-ls(1)</a></li><li><a href="../cli/npm-update.html">npm-update(1)</a></li><li><a href="../cli/npm-install.html">npm-install(1)</a></li></ul>
 </div>
-<p id="footer">npm-dedupe &mdash; npm@1.4.0</p>
+<p id="footer">npm-dedupe &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index bdf5ae3..74b5beb 100644 (file)
@@ -31,7 +31,7 @@ something like this:</p>
 
 <ul><li><a href="../cli/npm-publish.html">npm-publish(1)</a></li><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li></ul>
 </div>
-<p id="footer">npm-deprecate &mdash; npm@1.4.0</p>
+<p id="footer">npm-deprecate &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 5215347..050e3bf 100644 (file)
@@ -41,7 +41,7 @@ the current folder and use the <code>name</code> property.</p>
 
 <ul><li><a href="../cli/npm-view.html">npm-view(1)</a></li><li><a href="../cli/npm-publish.html">npm-publish(1)</a></li><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li><li><a href="../files/package.json.html">package.json(5)</a></li></ul>
 </div>
-<p id="footer">npm-docs &mdash; npm@1.4.0</p>
+<p id="footer">npm-docs &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 4b5cacf..a66cfa0 100644 (file)
@@ -37,7 +37,7 @@ or <code>&quot;notepad&quot;</code> on Windows.</li><li>Type: path</li></ul>
 
 <ul><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm-explore.html">npm-explore(1)</a></li><li><a href="../cli/npm-install.html">npm-install(1)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li></ul>
 </div>
-<p id="footer">npm-edit &mdash; npm@1.4.0</p>
+<p id="footer">npm-edit &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 6147f64..5fb20d7 100644 (file)
@@ -40,7 +40,7 @@ Windows</li><li>Type: path</li></ul>
 
 <ul><li><a href="../cli/npm-submodule.html">npm-submodule(1)</a></li><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm-edit.html">npm-edit(1)</a></li><li><a href="../cli/npm-rebuild.html">npm-rebuild(1)</a></li><li><a href="../cli/npm-build.html">npm-build(1)</a></li><li><a href="../cli/npm-install.html">npm-install(1)</a></li></ul>
 </div>
-<p id="footer">npm-explore &mdash; npm@1.4.0</p>
+<p id="footer">npm-explore &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 484813c..1a0ef2f 100644 (file)
@@ -38,7 +38,7 @@ where the terms were found in the documentation.</p>
 
 <ul><li><a href="../cli/npm.html">npm(1)</a></li><li><a href="../misc/npm-faq.html">npm-faq(7)</a></li><li><a href="../cli/npm-help.html">npm-help(1)</a></li></ul>
 </div>
-<p id="footer">npm-help-search &mdash; npm@1.4.0</p>
+<p id="footer">npm-help-search &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 8075bca..8b33c1f 100644 (file)
@@ -36,7 +36,7 @@ matches are equivalent to specifying a topic name.</p>
 
 <ul><li><a href="../cli/npm.html">npm(1)</a></li><li><a href="../../doc/README.html">README</a></li><li><a href="../misc/npm-faq.html">npm-faq(7)</a></li><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li><li><a href="../files/package.json.html">package.json(5)</a></li><li><a href="../cli/npm-help-search.html">npm-help-search(1)</a></li><li><a href="../misc/npm-index.html">npm-index(7)</a></li></ul>
 </div>
-<p id="footer">npm-help &mdash; npm@1.4.0</p>
+<p id="footer">npm-help &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 221b9c8..a26ce70 100644 (file)
@@ -29,7 +29,7 @@ without a really good reason to do so.</p>
 
 <ul><li><a href="https://github.com/isaacs/init-package-json">https://github.com/isaacs/init-package-json</a></li><li><a href="../files/package.json.html">package.json(5)</a></li><li><a href="../cli/npm-version.html">npm-version(1)</a></li></ul>
 </div>
-<p id="footer">npm-init &mdash; npm@1.4.0</p>
+<p id="footer">npm-init &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index d31cd1f..a77f481 100644 (file)
@@ -149,7 +149,7 @@ affects a real use-case, it will be investigated.</p>
 
 <ul><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm-update.html">npm-update(1)</a></li><li><a href="../cli/npm-link.html">npm-link(1)</a></li><li><a href="../cli/npm-rebuild.html">npm-rebuild(1)</a></li><li><a href="../misc/npm-scripts.html">npm-scripts(7)</a></li><li><a href="../cli/npm-build.html">npm-build(1)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm-tag.html">npm-tag(1)</a></li><li><a href="../cli/npm-rm.html">npm-rm(1)</a></li><li><a href="../cli/npm-shrinkwrap.html">npm-shrinkwrap(1)</a></li></ul>
 </div>
-<p id="footer">npm-install &mdash; npm@1.4.0</p>
+<p id="footer">npm-install &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 0aed749..f1da1ce 100644 (file)
@@ -62,7 +62,7 @@ installation target into your project&#39;s <code>node_modules</code> folder.</p
 
 <ul><li><a href="../misc/npm-developers.html">npm-developers(7)</a></li><li><a href="../misc/npm-faq.html">npm-faq(7)</a></li><li><a href="../files/package.json.html">package.json(5)</a></li><li><a href="../cli/npm-install.html">npm-install(1)</a></li><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li></ul>
 </div>
-<p id="footer">npm-link &mdash; npm@1.4.0</p>
+<p id="footer">npm-link &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 969f3fb..eb94727 100644 (file)
@@ -25,7 +25,7 @@ limit the results to only the paths to the packages named.  Note that
 nested packages will <em>also</em> show the paths to the specified packages.
 For example, running <code>npm ls promzard</code> in npm&#39;s source tree will show:</p>
 
-<pre><code>npm@1.4.0 /path/to/npm
+<pre><code>npm@1.4.3 /path/to/npm
 â””─┬ init-package-json@0.0.4
   â””── promzard@0.1.5</code></pre>
 
@@ -74,7 +74,7 @@ project.</p>
 
 <ul><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm-install.html">npm-install(1)</a></li><li><a href="../cli/npm-link.html">npm-link(1)</a></li><li><a href="../cli/npm-prune.html">npm-prune(1)</a></li><li><a href="../cli/npm-outdated.html">npm-outdated(1)</a></li><li><a href="../cli/npm-update.html">npm-update(1)</a></li></ul>
 </div>
-<p id="footer">npm-ls &mdash; npm@1.4.0</p>
+<p id="footer">npm-ls &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 67947be..4e1fd2d 100644 (file)
@@ -58,7 +58,7 @@ project.</p>
 
 <ul><li><a href="../cli/npm-update.html">npm-update(1)</a></li><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li><li><a href="../files/npm-folders.html">npm-folders(5)</a></li></ul>
 </div>
-<p id="footer">npm-outdated &mdash; npm@1.4.0</p>
+<p id="footer">npm-outdated &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 674cd83..72cc1f1 100644 (file)
@@ -34,7 +34,7 @@ that is not implemented at this time.</p>
 
 <ul><li><a href="../cli/npm-publish.html">npm-publish(1)</a></li><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li><li><a href="../cli/npm-adduser.html">npm-adduser(1)</a></li><li><a href="../misc/npm-disputes.html">npm-disputes(7)</a></li></ul>
 </div>
-<p id="footer">npm-owner &mdash; npm@1.4.0</p>
+<p id="footer">npm-owner &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 1a971aa..4c36016 100644 (file)
@@ -29,7 +29,7 @@ overwritten the second time.</p>
 
 <ul><li><a href="../cli/npm-cache.html">npm-cache(1)</a></li><li><a href="../cli/npm-publish.html">npm-publish(1)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li></ul>
 </div>
-<p id="footer">npm-pack &mdash; npm@1.4.0</p>
+<p id="footer">npm-pack &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 7f3ce2c..dcfced6 100644 (file)
@@ -20,7 +20,7 @@
 
 <ul><li><a href="../cli/npm-root.html">npm-root(1)</a></li><li><a href="../cli/npm-bin.html">npm-bin(1)</a></li><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li></ul>
 </div>
-<p id="footer">npm-prefix &mdash; npm@1.4.0</p>
+<p id="footer">npm-prefix &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index a6b2a62..44301e3 100644 (file)
@@ -29,7 +29,7 @@ packages specified in your <code>devDependencies</code>.</p>
 
 <ul><li><a href="../cli/npm-rm.html">npm-rm(1)</a></li><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm-ls.html">npm-ls(1)</a></li></ul>
 </div>
-<p id="footer">npm-prune &mdash; npm@1.4.0</p>
+<p id="footer">npm-prune &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 19aaa98..1eac5f0 100644 (file)
@@ -29,7 +29,7 @@ the registry.  Overwrites when the &quot;--force&quot; flag is set.</p>
 
 <ul><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li><li><a href="../cli/npm-adduser.html">npm-adduser(1)</a></li><li><a href="../cli/npm-owner.html">npm-owner(1)</a></li><li><a href="../cli/npm-deprecate.html">npm-deprecate(1)</a></li><li><a href="../cli/npm-tag.html">npm-tag(1)</a></li></ul>
 </div>
-<p id="footer">npm-publish &mdash; npm@1.4.0</p>
+<p id="footer">npm-publish &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 212c689..05b6c45 100644 (file)
@@ -26,7 +26,7 @@ the new binary.</p>
 
 <ul><li><a href="../cli/npm-build.html">npm-build(1)</a></li><li><a href="../cli/npm-install.html">npm-install(1)</a></li></ul>
 </div>
-<p id="footer">npm-rebuild &mdash; npm@1.4.0</p>
+<p id="footer">npm-rebuild &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index f898a92..efdf5dd 100644 (file)
@@ -32,7 +32,7 @@ a <code>package.json</code> in the current folder and use the <code>name</code>
 
 <ul><li><a href="../cli/npm-docs.html">npm-docs(1)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li></ul>
 </div>
-<p id="footer">npm-repo &mdash; npm@1.4.0</p>
+<p id="footer">npm-repo &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index ea609d1..d2da693 100644 (file)
@@ -24,7 +24,7 @@ the &quot;start&quot; script.</p>
 
 <ul><li><a href="../cli/npm-run-script.html">npm-run-script(1)</a></li><li><a href="../misc/npm-scripts.html">npm-scripts(7)</a></li><li><a href="../cli/npm-test.html">npm-test(1)</a></li><li><a href="../cli/npm-start.html">npm-start(1)</a></li><li><a href="../cli/npm-stop.html">npm-stop(1)</a></li></ul>
 </div>
-<p id="footer">npm-restart &mdash; npm@1.4.0</p>
+<p id="footer">npm-restart &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index e20601b..f5d6cf5 100644 (file)
@@ -24,7 +24,7 @@ on its behalf.</p>
 
 <ul><li><a href="../cli/npm-prune.html">npm-prune(1)</a></li><li><a href="../cli/npm-install.html">npm-install(1)</a></li><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li></ul>
 </div>
-<p id="footer">npm-rm &mdash; npm@1.4.0</p>
+<p id="footer">npm-rm &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 519b5f0..cb2b25f 100644 (file)
@@ -20,7 +20,7 @@
 
 <ul><li><a href="../cli/npm-prefix.html">npm-prefix(1)</a></li><li><a href="../cli/npm-bin.html">npm-bin(1)</a></li><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li></ul>
 </div>
-<p id="footer">npm-root &mdash; npm@1.4.0</p>
+<p id="footer">npm-root &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 8882fce..f3e8055 100644 (file)
@@ -23,7 +23,7 @@ called directly, as well.</p>
 
 <ul><li><a href="../misc/npm-scripts.html">npm-scripts(7)</a></li><li><a href="../cli/npm-test.html">npm-test(1)</a></li><li><a href="../cli/npm-start.html">npm-start(1)</a></li><li><a href="../cli/npm-restart.html">npm-restart(1)</a></li><li><a href="../cli/npm-stop.html">npm-stop(1)</a></li></ul>
 </div>
-<p id="footer">npm-run-script &mdash; npm@1.4.0</p>
+<p id="footer">npm-run-script &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index a1d99ce..86727b3 100644 (file)
@@ -37,7 +37,7 @@ fall on multiple lines.</p>
 
 <ul><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li><li><a href="../cli/npm-view.html">npm-view(1)</a></li></ul>
 </div>
-<p id="footer">npm-search &mdash; npm@1.4.0</p>
+<p id="footer">npm-search &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index f89abdc..249da61 100644 (file)
@@ -183,7 +183,7 @@ contents rather than versions.</p>
 
 <ul><li><a href="../cli/npm-install.html">npm-install(1)</a></li><li><a href="../files/package.json.html">package.json(5)</a></li><li><a href="../cli/npm-ls.html">npm-ls(1)</a></li></ul>
 </div>
-<p id="footer">npm-shrinkwrap &mdash; npm@1.4.0</p>
+<p id="footer">npm-shrinkwrap &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 649b049..10dae68 100644 (file)
@@ -26,7 +26,7 @@ a vaguely positive way to show that you care.</p>
 
 <ul><li><a href="../cli/npm-view.html">npm-view(1)</a></li><li><a href="../cli/npm-whoami.html">npm-whoami(1)</a></li><li><a href="../cli/npm-adduser.html">npm-adduser(1)</a></li></ul>
 </div>
-<p id="footer">npm-star &mdash; npm@1.4.0</p>
+<p id="footer">npm-star &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index fad0529..75ce395 100644 (file)
@@ -25,7 +25,7 @@ you will most certainly enjoy this command.</p>
 
 <ul><li><a href="../cli/npm-star.html">npm-star(1)</a></li><li><a href="../cli/npm-view.html">npm-view(1)</a></li><li><a href="../cli/npm-whoami.html">npm-whoami(1)</a></li><li><a href="../cli/npm-adduser.html">npm-adduser(1)</a></li></ul>
 </div>
-<p id="footer">npm-stars &mdash; npm@1.4.0</p>
+<p id="footer">npm-stars &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index d7f0c16..1c1b496 100644 (file)
@@ -20,7 +20,7 @@
 
 <ul><li><a href="../cli/npm-run-script.html">npm-run-script(1)</a></li><li><a href="../misc/npm-scripts.html">npm-scripts(7)</a></li><li><a href="../cli/npm-test.html">npm-test(1)</a></li><li><a href="../cli/npm-restart.html">npm-restart(1)</a></li><li><a href="../cli/npm-stop.html">npm-stop(1)</a></li></ul>
 </div>
-<p id="footer">npm-start &mdash; npm@1.4.0</p>
+<p id="footer">npm-start &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 10dabb0..65cd110 100644 (file)
@@ -20,7 +20,7 @@
 
 <ul><li><a href="../cli/npm-run-script.html">npm-run-script(1)</a></li><li><a href="../misc/npm-scripts.html">npm-scripts(7)</a></li><li><a href="../cli/npm-test.html">npm-test(1)</a></li><li><a href="../cli/npm-start.html">npm-start(1)</a></li><li><a href="../cli/npm-restart.html">npm-restart(1)</a></li></ul>
 </div>
-<p id="footer">npm-stop &mdash; npm@1.4.0</p>
+<p id="footer">npm-stop &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index b99c171..3731b01 100644 (file)
@@ -33,7 +33,7 @@ dependencies into the submodule folder.</p>
 
 <ul><li><a href="../files/package.json.html">package.json(5)</a></li><li>git help submodule</li></ul>
 </div>
-<p id="footer">npm-submodule &mdash; npm@1.4.0</p>
+<p id="footer">npm-submodule &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 9e23051..1d67e19 100644 (file)
@@ -34,7 +34,7 @@ of using a specific version number:</p>
 
 <ul><li><a href="../cli/npm-publish.html">npm-publish(1)</a></li><li><a href="../cli/npm-install.html">npm-install(1)</a></li><li><a href="../cli/npm-dedupe.html">npm-dedupe(1)</a></li><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li></ul>
 </div>
-<p id="footer">npm-tag &mdash; npm@1.4.0</p>
+<p id="footer">npm-tag &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 2538893..05b4d0f 100644 (file)
@@ -24,7 +24,7 @@ true.</p>
 
 <ul><li><a href="../cli/npm-run-script.html">npm-run-script(1)</a></li><li><a href="../misc/npm-scripts.html">npm-scripts(7)</a></li><li><a href="../cli/npm-start.html">npm-start(1)</a></li><li><a href="../cli/npm-restart.html">npm-restart(1)</a></li><li><a href="../cli/npm-stop.html">npm-stop(1)</a></li></ul>
 </div>
-<p id="footer">npm-test &mdash; npm@1.4.0</p>
+<p id="footer">npm-test &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 487e4ed..c462243 100644 (file)
@@ -22,7 +22,7 @@ on its behalf.</p>
 
 <ul><li><a href="../cli/npm-prune.html">npm-prune(1)</a></li><li><a href="../cli/npm-install.html">npm-install(1)</a></li><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li></ul>
 </div>
-<p id="footer">npm-uninstall &mdash; npm@1.4.0</p>
+<p id="footer">npm-uninstall &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 556c9c1..0cc161c 100644 (file)
@@ -34,7 +34,7 @@ the root package entry is removed from the registry entirely.</p>
 
 <ul><li><a href="../cli/npm-deprecate.html">npm-deprecate(1)</a></li><li><a href="../cli/npm-publish.html">npm-publish(1)</a></li><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li><li><a href="../cli/npm-adduser.html">npm-adduser(1)</a></li><li><a href="../cli/npm-owner.html">npm-owner(1)</a></li></ul>
 </div>
-<p id="footer">npm-unpublish &mdash; npm@1.4.0</p>
+<p id="footer">npm-unpublish &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 9c908bf..3549d8f 100644 (file)
@@ -26,7 +26,7 @@ If no package name is specified, all packages in the specified location (global
 
 <ul><li><a href="../cli/npm-install.html">npm-install(1)</a></li><li><a href="../cli/npm-outdated.html">npm-outdated(1)</a></li><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm-ls.html">npm-ls(1)</a></li></ul>
 </div>
-<p id="footer">npm-update &mdash; npm@1.4.0</p>
+<p id="footer">npm-update &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 8b60a0e..1622c99 100644 (file)
@@ -49,7 +49,7 @@ Enter passphrase:</code></pre>
 
 <ul><li><a href="../cli/npm-init.html">npm-init(1)</a></li><li><a href="../files/package.json.html">package.json(5)</a></li><li><a href="../misc/semver.html">semver(7)</a></li></ul>
 </div>
-<p id="footer">npm-version &mdash; npm@1.4.0</p>
+<p id="footer">npm-version &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 7770d44..09a827a 100644 (file)
@@ -91,7 +91,7 @@ the field name.</p>
 
 <ul><li><a href="../cli/npm-search.html">npm-search(1)</a></li><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li><li><a href="../cli/npm-docs.html">npm-docs(1)</a></li></ul>
 </div>
-<p id="footer">npm-view &mdash; npm@1.4.0</p>
+<p id="footer">npm-view &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 28ef7b1..63743a3 100644 (file)
@@ -20,7 +20,7 @@
 
 <ul><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li><li><a href="../cli/npm-adduser.html">npm-adduser(1)</a></li></ul>
 </div>
-<p id="footer">npm-whoami &mdash; npm@1.4.0</p>
+<p id="footer">npm-whoami &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index b3ac7b3..b826a8e 100644 (file)
@@ -14,7 +14,7 @@
 
 <h2 id="VERSION">VERSION</h2>
 
-<p>1.4.0</p>
+<p>1.4.3</p>
 
 <h2 id="DESCRIPTION">DESCRIPTION</h2>
 
@@ -131,7 +131,7 @@ will no doubt tell you to put the output in a gist or email.</p>
 
 <ul><li><a href="../cli/npm-help.html">npm-help(1)</a></li><li><a href="../misc/npm-faq.html">npm-faq(7)</a></li><li><a href="../../doc/README.html">README</a></li><li><a href="../files/package.json.html">package.json(5)</a></li><li><a href="../cli/npm-install.html">npm-install(1)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li><li><a href="../misc/npm-index.html">npm-index(7)</a></li><li><a href="../api/npm.html">npm(3)</a></li></ul>
 </div>
-<p id="footer">npm &mdash; npm@1.4.0</p>
+<p id="footer">npm &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 15252c7..bd68894 100644 (file)
@@ -205,7 +205,7 @@ cannot be found elsewhere.  See <code><a href="../files/package.json.html">packa
 
 <ul><li><a href="../misc/npm-faq.html">npm-faq(7)</a></li><li><a href="../files/package.json.html">package.json(5)</a></li><li><a href="../cli/npm-install.html">npm-install(1)</a></li><li><a href="../cli/npm-pack.html">npm-pack(1)</a></li><li><a href="../cli/npm-cache.html">npm-cache(1)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../cli/npm-publish.html">npm-publish(1)</a></li></ul>
 </div>
-<p id="footer">npm-folders &mdash; npm@1.4.0</p>
+<p id="footer">npm-folders &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 15252c7..bd68894 100644 (file)
@@ -205,7 +205,7 @@ cannot be found elsewhere.  See <code><a href="../files/package.json.html">packa
 
 <ul><li><a href="../misc/npm-faq.html">npm-faq(7)</a></li><li><a href="../files/package.json.html">package.json(5)</a></li><li><a href="../cli/npm-install.html">npm-install(1)</a></li><li><a href="../cli/npm-pack.html">npm-pack(1)</a></li><li><a href="../cli/npm-cache.html">npm-cache(1)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../cli/npm-publish.html">npm-publish(1)</a></li></ul>
 </div>
-<p id="footer">npm-folders &mdash; npm@1.4.0</p>
+<p id="footer">npm-folders &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 9bbda03..2f03d27 100644 (file)
@@ -546,7 +546,7 @@ ignored.</p></li></ul>
 
 <ul><li><a href="../misc/semver.html">semver(7)</a></li><li><a href="../cli/npm-init.html">npm-init(1)</a></li><li><a href="../cli/npm-version.html">npm-version(1)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../cli/npm-help.html">npm-help(1)</a></li><li><a href="../misc/npm-faq.html">npm-faq(7)</a></li><li><a href="../cli/npm-install.html">npm-install(1)</a></li><li><a href="../cli/npm-publish.html">npm-publish(1)</a></li><li><a href="../cli/npm-rm.html">npm-rm(1)</a></li></ul>
 </div>
-<p id="footer">package.json &mdash; npm@1.4.0</p>
+<p id="footer">package.json &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 84ce38e..1bd3328 100644 (file)
@@ -59,7 +59,7 @@ manner.</p>
 
 <ul><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/package.json.html">package.json(5)</a></li><li><a href="../cli/npm.html">npm(1)</a></li></ul>
 </div>
-<p id="footer">npmrc &mdash; npm@1.4.0</p>
+<p id="footer">npmrc &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 9bbda03..2f03d27 100644 (file)
@@ -546,7 +546,7 @@ ignored.</p></li></ul>
 
 <ul><li><a href="../misc/semver.html">semver(7)</a></li><li><a href="../cli/npm-init.html">npm-init(1)</a></li><li><a href="../cli/npm-version.html">npm-version(1)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../cli/npm-help.html">npm-help(1)</a></li><li><a href="../misc/npm-faq.html">npm-faq(7)</a></li><li><a href="../cli/npm-install.html">npm-install(1)</a></li><li><a href="../cli/npm-publish.html">npm-publish(1)</a></li><li><a href="../cli/npm-rm.html">npm-rm(1)</a></li></ul>
 </div>
-<p id="footer">package.json &mdash; npm@1.4.0</p>
+<p id="footer">package.json &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 9b75e83..2a7561e 100644 (file)
 
 <p>The semantic versioner for npm</p>
 </div>
-<p id="footer">npm-index &mdash; npm@1.4.0</p>
+<p id="footer">npm-index &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 58fef54..3f43db0 100644 (file)
@@ -182,7 +182,7 @@ set to anything.&quot;</p>
 
 <ul><li><a href="../misc/npm-developers.html">npm-developers(7)</a></li><li><a href="../misc/npm-faq.html">npm-faq(7)</a></li><li><a href="../cli/npm.html">npm(1)</a></li></ul>
 </div>
-<p id="footer">npm-coding-style &mdash; npm@1.4.0</p>
+<p id="footer">npm-coding-style &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index f706578..062b819 100644 (file)
@@ -710,7 +710,7 @@ hash, and exit successfully.</p>
 
 <ul><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li><li><a href="../misc/npm-scripts.html">npm-scripts(7)</a></li><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm.html">npm(1)</a></li></ul>
 </div>
-<p id="footer">npm-config &mdash; npm@1.4.0</p>
+<p id="footer">npm-config &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 91cbaad..c44fd6b 100644 (file)
@@ -174,7 +174,7 @@ from a fresh checkout.</p>
 
 <ul><li><a href="../misc/npm-faq.html">npm-faq(7)</a></li><li><a href="../cli/npm.html">npm(1)</a></li><li><a href="../cli/npm-init.html">npm-init(1)</a></li><li><a href="../files/package.json.html">package.json(5)</a></li><li><a href="../misc/npm-scripts.html">npm-scripts(7)</a></li><li><a href="../cli/npm-publish.html">npm-publish(1)</a></li><li><a href="../cli/npm-adduser.html">npm-adduser(1)</a></li><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li></ul>
 </div>
-<p id="footer">npm-developers &mdash; npm@1.4.0</p>
+<p id="footer">npm-developers &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 76a0208..6b575e8 100644 (file)
@@ -10,7 +10,7 @@
 
 <h2 id="SYNOPSIS">SYNOPSIS</h2>
 
-<ol><li>Get the author email with <code>npm owner ls &lt;pkgname&gt;</code></li><li>Email the author, CC <a href="mailto:i@izs.me">i@izs.me</a>.</li><li>After a few weeks, if there&#39;s no resolution, we&#39;ll sort it out.</li></ol>
+<ol><li>Get the author email with <code>npm owner ls &lt;pkgname&gt;</code></li><li>Email the author, CC <a href="mailto:support@npmjs.com">support@npmjs.com</a></li><li>After a few weeks, if there&#39;s no resolution, we&#39;ll sort it out.</li></ol>
 
 <p>Don&#39;t squat on package names.  Publish code or move out of the way.</p>
 
@@ -43,14 +43,15 @@ but can&#39;t publish, because Bob&#39;s <code>foo</code> is in the way.</li></o
 Joe&#39;s appropriate course of action in each case is the same.</p>
 
 <ol><li><code>npm owner ls foo</code>.  This will tell Joe the email address of the
-owner (Bob).</li><li>Joe emails Bob, explaining the situation <strong>as respectfully as possible</strong>,
-and what he would like to do with the module name.  He adds
-isaacs <a href="mailto:i@izs.me">i@izs.me</a> to the CC list of the email.  Mention in the email
-that Bob can run <code>npm owner add joe foo</code> to add Joe as an owner of
-the <code>foo</code> package.</li><li>After a reasonable amount of time, if Bob has not responded, or if
-Bob and Joe can&#39;t come to any sort of resolution, email isaacs
-<a href="mailto:i@izs.me">i@izs.me</a> and we&#39;ll sort it out.  (&quot;Reasonable&quot; is usually about 4
-weeks, but extra time is allowed around common holidays.)</li></ol>
+owner (Bob).</li><li>Joe emails Bob, explaining the situation <strong>as respectfully as
+possible</strong>, and what he would like to do with the module name.  He
+adds the npm support staff <a href="mailto:support@npmjs.com">support@npmjs.com</a> to the CC list of
+the email.  Mention in the email that Bob can run <code>npm owner add
+joe foo</code> to add Joe as an owner of the <code>foo</code> package.</li><li>After a reasonable amount of time, if Bob has not responded, or if
+Bob and Joe can&#39;t come to any sort of resolution, email support
+<a href="mailto:support@npmjs.com">support@npmjs.com</a> and we&#39;ll sort it out.  (&quot;Reasonable&quot; is
+usually at least 4 weeks, but extra time is allowed around common
+holidays.)</li></ol>
 
 <h2 id="REASONING">REASONING</h2>
 
@@ -91,7 +92,7 @@ things into it.</li></ol>
 
 <ul><li><a href="../misc/npm-registry.html">npm-registry(7)</a></li><li><a href="../cli/npm-owner.html">npm-owner(1)</a></li></ul>
 </div>
-<p id="footer">npm-disputes &mdash; npm@1.4.0</p>
+<p id="footer">npm-disputes &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 9564226..188c135 100644 (file)
@@ -10,7 +10,7 @@
 
 <h2 id="Where-can-I-find-these-docs-in-HTML">Where can I find these docs in HTML?</h2>
 
-<p><a href="https://npmjs.org/doc/">https://npmjs.org/doc/</a>, or run:</p>
+<p><a href="https://www.npmjs.org/doc/">https://www.npmjs.org/doc/</a>, or run:</p>
 
 <pre><code>npm config set viewer browser</code></pre>
 
@@ -74,7 +74,8 @@ program that uses it.</p>
 
 <h2 id="Whatever-I-really-want-the-old-style-everything-global-style">Whatever, I really want the old style &#39;everything global&#39; style.</h2>
 
-<p>Write your own package manager, then.  It&#39;s not that hard.</p>
+<p>Write your own package manager.  You could probably even wrap up <code>npm</code>
+in a shell script if you really wanted to.</p>
 
 <p>npm will not help you do something that is known to be a bad idea.</p>
 
@@ -302,13 +303,17 @@ that has a package.json in its root, or a git url.
 
 <p>Either the registry is down, or node&#39;s DNS isn&#39;t able to reach out.</p>
 
-<p>To check if the registry is down, open up <a href="http://registry.npmjs.org/">http://registry.npmjs.org/</a>
-in a web browser.  This will also tell you if you are just unable to
-access the internet for some reason.</p>
+<p>To check if the registry is down, open up
+<a href="https://registry.npmjs.org/">https://registry.npmjs.org/</a> in a web browser.  This will also tell
+you if you are just unable to access the internet for some reason.</p>
 
-<p>If the registry IS down, let me know by emailing <a href="mailto:i@izs.me">i@izs.me</a> or posting
-an issue at <a href="https://github.com/npm/npm/issues">https://github.com/npm/npm/issues</a>.  We&#39;ll have
-someone kick it or something.</p>
+<p>If the registry IS down, let us know by emailing <a href="mailto:support@npmjs.com">support@npmjs.com</a>
+or posting an issue at <a href="https://github.com/npm/npm/issues">https://github.com/npm/npm/issues</a>.  If it&#39;s
+down for the world (and not just on your local network) then we&#39;re
+probably already being pinged about it.</p>
+
+<p>You can also often get a faster response by visiting the #npm channel
+on Freenode IRC.</p>
 
 <h2 id="Why-no-namespaces">Why no namespaces?</h2>
 
@@ -322,9 +327,12 @@ There is not sufficient need to impose namespace rules on everyone.</p>
 
 <h2 id="Who-does-npm">Who does npm?</h2>
 
-<p><code>npm view npm author</code></p>
+<p>npm was originally written by Isaac Z. Schlueter, and many others have
+contributed to it, some of them quite substantially.</p>
 
-<p><code>npm view npm contributors</code></p>
+<p>The npm open source project, The npm Registry, and <a href="https://www.npmjs.org">the community
+website</a> are maintained and operated by the
+good folks at <a href="https://www.npmjs.com">npm, Inc.</a></p>
 
 <h2 id="I-have-a-question-or-request-not-addressed-here-Where-should-I-put-it">I have a question or request not addressed here. Where should I put it?</h2>
 
@@ -340,7 +348,7 @@ There is not sufficient need to impose namespace rules on everyone.</p>
 
 <ul><li><a href="../cli/npm.html">npm(1)</a></li><li><a href="../misc/npm-developers.html">npm-developers(7)</a></li><li><a href="../files/package.json.html">package.json(5)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npm-folders.html">npm-folders(5)</a></li></ul>
 </div>
-<p id="footer">npm-faq &mdash; npm@1.4.0</p>
+<p id="footer">npm-faq &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 3576910..13fbb26 100644 (file)
 
 <p>The semantic versioner for npm</p>
 </div>
-<p id="footer">npm-index &mdash; npm@1.4.0</p>
+<p id="footer">npm-index &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index d8003e8..037e218 100644 (file)
@@ -71,7 +71,7 @@ effectively implement the entire CouchDB API anyway.</p>
 
 <ul><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/npmrc.html">npmrc(5)</a></li><li><a href="../misc/npm-developers.html">npm-developers(7)</a></li><li><a href="../misc/npm-disputes.html">npm-disputes(7)</a></li></ul>
 </div>
-<p id="footer">npm-registry &mdash; npm@1.4.0</p>
+<p id="footer">npm-registry &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 6619ae6..4a01368 100644 (file)
@@ -223,7 +223,7 @@ the user will sudo the npm command in question.</li></ul>
 
 <ul><li><a href="../cli/npm-run-script.html">npm-run-script(1)</a></li><li><a href="../files/package.json.html">package.json(5)</a></li><li><a href="../misc/npm-developers.html">npm-developers(7)</a></li><li><a href="../cli/npm-install.html">npm-install(1)</a></li></ul>
 </div>
-<p id="footer">npm-scripts &mdash; npm@1.4.0</p>
+<p id="footer">npm-scripts &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 7a41f68..2fd99a1 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="../cli/npm-rm.html">npm-rm(1)</a></li><li><a href="../cli/npm-prune.html">npm-prune(1)</a></li></ul>
 </div>
-<p id="footer">removing-npm &mdash; npm@1.4.0</p>
+<p id="footer">removing-npm &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index ffddd7b..490f020 100644 (file)
@@ -94,7 +94,7 @@ in descending order when passed to Array.sort().</li></ul>
 range.</li><li>maxSatisfying(versions, range): Return the highest version in the list
 that satisfies the range, or null if none of them do.</li></ul>
 </div>
-<p id="footer">semver &mdash; npm@1.4.0</p>
+<p id="footer">semver &mdash; npm@1.4.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index cc45460..3b9a46f 100644 (file)
@@ -64,7 +64,7 @@ var mkdir = require("mkdirp")
   , fetch = require("./utils/fetch.js")
   , npm = require("./npm.js")
   , fs = require("graceful-fs")
-  , rm = require("rimraf")
+  , rm = require("./utils/gently-rm.js")
   , readJson = require("read-package-json")
   , registry = npm.registry
   , log = require("npmlog")
@@ -249,16 +249,48 @@ function add (args, cb) {
   var p = url.parse(spec) || {}
   log.verbose("parsed url", p)
 
-  // it could be that we got name@http://blah
+  // If there's a /, and it's a path, then install the path.
+  // If not, and there's a @, it could be that we got name@http://blah
   // in that case, we will not have a protocol now, but if we
   // split and check, we will.
-  if (!name && !p.protocol && spec.indexOf("@") !== -1) {
-    spec = spec.split("@")
-    name = spec.shift()
-    spec = spec.join("@")
-    return add([name, spec], cb)
+  if (!name && !p.protocol) {
+    if (spec.indexOf("/") !== -1 ||
+        process.platform === "win32" && spec.indexOf("\\") !== -1) {
+      return maybeFile(spec, p, cb)
+    } else if (spec.indexOf("@") !== -1) {
+      return maybeAt(spec, cb)
+    }
   }
 
+  add_(name, spec, p, cb)
+}
+
+function maybeFile (spec, p, cb) {
+  fs.stat(spec, function (er, stat) {
+    if (!er) {
+      // definitely a local thing
+      addLocal(spec, cb)
+    } else if (er && spec.indexOf("@") !== -1) {
+      // bar@baz/loofa
+      maybeAt(spec, cb)
+    } else {
+      // Already know it's not a url, so must be local
+      addLocal(spec, cb)
+    }
+  })
+}
+
+function maybeAt (spec, cb) {
+  var tmp = spec.split("@")
+
+  // split name@2.3.4 only if name is a valid package name,
+  // don't split in case of "./test@example.com/" (local path)
+  var name = tmp.shift()
+  spec = tmp.join("@")
+  return add([name, spec], cb)
+}
+
+function add_ (name, spec, p, cb) {
   switch (p.protocol) {
     case "http:":
     case "https:":
@@ -378,41 +410,40 @@ function addRemoteGit (u, parsed, name, silent, cb_) {
   iF.push(cb_)
   if (iF.length > 1) return
 
+  // git is so tricky!
+  // if the path is like ssh://foo:22/some/path then it works, but
+  // it needs the ssh://
+  // If the path is like ssh://foo:some/path then it works, but
+  // only if you remove the ssh://
+  var origUrl = u
+  u = u.replace(/^git\+/, "")
+       .replace(/#.*$/, "")
+
+  // ssh paths that are scp-style urls don't need the ssh://
+  if (parsed.pathname.match(/^\/?:/)) {
+    u = u.replace(/^ssh:\/\//, "")
+  }
+
   function cb (er, data) {
     unlock(u, function () {
       var c
       while (c = iF.shift()) c(er, data)
-      delete inFlightURLs[u]
+      delete inFlightURLs[origUrl]
     })
   }
 
-  var p, co // cachePath, git-ref we want to check out
-
   lock(u, function (er) {
     if (er) return cb(er)
 
     // figure out what we should check out.
     var co = parsed.hash && parsed.hash.substr(1) || "master"
-    // git is so tricky!
-    // if the path is like ssh://foo:22/some/path then it works, but
-    // it needs the ssh://
-    // If the path is like ssh://foo:some/path then it works, but
-    // only if you remove the ssh://
-    var origUrl = u
-    u = u.replace(/^git\+/, "")
-         .replace(/#.*$/, "")
-
-    // ssh paths that are scp-style urls don't need the ssh://
-    if (parsed.pathname.match(/^\/?:/)) {
-      u = u.replace(/^ssh:\/\//, "")
-    }
 
     var v = crypto.createHash("sha1").update(u).digest("hex").slice(0, 8)
     v = u.replace(/[^a-zA-Z0-9]+/g, '-') + '-' + v
 
     log.verbose("addRemoteGit", [u, co])
 
-    p = path.join(npm.config.get("cache"), "_git-remotes", v)
+    var p = path.join(npm.config.get("cache"), "_git-remotes", v)
 
     checkGitDir(p, u, co, origUrl, silent, function(er, data) {
       chmodr(p, npm.modes.file, function(erChmod) {
@@ -1263,9 +1294,15 @@ function lock (u, cb) {
 
 function unlock (u, cb) {
   var lf = lockFileName(u)
-  if (!myLocks[lf]) return process.nextTick(cb)
-  myLocks[lf] = false
-  lockFile.unlock(lockFileName(u), cb)
+    , locked = myLocks[lf]
+  if (locked === false) {
+    return process.nextTick(cb)
+  } else if (locked === true) {
+    myLocks[lf] = false
+    lockFile.unlock(lockFileName(u), cb)
+  } else {
+    throw new Error("Attempt to unlock " + u + ", which hasn't been locked")
+  }
 }
 
 function needName(er, data) {
index ce161a4..55823d9 100644 (file)
@@ -16,7 +16,7 @@ var util = require("util")
 var RegClient = require("npm-registry-client")
 var npmconf = require("npmconf")
 var semver = require("semver")
-var rimraf = require("rimraf")
+var rm = require("./utils/gently-rm.js")
 var log = require("npmlog")
 var npm = require("./npm.js")
 
@@ -208,7 +208,7 @@ function installAndRetest (set, filter, dir, unavoidable, silent, cb) {
 
   }, function (er, installed) {
     if (er) return cb(er)
-    asyncMap(remove, rimraf, function (er) {
+    asyncMap(remove, rm, function (er) {
       if (er) return cb(er)
       remove.forEach(function (r) {
         log.info("rm", r)
@@ -249,10 +249,10 @@ function findVersions (npm, summary, cb) {
       var regVersions = er ? [] : Object.keys(data.versions)
       var locMatch = bestMatch(versions, ranges)
       var regMatch;
-      var tag = npm.config.get("tag");
-      var distTags = data["dist-tags"];
-      if (distTags && distTags[tag] && data.versions[distTags[tag]]) {
-        regMatch = distTags[tag]
+      var tag = npm.config.get("tag")
+      var distTag = data["dist-tags"] && data["dist-tags"][tag]
+      if (distTag && data.versions[distTag] && matches(distTag, ranges)) {
+        regMatch = distTag
       } else {
         regMatch = bestMatch(regVersions, ranges)
       }
@@ -262,11 +262,15 @@ function findVersions (npm, summary, cb) {
   }, cb)
 }
 
+function matches (version, ranges) {
+  return !ranges.some(function (r) {
+    return !semver.satisfies(version, r, true)
+  })
+}
+
 function bestMatch (versions, ranges) {
   return versions.filter(function (v) {
-    return !ranges.some(function (r) {
-      return !semver.satisfies(v, r, true)
-    })
+    return matches(v, ranges)
   }).sort(semver.compareLoose).pop()
 }
 
index f0604a9..92a4907 100644 (file)
@@ -187,7 +187,7 @@ function install (args, cb_) {
 }
 
 function findPeerInvalid (where, cb) {
-  readInstalled(where, log.warn, function (er, data) {
+  readInstalled(where, { log: log.warn }, function (er, data) {
     if (er) return cb(er)
 
     cb(null, findPeerInvalid_(data.dependencies, []))
@@ -351,7 +351,7 @@ function save (where, installed, tree, pretty, hasArguments, cb) {
       }).reduce(function (set, k) {
         var rangeDescriptor = semver.valid(k[1], true) &&
                               semver.gte(k[1], "0.1.0", true)
-                            ? "~" : ""
+                            ? "^" : ""
         set[k[0]] = rangeDescriptor + k[1]
         return set
       }, {})
index 4ecd64a..5628465 100644 (file)
@@ -8,7 +8,7 @@ var npm = require("./npm.js")
   , asyncMap = require("slide").asyncMap
   , chain = require("slide").chain
   , path = require("path")
-  , rm = require("rimraf")
+  , rm = require("./utils/gently-rm.js")
   , build = require("./build.js")
 
 module.exports = link
@@ -121,6 +121,10 @@ function linkPkg (folder, cb_) {
       return cb_(er, [[d && d._id, target, null, null]])
     }
     if (er) return cb(er)
+    if (!d.name) {
+      er = new Error("Package must have a name field to be linked")
+      return cb(er)
+    }
     var target = path.resolve(npm.globalDir, d.name)
     rm(target, function (er) {
       if (er) return cb(er)
index 194aae6..dc56b0e 100644 (file)
@@ -36,7 +36,8 @@ function ls (args, silent, cb) {
   })
 
   var depth = npm.config.get("depth")
-  readInstalled(dir, depth, log.warn, function (er, data) {
+  var opt = { depth: depth, log: log.warn }
+  readInstalled(dir, opt, function (er, data) {
     var bfs = bfsify(data, args)
       , lite = getLite(bfs)
 
index 858a5e8..7b38262 100644 (file)
@@ -31,7 +31,15 @@ var EventEmitter = require("events").EventEmitter
   , chain = slide.chain
   , RegClient = require("npm-registry-client")
 
-npm.config = {loaded: false}
+npm.config = {
+  loaded: false,
+  get: function() {
+    throw new Error('npm.load() required')
+  },
+  set: function() {
+    throw new Error('npm.load() required')
+  }
+}
 
 // /usr/local is often a read-only fs, which is not
 // well handled by node or mkdirp.  Just double-check
index 5eb4973..6ca3487 100644 (file)
@@ -9,6 +9,9 @@ Does the following:
 If no packages are specified, then run for all installed
 packages.
 
+--parseable creates output like this:
+<fullpath>:<name@wanted>:<name@installed>:<name@latest>
+
 */
 
 module.exports = outdated
@@ -29,6 +32,8 @@ var path = require("path")
   , color = require("ansicolors")
   , styles = require("ansistyles")
   , table = require("text-table")
+  , semver = require("semver")
+  , os = require("os")
 
 function outdated (args, silent, cb) {
   if (typeof cb !== "function") cb = silent, silent = false
@@ -37,14 +42,23 @@ function outdated (args, silent, cb) {
     if (er || silent) return cb(er, list)
     if (npm.config.get("json")) {
       console.log(makeJSON(list))
+    } else if (npm.config.get("parseable")) {
+      console.log(makeParseable(list));
     } else {
       var outList = list.map(makePretty)
-      var outTable = [[ styles.underline("Package")
-                      , styles.underline("Current")
-                      , styles.underline("Wanted")
-                      , styles.underline("Latest")
-                      , styles.underline("Location")
+      var outTable = [[ "Package"
+                      , "Current"
+                      , "Wanted"
+                      , "Latest"
+                      , "Location"
                      ]].concat(outList)
+
+      if (npm.color) {
+        outTable[0] = outTable[0].map(function(heading) {
+          return styles.underline(heading)
+        })
+      }
+
       var tableOpts = { align: ["l", "r", "r", "r", "l"]
                       , stringLength: function(s) { return ansiTrim(s).length }
                       }
@@ -54,37 +68,34 @@ function outdated (args, silent, cb) {
   })
 }
 
-// [[ dir, dep, has, want ]]
+// [[ dir, dep, has, want, latest ]]
 function makePretty (p) {
   var parseable = npm.config.get("parseable")
-    , long = npm.config.get("long")
     , dep = p[1]
     , dir = path.resolve(p[0], "node_modules", dep)
     , has = p[2]
     , want = p[3]
     , latest = p[4]
 
-  // XXX add --json support
-  // Should match (more or less) the output of ls --json
-
-  if (parseable) {
-    var str = dir
-    if (npm.config.get("long")) {
-      str += ":" + dep + "@" + want
-           + ":" + (has ? (dep + "@" + has) : "MISSING")
-    }
-    return str
-  }
-
   if (!npm.config.get("global")) {
     dir = path.relative(process.cwd(), dir)
   }
-  return [ has === want ? color.yellow(dep) : color.red(dep)
-         , (has || "MISSING")
-         , color.green(want)
-         , color.magenta(latest)
-         , color.brightBlack(dirToPrettyLocation(dir))
-         ]
+
+  var columns = [ dep
+                , has || "MISSING"
+                , want
+                , latest
+                , dirToPrettyLocation(dir)
+                ]
+
+  if (npm.color) {
+    columns[0] = color[has === want ? "yellow" : "red"](columns[0]) // dep
+    columns[2] = color.green(columns[2]) // want
+    columns[3] = color.magenta(columns[3]) // latest
+    columns[4] = color.brightBlack(columns[4]) // dir
+  }
+
+  return columns
 }
 
 function ansiTrim (str) {
@@ -98,6 +109,22 @@ function dirToPrettyLocation (dir) {
             .replace(/[[/\\]node_modules[/\\]/g, " > ")
 }
 
+function makeParseable (list) {
+  return list.map(function (p) {
+    var dep = p[1]
+      , dir = path.resolve(p[0], "node_modules", dep)
+      , has = p[2]
+      , want = p[3]
+      , latest = p[4];
+
+    return [ dir
+           , dep + "@" + want
+           , (has ? (dep + "@" + has) : "MISSING")
+           , dep + "@" + latest
+           ].join(":")
+  }).join(os.EOL)
+}
+
 function makeJSON (list) {
   var out = {}
   list.forEach(function (p) {
@@ -222,10 +249,33 @@ function shouldUpdate (args, dir, dep, has, req, depth, cb) {
 
   var registry = npm.registry
   // search for the latest package
-  registry.get(dep + "/latest", function (er, l) {
+  registry.get(dep, function (er, d) {
     if (er) return cb()
-    // so, we can conceivably update this.  find out if we need to.
-    cache.add(dep, req, function (er, d) {
+    if (!d || !d['dist-tags'] || !d.versions) return cb()
+    var l = d.versions[d['dist-tags'].latest]
+    if (!l) return cb()
+
+    // set to true if found in doc
+    var found = false
+
+    var r = req
+    if (d['dist-tags'][req])
+      r = d['dist-tags'][req]
+
+    if (semver.validRange(r, true)) {
+      // some kind of semver range.
+      // see if it's in the doc.
+      var vers = Object.keys(d.versions)
+      var v = semver.maxSatisfying(vers, r, true)
+      if (v) {
+        return onCacheAdd(null, d.versions[v])
+      }
+    }
+
+    // We didn't find the version in the doc.  See if cache can find it.
+    cache.add(dep, req, onCacheAdd)
+
+    function onCacheAdd(er, d) {
       // if this fails, then it means we can't update this thing.
       // it's probably a thing that isn't published.
       if (er) {
@@ -247,6 +297,7 @@ function shouldUpdate (args, dir, dep, has, req, depth, cb) {
         doIt(d.version, l.version)
       else
         skip()
-    })
+    }
+
   })
 }
index 0e13da1..8fa3e5d 100644 (file)
@@ -21,7 +21,8 @@ function prune (args, cb) {
   })
 
   function next() {
-    readInstalled(npm.prefix, npm.config.get("depth"), function (er, data) {
+    var opt = { depth: npm.config.get("depth"), dev: npm.config.get("production") }
+    readInstalled(npm.prefix, opt, function (er, data) {
       if (er) return cb(er)
       prune_(args, data, cb)
     })
index 7cea3ef..a156acc 100644 (file)
@@ -14,7 +14,8 @@ rebuild.usage = "npm rebuild [<name>[@<version>] [name[@<version>] ...]]"
 rebuild.completion = require("./utils/completion/installed-deep.js")
 
 function rebuild (args, cb) {
-  readInstalled(npm.prefix, npm.config.get("depth"), function (er, data) {
+  var opt = { depth: npm.config.get("depth") }
+  readInstalled(npm.prefix, opt, function (er, data) {
     log.info("readInstalled", typeof data)
     if (er) return cb(er)
     var set = filter(data, args)
index 14711df..4aed596 100644 (file)
@@ -38,6 +38,11 @@ function shrinkwrap_ (pkginfo, silent, dev, cb) {
         return cb(er)
       if (data.devDependencies) {
         Object.keys(data.devDependencies).forEach(function (dep) {
+          if (data.dependencies && data.dependencies[dep]) {
+            // do not exclude the dev dependency if it's also listed as a dependency
+            return
+          }
+
           log.warn("shrinkwrap", "Excluding devDependency: %s", dep)
           delete pkginfo.dependencies[dep]
         })
@@ -51,6 +56,9 @@ function shrinkwrap_ (pkginfo, silent, dev, cb) {
 
 
 function save (pkginfo, silent, cb) {
+  // copy the keys over in a well defined order
+  // because javascript objects serialize arbitrarily
+  pkginfo.dependencies = copyOrder(pkginfo.dependencies)
   try {
     var swdata = JSON.stringify(pkginfo, null, 2) + "\n"
   } catch (er) {
@@ -67,3 +75,12 @@ function save (pkginfo, silent, cb) {
     cb(null, pkginfo)
   })
 }
+
+function copyOrder(obj) {
+  var result = {}
+  var keys = Object.keys(obj).sort()
+  keys.forEach(function (key) {
+    result[key] = obj[key]
+  })
+  return result
+}
index 57688f0..0384a73 100644 (file)
@@ -2,7 +2,7 @@ module.exports = unbuild
 unbuild.usage = "npm unbuild <folder>\n(this is plumbing)"
 
 var readJson = require("read-package-json")
-  , rm = require("rimraf")
+  , rm = require("./utils/gently-rm.js")
   , gentlyRm = require("./utils/gently-rm.js")
   , npm = require("./npm.js")
   , path = require("path")
index b49d7bb..99e3207 100644 (file)
@@ -6,12 +6,16 @@ var npm = require("../../npm.js")
 function installedDeep (opts, cb) {
   var local
     , global
+    , depth = npm.config.get("depth")
+    , opt = { depth: depth }
+
   if (npm.config.get("global")) local = [], next()
-  else readInstalled(npm.prefix, npm.config.get("depth"), function (er, data) {
+  else readInstalled(npm.prefix, opt, function (er, data) {
     local = getNames(data || {})
     next()
   })
-  readInstalled(npm.config.get("prefix"), npm.config.get("depth"), function (er, data) {
+
+  readInstalled(npm.config.get("prefix"), opt, function (er, data) {
     global = getNames(data || {})
     next()
   })
index f24309a..241740f 100644 (file)
@@ -9,6 +9,22 @@ var rimraf = require("rimraf")
   , path = require("path")
 
 function gentlyRm (p, gently, cb) {
+  if (!cb) cb = gently, gently = null
+
+  // never rm the root, prefix, or bin dirs.
+  // just a safety precaution.
+  p = path.resolve(p)
+  if (p === npm.dir ||
+      p === npm.root ||
+      p === npm.bin ||
+      p === npm.prefix ||
+      p === npm.globalDir ||
+      p === npm.globalRoot ||
+      p === npm.globalBin ||
+      p === npm.globalPrefix) {
+    return cb(new Error("May not delete: " + p))
+  }
+
   if (npm.config.get("force") || !gently) {
     return rimraf(p, cb)
   }
index 378415e..b73c134 100644 (file)
@@ -6,7 +6,7 @@ var npm = require("../npm.js")
   , path = require("path")
   , log = require("npmlog")
   , uidNumber = require("uid-number")
-  , rm = require("rimraf")
+  , rm = require("./gently-rm.js")
   , readJson = require("read-package-json")
   , cache = require("../cache.js")
   , myUid = process.getuid && process.getuid()
index babd072..f7ba5a9 100644 (file)
@@ -56,7 +56,7 @@ function view (args, silent, cb) {
   if (name === ".") return cb(view.usage)
 
   // get the data about this package
-  registry.get(name, 600, function (er, data) {
+  registry.get(name, function (er, data) {
     if (er) return cb(er)
     if (data["dist-tags"].hasOwnProperty(version)) {
       version = data["dist-tags"][version]
index e31f025..c100786 100644 (file)
@@ -234,58 +234,62 @@ command line arguments using nopt\.  You may also want to check out \fBnpm
 help config\fR to learn about all the options you can set there\.
 .
 .SH "More Docs"
-Check out the docs \fIhttps://npmjs\.org/doc/\fR,
-especially the faq \fIhttps://npmjs\.org/doc/faq\.html\fR\|\.
+Check out the docs \fIhttps://www\.npmjs\.org/doc/\fR,
+especially the faq \fIhttps://www\.npmjs\.org/doc/faq\.html\fR\|\.
 .
 .P
 You can use the \fBnpm help\fR command to read any of them\.
 .
 .P
 If you\'re a developer, and you want to use npm to publish your program,
-you should read this \fIhttps://npmjs\.org/doc/developers\.html\fR
+you should read this \fIhttps://www\.npmjs\.org/doc/developers\.html\fR
 .
 .SH "Legal Stuff"
-"npm" and "the npm registry" are owned by Isaac Z\. Schlueter\.
+"npm" and "The npm Registry" are owned by npm, Inc\.
 All rights reserved\.  See the included LICENSE file for more details\.
 .
 .P
-"Node\.js" and "node" are trademarks owned by Joyent, Inc\.  npm is not
-officially part of the Node\.js project, and is neither owned by nor
-officially affiliated with Joyent, Inc\.
+"Node\.js" and "node" are trademarks owned by Joyent, Inc\.
 .
 .P
-The packages in the npm registry are not part of npm itself, and are the
-sole property of their respective maintainers\.  While every effort is
-made to ensure accountability, there is absolutely no guarantee,
-warrantee, or assertion made as to the quality, fitness for a specific
-purpose, or lack of malice in any given npm package\.  Modules
-published on the npm registry are not affiliated with or endorsed by
-Joyent, Inc\., Isaac Z\. Schlueter, Ryan Dahl, or the Node\.js project\.
+Modules published on the npm registry are not officially endorsed by
+npm, Inc\. or the Node\.js project\.
 .
 .P
-If you have a complaint about a package in the npm registry, and cannot
-resolve it with the package owner, please express your concerns to
-Isaac Z\. Schlueter at \fIi@izs\.me\fR\|\.
+Data published to the npm registry is not part of npm itself, and is
+the sole property of the publisher\.  While every effort is made to
+ensure accountability, there is absolutely no guarantee, warrantee, or
+assertion expressed or implied as to the quality, fitness for a
+specific purpose, or lack of malice in any given npm package\.
 .
-.SS "In plain english"
-This is mine; not my employer\'s, not Node\'s, not Joyent\'s, not Ryan
-Dahl\'s\.
+.P
+If you have a complaint about a package in the public npm registry,
+and cannot resolve it with the package
+owner \fIhttps://www\.npmjs\.org/doc/misc/npm\-disputes\.html\fR, please email \fIsupport@npmjs\.com\fR and explain the situation\.
+.
+.P
+Any data published to The npm Registry (including user account
+information) may be removed or modified at the sole discretion of the
+npm server administrators\.
+.
+.SS "In plainer english"
+npm is the property of npm, Inc\.
 .
 .P
 If you publish something, it\'s yours, and you are solely accountable
-for it\.  Not me, not Node, not Joyent, not Ryan Dahl\.
+for it\.
 .
 .P
-If other people publish something, it\'s theirs\.  Not mine, not Node\'s,
-not Joyent\'s, not Ryan Dahl\'s\.
+If other people publish something, it\'s theirs\.
 .
 .P
-Yes, you can publish something evil\.  It will be removed promptly if
-reported, and we\'ll lose respect for you\.  But there is no vetting
-process for published modules\.
+Users can publish Bad Stuff\.  It will be removed promptly if reported\.
+But there is no vetting process for published modules, and you use
+them at your own risk\.  Please inspect the source\.
 .
 .P
-If this concerns you, inspect the source before using packages\.
+If you publish Bad Stuff, we may delete it from the registry, or even
+ban your account in extreme cases\.  So don\'t do that\.
 .
 .SH "BUGS"
 When you find issues, please report them:
index 4c2d0e2..586aebb 100644 (file)
@@ -29,7 +29,7 @@ For example, running \fBnpm ls promzard\fR in npm\'s source tree will show:
 .IP "" 4
 .
 .nf
-npm@1.4.0 /path/to/npm
+npm@1.4.3 /path/to/npm
 â””─┬ init\-package\-json@0\.0\.4
   â””── promzard@0\.1\.5
 .
index 660523d..e6ecfba 100644 (file)
@@ -14,7 +14,7 @@ npm <command> [args]
 .fi
 .
 .SH "VERSION"
-1.4.0
+1.4.3
 .
 .SH "DESCRIPTION"
 npm is the package manager for the Node JavaScript platform\.  It puts
index 1461035..0ecd9ff 100644 (file)
@@ -21,7 +21,7 @@ npm\.load([configObject], function (er, npm) {
 .fi
 .
 .SH "VERSION"
-1.4.0
+1.4.3
 .
 .SH "DESCRIPTION"
 This is the API documentation for npm\.
index 136290b..51ec779 100644 (file)
@@ -12,7 +12,7 @@
 Get the author email with \fBnpm owner ls <pkgname>\fR
 .
 .IP "2" 4
-Email the author, CC \fIi@izs\.me\fR\|\.
+Email the author, CC \fIsupport@npmjs\.com\fR
 .
 .IP "3" 4
 After a few weeks, if there\'s no resolution, we\'ll sort it out\.
@@ -67,16 +67,17 @@ Joe\'s appropriate course of action in each case is the same\.
 owner (Bob)\.
 .
 .IP "2" 4
-Joe emails Bob, explaining the situation \fBas respectfully as possible\fR,
-and what he would like to do with the module name\.  He adds
-isaacs \fIi@izs\.me\fR to the CC list of the email\.  Mention in the email
-that Bob can run \fBnpm owner add joe foo\fR to add Joe as an owner of
-the \fBfoo\fR package\.
+Joe emails Bob, explaining the situation \fBas respectfully as
+possible\fR, and what he would like to do with the module name\.  He
+adds the npm support staff \fIsupport@npmjs\.com\fR to the CC list of
+the email\.  Mention in the email that Bob can run \fBnpm owner add
+joe foo\fR to add Joe as an owner of the \fBfoo\fR package\.
 .
 .IP "3" 4
 After a reasonable amount of time, if Bob has not responded, or if
-Bob and Joe can\'t come to any sort of resolution, email isaacs \fIi@izs\.me\fR and we\'ll sort it out\.  ("Reasonable" is usually about 4
-weeks, but extra time is allowed around common holidays\.)
+Bob and Joe can\'t come to any sort of resolution, email support \fIsupport@npmjs\.com\fR and we\'ll sort it out\.  ("Reasonable" is
+usually at least 4 weeks, but extra time is allowed around common
+holidays\.)
 .
 .IP "" 0
 .
index dfd165d..bc1ef22 100644 (file)
@@ -7,7 +7,7 @@
 \fBnpm-faq\fR \-\- Frequently Asked Questions
 .
 .SH "Where can I find these docs in HTML?"
-\fIhttps://npmjs\.org/doc/\fR, or run:
+\fIhttps://www\.npmjs\.org/doc/\fR, or run:
 .
 .IP "" 4
 .
@@ -84,7 +84,8 @@ That\'s what it\'s for\.  Install it globally, then link it into each
 program that uses it\.
 .
 .SH "Whatever, I really want the old style &#39;everything global&#39; style\."
-Write your own package manager, then\.  It\'s not that hard\.
+Write your own package manager\.  You could probably even wrap up \fBnpm\fR
+in a shell script if you really wanted to\.
 .
 .P
 npm will not help you do something that is known to be a bad idea\.
@@ -405,14 +406,18 @@ Go to \fIhttps://npmjs\.org/forgot\fR\|\.
 Either the registry is down, or node\'s DNS isn\'t able to reach out\.
 .
 .P
-To check if the registry is down, open up \fIhttp://registry\.npmjs\.org/\fR
-in a web browser\.  This will also tell you if you are just unable to
-access the internet for some reason\.
+To check if the registry is down, open up \fIhttps://registry\.npmjs\.org/\fR in a web browser\.  This will also tell
+you if you are just unable to access the internet for some reason\.
 .
 .P
-If the registry IS down, let me know by emailing \fIi@izs\.me\fR or posting
-an issue at \fIhttps://github\.com/npm/npm/issues\fR\|\.  We\'ll have
-someone kick it or something\.
+If the registry IS down, let us know by emailing \fIsupport@npmjs\.com\fR
+or posting an issue at \fIhttps://github\.com/npm/npm/issues\fR\|\.  If it\'s
+down for the world (and not just on your local network) then we\'re
+probably already being pinged about it\.
+.
+.P
+You can also often get a faster response by visiting the #npm channel
+on Freenode IRC\.
 .
 .SH "Why no namespaces?"
 Please see this discussion: \fIhttps://github\.com/npm/npm/issues/798\fR
@@ -425,10 +430,13 @@ If you want to namespace your own packages, you may: simply use the \fB\-\fR cha
 There is not sufficient need to impose namespace rules on everyone\.
 .
 .SH "Who does npm?"
-\fBnpm view npm author\fR
+npm was originally written by Isaac Z\. Schlueter, and many others have
+contributed to it, some of them quite substantially\.
 .
 .P
-\fBnpm view npm contributors\fR
+The npm open source project, The npm Registry, and the community
+website \fIhttps://www\.npmjs\.org\fR are maintained and operated by the
+good folks at npm, Inc\. \fIhttps://www\.npmjs\.com\fR
 .
 .SH "I have a question or request not addressed here\. Where should I put it?"
 Post an issue on the github project:
index 3ae5101..59b75af 100644 (file)
@@ -35,5 +35,5 @@
   },
   "homepage": "https://github.com/isaacs/node-glob",
   "_id": "glob@3.2.7",
-  "_from": "glob@~3.2.6"
+  "_from": "glob@3.2.7"
 }
index 1865f92..baf957d 100644 (file)
@@ -86,6 +86,8 @@ ReaddirReq.prototype.process = function() {
 }
 
 ReaddirReq.prototype.done = function(er, files) {
+  if (files && files.sort)
+    files = files.sort()
   Req.prototype.done.call(this, er, files)
   onclose()
 }
index 1b4a21c..9de02f6 100644 (file)
@@ -6,7 +6,7 @@
   },
   "name": "graceful-fs",
   "description": "A drop-in replacement for fs, making various improvements.",
-  "version": "2.0.1",
+  "version": "2.0.2",
   "repository": {
     "type": "git",
     "url": "git://github.com/isaacs/node-graceful-fs.git"
     "EACCESS"
   ],
   "license": "BSD",
-  "readme": "# graceful-fs\n\ngraceful-fs functions as a drop-in replacement for the fs module,\nmaking various improvements.\n\nThe improvements are meant to normalize behavior across different\nplatforms and environments, and to make filesystem access more\nresilient to errors.\n\n## Improvements over fs module\n\ngraceful-fs:\n\n* Queues up `open` and `readdir` calls, and retries them once\n  something closes if there is an EMFILE error from too many file\n  descriptors.\n* fixes `lchmod` for Node versions prior to 0.6.2.\n* implements `fs.lutimes` if possible. Otherwise it becomes a noop.\n* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or\n  `lchown` if the user isn't root.\n* makes `lchmod` and `lchown` become noops, if not available.\n* retries reading a file if `read` results in EAGAIN error.\n\nOn Windows, it retries renaming a file for up to one second if `EACCESS`\nor `EPERM` error occurs, likely because antivirus software has locked\nthe directory.\n",
-  "readmeFilename": "README.md",
   "bugs": {
     "url": "https://github.com/isaacs/node-graceful-fs/issues"
   },
-  "_id": "graceful-fs@2.0.1",
-  "_from": "graceful-fs@~2.0.0"
+  "readme": "ERROR: No README data found!",
+  "homepage": "https://github.com/isaacs/node-graceful-fs",
+  "_id": "graceful-fs@2.0.2",
+  "_from": "graceful-fs@latest"
 }
diff --git a/deps/npm/node_modules/graceful-fs/test/readdir-sort.js b/deps/npm/node_modules/graceful-fs/test/readdir-sort.js
new file mode 100644 (file)
index 0000000..aeaedf1
--- /dev/null
@@ -0,0 +1,21 @@
+var test = require("tap").test
+var fs = require("fs")
+
+var readdir = fs.readdir
+fs.readdir = function(path, cb) {
+  process.nextTick(function() {
+    cb(null, ["b", "z", "a"])
+  })
+}
+
+var g = require("../")
+
+test("readdir reorder", function (t) {
+  g.readdir("whatevers", function (er, files) {
+    if (er)
+      throw er
+    console.error(files)
+    t.same(files, [ "a", "b", "z" ])
+    t.end()
+  })
+})
index f290da8..96798a1 100644 (file)
@@ -61,12 +61,12 @@ $ node my-program.js -fp --foofoo
 $ node my-program.js --foofoo -- -fp  # -- stops the flag parsing.
 { foo: "Mr. Foo", argv: { remain: ["-fp"] } }
 
-$ node my-program.js --blatzk 1000 -fp # unknown opts are ok.
-{ blatzk: 1000, flag: true, pick: true }
-
-$ node my-program.js --blatzk true -fp # but they need a value
+$ node my-program.js --blatzk -fp # unknown opts are ok.
 { blatzk: true, flag: true, pick: true }
 
+$ node my-program.js --blatzk=1000 -fp # but you need to use = if they have a value
+{ blatzk: 1000, flag: true, pick: true }
+
 $ node my-program.js --no-blatzk -fp # unless they start with "no-"
 { blatzk: false, flag: true, pick: true }
 
index 20f3b5b..0bacba6 100644 (file)
@@ -125,6 +125,7 @@ function validateString (data, k, val) {
 }
 
 function validatePath (data, k, val) {
+  if (val === true) return false
   data[k] = path.resolve(String(val))
   return true
 }
@@ -327,6 +328,9 @@ function parse (args, data, remain, types, shorthands) {
         continue
       }
 
+      if (types[arg] === String && la === undefined)
+        la = ""
+
       if (la && la.match(/^-{2,}$/)) {
         la = undefined
         i --
@@ -401,212 +405,3 @@ function resolveShort (arg, shorthands, shortAbbr, abbrevs) {
 
   return shorthands[arg]
 }
-
-if (module === require.main) {
-var assert = require("assert")
-  , util = require("util")
-
-  , shorthands =
-    { s : ["--loglevel", "silent"]
-    , d : ["--loglevel", "info"]
-    , dd : ["--loglevel", "verbose"]
-    , ddd : ["--loglevel", "silly"]
-    , noreg : ["--no-registry"]
-    , reg : ["--registry"]
-    , "no-reg" : ["--no-registry"]
-    , silent : ["--loglevel", "silent"]
-    , verbose : ["--loglevel", "verbose"]
-    , h : ["--usage"]
-    , H : ["--usage"]
-    , "?" : ["--usage"]
-    , help : ["--usage"]
-    , v : ["--version"]
-    , f : ["--force"]
-    , desc : ["--description"]
-    , "no-desc" : ["--no-description"]
-    , "local" : ["--no-global"]
-    , l : ["--long"]
-    , p : ["--parseable"]
-    , porcelain : ["--parseable"]
-    , g : ["--global"]
-    }
-
-  , types =
-    { aoa: Array
-    , nullstream: [null, Stream]
-    , date: Date
-    , str: String
-    , browser : String
-    , cache : path
-    , color : ["always", Boolean]
-    , depth : Number
-    , description : Boolean
-    , dev : Boolean
-    , editor : path
-    , force : Boolean
-    , global : Boolean
-    , globalconfig : path
-    , group : [String, Number]
-    , gzipbin : String
-    , logfd : [Number, Stream]
-    , loglevel : ["silent","win","error","warn","info","verbose","silly"]
-    , long : Boolean
-    , "node-version" : [false, String]
-    , npaturl : url
-    , npat : Boolean
-    , "onload-script" : [false, String]
-    , outfd : [Number, Stream]
-    , parseable : Boolean
-    , pre: Boolean
-    , prefix: path
-    , proxy : url
-    , "rebuild-bundle" : Boolean
-    , registry : url
-    , searchopts : String
-    , searchexclude: [null, String]
-    , shell : path
-    , t: [Array, String]
-    , tag : String
-    , tar : String
-    , tmp : path
-    , "unsafe-perm" : Boolean
-    , usage : Boolean
-    , user : String
-    , username : String
-    , userconfig : path
-    , version : Boolean
-    , viewer: path
-    , _exit : Boolean
-    }
-
-; [["-v", {version:true}, []]
-  ,["---v", {version:true}, []]
-  ,["ls -s --no-reg connect -d",
-    {loglevel:"info",registry:null},["ls","connect"]]
-  ,["ls ---s foo",{loglevel:"silent"},["ls","foo"]]
-  ,["ls --registry blargle", {}, ["ls"]]
-  ,["--no-registry", {registry:null}, []]
-  ,["--no-color true", {color:false}, []]
-  ,["--no-color false", {color:true}, []]
-  ,["--no-color", {color:false}, []]
-  ,["--color false", {color:false}, []]
-  ,["--color --logfd 7", {logfd:7,color:true}, []]
-  ,["--color=true", {color:true}, []]
-  ,["--logfd=10", {logfd:10}, []]
-  ,["--tmp=/tmp -tar=gtar",{tmp:"/tmp",tar:"gtar"},[]]
-  ,["--tmp=tmp -tar=gtar",
-    {tmp:path.resolve(process.cwd(), "tmp"),tar:"gtar"},[]]
-  ,["--logfd x", {}, []]
-  ,["a -true -- -no-false", {true:true},["a","-no-false"]]
-  ,["a -no-false", {false:false},["a"]]
-  ,["a -no-no-true", {true:true}, ["a"]]
-  ,["a -no-no-no-false", {false:false}, ["a"]]
-  ,["---NO-no-No-no-no-no-nO-no-no"+
-    "-No-no-no-no-no-no-no-no-no"+
-    "-no-no-no-no-NO-NO-no-no-no-no-no-no"+
-    "-no-body-can-do-the-boogaloo-like-I-do"
-   ,{"body-can-do-the-boogaloo-like-I-do":false}, []]
-  ,["we are -no-strangers-to-love "+
-    "--you-know=the-rules --and=so-do-i "+
-    "---im-thinking-of=a-full-commitment "+
-    "--no-you-would-get-this-from-any-other-guy "+
-    "--no-gonna-give-you-up "+
-    "-no-gonna-let-you-down=true "+
-    "--no-no-gonna-run-around false "+
-    "--desert-you=false "+
-    "--make-you-cry false "+
-    "--no-tell-a-lie "+
-    "--no-no-and-hurt-you false"
-   ,{"strangers-to-love":false
-    ,"you-know":"the-rules"
-    ,"and":"so-do-i"
-    ,"you-would-get-this-from-any-other-guy":false
-    ,"gonna-give-you-up":false
-    ,"gonna-let-you-down":false
-    ,"gonna-run-around":false
-    ,"desert-you":false
-    ,"make-you-cry":false
-    ,"tell-a-lie":false
-    ,"and-hurt-you":false
-    },["we", "are"]]
-  ,["-t one -t two -t three"
-   ,{t: ["one", "two", "three"]}
-   ,[]]
-  ,["-t one -t null -t three four five null"
-   ,{t: ["one", "null", "three"]}
-   ,["four", "five", "null"]]
-  ,["-t foo"
-   ,{t:["foo"]}
-   ,[]]
-  ,["--no-t"
-   ,{t:["false"]}
-   ,[]]
-  ,["-no-no-t"
-   ,{t:["true"]}
-   ,[]]
-  ,["-aoa one -aoa null -aoa 100"
-   ,{aoa:["one", null, 100]}
-   ,[]]
-  ,["-str 100"
-   ,{str:"100"}
-   ,[]]
-  ,["--color always"
-   ,{color:"always"}
-   ,[]]
-  ,["--no-nullstream"
-   ,{nullstream:null}
-   ,[]]
-  ,["--nullstream false"
-   ,{nullstream:null}
-   ,[]]
-  ,["--notadate=2011-01-25"
-   ,{notadate: "2011-01-25"}
-   ,[]]
-  ,["--date 2011-01-25"
-   ,{date: new Date("2011-01-25")}
-   ,[]]
-  ,["-cl 1"
-   ,{config: true, length: 1}
-   ,[]
-   ,{config: Boolean, length: Number, clear: Boolean}
-   ,{c: "--config", l: "--length"}]
-  ,["--acount bla"
-   ,{"acount":true}
-   ,["bla"]
-   ,{account: Boolean, credentials: Boolean, options: String}
-   ,{a:"--account", c:"--credentials",o:"--options"}]
-  ,["--clear"
-   ,{clear:true}
-   ,[]
-   ,{clear:Boolean,con:Boolean,len:Boolean,exp:Boolean,add:Boolean,rep:Boolean}
-   ,{c:"--con",l:"--len",e:"--exp",a:"--add",r:"--rep"}]
-  ,["--file -"
-   ,{"file":"-"}
-   ,[]
-   ,{file:String}
-   ,{}]
-  ,["--file -"
-   ,{"file":true}
-   ,["-"]
-   ,{file:Boolean}
-   ,{}]
-  ].forEach(function (test) {
-    var argv = test[0].split(/\s+/)
-      , opts = test[1]
-      , rem = test[2]
-      , actual = nopt(test[3] || types, test[4] || shorthands, argv, 0)
-      , parsed = actual.argv
-    delete actual.argv
-    console.log(util.inspect(actual, false, 2, true), parsed.remain)
-    for (var i in opts) {
-      var e = JSON.stringify(opts[i])
-        , a = JSON.stringify(actual[i] === undefined ? null : actual[i])
-      if (e && typeof e === "object") {
-        assert.deepEqual(e, a)
-      } else {
-        assert.equal(e, a)
-      }
-    }
-    assert.deepEqual(rem, parsed.remain)
-  })
-}
index d773dc6..40036f6 100644 (file)
@@ -1,6 +1,6 @@
 {
   "name": "nopt",
-  "version": "2.1.2",
+  "version": "2.2.0",
   "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.",
   "author": {
     "name": "Isaac Z. Schlueter",
@@ -9,7 +9,7 @@
   },
   "main": "lib/nopt.js",
   "scripts": {
-    "test": "node lib/nopt.js"
+    "test": "tap test/*.js"
   },
   "repository": {
     "type": "git",
   "dependencies": {
     "abbrev": "1"
   },
-  "readme": "If you want to write an option parser, and have it be good, there are\ntwo ways to do it.  The Right Way, and the Wrong Way.\n\nThe Wrong Way is to sit down and write an option parser.  We've all done\nthat.\n\nThe Right Way is to write some complex configurable program with so many\noptions that you go half-insane just trying to manage them all, and put\nit off with duct-tape solutions until you see exactly to the core of the\nproblem, and finally snap and write an awesome option parser.\n\nIf you want to write an option parser, don't write an option parser.\nWrite a package manager, or a source control system, or a service\nrestarter, or an operating system.  You probably won't end up with a\ngood one of those, but if you don't give up, and you are relentless and\ndiligent enough in your procrastination, you may just end up with a very\nnice option parser.\n\n## USAGE\n\n    // my-program.js\n    var nopt = require(\"nopt\")\n      , Stream = require(\"stream\").Stream\n      , path = require(\"path\")\n      , knownOpts = { \"foo\" : [String, null]\n                    , \"bar\" : [Stream, Number]\n                    , \"baz\" : path\n                    , \"bloo\" : [ \"big\", \"medium\", \"small\" ]\n                    , \"flag\" : Boolean\n                    , \"pick\" : Boolean\n                    , \"many\" : [String, Array]\n                    }\n      , shortHands = { \"foofoo\" : [\"--foo\", \"Mr. Foo\"]\n                     , \"b7\" : [\"--bar\", \"7\"]\n                     , \"m\" : [\"--bloo\", \"medium\"]\n                     , \"p\" : [\"--pick\"]\n                     , \"f\" : [\"--flag\"]\n                     }\n                 // everything is optional.\n                 // knownOpts and shorthands default to {}\n                 // arg list defaults to process.argv\n                 // slice defaults to 2\n      , parsed = nopt(knownOpts, shortHands, process.argv, 2)\n    console.log(parsed)\n\nThis would give you support for any of the following:\n\n```bash\n$ node my-program.js --foo \"blerp\" --no-flag\n{ \"foo\" : \"blerp\", \"flag\" : false }\n\n$ node my-program.js ---bar 7 --foo \"Mr. Hand\" --flag\n{ bar: 7, foo: \"Mr. Hand\", flag: true }\n\n$ node my-program.js --foo \"blerp\" -f -----p\n{ foo: \"blerp\", flag: true, pick: true }\n\n$ node my-program.js -fp --foofoo\n{ foo: \"Mr. Foo\", flag: true, pick: true }\n\n$ node my-program.js --foofoo -- -fp  # -- stops the flag parsing.\n{ foo: \"Mr. Foo\", argv: { remain: [\"-fp\"] } }\n\n$ node my-program.js --blatzk 1000 -fp # unknown opts are ok.\n{ blatzk: 1000, flag: true, pick: true }\n\n$ node my-program.js --blatzk true -fp # but they need a value\n{ blatzk: true, flag: true, pick: true }\n\n$ node my-program.js --no-blatzk -fp # unless they start with \"no-\"\n{ blatzk: false, flag: true, pick: true }\n\n$ node my-program.js --baz b/a/z # known paths are resolved.\n{ baz: \"/Users/isaacs/b/a/z\" }\n\n# if Array is one of the types, then it can take many\n# values, and will always be an array.  The other types provided\n# specify what types are allowed in the list.\n\n$ node my-program.js --many 1 --many null --many foo\n{ many: [\"1\", \"null\", \"foo\"] }\n\n$ node my-program.js --many foo\n{ many: [\"foo\"] }\n```\n\nRead the tests at the bottom of `lib/nopt.js` for more examples of\nwhat this puppy can do.\n\n## Types\n\nThe following types are supported, and defined on `nopt.typeDefs`\n\n* String: A normal string.  No parsing is done.\n* path: A file system path.  Gets resolved against cwd if not absolute.\n* url: A url.  If it doesn't parse, it isn't accepted.\n* Number: Must be numeric.\n* Date: Must parse as a date. If it does, and `Date` is one of the options,\n  then it will return a Date object, not a string.\n* Boolean: Must be either `true` or `false`.  If an option is a boolean,\n  then it does not need a value, and its presence will imply `true` as\n  the value.  To negate boolean flags, do `--no-whatever` or `--whatever\n  false`\n* NaN: Means that the option is strictly not allowed.  Any value will\n  fail.\n* Stream: An object matching the \"Stream\" class in node.  Valuable\n  for use when validating programmatically.  (npm uses this to let you\n  supply any WriteStream on the `outfd` and `logfd` config options.)\n* Array: If `Array` is specified as one of the types, then the value\n  will be parsed as a list of options.  This means that multiple values\n  can be specified, and that the value will always be an array.\n\nIf a type is an array of values not on this list, then those are\nconsidered valid values.  For instance, in the example above, the\n`--bloo` option can only be one of `\"big\"`, `\"medium\"`, or `\"small\"`,\nand any other value will be rejected.\n\nWhen parsing unknown fields, `\"true\"`, `\"false\"`, and `\"null\"` will be\ninterpreted as their JavaScript equivalents, and numeric values will be\ninterpreted as a number.\n\nYou can also mix types and values, or multiple types, in a list.  For\ninstance `{ blah: [Number, null] }` would allow a value to be set to\neither a Number or null.  When types are ordered, this implies a\npreference, and the first type that can be used to properly interpret\nthe value will be used.\n\nTo define a new type, add it to `nopt.typeDefs`.  Each item in that\nhash is an object with a `type` member and a `validate` method.  The\n`type` member is an object that matches what goes in the type list.  The\n`validate` method is a function that gets called with `validate(data,\nkey, val)`.  Validate methods should assign `data[key]` to the valid\nvalue of `val` if it can be handled properly, or return boolean\n`false` if it cannot.\n\nYou can also call `nopt.clean(data, types, typeDefs)` to clean up a\nconfig object and remove its invalid properties.\n\n## Error Handling\n\nBy default, nopt outputs a warning to standard error when invalid\noptions are found.  You can change this behavior by assigning a method\nto `nopt.invalidHandler`.  This method will be called with\nthe offending `nopt.invalidHandler(key, val, types)`.\n\nIf no `nopt.invalidHandler` is assigned, then it will console.error\nits whining.  If it is assigned to boolean `false` then the warning is\nsuppressed.\n\n## Abbreviations\n\nYes, they are supported.  If you define options like this:\n\n```javascript\n{ \"foolhardyelephants\" : Boolean\n, \"pileofmonkeys\" : Boolean }\n```\n\nThen this will work:\n\n```bash\nnode program.js --foolhar --pil\nnode program.js --no-f --pileofmon\n# etc.\n```\n\n## Shorthands\n\nShorthands are a hash of shorter option names to a snippet of args that\nthey expand to.\n\nIf multiple one-character shorthands are all combined, and the\ncombination does not unambiguously match any other option or shorthand,\nthen they will be broken up into their constituent parts.  For example:\n\n```json\n{ \"s\" : [\"--loglevel\", \"silent\"]\n, \"g\" : \"--global\"\n, \"f\" : \"--force\"\n, \"p\" : \"--parseable\"\n, \"l\" : \"--long\"\n}\n```\n\n```bash\nnpm ls -sgflp\n# just like doing this:\nnpm ls --loglevel silent --global --force --long --parseable\n```\n\n## The Rest of the args\n\nThe config object returned by nopt is given a special member called\n`argv`, which is an object with the following fields:\n\n* `remain`: The remaining args after all the parsing has occurred.\n* `original`: The args as they originally appeared.\n* `cooked`: The args after flags and shorthands are expanded.\n\n## Slicing\n\nNode programs are called with more or less the exact argv as it appears\nin C land, after the v8 and node-specific options have been plucked off.\nAs such, `argv[0]` is always `node` and `argv[1]` is always the\nJavaScript program being run.\n\nThat's usually not very useful to you.  So they're sliced off by\ndefault.  If you want them, then you can pass in `0` as the last\nargument, or any other number that you'd like to slice off the start of\nthe list.\n",
+  "devDependencies": {
+    "tap": "~0.4.8"
+  },
+  "readme": "If you want to write an option parser, and have it be good, there are\ntwo ways to do it.  The Right Way, and the Wrong Way.\n\nThe Wrong Way is to sit down and write an option parser.  We've all done\nthat.\n\nThe Right Way is to write some complex configurable program with so many\noptions that you go half-insane just trying to manage them all, and put\nit off with duct-tape solutions until you see exactly to the core of the\nproblem, and finally snap and write an awesome option parser.\n\nIf you want to write an option parser, don't write an option parser.\nWrite a package manager, or a source control system, or a service\nrestarter, or an operating system.  You probably won't end up with a\ngood one of those, but if you don't give up, and you are relentless and\ndiligent enough in your procrastination, you may just end up with a very\nnice option parser.\n\n## USAGE\n\n    // my-program.js\n    var nopt = require(\"nopt\")\n      , Stream = require(\"stream\").Stream\n      , path = require(\"path\")\n      , knownOpts = { \"foo\" : [String, null]\n                    , \"bar\" : [Stream, Number]\n                    , \"baz\" : path\n                    , \"bloo\" : [ \"big\", \"medium\", \"small\" ]\n                    , \"flag\" : Boolean\n                    , \"pick\" : Boolean\n                    , \"many\" : [String, Array]\n                    }\n      , shortHands = { \"foofoo\" : [\"--foo\", \"Mr. Foo\"]\n                     , \"b7\" : [\"--bar\", \"7\"]\n                     , \"m\" : [\"--bloo\", \"medium\"]\n                     , \"p\" : [\"--pick\"]\n                     , \"f\" : [\"--flag\"]\n                     }\n                 // everything is optional.\n                 // knownOpts and shorthands default to {}\n                 // arg list defaults to process.argv\n                 // slice defaults to 2\n      , parsed = nopt(knownOpts, shortHands, process.argv, 2)\n    console.log(parsed)\n\nThis would give you support for any of the following:\n\n```bash\n$ node my-program.js --foo \"blerp\" --no-flag\n{ \"foo\" : \"blerp\", \"flag\" : false }\n\n$ node my-program.js ---bar 7 --foo \"Mr. Hand\" --flag\n{ bar: 7, foo: \"Mr. Hand\", flag: true }\n\n$ node my-program.js --foo \"blerp\" -f -----p\n{ foo: \"blerp\", flag: true, pick: true }\n\n$ node my-program.js -fp --foofoo\n{ foo: \"Mr. Foo\", flag: true, pick: true }\n\n$ node my-program.js --foofoo -- -fp  # -- stops the flag parsing.\n{ foo: \"Mr. Foo\", argv: { remain: [\"-fp\"] } }\n\n$ node my-program.js --blatzk -fp # unknown opts are ok.\n{ blatzk: true, flag: true, pick: true }\n\n$ node my-program.js --blatzk=1000 -fp # but you need to use = if they have a value\n{ blatzk: 1000, flag: true, pick: true }\n\n$ node my-program.js --no-blatzk -fp # unless they start with \"no-\"\n{ blatzk: false, flag: true, pick: true }\n\n$ node my-program.js --baz b/a/z # known paths are resolved.\n{ baz: \"/Users/isaacs/b/a/z\" }\n\n# if Array is one of the types, then it can take many\n# values, and will always be an array.  The other types provided\n# specify what types are allowed in the list.\n\n$ node my-program.js --many 1 --many null --many foo\n{ many: [\"1\", \"null\", \"foo\"] }\n\n$ node my-program.js --many foo\n{ many: [\"foo\"] }\n```\n\nRead the tests at the bottom of `lib/nopt.js` for more examples of\nwhat this puppy can do.\n\n## Types\n\nThe following types are supported, and defined on `nopt.typeDefs`\n\n* String: A normal string.  No parsing is done.\n* path: A file system path.  Gets resolved against cwd if not absolute.\n* url: A url.  If it doesn't parse, it isn't accepted.\n* Number: Must be numeric.\n* Date: Must parse as a date. If it does, and `Date` is one of the options,\n  then it will return a Date object, not a string.\n* Boolean: Must be either `true` or `false`.  If an option is a boolean,\n  then it does not need a value, and its presence will imply `true` as\n  the value.  To negate boolean flags, do `--no-whatever` or `--whatever\n  false`\n* NaN: Means that the option is strictly not allowed.  Any value will\n  fail.\n* Stream: An object matching the \"Stream\" class in node.  Valuable\n  for use when validating programmatically.  (npm uses this to let you\n  supply any WriteStream on the `outfd` and `logfd` config options.)\n* Array: If `Array` is specified as one of the types, then the value\n  will be parsed as a list of options.  This means that multiple values\n  can be specified, and that the value will always be an array.\n\nIf a type is an array of values not on this list, then those are\nconsidered valid values.  For instance, in the example above, the\n`--bloo` option can only be one of `\"big\"`, `\"medium\"`, or `\"small\"`,\nand any other value will be rejected.\n\nWhen parsing unknown fields, `\"true\"`, `\"false\"`, and `\"null\"` will be\ninterpreted as their JavaScript equivalents, and numeric values will be\ninterpreted as a number.\n\nYou can also mix types and values, or multiple types, in a list.  For\ninstance `{ blah: [Number, null] }` would allow a value to be set to\neither a Number or null.  When types are ordered, this implies a\npreference, and the first type that can be used to properly interpret\nthe value will be used.\n\nTo define a new type, add it to `nopt.typeDefs`.  Each item in that\nhash is an object with a `type` member and a `validate` method.  The\n`type` member is an object that matches what goes in the type list.  The\n`validate` method is a function that gets called with `validate(data,\nkey, val)`.  Validate methods should assign `data[key]` to the valid\nvalue of `val` if it can be handled properly, or return boolean\n`false` if it cannot.\n\nYou can also call `nopt.clean(data, types, typeDefs)` to clean up a\nconfig object and remove its invalid properties.\n\n## Error Handling\n\nBy default, nopt outputs a warning to standard error when invalid\noptions are found.  You can change this behavior by assigning a method\nto `nopt.invalidHandler`.  This method will be called with\nthe offending `nopt.invalidHandler(key, val, types)`.\n\nIf no `nopt.invalidHandler` is assigned, then it will console.error\nits whining.  If it is assigned to boolean `false` then the warning is\nsuppressed.\n\n## Abbreviations\n\nYes, they are supported.  If you define options like this:\n\n```javascript\n{ \"foolhardyelephants\" : Boolean\n, \"pileofmonkeys\" : Boolean }\n```\n\nThen this will work:\n\n```bash\nnode program.js --foolhar --pil\nnode program.js --no-f --pileofmon\n# etc.\n```\n\n## Shorthands\n\nShorthands are a hash of shorter option names to a snippet of args that\nthey expand to.\n\nIf multiple one-character shorthands are all combined, and the\ncombination does not unambiguously match any other option or shorthand,\nthen they will be broken up into their constituent parts.  For example:\n\n```json\n{ \"s\" : [\"--loglevel\", \"silent\"]\n, \"g\" : \"--global\"\n, \"f\" : \"--force\"\n, \"p\" : \"--parseable\"\n, \"l\" : \"--long\"\n}\n```\n\n```bash\nnpm ls -sgflp\n# just like doing this:\nnpm ls --loglevel silent --global --force --long --parseable\n```\n\n## The Rest of the args\n\nThe config object returned by nopt is given a special member called\n`argv`, which is an object with the following fields:\n\n* `remain`: The remaining args after all the parsing has occurred.\n* `original`: The args as they originally appeared.\n* `cooked`: The args after flags and shorthands are expanded.\n\n## Slicing\n\nNode programs are called with more or less the exact argv as it appears\nin C land, after the v8 and node-specific options have been plucked off.\nAs such, `argv[0]` is always `node` and `argv[1]` is always the\nJavaScript program being run.\n\nThat's usually not very useful to you.  So they're sliced off by\ndefault.  If you want them, then you can pass in `0` as the last\nargument, or any other number that you'd like to slice off the start of\nthe list.\n",
   "readmeFilename": "README.md",
   "bugs": {
     "url": "https://github.com/isaacs/nopt/issues"
   },
-  "_id": "nopt@2.1.2",
+  "homepage": "https://github.com/isaacs/nopt",
+  "_id": "nopt@2.2.0",
   "_from": "nopt@latest"
 }
diff --git a/deps/npm/node_modules/nopt/test/basic.js b/deps/npm/node_modules/nopt/test/basic.js
new file mode 100644 (file)
index 0000000..1a67894
--- /dev/null
@@ -0,0 +1,235 @@
+var nopt = require("../")
+  , test = require('tap').test
+
+
+test("passing a string results in a string", function (t) {
+  var parsed = nopt({ key: String }, {}, ["--key", "myvalue"], 0)
+  t.same(parsed.key, "myvalue")
+  t.end()
+})
+
+// https://github.com/npm/nopt/issues/31
+test("Empty String results in empty string, not true", function (t) {
+  var parsed = nopt({ empty: String }, {}, ["--empty"], 0)
+  t.same(parsed.empty, "")
+  t.end()
+})
+
+test("other tests", function (t) {
+
+  var util = require("util")
+    , Stream = require("stream")
+    , path = require("path")
+    , url = require("url")
+
+    , shorthands =
+      { s : ["--loglevel", "silent"]
+      , d : ["--loglevel", "info"]
+      , dd : ["--loglevel", "verbose"]
+      , ddd : ["--loglevel", "silly"]
+      , noreg : ["--no-registry"]
+      , reg : ["--registry"]
+      , "no-reg" : ["--no-registry"]
+      , silent : ["--loglevel", "silent"]
+      , verbose : ["--loglevel", "verbose"]
+      , h : ["--usage"]
+      , H : ["--usage"]
+      , "?" : ["--usage"]
+      , help : ["--usage"]
+      , v : ["--version"]
+      , f : ["--force"]
+      , desc : ["--description"]
+      , "no-desc" : ["--no-description"]
+      , "local" : ["--no-global"]
+      , l : ["--long"]
+      , p : ["--parseable"]
+      , porcelain : ["--parseable"]
+      , g : ["--global"]
+      }
+
+    , types =
+      { aoa: Array
+      , nullstream: [null, Stream]
+      , date: Date
+      , str: String
+      , browser : String
+      , cache : path
+      , color : ["always", Boolean]
+      , depth : Number
+      , description : Boolean
+      , dev : Boolean
+      , editor : path
+      , force : Boolean
+      , global : Boolean
+      , globalconfig : path
+      , group : [String, Number]
+      , gzipbin : String
+      , logfd : [Number, Stream]
+      , loglevel : ["silent","win","error","warn","info","verbose","silly"]
+      , long : Boolean
+      , "node-version" : [false, String]
+      , npaturl : url
+      , npat : Boolean
+      , "onload-script" : [false, String]
+      , outfd : [Number, Stream]
+      , parseable : Boolean
+      , pre: Boolean
+      , prefix: path
+      , proxy : url
+      , "rebuild-bundle" : Boolean
+      , registry : url
+      , searchopts : String
+      , searchexclude: [null, String]
+      , shell : path
+      , t: [Array, String]
+      , tag : String
+      , tar : String
+      , tmp : path
+      , "unsafe-perm" : Boolean
+      , usage : Boolean
+      , user : String
+      , username : String
+      , userconfig : path
+      , version : Boolean
+      , viewer: path
+      , _exit : Boolean
+      , path: path
+      }
+
+  ; [["-v", {version:true}, []]
+    ,["---v", {version:true}, []]
+    ,["ls -s --no-reg connect -d",
+      {loglevel:"info",registry:null},["ls","connect"]]
+    ,["ls ---s foo",{loglevel:"silent"},["ls","foo"]]
+    ,["ls --registry blargle", {}, ["ls"]]
+    ,["--no-registry", {registry:null}, []]
+    ,["--no-color true", {color:false}, []]
+    ,["--no-color false", {color:true}, []]
+    ,["--no-color", {color:false}, []]
+    ,["--color false", {color:false}, []]
+    ,["--color --logfd 7", {logfd:7,color:true}, []]
+    ,["--color=true", {color:true}, []]
+    ,["--logfd=10", {logfd:10}, []]
+    ,["--tmp=/tmp -tar=gtar",{tmp:"/tmp",tar:"gtar"},[]]
+    ,["--tmp=tmp -tar=gtar",
+      {tmp:path.resolve(process.cwd(), "tmp"),tar:"gtar"},[]]
+    ,["--logfd x", {}, []]
+    ,["a -true -- -no-false", {true:true},["a","-no-false"]]
+    ,["a -no-false", {false:false},["a"]]
+    ,["a -no-no-true", {true:true}, ["a"]]
+    ,["a -no-no-no-false", {false:false}, ["a"]]
+    ,["---NO-no-No-no-no-no-nO-no-no"+
+      "-No-no-no-no-no-no-no-no-no"+
+      "-no-no-no-no-NO-NO-no-no-no-no-no-no"+
+      "-no-body-can-do-the-boogaloo-like-I-do"
+     ,{"body-can-do-the-boogaloo-like-I-do":false}, []]
+    ,["we are -no-strangers-to-love "+
+      "--you-know=the-rules --and=so-do-i "+
+      "---im-thinking-of=a-full-commitment "+
+      "--no-you-would-get-this-from-any-other-guy "+
+      "--no-gonna-give-you-up "+
+      "-no-gonna-let-you-down=true "+
+      "--no-no-gonna-run-around false "+
+      "--desert-you=false "+
+      "--make-you-cry false "+
+      "--no-tell-a-lie "+
+      "--no-no-and-hurt-you false"
+     ,{"strangers-to-love":false
+      ,"you-know":"the-rules"
+      ,"and":"so-do-i"
+      ,"you-would-get-this-from-any-other-guy":false
+      ,"gonna-give-you-up":false
+      ,"gonna-let-you-down":false
+      ,"gonna-run-around":false
+      ,"desert-you":false
+      ,"make-you-cry":false
+      ,"tell-a-lie":false
+      ,"and-hurt-you":false
+      },["we", "are"]]
+    ,["-t one -t two -t three"
+     ,{t: ["one", "two", "three"]}
+     ,[]]
+    ,["-t one -t null -t three four five null"
+     ,{t: ["one", "null", "three"]}
+     ,["four", "five", "null"]]
+    ,["-t foo"
+     ,{t:["foo"]}
+     ,[]]
+    ,["--no-t"
+     ,{t:["false"]}
+     ,[]]
+    ,["-no-no-t"
+     ,{t:["true"]}
+     ,[]]
+    ,["-aoa one -aoa null -aoa 100"
+     ,{aoa:["one", null, 100]}
+     ,[]]
+    ,["-str 100"
+     ,{str:"100"}
+     ,[]]
+    ,["--color always"
+     ,{color:"always"}
+     ,[]]
+    ,["--no-nullstream"
+     ,{nullstream:null}
+     ,[]]
+    ,["--nullstream false"
+     ,{nullstream:null}
+     ,[]]
+    ,["--notadate=2011-01-25"
+     ,{notadate: "2011-01-25"}
+     ,[]]
+    ,["--date 2011-01-25"
+     ,{date: new Date("2011-01-25")}
+     ,[]]
+    ,["-cl 1"
+     ,{config: true, length: 1}
+     ,[]
+     ,{config: Boolean, length: Number, clear: Boolean}
+     ,{c: "--config", l: "--length"}]
+    ,["--acount bla"
+     ,{"acount":true}
+     ,["bla"]
+     ,{account: Boolean, credentials: Boolean, options: String}
+     ,{a:"--account", c:"--credentials",o:"--options"}]
+    ,["--clear"
+     ,{clear:true}
+     ,[]
+     ,{clear:Boolean,con:Boolean,len:Boolean,exp:Boolean,add:Boolean,rep:Boolean}
+     ,{c:"--con",l:"--len",e:"--exp",a:"--add",r:"--rep"}]
+    ,["--file -"
+     ,{"file":"-"}
+     ,[]
+     ,{file:String}
+     ,{}]
+    ,["--file -"
+     ,{"file":true}
+     ,["-"]
+     ,{file:Boolean}
+     ,{}]
+    ,["--path"
+     ,{"path":null}
+     ,[]]
+    ,["--path ."
+     ,{"path":process.cwd()}
+     ,[]]
+    ].forEach(function (test) {
+      var argv = test[0].split(/\s+/)
+        , opts = test[1]
+        , rem = test[2]
+        , actual = nopt(test[3] || types, test[4] || shorthands, argv, 0)
+        , parsed = actual.argv
+      delete actual.argv
+      for (var i in opts) {
+        var e = JSON.stringify(opts[i])
+          , a = JSON.stringify(actual[i] === undefined ? null : actual[i])
+        if (e && typeof e === "object") {
+          t.deepEqual(e, a)
+        } else {
+          t.equal(e, a)
+        }
+      }
+      t.deepEqual(rem, parsed.remain)
+    })
+  t.end()
+})
index 2684063..aebf71d 100644 (file)
@@ -81,7 +81,8 @@ function adduser (username, password, email, cb) {
 
         this.log.verbose("adduser", "update existing user")
         return this.request('GET'
-          , '/-/user/org.couchdb.user:'+encodeURIComponent(username)
+          , '/-/user/org.couchdb.user:'+encodeURIComponent(username) +
+            '?write=true'
           , function (er, data, json, response) {
               if (er || data.error) {
                 return cb(er, data, json, response)
index 221e8ad..4a2f9af 100644 (file)
@@ -14,7 +14,7 @@ function deprecate (name, ver, message, cb) {
 
   var users = {}
 
-  this.get(name, function (er, data) {
+  this.get(name + '?write=true', function (er, data) {
     if (er) return cb(er)
     // filter all the versions that match
     Object.keys(data.versions).filter(function (v) {
index eeb716e..bb6d525 100644 (file)
@@ -31,9 +31,15 @@ function get (uri, timeout, nofollow, staleOk, cb) {
 
   var cacheUri = uri
   // on windows ":" is not an allowed character in a foldername
-  cacheUri = cacheUri.replace(/:/g, '_')
+  cacheUri = cacheUri.replace(/:/g, '_').replace(/\?write=true$/, '')
   var cache = path.join(this.conf.get('cache'), cacheUri, ".cache.json")
 
+  // If the GET is part of a write operation (PUT or DELETE), then
+  // skip past the cache entirely, but still save the results.
+  if (uri.match(/\?write=true$/))
+    return get_.call(this, uri, timeout, cache, null, null, nofollow, staleOk, cb)
+
+
   fs.stat(cache, function (er, stat) {
     if (!er) fs.readFile(cache, function (er, data) {
       try { data = JSON.parse(data) }
index acc0ca8..d6525eb 100644 (file)
@@ -18,8 +18,8 @@ function publish (data, tarball, cb) {
     return cb(er)
   }
 
-  if (data.name !== encodeURIComponent(data.name).toLowerCase())
-    return cb(new Error('invalid name: must be lowercase and url-safe'))
+  if (data.name !== encodeURIComponent(data.name))
+    return cb(new Error('invalid name: must be url-safe'))
 
   var ver = semver.clean(data.version)
   if (!ver)
@@ -95,7 +95,8 @@ function putFirst (data, tardata, stat, username, email, cb) {
       return cb(er, parsed, json, res)
 
     // let's see what versions are already published.
-    this.request("GET", data.name, function (er, current) {
+    var getUrl = data.name + "?write=true"
+    this.request("GET", getUrl, function (er, current) {
       if (er)
         return cb(er)
       putNext.call(this, data.version, root, current, cb)
index 5b7ab4a..5c2375d 100644 (file)
@@ -7,7 +7,7 @@ function star (package, starred, cb) {
 
   var users = {}
 
-  this.request("GET", package, function (er, fullData) {
+  this.request("GET", package + '?write=true', function (er, fullData) {
     if (er) return cb(er)
 
     fullData = { _id: fullData._id
index 9aaac1b..4bbbb34 100644 (file)
@@ -14,7 +14,8 @@ var semver = require("semver")
 function unpublish (name, ver, cb) {
   if (typeof cb !== "function") cb = ver, ver = null
 
-  this.get(name, null, -1, true, function (er, data) {
+  var u = name + '?write=true'
+  this.get(u, null, -1, true, function (er, data) {
     if (er) {
       this.log.info("unpublish", name+" not published")
       return cb()
index d9e22e2..70869bc 100644 (file)
@@ -6,7 +6,7 @@
   },
   "name": "npm-registry-client",
   "description": "Client for the npm registry",
-  "version": "0.4.0",
+  "version": "0.4.4",
   "repository": {
     "url": "git://github.com/isaacs/npm-registry-client"
   },
     "url": "https://github.com/isaacs/npm-registry-client/issues"
   },
   "homepage": "https://github.com/isaacs/npm-registry-client",
-  "_id": "npm-registry-client@0.4.0",
-  "dist": {
-    "shasum": "30d0c178b7f2e54183a6a3fc9fe4071eb10290bf"
-  },
-  "_from": "npm-registry-client@0.4.0",
-  "_resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-0.4.0.tgz"
+  "_id": "npm-registry-client@0.4.4",
+  "_from": "npm-registry-client@latest"
 }
index 03a1edb..1d70c5a 100644 (file)
@@ -32,7 +32,7 @@ tap.test("update a user acct", function (t) {
     res.json({error: "conflict"})
   })
 
-  server.expect("GET", "/-/user/org.couchdb.user:username", function (req, res) {
+  server.expect("GET", "/-/user/org.couchdb.user:username?write=true", function (req, res) {
     t.equal(req.method, "GET")
     res.json(userdata)
   })
index 0170a6f..011fbaf 100644 (file)
@@ -36,7 +36,7 @@ tap.test("publish again", function (t) {
     })
   })
 
-  server.expect("/npm-registry-client", function (req, res) {
+  server.expect("/npm-registry-client?write=true", function (req, res) {
     t.equal(req.method, "GET")
     t.ok(lastTime)
     for (var i in lastTime.versions) {
index 616371e..535a849 100644 (file)
@@ -5,12 +5,21 @@ structure with all the data.
 
 npm uses this.
 
+## 1.0.0
+
+Breaking changes in `1.0.0`:
+
+The second argument is now an `Object` that contains the following keys:
+
+ * `depth` optional, defaults to Infinity
+ * `log` optional log Function
+ * `dev` optional, dev=true to mark devDeps as extraneous
+
 ## Usage
 
 ```javascript
 var readInstalled = require("read-installed")
-// depth is optional, defaults to Infinity
-readInstalled(folder, depth, logFunction, function (er, data) {
+readInstalled(folder, { depth, log, dev }, function (er, data) {
   ...
 })
 ```
index 41f16e2..16836d2 100644 (file)
@@ -1,23 +1,39 @@
 {
   "name": "read-installed",
   "description": "Read all the installed packages in a folder, and return a tree structure with all the data.",
-  "version": "0.2.5",
+  "version": "1.0.0",
   "repository": {
     "type": "git",
     "url": "git://github.com/isaacs/read-installed"
   },
   "main": "read-installed.js",
   "scripts": {
-    "test": "node test/basic.js"
+    "test": "tap ./test/"
   },
   "dependencies": {
     "semver": "2",
     "slide": "~1.1.3",
-    "read-package-json": "1"
+    "read-package-json": "1",
+    "graceful-fs": "~2"
   },
   "optionalDependencies": {
     "graceful-fs": "~2"
   },
-  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
-  "license": "ISC"
+  "author": {
+    "name": "Isaac Z. Schlueter",
+    "email": "i@izs.me",
+    "url": "http://blog.izs.me/"
+  },
+  "license": "ISC",
+  "devDependencies": {
+    "tap": "~0.4.8"
+  },
+  "readme": "# read-installed\n\nRead all the installed packages in a folder, and return a tree\nstructure with all the data.\n\nnpm uses this.\n\n## 1.0.0\n\nBreaking changes in `1.0.0`:\n\nThe second argument is now an `Object` that contains the following keys:\n\n * `depth` optional, defaults to Infinity\n * `log` optional log Function\n * `dev` optional, dev=true to mark devDeps as extraneous\n\n## Usage\n\n```javascript\nvar readInstalled = require(\"read-installed\")\nreadInstalled(folder, { depth, log, dev }, function (er, data) {\n  ...\n})\n```\n",
+  "readmeFilename": "README.md",
+  "bugs": {
+    "url": "https://github.com/isaacs/read-installed/issues"
+  },
+  "homepage": "https://github.com/isaacs/read-installed",
+  "_id": "read-installed@1.0.0",
+  "_from": "read-installed@latest"
 }
index 2920d7d..9ca482d 100644 (file)
@@ -101,17 +101,14 @@ var url = require("url")
 
 module.exports = readInstalled
 
-function readInstalled (folder, depth_, log_, cb_) {
-  var depth = Infinity, log = function () {}, cb
-  for (var i = 1; i < arguments.length - 1; i++) {
-    if (typeof arguments[i] === 'number')
-      depth = arguments[i]
-    else if (typeof arguments[i] === 'function')
-      log = arguments[i]
+function readInstalled (folder, opts, cb) {
+  if (typeof opts === 'function') {
+    cb = opts
+    opts = {}
   }
-  cb = arguments[i]
+  var depth = Infinity || opts.depth, log = function () {} || opts.log, dev = false || opts.dev
 
-  readInstalled_(folder, null, null, null, 0, depth, function (er, obj) {
+  readInstalled_(folder, null, null, null, 0, depth, dev, function (er, obj) {
     if (er) return cb(er)
     // now obj has all the installed things, where they're installed
     // figure out the inheritance links, now that the object is built.
@@ -121,7 +118,7 @@ function readInstalled (folder, depth_, log_, cb_) {
 }
 
 var rpSeen = {}
-function readInstalled_ (folder, parent, name, reqver, depth, maxDepth, cb) {
+function readInstalled_ (folder, parent, name, reqver, depth, maxDepth, dev, cb) {
   var installed
     , obj
     , real
@@ -177,7 +174,7 @@ function readInstalled_ (folder, parent, name, reqver, depth, maxDepth, cb) {
     obj.realName = name || obj.name
     obj.dependencies = obj.dependencies || {}
 
-    // "foo":"http://blah" is always presumed valid
+    // "foo":"http://blah" and "foo":"latest" are always presumed valid
     if (reqver
         && semver.validRange(reqver, true)
         && !semver.satisfies(obj.version, reqver, true)) {
@@ -186,7 +183,7 @@ function readInstalled_ (folder, parent, name, reqver, depth, maxDepth, cb) {
 
     if (parent
         && !(name in parent.dependencies)
-        && !(name in (parent.devDependencies || {}))) {
+        && (dev || !(name in (parent.devDependencies || {})))) {
       obj.extraneous = true
     }
     obj.path = obj.path || folder
@@ -198,7 +195,7 @@ function readInstalled_ (folder, parent, name, reqver, depth, maxDepth, cb) {
     //if (depth >= maxDepth) return cb(null, obj)
     asyncMap(installed, function (pkg, cb) {
       var rv = obj.dependencies[pkg]
-      if (!rv && obj.devDependencies) rv = obj.devDependencies[pkg]
+      if (!rv && obj.devDependencies && !dev) rv = obj.devDependencies[pkg]
       if (depth >= maxDepth) {
         // just try to get the version number
         var pkgfolder = path.resolve(folder, "node_modules", pkg)
@@ -220,6 +217,7 @@ function readInstalled_ (folder, parent, name, reqver, depth, maxDepth, cb) {
 
       readInstalled_( path.resolve(folder, "node_modules/"+pkg)
                     , obj, pkg, obj.dependencies[pkg], depth + 1, maxDepth
+                    , dev
                     , cb )
 
     }, function (er, installedData) {
@@ -285,9 +283,9 @@ function findUnmet (obj, log) {
           r = r.link ? null : r.parent
           continue
         }
+        // "foo":"http://blah" and "foo":"latest" are always presumed valid
         if ( typeof deps[d] === "string"
-            // url deps presumed innocent.
-            && !url.parse(deps[d]).protocol
+            && semver.validRange(deps[d], true)
             && !semver.satisfies(found.version, deps[d], true)) {
           // the bad thing will happen
           log("unmet dependency", obj.path + " requires "+d+"@'"+deps[d]
index 2b0c039..a6c5ff5 100644 (file)
@@ -1,15 +1,26 @@
 var readInstalled = require("../read-installed.js")
-var util = require("util")
-console.error("testing")
+var json = require("../package.json")
+var known = [].concat(Object.keys(json.dependencies)
+  , Object.keys(json.optionalDependencies)
+  , Object.keys(json.devDependencies)).sort()
+var test = require("tap").test
+var path = require("path")
 
-var called = 0
-readInstalled(process.cwd(), console.error, function (er, map) {
-  console.error(called ++)
-  if (er) return console.error(er.stack || er.message)
-  cleanup(map)
-  console.error(util.inspect(map, true, 10, true))
+test("make sure that it works", function (t) {
+  readInstalled(path.join(__dirname, "../"), {
+    log: console.error
+  }, function (er, map) {
+    t.notOk(er, "er should be bull")
+    t.ok(map, "map should be data")
+    if (er) return console.error(er.stack || er.message)
+    cleanup(map)
+    var deps = Object.keys(map.dependencies).sort()
+    t.equal(known.length, deps.length, "array lengths are equal")
+    t.deepEqual(known, deps, "arrays should be equal")
+    t.notOk(map.dependencies.tap.extraneous, 'extraneous not set on devDep')
+    t.end()
+  })
 })
-
 var seen = []
 function cleanup (map) {
   if (seen.indexOf(map) !== -1) return
diff --git a/deps/npm/node_modules/read-installed/test/dev.js b/deps/npm/node_modules/read-installed/test/dev.js
new file mode 100644 (file)
index 0000000..1047617
--- /dev/null
@@ -0,0 +1,22 @@
+var readInstalled = require("../read-installed.js")
+var test = require("tap").test
+var json = require("../package.json")
+var path = require("path")
+var known = [].concat(Object.keys(json.dependencies)
+  , Object.keys(json.optionalDependencies)
+  , Object.keys(json.devDependencies)).sort()
+
+test("make sure that it works without dev deps", function (t) {
+  readInstalled(path.join(__dirname, "../"), {
+    log: console.error
+    , dev: true }, function (er, map) {
+    t.notOk(er, "er should be bull")
+    t.ok(map, "map should be data")
+    if (er) return console.error(er.stack || er.message)
+    var deps = Object.keys(map.dependencies).sort()
+    t.equal(deps.length, known.length, "array lengths are equal")
+    t.deepEqual(deps, known, "arrays should be equal")
+    t.ok(map.dependencies.tap.extraneous, 'extraneous is set on devDep')
+    t.end()
+  })
+})
diff --git a/deps/npm/node_modules/read-installed/test/fixtures/peer-at-latest/node_modules/strong-task-emitter/package.json b/deps/npm/node_modules/read-installed/test/fixtures/peer-at-latest/node_modules/strong-task-emitter/package.json
new file mode 100644 (file)
index 0000000..8824f53
--- /dev/null
@@ -0,0 +1,10 @@
+{
+  "name": "strong-task-emitter",
+  "version": "0.0.4",
+  "dependencies": {
+    "debug": "latest"
+  },
+  "_id": "strong-task-emitter@0.0.4",
+  "_from": "strong-task-emitter@0.0.4",
+  "_resolved": "https://registry.npmjs.org/strong-task-emitter/-/strong-task-emitter-0.0.4.tgz"
+}
diff --git a/deps/npm/node_modules/read-installed/test/noargs.js b/deps/npm/node_modules/read-installed/test/noargs.js
new file mode 100644 (file)
index 0000000..0de5ba4
--- /dev/null
@@ -0,0 +1,21 @@
+var readInstalled = require("../read-installed.js")
+var test = require("tap").test
+var json = require("../package.json")
+var path = require("path")
+var known = [].concat(Object.keys(json.dependencies)
+  , Object.keys(json.optionalDependencies)
+  , Object.keys(json.devDependencies)).sort()
+
+test("make sure that it works without dev deps", function (t) {
+  readInstalled(path.join(__dirname, "../"), function (er, map) {
+    t.notOk(er, "er should be bull")
+    t.ok(map, "map should be data")
+    if (er) return console.error(er.stack || er.message)
+    var deps = Object.keys(map.dependencies).sort()
+    t.equal(deps.length, known.length, "array lengths are equal")
+    t.deepEqual(deps, known, "arrays should be equal")
+    t.notOk(map.dependencies.tap.extraneous, 'extraneous is set on devDep')
+    t.end()
+  })
+})
+
diff --git a/deps/npm/node_modules/read-installed/test/peer-dep-at-latest.js b/deps/npm/node_modules/read-installed/test/peer-dep-at-latest.js
new file mode 100644 (file)
index 0000000..8f2436f
--- /dev/null
@@ -0,0 +1,14 @@
+var readInstalled = require('../read-installed.js')
+var test = require('tap').test
+var path = require('path');
+
+test('"latest" version is valid', function(t) {
+  // This test verifies npm#3860
+  readInstalled(
+    path.join(__dirname, 'fixtures/peer-at-latest'),
+    { log: console.error },
+    function(err, map) {
+      t.notOk(map.dependencies.debug.invalid, 'debug@latest is satisfied by a peer')
+      t.end()
+    })
+})
index e1d2eea..2820020 100644 (file)
@@ -1,5 +1,5 @@
 {
-  "version": "1.4.0",
+  "version": "1.4.3",
   "name": "npm",
   "publishConfig": {
     "proprietary-attribs": false
@@ -38,9 +38,9 @@
     "ini": "~1.1.0",
     "slide": "~1.1.5",
     "abbrev": "~1.0.4",
-    "graceful-fs": "~2.0.0",
+    "graceful-fs": "^2.0.2",
     "minimatch": "~0.2.14",
-    "nopt": "~2.1.2",
+    "nopt": "^2.2.0",
     "rimraf": "~2.2.5",
     "request": "~2.30.0",
     "which": "1",
     "chownr": "0",
     "npmlog": "0.0.6",
     "ansi": "~0.2.1",
-    "npm-registry-client": "~0.4.0",
+    "npm-registry-client": "^0.4.4",
     "read-package-json": "~1.1.7",
-    "read-installed": "~0.2.2",
-    "glob": "~3.2.6",
+    "read-installed": "~1.0.0",
+    "glob": "3.2.7",
     "init-package-json": "0.0.14",
     "osenv": "0",
     "lockfile": "~0.4.0",
index 7a0a45f..7484045 100755 (executable)
@@ -17,7 +17,16 @@ if [ "x$0" = "xsh" ]; then
   # on some systems, you can just do cat>npm-install.sh
   # which is a bit cuter.  But on others, &1 is already closed,
   # so catting to another script file won't do anything.
-  curl -s https://npmjs.org/install.sh > npm-install-$$.sh
+  # Follow Location: headers, and fail on errors
+  curl -f -L -s https://www.npmjs.org/install.sh > npm-install-$$.sh
+  ret=$?
+  if [ $ret -eq 0 ]; then
+    (exit 0)
+  else
+    rm npm-install-$$.sh
+    echo "Failed to download script" >&2
+    exit $ret
+  fi
   sh npm-install-$$.sh
   ret=$?
   rm npm-install-$$.sh
index 3f57bf0..9a8b31a 100644 (file)
@@ -6,7 +6,7 @@ var test = require("tap").test
   , rimraf = require("rimraf")
 
 test("dedupe finds the common module and moves it up one level", function (t) {
-  t.plan(1)
+  t.plan(2)
 
   setup(function () {
     npm.install(".", function (err) {
@@ -14,6 +14,7 @@ test("dedupe finds the common module and moves it up one level", function (t) {
       npm.dedupe(function(err) {
         if (err) return t.fail(err)
         t.ok(existsSync(path.join(__dirname, "dedupe", "node_modules", "minimist")))
+        t.ok(!existsSync(path.join(__dirname, "dedupe", "node_modules", "prime")))
       })
     })
   })
index 842d4b2..d0f79ff 100644 (file)
@@ -4,6 +4,8 @@
   "version": "0.0.0",
   "dependencies": {
     "optimist": "0.6.0",
-    "clean": "2.1.6"
+    "clean": "2.1.6",
+    "informal": "0.0.1",
+    "pathogen": "0.1.5"
   }
 }
diff --git a/deps/npm/test/tap/git-cache-locking.js b/deps/npm/test/tap/git-cache-locking.js
new file mode 100644 (file)
index 0000000..cfea78d
--- /dev/null
@@ -0,0 +1,43 @@
+var test = require("tap").test
+  , path = require("path")
+  , rimraf = require("rimraf")
+  , mkdirp = require("mkdirp")
+  , spawn = require("child_process").spawn
+  , npm = require.resolve("../../bin/npm-cli.js")
+  , node = process.execPath
+  , pkg = path.resolve(__dirname, "git-cache-locking")
+  , tmp = path.join(pkg, "tmp")
+  , cache = path.join(pkg, "cache")
+
+test("git-cache-locking: install a git dependency", function (t) {
+  t.plan(1)
+
+  cleanup()
+  mkdirp.sync(cache)
+  mkdirp.sync(tmp)
+
+  // package c depends on a.git#master and b.git#master
+  // package b depends on a.git#master
+  var child = spawn(node, [npm, "install", "git://github.com/nigelzor/npm-4503-c.git"], {
+    cwd: pkg,
+    env: {
+      npm_config_cache: cache,
+      npm_config_tmp: tmp,
+      npm_config_prefix: pkg,
+      npm_config_global: "false",
+      HOME: process.env.HOME,
+      Path: process.env.PATH,
+      PATH: process.env.PATH
+    },
+    stdio: "inherit"
+  })
+
+  child.on("close", function (code) {
+    t.equal(0, code, "npm install should succeed")
+    cleanup()
+  })
+})
+
+function cleanup() {
+  rimraf.sync(pkg)
+}
diff --git a/deps/npm/test/tap/install-at-locally.js b/deps/npm/test/tap/install-at-locally.js
new file mode 100644 (file)
index 0000000..18ea6c3
--- /dev/null
@@ -0,0 +1,43 @@
+var common = require('../common-tap.js')
+var test = require('tap').test
+var npm = require('../../')
+var osenv = require('osenv')
+var path = require('path')
+var fs = require('fs')
+var rimraf = require('rimraf')
+var mkdirp = require('mkdirp')
+var pkg = path.join(__dirname, 'install-at-locally')
+
+test("setup", function (t) {
+  mkdirp.sync(pkg)
+  mkdirp.sync(path.resolve(pkg, 'node_modules'))
+  process.chdir(pkg)
+  t.end()
+})
+
+test('"npm install ./package@1.2.3" should install local pkg', function(t) {
+  npm.load(function() {
+    npm.commands.install(['./package@1.2.3'], function(err) {
+      var p = path.resolve(pkg, 'node_modules/install-at-locally/package.json')
+      t.ok(JSON.parse(fs.readFileSync(p, 'utf8')))
+      t.end()
+    })
+  })
+})
+
+test('"npm install install/at/locally@./package@1.2.3" should install local pkg', function(t) {
+  npm.load(function() {
+    npm.commands.install(['./package@1.2.3'], function(err) {
+      var p = path.resolve(pkg, 'node_modules/install-at-locally/package.json')
+      t.ok(JSON.parse(fs.readFileSync(p, 'utf8')))
+      t.end()
+    })
+  })
+})
+
+test('cleanup', function(t) {
+  process.chdir(__dirname)
+  rimraf.sync(path.resolve(pkg, 'node_modules'))
+  t.end()
+})
+
diff --git a/deps/npm/test/tap/install-at-locally/package@1.2.3/package.json b/deps/npm/test/tap/install-at-locally/package@1.2.3/package.json
new file mode 100644 (file)
index 0000000..b11d00c
--- /dev/null
@@ -0,0 +1,5 @@
+{
+  "name": "install-at-locally",
+  "version": "0.0.0",
+  "description": "Test for 404-parent"
+}
diff --git a/deps/npm/test/tap/npm-api-not-loaded-error.js b/deps/npm/test/tap/npm-api-not-loaded-error.js
new file mode 100644 (file)
index 0000000..3fd0731
--- /dev/null
@@ -0,0 +1,47 @@
+var test = require("tap").test
+var npm = require("../..")
+var path = require("path")
+var rimraf = require("rimraf")
+var npmrc = path.join(__dirname, "npmrc")
+var fs = require("fs")
+
+test("setup", function (t) {
+  fs.writeFileSync(npmrc, "foo = bar\n", "ascii")
+  t.end()
+})
+
+test("calling set/get on config pre-load should throw", function (t) {
+  var threw = true
+  try {
+    npm.config.get("foo")
+    threw = false
+  } catch (er) {
+    t.equal(er.message, "npm.load() required")
+  } finally {
+    t.ok(threw, "get before load should throw")
+  }
+
+  var threw = true
+  try {
+    npm.config.set("foo", "bar")
+    threw = false
+  } catch (er) {
+    t.equal(er.message, "npm.load() required")
+  } finally {
+    t.ok(threw, "set before load should throw")
+  }
+
+  npm.load({ userconfig: npmrc }, function (er) {
+    if (er)
+      throw er
+    t.equal(npm.config.get("foo"), "bar")
+    npm.config.set("foo", "baz")
+    t.equal(npm.config.get("foo"), "baz")
+    t.end()
+  })
+})
+
+test("cleanup", function (t) {
+  rimraf.sync(npmrc)
+  t.end()
+})
diff --git a/deps/npm/test/tap/outdated-color.js b/deps/npm/test/tap/outdated-color.js
new file mode 100644 (file)
index 0000000..e729d56
--- /dev/null
@@ -0,0 +1,41 @@
+var common = require("../common-tap.js")
+var test = require("tap").test
+var npm = require("../../")
+var mkdirp = require("mkdirp")
+var rimraf = require("rimraf")
+var mr = require("npm-registry-mock")
+var exec = require('child_process').exec
+
+var pkg = __dirname + '/outdated'
+var NPM_BIN = __dirname + '/../../bin/npm-cli.js'
+mkdirp.sync(pkg + "/cache")
+
+function hasControlCodes(str) {
+  return str.length !== ansiTrim(str).length
+}
+
+function ansiTrim (str) {
+  var r = new RegExp("\x1b(?:\\[(?:\\d+[ABCDEFGJKSTm]|\\d+;\\d+[Hfm]|" +
+        "\\d+;\\d+;\\d+m|6n|s|u|\\?25[lh])|\\w)", "g");
+  return str.replace(r, "")
+}
+
+// note hard to automate tests for color = true
+// as npm kills the color config when it detects
+// it's not running in a tty
+test("does not use ansi styling", function (t) {
+  t.plan(3)
+  exec('node ' + NPM_BIN + ' outdated --color false', {
+    cwd: pkg
+  }, function(err, stdout) {
+    t.ifError(err)
+    t.ok(stdout, stdout.length)
+    t.ok(!hasControlCodes(stdout)) 
+  })
+})
+
+test("cleanup", function (t) {
+  rimraf.sync(pkg + "/cache")
+  t.end()
+})
+
index dda2abc..933e3b0 100644 (file)
@@ -12,13 +12,14 @@ mkdirp.sync(pkg + "/cache")
 
 test("dicovers new versions in outdated", function (t) {
   process.chdir(pkg)
-  t.plan(4)
+  t.plan(5)
   npm.load({cache: pkg + "/cache", registry: common.registry}, function () {
     npm.outdated(function (er, d) {
       t.equal('git', d[0][3])
       t.equal('git', d[0][4])
       t.equal('git://github.com/robertkowalski/foo-private.git', d[0][5])
       t.equal('git://user:pass@github.com/robertkowalski/foo-private.git', d[1][5])
+      t.equal('git://github.com/robertkowalski/foo', d[2][5])
     })
   })
 })
index e160a21..209936d 100644 (file)
@@ -6,6 +6,7 @@
   "main": "index.js",
   "dependencies": {
     "foo-private": "git://github.com/robertkowalski/foo-private.git",
-    "foo-private-credentials": "git://user:pass@github.com/robertkowalski/foo-private.git"
+    "foo-private-credentials": "git://user:pass@github.com/robertkowalski/foo-private.git",
+    "foo-github": "robertkowalski/foo"
   }
 }
index 3a9951b..dddec77 100644 (file)
@@ -8,19 +8,41 @@ var mr = require("npm-registry-mock")
 // config
 var pkg = __dirname + '/outdated'
 
+var path = require("path")
+
 test("it should not throw", function (t) {
   cleanup()
   process.chdir(pkg)
 
+  var originalLog = console.log
+  var output = []
+  var expOut = [ path.resolve(__dirname, "outdated/node_modules/underscore")
+               , path.resolve(__dirname, "outdated/node_modules/underscore")
+               + ":underscore@1.3.1"
+               + ":underscore@1.3.1"
+               + ":underscore@1.5.1" ]
+  var expData = [ [ path.resolve(__dirname, "outdated")
+                  , "underscore"
+                  , "1.3.1"
+                  , "1.3.1"
+                  , "1.5.1"
+                  , "1.3.1" ] ]
+
+  console.log = function () {
+    output.push.apply(output, arguments)
+  }
   mr(common.port, function (s) {
     npm.load({
       cache: pkg + "/cache",
       loglevel: 'silent',
+      parseable: true,
       registry: common.registry }
     , function () {
       npm.install(".", function (err) {
         npm.outdated(function (er, d) {
-          console.log(d)
+          console.log = originalLog
+          t.same(output, expOut)
+          t.same(d, expData)
           s.close()
           t.end()
         })
diff --git a/deps/npm/test/tap/prune.js b/deps/npm/test/tap/prune.js
new file mode 100644 (file)
index 0000000..acfdc42
--- /dev/null
@@ -0,0 +1,107 @@
+var test = require("tap").test
+var fs = require("fs")
+var node = process.execPath
+var npm = require.resolve("../../bin/npm-cli.js")
+var rimraf = require("rimraf")
+var mr = require("npm-registry-mock")
+var common = require("../common-tap.js")
+var spawn = require("child_process").spawn
+
+var pkg = __dirname + "/prune"
+
+var server
+
+test("reg mock", function (t) {
+  mr(common.port, function (s) {
+    server = s
+    t.pass("registry mock started")
+    t.end()
+  })
+})
+
+test("npm install", function (t) {
+  var c = spawn(node, [
+    npm, "install",
+    "--registry=" + common.registry,
+    "--loglevel=silent",
+    "--production=false"
+  ], { cwd: pkg })
+  c.stderr.on("data", function(d) {
+    t.fail("Should not get data on stderr: " + d)
+  })
+  c.on("close", function(code) {
+    t.notOk(code, "exit ok")
+    t.end()
+  })
+})
+
+test("npm install test-package", function (t) {
+  var c = spawn(node, [
+    npm, "install", "test-package",
+    "--registry=" + common.registry,
+    "--loglevel=silent",
+    "--production=false"
+  ], { cwd: pkg })
+  c.stderr.on("data", function(d) {
+    t.fail("Should not get data on stderr: " + d)
+  })
+  c.on("close", function(code) {
+    t.notOk(code, "exit ok")
+    t.end()
+  })
+})
+
+test("verify installs", function (t) {
+  var dirs = fs.readdirSync(pkg + "/node_modules").sort()
+  t.same(dirs, [ "test-package", "mkdirp", "underscore" ].sort())
+  t.end()
+})
+
+test("npm prune", function (t) {
+  var c = spawn(node, [
+    npm, "prune",
+    "--loglevel=silent",
+    "--production=false"
+  ], { cwd: pkg })
+  c.stderr.on("data", function(d) {
+    t.fail("Should not get data on stderr: " + d)
+  })
+  c.on("close", function(code) {
+    t.notOk(code, "exit ok")
+    t.end()
+  })
+})
+
+test("verify installs", function (t) {
+  var dirs = fs.readdirSync(pkg + "/node_modules").sort()
+  t.same(dirs, [ "mkdirp", "underscore" ])
+  t.end()
+})
+
+test("npm prune", function (t) {
+  var c = spawn(node, [
+    npm, "prune",
+    "--loglevel=silent",
+    "--production"
+  ], { cwd: pkg })
+  c.stderr.on("data", function(d) {
+    t.fail("Should not get data on stderr: " + d)
+  })
+  c.on("close", function(code) {
+    t.notOk(code, "exit ok")
+    t.end()
+  })
+})
+
+test("verify installs", function (t) {
+  var dirs = fs.readdirSync(pkg + "/node_modules").sort()
+  t.same(dirs, [ "underscore" ])
+  t.end()
+})
+
+test("cleanup", function (t) {
+  server.close()
+  rimraf.sync(pkg + "/node_modules")
+  t.pass("cleaned up")
+  t.end()
+})
diff --git a/deps/npm/test/tap/prune/package.json b/deps/npm/test/tap/prune/package.json
new file mode 100644 (file)
index 0000000..641ab65
--- /dev/null
@@ -0,0 +1,13 @@
+{
+  "name": "bla",
+  "description": "fixture",
+  "version": "0.0.1",
+  "main": "index.js",
+  "dependencies": {
+    "underscore": "1.3.1"
+  },
+  "devDependencies": {
+    "mkdirp": "*"
+  },
+  "repository": "git://github.com/robertkowalski/bogusfixture"
+}
diff --git a/deps/npm/test/tap/repo.js b/deps/npm/test/tap/repo.js
new file mode 100644 (file)
index 0000000..44671e7
--- /dev/null
@@ -0,0 +1,52 @@
+if (process.platform === "win32") {
+  console.error("skipping test, because windows and shebangs")
+  return
+}
+
+var common = require("../common-tap.js")
+var mr = require("npm-registry-mock")
+
+var test = require("tap").test
+var npm = require.resolve("../../bin/npm-cli.js")
+var node = process.execPath
+var rimraf = require("rimraf")
+var spawn = require("child_process").spawn
+var fs = require("fs")
+
+test("setup", function (t) {
+  var s = "#!/usr/bin/env bash\n" +
+          "echo \"$@\" > " + JSON.stringify(__dirname) + "/_output\n"
+  fs.writeFileSync(__dirname + "/_script.sh", s, "ascii")
+  fs.chmodSync(__dirname + "/_script.sh", "0755")
+  t.pass("made script")
+  t.end()
+})
+
+test("npm repo underscore", function (t) {
+  mr(common.port, function (s) {
+    var c = spawn(node, [
+      npm, "repo", "underscore",
+      "--registry=" + common.registry,
+      "--loglevel=silent",
+      "--browser=" + __dirname + "/_script.sh",
+    ])
+    c.stdout.on("data", function(d) {
+      t.fail("Should not get data on stdout: " + d)
+    })
+    c.stderr.pipe(process.stderr)
+    c.on("close", function(code) {
+      t.equal(code, 0, "exit ok")
+      var res = fs.readFileSync(__dirname + "/_output", "ascii")
+      s.close()
+      t.equal(res, "https://github.com/jashkenas/underscore\n")
+      t.end()
+    })
+  })
+})
+
+test("cleanup", function (t) {
+  fs.unlinkSync(__dirname + "/_script.sh")
+  fs.unlinkSync(__dirname + "/_output")
+  t.pass("cleaned up")
+  t.end()
+})
diff --git a/deps/npm/test/tap/shrinkwrap-dev-dependency.js b/deps/npm/test/tap/shrinkwrap-dev-dependency.js
new file mode 100644 (file)
index 0000000..fc606cf
--- /dev/null
@@ -0,0 +1,66 @@
+var npm = npm = require("../../")
+var test = require("tap").test
+var path = require("path")
+var fs = require("fs")
+var osenv = require("osenv")
+var rimraf = require("rimraf")
+var mr = require("npm-registry-mock")
+var common = require("../common-tap.js")
+
+var pkg = path.resolve(__dirname, "shrinkwrap-dev-dependency")
+var desiredResultsPath = path.resolve(pkg, "desired-shrinkwrap-results.json")
+
+test("shrinkwrap doesn't strip out the dependency", function (t) {
+  t.plan(1)
+
+  mr(common.port, function (s) {
+    setup({ production: true }, function (err) {
+      if (err) return t.fail(err)
+
+      npm.install(".", function (err) {
+        if (err) return t.fail(err)
+
+        npm.commands.shrinkwrap([], true, function (err, results) {
+          if (err) return t.fail(err)
+
+          fs.readFile(desiredResultsPath, function (err, desired) {
+            if (err) return t.fail(err)
+
+            t.deepEqual(results, JSON.parse(desired))
+            s.close()
+            t.end()
+          })
+        })
+      })
+    })
+  })
+})
+
+test("cleanup", function (t) {
+  cleanup()
+  t.end()
+})
+
+
+function setup (opts, cb) {
+  cleanup()
+  process.chdir(pkg)
+
+  var allOpts = {
+    cache: path.resolve(pkg, "cache"),
+    registry: common.registry
+  }
+
+  for (var key in opts) {
+    allOpts[key] = opts[key]
+  }
+
+  npm.load(allOpts, cb)
+}
+
+function cleanup () {
+  process.chdir(osenv.tmpdir())
+  rimraf.sync(path.resolve(pkg, "node_modules"))
+  rimraf.sync(path.resolve(pkg, "cache"))
+  rimraf.sync(path.resolve(pkg, "npm-shrinkwrap.json"))
+}
diff --git a/deps/npm/test/tap/shrinkwrap-dev-dependency/desired-shrinkwrap-results.json b/deps/npm/test/tap/shrinkwrap-dev-dependency/desired-shrinkwrap-results.json
new file mode 100644 (file)
index 0000000..7f87e83
--- /dev/null
@@ -0,0 +1,12 @@
+{
+  "name": "npm-test-shrinkwrap-dev-dependency",
+  "version": "0.0.0",
+  "dependencies": {
+    "request": {
+      "version": "0.9.0"
+    },
+    "underscore": {
+      "version": "1.3.1"
+    }
+  }
+}
diff --git a/deps/npm/test/tap/shrinkwrap-dev-dependency/package.json b/deps/npm/test/tap/shrinkwrap-dev-dependency/package.json
new file mode 100644 (file)
index 0000000..e325a47
--- /dev/null
@@ -0,0 +1,12 @@
+{
+  "author": "Domenic Denicola",
+  "name": "npm-test-shrinkwrap-dev-dependency",
+  "version": "0.0.0",
+  "dependencies": {
+    "request": "0.9.0",
+    "underscore": "1.3.1"
+  },
+  "devDependencies": {
+    "underscore": "1.5.1"
+  }
+}
diff --git a/deps/npm/test/tap/shrinkwrap-shared-dev-dependency.js b/deps/npm/test/tap/shrinkwrap-shared-dev-dependency.js
new file mode 100644 (file)
index 0000000..75f1765
--- /dev/null
@@ -0,0 +1,58 @@
+var npm = npm = require("../../")
+var test = require("tap").test
+var path = require("path")
+var fs = require("fs")
+var osenv = require("osenv")
+var rimraf = require("rimraf")
+var mr = require("npm-registry-mock")
+var common = require("../common-tap.js")
+
+var pkg = path.resolve(__dirname, "shrinkwrap-shared-dev-dependency")
+var desiredResultsPath = path.resolve(pkg, "desired-shrinkwrap-results.json")
+
+test("shrinkwrap doesn't strip out the shared dependency", function (t) {
+  t.plan(1)
+
+  mr(common.port, function (s) {
+    setup(function (err) {
+      if (err) return t.fail(err)
+
+      npm.install(".", function (err) {
+        if (err) return t.fail(err)
+
+        npm.commands.shrinkwrap([], true, function (err, results) {
+          if (err) return t.fail(err)
+
+          fs.readFile(desiredResultsPath, function (err, desired) {
+            if (err) return t.fail(err)
+
+            t.deepEqual(results, JSON.parse(desired))
+            s.close()
+            t.end()
+          })
+        })
+      })
+    })
+  })
+})
+
+test("cleanup", function (t) {
+  cleanup()
+  t.end()
+})
+
+
+function setup (cb) {
+  cleanup()
+  process.chdir(pkg)
+
+  var opts = { cache: path.resolve(pkg, "cache"), registry: common.registry }
+  npm.load(opts, cb)
+}
+
+function cleanup () {
+  process.chdir(osenv.tmpdir())
+  rimraf.sync(path.resolve(pkg, "node_modules"))
+  rimraf.sync(path.resolve(pkg, "cache"))
+  rimraf.sync(path.resolve(pkg, "npm-shrinkwrap.json"))
+}
diff --git a/deps/npm/test/tap/shrinkwrap-shared-dev-dependency/desired-shrinkwrap-results.json b/deps/npm/test/tap/shrinkwrap-shared-dev-dependency/desired-shrinkwrap-results.json
new file mode 100644 (file)
index 0000000..230b687
--- /dev/null
@@ -0,0 +1,12 @@
+{
+  "name": "npm-test-shrinkwrap-shared-dev-dependency",
+  "version": "0.0.0",
+  "dependencies": {
+    "test-package-with-one-dep": {
+      "version": "0.0.0"
+    },
+    "test-package": {
+      "version": "0.0.0"
+    }
+  }
+}
diff --git a/deps/npm/test/tap/shrinkwrap-shared-dev-dependency/package.json b/deps/npm/test/tap/shrinkwrap-shared-dev-dependency/package.json
new file mode 100644 (file)
index 0000000..41260ac
--- /dev/null
@@ -0,0 +1,11 @@
+{
+  "author": "Domenic Denicola",
+  "name": "npm-test-shrinkwrap-shared-dev-dependency",
+  "version": "0.0.0",
+  "dependencies": {
+    "test-package-with-one-dep": "0.0.0"
+  },
+  "devDependencies": {
+    "test-package": "0.0.0"
+  }
+}