From e79ccee1685393e4ec73746bac93835cbcf3a809 Mon Sep 17 00:00:00 2001
From: Forrest L Norvell node package manager a JavaScript package manager This is just enough info to get you up and running. There's a pretty robust install script at
-https://www.npmjs.org/install.sh. You can download that and run it. Here's an example using curl: You can set any npm configuration params with that script: You can download a zip file from https://npmjs.org/dist/, and unpack it
+ You can download a zip file from https://github.com/npm/npm/releases, and unpack it
in the same folder where node.exe lives. The latest version in a zip file is 1.4.12. To upgrade to npm 2, follow the
+Windows upgrade instructions in the npm Troubleshooting Guide: https://github.com/npm/npm/wiki/Troubleshooting#upgrading-on-windows If that's not fancy enough for you, then you can fetch the code with
git, and mess with it directly. No. tl;dr As of version 0.3, it is recommended to run npm as root.
-This allows npm to change the user identifier to the If you are not the root user, or if you are on a platform that does not
-support uid switching, then npm will not attempt to change the userid. If you would like to ensure that npm always runs scripts as the
-"nobody" user, and have it fail if it cannot downgrade permissions, then
-set the following configuration param: This will prevent running in unsafe mode, even as non-root users. So sad to see you go. Check out the docs,
-especially the faq. Check out the docs,
+especially the faq. You can use the If you're a developer, and you want to use npm to publish your program,
-you should read this "npm" and "The npm Registry" are owned by npm, Inc.
All rights reserved. See the included LICENSE file for more details. If you have a complaint about a package in the public npm registry,
-and cannot resolve it with the package
+and cannot resolve it with the package
owner, please email
-support@npmjs.com and explain the situation. 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. Be sure to include all of the output from the npm command that didn't work
as expected. The List packages in the global install prefix instead of in the current
project. Note, if parseable is set or long isn't set, then duplicates will be trimmed.
-This means that if a submodule a same dependency as a parent module, then the
+This means that if a submodule has the same dependency as a parent module, then the
dependency will only be output once.npm
npm
SYNOPSIS
Fancy Install (Unix)
curl -L https://npmjs.org/install.sh | sh
+
curl -L https://npmjs.com/install.sh | sh
Slightly Fancier
npm_config_prefix=/some/path sh install.sh
@@ -45,31 +45,16 @@ If you plan on hacking on npm,
make link
is your friend.
arbitrary config keys using the ./configure --key=val ...
, and then
run npm commands by doing node cli.js <cmd> <args>
. (This is helpful
for testing, or running stuff without actually installing npm itself.)
-Fancy Windows Install
-Windows Install or Upgrade
+Installing on Cygwin
Permissions when Using npm to Install Other Stuff
-
-
-sudo
for greater safety. Or don't, if you prefer not to.More details...
-nobody
user prior
-to running any package build or test commands.npm config set unsafe-perm false
-
Uninstalling
sudo npm uninstall npm -g
@@ -122,11 +107,11 @@ change the value for all npm commands in that process.
command line arguments using nopt. You may also want to check out
npm
help config
to learn about all the options you can set there.
More Docs
-npm help
command to read any of them.Legal Stuff
npm-debug.log
file is also helpful to provide.
-
+
diff --git a/deps/npm/html/doc/api/npm-bin.html b/deps/npm/html/doc/api/npm-bin.html
index a256124756..6ca184d672 100644
--- a/deps/npm/html/doc/api/npm-bin.html
+++ b/deps/npm/html/doc/api/npm-bin.html
@@ -28,5 +28,5 @@ to the npm.bin
property.
-
+
diff --git a/deps/npm/html/doc/api/npm-bugs.html b/deps/npm/html/doc/api/npm-bugs.html
index 9cf2cc4131..07aafe2c72 100644
--- a/deps/npm/html/doc/api/npm-bugs.html
+++ b/deps/npm/html/doc/api/npm-bugs.html
@@ -33,5 +33,5 @@ friendly for programmatic use.
-
+
diff --git a/deps/npm/html/doc/api/npm-cache.html b/deps/npm/html/doc/api/npm-cache.html
index 6dfc4a0e5c..77fb38f396 100644
--- a/deps/npm/html/doc/api/npm-cache.html
+++ b/deps/npm/html/doc/api/npm-cache.html
@@ -42,5 +42,5 @@ incrementation.
-
+
diff --git a/deps/npm/html/doc/api/npm-commands.html b/deps/npm/html/doc/api/npm-commands.html
index 3f3ae544e9..98071c601a 100644
--- a/deps/npm/html/doc/api/npm-commands.html
+++ b/deps/npm/html/doc/api/npm-commands.html
@@ -36,5 +36,5 @@ usage, or man 3 npm-<command>
for programmatic usage.
-
+
diff --git a/deps/npm/html/doc/api/npm-config.html b/deps/npm/html/doc/api/npm-config.html
index 3767a46aca..f72789eef1 100644
--- a/deps/npm/html/doc/api/npm-config.html
+++ b/deps/npm/html/doc/api/npm-config.html
@@ -57,5 +57,5 @@ functions instead.
-
+
diff --git a/deps/npm/html/doc/api/npm-deprecate.html b/deps/npm/html/doc/api/npm-deprecate.html
index a235c2baa9..76381b99ee 100644
--- a/deps/npm/html/doc/api/npm-deprecate.html
+++ b/deps/npm/html/doc/api/npm-deprecate.html
@@ -47,5 +47,5 @@ a deprecation warning to all who attempt to install it.
-
+
diff --git a/deps/npm/html/doc/api/npm-docs.html b/deps/npm/html/doc/api/npm-docs.html
index 222b90e70a..08a9a712a3 100644
--- a/deps/npm/html/doc/api/npm-docs.html
+++ b/deps/npm/html/doc/api/npm-docs.html
@@ -33,5 +33,5 @@ friendly for programmatic use.
-
+
diff --git a/deps/npm/html/doc/api/npm-edit.html b/deps/npm/html/doc/api/npm-edit.html
index aa3d7bdb0b..ab9a7ede33 100644
--- a/deps/npm/html/doc/api/npm-edit.html
+++ b/deps/npm/html/doc/api/npm-edit.html
@@ -36,5 +36,5 @@ and how this is used.
-
+
diff --git a/deps/npm/html/doc/api/npm-explore.html b/deps/npm/html/doc/api/npm-explore.html
index fbfd0cccc2..0c76406555 100644
--- a/deps/npm/html/doc/api/npm-explore.html
+++ b/deps/npm/html/doc/api/npm-explore.html
@@ -31,5 +31,5 @@ sure to use npm rebuild <pkg>
if you make any changes.
-
+
diff --git a/deps/npm/html/doc/api/npm-help-search.html b/deps/npm/html/doc/api/npm-help-search.html
index 886d0c5acb..c1c4bb1b3a 100644
--- a/deps/npm/html/doc/api/npm-help-search.html
+++ b/deps/npm/html/doc/api/npm-help-search.html
@@ -44,5 +44,5 @@ Name of the file that matched
-
+
diff --git a/deps/npm/html/doc/api/npm-init.html b/deps/npm/html/doc/api/npm-init.html
index 80b14a41df..52fe45e073 100644
--- a/deps/npm/html/doc/api/npm-init.html
+++ b/deps/npm/html/doc/api/npm-init.html
@@ -39,5 +39,5 @@ then go ahead and use this programmatically.
-
+
diff --git a/deps/npm/html/doc/api/npm-install.html b/deps/npm/html/doc/api/npm-install.html
index 43cf4f166f..f001913097 100644
--- a/deps/npm/html/doc/api/npm-install.html
+++ b/deps/npm/html/doc/api/npm-install.html
@@ -32,5 +32,5 @@ installed or when an error has been encountered.
-
+
diff --git a/deps/npm/html/doc/api/npm-link.html b/deps/npm/html/doc/api/npm-link.html
index c41a31c9b4..ffc909cbb2 100644
--- a/deps/npm/html/doc/api/npm-link.html
+++ b/deps/npm/html/doc/api/npm-link.html
@@ -42,5 +42,5 @@ the package in the current working directory
-
+
diff --git a/deps/npm/html/doc/api/npm-load.html b/deps/npm/html/doc/api/npm-load.html
index fbf22994f6..8a442887bb 100644
--- a/deps/npm/html/doc/api/npm-load.html
+++ b/deps/npm/html/doc/api/npm-load.html
@@ -37,5 +37,5 @@ config object.
-
+
diff --git a/deps/npm/html/doc/api/npm-ls.html b/deps/npm/html/doc/api/npm-ls.html
index e221bab4a0..c74f8d5a63 100644
--- a/deps/npm/html/doc/api/npm-ls.html
+++ b/deps/npm/html/doc/api/npm-ls.html
@@ -49,7 +49,7 @@ taken if it is serialized to JSON.
Start a package
+Restart a package
npm.commands.restart(packages, callback)
This runs a package's "restart" script, if one was provided. -Otherwise it runs package's "stop" script, if one was provided, and then -the "start" script.
+This restarts a package (or multiple packages).
+This runs a package's "stop", "restart", and "start" scripts, and associated +pre- and post- scripts, in the order given below:
+If no version is specified, then it restarts the "active" version.
-npm can run tests on multiple packages. Just specify multiple packages
-in the packages
parameter.
npm can restart multiple packages. Just specify multiple packages in
+the packages
parameter.
Note that the "restart" script is run in addition to the "stop" +and "start" scripts, not instead of them.
+This is the behavior as of npm
major version 2. A change in this
+behavior will be accompanied by an increase in major version number
packages
parameter.
npm.commands.start(packages, callback)
This runs a package's "start" script, if one was provided.
-npm can run tests on multiple packages. Just specify multiple packages
-in the packages
parameter.
npm can start multiple packages. Just specify multiple packages in the
+packages
parameter.
packages
parameter.
packages
parameter.
packages
parameter.
2.1.6
+2.1.18
This is the API documentation for npm.
To find documentation of the command line
@@ -109,5 +109,5 @@ method names. Use the npm.deref
method to find the real name.
.npmrc
file. If no registry is specified,
the default registry will be used (see npm-config(7)
).
The username, password, and email are read in from prompts.
-You may use this command to change your email address, but not username -or password.
-To reset your password, go to https://www.npmjs.org/forgot
+To reset your password, go to https://www.npmjs.com/forgot
+To change your email address, go to https://www.npmjs.com/email-edit
You may use this command multiple times with the same user account to -authorize on a new machine.
+authorize on a new machine. When authenticating on a new machine, +the username, password and email address must all match with +your existing record.npm login
is an alias to adduser
and behaves exactly the same way.
--registry
and / or --scopenpm adduser --registry=http://private-registry.example.com --always-auth
This will ensure that all requests to that registry (including for tarballs)
include an authorization header. See always-auth
in npm-config(7)
for more
-details on always-auth. Registry-specific configuaration of always-auth
takes
+details on always-auth. Registry-specific configuration of always-auth
takes
precedence over any global configuration.
SEE ALSO
@@ -67,5 +68,5 @@ precedence over any global configuration.
-
+
diff --git a/deps/npm/html/doc/cli/npm-bin.html b/deps/npm/html/doc/cli/npm-bin.html
index 7f6e3a5c0d..e47afcd0c2 100644
--- a/deps/npm/html/doc/cli/npm-bin.html
+++ b/deps/npm/html/doc/cli/npm-bin.html
@@ -35,5 +35,5 @@
-
+
diff --git a/deps/npm/html/doc/cli/npm-bugs.html b/deps/npm/html/doc/cli/npm-bugs.html
index 7758efa726..e32ec4a77b 100644
--- a/deps/npm/html/doc/cli/npm-bugs.html
+++ b/deps/npm/html/doc/cli/npm-bugs.html
@@ -54,5 +54,5 @@ a package.json
in the current folder and use the name
-
+
diff --git a/deps/npm/html/doc/cli/npm-build.html b/deps/npm/html/doc/cli/npm-build.html
index ca62cb2465..c1ae15ec43 100644
--- a/deps/npm/html/doc/cli/npm-build.html
+++ b/deps/npm/html/doc/cli/npm-build.html
@@ -38,5 +38,5 @@ A folder containing a package.json
file in its root.
-
+
diff --git a/deps/npm/html/doc/cli/npm-bundle.html b/deps/npm/html/doc/cli/npm-bundle.html
index 9b833d0b6d..ea7506aa4d 100644
--- a/deps/npm/html/doc/cli/npm-bundle.html
+++ b/deps/npm/html/doc/cli/npm-bundle.html
@@ -31,5 +31,5 @@ install packages into the local space.
-
+
diff --git a/deps/npm/html/doc/cli/npm-cache.html b/deps/npm/html/doc/cli/npm-cache.html
index 53835b35db..226cbf3555 100644
--- a/deps/npm/html/doc/cli/npm-cache.html
+++ b/deps/npm/html/doc/cli/npm-cache.html
@@ -81,5 +81,5 @@ they do not make an HTTP request to the registry.
-
+
diff --git a/deps/npm/html/doc/cli/npm-completion.html b/deps/npm/html/doc/cli/npm-completion.html
index 5a678ba352..fb5adbe0d9 100644
--- a/deps/npm/html/doc/cli/npm-completion.html
+++ b/deps/npm/html/doc/cli/npm-completion.html
@@ -42,5 +42,5 @@ completions based on the arguments.
-
+
diff --git a/deps/npm/html/doc/cli/npm-config.html b/deps/npm/html/doc/cli/npm-config.html
index d97845e708..de2252bd69 100644
--- a/deps/npm/html/doc/cli/npm-config.html
+++ b/deps/npm/html/doc/cli/npm-config.html
@@ -66,5 +66,5 @@ global config.
-
+
diff --git a/deps/npm/html/doc/cli/npm-dedupe.html b/deps/npm/html/doc/cli/npm-dedupe.html
index bf6c9974ea..01284bc664 100644
--- a/deps/npm/html/doc/cli/npm-dedupe.html
+++ b/deps/npm/html/doc/cli/npm-dedupe.html
@@ -63,5 +63,5 @@ versions.
-
+
diff --git a/deps/npm/html/doc/cli/npm-deprecate.html b/deps/npm/html/doc/cli/npm-deprecate.html
index 8182c6ecf1..8f0b86a171 100644
--- a/deps/npm/html/doc/cli/npm-deprecate.html
+++ b/deps/npm/html/doc/cli/npm-deprecate.html
@@ -38,5 +38,5 @@ something like this:
-
+
diff --git a/deps/npm/html/doc/cli/npm-docs.html b/deps/npm/html/doc/cli/npm-docs.html
index e9f2c9e732..ed0a3002fe 100644
--- a/deps/npm/html/doc/cli/npm-docs.html
+++ b/deps/npm/html/doc/cli/npm-docs.html
@@ -56,5 +56,5 @@ the current folder and use the name
property.
-
+
diff --git a/deps/npm/html/doc/cli/npm-edit.html b/deps/npm/html/doc/cli/npm-edit.html
index 24a70fe7fc..1b15510be8 100644
--- a/deps/npm/html/doc/cli/npm-edit.html
+++ b/deps/npm/html/doc/cli/npm-edit.html
@@ -49,5 +49,5 @@ or "notepad"
on Windows.
-
+
diff --git a/deps/npm/html/doc/cli/npm-explore.html b/deps/npm/html/doc/cli/npm-explore.html
index eeb4906448..edbe173994 100644
--- a/deps/npm/html/doc/cli/npm-explore.html
+++ b/deps/npm/html/doc/cli/npm-explore.html
@@ -49,5 +49,5 @@ Windows
-
+
diff --git a/deps/npm/html/doc/cli/npm-help-search.html b/deps/npm/html/doc/cli/npm-help-search.html
index 2cf7506f03..34e4061bed 100644
--- a/deps/npm/html/doc/cli/npm-help-search.html
+++ b/deps/npm/html/doc/cli/npm-help-search.html
@@ -46,5 +46,5 @@ where the terms were found in the documentation.
-
+
diff --git a/deps/npm/html/doc/cli/npm-help.html b/deps/npm/html/doc/cli/npm-help.html
index 12c6c0e8fd..9f4f3bba5a 100644
--- a/deps/npm/html/doc/cli/npm-help.html
+++ b/deps/npm/html/doc/cli/npm-help.html
@@ -52,5 +52,5 @@ matches are equivalent to specifying a topic name.
-
+
diff --git a/deps/npm/html/doc/cli/npm-init.html b/deps/npm/html/doc/cli/npm-init.html
index e7640ea46c..acdd967d58 100644
--- a/deps/npm/html/doc/cli/npm-init.html
+++ b/deps/npm/html/doc/cli/npm-init.html
@@ -40,5 +40,5 @@ defaults and not prompt you for any options.
-
+
diff --git a/deps/npm/html/doc/cli/npm-install.html b/deps/npm/html/doc/cli/npm-install.html
index 3759f01155..33897998b5 100644
--- a/deps/npm/html/doc/cli/npm-install.html
+++ b/deps/npm/html/doc/cli/npm-install.html
@@ -239,5 +239,5 @@ affects a real use-case, it will be investigated.
-
+
diff --git a/deps/npm/html/doc/cli/npm-link.html b/deps/npm/html/doc/cli/npm-link.html
index 8d085892df..72be63d7f3 100644
--- a/deps/npm/html/doc/cli/npm-link.html
+++ b/deps/npm/html/doc/cli/npm-link.html
@@ -24,7 +24,7 @@ symlink from the local node_modules
folder to the global symlink.
Note that package-name
is taken from package.json
,
not from directory name.
The package name can be optionally prefixed with a scope. See npm-scope(7)
.
-The scope must by preceded by an @-symbol and followed by a slash.
+The scope must be preceded by an @-symbol and followed by a slash.
When creating tarballs for npm publish
, the linked packages are
"snapshotted" to their current state by resolving the symbolic links.
This is handy for installing your own stuff, so that you can work on it and
@@ -71,5 +71,5 @@ include that scope, e.g.
-
+
diff --git a/deps/npm/html/doc/cli/npm-ls.html b/deps/npm/html/doc/cli/npm-ls.html
index 30419bdb0d..ae44c1314c 100644
--- a/deps/npm/html/doc/cli/npm-ls.html
+++ b/deps/npm/html/doc/cli/npm-ls.html
@@ -22,7 +22,7 @@ installed, as well as their dependencies, in a tree-structure.
limit the results to only the paths to the packages named. Note that
nested packages will also show the paths to the specified packages.
For example, running npm ls promzard
in npm's source tree will show:
-
npm@2.1.6 /path/to/npm
+npm@2.1.18 /path/to/npm
└─┬ init-package-json@0.0.4
└── promzard@0.1.5
It will print out extraneous, missing, and invalid packages.
@@ -85,5 +85,5 @@ project.
-
+
diff --git a/deps/npm/html/doc/cli/npm-outdated.html b/deps/npm/html/doc/cli/npm-outdated.html
index 07a0a933d7..f62276ed84 100644
--- a/deps/npm/html/doc/cli/npm-outdated.html
+++ b/deps/npm/html/doc/cli/npm-outdated.html
@@ -67,5 +67,5 @@ project.
-
+
diff --git a/deps/npm/html/doc/cli/npm-owner.html b/deps/npm/html/doc/cli/npm-owner.html
index 3600e087f1..adc0af02bd 100644
--- a/deps/npm/html/doc/cli/npm-owner.html
+++ b/deps/npm/html/doc/cli/npm-owner.html
@@ -49,5 +49,5 @@ that is not implemented at this time.
-
+
diff --git a/deps/npm/html/doc/cli/npm-pack.html b/deps/npm/html/doc/cli/npm-pack.html
index 987ba3f792..af2fe5c85d 100644
--- a/deps/npm/html/doc/cli/npm-pack.html
+++ b/deps/npm/html/doc/cli/npm-pack.html
@@ -41,5 +41,5 @@ overwritten the second time.
-
+
diff --git a/deps/npm/html/doc/cli/npm-prefix.html b/deps/npm/html/doc/cli/npm-prefix.html
index 7b6a3c58a5..b6a8783fd9 100644
--- a/deps/npm/html/doc/cli/npm-prefix.html
+++ b/deps/npm/html/doc/cli/npm-prefix.html
@@ -38,5 +38,5 @@ to contain a package.json file unless -g
is also specified.
-
+
diff --git a/deps/npm/html/doc/cli/npm-prune.html b/deps/npm/html/doc/cli/npm-prune.html
index dea291b490..6610508e17 100644
--- a/deps/npm/html/doc/cli/npm-prune.html
+++ b/deps/npm/html/doc/cli/npm-prune.html
@@ -39,5 +39,5 @@ packages specified in your devDependencies
.
-
+
diff --git a/deps/npm/html/doc/cli/npm-publish.html b/deps/npm/html/doc/cli/npm-publish.html
index e1b46d21d0..9044ed38f0 100644
--- a/deps/npm/html/doc/cli/npm-publish.html
+++ b/deps/npm/html/doc/cli/npm-publish.html
@@ -59,5 +59,5 @@ it is removed with
-
+
diff --git a/deps/npm/html/doc/cli/npm-rebuild.html b/deps/npm/html/doc/cli/npm-rebuild.html
index 4da97a7051..2b3d758619 100644
--- a/deps/npm/html/doc/cli/npm-rebuild.html
+++ b/deps/npm/html/doc/cli/npm-rebuild.html
@@ -38,5 +38,5 @@ the new binary.
-
+
diff --git a/deps/npm/html/doc/cli/npm-repo.html b/deps/npm/html/doc/cli/npm-repo.html
index 02335b4f4a..631781c47b 100644
--- a/deps/npm/html/doc/cli/npm-repo.html
+++ b/deps/npm/html/doc/cli/npm-repo.html
@@ -42,5 +42,5 @@ a package.json
in the current folder and use the name
-
+
diff --git a/deps/npm/html/doc/cli/npm-restart.html b/deps/npm/html/doc/cli/npm-restart.html
index d7536f81fd..ea0b1bd5db 100644
--- a/deps/npm/html/doc/cli/npm-restart.html
+++ b/deps/npm/html/doc/cli/npm-restart.html
@@ -9,12 +9,29 @@
-npm-restart
Start a package
+npm-restart
Restart a package
SYNOPSIS
npm restart [-- <args>]
DESCRIPTION
-This runs a package's "restart" script, if one was provided. Otherwise it runs
-package's "stop" script, if one was provided, and then the "start" script.
+This restarts a package.
+This runs a package's "stop", "restart", and "start" scripts, and associated
+pre- and post- scripts, in the order given below:
+
+- prerestart
+- prestop
+- stop
+- poststop
+- restart
+- prestart
+- start
+- poststart
+- postrestart
+
+NOTE
+Note that the "restart" script is run in addition to the "stop"
+and "start" scripts, not instead of them.
+This is the behavior as of npm
major version 2. A change in this
+behavior will be accompanied by an increase in major version number
SEE ALSO
- npm-run-script(1)
@@ -22,6 +39,7 @@ package's "stop" script, if one was provided, and then the "s
- npm-test(1)
- npm-start(1)
- npm-stop(1)
+- npm-restart(3)
@@ -35,5 +53,5 @@ package's "stop" script, if one was provided, and then the "s
-
+
diff --git a/deps/npm/html/doc/cli/npm-rm.html b/deps/npm/html/doc/cli/npm-rm.html
index 3b28aaad4d..772a3dc8c7 100644
--- a/deps/npm/html/doc/cli/npm-rm.html
+++ b/deps/npm/html/doc/cli/npm-rm.html
@@ -39,5 +39,5 @@ on its behalf.
-
+
diff --git a/deps/npm/html/doc/cli/npm-root.html b/deps/npm/html/doc/cli/npm-root.html
index f6b8b22dfc..37b6291585 100644
--- a/deps/npm/html/doc/cli/npm-root.html
+++ b/deps/npm/html/doc/cli/npm-root.html
@@ -35,5 +35,5 @@
-
+
diff --git a/deps/npm/html/doc/cli/npm-run-script.html b/deps/npm/html/doc/cli/npm-run-script.html
index 8ca2ea2a5e..ec7df7489d 100644
--- a/deps/npm/html/doc/cli/npm-run-script.html
+++ b/deps/npm/html/doc/cli/npm-run-script.html
@@ -47,5 +47,5 @@ and not to any pre or post script.
-
+
diff --git a/deps/npm/html/doc/cli/npm-search.html b/deps/npm/html/doc/cli/npm-search.html
index f5fe720baa..ff015526e6 100644
--- a/deps/npm/html/doc/cli/npm-search.html
+++ b/deps/npm/html/doc/cli/npm-search.html
@@ -49,5 +49,5 @@ fall on multiple lines.
-
+
diff --git a/deps/npm/html/doc/cli/npm-shrinkwrap.html b/deps/npm/html/doc/cli/npm-shrinkwrap.html
index fbfaa6c3dc..67dcc29387 100644
--- a/deps/npm/html/doc/cli/npm-shrinkwrap.html
+++ b/deps/npm/html/doc/cli/npm-shrinkwrap.html
@@ -164,5 +164,5 @@ contents rather than versions.
-
+
diff --git a/deps/npm/html/doc/cli/npm-star.html b/deps/npm/html/doc/cli/npm-star.html
index d3bbde5b9d..4608b23de5 100644
--- a/deps/npm/html/doc/cli/npm-star.html
+++ b/deps/npm/html/doc/cli/npm-star.html
@@ -36,5 +36,5 @@ a vaguely positive way to show that you care.
-
+
diff --git a/deps/npm/html/doc/cli/npm-stars.html b/deps/npm/html/doc/cli/npm-stars.html
index 7873880f41..dcc8478a7d 100644
--- a/deps/npm/html/doc/cli/npm-stars.html
+++ b/deps/npm/html/doc/cli/npm-stars.html
@@ -37,5 +37,5 @@ you will most certainly enjoy this command.
-
+
diff --git a/deps/npm/html/doc/cli/npm-start.html b/deps/npm/html/doc/cli/npm-start.html
index 0a3134bc82..627463ba45 100644
--- a/deps/npm/html/doc/cli/npm-start.html
+++ b/deps/npm/html/doc/cli/npm-start.html
@@ -34,5 +34,5 @@
-
+
diff --git a/deps/npm/html/doc/cli/npm-stop.html b/deps/npm/html/doc/cli/npm-stop.html
index 01638ee4da..527581be74 100644
--- a/deps/npm/html/doc/cli/npm-stop.html
+++ b/deps/npm/html/doc/cli/npm-stop.html
@@ -34,5 +34,5 @@
-
+
diff --git a/deps/npm/html/doc/cli/npm-submodule.html b/deps/npm/html/doc/cli/npm-submodule.html
index 4ac55a8852..6716c4a11c 100644
--- a/deps/npm/html/doc/cli/npm-submodule.html
+++ b/deps/npm/html/doc/cli/npm-submodule.html
@@ -27,7 +27,7 @@ or you can do npm explore <pkgname> -- npm install
to install
dependencies into the submodule folder.
SEE ALSO
-- package.json(5)
+- package.json(5)
- git help submodule
@@ -42,5 +42,5 @@ dependencies into the submodule folder.
-
+
diff --git a/deps/npm/html/doc/cli/npm-tag.html b/deps/npm/html/doc/cli/npm-tag.html
index 946d5fa767..836fb63532 100644
--- a/deps/npm/html/doc/cli/npm-tag.html
+++ b/deps/npm/html/doc/cli/npm-tag.html
@@ -44,5 +44,5 @@ of using a specific version number:
-
+
diff --git a/deps/npm/html/doc/cli/npm-test.html b/deps/npm/html/doc/cli/npm-test.html
index 6c5467de51..48e7ae8d6d 100644
--- a/deps/npm/html/doc/cli/npm-test.html
+++ b/deps/npm/html/doc/cli/npm-test.html
@@ -37,5 +37,5 @@ true.
-
+
diff --git a/deps/npm/html/doc/cli/npm-uninstall.html b/deps/npm/html/doc/cli/npm-uninstall.html
index 2a3c12c148..9771b9c505 100644
--- a/deps/npm/html/doc/cli/npm-uninstall.html
+++ b/deps/npm/html/doc/cli/npm-uninstall.html
@@ -57,5 +57,5 @@ npm uninstall dtrace-provider --save-optional
-
+
diff --git a/deps/npm/html/doc/cli/npm-unpublish.html b/deps/npm/html/doc/cli/npm-unpublish.html
index 59b278e23d..293e2057a8 100644
--- a/deps/npm/html/doc/cli/npm-unpublish.html
+++ b/deps/npm/html/doc/cli/npm-unpublish.html
@@ -47,5 +47,5 @@ package again, a new version number must be used.
-
+
diff --git a/deps/npm/html/doc/cli/npm-update.html b/deps/npm/html/doc/cli/npm-update.html
index 5fa7846f53..9846147355 100644
--- a/deps/npm/html/doc/cli/npm-update.html
+++ b/deps/npm/html/doc/cli/npm-update.html
@@ -40,5 +40,5 @@ or local) will be updated.
-
+
diff --git a/deps/npm/html/doc/cli/npm-version.html b/deps/npm/html/doc/cli/npm-version.html
index 6477726f49..825baab43c 100644
--- a/deps/npm/html/doc/cli/npm-version.html
+++ b/deps/npm/html/doc/cli/npm-version.html
@@ -14,7 +14,7 @@
npm version [<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease]
DESCRIPTION
Run this in a package directory to bump the version and write the new
-data back to the package.json file.
+data back to package.json
and, if present, npm-shrinkwrap.json
.
The newversion
argument should be a valid semver string, or a
valid second argument to semver.inc (one of "patch", "minor", "major",
"prepatch", "preminor", "premajor", "prerelease"). In the second case,
@@ -55,5 +55,5 @@ Enter passphrase:
-
+
diff --git a/deps/npm/html/doc/cli/npm-view.html b/deps/npm/html/doc/cli/npm-view.html
index 3b87ba0be2..69c1d06b9c 100644
--- a/deps/npm/html/doc/cli/npm-view.html
+++ b/deps/npm/html/doc/cli/npm-view.html
@@ -82,5 +82,5 @@ the field name.
-
+
diff --git a/deps/npm/html/doc/cli/npm-whoami.html b/deps/npm/html/doc/cli/npm-whoami.html
index a2705c40c3..9d71b8e0f1 100644
--- a/deps/npm/html/doc/cli/npm-whoami.html
+++ b/deps/npm/html/doc/cli/npm-whoami.html
@@ -33,5 +33,5 @@
-
+
diff --git a/deps/npm/html/doc/cli/npm.html b/deps/npm/html/doc/cli/npm.html
index 3bd3849d2a..e3077b3fe8 100644
--- a/deps/npm/html/doc/cli/npm.html
+++ b/deps/npm/html/doc/cli/npm.html
@@ -13,7 +13,7 @@
SYNOPSIS
npm <command> [args]
VERSION
-2.1.6
+2.1.18
DESCRIPTION
npm is the package manager for the Node JavaScript platform. It puts
modules in place so that node can find them, and manages dependency
@@ -110,7 +110,7 @@ easily by doing npm view npm contributors
.
the issues list or ask on the mailing list.
BUGS
When you find issues, please report them:
@@ -118,7 +118,7 @@ the issues list or ask on the mailing list.
web:
http://github.com/npm/npm/issues
email:
-npm-@googlegroups.com
+npm-@googlegroups.com
Be sure to include all of the output from the npm command that didn't work
as expected. The npm-debug.log
file is also helpful to provide.
@@ -128,7 +128,7 @@ will no doubt tell you to put the output in a gist or email.
Isaac Z. Schlueter ::
isaacs ::
@izs ::
-i@izs.me
+i@izs.me
SEE ALSO
- npm-help(1)
@@ -154,5 +154,5 @@ will no doubt tell you to put the output in a gist or email.
-
+
diff --git a/deps/npm/html/doc/files/npm-folders.html b/deps/npm/html/doc/files/npm-folders.html
index ec32039997..392d9c1e38 100644
--- a/deps/npm/html/doc/files/npm-folders.html
+++ b/deps/npm/html/doc/files/npm-folders.html
@@ -184,5 +184,5 @@ cannot be found elsewhere. See
-
+
diff --git a/deps/npm/html/doc/files/npm-global.html b/deps/npm/html/doc/files/npm-global.html
index 90e5dcaf1d..456fd89b8c 100644
--- a/deps/npm/html/doc/files/npm-global.html
+++ b/deps/npm/html/doc/files/npm-global.html
@@ -184,5 +184,5 @@ cannot be found elsewhere. See
-
+
diff --git a/deps/npm/html/doc/files/npm-json.html b/deps/npm/html/doc/files/npm-json.html
index ade4fd07ec..e77270d604 100644
--- a/deps/npm/html/doc/files/npm-json.html
+++ b/deps/npm/html/doc/files/npm-json.html
@@ -181,7 +181,7 @@ maybe, someday.
Put example scripts in here. Someday, it might be exposed in some clever way.
repository
Specify the place where your code lives. This is helpful for people who
-want to contribute. If the git repo is on github, then the npm docs
+want to contribute. If the git repo is on GitHub, then the npm docs
command will be able to find you.
Do it like this:
"repository" :
@@ -269,12 +269,15 @@ git+https://user@hostname/project/blah.git#commit-ish
The commit-ish
can be any tag, sha, or branch which can be supplied as
an argument to git checkout
. The default is master
.
GitHub URLs
-As of version 1.1.65, you can refer to GitHub urls as just "foo": "user/foo-project". For example:
+As of version 1.1.65, you can refer to GitHub urls as just "foo":
+"user/foo-project". Just as with git URLs, a commit-ish
suffix can be
+included. For example:
{
"name": "foo",
"version": "0.0.0",
"dependencies": {
- "express": "visionmedia/express"
+ "express": "visionmedia/express",
+ "mocha": "visionmedia/mocha#4727d357ea"
}
}
Local Paths
@@ -328,7 +331,7 @@ run this script as well, so that you can test it easily.
peerDependencies
In some cases, you want to express the compatibility of your package with an
host tool or library, while not necessarily doing a require
of this host.
-This is usually refered to as a plugin. Notably, your module may be exposing
+This is usually referred to as a plugin. Notably, your module may be exposing
a specific interface, expected and specified by the host documentation.
For example:
{
@@ -485,5 +488,5 @@ ignored.
-
+
diff --git a/deps/npm/html/doc/files/npmrc.html b/deps/npm/html/doc/files/npmrc.html
index 9f379006f0..5600e24380 100644
--- a/deps/npm/html/doc/files/npmrc.html
+++ b/deps/npm/html/doc/files/npmrc.html
@@ -31,7 +31,11 @@ parameters. Environment variables can be replaced using
Each of these files is loaded, and config options are resolved in
priority order. For example, a setting in the userconfig file would
override the setting in the globalconfig file.
-Per-project config file
+Array values are specified by adding "[]" after the key name. For
+example:
+key[] = "first value"
+key[] = "second value"
+
Per-project config file
When working locally in a project, a .npmrc
file in the root of the
project (ie, a sibling of node_modules
and package.json
) will set
config values specific to this project.
@@ -73,5 +77,5 @@ manner.
-
+
diff --git a/deps/npm/html/doc/files/package.json.html b/deps/npm/html/doc/files/package.json.html
index 183ad8ea5d..4360a1488b 100644
--- a/deps/npm/html/doc/files/package.json.html
+++ b/deps/npm/html/doc/files/package.json.html
@@ -181,7 +181,7 @@ maybe, someday.
Put example scripts in here. Someday, it might be exposed in some clever way.
repository
Specify the place where your code lives. This is helpful for people who
-want to contribute. If the git repo is on github, then the npm docs
+want to contribute. If the git repo is on GitHub, then the npm docs
command will be able to find you.
Do it like this:
"repository" :
@@ -269,12 +269,15 @@ git+https://user@hostname/project/blah.git#commit-ish
The commit-ish
can be any tag, sha, or branch which can be supplied as
an argument to git checkout
. The default is master
.
GitHub URLs
-As of version 1.1.65, you can refer to GitHub urls as just "foo": "user/foo-project". For example:
+As of version 1.1.65, you can refer to GitHub urls as just "foo":
+"user/foo-project". Just as with git URLs, a commit-ish
suffix can be
+included. For example:
{
"name": "foo",
"version": "0.0.0",
"dependencies": {
- "express": "visionmedia/express"
+ "express": "visionmedia/express",
+ "mocha": "visionmedia/mocha#4727d357ea"
}
}
Local Paths
@@ -328,7 +331,7 @@ run this script as well, so that you can test it easily.
peerDependencies
In some cases, you want to express the compatibility of your package with an
host tool or library, while not necessarily doing a require
of this host.
-This is usually refered to as a plugin. Notably, your module may be exposing
+This is usually referred to as a plugin. Notably, your module may be exposing
a specific interface, expected and specified by the host documentation.
For example:
{
@@ -485,5 +488,5 @@ ignored.
-
+
diff --git a/deps/npm/html/doc/index.html b/deps/npm/html/doc/index.html
index 6c68895e07..88e64e9079 100644
--- a/deps/npm/html/doc/index.html
+++ b/deps/npm/html/doc/index.html
@@ -11,7 +11,7 @@
npm-index
Index of all npm documentation
README
-node package manager
+a JavaScript package manager
Command Line Documentation
Using npm on the command line
npm(1)
@@ -71,7 +71,7 @@
npm-repo(1)
Open package repository page in the browser
npm-restart(1)
-Start a package
+Restart a package
npm-rm(1)
Remove a package
npm-root(1)
@@ -157,7 +157,7 @@
npm-repo(3)
Open package repository page in the browser
npm-restart(3)
-Start a package
+Restart a package
npm-root(3)
Display npm root
npm-run-script(3)
@@ -230,5 +230,5 @@
-
+
diff --git a/deps/npm/html/doc/misc/npm-coding-style.html b/deps/npm/html/doc/misc/npm-coding-style.html
index 30d3e07cfa..a5f04aff72 100644
--- a/deps/npm/html/doc/misc/npm-coding-style.html
+++ b/deps/npm/html/doc/misc/npm-coding-style.html
@@ -16,14 +16,14 @@ difference's sake, but rather a carefully crafted style that is
designed to reduce visual clutter and make bugs more apparent.
If you want to contribute to npm (which is very encouraged), you should
make your code conform to npm's style.
-Note: this concerns npm's code not the specific packages at npmjs.org
+Note: this concerns npm's code not the specific packages that you can download from the npm registry.
Line Length
Keep lines shorter than 80 characters. It's better for lines to be
too short than to be too long. Break up long lists, objects, and other
statements onto multiple lines.
Indentation
Two-spaces. Tabs are better, but they look like hell in web browsers
-(and on github), and node uses 2 spaces, so that's that.
+(and on GitHub), and node uses 2 spaces, so that's that.
Configure your editor appropriately.
Curly braces
Curly braces belong on the same line as the thing that necessitates them.
@@ -147,5 +147,5 @@ set to anything."
-
+
diff --git a/deps/npm/html/doc/misc/npm-config.html b/deps/npm/html/doc/misc/npm-config.html
index 249d5934c9..5f68b86786 100644
--- a/deps/npm/html/doc/misc/npm-config.html
+++ b/deps/npm/html/doc/misc/npm-config.html
@@ -118,13 +118,18 @@ ostensibly Unix systems.
ca
- Default: The npm CA certificate
-- Type: String or null
+- Type: String, Array or null
The Certificate Authority signing certificate that is trusted for SSL
-connections to the registry.
-Set to null
to only allow "known" registrars, or to a specific CA cert
+connections to the registry. Values should be in PEM format with newlines
+replaced by the string "\n". For example:
+ca="-----BEGIN CERTIFICATE-----\nXXXX\nXXXX\n-----END CERTIFICATE-----"
+
Set to null
to only allow "known" registrars, or to a specific CA cert
to trust only that specific signing authority.
-See also the strict-ssl
config.
+Multiple CAs can be trusted by specifying an array of certificates:
+ca[]="..."
+ca[]="..."
+
See also the strict-ssl
config.
cafile
- Default:
null
@@ -313,11 +318,12 @@ user.
The string that starts all the debugging log output.
https-proxy
-- Default: the
HTTPS_PROXY
or https_proxy
or HTTP_PROXY
or
-http_proxy
environment variables.
+- Default: null
- Type: url
-A proxy to use for outgoing https requests.
+A proxy to use for outgoing https requests. If the HTTPS_PROXY
or
+https_proxy
or HTTP_PROXY
or http_proxy
environment variables are set,
+proxy settings will be honored by the underlying request
library.
ignore-scripts
- Default: false
@@ -500,10 +506,12 @@ than npm -- particularly a very outdated tar implementation -- leave
this as true.
proxy
-- Default:
HTTP_PROXY
or http_proxy
environment variable, or null
+- Default: null
- Type: url
-A proxy to use for outgoing http requests.
+A proxy to use for outgoing http requests. If the HTTP_PROXY
or
+http_proxy
environment variables are set, proxy settings will be
+honored by the underlying request
library.
rebuild-bundle
- Default: true
@@ -759,5 +767,5 @@ exit successfully.
-
+
diff --git a/deps/npm/html/doc/misc/npm-developers.html b/deps/npm/html/doc/misc/npm-developers.html
index b4190a1a2b..18d1020e15 100644
--- a/deps/npm/html/doc/misc/npm-developers.html
+++ b/deps/npm/html/doc/misc/npm-developers.html
@@ -94,6 +94,14 @@ no .npmignore
file, but there is a .gitignore
ignore the stuff matched by the .gitignore
file. If you want to
include something that is excluded by your .gitignore
file, you can
create an empty .npmignore
file to override it.
+.npmignore
files follow the same pattern rules
+as .gitignore
files:
+
+- Blank lines or lines starting with
#
are ignored.
+- Standard glob patterns work.
+- You can end patterns with a forward slash
/
to specify a directory.
+- You can negate a pattern by starting it with an exclamation point
!
.
+
By default, the following paths and files are ignored, so there's no
need to add them to .npmignore
explicitly:
@@ -181,5 +189,5 @@ from a fresh checkout.
-
+
diff --git a/deps/npm/html/doc/misc/npm-disputes.html b/deps/npm/html/doc/misc/npm-disputes.html
index f59921e2e9..00a0e2a650 100644
--- a/deps/npm/html/doc/misc/npm-disputes.html
+++ b/deps/npm/html/doc/misc/npm-disputes.html
@@ -13,7 +13,7 @@
SYNOPSIS
- Get the author email with
npm owner ls <pkgname>
-- Email the author, CC support@npmjs.com
+- Email the author, CC support@npmjs.com
- 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.
@@ -51,12 +51,12 @@ Joe's appropriate course of action in each case is the same.
owner (Bob).
- 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
+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.
- 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 support
-support@npmjs.com and we'll sort it out. ("Reasonable" is
+support@npmjs.com and we'll sort it out. ("Reasonable" is
usually at least 4 weeks, but extra time is allowed around common
holidays.)
@@ -112,5 +112,5 @@ things into it.
-
+
diff --git a/deps/npm/html/doc/misc/npm-faq.html b/deps/npm/html/doc/misc/npm-faq.html
index 08c8eafce2..6caf41929f 100644
--- a/deps/npm/html/doc/misc/npm-faq.html
+++ b/deps/npm/html/doc/misc/npm-faq.html
@@ -11,7 +11,7 @@
npm-faq
Frequently Asked Questions
Where can I find these docs in HTML?
-https://www.npmjs.org/doc/, or run:
+https://docs.npmjs.com/, or run:
npm config set viewer browser
to open these documents in your default web browser rather than man
.
It didn't work.
@@ -62,7 +62,7 @@ in a shell script if you really wanted to.
Usually, no. Allow npm to resolve dependencies for your packages.
For packages you deploy, such as websites and apps,
you should use npm shrinkwrap to lock down your full dependency tree:
-https://www.npmjs.org/doc/cli/npm-shrinkwrap.html
+https://docs.npmjs.com/cli/shrinkwrap
If you are paranoid about depending on the npm ecosystem,
you should run a private npm mirror or a private cache.
If you want 100% confidence in being able to reproduce the specific bytes
@@ -108,7 +108,7 @@ version cannot be properly installed with the version that you have
installed already. (Consider, if there is ever a bug in the update
command.)
In those cases, you can do this:
-curl https://www.npmjs.org/install.sh | sh
+curl https://www.npmjs.com/install.sh | sh
What is a package
?
A package is:
@@ -230,28 +230,51 @@ that has a package.json in its root, or a git url.
The package registry website. What is that exactly?
See npm-registry(7)
.
I forgot my password, and can't publish. How do I reset it?
-Go to https://npmjs.org/forgot.
+Go to https://npmjs.com/forgot.
I get ECONNREFUSED a lot. What's up?
Either the registry is down, or node's DNS isn't able to reach out.
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 us know by emailing support@npmjs.com
+
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?
-Please see this discussion: https://github.com/npm/npm/issues/798
-tl;dr - It doesn't actually make things better, and can make them worse.
-If you want to namespace your own packages, you may: simply use the
--
character to separate the names. npm is a mostly anarchic system.
-There is not sufficient need to impose namespace rules on everyone.
+npm has only one global namespace. If you want to namespace your own packages,
+you may: simply use the -
character to separate the names. npm is a mostly
+anarchic system. There is not sufficient need to impose namespace rules on
+everyone.
+As of 2.0, npm supports scoped packages, which allow you to publish a group of
+related modules without worrying about name collisions.
+Every npm user owns the scope associated with their username. For example, the
+user named npm
owns the scope @npm
. Scoped packages are published inside a
+scope by naming them as if they were files under the scope directory, e.g., by
+setting name
in package.json
to @npm/npm
.
+Scoped packages can coexist with public npm packages in a private npm registry.
+At present (2014-11-04) scoped packages may NOT be published to the public npm
+registry.
+Unscoped packages can only depend on other unscoped packages. Scoped packages
+can depend on packages from their own scope, a different scope, or the public
+registry (unscoped).
+For the current documentation of scoped packages, see
+https://docs.npmjs.com/misc/scope
+References:
+
+For the reasoning behind the "one global namespace", please see this
+discussion: https://github.com/npm/npm/issues/798 (TL;DR: It doesn't
+actually make things better, and can make them worse.)
+
+For the pre-implementation discussion of the scoped package feature, see
+this discussion: https://github.com/npm/npm/issues/5239
+
+
Who does npm?
npm was originally written by Isaac Z. Schlueter, and many others have
contributed to it, some of them quite substantially.
-The npm open source project, The npm Registry, and the community
+The npm open source project, The npm Registry, and the community
website are maintained and operated by the
good folks at npm, Inc.
I have a question or request not addressed here. Where should I put it?
@@ -284,5 +307,5 @@ good folks at npm, Inc.
-
+
diff --git a/deps/npm/html/doc/misc/npm-index.html b/deps/npm/html/doc/misc/npm-index.html
index 1ca7d75862..60a8845a77 100644
--- a/deps/npm/html/doc/misc/npm-index.html
+++ b/deps/npm/html/doc/misc/npm-index.html
@@ -11,7 +11,7 @@
npm-index
Index of all npm documentation
README
-node package manager
+a JavaScript package manager
Command Line Documentation
Using npm on the command line
npm(1)
@@ -71,7 +71,7 @@
npm-repo(1)
Open package repository page in the browser
npm-restart(1)
-Start a package
+Restart a package
npm-rm(1)
Remove a package
npm-root(1)
@@ -157,7 +157,7 @@
npm-repo(3)
Open package repository page in the browser
npm-restart(3)
-Start a package
+Restart a package
npm-root(3)
Display npm root
npm-run-script(3)
@@ -230,5 +230,5 @@
-
+
diff --git a/deps/npm/html/doc/misc/npm-registry.html b/deps/npm/html/doc/misc/npm-registry.html
index d746316f58..9c82de7168 100644
--- a/deps/npm/html/doc/misc/npm-registry.html
+++ b/deps/npm/html/doc/misc/npm-registry.html
@@ -49,7 +49,7 @@ otherwise.
No, but it's way easier. Basically, yes, you do, or you have to
effectively implement the entire CouchDB API anyway.
Is there a website or something to see package docs and such?
-Yes, head over to https://npmjs.org/
+Yes, head over to https://npmjs.com/
SEE ALSO
- npm-config(1)
@@ -70,5 +70,5 @@ effectively implement the entire CouchDB API anyway.
-
+
diff --git a/deps/npm/html/doc/misc/npm-scope.html b/deps/npm/html/doc/misc/npm-scope.html
index 9fed0bbf11..3b81cf00ce 100644
--- a/deps/npm/html/doc/misc/npm-scope.html
+++ b/deps/npm/html/doc/misc/npm-scope.html
@@ -78,5 +78,5 @@ that registry instead.
-
+
diff --git a/deps/npm/html/doc/misc/npm-scripts.html b/deps/npm/html/doc/misc/npm-scripts.html
index b2a3dbd383..4f0d466efd 100644
--- a/deps/npm/html/doc/misc/npm-scripts.html
+++ b/deps/npm/html/doc/misc/npm-scripts.html
@@ -27,10 +27,6 @@ Run AFTER the package is installed.
Run BEFORE the package is uninstalled.
- postuninstall:
Run AFTER the package is uninstalled.
-- preupdate:
-Run BEFORE the package is updated with the update command.
-- update, postupdate:
-Run AFTER the package is updated with the update command.
- pretest, test, posttest:
Run by the
npm test
command.
- prestop, stop, poststop:
@@ -220,5 +216,5 @@ the user will sudo the npm command in question.
-
+
diff --git a/deps/npm/html/doc/misc/removing-npm.html b/deps/npm/html/doc/misc/removing-npm.html
index 3028625d1b..e8f05b097f 100644
--- a/deps/npm/html/doc/misc/removing-npm.html
+++ b/deps/npm/html/doc/misc/removing-npm.html
@@ -57,5 +57,5 @@ modules. To track those down, you can do the following:
-
+
diff --git a/deps/npm/html/doc/misc/semver.html b/deps/npm/html/doc/misc/semver.html
index eeea8fbc40..3b1556041e 100644
--- a/deps/npm/html/doc/misc/semver.html
+++ b/deps/npm/html/doc/misc/semver.html
@@ -22,12 +22,12 @@ semver.lt('1.2.3', '9.8.7') // true
As a command-line utility:
$ semver -h
-Usage: semver <version> [<version> [...]] [-r <range> | -i <inc> | -d <dec>]
+Usage: semver <version> [<version> [...]] [-r <range> | -i <inc> | --preid <identifier> | -l | -rv]
Test if version(s) satisfy the supplied range(s), and sort them.
Multiple versions or ranges may be supplied, unless increment
-or decrement options are specified. In that case, only a single
-version may be used, and it is incremented by the specified level
+option is specified. In that case, only a single version may
+be used, and it is incremented by the specified level
Program exits successfully if any valid version satisfies
all supplied ranges, and prints all satisfying versions.
@@ -91,6 +91,20 @@ alpha/beta/rc versions. By including a prerelease tag in the range,
the user is indicating that they are aware of the risk. However, it
is still not appropriate to assume that they have opted into taking a
similar risk on the next set of prerelease versions.
+Prerelease Identifiers
+The method .inc
takes an additional identifier
string argument that
+will append the value of the string as a prerelease identifier:
+> semver.inc('1.2.3', 'pre', 'beta')
+'1.2.4-beta.0'
+
+command-line example:
+$ semver 1.2.3 -i prerelease --preid beta
+1.2.4-beta.0
+
+Which then can be used to increment further:
+$ semver 1.2.4-beta.0 -i prerelease
+1.2.4-beta.1
+
Advanced Range Syntax
Advanced range syntax desugars to primitive comparators in
deterministic ways.
@@ -145,7 +159,6 @@ equal to beta.2
. So, 1.2.3-beta.4
would be allowed, b
1.2.4-beta.2
would not, because it is a prerelease of a
different [major, minor, patch]
tuple.
-Note: this is the same as the ~>
operator in rubygems.
Caret Ranges ^1.2.3
^0.2.5
^0.0.4
Allows changes that do not modify the left-most non-zero digit in the
[major, minor, patch]
tuple. In other words, this allows patch and
@@ -225,6 +238,9 @@ invalid comparison string is provided.
v2
is greater. Sorts in ascending order if passed to Array.sort()
.
rcompare(v1, v2)
: The reverse of compare. Sorts an array of versions
in descending order when passed to Array.sort()
.
+diff(v1, v2)
: Returns difference between two versions by the release type
+(major
, premajor
, minor
, preminor
, patch
, prepatch
, or prerelease
),
+or null if the versions are the same.
Ranges
@@ -263,5 +279,5 @@ range, use the satisfies(version, range)
function.
-
+
diff --git a/deps/npm/html/partial/doc/README.html b/deps/npm/html/partial/doc/README.html
index 13ff98d2c3..823c8a0b5e 100644
--- a/deps/npm/html/partial/doc/README.html
+++ b/deps/npm/html/partial/doc/README.html
@@ -1,4 +1,4 @@
-npm
node package manager
+npm
a JavaScript package manager
SYNOPSIS
This is just enough info to get you up and running.
@@ -19,9 +19,9 @@ and prior, clone the git repo and dig through the old tags and branches.
paths, etc.) then read on.
Fancy Install (Unix)
There's a pretty robust install script at
-https://www.npmjs.org/install.sh. You can download that and run it.
+https://www.npmjs.com/install.sh. You can download that and run it.
Here's an example using curl:
-
curl -L https://npmjs.org/install.sh | sh
+curl -L https://npmjs.com/install.sh | sh
Slightly Fancier
You can set any npm configuration params with that script:
npm_config_prefix=/some/path sh install.sh
@@ -34,31 +34,16 @@ If you plan on hacking on npm, make link
is your friend.
arbitrary config keys using the ./configure --key=val ...
, and then
run npm commands by doing node cli.js <cmd> <args>
. (This is helpful
for testing, or running stuff without actually installing npm itself.)
-Fancy Windows Install
-You can download a zip file from https://npmjs.org/dist/, and unpack it
+
Windows Install or Upgrade
+You can download a zip file from https://github.com/npm/npm/releases, and unpack it
in the same folder where node.exe lives.
+The latest version in a zip file is 1.4.12. To upgrade to npm 2, follow the
+Windows upgrade instructions in the npm Troubleshooting Guide:
+https://github.com/npm/npm/wiki/Troubleshooting#upgrading-on-windows
If that's not fancy enough for you, then you can fetch the code with
git, and mess with it directly.
Installing on Cygwin
No.
-Permissions when Using npm to Install Other Stuff
-tl;dr
-
-- Use
sudo
for greater safety. Or don't, if you prefer not to.
-- npm will downgrade permissions if it's root before running any build
-scripts that package authors specified.
-
-More details...
-As of version 0.3, it is recommended to run npm as root.
-This allows npm to change the user identifier to the nobody
user prior
-to running any package build or test commands.
-If you are not the root user, or if you are on a platform that does not
-support uid switching, then npm will not attempt to change the userid.
-If you would like to ensure that npm always runs scripts as the
-"nobody" user, and have it fail if it cannot downgrade permissions, then
-set the following configuration param:
-npm config set unsafe-perm false
-
This will prevent running in unsafe mode, even as non-root users.
Uninstalling
So sad to see you go.
sudo npm uninstall npm -g
@@ -111,11 +96,11 @@ change the value for all npm commands in that process.
command line arguments using nopt. You may also want to check out npm
help config
to learn about all the options you can set there.
More Docs
-Check out the docs,
-especially the faq.
+Check out the docs,
+especially the faq.
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
+you should read this
Legal Stuff
"npm" and "The npm Registry" are owned by npm, Inc.
All rights reserved. See the included LICENSE file for more details.
@@ -128,9 +113,9 @@ 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.
If you have a complaint about a package in the public npm registry,
-and cannot resolve it with the package
+and cannot resolve it with the package
owner, please email
-support@npmjs.com and explain the situation.
+support@npmjs.com and explain the situation.
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.
@@ -149,8 +134,6 @@ ban your account in extreme cases. So don't do that.
- web:
https://github.com/npm/npm/issues
-- email:
-npm-@googlegroups.com
Be sure to include all of the output from the npm command that didn't work
as expected. The npm-debug.log
file is also helpful to provide.
diff --git a/deps/npm/html/partial/doc/api/npm-ls.html b/deps/npm/html/partial/doc/api/npm-ls.html
index 508003ca15..850955b836 100644
--- a/deps/npm/html/partial/doc/api/npm-ls.html
+++ b/deps/npm/html/partial/doc/api/npm-ls.html
@@ -38,6 +38,6 @@ taken if it is serialized to JSON.
List packages in the global install prefix instead of in the current
project.
Note, if parseable is set or long isn't set, then duplicates will be trimmed.
-This means that if a submodule a same dependency as a parent module, then the
+This means that if a submodule has the same dependency as a parent module, then the
dependency will only be output once.
diff --git a/deps/npm/html/partial/doc/api/npm-restart.html b/deps/npm/html/partial/doc/api/npm-restart.html
index 35db404d78..f0de7504a5 100644
--- a/deps/npm/html/partial/doc/api/npm-restart.html
+++ b/deps/npm/html/partial/doc/api/npm-restart.html
@@ -1,13 +1,29 @@
-npm-restart
Start a package
+npm-restart
Restart a package
SYNOPSIS
npm.commands.restart(packages, callback)
DESCRIPTION
-This runs a package's "restart" script, if one was provided.
-Otherwise it runs package's "stop" script, if one was provided, and then
-the "start" script.
+This restarts a package (or multiple packages).
+This runs a package's "stop", "restart", and "start" scripts, and associated
+pre- and post- scripts, in the order given below:
+
+- prerestart
+- prestop
+- stop
+- poststop
+- restart
+- prestart
+- start
+- poststart
+- postrestart
+
If no version is specified, then it restarts the "active" version.
-npm can run tests on multiple packages. Just specify multiple packages
-in the packages
parameter.
+npm can restart multiple packages. Just specify multiple packages in
+the packages
parameter.
+NOTE
+Note that the "restart" script is run in addition to the "stop"
+and "start" scripts, not instead of them.
+This is the behavior as of npm
major version 2. A change in this
+behavior will be accompanied by an increase in major version number
SEE ALSO
- npm-start(3)
diff --git a/deps/npm/html/partial/doc/api/npm-start.html b/deps/npm/html/partial/doc/api/npm-start.html
index 2eae8ba0f5..98bd41f6b2 100644
--- a/deps/npm/html/partial/doc/api/npm-start.html
+++ b/deps/npm/html/partial/doc/api/npm-start.html
@@ -3,6 +3,6 @@
npm.commands.start(packages, callback)
DESCRIPTION
This runs a package's "start" script, if one was provided.
-npm can run tests on multiple packages. Just specify multiple packages
-in the packages
parameter.
+npm can start multiple packages. Just specify multiple packages in the
+packages
parameter.
diff --git a/deps/npm/html/partial/doc/api/npm.html b/deps/npm/html/partial/doc/api/npm.html
index dbd481b380..dd5276a751 100644
--- a/deps/npm/html/partial/doc/api/npm.html
+++ b/deps/npm/html/partial/doc/api/npm.html
@@ -12,7 +12,7 @@ npm.load([configObject, ]function (er, npm) {
npm.commands.install(["package"], cb)
})
VERSION
-2.1.6
+2.1.18
DESCRIPTION
This is the API documentation for npm.
To find documentation of the command line
diff --git a/deps/npm/html/partial/doc/cli/npm-adduser.html b/deps/npm/html/partial/doc/cli/npm-adduser.html
index ac9fa0086c..ce2c5dcce6 100644
--- a/deps/npm/html/partial/doc/cli/npm-adduser.html
+++ b/deps/npm/html/partial/doc/cli/npm-adduser.html
@@ -6,11 +6,12 @@
save the credentials to the .npmrc
file. If no registry is specified,
the default registry will be used (see npm-config(7)
).
The username, password, and email are read in from prompts.
-You may use this command to change your email address, but not username
-or password.
-To reset your password, go to https://www.npmjs.org/forgot
+To reset your password, go to https://www.npmjs.com/forgot
+To change your email address, go to https://www.npmjs.com/email-edit
You may use this command multiple times with the same user account to
-authorize on a new machine.
+authorize on a new machine. When authenticating on a new machine,
+the username, password and email address must all match with
+your existing record.
npm login
is an alias to adduser
and behaves exactly the same way.
CONFIGURATION
registry
@@ -33,7 +34,7 @@ registries. Can be used with --registry
and / or --scopenpm adduser --registry=http://private-registry.example.com --always-auth
This will ensure that all requests to that registry (including for tarballs)
include an authorization header. See always-auth
in npm-config(7)
for more
-details on always-auth. Registry-specific configuaration of always-auth
takes
+details on always-auth. Registry-specific configuration of always-auth
takes
precedence over any global configuration.
SEE ALSO
diff --git a/deps/npm/html/partial/doc/cli/npm-link.html b/deps/npm/html/partial/doc/cli/npm-link.html
index 3c832399dd..c4b01c2a65 100644
--- a/deps/npm/html/partial/doc/cli/npm-link.html
+++ b/deps/npm/html/partial/doc/cli/npm-link.html
@@ -13,7 +13,7 @@ symlink from the local node_modules
folder to the global symlink.
Note that package-name
is taken from package.json
,
not from directory name.
The package name can be optionally prefixed with a scope. See npm-scope(7)
.
-The scope must by preceded by an @-symbol and followed by a slash.
+The scope must be preceded by an @-symbol and followed by a slash.
When creating tarballs for npm publish
, the linked packages are
"snapshotted" to their current state by resolving the symbolic links.
This is handy for installing your own stuff, so that you can work on it and
diff --git a/deps/npm/html/partial/doc/cli/npm-ls.html b/deps/npm/html/partial/doc/cli/npm-ls.html
index 199b6002b8..3a5cae1b49 100644
--- a/deps/npm/html/partial/doc/cli/npm-ls.html
+++ b/deps/npm/html/partial/doc/cli/npm-ls.html
@@ -11,7 +11,7 @@ installed, as well as their dependencies, in a tree-structure.
limit the results to only the paths to the packages named. Note that
nested packages will also show the paths to the specified packages.
For example, running npm ls promzard
in npm's source tree will show:
-
npm@2.1.6 /path/to/npm
+npm@2.1.18 /path/to/npm
└─┬ init-package-json@0.0.4
└── promzard@0.1.5
It will print out extraneous, missing, and invalid packages.
diff --git a/deps/npm/html/partial/doc/cli/npm-restart.html b/deps/npm/html/partial/doc/cli/npm-restart.html
index 267e570eca..2186473373 100644
--- a/deps/npm/html/partial/doc/cli/npm-restart.html
+++ b/deps/npm/html/partial/doc/cli/npm-restart.html
@@ -1,9 +1,26 @@
-npm-restart
Start a package
+npm-restart
Restart a package
SYNOPSIS
npm restart [-- <args>]
DESCRIPTION
-This runs a package's "restart" script, if one was provided. Otherwise it runs
-package's "stop" script, if one was provided, and then the "start" script.
+This restarts a package.
+This runs a package's "stop", "restart", and "start" scripts, and associated
+pre- and post- scripts, in the order given below:
+
+- prerestart
+- prestop
+- stop
+- poststop
+- restart
+- prestart
+- start
+- poststart
+- postrestart
+
+NOTE
+Note that the "restart" script is run in addition to the "stop"
+and "start" scripts, not instead of them.
+This is the behavior as of npm
major version 2. A change in this
+behavior will be accompanied by an increase in major version number
SEE ALSO
- npm-run-script(1)
@@ -11,5 +28,6 @@ package's "stop" script, if one was provided, and then the "s
- npm-test(1)
- npm-start(1)
- npm-stop(1)
+- npm-restart(3)
diff --git a/deps/npm/html/partial/doc/cli/npm-version.html b/deps/npm/html/partial/doc/cli/npm-version.html
index 5217f01963..0cc3a21ad4 100644
--- a/deps/npm/html/partial/doc/cli/npm-version.html
+++ b/deps/npm/html/partial/doc/cli/npm-version.html
@@ -3,7 +3,7 @@
npm version [<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease]
DESCRIPTION
Run this in a package directory to bump the version and write the new
-data back to the package.json file.
+data back to package.json
and, if present, npm-shrinkwrap.json
.
The newversion
argument should be a valid semver string, or a
valid second argument to semver.inc (one of "patch", "minor", "major",
"prepatch", "preminor", "premajor", "prerelease"). In the second case,
diff --git a/deps/npm/html/partial/doc/cli/npm.html b/deps/npm/html/partial/doc/cli/npm.html
index 646fffcb37..94ab5a6451 100644
--- a/deps/npm/html/partial/doc/cli/npm.html
+++ b/deps/npm/html/partial/doc/cli/npm.html
@@ -2,7 +2,7 @@
SYNOPSIS
npm <command> [args]
VERSION
-2.1.6
+2.1.18
DESCRIPTION
npm is the package manager for the Node JavaScript platform. It puts
modules in place so that node can find them, and manages dependency
@@ -99,7 +99,7 @@ easily by doing npm view npm contributors
.
the issues list or ask on the mailing list.
BUGS
When you find issues, please report them:
@@ -107,7 +107,7 @@ the issues list or ask on the mailing list.
web:
http://github.com/npm/npm/issues
email:
-npm-@googlegroups.com
+npm-@googlegroups.com
Be sure to include all of the output from the npm command that didn't work
as expected. The npm-debug.log
file is also helpful to provide.
@@ -117,7 +117,7 @@ will no doubt tell you to put the output in a gist or email.
Isaac Z. Schlueter ::
isaacs ::
@izs ::
-i@izs.me
+i@izs.me
SEE ALSO
- npm-help(1)
diff --git a/deps/npm/html/partial/doc/files/npm-json.html b/deps/npm/html/partial/doc/files/npm-json.html
index df3bea8374..1e297ad77a 100644
--- a/deps/npm/html/partial/doc/files/npm-json.html
+++ b/deps/npm/html/partial/doc/files/npm-json.html
@@ -170,7 +170,7 @@ maybe, someday.
Put example scripts in here. Someday, it might be exposed in some clever way.
repository
Specify the place where your code lives. This is helpful for people who
-want to contribute. If the git repo is on github, then the npm docs
+want to contribute. If the git repo is on GitHub, then the npm docs
command will be able to find you.
Do it like this:
"repository" :
@@ -258,12 +258,15 @@ git+https://user@hostname/project/blah.git#commit-ish
The commit-ish
can be any tag, sha, or branch which can be supplied as
an argument to git checkout
. The default is master
.
GitHub URLs
-As of version 1.1.65, you can refer to GitHub urls as just "foo": "user/foo-project". For example:
+As of version 1.1.65, you can refer to GitHub urls as just "foo":
+"user/foo-project". Just as with git URLs, a commit-ish
suffix can be
+included. For example:
{
"name": "foo",
"version": "0.0.0",
"dependencies": {
- "express": "visionmedia/express"
+ "express": "visionmedia/express",
+ "mocha": "visionmedia/mocha#4727d357ea"
}
}
Local Paths
@@ -317,7 +320,7 @@ run this script as well, so that you can test it easily.
peerDependencies
In some cases, you want to express the compatibility of your package with an
host tool or library, while not necessarily doing a require
of this host.
-This is usually refered to as a plugin. Notably, your module may be exposing
+This is usually referred to as a plugin. Notably, your module may be exposing
a specific interface, expected and specified by the host documentation.
For example:
{
diff --git a/deps/npm/html/partial/doc/files/npmrc.html b/deps/npm/html/partial/doc/files/npmrc.html
index ac386ca85e..988920a489 100644
--- a/deps/npm/html/partial/doc/files/npmrc.html
+++ b/deps/npm/html/partial/doc/files/npmrc.html
@@ -20,7 +20,11 @@ parameters. Environment variables can be replaced using
Each of these files is loaded, and config options are resolved in
priority order. For example, a setting in the userconfig file would
override the setting in the globalconfig file.
-Per-project config file
+Array values are specified by adding "[]" after the key name. For
+example:
+key[] = "first value"
+key[] = "second value"
+
Per-project config file
When working locally in a project, a .npmrc
file in the root of the
project (ie, a sibling of node_modules
and package.json
) will set
config values specific to this project.
diff --git a/deps/npm/html/partial/doc/files/package.json.html b/deps/npm/html/partial/doc/files/package.json.html
index df3bea8374..1e297ad77a 100644
--- a/deps/npm/html/partial/doc/files/package.json.html
+++ b/deps/npm/html/partial/doc/files/package.json.html
@@ -170,7 +170,7 @@ maybe, someday.
Put example scripts in here. Someday, it might be exposed in some clever way.
repository
Specify the place where your code lives. This is helpful for people who
-want to contribute. If the git repo is on github, then the npm docs
+want to contribute. If the git repo is on GitHub, then the npm docs
command will be able to find you.
Do it like this:
"repository" :
@@ -258,12 +258,15 @@ git+https://user@hostname/project/blah.git#commit-ish
The commit-ish
can be any tag, sha, or branch which can be supplied as
an argument to git checkout
. The default is master
.
GitHub URLs
-As of version 1.1.65, you can refer to GitHub urls as just "foo": "user/foo-project". For example:
+As of version 1.1.65, you can refer to GitHub urls as just "foo":
+"user/foo-project". Just as with git URLs, a commit-ish
suffix can be
+included. For example:
{
"name": "foo",
"version": "0.0.0",
"dependencies": {
- "express": "visionmedia/express"
+ "express": "visionmedia/express",
+ "mocha": "visionmedia/mocha#4727d357ea"
}
}
Local Paths
@@ -317,7 +320,7 @@ run this script as well, so that you can test it easily.
peerDependencies
In some cases, you want to express the compatibility of your package with an
host tool or library, while not necessarily doing a require
of this host.
-This is usually refered to as a plugin. Notably, your module may be exposing
+This is usually referred to as a plugin. Notably, your module may be exposing
a specific interface, expected and specified by the host documentation.
For example:
{
diff --git a/deps/npm/html/partial/doc/index.html b/deps/npm/html/partial/doc/index.html
index f6678d9371..6af3f79bd9 100644
--- a/deps/npm/html/partial/doc/index.html
+++ b/deps/npm/html/partial/doc/index.html
@@ -1,6 +1,6 @@
npm-index
Index of all npm documentation
README
-node package manager
+a JavaScript package manager
Command Line Documentation
Using npm on the command line
npm(1)
@@ -60,7 +60,7 @@
npm-repo(1)
Open package repository page in the browser
npm-restart(1)
-Start a package
+Restart a package
npm-rm(1)
Remove a package
npm-root(1)
@@ -146,7 +146,7 @@
npm-repo(3)
Open package repository page in the browser
npm-restart(3)
-Start a package
+Restart a package
npm-root(3)
Display npm root
npm-run-script(3)
diff --git a/deps/npm/html/partial/doc/misc/npm-coding-style.html b/deps/npm/html/partial/doc/misc/npm-coding-style.html
index 732b326c99..b50b95f27f 100644
--- a/deps/npm/html/partial/doc/misc/npm-coding-style.html
+++ b/deps/npm/html/partial/doc/misc/npm-coding-style.html
@@ -5,14 +5,14 @@ difference's sake, but rather a carefully crafted style that is
designed to reduce visual clutter and make bugs more apparent.
If you want to contribute to npm (which is very encouraged), you should
make your code conform to npm's style.
-Note: this concerns npm's code not the specific packages at npmjs.org
+Note: this concerns npm's code not the specific packages that you can download from the npm registry.
Line Length
Keep lines shorter than 80 characters. It's better for lines to be
too short than to be too long. Break up long lists, objects, and other
statements onto multiple lines.
Indentation
Two-spaces. Tabs are better, but they look like hell in web browsers
-(and on github), and node uses 2 spaces, so that's that.
+(and on GitHub), and node uses 2 spaces, so that's that.
Configure your editor appropriately.
Curly braces
Curly braces belong on the same line as the thing that necessitates them.
diff --git a/deps/npm/html/partial/doc/misc/npm-config.html b/deps/npm/html/partial/doc/misc/npm-config.html
index 87409720b9..d9b9dfdbe0 100644
--- a/deps/npm/html/partial/doc/misc/npm-config.html
+++ b/deps/npm/html/partial/doc/misc/npm-config.html
@@ -107,13 +107,18 @@ ostensibly Unix systems.
ca
- Default: The npm CA certificate
-- Type: String or null
+- Type: String, Array or null
The Certificate Authority signing certificate that is trusted for SSL
-connections to the registry.
-Set to null
to only allow "known" registrars, or to a specific CA cert
+connections to the registry. Values should be in PEM format with newlines
+replaced by the string "\n". For example:
+ca="-----BEGIN CERTIFICATE-----\nXXXX\nXXXX\n-----END CERTIFICATE-----"
+
Set to null
to only allow "known" registrars, or to a specific CA cert
to trust only that specific signing authority.
-See also the strict-ssl
config.
+Multiple CAs can be trusted by specifying an array of certificates:
+ca[]="..."
+ca[]="..."
+
See also the strict-ssl
config.
cafile
- Default:
null
@@ -302,11 +307,12 @@ user.
The string that starts all the debugging log output.
https-proxy
-- Default: the
HTTPS_PROXY
or https_proxy
or HTTP_PROXY
or
-http_proxy
environment variables.
+- Default: null
- Type: url
-A proxy to use for outgoing https requests.
+A proxy to use for outgoing https requests. If the HTTPS_PROXY
or
+https_proxy
or HTTP_PROXY
or http_proxy
environment variables are set,
+proxy settings will be honored by the underlying request
library.
ignore-scripts
- Default: false
@@ -489,10 +495,12 @@ than npm -- particularly a very outdated tar implementation -- leave
this as true.
proxy
-- Default:
HTTP_PROXY
or http_proxy
environment variable, or null
+- Default: null
- Type: url
-A proxy to use for outgoing http requests.
+A proxy to use for outgoing http requests. If the HTTP_PROXY
or
+http_proxy
environment variables are set, proxy settings will be
+honored by the underlying request
library.
rebuild-bundle
- Default: true
diff --git a/deps/npm/html/partial/doc/misc/npm-developers.html b/deps/npm/html/partial/doc/misc/npm-developers.html
index 7ba880a44b..10d0cd8919 100644
--- a/deps/npm/html/partial/doc/misc/npm-developers.html
+++ b/deps/npm/html/partial/doc/misc/npm-developers.html
@@ -83,6 +83,14 @@ no .npmignore
file, but there is a .gitignore
ignore the stuff matched by the .gitignore
file. If you want to
include something that is excluded by your .gitignore
file, you can
create an empty .npmignore
file to override it.
+.npmignore
files follow the same pattern rules
+as .gitignore
files:
+
+- Blank lines or lines starting with
#
are ignored.
+- Standard glob patterns work.
+- You can end patterns with a forward slash
/
to specify a directory.
+- You can negate a pattern by starting it with an exclamation point
!
.
+
By default, the following paths and files are ignored, so there's no
need to add them to .npmignore
explicitly:
diff --git a/deps/npm/html/partial/doc/misc/npm-disputes.html b/deps/npm/html/partial/doc/misc/npm-disputes.html
index 6a7abca712..7e6983ceb2 100644
--- a/deps/npm/html/partial/doc/misc/npm-disputes.html
+++ b/deps/npm/html/partial/doc/misc/npm-disputes.html
@@ -2,7 +2,7 @@
SYNOPSIS
- Get the author email with
npm owner ls <pkgname>
-- Email the author, CC support@npmjs.com
+- Email the author, CC support@npmjs.com
- 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.
@@ -40,12 +40,12 @@ Joe's appropriate course of action in each case is the same.
owner (Bob).
- 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
+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.
- 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 support
-support@npmjs.com and we'll sort it out. ("Reasonable" is
+support@npmjs.com and we'll sort it out. ("Reasonable" is
usually at least 4 weeks, but extra time is allowed around common
holidays.)
diff --git a/deps/npm/html/partial/doc/misc/npm-faq.html b/deps/npm/html/partial/doc/misc/npm-faq.html
index 7fc16344f7..f42abe7159 100644
--- a/deps/npm/html/partial/doc/misc/npm-faq.html
+++ b/deps/npm/html/partial/doc/misc/npm-faq.html
@@ -1,6 +1,6 @@
npm-faq
Frequently Asked Questions
Where can I find these docs in HTML?
-https://www.npmjs.org/doc/, or run:
+https://docs.npmjs.com/, or run:
npm config set viewer browser
to open these documents in your default web browser rather than man
.
It didn't work.
@@ -51,7 +51,7 @@ in a shell script if you really wanted to.
Usually, no. Allow npm to resolve dependencies for your packages.
For packages you deploy, such as websites and apps,
you should use npm shrinkwrap to lock down your full dependency tree:
-https://www.npmjs.org/doc/cli/npm-shrinkwrap.html
+https://docs.npmjs.com/cli/shrinkwrap
If you are paranoid about depending on the npm ecosystem,
you should run a private npm mirror or a private cache.
If you want 100% confidence in being able to reproduce the specific bytes
@@ -97,7 +97,7 @@ version cannot be properly installed with the version that you have
installed already. (Consider, if there is ever a bug in the update
command.)
In those cases, you can do this:
-curl https://www.npmjs.org/install.sh | sh
+curl https://www.npmjs.com/install.sh | sh
What is a package
?
A package is:
@@ -219,28 +219,51 @@ that has a package.json in its root, or a git url.
The package registry website. What is that exactly?
See npm-registry(7)
.
I forgot my password, and can't publish. How do I reset it?
-Go to https://npmjs.org/forgot.
+Go to https://npmjs.com/forgot.
I get ECONNREFUSED a lot. What's up?
Either the registry is down, or node's DNS isn't able to reach out.
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 us know by emailing support@npmjs.com
+
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?
-Please see this discussion: https://github.com/npm/npm/issues/798
-tl;dr - It doesn't actually make things better, and can make them worse.
-If you want to namespace your own packages, you may: simply use the
--
character to separate the names. npm is a mostly anarchic system.
-There is not sufficient need to impose namespace rules on everyone.
+npm has only one global namespace. If you want to namespace your own packages,
+you may: simply use the -
character to separate the names. npm is a mostly
+anarchic system. There is not sufficient need to impose namespace rules on
+everyone.
+As of 2.0, npm supports scoped packages, which allow you to publish a group of
+related modules without worrying about name collisions.
+Every npm user owns the scope associated with their username. For example, the
+user named npm
owns the scope @npm
. Scoped packages are published inside a
+scope by naming them as if they were files under the scope directory, e.g., by
+setting name
in package.json
to @npm/npm
.
+Scoped packages can coexist with public npm packages in a private npm registry.
+At present (2014-11-04) scoped packages may NOT be published to the public npm
+registry.
+Unscoped packages can only depend on other unscoped packages. Scoped packages
+can depend on packages from their own scope, a different scope, or the public
+registry (unscoped).
+For the current documentation of scoped packages, see
+https://docs.npmjs.com/misc/scope
+References:
+
+For the reasoning behind the "one global namespace", please see this
+discussion: https://github.com/npm/npm/issues/798 (TL;DR: It doesn't
+actually make things better, and can make them worse.)
+
+For the pre-implementation discussion of the scoped package feature, see
+this discussion: https://github.com/npm/npm/issues/5239
+
+
Who does npm?
npm was originally written by Isaac Z. Schlueter, and many others have
contributed to it, some of them quite substantially.
-The npm open source project, The npm Registry, and the community
+The npm open source project, The npm Registry, and the community
website are maintained and operated by the
good folks at npm, Inc.
I have a question or request not addressed here. Where should I put it?
diff --git a/deps/npm/html/partial/doc/misc/npm-index.html b/deps/npm/html/partial/doc/misc/npm-index.html
index 6e4c0ca800..3800cea938 100644
--- a/deps/npm/html/partial/doc/misc/npm-index.html
+++ b/deps/npm/html/partial/doc/misc/npm-index.html
@@ -1,6 +1,6 @@
npm-index
Index of all npm documentation
README
-node package manager
+a JavaScript package manager
Command Line Documentation
Using npm on the command line
npm(1)
@@ -60,7 +60,7 @@
npm-repo(1)
Open package repository page in the browser
npm-restart(1)
-Start a package
+Restart a package
npm-rm(1)
Remove a package
npm-root(1)
@@ -146,7 +146,7 @@
npm-repo(3)
Open package repository page in the browser
npm-restart(3)
-Start a package
+Restart a package
npm-root(3)
Display npm root
npm-run-script(3)
diff --git a/deps/npm/html/partial/doc/misc/npm-registry.html b/deps/npm/html/partial/doc/misc/npm-registry.html
index 0031f61b10..2a7c160145 100644
--- a/deps/npm/html/partial/doc/misc/npm-registry.html
+++ b/deps/npm/html/partial/doc/misc/npm-registry.html
@@ -38,7 +38,7 @@ otherwise.
No, but it's way easier. Basically, yes, you do, or you have to
effectively implement the entire CouchDB API anyway.
Is there a website or something to see package docs and such?
-Yes, head over to https://npmjs.org/
+Yes, head over to https://npmjs.com/
SEE ALSO
- npm-config(1)
diff --git a/deps/npm/html/partial/doc/misc/npm-scripts.html b/deps/npm/html/partial/doc/misc/npm-scripts.html
index 08bcbd54a5..1e68be479b 100644
--- a/deps/npm/html/partial/doc/misc/npm-scripts.html
+++ b/deps/npm/html/partial/doc/misc/npm-scripts.html
@@ -16,10 +16,6 @@ Run AFTER the package is installed.
Run BEFORE the package is uninstalled.
- postuninstall:
Run AFTER the package is uninstalled.
-- preupdate:
-Run BEFORE the package is updated with the update command.
-- update, postupdate:
-Run AFTER the package is updated with the update command.
- pretest, test, posttest:
Run by the
npm test
command.
- prestop, stop, poststop:
diff --git a/deps/npm/html/partial/doc/misc/semver.html b/deps/npm/html/partial/doc/misc/semver.html
index 691a277dc7..b078197e80 100644
--- a/deps/npm/html/partial/doc/misc/semver.html
+++ b/deps/npm/html/partial/doc/misc/semver.html
@@ -11,12 +11,12 @@ semver.lt('1.2.3', '9.8.7') // true
As a command-line utility:
$ semver -h
-Usage: semver <version> [<version> [...]] [-r <range> | -i <inc> | -d <dec>]
+Usage: semver <version> [<version> [...]] [-r <range> | -i <inc> | --preid <identifier> | -l | -rv]
Test if version(s) satisfy the supplied range(s), and sort them.
Multiple versions or ranges may be supplied, unless increment
-or decrement options are specified. In that case, only a single
-version may be used, and it is incremented by the specified level
+option is specified. In that case, only a single version may
+be used, and it is incremented by the specified level
Program exits successfully if any valid version satisfies
all supplied ranges, and prints all satisfying versions.
@@ -80,6 +80,20 @@ alpha/beta/rc versions. By including a prerelease tag in the range,
the user is indicating that they are aware of the risk. However, it
is still not appropriate to assume that they have opted into taking a
similar risk on the next set of prerelease versions.
+Prerelease Identifiers
+The method .inc
takes an additional identifier
string argument that
+will append the value of the string as a prerelease identifier:
+> semver.inc('1.2.3', 'pre', 'beta')
+'1.2.4-beta.0'
+
+command-line example:
+$ semver 1.2.3 -i prerelease --preid beta
+1.2.4-beta.0
+
+Which then can be used to increment further:
+$ semver 1.2.4-beta.0 -i prerelease
+1.2.4-beta.1
+
Advanced Range Syntax
Advanced range syntax desugars to primitive comparators in
deterministic ways.
@@ -134,7 +148,6 @@ equal to beta.2
. So, 1.2.3-beta.4
would be allowed, b
1.2.4-beta.2
would not, because it is a prerelease of a
different [major, minor, patch]
tuple.
-Note: this is the same as the ~>
operator in rubygems.
Caret Ranges ^1.2.3
^0.2.5
^0.0.4
Allows changes that do not modify the left-most non-zero digit in the
[major, minor, patch]
tuple. In other words, this allows patch and
@@ -214,6 +227,9 @@ invalid comparison string is provided.
v2
is greater. Sorts in ascending order if passed to Array.sort()
.
rcompare(v1, v2)
: The reverse of compare. Sorts an array of versions
in descending order when passed to Array.sort()
.
+diff(v1, v2)
: Returns difference between two versions by the release type
+(major
, premajor
, minor
, preminor
, patch
, prepatch
, or prerelease
),
+or null if the versions are the same.
Ranges
diff --git a/deps/npm/lib/adduser.js b/deps/npm/lib/adduser.js
index 9693aebd38..6c8a652bea 100644
--- a/deps/npm/lib/adduser.js
+++ b/deps/npm/lib/adduser.js
@@ -3,7 +3,6 @@ module.exports = adduser
var log = require("npmlog")
, npm = require("./npm.js")
- , registry = npm.registry
, read = require("read")
, userValidate = require("npm-user-validate")
, crypto
@@ -125,13 +124,6 @@ function readEmail (c, u, cb) {
}
function save (c, u, cb) {
- if (c.changed) {
- delete registry.auth
- delete registry.username
- delete registry.password
- registry.username = u.u
- registry.password = u.p
- }
npm.spinner.start()
// save existing configs, but yank off for this PUT
@@ -146,14 +138,17 @@ function save (c, u, cb) {
if (scopedRegistry) uri = scopedRegistry
}
- registry.adduser(uri, u.u, u.p, u.e, function (er, doc) {
+ var params = {
+ auth : {
+ username : u.u,
+ password : u.p,
+ email : u.e
+ }
+ }
+ npm.registry.adduser(uri, params, function (er, doc) {
npm.spinner.stop()
if (er) return cb(er)
- registry.username = u.u
- registry.password = u.p
- registry.email = u.e
-
// don't want this polluting the configuration
npm.config.del("_token", "user")
diff --git a/deps/npm/lib/bugs.js b/deps/npm/lib/bugs.js
index 16744cd5c8..fabbbaf10e 100644
--- a/deps/npm/lib/bugs.js
+++ b/deps/npm/lib/bugs.js
@@ -4,7 +4,6 @@ module.exports = bugs
bugs.usage = "npm bugs "
var npm = require("./npm.js")
- , registry = npm.registry
, log = require("npmlog")
, opener = require("opener")
, path = require("path")
@@ -15,20 +14,22 @@ var npm = require("./npm.js")
bugs.completion = function (opts, cb) {
if (opts.conf.argv.remain.length > 2) return cb()
- mapToRegistry("-/short", npm.config, function (er, uri) {
+ mapToRegistry("-/short", npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri, { timeout : 60000 }, function (er, list) {
+ npm.registry.get(uri, { timeout : 60000, auth : auth }, function (er, list) {
return cb(null, list || [])
})
})
}
function bugs (args, cb) {
- var n = args.length && npa(args[0]).name || '.'
+ var n = args.length && npa(args[0]).name || "."
fs.stat(n, function (er, s) {
- if (er && er.code === "ENOENT") return callRegistry(n, cb)
- else if (er) return cb (er)
+ if (er) {
+ if (er.code === "ENOENT") return callRegistry(n, cb)
+ return cb(er)
+ }
if (!s.isDirectory()) return callRegistry(n, cb)
readJson(path.resolve(n, "package.json"), function(er, d) {
if (er) return cb(er)
@@ -38,35 +39,36 @@ function bugs (args, cb) {
}
function getUrlAndOpen (d, cb) {
- var bugs = d.bugs
- , repo = d.repository || d.repositories
+ var repo = d.repository || d.repositories
, url
- if (bugs) {
- url = (typeof url === "string") ? bugs : bugs.url
- } else if (repo) {
+ if (d.bugs) {
+ url = (typeof d.bugs === "string") ? d.bugs : d.bugs.url
+ }
+ else if (repo) {
if (Array.isArray(repo)) repo = repo.shift()
if (repo.hasOwnProperty("url")) repo = repo.url
- log.verbose("repository", repo)
- if (bugs && bugs.match(/^(https?:\/\/|git(:\/\/|@))github.com/)) {
- url = bugs.replace(/^git(@|:\/\/)/, "https://")
+ log.verbose("bugs", "repository", repo)
+ if (repo && repo.match(/^(https?:\/\/|git(:\/\/|@))github.com/)) {
+ url = repo.replace(/^git(@|:\/\/)/, "https://")
.replace(/^https?:\/\/github.com:/, "https://github.com/")
- .replace(/\.git$/, '')+"/issues"
+ .replace(/\.git$/, "")+"/issues"
}
}
if (!url) {
- url = "https://npmjs.org/package/" + d.name
+ url = "https://www.npmjs.org/package/" + d.name
}
+ log.silly("bugs", "url", url)
opener(url, { command: npm.config.get("browser") }, cb)
}
-function callRegistry (n, cb) {
- mapToRegistry(n, npm.config, function (er, uri) {
+function callRegistry (name, cb) {
+ mapToRegistry(name, npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri + "/latest", { timeout : 3600 }, function (er, d) {
+ npm.registry.get(uri + "/latest", { auth : auth }, function (er, d) {
if (er) return cb(er)
- getUrlAndOpen (d, cb)
+ getUrlAndOpen(d, cb)
})
})
}
diff --git a/deps/npm/lib/build.js b/deps/npm/lib/build.js
index 2e01ef6eea..7477ba4579 100644
--- a/deps/npm/lib/build.js
+++ b/deps/npm/lib/build.js
@@ -43,7 +43,7 @@ function build (args, global, didPre, didRB, cb) {
function build_ (global, didPre, didRB) { return function (folder, cb) {
folder = path.resolve(folder)
- if (build._didBuild[folder]) log.error("build", "already built", folder)
+ if (build._didBuild[folder]) log.info("build", "already built", folder)
build._didBuild[folder] = true
log.info("build", folder)
readJson(path.resolve(folder, "package.json"), function (er, pkg) {
@@ -212,6 +212,7 @@ function linkMans (pkg, folder, parent, gtop, cb) {
if (!pkg.man || !gtop || process.platform === "win32") return cb()
var manRoot = path.resolve(npm.config.get("prefix"), "share", "man")
+ log.verbose("linkMans", "man files are", pkg.man, "in", manRoot)
// make sure that the mans are unique.
// otherwise, if there are dupes, it'll fail with EEXIST
@@ -225,11 +226,20 @@ function linkMans (pkg, folder, parent, gtop, cb) {
asyncMap(pkg.man, function (man, cb) {
if (typeof man !== "string") return cb()
+ log.silly("linkMans", "preparing to link", man)
var parseMan = man.match(/(.*\.([0-9]+)(\.gz)?)$/)
- , stem = parseMan[1]
- , sxn = parseMan[2]
- , bn = path.basename(stem)
- , manDest = path.join(manRoot, "man" + sxn, bn)
+ if (!parseMan) {
+ return cb(new Error(
+ man+" is not a valid name for a man file. " +
+ "Man files must end with a number, " +
+ "and optionally a .gz suffix if they are compressed."
+ ))
+ }
+
+ var stem = parseMan[1]
+ var sxn = parseMan[2]
+ var bn = path.basename(stem)
+ var manDest = path.join(manRoot, "man" + sxn, bn)
linkIfExists(man, manDest, gtop && folder, cb)
}, cb)
diff --git a/deps/npm/lib/cache.js b/deps/npm/lib/cache.js
index e1afb0d157..357063551d 100644
--- a/deps/npm/lib/cache.js
+++ b/deps/npm/lib/cache.js
@@ -82,6 +82,7 @@ var npm = require("./npm.js")
, npa = require("npm-package-arg")
, getStat = require("./cache/get-stat.js")
, cachedPackageRoot = require("./cache/cached-package-root.js")
+ , mapToRegistry = require("./utils/map-to-registry.js")
cache.usage = "npm cache add "
+ "\nnpm cache add "
@@ -172,6 +173,7 @@ function normalize (args) {
if (normalized.substr(-1) === "/") {
normalized = normalized.substr(0, normalized.length - 1)
}
+ normalized = path.normalize(normalized)
log.silly("ls", "normalized", normalized)
return normalized
@@ -202,7 +204,7 @@ function clean (args, cb) {
if (!args) args = []
- var f = path.join(npm.cache, path.normalize(normalize(args)))
+ var f = path.join(npm.cache, normalize(args))
if (f === npm.cache) {
fs.readdir(npm.cache, function (er, files) {
if (er) return cb()
@@ -213,7 +215,10 @@ function clean (args, cb) {
})
, rm, cb )
})
- } else rm(path.join(npm.cache, path.normalize(normalize(args))), cb)
+ }
+ else {
+ rm(f, cb)
+ }
}
// npm cache add
@@ -285,7 +290,12 @@ function add (args, where, cb) {
addLocal(p, null, cb)
break
case "remote":
- addRemoteTarball(p.spec, {name : p.name}, null, cb)
+ // get auth, if possible
+ mapToRegistry(spec, npm.config, function (err, uri, auth) {
+ if (err) return cb(err)
+
+ addRemoteTarball(p.spec, {name : p.name}, null, auth, cb)
+ })
break
case "git":
addRemoteGit(p.spec, false, cb)
diff --git a/deps/npm/lib/cache/add-local.js b/deps/npm/lib/cache/add-local.js
index b425d7f911..e7d286e4fb 100644
--- a/deps/npm/lib/cache/add-local.js
+++ b/deps/npm/lib/cache/add-local.js
@@ -12,6 +12,7 @@ var assert = require("assert")
, cachedPackageRoot = require("./cached-package-root.js")
, addLocalTarball = require("./add-local-tarball.js")
, sha = require("sha")
+ , inflight = require("inflight")
module.exports = addLocal
@@ -28,6 +29,8 @@ function addLocal (p, pkgData, cb_) {
}
if (data && !data._fromGithub) {
data._from = path.relative(npm.prefix, p.spec) || "."
+ var resolved = path.relative(npm.prefix, p.spec)
+ if (resolved) data._resolved = "file:"+resolved
}
return cb_(er, data)
}
@@ -79,20 +82,24 @@ function addLocalDirectory (p, pkgData, shasum, cb) {
var root = cachedPackageRoot(data)
var tgz = path.resolve(root, "package.tgz")
var pj = path.resolve(root, "package/package.json")
+
+ var wrapped = inflight(tgz, next)
+ if (!wrapped) return log.verbose("addLocalDirectory", tgz, "already in flight; waiting")
+ log.verbose("addLocalDirectory", tgz, "not in flight; packing")
+
getCacheStat(function (er, cs) {
mkdir(path.dirname(pj), function (er, made) {
if (er) return cb(er)
var fancy = !pathIsInside(p, npm.tmp)
tar.pack(tgz, p, data, fancy, function (er) {
if (er) {
- log.error( "addLocalDirectory", "Could not pack %j to %j"
- , p, tgz )
+ log.error("addLocalDirectory", "Could not pack", p, "to", tgz)
return cb(er)
}
- if (!cs || isNaN(cs.uid) || isNaN(cs.gid)) next()
+ if (!cs || isNaN(cs.uid) || isNaN(cs.gid)) wrapped()
- chownr(made || tgz, cs.uid, cs.gid, next)
+ chownr(made || tgz, cs.uid, cs.gid, wrapped)
})
})
})
diff --git a/deps/npm/lib/cache/add-named.js b/deps/npm/lib/cache/add-named.js
index 1bd7af1448..cb5a3fa8a6 100644
--- a/deps/npm/lib/cache/add-named.js
+++ b/deps/npm/lib/cache/add-named.js
@@ -7,7 +7,6 @@ var path = require("path")
, readJson = require("read-package-json")
, url = require("url")
, npm = require("../npm.js")
- , registry = npm.registry
, deprCheck = require("../utils/depr-check.js")
, inflight = require("inflight")
, addRemoteTarball = require("./add-remote-tarball.js")
@@ -18,7 +17,7 @@ var path = require("path")
module.exports = addNamed
function getOnceFromRegistry (name, from, next, done) {
- mapToRegistry(name, npm.config, function (er, uri) {
+ mapToRegistry(name, npm.config, function (er, uri, auth) {
if (er) return done(er)
var key = "registry:" + uri
@@ -26,7 +25,7 @@ function getOnceFromRegistry (name, from, next, done) {
if (!next) return log.verbose(from, key, "already in flight; waiting")
else log.verbose(from, key, "not in flight; fetching")
- registry.get(uri, null, next)
+ npm.registry.get(uri, { auth : auth }, next)
})
}
@@ -169,28 +168,28 @@ function addNameVersion (name, v, data, cb) {
})
function fetchit () {
- if (!npm.config.get("registry")) {
- return cb(new Error("Cannot fetch: "+dist.tarball))
- }
-
- // Use the same protocol as the registry. https registry --> https
- // tarballs, but only if they're the same hostname, or else detached
- // tarballs may not work.
- var tb = url.parse(dist.tarball)
- var rp = url.parse(npm.config.get("registry"))
- if (tb.hostname === rp.hostname
- && tb.protocol !== rp.protocol) {
- tb.protocol = url.parse(npm.config.get("registry")).protocol
- delete tb.href
- }
- tb = url.format(tb)
-
- // Only add non-shasum'ed packages if --forced. Only ancient things
- // would lack this for good reasons nowadays.
- if (!dist.shasum && !npm.config.get("force")) {
- return cb(new Error("package lacks shasum: " + data._id))
- }
- return addRemoteTarball(tb, data, dist.shasum, cb)
+ mapToRegistry(name, npm.config, function (er, _, auth, ruri) {
+ if (er) return cb(er)
+
+ // Use the same protocol as the registry. https registry --> https
+ // tarballs, but only if they're the same hostname, or else detached
+ // tarballs may not work.
+ var tb = url.parse(dist.tarball)
+ var rp = url.parse(ruri)
+ if (tb.hostname === rp.hostname && tb.protocol !== rp.protocol) {
+ tb.protocol = rp.protocol
+ delete tb.href
+ }
+ tb = url.format(tb)
+
+ // Only add non-shasum'ed packages if --forced. Only ancient things
+ // would lack this for good reasons nowadays.
+ if (!dist.shasum && !npm.config.get("force")) {
+ return cb(new Error("package lacks shasum: " + data._id))
+ }
+
+ addRemoteTarball(tb, data, dist.shasum, auth, cb)
+ })
}
}
}
diff --git a/deps/npm/lib/cache/add-remote-git.js b/deps/npm/lib/cache/add-remote-git.js
index d8f3f1cd88..1ad925eec3 100644
--- a/deps/npm/lib/cache/add-remote-git.js
+++ b/deps/npm/lib/cache/add-remote-git.js
@@ -1,21 +1,29 @@
var mkdir = require("mkdirp")
, assert = require("assert")
, git = require("../utils/git.js")
- , once = require("once")
, fs = require("graceful-fs")
, log = require("npmlog")
, path = require("path")
, url = require("url")
, chownr = require("chownr")
- , zlib = require("zlib")
, crypto = require("crypto")
, npm = require("../npm.js")
, rm = require("../utils/gently-rm.js")
, inflight = require("inflight")
, getCacheStat = require("./get-stat.js")
- , addLocalTarball = require("./add-local-tarball.js")
- , writeStream = require("fs-write-stream-atomic")
+ , addLocal = require("./add-local.js")
+ , realizePackageSpecifier = require("realize-package-specifier")
+ , normalizeGitUrl = require("normalize-git-url")
+var remotes = path.resolve(npm.config.get("cache"), "_git-remotes")
+var templates = path.join(remotes, "_templates")
+
+var VALID_VARIABLES = [
+ "GIT_SSH",
+ "GIT_SSL_NO_VERIFY",
+ "GIT_PROXY_COMMAND",
+ "GIT_SSL_CAINFO"
+]
// 1. cacheDir = path.join(cache,'_git-remotes',sha1(u))
// 2. checkGitDir(cacheDir) ? 4. : 3. (rm cacheDir if necessary)
@@ -29,41 +37,21 @@ module.exports = function addRemoteGit (u, silent, cb) {
assert(typeof cb === "function", "must have callback")
log.verbose("addRemoteGit", "u=%j silent=%j", u, silent)
- var parsed = url.parse(u, true)
- log.silly("addRemoteGit", "parsed", parsed)
-
- // 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:\/\//, "")
- }
-
- cb = inflight(u, cb)
- if (!cb) return log.verbose("addRemoteGit", u, "already in flight; waiting")
- log.verbose("addRemoteGit", u, "not in flight; cloning")
-
- // figure out what we should check out.
- var co = parsed.hash && parsed.hash.substr(1) || "master"
-
- var v = crypto.createHash("sha1").update(u).digest("hex").slice(0, 8)
- v = u.replace(/[^a-zA-Z0-9]+/g, "-")+"-"+v
+ var normalized = normalizeGitUrl(u)
+ log.silly("addRemoteGit", "normalized", normalized)
- log.verbose("addRemoteGit", [u, co])
+ var v = crypto.createHash("sha1").update(normalized.url).digest("hex").slice(0, 8)
+ v = normalized.url.replace(/[^a-zA-Z0-9]+/g, "-")+"-"+v
+ log.silly("addRemoteGit", "v", v)
- var p = path.join(npm.config.get("cache"), "_git-remotes", v)
+ var p = path.join(remotes, v)
+ cb = inflight(p, cb)
+ if (!cb) return log.verbose("addRemoteGit", p, "already in flight; waiting")
+ log.verbose("addRemoteGit", p, "not in flight; cloning")
- // we don't need global templates when cloning. use this empty dir to specify as template dir
- mkdir(path.join(npm.config.get("cache"), "_git-remotes", "_templates"), function (er) {
+ getGitDir(function (er) {
if (er) return cb(er)
- checkGitDir(p, u, co, origUrl, silent, function (er, data) {
+ checkGitDir(p, normalized.url, normalized.branch, u, silent, function (er, data) {
if (er) return cb(er, data)
addModeRecursive(p, npm.modes.file, function (er) {
@@ -73,31 +61,53 @@ module.exports = function addRemoteGit (u, silent, cb) {
})
}
+function getGitDir (cb) {
+ getCacheStat(function (er, st) {
+ if (er) return cb(er)
+
+ // We don't need global templates when cloning. Use an empty directory for
+ // the templates, creating it (and setting its permissions) if necessary.
+ mkdir(templates, function (er) {
+ if (er) return cb(er)
+
+ // Ensure that both the template and remotes directories have the correct
+ // permissions.
+ fs.chown(templates, st.uid, st.gid, function (er) {
+ if (er) return cb(er)
+
+ fs.chown(remotes, st.uid, st.gid, function (er) {
+ cb(er, st)
+ })
+ })
+ })
+ })
+}
+
function checkGitDir (p, u, co, origUrl, silent, cb) {
fs.stat(p, function (er, s) {
if (er) return cloneGitRemote(p, u, co, origUrl, silent, cb)
- if (!s.isDirectory()) return rm(p, function (er){
+ if (!s.isDirectory()) return rm(p, function (er) {
if (er) return cb(er)
cloneGitRemote(p, u, co, origUrl, silent, cb)
})
- var args = [ "config", "--get", "remote.origin.url" ]
- var env = gitEnv()
-
- // check for git
- git.whichAndExec(args, {cwd: p, env: env}, function (er, stdout, stderr) {
- var stdoutTrimmed = (stdout + "\n" + stderr).trim()
- if (er || u !== stdout.trim()) {
- log.warn( "`git config --get remote.origin.url` returned "
- + "wrong result ("+u+")", stdoutTrimmed )
- return rm(p, function (er){
- if (er) return cb(er)
- cloneGitRemote(p, u, co, origUrl, silent, cb)
- })
+ git.whichAndExec(
+ [ "config", "--get", "remote.origin.url" ],
+ { cwd : p, env : gitEnv },
+ function (er, stdout, stderr) {
+ var stdoutTrimmed = (stdout + "\n" + stderr).trim()
+ if (er || u !== stdout.trim()) {
+ log.warn( "`git config --get remote.origin.url` returned "
+ + "wrong result ("+u+")", stdoutTrimmed )
+ return rm(p, function (er){
+ if (er) return cb(er)
+ cloneGitRemote(p, u, co, origUrl, silent, cb)
+ })
+ }
+ log.verbose("git remote.origin.url", stdoutTrimmed)
+ fetchRemote(p, u, co, origUrl, cb)
}
- log.verbose("git remote.origin.url", stdoutTrimmed)
- archiveGitRemote(p, u, co, origUrl, cb)
- })
+ )
})
}
@@ -105,66 +115,68 @@ function cloneGitRemote (p, u, co, origUrl, silent, cb) {
mkdir(p, function (er) {
if (er) return cb(er)
- var args = [ "clone", "--template=" + path.join(npm.config.get("cache"),
- "_git_remotes", "_templates"), "--mirror", u, p ]
- var env = gitEnv()
-
- // check for git
- git.whichAndExec(args, {cwd: p, env: env}, function (er, stdout, stderr) {
- stdout = (stdout + "\n" + stderr).trim()
- if (er) {
- if (silent) {
- log.verbose("git clone " + u, stdout)
- } else {
- log.error("git clone " + u, stdout)
+ git.whichAndExec(
+ [ "clone", "--template=" + templates, "--mirror", u, p ],
+ { cwd : p, env : gitEnv() },
+ function (er, stdout, stderr) {
+ stdout = (stdout + "\n" + stderr).trim()
+ if (er) {
+ if (silent) {
+ log.verbose("git clone " + u, stdout)
+ } else {
+ log.error("git clone " + u, stdout)
+ }
+ return cb(er)
}
- return cb(er)
+ log.verbose("git clone " + u, stdout)
+ fetchRemote(p, u, co, origUrl, cb)
}
- log.verbose("git clone " + u, stdout)
- archiveGitRemote(p, u, co, origUrl, cb)
- })
+ )
})
}
-function archiveGitRemote (p, u, co, origUrl, cb) {
- var archive = [ "fetch", "-a", "origin" ]
- var resolve = [ "rev-list", "-n1", co ]
- var env = gitEnv()
-
- var resolved = null
- var tmp
+function fetchRemote (p, u, co, origUrl, cb) {
+ git.whichAndExec(
+ [ "fetch", "-a", "origin" ],
+ { cwd : p, env : gitEnv() },
+ function (er, stdout, stderr) {
+ stdout = (stdout + "\n" + stderr).trim()
+ if (er) {
+ log.error("git fetch -a origin ("+u+")", stdout)
+ return cb(er)
+ }
+ log.verbose("git fetch -a origin ("+u+")", stdout)
- git.whichAndExec(archive, {cwd: p, env: env}, function (er, stdout, stderr) {
- stdout = (stdout + "\n" + stderr).trim()
- if (er) {
- log.error("git fetch -a origin ("+u+")", stdout)
- return cb(er)
- }
- log.verbose("git fetch -a origin ("+u+")", stdout)
- tmp = path.join(npm.tmp, Date.now()+"-"+Math.random(), "tmp.tgz")
-
- if (process.platform === "win32") {
- log.silly("verifyOwnership", "skipping for windows")
- resolveHead()
- } else {
- getCacheStat(function(er, cs) {
- if (er) {
- log.error("Could not get cache stat")
- return cb(er)
- }
- chownr(p, cs.uid, cs.gid, function(er) {
+ if (process.platform === "win32") {
+ log.silly("verifyOwnership", "skipping for windows")
+ resolveHead(p, u, co, origUrl, cb)
+ }
+ else {
+ getGitDir(function (er, cs) {
if (er) {
- log.error("Failed to change folder ownership under npm cache for %s", p)
+ log.error("Could not get cache stat")
return cb(er)
}
- resolveHead()
+
+ chownr(p, cs.uid, cs.gid, function (er) {
+ if (er) {
+ log.error("Failed to change folder ownership under npm cache for %s", p)
+ return cb(er)
+ }
+
+ resolveHead(p, u, co, origUrl, cb)
+ })
})
- })
+ }
}
- })
+ )
+}
- function resolveHead () {
- git.whichAndExec(resolve, {cwd: p, env: env}, function (er, stdout, stderr) {
+function resolveHead (p, u, co, origUrl, cb) {
+ git.whichAndExec(
+ [ "rev-list", "-n1", co ],
+ { cwd : p, env : gitEnv() },
+ function (er, stdout, stderr) {
stdout = (stdout + "\n" + stderr).trim()
if (er) {
log.error("Failed resolving git HEAD (" + u + ")", stderr)
@@ -173,48 +185,73 @@ function archiveGitRemote (p, u, co, origUrl, cb) {
log.verbose("git rev-list -n1 " + co, stdout)
var parsed = url.parse(origUrl)
parsed.hash = stdout
- resolved = url.format(parsed)
+ var resolved = url.format(parsed)
- if (parsed.protocol !== "git:") {
- resolved = "git+" + resolved
- }
+ if (parsed.protocol !== "git:") resolved = "git+" + resolved
// https://github.com/npm/npm/issues/3224
- // node incorrectly sticks a / at the start of the path
- // We know that the host won't change, so split and detect this
+ // node incorrectly sticks a / at the start of the path We know that the
+ // host won't change, so split and detect this
var spo = origUrl.split(parsed.host)
var spr = resolved.split(parsed.host)
- if (spo[1].charAt(0) === ":" && spr[1].charAt(0) === "/")
+ if (spo[1].charAt(0) === ":" && spr[1].charAt(0) === "/") {
spr[1] = spr[1].slice(1)
+ }
resolved = spr.join(parsed.host)
log.verbose("resolved git url", resolved)
- next()
- })
- }
-
- function next () {
- mkdir(path.dirname(tmp), function (er) {
- if (er) return cb(er)
- var gzip = zlib.createGzip({ level: 9 })
- var args = ["archive", co, "--format=tar", "--prefix=package/"]
- var out = writeStream(tmp)
- var env = gitEnv()
- cb = once(cb)
- var cp = git.spawn(args, { env: env, cwd: p })
- cp.on("error", cb)
- cp.stderr.on("data", function(chunk) {
- log.silly(chunk.toString(), "git archive")
- })
+ cache(p, u, stdout, resolved, cb)
+ }
+ )
+}
- cp.stdout.pipe(gzip).pipe(out).on("close", function() {
- addLocalTarball(tmp, null, null, function(er, data) {
- if (data) data._resolved = resolved
- cb(er, data)
- })
- })
- })
- }
+/**
+ * Make an actual clone from the bare (mirrored) cache. There is no safe way to
+ * do a one-step clone to a treeish that isn't guaranteed to be a branch, so
+ * this has to be two steps.
+ */
+function cache (p, u, treeish, resolved, cb) {
+ var tmp = path.join(npm.tmp, Date.now()+"-"+Math.random(), treeish)
+ git.whichAndExec(
+ [ "clone", p, tmp ],
+ { cwd : p, env : gitEnv() },
+ function (er, stdout, stderr) {
+ stdout = (stdout + "\n" + stderr).trim()
+ if (er) {
+ log.error("Failed to clone "+resolved+" from "+u, stderr)
+ return cb(er)
+ }
+ log.verbose("git clone", "from", p)
+ log.verbose("git clone", stdout)
+
+ git.whichAndExec(
+ [ "checkout", treeish ],
+ { cwd : tmp, env : gitEnv() },
+ function (er, stdout, stderr) {
+ stdout = (stdout + "\n" + stderr).trim()
+ if (er) {
+ log.error("Failed to check out "+treeish, stderr)
+ return cb(er)
+ }
+ log.verbose("git checkout", stdout)
+
+ realizePackageSpecifier(tmp, function (er, spec) {
+ if (er) {
+ log.error("Failed to map", tmp, "to a package specifier")
+ return cb(er)
+ }
+
+ // https://github.com/npm/npm/issues/6400
+ // ensure pack logic is applied
+ addLocal(spec, null, function (er, data) {
+ if (data) data._resolved = resolved
+ cb(er, data)
+ })
+ })
+ }
+ )
+ }
+ )
}
var gitEnv_
@@ -224,7 +261,7 @@ function gitEnv () {
if (gitEnv_) return gitEnv_
gitEnv_ = {}
for (var k in process.env) {
- if (!~["GIT_PROXY_COMMAND","GIT_SSH","GIT_SSL_NO_VERIFY","GIT_SSL_CAINFO"].indexOf(k) && k.match(/^GIT/)) continue
+ if (!~VALID_VARIABLES.indexOf(k) && k.match(/^GIT/)) continue
gitEnv_[k] = process.env[k]
}
return gitEnv_
diff --git a/deps/npm/lib/cache/add-remote-tarball.js b/deps/npm/lib/cache/add-remote-tarball.js
index 9591ba89d2..e87ac54bb1 100644
--- a/deps/npm/lib/cache/add-remote-tarball.js
+++ b/deps/npm/lib/cache/add-remote-tarball.js
@@ -6,14 +6,13 @@ var mkdir = require("mkdirp")
, retry = require("retry")
, createWriteStream = require("fs-write-stream-atomic")
, npm = require("../npm.js")
- , registry = npm.registry
, inflight = require("inflight")
, addLocalTarball = require("./add-local-tarball.js")
, cacheFile = require("npm-cache-filename")
module.exports = addRemoteTarball
-function addRemoteTarball (u, pkgData, shasum, cb_) {
+function addRemoteTarball (u, pkgData, shasum, auth, cb_) {
assert(typeof u === "string", "must have module URL")
assert(typeof cb_ === "function", "must have callback")
@@ -42,11 +41,11 @@ function addRemoteTarball (u, pkgData, shasum, cb_) {
log.verbose("addRemoteTarball", [u, shasum])
mkdir(path.dirname(tmp), function (er) {
if (er) return cb(er)
- addRemoteTarball_(u, tmp, shasum, next)
+ addRemoteTarball_(u, tmp, shasum, auth, next)
})
}
-function addRemoteTarball_(u, tmp, shasum, cb) {
+function addRemoteTarball_ (u, tmp, shasum, auth, cb) {
// Tuned to spread 3 attempts over about a minute.
// See formula at .
var operation = retry.operation({
@@ -59,12 +58,12 @@ function addRemoteTarball_(u, tmp, shasum, cb) {
operation.attempt(function (currentAttempt) {
log.info("retry", "fetch attempt " + currentAttempt
+ " at " + (new Date()).toLocaleTimeString())
- fetchAndShaCheck(u, tmp, shasum, function (er, response, shasum) {
+ fetchAndShaCheck(u, tmp, shasum, auth, function (er, response, shasum) {
// Only retry on 408, 5xx or no `response`.
var sc = response && response.statusCode
var statusRetry = !sc || (sc === 408 || sc >= 500)
if (er && statusRetry && operation.retry(er)) {
- log.info("retry", "will retry, error on last attempt: " + er)
+ log.warn("retry", "will retry, error on last attempt: " + er)
return
}
cb(er, response, shasum)
@@ -72,8 +71,8 @@ function addRemoteTarball_(u, tmp, shasum, cb) {
})
}
-function fetchAndShaCheck (u, tmp, shasum, cb) {
- registry.fetch(u, null, function (er, response) {
+function fetchAndShaCheck (u, tmp, shasum, auth, cb) {
+ npm.registry.fetch(u, { auth : auth }, function (er, response) {
if (er) {
log.error("fetch failed", u)
return cb(er, response)
diff --git a/deps/npm/lib/cache/caching-client.js b/deps/npm/lib/cache/caching-client.js
new file mode 100644
index 0000000000..d81e6f53d6
--- /dev/null
+++ b/deps/npm/lib/cache/caching-client.js
@@ -0,0 +1,206 @@
+module.exports = CachingRegistryClient
+
+var path = require("path")
+ , fs = require("graceful-fs")
+ , url = require("url")
+ , assert = require("assert")
+ , inherits = require("util").inherits
+
+var RegistryClient = require("npm-registry-client")
+ , npm = require("../npm.js")
+ , log = require("npmlog")
+ , getCacheStat = require("./get-stat.js")
+ , cacheFile = require("npm-cache-filename")
+ , mkdirp = require("mkdirp")
+ , rimraf = require("rimraf")
+ , chownr = require("chownr")
+ , writeFile = require("write-file-atomic")
+
+function CachingRegistryClient (config) {
+ RegistryClient.call(this, adaptConfig(config))
+
+ this._mapToCache = cacheFile(config.get("cache"))
+
+ // swizzle in our custom cache invalidation logic
+ this._request = this.request
+ this.request = this._invalidatingRequest
+}
+inherits(CachingRegistryClient, RegistryClient)
+
+CachingRegistryClient.prototype._invalidatingRequest = function (uri, params, cb) {
+ var client = this
+ this._request.call(this, uri, params, function () {
+ var args = arguments
+
+ var method = params.method
+ if (method !== "HEAD" && method !== "GET") {
+ var invalidated = client._mapToCache(uri)
+ // invalidate cache
+ //
+ // This is irrelevant for commands that do etag caching, but ls and
+ // view also have a timed cache, so this keeps the user from thinking
+ // that it didn't work when it did.
+ // Note that failure is an acceptable option here, since the only
+ // result will be a stale cache for some helper commands.
+ client.log.verbose("request", "invalidating", invalidated, "on", method)
+ return rimraf(invalidated, function () {
+ cb.apply(undefined, args)
+ })
+ }
+
+ cb.apply(undefined, args)
+ })
+}
+
+CachingRegistryClient.prototype.get = function get (uri, params, cb) {
+ assert(typeof uri === "string", "must pass registry URI to get")
+ assert(params && typeof params === "object", "must pass params to get")
+ assert(typeof cb === "function", "must pass callback to get")
+
+ var parsed = url.parse(uri)
+ assert(
+ parsed.protocol === "http:" || parsed.protocol === "https:",
+ "must have a URL that starts with http: or https:"
+ )
+
+ var cacheBase = cacheFile(npm.config.get("cache"))(uri)
+ var cachePath = path.join(cacheBase, ".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, cachePath, params, cb)
+
+ var client = this
+ fs.stat(cachePath, function (er, stat) {
+ if (!er) {
+ fs.readFile(cachePath, function (er, data) {
+ try {
+ data = JSON.parse(data)
+ }
+ catch (ex) {
+ data = null
+ }
+
+ params.stat = stat
+ params.data = data
+
+ get_.call(client, uri, cachePath, params, cb)
+ })
+ }
+ else {
+ get_.call(client, uri, cachePath, params, cb)
+ }
+ })
+}
+
+function get_ (uri, cachePath, params, cb) {
+ var staleOk = params.staleOk === undefined ? false : params.staleOk
+ , timeout = params.timeout === undefined ? -1 : params.timeout
+ , data = params.data
+ , stat = params.stat
+ , etag
+
+ timeout = Math.min(timeout, npm.config.get("cache-max") || 0)
+ timeout = Math.max(timeout, npm.config.get("cache-min") || -Infinity)
+ if (process.env.COMP_CWORD !== undefined &&
+ process.env.COMP_LINE !== undefined &&
+ process.env.COMP_POINT !== undefined) {
+ timeout = Math.max(timeout, 60000)
+ }
+
+ if (data) {
+ if (data._etag) etag = data._etag
+
+ if (stat && timeout && timeout > 0) {
+ if ((Date.now() - stat.mtime.getTime())/1000 < timeout) {
+ log.verbose("get", uri, "not expired, no request")
+ delete data._etag
+ return cb(null, data, JSON.stringify(data), { statusCode : 304 })
+ }
+
+ if (staleOk) {
+ log.verbose("get", uri, "staleOk, background update")
+ delete data._etag
+ process.nextTick(
+ cb.bind(null, null, data, JSON.stringify(data), { statusCode : 304 } )
+ )
+ cb = function () {}
+ }
+ }
+ }
+
+ var options = {
+ etag : etag,
+ follow : params.follow,
+ auth : params.auth
+ }
+ this.request(uri, options, function (er, remoteData, raw, response) {
+ // if we get an error talking to the registry, but we have it
+ // from the cache, then just pretend we got it.
+ if (er && cachePath && data && !data.error) {
+ er = null
+ response = { statusCode: 304 }
+ }
+
+ if (response) {
+ log.silly("get", "cb", [response.statusCode, response.headers])
+ if (response.statusCode === 304 && etag) {
+ remoteData = data
+ log.verbose("etag", uri+" from cache")
+ }
+ }
+
+ data = remoteData
+ if (!data) er = er || new Error("failed to fetch from registry: " + uri)
+
+ if (er) return cb(er, data, raw, response)
+
+ saveToCache(cachePath, data, saved)
+
+ // just give the write the old college try. if it fails, whatever.
+ function saved () {
+ delete data._etag
+ cb(er, data, raw, response)
+ }
+
+ function saveToCache (cachePath, data, saved) {
+ getCacheStat(function (er, st) {
+ mkdirp(path.dirname(cachePath), function (er, made) {
+ if (er) return saved()
+
+ writeFile(cachePath, JSON.stringify(data), function (er) {
+ if (er || st.uid === null || st.gid === null) return saved()
+
+ chownr(made || cachePath, st.uid, st.gid, saved)
+ })
+ })
+ })
+ }
+ })
+}
+
+function adaptConfig (config) {
+ return {
+ proxy : {
+ http : config.get("proxy"),
+ https : config.get("https-proxy"),
+ localAddress : config.get("local-address")
+ },
+ ssl : {
+ certificate : config.get("cert"),
+ key : config.get("key"),
+ ca : config.get("ca"),
+ strict : config.get("strict-ssl")
+ },
+ retry : {
+ retries : config.get("fetch-retries"),
+ factor : config.get("fetch-retry-factor"),
+ minTimeout : config.get("fetch-retry-mintimeout"),
+ maxTimeout : config.get("fetch-retry-maxtimeout")
+ },
+ userAgent : config.get("user-agent"),
+ log : log,
+ defaultTag : config.get("tag"),
+ couchToken : config.get("_token")
+ }
+}
diff --git a/deps/npm/lib/cache/update-index.js b/deps/npm/lib/cache/update-index.js
new file mode 100644
index 0000000000..2955f6a148
--- /dev/null
+++ b/deps/npm/lib/cache/update-index.js
@@ -0,0 +1,100 @@
+module.exports = updateIndex
+
+var fs = require("graceful-fs")
+ , assert = require("assert")
+ , path = require("path")
+ , mkdir = require("mkdirp")
+ , chownr = require("chownr")
+ , url = require("url")
+ , npm = require("../npm.js")
+ , log = require("npmlog")
+ , cacheFile = require("npm-cache-filename")
+ , getCacheStat = require("./get-stat.js")
+
+/* /-/all is special.
+ * It uses timestamp-based caching and partial updates,
+ * because it is a monster.
+ */
+function updateIndex (uri, params, cb) {
+ assert(typeof uri === "string", "must pass registry URI to updateIndex")
+ assert(params && typeof params === "object", "must pass params to updateIndex")
+ assert(typeof cb === "function", "must pass callback to updateIndex")
+
+ var parsed = url.parse(uri)
+ assert(
+ parsed.protocol === "http:" || parsed.protocol === "https:",
+ "must have a URL that starts with http: or https:"
+ )
+
+ var cacheBase = cacheFile(npm.config.get("cache"))(uri)
+ var cachePath = path.join(cacheBase, ".cache.json")
+ log.info("updateIndex", cachePath)
+
+ getCacheStat(function (er, st) {
+ if (er) return cb(er)
+
+ mkdir(cacheBase, function (er, made) {
+ if (er) return cb(er)
+
+ fs.readFile(cachePath, function (er, data) {
+ if (er) return updateIndex_(uri, params, 0, {}, cachePath, cb)
+
+ try {
+ data = JSON.parse(data)
+ }
+ catch (ex) {
+ fs.writeFile(cachePath, "{}", function (er) {
+ if (er) return cb(new Error("Broken cache."))
+
+ return updateIndex_(uri, params, 0, {}, cachePath, cb)
+ })
+ }
+ var t = +data._updated || 0
+ chownr(made || cachePath, st.uid, st.gid, function (er) {
+ if (er) return cb(er)
+
+ updateIndex_(uri, params, t, data, cachePath, cb)
+ })
+ })
+ })
+ })
+}
+
+function updateIndex_ (uri, params, t, data, cachePath, cb) {
+ // use the cache and update in the background if it's not too old
+ if (Date.now() - t < 60000) {
+ cb(null, data)
+ cb = function () {}
+ }
+
+ var full
+ if (t === 0) {
+ log.warn("", "Building the local index for the first time, please be patient")
+ full = url.resolve(uri, "/-/all")
+ }
+ else {
+ full = url.resolve(uri, "/-/all/since?stale=update_after&startkey=" + t)
+ }
+
+ npm.registry.request(full, params, function (er, updates, _, res) {
+ if (er) return cb(er, data)
+
+ var headers = res.headers
+ var updated = updates._updated || Date.parse(headers.date)
+
+ Object.keys(updates).forEach(function (p) { data[p] = updates[p] })
+
+ data._updated = updated
+ getCacheStat(function (er, st) {
+ if (er) return cb(er)
+
+ fs.writeFile(cachePath, JSON.stringify(data), function (er) {
+ delete data._updated
+ if (er) return cb(er)
+ chownr(cachePath, st.uid, st.gid, function (er) {
+ cb(er, data)
+ })
+ })
+ })
+ })
+}
diff --git a/deps/npm/lib/config/defaults.js b/deps/npm/lib/config/defaults.js
index 7bd672114d..febd1049ed 100644
--- a/deps/npm/lib/config/defaults.js
+++ b/deps/npm/lib/config/defaults.js
@@ -189,9 +189,8 @@ Object.defineProperty(exports, "defaults", {get: function () {
, prefix : globalPrefix
, production: process.env.NODE_ENV === "production"
, "proprietary-attribs": true
- , proxy : process.env.HTTP_PROXY || process.env.http_proxy || null
- , "https-proxy" : process.env.HTTPS_PROXY || process.env.https_proxy ||
- process.env.HTTP_PROXY || process.env.http_proxy || null
+ , proxy : null
+ , "https-proxy" : null
, "user-agent" : "npm/{npm-version} "
+ "node/{node-version} "
+ "{platform} "
diff --git a/deps/npm/lib/config/nerf-dart.js b/deps/npm/lib/config/nerf-dart.js
index 3b26a56c65..07c817500f 100644
--- a/deps/npm/lib/config/nerf-dart.js
+++ b/deps/npm/lib/config/nerf-dart.js
@@ -13,9 +13,11 @@ module.exports = toNerfDart
*/
function toNerfDart(uri) {
var parsed = url.parse(uri)
- parsed.pathname = "/"
delete parsed.protocol
delete parsed.auth
+ delete parsed.query
+ delete parsed.search
+ delete parsed.hash
- return url.format(parsed)
+ return url.resolve(url.format(parsed), ".")
}
diff --git a/deps/npm/lib/dedupe.js b/deps/npm/lib/dedupe.js
index 74397d0cb9..6a4abd7307 100644
--- a/deps/npm/lib/dedupe.js
+++ b/deps/npm/lib/dedupe.js
@@ -240,10 +240,10 @@ function findVersions (npm, summary, cb) {
var versions = data.versions
var ranges = data.ranges
- mapToRegistry(name, npm.config, function (er, uri) {
+ mapToRegistry(name, npm.config, function (er, uri, auth) {
if (er) return cb(er)
- npm.registry.get(uri, null, next)
+ npm.registry.get(uri, { auth : auth }, next)
})
function next (er, data) {
diff --git a/deps/npm/lib/deprecate.js b/deps/npm/lib/deprecate.js
index 17dd4eab0c..c90ad90272 100644
--- a/deps/npm/lib/deprecate.js
+++ b/deps/npm/lib/deprecate.js
@@ -12,13 +12,16 @@ deprecate.completion = function (opts, cb) {
if (opts.conf.argv.remain.length > 2) return cb()
// get the list of packages by user
var path = "/-/by-user/"
- mapToRegistry(path, npm.config, function (er, uri) {
+ mapToRegistry(path, npm.config, function (er, uri, c) {
if (er) return cb(er)
- var c = npm.config.getCredentialsByURI(uri)
if (!(c && c.username)) return cb()
- npm.registry.get(uri + c.username, { timeout : 60000 }, function (er, list) {
+ var params = {
+ timeout : 60000,
+ auth : c
+ }
+ npm.registry.get(uri + c.username, params, function (er, list) {
if (er) return cb()
console.error(list)
return cb(null, list[c.username])
@@ -34,11 +37,14 @@ function deprecate (args, cb) {
// fetch the data and make sure it exists.
var p = npa(pkg)
- mapToRegistry(p.name, npm.config, next)
-
- function next (er, uri) {
+ mapToRegistry(p.name, npm.config, function (er, uri, auth) {
if (er) return cb(er)
- npm.registry.deprecate(uri, p.spec, msg, cb)
- }
+ var params = {
+ version : p.spec,
+ message : msg,
+ auth : auth
+ }
+ npm.registry.deprecate(uri, params, cb)
+ })
}
diff --git a/deps/npm/lib/docs.js b/deps/npm/lib/docs.js
index dead3f7551..9abe740a3c 100644
--- a/deps/npm/lib/docs.js
+++ b/deps/npm/lib/docs.js
@@ -4,23 +4,22 @@ docs.usage = "npm docs "
docs.usage += "\n"
docs.usage += "npm docs ."
+var npm = require("./npm.js")
+ , opener = require("opener")
+ , path = require("path")
+ , log = require("npmlog")
+ , mapToRegistry = require("./utils/map-to-registry.js")
+
docs.completion = function (opts, cb) {
- mapToRegistry("/-/short", npm.config, function (er, uri) {
+ mapToRegistry("/-/short", npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri, { timeout : 60000 }, function (er, list) {
+ npm.registry.get(uri, { timeout : 60000, auth : auth }, function (er, list) {
return cb(null, list || [])
})
})
}
-var npm = require("./npm.js")
- , registry = npm.registry
- , opener = require("opener")
- , path = require("path")
- , log = require("npmlog")
- , mapToRegistry = require("./utils/map-to-registry.js")
-
function url (json) {
return json.homepage ? json.homepage : "https://npmjs.org/package/" + json.name
}
@@ -28,7 +27,7 @@ function url (json) {
function docs (args, cb) {
args = args || []
var pending = args.length
- if (!pending) return getDoc('.', cb)
+ if (!pending) return getDoc(".", cb)
args.forEach(function(proj) {
getDoc(proj, function(err) {
if (err) {
@@ -40,10 +39,10 @@ function docs (args, cb) {
}
function getDoc (project, cb) {
- project = project || '.'
+ project = project || "."
var package = path.resolve(npm.localPrefix, "package.json")
- if (project === '.' || project === './') {
+ if (project === "." || project === "./") {
var json
try {
json = require(package)
@@ -57,10 +56,10 @@ function getDoc (project, cb) {
return opener(url(json), { command: npm.config.get("browser") }, cb)
}
- mapToRegistry(project, npm.config, function (er, uri) {
+ mapToRegistry(project, npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri + "/latest", { timeout : 3600 }, next)
+ npm.registry.get(uri + "/latest", { timeout : 3600, auth : auth }, next)
})
function next (er, json) {
diff --git a/deps/npm/lib/explore.js b/deps/npm/lib/explore.js
index e87e839354..96475a0691 100644
--- a/deps/npm/lib/explore.js
+++ b/deps/npm/lib/explore.js
@@ -6,7 +6,7 @@ explore.usage = "npm explore [ -- ]"
explore.completion = require("./utils/completion/installed-shallow.js")
var npm = require("./npm.js")
- , spawn = require("child_process").spawn
+ , spawn = require("./utils/spawn")
, path = require("path")
, fs = require("graceful-fs")
diff --git a/deps/npm/lib/help.js b/deps/npm/lib/help.js
index 747bd5020d..07d9219496 100644
--- a/deps/npm/lib/help.js
+++ b/deps/npm/lib/help.js
@@ -7,7 +7,7 @@ help.completion = function (opts, cb) {
}
var path = require("path")
- , spawn = require("child_process").spawn
+ , spawn = require("./utils/spawn")
, npm = require("./npm.js")
, log = require("npmlog")
, opener = require("opener")
diff --git a/deps/npm/lib/init.js b/deps/npm/lib/init.js
index 925654beef..401e700af3 100644
--- a/deps/npm/lib/init.js
+++ b/deps/npm/lib/init.js
@@ -31,11 +31,11 @@ function init (args, cb) {
initJson(dir, initFile, npm.config, function (er, data) {
log.resume()
log.silly("package data", data)
- log.info("init", "written successfully")
if (er && er.message === "canceled") {
log.warn("init", "canceled")
return cb(null, data)
}
+ log.info("init", "written successfully")
cb(er, data)
})
}
diff --git a/deps/npm/lib/install.js b/deps/npm/lib/install.js
index e539307aff..756d12ee36 100644
--- a/deps/npm/lib/install.js
+++ b/deps/npm/lib/install.js
@@ -33,11 +33,11 @@ install.completion = function (opts, cb) {
// if it has a slash, then it's gotta be a folder
// if it starts with https?://, then just give up, because it's a url
// for now, not yet implemented.
- var registry = npm.registry
- mapToRegistry("-/short", npm.config, function (er, uri) {
+ mapToRegistry("-/short", npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri, null, function (er, pkgs) {
+ var options = { auth : auth }
+ npm.registry.get(uri, options, function (er, pkgs) {
if (er) return cb()
if (!opts.partialWord) return cb(null, pkgs)
@@ -53,7 +53,7 @@ install.completion = function (opts, cb) {
mapToRegistry(pkgs[0], npm.config, function (er, uri) {
if (er) return cb(er)
- registry.get(uri, null, function (er, d) {
+ npm.registry.get(uri, options, function (er, d) {
if (er) return cb()
return cb(null, Object.keys(d["dist-tags"] || {})
.concat(Object.keys(d.versions || {}))
diff --git a/deps/npm/lib/ls.js b/deps/npm/lib/ls.js
index ed329d19e1..eee4f2772e 100644
--- a/deps/npm/lib/ls.js
+++ b/deps/npm/lib/ls.js
@@ -250,8 +250,7 @@ function makeArchy_ (data, long, dir, depth, parent, d) {
if (data._found === true && data._id) {
if (npm.color) {
out.label = color.bgBlack(color.yellow(out.label.trim())) + " "
- }
- else {
+ } else {
out.label = out.label.trim() + " "
}
}
@@ -291,10 +290,13 @@ function makeArchy_ (data, long, dir, depth, parent, d) {
}
// now all the children.
- out.nodes = Object.keys(data.dependencies || {})
- .sort(alphasort).map(function (d) {
- return makeArchy_(data.dependencies[d], long, dir, depth + 1, data, d)
- })
+ out.nodes = []
+ if (depth <= npm.config.get("depth")) {
+ out.nodes = Object.keys(data.dependencies || {})
+ .sort(alphasort).map(function (d) {
+ return makeArchy_(data.dependencies[d], long, dir, depth + 1, data, d)
+ })
+ }
if (out.nodes.length === 0 && data.path === dir) {
out.nodes = ["(empty)"]
diff --git a/deps/npm/lib/npm.js b/deps/npm/lib/npm.js
index e933a1346c..d03ec47b6b 100644
--- a/deps/npm/lib/npm.js
+++ b/deps/npm/lib/npm.js
@@ -22,8 +22,7 @@ var EventEmitter = require("events").EventEmitter
, path = require("path")
, abbrev = require("abbrev")
, which = require("which")
- , semver = require("semver")
- , RegClient = require("npm-registry-client")
+ , CachingRegClient = require("./cache/caching-client.js")
, charSpin = require("char-spinner")
npm.config = {
@@ -41,7 +40,6 @@ npm.commands = {}
npm.rollbacks = []
try {
- var pv = process.version.replace(/^v/, '')
// startup, ok to do this synchronously
var j = JSON.parse(fs.readFileSync(
path.join(__dirname, "../package.json"))+"")
@@ -86,6 +84,7 @@ var commandCache = {}
, "find-dupes": "dedupe"
, "ddp": "dedupe"
, "v": "view"
+ , "verison": "version"
}
, aliasNames = Object.keys(aliases)
@@ -142,16 +141,21 @@ var commandCache = {}
]
, plumbing = [ "build"
, "unbuild"
- , "isntall"
, "xmas"
, "substack"
, "visnup"
]
- , fullList = npm.fullList = cmdList.concat(aliasNames).filter(function (c) {
+ , littleGuys = [ "isntall" ]
+ , fullList = cmdList.concat(aliasNames).filter(function (c) {
return plumbing.indexOf(c) === -1
})
, abbrevs = abbrev(fullList)
+// we have our reasons
+fullList = npm.fullList = fullList.filter(function (c) {
+ return littleGuys.indexOf(c) === -1
+})
+
npm.spinner =
{ int: null
, started: false
@@ -351,7 +355,7 @@ function load (npm, cli, cb) {
// at this point the configs are all set.
// go ahead and spin up the registry client.
- npm.registry = new RegClient(npm.config)
+ npm.registry = new CachingRegClient(npm.config)
var umask = npm.config.get("umask")
npm.modes = { exec: 0777 & (~umask)
diff --git a/deps/npm/lib/outdated.js b/deps/npm/lib/outdated.js
index fdfd7624db..fe25a8e910 100644
--- a/deps/npm/lib/outdated.js
+++ b/deps/npm/lib/outdated.js
@@ -22,7 +22,6 @@ outdated.completion = require("./utils/completion/installed-deep.js")
var path = require("path")
- , fs = require("graceful-fs")
, readJson = require("read-package-json")
, cache = require("./cache.js")
, asyncMap = require("slide").asyncMap
@@ -35,6 +34,7 @@ var path = require("path")
, os = require("os")
, mapToRegistry = require("./utils/map-to-registry.js")
, npa = require("npm-package-arg")
+ , readInstalled = require("read-installed")
function outdated (args, silent, cb) {
if (typeof cb !== "function") cb = silent, silent = false
@@ -193,11 +193,12 @@ function outdated_ (args, dir, parentHas, depth, cb) {
})
var has = null
- fs.readdir(path.resolve(dir, "node_modules"), function (er, pkgs) {
+ readInstalled(path.resolve(dir), { dev : true }, function (er, data) {
if (er) {
has = Object.create(parentHas)
return next()
}
+ var pkgs = Object.keys(data.dependencies)
pkgs = pkgs.filter(function (p) {
return !p.match(/^[\._-]/)
})
@@ -205,6 +206,7 @@ function outdated_ (args, dir, parentHas, depth, cb) {
var jsonFile = path.resolve(dir, "node_modules", pkg, "package.json")
readJson(jsonFile, function (er, d) {
if (er && er.code !== "ENOENT" && er.code !== "ENOTDIR") return cb(er)
+ if (d && d.name && d.private) delete deps[d.name]
cb(null, er ? [] : [[d.name, d.version, d._from]])
})
}, function (er, pvs) {
@@ -269,10 +271,10 @@ function shouldUpdate (args, dir, dep, has, req, depth, cb) {
return doIt("git", "git")
// search for the latest package
- mapToRegistry(dep, npm.config, function (er, uri) {
+ mapToRegistry(dep, npm.config, function (er, uri, auth) {
if (er) return cb(er)
- npm.registry.get(uri, null, updateDeps)
+ npm.registry.get(uri, { auth : auth }, updateDeps)
})
function updateDeps (er, d) {
diff --git a/deps/npm/lib/owner.js b/deps/npm/lib/owner.js
index 2fdee7adb6..7b34508337 100644
--- a/deps/npm/lib/owner.js
+++ b/deps/npm/lib/owner.js
@@ -1,4 +1,3 @@
-
module.exports = owner
owner.usage = "npm owner add "
@@ -6,7 +5,6 @@ owner.usage = "npm owner add "
+ "\nnpm owner ls "
var npm = require("./npm.js")
- , registry = npm.registry
, log = require("npmlog")
, readJson = require("read-package-json")
, mapToRegistry = require("./utils/map-to-registry.js")
@@ -29,21 +27,21 @@ owner.completion = function (opts, cb) {
switch (argv[2]) {
case "ls":
if (argv.length > 3) return cb()
- return mapToRegistry("-/short", npm.config, function (er, uri) {
+ return mapToRegistry("-/short", npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri, null, cb)
+ npm.registry.get(uri, { auth : auth }, cb)
})
case "rm":
if (argv.length > 3) {
theUser = encodeURIComponent(argv[3])
byUser = "-/by-user/" + theUser + "|" + un
- return mapToRegistry(byUser, npm.config, function (er, uri) {
+ return mapToRegistry(byUser, npm.config, function (er, uri, auth) {
if (er) return cb(er)
console.error(uri)
- registry.get(uri, null, function (er, d) {
+ npm.registry.get(uri, { auth : auth }, function (er, d) {
if (er) return cb(er)
// return the intersection
return cb(null, d[theUser].filter(function (p) {
@@ -58,11 +56,11 @@ owner.completion = function (opts, cb) {
if (argv.length > 3) {
theUser = encodeURIComponent(argv[3])
byUser = "-/by-user/" + theUser + "|" + un
- return mapToRegistry(byUser, npm.config, function (er, uri) {
+ return mapToRegistry(byUser, npm.config, function (er, uri, auth) {
if (er) return cb(er)
console.error(uri)
- registry.get(uri, null, function (er, d) {
+ npm.registry.get(uri, { auth : auth }, function (er, d) {
console.error(uri, er || d)
// return mine that they're not already on.
if (er) return cb(er)
@@ -75,10 +73,10 @@ owner.completion = function (opts, cb) {
})
}
// just list all users who aren't me.
- return mapToRegistry("-/users", npm.config, function (er, uri) {
+ return mapToRegistry("-/users", npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri, null, function (er, list) {
+ npm.registry.get(uri, { auth : auth }, function (er, list) {
if (er) return cb()
return cb(null, Object.keys(list).filter(function (n) {
return n !== un
@@ -109,10 +107,10 @@ function ls (pkg, cb) {
ls(pkg, cb)
})
- mapToRegistry(pkg, npm.config, function (er, uri) {
+ mapToRegistry(pkg, npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri, null, function (er, data) {
+ npm.registry.get(uri, { auth : auth }, function (er, data) {
var msg = ""
if (er) {
log.error("owner ls", "Couldn't get owner data", pkg)
@@ -161,7 +159,7 @@ function rm (user, pkg, cb) {
})
log.verbose("owner rm", "%s from %s", user, pkg)
- mutate(pkg, null, function (u, owners) {
+ mutate(pkg, user, function (u, owners) {
var found = false
, m = owners.filter(function (o) {
var match = (o.name === user)
@@ -181,10 +179,10 @@ function rm (user, pkg, cb) {
function mutate (pkg, user, mutation, cb) {
if (user) {
var byUser = "-/user/org.couchdb.user:" + user
- mapToRegistry(byUser, npm.config, function (er, uri) {
+ mapToRegistry(byUser, npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri, null, mutate_)
+ npm.registry.get(uri, { auth : auth }, mutate_)
})
} else {
mutate_(null, null)
@@ -200,31 +198,52 @@ function mutate (pkg, user, mutation, cb) {
}
if (u) u = { "name" : u.name, "email" : u.email }
- mapToRegistry(pkg, npm.config, function (er, uri) {
+ mapToRegistry(pkg, npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri, null, function (er, data) {
+ npm.registry.get(uri, { auth : auth }, function (er, data) {
if (er) {
log.error("owner mutate", "Error getting package data for %s", pkg)
return cb(er)
}
+
+ // save the number of maintainers before mutation so that we can figure
+ // out if maintainers were added or removed
+ var beforeMutation = data.maintainers.length
+
var m = mutation(u, data.maintainers)
if (!m) return cb() // handled
if (m instanceof Error) return cb(m) // error
- data = { _id : data._id
- , _rev : data._rev
- , maintainers : m
- }
- var dataPath = pkg + "/-rev/" + data._rev
- mapToRegistry(dataPath, npm.config, function (er, uri) {
+
+ data = {
+ _id : data._id,
+ _rev : data._rev,
+ maintainers : m
+ }
+ var dataPath = pkg.replace("/", "%2f") + "/-rev/" + data._rev
+ mapToRegistry(dataPath, npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.request("PUT", uri, { body : data }, function (er, data) {
- if (!er && data.error) er = new Error(
- "Failed to update package metadata: " + JSON.stringify(data))
+ var params = {
+ method : "PUT",
+ body : data,
+ auth : auth
+ }
+ npm.registry.request(uri, params, function (er, data) {
+ if (!er && data.error) {
+ er = new Error("Failed to update package metadata: "+JSON.stringify(data))
+ }
+
if (er) {
log.error("owner mutate", "Failed to update package metadata")
}
+ else if (m.length > beforeMutation) {
+ console.log("+ %s (%s)", user, pkg)
+ }
+ else if (m.length < beforeMutation) {
+ console.log("- %s (%s)", user, pkg)
+ }
+
cb(er, data)
})
})
diff --git a/deps/npm/lib/publish.js b/deps/npm/lib/publish.js
index 2a0fcff5a5..f179bd4222 100644
--- a/deps/npm/lib/publish.js
+++ b/deps/npm/lib/publish.js
@@ -1,17 +1,17 @@
module.exports = publish
-var url = require("url")
- , npm = require("./npm.js")
+var npm = require("./npm.js")
, log = require("npmlog")
, path = require("path")
, readJson = require("read-package-json")
, lifecycle = require("./utils/lifecycle.js")
, chain = require("slide").chain
, Conf = require("./config/core.js").Conf
- , RegClient = require("npm-registry-client")
+ , CachingRegClient = require("./cache/caching-client.js")
, mapToRegistry = require("./utils/map-to-registry.js")
, cachedPackageRoot = require("./cache/cached-package-root.js")
+ , createReadStream = require("graceful-fs").createReadStream
publish.usage = "npm publish "
+ "\nnpm publish "
@@ -87,7 +87,7 @@ function publish_ (arg, data, isRetry, cachedir, cb) {
s[k] = data.publishConfig[k]
return s
}, {}))
- registry = new RegClient(config)
+ registry = new CachingRegClient(config)
}
data._npmVersion = npm.version
@@ -101,21 +101,29 @@ function publish_ (arg, data, isRetry, cachedir, cb) {
)
)
- mapToRegistry(data.name, config, function (er, registryURI) {
+ mapToRegistry(data.name, config, function (er, registryURI, auth, registryBase) {
if (er) return cb(er)
- var tarball = cachedir + ".tgz"
+ var tarballPath = cachedir + ".tgz"
// we just want the base registry URL in this case
- var registryBase = url.resolve(registryURI, ".")
log.verbose("publish", "registryBase", registryBase)
+ log.silly("publish", "uploading", tarballPath)
- var c = config.getCredentialsByURI(registryBase)
- data._npmUser = {name: c.username, email: c.email}
+ data._npmUser = {
+ name : auth.username,
+ email : auth.email
+ }
+
+ var params = {
+ metadata : data,
+ body : createReadStream(tarballPath),
+ auth : auth
+ }
- registry.publish(registryBase, data, tarball, function (er) {
- if (er && er.code === "EPUBLISHCONFLICT"
- && npm.config.get("force") && !isRetry) {
+ registry.publish(registryBase, params, function (er) {
+ if (er && er.code === "EPUBLISHCONFLICT" &&
+ npm.config.get("force") && !isRetry) {
log.warn("publish", "Forced publish over " + data._id)
return npm.commands.unpublish([data._id], function (er) {
// ignore errors. Use the force. Reach out with your feelings.
diff --git a/deps/npm/lib/repo.js b/deps/npm/lib/repo.js
index c6db8e37b0..3db4a16bc9 100644
--- a/deps/npm/lib/repo.js
+++ b/deps/npm/lib/repo.js
@@ -3,21 +3,9 @@ module.exports = repo
repo.usage = "npm repo "
-repo.completion = function (opts, cb) {
- if (opts.conf.argv.remain.length > 2) return cb()
- mapToRegistry("/-/short", npm.config, function (er, uri) {
- if (er) return cb(er)
-
- registry.get(uri, { timeout : 60000 }, function (er, list) {
- return cb(null, list || [])
- })
- })
-}
-
var npm = require("./npm.js")
- , registry = npm.registry
, opener = require("opener")
- , github = require('github-url-from-git')
+ , github = require("github-url-from-git")
, githubUserRepo = require("github-url-from-username-repo")
, path = require("path")
, readJson = require("read-package-json")
@@ -26,6 +14,17 @@ var npm = require("./npm.js")
, mapToRegistry = require("./utils/map-to-registry.js")
, npa = require("npm-package-arg")
+repo.completion = function (opts, cb) {
+ if (opts.conf.argv.remain.length > 2) return cb()
+ mapToRegistry("/-/short", npm.config, function (er, uri) {
+ if (er) return cb(er)
+
+ npm.registry.get(uri, { timeout : 60000 }, function (er, list) {
+ return cb(null, list || [])
+ })
+ })
+}
+
function repo (args, cb) {
var n = args.length && npa(args[0]).name || "."
fs.stat(n, function (er, s) {
@@ -41,18 +40,18 @@ function repo (args, cb) {
function getUrlAndOpen (d, cb) {
var r = d.repository
- if (!r) return cb(new Error('no repository'))
+ if (!r) return cb(new Error("no repository"))
// XXX remove this when npm@v1.3.10 from node 0.10 is deprecated
// from https://github.com/npm/npm-www/issues/418
if (githubUserRepo(r.url))
r.url = githubUserRepo(r.url)
- var url = (r.url && ~r.url.indexOf('github'))
+ var url = (r.url && ~r.url.indexOf("github"))
? github(r.url)
: nonGithubUrl(r.url)
if (!url)
- return cb(new Error('no repository: could not get url'))
+ return cb(new Error("no repository: could not get url"))
opener(url, { command: npm.config.get("browser") }, cb)
}
@@ -60,7 +59,7 @@ function callRegistry (n, cb) {
mapToRegistry(n, npm.config, function (er, uri) {
if (er) return cb(er)
- registry.get(uri + "/latest", { timeout : 3600 }, function (er, d) {
+ npm.registry.get(uri + "/latest", { timeout : 3600 }, function (er, d) {
if (er) return cb(er)
getUrlAndOpen(d, cb)
})
@@ -69,16 +68,16 @@ function callRegistry (n, cb) {
function nonGithubUrl (url) {
try {
- var idx = url.indexOf('@')
+ var idx = url.indexOf("@")
if (idx !== -1) {
- url = url.slice(idx+1).replace(/:([^\d]+)/, '/$1')
+ url = url.slice(idx+1).replace(/:([^\d]+)/, "/$1")
}
url = url_.parse(url)
- var protocol = url.protocol === 'https:'
- ? 'https:'
- : 'http:'
- return protocol + '//' + (url.host || '') +
- url.path.replace(/\.git$/, '')
+ var protocol = url.protocol === "https:"
+ ? "https:"
+ : "http:"
+ return protocol + "//" + (url.host || "") +
+ url.path.replace(/\.git$/, "")
}
catch(e) {}
}
diff --git a/deps/npm/lib/run-script.js b/deps/npm/lib/run-script.js
index 4495b93c48..fd26a0c43b 100644
--- a/deps/npm/lib/run-script.js
+++ b/deps/npm/lib/run-script.js
@@ -1,4 +1,3 @@
-
module.exports = runScript
var lifecycle = require("./utils/lifecycle.js")
@@ -124,6 +123,13 @@ function run (pkg, wd, cmd, args, cb) {
"prestart", "start", "poststart"
]
} else {
+ if (!pkg.scripts[cmd]) {
+ if (cmd === "test") {
+ pkg.scripts.test = "echo \"Error: no test specified\"";
+ } else {
+ return cb(new Error("missing script: " + cmd));
+ }
+ }
cmds = [cmd]
}
diff --git a/deps/npm/lib/search.js b/deps/npm/lib/search.js
index 5dd060f829..ad3f312e54 100644
--- a/deps/npm/lib/search.js
+++ b/deps/npm/lib/search.js
@@ -2,9 +2,9 @@
module.exports = exports = search
var npm = require("./npm.js")
- , registry = npm.registry
- , columnify = require('columnify')
+ , columnify = require("columnify")
, mapToRegistry = require("./utils/map-to-registry.js")
+ , updateIndex = require("./cache/update-index.js")
search.usage = "npm search [some search terms ...]"
@@ -58,15 +58,16 @@ function search (args, silent, staleness, cb) {
}
function getFilteredData (staleness, args, notArgs, cb) {
- var opts = {
- timeout : staleness,
- follow : true,
- staleOk : true
- }
- mapToRegistry("-/all", npm.config, function (er, uri) {
+ mapToRegistry("-/all", npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri, opts, function (er, data) {
+ var params = {
+ timeout : staleness,
+ follow : true,
+ staleOk : true,
+ auth : auth
+ }
+ updateIndex(uri, params, function (er, data) {
if (er) return cb(er)
return cb(null, filter(data, args, notArgs))
})
@@ -164,7 +165,7 @@ function prettify (data, args) {
dat.keywords = dat.keywords.split(/[,\s]+/)
}
if (Array.isArray(dat.keywords)) {
- dat.keywords = dat.keywords.join(' ')
+ dat.keywords = dat.keywords.join(" ")
}
// split author on whitespace or ,
@@ -172,7 +173,7 @@ function prettify (data, args) {
dat.author = dat.author.split(/[,\s]+/)
}
if (Array.isArray(dat.author)) {
- dat.author = dat.author.join(' ')
+ dat.author = dat.author.join(" ")
}
return dat
})
@@ -194,7 +195,7 @@ function prettify (data, args) {
include: columns
, truncate: truncate
, config: {
- name: { maxWidth: 40, truncate: false, truncateMarker: '' }
+ name: { maxWidth: 40, truncate: false, truncateMarker: "" }
, description: { maxWidth: 60 }
, author: { maxWidth: 20 }
, date: { maxWidth: 11 }
@@ -260,9 +261,9 @@ function getMaxWidth() {
function trimToMaxWidth(str) {
var maxWidth = getMaxWidth()
- return str.split('\n').map(function(line) {
+ return str.split("\n").map(function(line) {
return line.slice(0, maxWidth)
- }).join('\n')
+ }).join("\n")
}
function highlightSearchTerms(str, terms) {
diff --git a/deps/npm/lib/star.js b/deps/npm/lib/star.js
index 123c4ebbb4..d2e69deb94 100644
--- a/deps/npm/lib/star.js
+++ b/deps/npm/lib/star.js
@@ -2,7 +2,6 @@
module.exports = star
var npm = require("./npm.js")
- , registry = npm.registry
, log = require("npmlog")
, asyncMap = require("slide").asyncMap
, mapToRegistry = require("./utils/map-to-registry.js")
@@ -11,10 +10,14 @@ star.usage = "npm star [pkg, pkg, ...]\n"
+ "npm unstar [pkg, pkg, ...]"
star.completion = function (opts, cb) {
- mapToRegistry("-/short", npm.config, function (er, uri) {
+ mapToRegistry("-/short", npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri, { timeout : 60000 }, function (er, list) {
+ var params = {
+ timeout : 60000,
+ auth : auth
+ }
+ npm.registry.get(uri, params, function (er, list) {
return cb(null, list || [])
})
})
@@ -27,10 +30,14 @@ function star (args, cb) {
, using = !(npm.command.match(/^un/))
if (!using) s = u
asyncMap(args, function (pkg, cb) {
- mapToRegistry(pkg, npm.config, function (er, uri) {
+ mapToRegistry(pkg, npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.star(uri, using, function (er, data, raw, req) {
+ var params = {
+ starred : using,
+ auth : auth
+ }
+ npm.registry.star(uri, params, function (er, data, raw, req) {
if (!er) {
console.log(s + " "+pkg)
log.verbose("star", data)
diff --git a/deps/npm/lib/stars.js b/deps/npm/lib/stars.js
index dee5c152af..087e8d9bf2 100644
--- a/deps/npm/lib/stars.js
+++ b/deps/npm/lib/stars.js
@@ -3,17 +3,20 @@ module.exports = stars
stars.usage = "npm stars [username]"
var npm = require("./npm.js")
- , registry = npm.registry
, log = require("npmlog")
, mapToRegistry = require("./utils/map-to-registry.js")
function stars (args, cb) {
npm.commands.whoami([], true, function (er, username) {
var name = args.length === 1 ? args[0] : username
- mapToRegistry("", npm.config, function (er, uri) {
+ mapToRegistry("", npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.stars(uri, name, showstars)
+ var params = {
+ username : name,
+ auth : auth
+ }
+ npm.registry.stars(uri, params, showstars)
})
})
diff --git a/deps/npm/lib/tag.js b/deps/npm/lib/tag.js
index 47e9a8c0ac..bc7ec91879 100644
--- a/deps/npm/lib/tag.js
+++ b/deps/npm/lib/tag.js
@@ -6,7 +6,6 @@ tag.usage = "npm tag @ []"
tag.completion = require("./unpublish.js").completion
var npm = require("./npm.js")
- , registry = npm.registry
, mapToRegistry = require("./utils/map-to-registry.js")
, npa = require("npm-package-arg")
, semver = require("semver")
@@ -26,9 +25,14 @@ function tag (args, cb) {
return cb(er)
}
- mapToRegistry(project, npm.config, function (er, uri) {
+ mapToRegistry(project, npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.tag(uri, version, t, cb)
+ var params = {
+ version : version,
+ tag : t,
+ auth : auth
+ }
+ npm.registry.tag(uri, params, cb)
})
}
diff --git a/deps/npm/lib/unbuild.js b/deps/npm/lib/unbuild.js
index 8bd6e8507f..df57c5b346 100644
--- a/deps/npm/lib/unbuild.js
+++ b/deps/npm/lib/unbuild.js
@@ -27,7 +27,7 @@ function unbuild_ (silent) { return function (folder, cb_) {
log.verbose("unbuild", folder.substr(npm.prefix.length + 1))
readJson(path.resolve(folder, "package.json"), function (er, pkg) {
// if no json, then just trash it, but no scripts or whatever.
- if (er) return gentlyRm(folder, false, cb)
+ if (er) return gentlyRm(folder, false, npm.prefix, cb)
readJson.cache.del(folder)
chain
( [ [lifecycle, pkg, "preuninstall", folder, false, true]
@@ -38,7 +38,7 @@ function unbuild_ (silent) { return function (folder, cb_) {
}
, [rmStuff, pkg, folder]
, [lifecycle, pkg, "postuninstall", folder, false, true]
- , [gentlyRm, folder, undefined] ]
+ , [gentlyRm, folder, false, npm.prefix] ]
, cb )
})
}}
@@ -63,15 +63,12 @@ function rmStuff (pkg, folder, cb) {
function rmBins (pkg, folder, parent, top, cb) {
if (!pkg.bin) return cb()
var binRoot = top ? npm.bin : path.resolve(parent, ".bin")
- log.verbose([binRoot, pkg.bin], "binRoot")
asyncMap(Object.keys(pkg.bin), function (b, cb) {
if (process.platform === "win32") {
- chain([ [gentlyRm, path.resolve(binRoot, b) + ".cmd", undefined]
- , [gentlyRm, path.resolve(binRoot, b), undefined] ], cb)
+ chain([ [gentlyRm, path.resolve(binRoot, b) + ".cmd", true]
+ , [gentlyRm, path.resolve(binRoot, b), true] ], cb)
} else {
- gentlyRm( path.resolve(binRoot, b)
- , !npm.config.get("force") && folder
- , cb )
+ gentlyRm(path.resolve(binRoot, b), true, cb)
}
}, cb)
}
@@ -84,6 +81,7 @@ function rmMans (pkg, folder, parent, top, cb) {
return cb()
}
var manRoot = path.resolve(npm.config.get("prefix"), "share", "man")
+ log.verbose("rmMans", "man files are", pkg.man, "in", manRoot)
asyncMap(pkg.man, function (man, cb) {
if (Array.isArray(man)) {
man.forEach(rmMan)
@@ -91,21 +89,28 @@ function rmMans (pkg, folder, parent, top, cb) {
rmMan(man)
}
- function rmMan(man) {
- var parseMan = man.match(/(.*)\.([0-9]+)(\.gz)?$/)
- , stem = parseMan[1]
- , sxn = parseMan[2]
- , gz = parseMan[3] || ""
- , bn = path.basename(stem)
- , manDest = path.join( manRoot
- , "man"+sxn
- , (bn.indexOf(pkg.name) === 0 ? bn
- : pkg.name + "-" + bn)
- + "." + sxn + gz
- )
- gentlyRm( manDest
- , !npm.config.get("force") && folder
- , cb )
+ function rmMan (man) {
+ log.silly("rmMan", "preparing to remove", man)
+ var parseMan = man.match(/(.*\.([0-9]+)(\.gz)?)$/)
+ if (!parseMan) {
+ log.error(
+ "rmMan", man, "is not a valid name for a man file.",
+ "Man files must end with a number, " +
+ "and optionally a .gz suffix if they are compressed."
+ )
+ return cb()
+ }
+
+ var stem = parseMan[1]
+ var sxn = parseMan[2]
+ var gz = parseMan[3] || ""
+ var bn = path.basename(stem)
+ var manDest = path.join(
+ manRoot,
+ "man"+sxn,
+ (bn.indexOf(pkg.name) === 0 ? bn : pkg.name+"-"+bn)+"."+sxn+gz
+ )
+ gentlyRm(manDest, true, cb)
}
}, cb)
}
diff --git a/deps/npm/lib/unpublish.js b/deps/npm/lib/unpublish.js
index 2566cd5ae6..da03b0dcc8 100644
--- a/deps/npm/lib/unpublish.js
+++ b/deps/npm/lib/unpublish.js
@@ -3,7 +3,6 @@ module.exports = unpublish
var log = require("npmlog")
, npm = require("./npm.js")
- , registry = npm.registry
, readJson = require("read-package-json")
, path = require("path")
, mapToRegistry = require("./utils/map-to-registry.js")
@@ -19,10 +18,10 @@ unpublish.completion = function (opts, cb) {
var un = encodeURIComponent(username)
if (!un) return cb()
var byUser = "-/by-user/" + un
- mapToRegistry(byUser, npm.config, function (er, uri) {
+ mapToRegistry(byUser, npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri, null, function (er, pkgs) {
+ npm.registry.get(uri, { auth : auth }, function (er, pkgs) {
// do a bit of filtering at this point, so that we don't need
// to fetch versions for more than one thing, but also don't
// accidentally a whole project.
@@ -33,10 +32,10 @@ unpublish.completion = function (opts, cb) {
return p.indexOf(pp) === 0
})
if (pkgs.length > 1) return cb(null, pkgs)
- mapToRegistry(pkgs[0], npm.config, function (er, uri) {
+ mapToRegistry(pkgs[0], npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri, null, function (er, d) {
+ npm.registry.get(uri, { auth : auth }, function (er, d) {
if (er) return cb(er)
var vers = Object.keys(d.versions)
if (!vers.length) return cb(null, pkgs)
@@ -92,10 +91,14 @@ function gotProject (project, version, cb_) {
return cb(er)
}
- mapToRegistry(project, npm.config, function (er, uri) {
+ mapToRegistry(project, npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.unpublish(uri, version, cb)
+ var params = {
+ version : version,
+ auth : auth
+ }
+ npm.registry.unpublish(uri, params, cb)
})
})
}
diff --git a/deps/npm/lib/utils/completion/file-completion.js b/deps/npm/lib/utils/completion/file-completion.js
index 5201a15ff6..6ce2f83467 100644
--- a/deps/npm/lib/utils/completion/file-completion.js
+++ b/deps/npm/lib/utils/completion/file-completion.js
@@ -15,10 +15,8 @@ function fileCompletion (root, req, depth, cb) {
glob(pattern, opts, function (er, files) {
if (er) return cb(er)
return cb(null, (files || []).map(function (f) {
- return path.join(req, f.substr(root.length + 1)
- .substr((f === req ? path.dirname(req)
- : req).length)
- .replace(/^\//, ""))
+ var tail = f.substr(root.length + 1).replace(/^\//, "")
+ return path.join(req, tail)
}))
})
})
diff --git a/deps/npm/lib/utils/error-handler.js b/deps/npm/lib/utils/error-handler.js
index 95b78a8ccb..12c6dd407b 100644
--- a/deps/npm/lib/utils/error-handler.js
+++ b/deps/npm/lib/utils/error-handler.js
@@ -181,7 +181,7 @@ function errorHandler (er) {
case "ELIFECYCLE":
log.error("", er.message)
- log.error("", ["","Failed at the "+er.pkgid+" "+er.stage+" script."
+ log.error("", ["","Failed at the "+er.pkgid+" "+er.stage+" script '"+er.script+"'."
,"This is most likely a problem with the "+er.pkgname+" package,"
,"not with npm itself."
,"Tell the author that this fails on your system:"
@@ -339,6 +339,14 @@ function errorHandler (er) {
].join("\n"))
break
+ case "ENOENT":
+ log.error("enoent", [er.message
+ ,"This is most likely not a problem with npm itself"
+ ,"and is related to npm not being able to find a file."
+ ,er.file?"\nCheck if the file '"+er.file+"' is present.":""
+ ].join("\n"))
+ break
+
default:
log.error("", er.message || er)
log.error("", ["", "If you need help, you may report this error at:"
diff --git a/deps/npm/lib/utils/gently-rm.js b/deps/npm/lib/utils/gently-rm.js
index d43d0725eb..587ad0eb1b 100644
--- a/deps/npm/lib/utils/gently-rm.js
+++ b/deps/npm/lib/utils/gently-rm.js
@@ -11,13 +11,19 @@ var npm = require("../npm.js")
, readlink = require("graceful-fs").readlink
, isInside = require("path-is-inside")
, vacuum = require("fs-vacuum")
- , rimraf = require("rimraf")
, some = require("async-some")
+ , asyncMap = require("slide").asyncMap
+ , normalize = require("path").normalize
+
+function gentlyRm (path, gently, base, cb) {
+ if (!cb) {
+ cb = base
+ base = undefined
+ }
-function gentlyRm (path, gently, cb) {
if (!cb) {
cb = gently
- gently = null
+ gently = false
}
// never rm the root, prefix, or bin dirs.
@@ -27,7 +33,7 @@ function gentlyRm (path, gently, cb) {
npm.globalDir, npm.globalRoot, npm.globalBin, npm.globalPrefix
]
- var resolved = resolve(path)
+ var resolved = normalize(resolve(path))
if (prefixes.indexOf(resolved) !== -1) {
log.verbose("gentlyRm", resolved, "is part of npm and can't be removed")
return cb(new Error("May not delete: "+resolved))
@@ -35,13 +41,14 @@ function gentlyRm (path, gently, cb) {
var options = {log : log.silly.bind(log, "gentlyRm")}
if (npm.config.get("force") || !gently) options.purge = true
+ if (base) options.base = normalize(base)
if (!gently) {
log.verbose("gentlyRm", "vacuuming", resolved)
return vacuum(resolved, options, cb)
}
- var parent = resolve(gently)
+ var parent = options.base = normalize(base ? base : npm.prefix)
log.verbose("gentlyRm", "verifying that", parent, "is managed by npm")
some(prefixes, isManaged(parent), function (er, matched) {
if (er) return cb(er)
@@ -56,7 +63,6 @@ function gentlyRm (path, gently, cb) {
if (isInside(resolved, parent)) {
log.silly("gentlyRm", resolved, "is under", parent)
log.verbose("gentlyRm", "vacuuming", resolved, "up to", parent)
- options.base = parent
return vacuum(resolved, options, cb)
}
@@ -94,7 +100,7 @@ function gentlyRm (path, gently, cb) {
if (matched) {
log.silly("gentlyRm", source, "is under", matched)
log.verbose("gentlyRm", "removing", resolved)
- rimraf(resolved, cb)
+ vacuum(resolved, options, cb)
}
log.verbose("gentlyRm", source, "is not managed by npm")
@@ -107,55 +113,55 @@ function gentlyRm (path, gently, cb) {
var resolvedPaths = {}
function isManaged (target) {
- return predicate
-
- function predicate (path, cb) {
+ return function predicate (path, cb) {
if (!path) {
log.verbose("isManaged", "no path")
return cb(null, false)
}
- path = resolve(path)
-
- // if the path has already been memoized, return immediately
- var resolved = resolvedPaths[path]
- if (resolved) {
- var inside = isInside(target, resolved)
- log.silly("isManaged", target, inside ? "is" : "is not", "inside", resolved)
-
- return cb(null, inside && path)
- }
-
- // otherwise, check the path
- lstat(path, function (er, stat) {
+ asyncMap([path, target], resolveSymlink, function (er, results) {
if (er) {
if (er.code === "ENOENT") return cb(null, false)
return cb(er)
}
- // if it's not a link, cache & test the path itself
- if (!stat.isSymbolicLink()) return cacheAndTest(path, path, target, cb)
+ var path = results[0]
+ var target = results[1]
+ var inside = isInside(target, path)
+ log.silly("isManaged", target, inside ? "is" : "is not", "inside", path)
- // otherwise, cache & test the link's source
- readlink(path, function (er, source) {
- if (er) {
- if (er.code === "ENOENT") return cb(null, false)
+ return cb(null, inside && path)
+ })
+ }
- return cb(er)
- }
+ function resolveSymlink (toResolve, cb) {
+ var resolved = resolve(toResolve)
+
+ // if the path has already been memoized, return immediately
+ var cached = resolvedPaths[resolved]
+ if (cached) return cb(null, cached)
+
+ // otherwise, check the path
+ lstat(resolved, function (er, stat) {
+ if (er) return cb(er)
+
+ // if it's not a link, cache & return the path itself
+ if (!stat.isSymbolicLink()) {
+ resolvedPaths[resolved] = resolved
+ return cb(null, resolved)
+ }
- cacheAndTest(resolve(path, source), path, target, cb)
+ // otherwise, cache & return the link's source
+ readlink(resolved, function (er, source) {
+ if (er) return cb(er)
+
+ resolved = resolve(resolved, source)
+ resolvedPaths[resolved] = resolved
+ cb(null, resolved)
})
})
}
-
- function cacheAndTest (resolved, source, target, cb) {
- resolvedPaths[source] = resolved
- var inside = isInside(target, resolved)
- log.silly("cacheAndTest", target, inside ? "is" : "is not", "inside", resolved)
- cb(null, inside && source)
- }
}
function clobberFail (p, g, cb) {
diff --git a/deps/npm/lib/utils/git.js b/deps/npm/lib/utils/git.js
index db5cc7baf0..78cb083eef 100644
--- a/deps/npm/lib/utils/git.js
+++ b/deps/npm/lib/utils/git.js
@@ -6,37 +6,37 @@ exports.chainableExec = chainableExec
exports.whichAndExec = whichAndExec
var exec = require("child_process").execFile
- , spawn = require("child_process").spawn
+ , spawn = require("./spawn")
, npm = require("../npm.js")
, which = require("which")
, git = npm.config.get("git")
, assert = require("assert")
, log = require("npmlog")
-function prefixGitArgs() {
+function prefixGitArgs () {
return process.platform === "win32" ? ["-c", "core.longpaths=true"] : []
}
-function execGit(args, options, cb) {
+function execGit (args, options, cb) {
log.info("git", args)
return exec(git, prefixGitArgs().concat(args || []), options, cb)
}
-function spawnGit(args, options, cb) {
+function spawnGit (args, options) {
log.info("git", args)
return spawn(git, prefixGitArgs().concat(args || []), options)
}
-function chainableExec() {
+function chainableExec () {
var args = Array.prototype.slice.call(arguments)
return [execGit].concat(args)
}
-function whichGit(cb) {
+function whichGit (cb) {
return which(git, cb)
}
-function whichAndExec(args, options, cb) {
+function whichAndExec (args, options, cb) {
assert.equal(typeof cb, "function", "no callback provided")
// check for git
whichGit(function (err) {
diff --git a/deps/npm/lib/utils/lifecycle.js b/deps/npm/lib/utils/lifecycle.js
index c0eb83dfb1..ccee756308 100644
--- a/deps/npm/lib/utils/lifecycle.js
+++ b/deps/npm/lib/utils/lifecycle.js
@@ -3,7 +3,7 @@ exports.cmd = cmd
exports.makeEnv = makeEnv
var log = require("npmlog")
- , spawn = require("child_process").spawn
+ , spawn = require("./spawn")
, npm = require("../npm.js")
, path = require("path")
, fs = require("graceful-fs")
diff --git a/deps/npm/lib/utils/map-to-registry.js b/deps/npm/lib/utils/map-to-registry.js
index cf665e4f65..bd68a26d42 100644
--- a/deps/npm/lib/utils/map-to-registry.js
+++ b/deps/npm/lib/utils/map-to-registry.js
@@ -6,8 +6,8 @@ var log = require("npmlog")
module.exports = mapToRegistry
function mapToRegistry(name, config, cb) {
- var uri
- var scopedRegistry
+ log.silly("mapToRegistry", "name", name)
+ var registry
// the name itself takes precedence
var data = npa(name)
@@ -15,40 +15,42 @@ function mapToRegistry(name, config, cb) {
// the name is definitely scoped, so escape now
name = name.replace("/", "%2f")
- log.silly("mapToRegistry", "scope", data.scope)
+ log.silly("mapToRegistry", "scope (from package name)", data.scope)
- scopedRegistry = config.get(data.scope + ":registry")
- if (scopedRegistry) {
- log.silly("mapToRegistry", "scopedRegistry (scoped package)", scopedRegistry)
- uri = url.resolve(scopedRegistry, name)
- }
- else {
- log.verbose("mapToRegistry", "no registry URL found for scope", data.scope)
+ registry = config.get(data.scope + ":registry")
+ if (!registry) {
+ log.verbose("mapToRegistry", "no registry URL found in name for scope", data.scope)
}
}
// ...then --scope=@scope or --scope=scope
var scope = config.get("scope")
- if (!uri && scope) {
+ if (!registry && scope) {
// I'm an enabler, sorry
if (scope.charAt(0) !== "@") scope = "@" + scope
- scopedRegistry = config.get(scope + ":registry")
- if (scopedRegistry) {
- log.silly("mapToRegistry", "scopedRegistry (scope in config)", scopedRegistry)
- uri = url.resolve(scopedRegistry, name)
- }
- else {
- log.verbose("mapToRegistry", "no registry URL found for scope", scope)
+ log.silly("mapToRegistry", "scope (from config)", scope)
+
+ registry = config.get(scope + ":registry")
+ if (!registry) {
+ log.verbose("mapToRegistry", "no registry URL found in config for scope", scope)
}
}
// ...and finally use the default registry
- if (!uri) {
- uri = url.resolve(config.get("registry"), name)
+ if (!registry) {
+ log.silly("mapToRegistry", "using default registry")
+ registry = config.get("registry")
}
- log.verbose("mapToRegistry", "name", name)
- log.verbose("mapToRegistry", "uri", uri)
- cb(null, uri)
+ log.silly("mapToRegistry", "registry", registry)
+
+ var auth = config.getCredentialsByURI(registry)
+
+ // normalize registry URL so resolution doesn't drop a piece of registry URL
+ var normalized = registry.slice(-1) !== "/" ? registry+"/" : registry
+ var uri = url.resolve(normalized, name)
+ log.silly("mapToRegistry", "uri", uri)
+
+ cb(null, uri, auth, normalized)
}
diff --git a/deps/npm/lib/utils/spawn.js b/deps/npm/lib/utils/spawn.js
new file mode 100644
index 0000000000..953671857d
--- /dev/null
+++ b/deps/npm/lib/utils/spawn.js
@@ -0,0 +1,23 @@
+module.exports = spawn
+
+var _spawn = require("child_process").spawn
+var EventEmitter = require("events").EventEmitter
+
+function spawn (cmd, args, options) {
+ var raw = _spawn(cmd, args, options)
+ var cooked = new EventEmitter()
+
+ raw.on("error", function (er) {
+ er.file = cmd
+ cooked.emit("error", er)
+ }).on("close", function (code, signal) {
+ cooked.emit("close", code, signal)
+ })
+
+ cooked.stdin = raw.stdin
+ cooked.stdout = raw.stdout
+ cooked.stderr = raw.stderr
+ cooked.kill = function (sig) { return raw.kill(sig) }
+
+ return cooked
+}
diff --git a/deps/npm/lib/utils/tar.js b/deps/npm/lib/utils/tar.js
index ede49a121e..7656b5d975 100644
--- a/deps/npm/lib/utils/tar.js
+++ b/deps/npm/lib/utils/tar.js
@@ -4,6 +4,7 @@
var npm = require("../npm.js")
, fs = require("graceful-fs")
, writeFileAtomic = require("write-file-atomic")
+ , writeStreamAtomic = require("fs-write-stream-atomic")
, path = require("path")
, log = require("npmlog")
, uidNumber = require("uid-number")
@@ -65,7 +66,7 @@ function pack_ (tarball, folder, pkg, cb) {
if (er) log.error("tar.pack", "gzip error "+tarball)
cb(er)
})
- .pipe(fstream.Writer({ type: "File", path: tarball }))
+ .pipe(writeStreamAtomic(tarball))
.on("error", function (er) {
if (er) log.error("tar.pack", "Could not write "+tarball)
cb(er)
@@ -228,8 +229,7 @@ function gunzTarPerm (tarball, target, dMode, fMode, uid, gid, cb_) {
cb(er)
})
.on("close", cb)
- } else if (c.toString().match(/^package\//) ||
- c.toString().match(/^pax_global_header/)) {
+ } else if (hasTarHeader(c)) {
// naked tar
fst
.pipe(tar.Extract(extractOpts))
@@ -273,3 +273,19 @@ function gunzTarPerm (tarball, target, dMode, fMode, uid, gid, cb_) {
fst.emit("data", c)
})
}
+
+function hasTarHeader (c) {
+ return c[257] === 0x75 && // tar archives have 7573746172 at position
+ c[258] === 0x73 && // 257 and 003030 or 202000 at position 262
+ c[259] === 0x74 &&
+ c[260] === 0x61 &&
+ c[261] === 0x72 &&
+
+ ((c[262] === 0x00 &&
+ c[263] === 0x30 &&
+ c[264] === 0x30) ||
+
+ (c[262] === 0x20 &&
+ c[263] === 0x20 &&
+ c[264] === 0x00))
+}
diff --git a/deps/npm/lib/version.js b/deps/npm/lib/version.js
index a15e2c391c..930708676e 100644
--- a/deps/npm/lib/version.js
+++ b/deps/npm/lib/version.js
@@ -2,16 +2,15 @@
module.exports = version
-var exec = require("child_process").execFile
- , semver = require("semver")
+var semver = require("semver")
, path = require("path")
, fs = require("graceful-fs")
, writeFileAtomic = require("write-file-atomic")
, chain = require("slide").chain
, log = require("npmlog")
- , which = require("which")
, npm = require("./npm.js")
, git = require("./utils/git.js")
+ , assert = require("assert")
version.usage = "npm version [ | major | minor | patch | prerelease | preminor | premajor ]\n"
+ "\n(run in package dir)\n"
@@ -24,104 +23,156 @@ version.usage = "npm version [ | major | minor | patch | prerelease
function version (args, silent, cb_) {
if (typeof cb_ !== "function") cb_ = silent, silent = false
if (args.length > 1) return cb_(version.usage)
- fs.readFile(path.join(npm.localPrefix, "package.json"), function (er, data) {
- if (!args.length) {
- var v = {}
- Object.keys(process.versions).forEach(function (k) {
- v[k] = process.versions[k]
- })
- v.npm = npm.version
- try {
- data = JSON.parse(data.toString())
- } catch (er) {
- data = null
- }
- if (data && data.name && data.version) {
- v[data.name] = data.version
- }
- if (npm.config.get("json")) {
- v = JSON.stringify(v, null, 2)
- }
- console.log(v)
- return cb_()
+
+ var packagePath = path.join(npm.localPrefix, "package.json")
+ fs.readFile(packagePath, function (er, data) {
+ function cb (er) {
+ if (!er && !silent) console.log("v" + data.version)
+ cb_(er)
+ }
+
+ if (data) data = data.toString()
+ try {
+ data = JSON.parse(data)
+ }
+ catch (er) {
+ log.error("version", "Bad package.json data", data)
+ return cb_(er)
}
+ if (!args.length && data) return dump(data.name, data.version, cb_)
+
if (er) {
log.error("version", "No package.json found")
return cb_(er)
}
+ var newVersion = semver.valid(args[0])
+ if (!newVersion) newVersion = semver.inc(data.version, args[0])
+ if (!newVersion) return cb_(version.usage)
+ if (data.version === newVersion) return cb_(new Error("Version not changed"))
+ data.version = newVersion
+
+ checkGit(function (er, hasGit) {
+ if (er) return cb_(er)
+
+ write(data, "package.json", function (er) {
+ if (er) return cb_(er)
+
+ updateShrinkwrap(newVersion, function (er, hasShrinkwrap) {
+ if (er || !hasGit) return cb(er)
+
+ commit(data.version, hasShrinkwrap, cb)
+ })
+ })
+ })
+ })
+}
+
+function updateShrinkwrap (newVersion, cb) {
+ fs.readFile(path.join(npm.localPrefix, "npm-shrinkwrap.json"), function (er, data) {
+ if (er && er.code === "ENOENT") return cb(null, false)
+
try {
+ data = data.toString()
data = JSON.parse(data)
- } catch (er) {
- log.error("version", "Bad package.json data")
- return cb_(er)
+ }
+ catch (er) {
+ log.error("version", "Bad npm-shrinkwrap.json data")
+ return cb(er)
}
- var newVer = semver.valid(args[0])
- if (!newVer) newVer = semver.inc(data.version, args[0])
- if (!newVer) return cb_(version.usage)
- if (data.version === newVer) return cb_(new Error("Version not changed"))
- data.version = newVer
-
- fs.stat(path.join(npm.localPrefix, ".git"), function (er, s) {
- function cb (er) {
- if (!er && !silent) console.log("v" + newVer)
- cb_(er)
+ data.version = newVersion
+ write(data, "npm-shrinkwrap.json", function (er) {
+ if (er) {
+ log.error("version", "Bad npm-shrinkwrap.json data")
+ return cb(er)
}
-
- var tags = npm.config.get('git-tag-version')
- var doGit = !er && s.isDirectory() && tags
- if (!doGit) return write(data, cb)
- else checkGit(data, cb)
+ cb(null, true)
})
})
}
-function checkGit (data, cb) {
- var args = [ "status", "--porcelain" ]
- var options = {env: process.env}
-
- // check for git
- git.whichAndExec(args, options, function (er, stdout) {
- if (er && er.code === "ENOGIT") {
- log.warn(
- "version",
- "This is a Git checkout, but the git command was not found.",
- "npm could not create a Git tag for this release!"
- )
- return write(data, cb)
+function dump (name, version, cb) {
+ assert(typeof name === "string", "package name must be passed to version dump")
+ assert(typeof version === "string", "package version must be passed to version dump")
+
+ var v = {}
+
+ if (name) v[name] = version
+ v.npm = npm.version
+ Object.keys(process.versions).forEach(function (k) {
+ v[k] = process.versions[k]
+ })
+
+ if (npm.config.get("json")) v = JSON.stringify(v, null, 2)
+
+ console.log(v)
+ cb()
+}
+
+function checkGit (cb) {
+ fs.stat(path.join(npm.localPrefix, ".git"), function (er, s) {
+ var doGit = !er && s.isDirectory() && npm.config.get("git-tag-version")
+ if (!doGit) {
+ if (er) log.verbose("version", "error checking for .git", er)
+ log.verbose("version", "not tagging in git")
+ return cb(null, false)
}
- var lines = stdout.trim().split("\n").filter(function (line) {
- return line.trim() && !line.match(/^\?\? /)
- }).map(function (line) {
- return line.trim()
- })
- if (lines.length) return cb(new Error(
- "Git working directory not clean.\n"+lines.join("\n")))
- write(data, function (er) {
- if (er) return cb(er)
- var message = npm.config.get("message").replace(/%s/g, data.version)
- , sign = npm.config.get("sign-git-tag")
- , flag = sign ? "-sm" : "-am"
- chain
- ( [ git.chainableExec([ "add", "package.json" ], {env: process.env})
- , git.chainableExec([ "commit", "-m", message ], {env: process.env})
- , sign && function (cb) {
- npm.spinner.stop()
- cb()
- }
-
- , git.chainableExec([ "tag", "v" + data.version, flag, message ]
- , {env: process.env}) ]
- , cb )
- })
+ // check for git
+ git.whichAndExec(
+ [ "status", "--porcelain" ],
+ { env : process.env },
+ function (er, stdout) {
+ if (er && er.code === "ENOGIT") {
+ log.warn(
+ "version",
+ "This is a Git checkout, but the git command was not found.",
+ "npm could not create a Git tag for this release!"
+ )
+ return cb(null, false)
+ }
+
+ var lines = stdout.trim().split("\n").filter(function (line) {
+ return line.trim() && !line.match(/^\?\? /)
+ }).map(function (line) {
+ return line.trim()
+ })
+ if (lines.length) return cb(new Error(
+ "Git working directory not clean.\n"+lines.join("\n")
+ ))
+
+ cb(null, true)
+ }
+ )
})
}
-function write (data, cb) {
- writeFileAtomic( path.join(npm.localPrefix, "package.json")
- , new Buffer(JSON.stringify(data, null, 2) + "\n")
- , cb )
+function commit (version, hasShrinkwrap, cb) {
+ var options = { env : process.env }
+ var message = npm.config.get("message").replace(/%s/g, version)
+ var sign = npm.config.get("sign-git-tag")
+ var flag = sign ? "-sm" : "-am"
+ chain(
+ [
+ git.chainableExec([ "add", "package.json" ], options),
+ hasShrinkwrap && git.chainableExec([ "add", "npm-shrinkwrap.json" ] , options),
+ git.chainableExec([ "commit", "-m", message ], options),
+ git.chainableExec([ "tag", "v" + version, flag, message ], options)
+ ],
+ cb
+ )
+}
+
+function write (data, file, cb) {
+ assert(data && typeof data === "object", "must pass data to version write")
+ assert(typeof file === "string", "must pass filename to write to version write")
+
+ log.verbose("version.write", "data", data, "to", file)
+ writeFileAtomic(
+ path.join(npm.localPrefix, file),
+ new Buffer(JSON.stringify(data, null, 2) + "\n"),
+ cb
+ )
}
diff --git a/deps/npm/lib/view.js b/deps/npm/lib/view.js
index 6b45cca2ec..bd20ab5a3f 100644
--- a/deps/npm/lib/view.js
+++ b/deps/npm/lib/view.js
@@ -3,20 +3,29 @@
module.exports = view
view.usage = "npm view pkg[@version] [[.subfield]...]"
+var npm = require("./npm.js")
+ , readJson = require("read-package-json")
+ , log = require("npmlog")
+ , util = require("util")
+ , semver = require("semver")
+ , mapToRegistry = require("./utils/map-to-registry.js")
+ , npa = require("npm-package-arg")
+ , path = require("path")
+
view.completion = function (opts, cb) {
if (opts.conf.argv.remain.length <= 2) {
- return mapToRegistry("-/short", npm.config, function (er, uri) {
+ return mapToRegistry("-/short", npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri, null, cb)
+ npm.registry.get(uri, { auth : auth }, cb)
})
}
// have the package, get the fields.
var tag = npm.config.get("tag")
- mapToRegistry(opts.conf.argv.remain[2], npm.config, function (er, uri) {
+ mapToRegistry(opts.conf.argv.remain[2], npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri, null, function (er, d) {
+ npm.registry.get(uri, { auth : auth }, function (er, d) {
if (er) return cb(er)
var dv = d.versions[d["dist-tags"][tag]]
, fields = []
@@ -48,16 +57,6 @@ view.completion = function (opts, cb) {
}
}
-var npm = require("./npm.js")
- , readJson = require("read-package-json")
- , registry = npm.registry
- , log = require("npmlog")
- , util = require("util")
- , semver = require("semver")
- , mapToRegistry = require("./utils/map-to-registry.js")
- , npa = require("npm-package-arg")
- , path = require("path")
-
function view (args, silent, cb) {
if (typeof cb !== "function") cb = silent, silent = false
@@ -97,10 +96,10 @@ function fetchAndRead (nv, args, silent, cb) {
var name = nv.name
, version = nv.rawSpec || npm.config.get("tag")
- mapToRegistry(name, npm.config, function (er, uri) {
+ mapToRegistry(name, npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri, null, function (er, data) {
+ npm.registry.get(uri, { auth : auth }, function (er, data) {
if (er) return cb(er)
if (data["dist-tags"] && data["dist-tags"].hasOwnProperty(version)) {
version = data["dist-tags"][version]
diff --git a/deps/npm/lib/whoami.js b/deps/npm/lib/whoami.js
index b33f93743d..121c4336ae 100644
--- a/deps/npm/lib/whoami.js
+++ b/deps/npm/lib/whoami.js
@@ -14,14 +14,14 @@ function whoami (args, silent, cb) {
var registry = npm.config.get("registry")
if (!registry) return cb(new Error("no default registry set"))
- var credentials = npm.config.getCredentialsByURI(registry)
- if (credentials) {
- if (credentials.username) {
- if (!silent) console.log(credentials.username)
- return process.nextTick(cb.bind(this, null, credentials.username))
+ var auth = npm.config.getCredentialsByURI(registry)
+ if (auth) {
+ if (auth.username) {
+ if (!silent) console.log(auth.username)
+ return process.nextTick(cb.bind(this, null, auth.username))
}
- else if (credentials.token) {
- return npm.registry.whoami(registry, function (er, username) {
+ else if (auth.token) {
+ return npm.registry.whoami(registry, { auth : auth }, function (er, username) {
if (er) return cb(er)
if (!silent) console.log(username)
diff --git a/deps/npm/man/man1/npm-README.1 b/deps/npm/man/man1/npm-README.1
index a7cf1046f0..4f274c5c91 100644
--- a/deps/npm/man/man1/npm-README.1
+++ b/deps/npm/man/man1/npm-README.1
@@ -1,6 +1,6 @@
-.TH "NPM" "1" "October 2014" "" ""
+.TH "NPM" "1" "January 2015" "" ""
.SH "NAME"
-\fBnpm\fR \- node package manager
+\fBnpm\fR \- a JavaScript package manager
.P
Build Status \fIhttps://img\.shields\.io/travis/npm/npm/master\.svg\fR \fIhttps://travis\-ci\.org/npm/npm\fR
.SH SYNOPSIS
@@ -32,13 +32,13 @@ paths, etc\.) then read on\.
.SH Fancy Install (Unix)
.P
There's a pretty robust install script at
-https://www\.npmjs\.org/install\.sh\|\. You can download that and run it\.
+https://www\.npmjs\.com/install\.sh\|\. You can download that and run it\.
.P
Here's an example using curl:
.P
.RS 2
.nf
-curl \-L https://npmjs\.org/install\.sh | sh
+curl \-L https://npmjs\.com/install\.sh | sh
.fi
.RE
.SS Slightly Fancier
@@ -67,47 +67,21 @@ If you've got the npm source code, you can also semi\-permanently set
arbitrary config keys using the \fB\|\./configure \-\-key=val \.\.\.\fR, and then
run npm commands by doing \fBnode cli\.js \fR\|\. (This is helpful
for testing, or running stuff without actually installing npm itself\.)
-.SH Fancy Windows Install
+.SH Windows Install or Upgrade
.P
-You can download a zip file from https://npmjs\.org/dist/, and unpack it
+You can download a zip file from https://github\.com/npm/npm/releases, and unpack it
in the same folder where node\.exe lives\.
.P
+The latest version in a zip file is 1\.4\.12\. To upgrade to npm 2, follow the
+Windows upgrade instructions in the npm Troubleshooting Guide:
+.P
+https://github\.com/npm/npm/wiki/Troubleshooting#upgrading\-on\-windows
+.P
If that's not fancy enough for you, then you can fetch the code with
git, and mess with it directly\.
.SH Installing on Cygwin
.P
No\.
-.SH Permissions when Using npm to Install Other Stuff
-.P
-\fBtl;dr\fR
-.RS 0
-.IP \(bu 2
-Use \fBsudo\fR for greater safety\. Or don't, if you prefer not to\.
-.IP \(bu 2
-npm will downgrade permissions if it's root before running any build
-scripts that package authors specified\.
-
-.RE
-.SS More details\.\.\.
-.P
-As of version 0\.3, it is recommended to run npm as root\.
-This allows npm to change the user identifier to the \fBnobody\fR user prior
-to running any package build or test commands\.
-.P
-If you are not the root user, or if you are on a platform that does not
-support uid switching, then npm will not attempt to change the userid\.
-.P
-If you would like to ensure that npm \fBalways\fR runs scripts as the
-"nobody" user, and have it fail if it cannot downgrade permissions, then
-set the following configuration param:
-.P
-.RS 2
-.nf
-npm config set unsafe\-perm false
-.fi
-.RE
-.P
-This will prevent running in unsafe mode, even as non\-root users\.
.SH Uninstalling
.P
So sad to see you go\.
@@ -199,13 +173,13 @@ 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
.P
-Check out the docs \fIhttps://www\.npmjs\.org/doc/\fR,
-especially the faq \fIhttps://www\.npmjs\.org/doc/faq\.html\fR\|\.
+Check out the docs \fIhttps://docs\.npmjs\.com/\fR,
+especially the faq \fIhttps://docs\.npmjs\.com/misc/faq\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://www\.npmjs\.org/doc/developers\.html\fR
+you should read this \fIhttps://docs\.npmjs\.com/misc/developers\fR
.SH Legal Stuff
.P
"npm" and "The npm Registry" are owned by npm, Inc\.
@@ -224,7 +198,7 @@ specific purpose, or lack of malice in any given npm package\.
.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
+owner \fIhttps://docs\.npmjs\.com/misc/disputes\fR, please email
support@npmjs\.com and explain the situation\.
.P
Any data published to The npm Registry (including user account
@@ -252,9 +226,6 @@ When you find issues, please report them:
.IP \(bu 2
web:
https://github\.com/npm/npm/issues
-.IP \(bu 2
-email:
-npm\-@googlegroups\.com
.RE
.P
diff --git a/deps/npm/man/man1/npm-adduser.1 b/deps/npm/man/man1/npm-adduser.1
index 6b85986e02..b3abf17b68 100644
--- a/deps/npm/man/man1/npm-adduser.1
+++ b/deps/npm/man/man1/npm-adduser.1
@@ -1,4 +1,4 @@
-.TH "NPM\-ADDUSER" "1" "October 2014" "" ""
+.TH "NPM\-ADDUSER" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-adduser\fR \- Add a registry user account
.SH SYNOPSIS
@@ -16,13 +16,14 @@ the default registry will be used (see npm help 7 \fBnpm\-config\fR)\.
.P
The username, password, and email are read in from prompts\.
.P
-You may use this command to change your email address, but not username
-or password\.
+To reset your password, go to https://www\.npmjs\.com/forgot
.P
-To reset your password, go to https://www\.npmjs\.org/forgot
+To change your email address, go to https://www\.npmjs\.com/email\-edit
.P
You may use this command multiple times with the same user account to
-authorize on a new machine\.
+authorize on a new machine\. When authenticating on a new machine,
+the username, password and email address must all match with
+your existing record\.
.P
\fBnpm login\fR is an alias to \fBadduser\fR and behaves exactly the same way\.
.SH CONFIGURATION
@@ -64,7 +65,7 @@ npm adduser \-\-registry=http://private\-registry\.example\.com \-\-always\-auth
.P
This will ensure that all requests to that registry (including for tarballs)
include an authorization header\. See \fBalways\-auth\fR in npm help 7 \fBnpm\-config\fR for more
-details on always\-auth\. Registry\-specific configuaration of \fBalways\-auth\fR takes
+details on always\-auth\. Registry\-specific configuration of \fBalways\-auth\fR takes
precedence over any global configuration\.
.SH SEE ALSO
.RS 0
diff --git a/deps/npm/man/man1/npm-bin.1 b/deps/npm/man/man1/npm-bin.1
index 6552d6cf4d..8f0dc2ba57 100644
--- a/deps/npm/man/man1/npm-bin.1
+++ b/deps/npm/man/man1/npm-bin.1
@@ -1,4 +1,4 @@
-.TH "NPM\-BIN" "1" "October 2014" "" ""
+.TH "NPM\-BIN" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-bin\fR \- Display npm bin folder
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-bugs.1 b/deps/npm/man/man1/npm-bugs.1
index 09c7659c60..5acca82e2d 100644
--- a/deps/npm/man/man1/npm-bugs.1
+++ b/deps/npm/man/man1/npm-bugs.1
@@ -1,4 +1,4 @@
-.TH "NPM\-BUGS" "1" "October 2014" "" ""
+.TH "NPM\-BUGS" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-bugs\fR \- Bugs for a package in a web browser maybe
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-build.1 b/deps/npm/man/man1/npm-build.1
index 0f2184292a..1179298c5f 100644
--- a/deps/npm/man/man1/npm-build.1
+++ b/deps/npm/man/man1/npm-build.1
@@ -1,4 +1,4 @@
-.TH "NPM\-BUILD" "1" "October 2014" "" ""
+.TH "NPM\-BUILD" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-build\fR \- Build a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-bundle.1 b/deps/npm/man/man1/npm-bundle.1
index 0748922dae..703c795c9b 100644
--- a/deps/npm/man/man1/npm-bundle.1
+++ b/deps/npm/man/man1/npm-bundle.1
@@ -1,4 +1,4 @@
-.TH "NPM\-BUNDLE" "1" "October 2014" "" ""
+.TH "NPM\-BUNDLE" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-bundle\fR \- REMOVED
.SH DESCRIPTION
diff --git a/deps/npm/man/man1/npm-cache.1 b/deps/npm/man/man1/npm-cache.1
index c49015ae6e..1cf1d7c717 100644
--- a/deps/npm/man/man1/npm-cache.1
+++ b/deps/npm/man/man1/npm-cache.1
@@ -1,4 +1,4 @@
-.TH "NPM\-CACHE" "1" "October 2014" "" ""
+.TH "NPM\-CACHE" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-cache\fR \- Manipulates packages cache
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-completion.1 b/deps/npm/man/man1/npm-completion.1
index a89cc6fd5f..4cb0649100 100644
--- a/deps/npm/man/man1/npm-completion.1
+++ b/deps/npm/man/man1/npm-completion.1
@@ -1,4 +1,4 @@
-.TH "NPM\-COMPLETION" "1" "October 2014" "" ""
+.TH "NPM\-COMPLETION" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-completion\fR \- Tab Completion for npm
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-config.1 b/deps/npm/man/man1/npm-config.1
index a93ebace72..716303c41b 100644
--- a/deps/npm/man/man1/npm-config.1
+++ b/deps/npm/man/man1/npm-config.1
@@ -1,4 +1,4 @@
-.TH "NPM\-CONFIG" "1" "October 2014" "" ""
+.TH "NPM\-CONFIG" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-config\fR \- Manage the npm configuration files
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-dedupe.1 b/deps/npm/man/man1/npm-dedupe.1
index 24548077e3..743a5d027d 100644
--- a/deps/npm/man/man1/npm-dedupe.1
+++ b/deps/npm/man/man1/npm-dedupe.1
@@ -1,4 +1,4 @@
-.TH "NPM\-DEDUPE" "1" "October 2014" "" ""
+.TH "NPM\-DEDUPE" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-dedupe\fR \- Reduce duplication
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-deprecate.1 b/deps/npm/man/man1/npm-deprecate.1
index 581a58948f..95a8fd2515 100644
--- a/deps/npm/man/man1/npm-deprecate.1
+++ b/deps/npm/man/man1/npm-deprecate.1
@@ -1,4 +1,4 @@
-.TH "NPM\-DEPRECATE" "1" "October 2014" "" ""
+.TH "NPM\-DEPRECATE" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-deprecate\fR \- Deprecate a version of a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-docs.1 b/deps/npm/man/man1/npm-docs.1
index 1e9e5c1990..1feecc263c 100644
--- a/deps/npm/man/man1/npm-docs.1
+++ b/deps/npm/man/man1/npm-docs.1
@@ -1,4 +1,4 @@
-.TH "NPM\-DOCS" "1" "October 2014" "" ""
+.TH "NPM\-DOCS" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-docs\fR \- Docs for a package in a web browser maybe
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-edit.1 b/deps/npm/man/man1/npm-edit.1
index 8a19d12578..1d905d06b9 100644
--- a/deps/npm/man/man1/npm-edit.1
+++ b/deps/npm/man/man1/npm-edit.1
@@ -1,4 +1,4 @@
-.TH "NPM\-EDIT" "1" "October 2014" "" ""
+.TH "NPM\-EDIT" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-edit\fR \- Edit an installed package
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-explore.1 b/deps/npm/man/man1/npm-explore.1
index 0211aef43e..5f29171a9e 100644
--- a/deps/npm/man/man1/npm-explore.1
+++ b/deps/npm/man/man1/npm-explore.1
@@ -1,4 +1,4 @@
-.TH "NPM\-EXPLORE" "1" "October 2014" "" ""
+.TH "NPM\-EXPLORE" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-explore\fR \- Browse an installed package
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-help-search.1 b/deps/npm/man/man1/npm-help-search.1
index a18a8e97a6..524081c930 100644
--- a/deps/npm/man/man1/npm-help-search.1
+++ b/deps/npm/man/man1/npm-help-search.1
@@ -1,4 +1,4 @@
-.TH "NPM\-HELP\-SEARCH" "1" "October 2014" "" ""
+.TH "NPM\-HELP\-SEARCH" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-help-search\fR \- Search npm help documentation
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-help.1 b/deps/npm/man/man1/npm-help.1
index 556eeb52ee..0d7f1af03c 100644
--- a/deps/npm/man/man1/npm-help.1
+++ b/deps/npm/man/man1/npm-help.1
@@ -1,4 +1,4 @@
-.TH "NPM\-HELP" "1" "October 2014" "" ""
+.TH "NPM\-HELP" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-help\fR \- Get help on npm
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-init.1 b/deps/npm/man/man1/npm-init.1
index 3d4ed0957f..d2b6a298d5 100644
--- a/deps/npm/man/man1/npm-init.1
+++ b/deps/npm/man/man1/npm-init.1
@@ -1,4 +1,4 @@
-.TH "NPM\-INIT" "1" "October 2014" "" ""
+.TH "NPM\-INIT" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-init\fR \- Interactively create a package\.json file
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-install.1 b/deps/npm/man/man1/npm-install.1
index 0df0197b0c..ec355effeb 100644
--- a/deps/npm/man/man1/npm-install.1
+++ b/deps/npm/man/man1/npm-install.1
@@ -1,4 +1,4 @@
-.TH "NPM\-INSTALL" "1" "October 2014" "" ""
+.TH "NPM\-INSTALL" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-install\fR \- Install a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-link.1 b/deps/npm/man/man1/npm-link.1
index 62d76503f6..86132ed1dd 100644
--- a/deps/npm/man/man1/npm-link.1
+++ b/deps/npm/man/man1/npm-link.1
@@ -1,4 +1,4 @@
-.TH "NPM\-LINK" "1" "October 2014" "" ""
+.TH "NPM\-LINK" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-link\fR \- Symlink a package folder
.SH SYNOPSIS
@@ -25,7 +25,7 @@ Note that \fBpackage\-name\fR is taken from \fBpackage\.json\fR,
not from directory name\.
.P
The package name can be optionally prefixed with a scope\. See npm help 7 \fBnpm\-scope\fR\|\.
-The scope must by preceded by an @\-symbol and followed by a slash\.
+The scope must be preceded by an @\-symbol and followed by a slash\.
.P
When creating tarballs for \fBnpm publish\fR, the linked packages are
"snapshotted" to their current state by resolving the symbolic links\.
diff --git a/deps/npm/man/man1/npm-ls.1 b/deps/npm/man/man1/npm-ls.1
index 9cf4823c9a..bcf9a52d15 100644
--- a/deps/npm/man/man1/npm-ls.1
+++ b/deps/npm/man/man1/npm-ls.1
@@ -1,4 +1,4 @@
-.TH "NPM\-LS" "1" "October 2014" "" ""
+.TH "NPM\-LS" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-ls\fR \- List installed packages
.SH SYNOPSIS
@@ -23,7 +23,7 @@ For example, running \fBnpm ls promzard\fR in npm's source tree will show:
.P
.RS 2
.nf
-npm@2.1.6 /path/to/npm
+npm@2.1.18 /path/to/npm
└─┬ init\-package\-json@0\.0\.4
└── promzard@0\.1\.5
.fi
diff --git a/deps/npm/man/man1/npm-outdated.1 b/deps/npm/man/man1/npm-outdated.1
index 45433a814e..a1086ad322 100644
--- a/deps/npm/man/man1/npm-outdated.1
+++ b/deps/npm/man/man1/npm-outdated.1
@@ -1,4 +1,4 @@
-.TH "NPM\-OUTDATED" "1" "October 2014" "" ""
+.TH "NPM\-OUTDATED" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-outdated\fR \- Check for outdated packages
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-owner.1 b/deps/npm/man/man1/npm-owner.1
index 3ed5549f71..1c503795c6 100644
--- a/deps/npm/man/man1/npm-owner.1
+++ b/deps/npm/man/man1/npm-owner.1
@@ -1,4 +1,4 @@
-.TH "NPM\-OWNER" "1" "October 2014" "" ""
+.TH "NPM\-OWNER" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-owner\fR \- Manage package owners
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-pack.1 b/deps/npm/man/man1/npm-pack.1
index 8b9408abb2..3b39d6847a 100644
--- a/deps/npm/man/man1/npm-pack.1
+++ b/deps/npm/man/man1/npm-pack.1
@@ -1,4 +1,4 @@
-.TH "NPM\-PACK" "1" "October 2014" "" ""
+.TH "NPM\-PACK" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-pack\fR \- Create a tarball from a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-prefix.1 b/deps/npm/man/man1/npm-prefix.1
index b7bcac6395..2ebdaa6777 100644
--- a/deps/npm/man/man1/npm-prefix.1
+++ b/deps/npm/man/man1/npm-prefix.1
@@ -1,4 +1,4 @@
-.TH "NPM\-PREFIX" "1" "October 2014" "" ""
+.TH "NPM\-PREFIX" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-prefix\fR \- Display prefix
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-prune.1 b/deps/npm/man/man1/npm-prune.1
index 1a8cc95215..7b22233d5d 100644
--- a/deps/npm/man/man1/npm-prune.1
+++ b/deps/npm/man/man1/npm-prune.1
@@ -1,4 +1,4 @@
-.TH "NPM\-PRUNE" "1" "October 2014" "" ""
+.TH "NPM\-PRUNE" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-prune\fR \- Remove extraneous packages
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-publish.1 b/deps/npm/man/man1/npm-publish.1
index 6657210286..0df825154b 100644
--- a/deps/npm/man/man1/npm-publish.1
+++ b/deps/npm/man/man1/npm-publish.1
@@ -1,4 +1,4 @@
-.TH "NPM\-PUBLISH" "1" "October 2014" "" ""
+.TH "NPM\-PUBLISH" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-publish\fR \- Publish a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-rebuild.1 b/deps/npm/man/man1/npm-rebuild.1
index 0e04b9cfbe..1bb1e9acb3 100644
--- a/deps/npm/man/man1/npm-rebuild.1
+++ b/deps/npm/man/man1/npm-rebuild.1
@@ -1,4 +1,4 @@
-.TH "NPM\-REBUILD" "1" "October 2014" "" ""
+.TH "NPM\-REBUILD" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-rebuild\fR \- Rebuild a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-repo.1 b/deps/npm/man/man1/npm-repo.1
index dc8428d024..da8d6c9ad3 100644
--- a/deps/npm/man/man1/npm-repo.1
+++ b/deps/npm/man/man1/npm-repo.1
@@ -1,4 +1,4 @@
-.TH "NPM\-REPO" "1" "October 2014" "" ""
+.TH "NPM\-REPO" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-repo\fR \- Open package repository page in the browser
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-restart.1 b/deps/npm/man/man1/npm-restart.1
index 234d0aa76e..010e815300 100644
--- a/deps/npm/man/man1/npm-restart.1
+++ b/deps/npm/man/man1/npm-restart.1
@@ -1,6 +1,6 @@
-.TH "NPM\-RESTART" "1" "October 2014" "" ""
+.TH "NPM\-RESTART" "1" "January 2015" "" ""
.SH "NAME"
-\fBnpm-restart\fR \- Start a package
+\fBnpm-restart\fR \- Restart a package
.SH SYNOPSIS
.P
.RS 2
@@ -10,8 +10,38 @@ npm restart [\-\- ]
.RE
.SH DESCRIPTION
.P
-This runs a package's "restart" script, if one was provided\. Otherwise it runs
-package's "stop" script, if one was provided, and then the "start" script\.
+This restarts a package\.
+.P
+This runs a package's "stop", "restart", and "start" scripts, and associated
+pre\- and post\- scripts, in the order given below:
+.RS 0
+.IP 1. 3
+prerestart
+.IP 2. 3
+prestop
+.IP 3. 3
+stop
+.IP 4. 3
+poststop
+.IP 5. 3
+restart
+.IP 6. 3
+prestart
+.IP 7. 3
+start
+.IP 8. 3
+poststart
+.IP 9. 3
+postrestart
+
+.RE
+.SH NOTE
+.P
+Note that the "restart" script is run \fBin addition to\fR the "stop"
+and "start" scripts, not instead of them\.
+.P
+This is the behavior as of \fBnpm\fR major version 2\. A change in this
+behavior will be accompanied by an increase in major version number
.SH SEE ALSO
.RS 0
.IP \(bu 2
@@ -24,6 +54,8 @@ npm help test
npm help start
.IP \(bu 2
npm help stop
+.IP \(bu 2
+npm apihelp restart
.RE
diff --git a/deps/npm/man/man1/npm-rm.1 b/deps/npm/man/man1/npm-rm.1
index c7f92fb52b..94a0afa733 100644
--- a/deps/npm/man/man1/npm-rm.1
+++ b/deps/npm/man/man1/npm-rm.1
@@ -1,4 +1,4 @@
-.TH "NPM\-RM" "1" "October 2014" "" ""
+.TH "NPM\-RM" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-rm\fR \- Remove a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-root.1 b/deps/npm/man/man1/npm-root.1
index f85ebb9708..2067f9e55d 100644
--- a/deps/npm/man/man1/npm-root.1
+++ b/deps/npm/man/man1/npm-root.1
@@ -1,4 +1,4 @@
-.TH "NPM\-ROOT" "1" "October 2014" "" ""
+.TH "NPM\-ROOT" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-root\fR \- Display npm root
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-run-script.1 b/deps/npm/man/man1/npm-run-script.1
index 905908a7a1..65ea4ea94e 100644
--- a/deps/npm/man/man1/npm-run-script.1
+++ b/deps/npm/man/man1/npm-run-script.1
@@ -1,4 +1,4 @@
-.TH "NPM\-RUN\-SCRIPT" "1" "October 2014" "" ""
+.TH "NPM\-RUN\-SCRIPT" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-run-script\fR \- Run arbitrary package scripts
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-search.1 b/deps/npm/man/man1/npm-search.1
index 4ad5a67b8c..3f7d19bd8f 100644
--- a/deps/npm/man/man1/npm-search.1
+++ b/deps/npm/man/man1/npm-search.1
@@ -1,4 +1,4 @@
-.TH "NPM\-SEARCH" "1" "October 2014" "" ""
+.TH "NPM\-SEARCH" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-search\fR \- Search for packages
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-shrinkwrap.1 b/deps/npm/man/man1/npm-shrinkwrap.1
index fa2b313ab2..5fa9fb16ee 100644
--- a/deps/npm/man/man1/npm-shrinkwrap.1
+++ b/deps/npm/man/man1/npm-shrinkwrap.1
@@ -1,4 +1,4 @@
-.TH "NPM\-SHRINKWRAP" "1" "October 2014" "" ""
+.TH "NPM\-SHRINKWRAP" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-shrinkwrap\fR \- Lock down dependency versions
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-star.1 b/deps/npm/man/man1/npm-star.1
index 8dbc0292ae..ced42ecaed 100644
--- a/deps/npm/man/man1/npm-star.1
+++ b/deps/npm/man/man1/npm-star.1
@@ -1,4 +1,4 @@
-.TH "NPM\-STAR" "1" "October 2014" "" ""
+.TH "NPM\-STAR" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-star\fR \- Mark your favorite packages
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-stars.1 b/deps/npm/man/man1/npm-stars.1
index 1762a0f08b..d2124355c4 100644
--- a/deps/npm/man/man1/npm-stars.1
+++ b/deps/npm/man/man1/npm-stars.1
@@ -1,4 +1,4 @@
-.TH "NPM\-STARS" "1" "October 2014" "" ""
+.TH "NPM\-STARS" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-stars\fR \- View packages marked as favorites
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-start.1 b/deps/npm/man/man1/npm-start.1
index 0a342ee1f1..36f0c26bc5 100644
--- a/deps/npm/man/man1/npm-start.1
+++ b/deps/npm/man/man1/npm-start.1
@@ -1,4 +1,4 @@
-.TH "NPM\-START" "1" "October 2014" "" ""
+.TH "NPM\-START" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-start\fR \- Start a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-stop.1 b/deps/npm/man/man1/npm-stop.1
index 8622d18d96..0a20b4b6d4 100644
--- a/deps/npm/man/man1/npm-stop.1
+++ b/deps/npm/man/man1/npm-stop.1
@@ -1,4 +1,4 @@
-.TH "NPM\-STOP" "1" "October 2014" "" ""
+.TH "NPM\-STOP" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-stop\fR \- Stop a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-submodule.1 b/deps/npm/man/man1/npm-submodule.1
index 4999ac64e9..71853335c5 100644
--- a/deps/npm/man/man1/npm-submodule.1
+++ b/deps/npm/man/man1/npm-submodule.1
@@ -1,35 +1,42 @@
-.TH "NPM\-SUBMODULE" "1" "October 2014" "" ""
+.\" Generated with Ronnjs 0.3.8
+.\" http://github.com/kapouer/ronnjs/
+.
+.TH "NPM\-SUBMODULE" "1" "September 2014" "" ""
+.
.SH "NAME"
-\fBnpm-submodule\fR \- Add a package as a git submodule
-.SH SYNOPSIS
-.P
-.RS 2
+\fBnpm-submodule\fR \-\- Add a package as a git submodule
+.
+.SH "SYNOPSIS"
+.
.nf
npm submodule
+.
.fi
-.RE
-.SH DESCRIPTION
-.P
+.
+.SH "DESCRIPTION"
If the specified package has a git repository url in its package\.json
-description, then this command will add it as a git submodule at
-\fBnode_modules/\fR\|\.
+description, then this command will add it as a git submodule at \fBnode_modules/\fR\|\.
+.
.P
-This is a convenience only\. From then on, it's up to you to manage
+This is a convenience only\. From then on, it\'s up to you to manage
updates by using the appropriate git commands\. npm will stubbornly
refuse to update, modify, or remove anything with a \fB\|\.git\fR subfolder
in it\.
+.
.P
This command also does not install missing dependencies, if the package
does not include them in its git repository\. If \fBnpm ls\fR reports that
things are missing, you can either install, link, or submodule them yourself,
or you can do \fBnpm explore \-\- npm install\fR to install the
dependencies into the submodule folder\.
-.SH SEE ALSO
-.RS 0
-.IP \(bu 2
+.
+.SH "SEE ALSO"
+.
+.IP "\(bu" 4
npm help 5 package\.json
-.IP \(bu 2
+.
+.IP "\(bu" 4
git help submodule
-
-.RE
+.
+.IP "" 0
diff --git a/deps/npm/man/man1/npm-tag.1 b/deps/npm/man/man1/npm-tag.1
index 5aace75083..70eb323463 100644
--- a/deps/npm/man/man1/npm-tag.1
+++ b/deps/npm/man/man1/npm-tag.1
@@ -1,4 +1,4 @@
-.TH "NPM\-TAG" "1" "October 2014" "" ""
+.TH "NPM\-TAG" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-tag\fR \- Tag a published version
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-test.1 b/deps/npm/man/man1/npm-test.1
index 0b4a9f4dbb..b398e81eaf 100644
--- a/deps/npm/man/man1/npm-test.1
+++ b/deps/npm/man/man1/npm-test.1
@@ -1,4 +1,4 @@
-.TH "NPM\-TEST" "1" "October 2014" "" ""
+.TH "NPM\-TEST" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-test\fR \- Test a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-uninstall.1 b/deps/npm/man/man1/npm-uninstall.1
index a56f8bb918..5568b48371 100644
--- a/deps/npm/man/man1/npm-uninstall.1
+++ b/deps/npm/man/man1/npm-uninstall.1
@@ -1,4 +1,4 @@
-.TH "NPM\-RM" "1" "October 2014" "" ""
+.TH "NPM\-RM" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-rm\fR \- Remove a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-unpublish.1 b/deps/npm/man/man1/npm-unpublish.1
index 6cb1df7263..7f96d4f367 100644
--- a/deps/npm/man/man1/npm-unpublish.1
+++ b/deps/npm/man/man1/npm-unpublish.1
@@ -1,4 +1,4 @@
-.TH "NPM\-UNPUBLISH" "1" "October 2014" "" ""
+.TH "NPM\-UNPUBLISH" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-unpublish\fR \- Remove a package from the registry
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-update.1 b/deps/npm/man/man1/npm-update.1
index 19adfc9276..61e1ccebac 100644
--- a/deps/npm/man/man1/npm-update.1
+++ b/deps/npm/man/man1/npm-update.1
@@ -1,4 +1,4 @@
-.TH "NPM\-UPDATE" "1" "October 2014" "" ""
+.TH "NPM\-UPDATE" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-update\fR \- Update a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-version.1 b/deps/npm/man/man1/npm-version.1
index 21fde3452f..2ae02d0937 100644
--- a/deps/npm/man/man1/npm-version.1
+++ b/deps/npm/man/man1/npm-version.1
@@ -1,4 +1,4 @@
-.TH "NPM\-VERSION" "1" "October 2014" "" ""
+.TH "NPM\-VERSION" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-version\fR \- Bump a package version
.SH SYNOPSIS
@@ -11,7 +11,7 @@ npm version [ | major | minor | patch | premajor | preminor | prepat
.SH DESCRIPTION
.P
Run this in a package directory to bump the version and write the new
-data back to the package\.json file\.
+data back to \fBpackage\.json\fR and, if present, \fBnpm\-shrinkwrap\.json\fR\|\.
.P
The \fBnewversion\fR argument should be a valid semver string, \fIor\fR a
valid second argument to semver\.inc (one of "patch", "minor", "major",
diff --git a/deps/npm/man/man1/npm-view.1 b/deps/npm/man/man1/npm-view.1
index 35ef045329..2a279d2a79 100644
--- a/deps/npm/man/man1/npm-view.1
+++ b/deps/npm/man/man1/npm-view.1
@@ -1,4 +1,4 @@
-.TH "NPM\-VIEW" "1" "October 2014" "" ""
+.TH "NPM\-VIEW" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-view\fR \- View registry info
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm-whoami.1 b/deps/npm/man/man1/npm-whoami.1
index 34a3f04ac3..b993e0c9b5 100644
--- a/deps/npm/man/man1/npm-whoami.1
+++ b/deps/npm/man/man1/npm-whoami.1
@@ -1,4 +1,4 @@
-.TH "NPM\-WHOAMI" "1" "October 2014" "" ""
+.TH "NPM\-WHOAMI" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-whoami\fR \- Display npm username
.SH SYNOPSIS
diff --git a/deps/npm/man/man1/npm.1 b/deps/npm/man/man1/npm.1
index a275e4728d..aed41f88fe 100644
--- a/deps/npm/man/man1/npm.1
+++ b/deps/npm/man/man1/npm.1
@@ -1,4 +1,4 @@
-.TH "NPM" "1" "October 2014" "" ""
+.TH "NPM" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm\fR \- node package manager
.SH SYNOPSIS
@@ -10,7 +10,7 @@ npm [args]
.RE
.SH VERSION
.P
-2.1.6
+2.1.18
.SH DESCRIPTION
.P
npm is the package manager for the Node JavaScript platform\. It puts
diff --git a/deps/npm/man/man3/npm-bin.3 b/deps/npm/man/man3/npm-bin.3
index 4c76b8a0cd..27588a2407 100644
--- a/deps/npm/man/man3/npm-bin.3
+++ b/deps/npm/man/man3/npm-bin.3
@@ -1,4 +1,4 @@
-.TH "NPM\-BIN" "3" "October 2014" "" ""
+.TH "NPM\-BIN" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-bin\fR \- Display npm bin folder
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-bugs.3 b/deps/npm/man/man3/npm-bugs.3
index cd8dda6ea5..6b7503fefd 100644
--- a/deps/npm/man/man3/npm-bugs.3
+++ b/deps/npm/man/man3/npm-bugs.3
@@ -1,4 +1,4 @@
-.TH "NPM\-BUGS" "3" "October 2014" "" ""
+.TH "NPM\-BUGS" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-bugs\fR \- Bugs for a package in a web browser maybe
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-cache.3 b/deps/npm/man/man3/npm-cache.3
index 1dccd8fd0c..15a2839cce 100644
--- a/deps/npm/man/man3/npm-cache.3
+++ b/deps/npm/man/man3/npm-cache.3
@@ -1,4 +1,4 @@
-.TH "NPM\-CACHE" "3" "October 2014" "" ""
+.TH "NPM\-CACHE" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-cache\fR \- manage the npm cache programmatically
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-commands.3 b/deps/npm/man/man3/npm-commands.3
index 87ad3253b1..ee757dfce7 100644
--- a/deps/npm/man/man3/npm-commands.3
+++ b/deps/npm/man/man3/npm-commands.3
@@ -1,4 +1,4 @@
-.TH "NPM\-COMMANDS" "3" "October 2014" "" ""
+.TH "NPM\-COMMANDS" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-commands\fR \- npm commands
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-config.3 b/deps/npm/man/man3/npm-config.3
index 763e225254..be2522cb49 100644
--- a/deps/npm/man/man3/npm-config.3
+++ b/deps/npm/man/man3/npm-config.3
@@ -1,4 +1,4 @@
-.TH "NPM\-CONFIG" "3" "October 2014" "" ""
+.TH "NPM\-CONFIG" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-config\fR \- Manage the npm configuration files
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-deprecate.3 b/deps/npm/man/man3/npm-deprecate.3
index 9b543d36d5..d04e25d43f 100644
--- a/deps/npm/man/man3/npm-deprecate.3
+++ b/deps/npm/man/man3/npm-deprecate.3
@@ -1,4 +1,4 @@
-.TH "NPM\-DEPRECATE" "3" "October 2014" "" ""
+.TH "NPM\-DEPRECATE" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-deprecate\fR \- Deprecate a version of a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-docs.3 b/deps/npm/man/man3/npm-docs.3
index ad93e305bd..4dd5a84f7e 100644
--- a/deps/npm/man/man3/npm-docs.3
+++ b/deps/npm/man/man3/npm-docs.3
@@ -1,4 +1,4 @@
-.TH "NPM\-DOCS" "3" "October 2014" "" ""
+.TH "NPM\-DOCS" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-docs\fR \- Docs for a package in a web browser maybe
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-edit.3 b/deps/npm/man/man3/npm-edit.3
index 82767c8b7e..d7c2ad4f1d 100644
--- a/deps/npm/man/man3/npm-edit.3
+++ b/deps/npm/man/man3/npm-edit.3
@@ -1,4 +1,4 @@
-.TH "NPM\-EDIT" "3" "October 2014" "" ""
+.TH "NPM\-EDIT" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-edit\fR \- Edit an installed package
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-explore.3 b/deps/npm/man/man3/npm-explore.3
index 54948eadc1..8648eac98e 100644
--- a/deps/npm/man/man3/npm-explore.3
+++ b/deps/npm/man/man3/npm-explore.3
@@ -1,4 +1,4 @@
-.TH "NPM\-EXPLORE" "3" "October 2014" "" ""
+.TH "NPM\-EXPLORE" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-explore\fR \- Browse an installed package
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-help-search.3 b/deps/npm/man/man3/npm-help-search.3
index 8f4f346c26..a9baaf36d9 100644
--- a/deps/npm/man/man3/npm-help-search.3
+++ b/deps/npm/man/man3/npm-help-search.3
@@ -1,4 +1,4 @@
-.TH "NPM\-HELP\-SEARCH" "3" "October 2014" "" ""
+.TH "NPM\-HELP\-SEARCH" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-help-search\fR \- Search the help pages
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-init.3 b/deps/npm/man/man3/npm-init.3
index d5da00dd8f..9a2ce6bc82 100644
--- a/deps/npm/man/man3/npm-init.3
+++ b/deps/npm/man/man3/npm-init.3
@@ -1,4 +1,4 @@
-.TH "NPM" "" "October 2014" "" ""
+.TH "NPM" "" "January 2015" "" ""
.SH "NAME"
\fBnpm\fR
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-install.3 b/deps/npm/man/man3/npm-install.3
index ec98278cad..511791791d 100644
--- a/deps/npm/man/man3/npm-install.3
+++ b/deps/npm/man/man3/npm-install.3
@@ -1,4 +1,4 @@
-.TH "NPM\-INSTALL" "3" "October 2014" "" ""
+.TH "NPM\-INSTALL" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-install\fR \- install a package programmatically
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-link.3 b/deps/npm/man/man3/npm-link.3
index 0c379a48c5..2d5bf77c3c 100644
--- a/deps/npm/man/man3/npm-link.3
+++ b/deps/npm/man/man3/npm-link.3
@@ -1,4 +1,4 @@
-.TH "NPM\-LINK" "3" "October 2014" "" ""
+.TH "NPM\-LINK" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-link\fR \- Symlink a package folder
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-load.3 b/deps/npm/man/man3/npm-load.3
index 61fac42ebd..68787c89b1 100644
--- a/deps/npm/man/man3/npm-load.3
+++ b/deps/npm/man/man3/npm-load.3
@@ -1,4 +1,4 @@
-.TH "NPM\-LOAD" "3" "October 2014" "" ""
+.TH "NPM\-LOAD" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-load\fR \- Load config settings
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-ls.3 b/deps/npm/man/man3/npm-ls.3
index 84558abeb3..de3d127df6 100644
--- a/deps/npm/man/man3/npm-ls.3
+++ b/deps/npm/man/man3/npm-ls.3
@@ -1,4 +1,4 @@
-.TH "NPM\-LS" "3" "October 2014" "" ""
+.TH "NPM\-LS" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-ls\fR \- List installed packages
.SH SYNOPSIS
@@ -63,6 +63,6 @@ List packages in the global install prefix instead of in the current
project\.
.P
Note, if parseable is set or long isn't set, then duplicates will be trimmed\.
-This means that if a submodule a same dependency as a parent module, then the
+This means that if a submodule has the same dependency as a parent module, then the
dependency will only be output once\.
diff --git a/deps/npm/man/man3/npm-outdated.3 b/deps/npm/man/man3/npm-outdated.3
index 2bba8469fc..9e96d44ab3 100644
--- a/deps/npm/man/man3/npm-outdated.3
+++ b/deps/npm/man/man3/npm-outdated.3
@@ -1,4 +1,4 @@
-.TH "NPM\-OUTDATED" "3" "October 2014" "" ""
+.TH "NPM\-OUTDATED" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-outdated\fR \- Check for outdated packages
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-owner.3 b/deps/npm/man/man3/npm-owner.3
index 101b752e9f..35a993ba8b 100644
--- a/deps/npm/man/man3/npm-owner.3
+++ b/deps/npm/man/man3/npm-owner.3
@@ -1,4 +1,4 @@
-.TH "NPM\-OWNER" "3" "October 2014" "" ""
+.TH "NPM\-OWNER" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-owner\fR \- Manage package owners
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-pack.3 b/deps/npm/man/man3/npm-pack.3
index d9da93e33c..7d95e57513 100644
--- a/deps/npm/man/man3/npm-pack.3
+++ b/deps/npm/man/man3/npm-pack.3
@@ -1,4 +1,4 @@
-.TH "NPM\-PACK" "3" "October 2014" "" ""
+.TH "NPM\-PACK" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-pack\fR \- Create a tarball from a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-prefix.3 b/deps/npm/man/man3/npm-prefix.3
index e2da6d67ed..4aaed71a73 100644
--- a/deps/npm/man/man3/npm-prefix.3
+++ b/deps/npm/man/man3/npm-prefix.3
@@ -1,4 +1,4 @@
-.TH "NPM\-PREFIX" "3" "October 2014" "" ""
+.TH "NPM\-PREFIX" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-prefix\fR \- Display prefix
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-prune.3 b/deps/npm/man/man3/npm-prune.3
index 48a06c97c7..310dfe292e 100644
--- a/deps/npm/man/man3/npm-prune.3
+++ b/deps/npm/man/man3/npm-prune.3
@@ -1,4 +1,4 @@
-.TH "NPM\-PRUNE" "3" "October 2014" "" ""
+.TH "NPM\-PRUNE" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-prune\fR \- Remove extraneous packages
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-publish.3 b/deps/npm/man/man3/npm-publish.3
index 13dbd95f33..28f77205c5 100644
--- a/deps/npm/man/man3/npm-publish.3
+++ b/deps/npm/man/man3/npm-publish.3
@@ -1,4 +1,4 @@
-.TH "NPM\-PUBLISH" "3" "October 2014" "" ""
+.TH "NPM\-PUBLISH" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-publish\fR \- Publish a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-rebuild.3 b/deps/npm/man/man3/npm-rebuild.3
index 21a5aba1de..082589b5de 100644
--- a/deps/npm/man/man3/npm-rebuild.3
+++ b/deps/npm/man/man3/npm-rebuild.3
@@ -1,4 +1,4 @@
-.TH "NPM\-REBUILD" "3" "October 2014" "" ""
+.TH "NPM\-REBUILD" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-rebuild\fR \- Rebuild a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-repo.3 b/deps/npm/man/man3/npm-repo.3
index 5638d434ae..64cc0bad69 100644
--- a/deps/npm/man/man3/npm-repo.3
+++ b/deps/npm/man/man3/npm-repo.3
@@ -1,4 +1,4 @@
-.TH "NPM\-REPO" "3" "October 2014" "" ""
+.TH "NPM\-REPO" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-repo\fR \- Open package repository page in the browser
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-restart.3 b/deps/npm/man/man3/npm-restart.3
index be948334aa..2cacefc5b1 100644
--- a/deps/npm/man/man3/npm-restart.3
+++ b/deps/npm/man/man3/npm-restart.3
@@ -1,6 +1,6 @@
-.TH "NPM\-RESTART" "3" "October 2014" "" ""
+.TH "NPM\-RESTART" "3" "January 2015" "" ""
.SH "NAME"
-\fBnpm-restart\fR \- Start a package
+\fBnpm-restart\fR \- Restart a package
.SH SYNOPSIS
.P
.RS 2
@@ -10,14 +10,43 @@ npm\.commands\.restart(packages, callback)
.RE
.SH DESCRIPTION
.P
-This runs a package's "restart" script, if one was provided\.
-Otherwise it runs package's "stop" script, if one was provided, and then
-the "start" script\.
+This restarts a package (or multiple packages)\.
+.P
+This runs a package's "stop", "restart", and "start" scripts, and associated
+pre\- and post\- scripts, in the order given below:
+.RS 0
+.IP 1. 3
+prerestart
+.IP 2. 3
+prestop
+.IP 3. 3
+stop
+.IP 4. 3
+poststop
+.IP 5. 3
+restart
+.IP 6. 3
+prestart
+.IP 7. 3
+start
+.IP 8. 3
+poststart
+.IP 9. 3
+postrestart
+
+.RE
.P
If no version is specified, then it restarts the "active" version\.
.P
-npm can run tests on multiple packages\. Just specify multiple packages
-in the \fBpackages\fR parameter\.
+npm can restart multiple packages\. Just specify multiple packages in
+the \fBpackages\fR parameter\.
+.SH NOTE
+.P
+Note that the "restart" script is run \fBin addition to\fR the "stop"
+and "start" scripts, not instead of them\.
+.P
+This is the behavior as of \fBnpm\fR major version 2\. A change in this
+behavior will be accompanied by an increase in major version number
.SH SEE ALSO
.RS 0
.IP \(bu 2
diff --git a/deps/npm/man/man3/npm-root.3 b/deps/npm/man/man3/npm-root.3
index 68bac79fa0..15d5230d17 100644
--- a/deps/npm/man/man3/npm-root.3
+++ b/deps/npm/man/man3/npm-root.3
@@ -1,4 +1,4 @@
-.TH "NPM\-ROOT" "3" "October 2014" "" ""
+.TH "NPM\-ROOT" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-root\fR \- Display npm root
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-run-script.3 b/deps/npm/man/man3/npm-run-script.3
index 866f1e01f3..59bf90d965 100644
--- a/deps/npm/man/man3/npm-run-script.3
+++ b/deps/npm/man/man3/npm-run-script.3
@@ -1,4 +1,4 @@
-.TH "NPM\-RUN\-SCRIPT" "3" "October 2014" "" ""
+.TH "NPM\-RUN\-SCRIPT" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-run-script\fR \- Run arbitrary package scripts
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-search.3 b/deps/npm/man/man3/npm-search.3
index ba0cc5f4c3..4fffa3bd96 100644
--- a/deps/npm/man/man3/npm-search.3
+++ b/deps/npm/man/man3/npm-search.3
@@ -1,4 +1,4 @@
-.TH "NPM\-SEARCH" "3" "October 2014" "" ""
+.TH "NPM\-SEARCH" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-search\fR \- Search for packages
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-shrinkwrap.3 b/deps/npm/man/man3/npm-shrinkwrap.3
index 0f87c50906..92ce7b1b2f 100644
--- a/deps/npm/man/man3/npm-shrinkwrap.3
+++ b/deps/npm/man/man3/npm-shrinkwrap.3
@@ -1,4 +1,4 @@
-.TH "NPM\-SHRINKWRAP" "3" "October 2014" "" ""
+.TH "NPM\-SHRINKWRAP" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-shrinkwrap\fR \- programmatically generate package shrinkwrap file
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-start.3 b/deps/npm/man/man3/npm-start.3
index 4eabb36c44..f3330a5885 100644
--- a/deps/npm/man/man3/npm-start.3
+++ b/deps/npm/man/man3/npm-start.3
@@ -1,4 +1,4 @@
-.TH "NPM\-START" "3" "October 2014" "" ""
+.TH "NPM\-START" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-start\fR \- Start a package
.SH SYNOPSIS
@@ -12,6 +12,6 @@ npm\.commands\.start(packages, callback)
.P
This runs a package's "start" script, if one was provided\.
.P
-npm can run tests on multiple packages\. Just specify multiple packages
-in the \fBpackages\fR parameter\.
+npm can start multiple packages\. Just specify multiple packages in the
+\fBpackages\fR parameter\.
diff --git a/deps/npm/man/man3/npm-stop.3 b/deps/npm/man/man3/npm-stop.3
index aa55b84736..551eedbc12 100644
--- a/deps/npm/man/man3/npm-stop.3
+++ b/deps/npm/man/man3/npm-stop.3
@@ -1,4 +1,4 @@
-.TH "NPM\-STOP" "3" "October 2014" "" ""
+.TH "NPM\-STOP" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-stop\fR \- Stop a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-submodule.3 b/deps/npm/man/man3/npm-submodule.3
index 378862a563..95739ce3b0 100644
--- a/deps/npm/man/man3/npm-submodule.3
+++ b/deps/npm/man/man3/npm-submodule.3
@@ -1,35 +1,42 @@
-.TH "NPM\-SUBMODULE" "3" "October 2014" "" ""
+.\" Generated with Ronnjs 0.3.8
+.\" http://github.com/kapouer/ronnjs/
+.
+.TH "NPM\-SUBMODULE" "3" "September 2014" "" ""
+.
.SH "NAME"
-\fBnpm-submodule\fR \- Add a package as a git submodule
-.SH SYNOPSIS
-.P
-.RS 2
+\fBnpm-submodule\fR \-\- Add a package as a git submodule
+.
+.SH "SYNOPSIS"
+.
.nf
npm\.commands\.submodule(packages, callback)
+.
.fi
-.RE
-.SH DESCRIPTION
-.P
+.
+.SH "DESCRIPTION"
For each package specified, npm will check if it has a git repository url
-in its package\.json description then add it as a git submodule at
-\fBnode_modules/\fR\|\.
+in its package\.json description then add it as a git submodule at \fBnode_modules/\fR\|\.
+.
.P
-This is a convenience only\. From then on, it's up to you to manage
+This is a convenience only\. From then on, it\'s up to you to manage
updates by using the appropriate git commands\. npm will stubbornly
refuse to update, modify, or remove anything with a \fB\|\.git\fR subfolder
in it\.
+.
.P
This command also does not install missing dependencies, if the package
does not include them in its git repository\. If \fBnpm ls\fR reports that
things are missing, you can either install, link, or submodule them yourself,
or you can do \fBnpm explore \-\- npm install\fR to install the
dependencies into the submodule folder\.
-.SH SEE ALSO
-.RS 0
-.IP \(bu 2
+.
+.SH "SEE ALSO"
+.
+.IP "\(bu" 4
npm help json
-.IP \(bu 2
+.
+.IP "\(bu" 4
git help submodule
-
-.RE
+.
+.IP "" 0
diff --git a/deps/npm/man/man3/npm-tag.3 b/deps/npm/man/man3/npm-tag.3
index 4da13767f9..a2daa3134f 100644
--- a/deps/npm/man/man3/npm-tag.3
+++ b/deps/npm/man/man3/npm-tag.3
@@ -1,4 +1,4 @@
-.TH "NPM\-TAG" "3" "October 2014" "" ""
+.TH "NPM\-TAG" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-tag\fR \- Tag a published version
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-test.3 b/deps/npm/man/man3/npm-test.3
index f6d0f6d3f1..ff969ec023 100644
--- a/deps/npm/man/man3/npm-test.3
+++ b/deps/npm/man/man3/npm-test.3
@@ -1,4 +1,4 @@
-.TH "NPM\-TEST" "3" "October 2014" "" ""
+.TH "NPM\-TEST" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-test\fR \- Test a package
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-uninstall.3 b/deps/npm/man/man3/npm-uninstall.3
index 8505f39955..0cf637ca2c 100644
--- a/deps/npm/man/man3/npm-uninstall.3
+++ b/deps/npm/man/man3/npm-uninstall.3
@@ -1,4 +1,4 @@
-.TH "NPM\-UNINSTALL" "3" "October 2014" "" ""
+.TH "NPM\-UNINSTALL" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-uninstall\fR \- uninstall a package programmatically
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-unpublish.3 b/deps/npm/man/man3/npm-unpublish.3
index 9b4ab467d2..48f865db19 100644
--- a/deps/npm/man/man3/npm-unpublish.3
+++ b/deps/npm/man/man3/npm-unpublish.3
@@ -1,4 +1,4 @@
-.TH "NPM\-UNPUBLISH" "3" "October 2014" "" ""
+.TH "NPM\-UNPUBLISH" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-unpublish\fR \- Remove a package from the registry
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-update.3 b/deps/npm/man/man3/npm-update.3
index 3f40eb0db2..eee573b2d8 100644
--- a/deps/npm/man/man3/npm-update.3
+++ b/deps/npm/man/man3/npm-update.3
@@ -1,4 +1,4 @@
-.TH "NPM\-UPDATE" "3" "October 2014" "" ""
+.TH "NPM\-UPDATE" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-update\fR \- Update a package
.SH SYNOPSIS
@@ -8,7 +8,7 @@
npm\.commands\.update(packages, callback)
.fi
.RE
-.TH "DESCRIPTION" "" "October 2014" "" ""
+.TH "DESCRIPTION" "" "January 2015" "" ""
.SH "NAME"
\fBDESCRIPTION\fR
.P
diff --git a/deps/npm/man/man3/npm-version.3 b/deps/npm/man/man3/npm-version.3
index 16979247fe..2cf7fe2153 100644
--- a/deps/npm/man/man3/npm-version.3
+++ b/deps/npm/man/man3/npm-version.3
@@ -1,4 +1,4 @@
-.TH "NPM\-VERSION" "3" "October 2014" "" ""
+.TH "NPM\-VERSION" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-version\fR \- Bump a package version
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-view.3 b/deps/npm/man/man3/npm-view.3
index e49f28d7ed..42bbf40c50 100644
--- a/deps/npm/man/man3/npm-view.3
+++ b/deps/npm/man/man3/npm-view.3
@@ -1,4 +1,4 @@
-.TH "NPM\-VIEW" "3" "October 2014" "" ""
+.TH "NPM\-VIEW" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-view\fR \- View registry info
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm-whoami.3 b/deps/npm/man/man3/npm-whoami.3
index 2d32507f51..cb320ec46a 100644
--- a/deps/npm/man/man3/npm-whoami.3
+++ b/deps/npm/man/man3/npm-whoami.3
@@ -1,4 +1,4 @@
-.TH "NPM\-WHOAMI" "3" "October 2014" "" ""
+.TH "NPM\-WHOAMI" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm-whoami\fR \- Display npm username
.SH SYNOPSIS
diff --git a/deps/npm/man/man3/npm.3 b/deps/npm/man/man3/npm.3
index 71bbc58ad0..6298c8d5e6 100644
--- a/deps/npm/man/man3/npm.3
+++ b/deps/npm/man/man3/npm.3
@@ -1,4 +1,4 @@
-.TH "NPM" "3" "October 2014" "" ""
+.TH "NPM" "3" "January 2015" "" ""
.SH "NAME"
\fBnpm\fR \- node package manager
.SH SYNOPSIS
@@ -20,7 +20,7 @@ npm\.load([configObject, ]function (er, npm) {
.RE
.SH VERSION
.P
-2.1.6
+2.1.18
.SH DESCRIPTION
.P
This is the API documentation for npm\.
diff --git a/deps/npm/man/man5/npm-folders.5 b/deps/npm/man/man5/npm-folders.5
index 9cd3436f89..2ae88d142a 100644
--- a/deps/npm/man/man5/npm-folders.5
+++ b/deps/npm/man/man5/npm-folders.5
@@ -1,4 +1,4 @@
-.TH "NPM\-FOLDERS" "5" "October 2014" "" ""
+.TH "NPM\-FOLDERS" "5" "January 2015" "" ""
.SH "NAME"
\fBnpm-folders\fR \- Folder Structures Used by npm
.SH DESCRIPTION
diff --git a/deps/npm/man/man5/npm-global.5 b/deps/npm/man/man5/npm-global.5
index 9cd3436f89..2ae88d142a 100644
--- a/deps/npm/man/man5/npm-global.5
+++ b/deps/npm/man/man5/npm-global.5
@@ -1,4 +1,4 @@
-.TH "NPM\-FOLDERS" "5" "October 2014" "" ""
+.TH "NPM\-FOLDERS" "5" "January 2015" "" ""
.SH "NAME"
\fBnpm-folders\fR \- Folder Structures Used by npm
.SH DESCRIPTION
diff --git a/deps/npm/man/man5/npm-json.5 b/deps/npm/man/man5/npm-json.5
index fa9ef95c4b..cf306294e9 100644
--- a/deps/npm/man/man5/npm-json.5
+++ b/deps/npm/man/man5/npm-json.5
@@ -1,4 +1,4 @@
-.TH "PACKAGE\.JSON" "5" "October 2014" "" ""
+.TH "PACKAGE\.JSON" "5" "January 2015" "" ""
.SH "NAME"
\fBpackage.json\fR \- Specifics of npm's package\.json handling
.SH DESCRIPTION
@@ -279,7 +279,7 @@ Put example scripts in here\. Someday, it might be exposed in some clever way\.
.SH repository
.P
Specify the place where your code lives\. This is helpful for people who
-want to contribute\. If the git repo is on github, then the \fBnpm docs\fR
+want to contribute\. If the git repo is on GitHub, then the \fBnpm docs\fR
command will be able to find you\.
.P
Do it like this:
@@ -421,7 +421,9 @@ The \fBcommit\-ish\fR can be any tag, sha, or branch which can be supplied as
an argument to \fBgit checkout\fR\|\. The default is \fBmaster\fR\|\.
.SH GitHub URLs
.P
-As of version 1\.1\.65, you can refer to GitHub urls as just "foo": "user/foo\-project"\. For example:
+As of version 1\.1\.65, you can refer to GitHub urls as just "foo":
+"user/foo\-project"\. Just as with git URLs, a \fBcommit\-ish\fR suffix can be
+included\. For example:
.P
.RS 2
.nf
@@ -429,7 +431,8 @@ As of version 1\.1\.65, you can refer to GitHub urls as just "foo": "user/foo\-p
"name": "foo",
"version": "0\.0\.0",
"dependencies": {
- "express": "visionmedia/express"
+ "express": "visionmedia/express",
+ "mocha": "visionmedia/mocha#4727d357ea"
}
}
.fi
@@ -510,7 +513,7 @@ run this script as well, so that you can test it easily\.
.P
In some cases, you want to express the compatibility of your package with an
host tool or library, while not necessarily doing a \fBrequire\fR of this host\.
-This is usually refered to as a \fIplugin\fR\|\. Notably, your module may be exposing
+This is usually referred to as a \fIplugin\fR\|\. Notably, your module may be exposing
a specific interface, expected and specified by the host documentation\.
.P
For example:
diff --git a/deps/npm/man/man5/npmrc.5 b/deps/npm/man/man5/npmrc.5
index d2846869ab..fc2986b901 100644
--- a/deps/npm/man/man5/npmrc.5
+++ b/deps/npm/man/man5/npmrc.5
@@ -1,4 +1,4 @@
-.TH "NPMRC" "5" "October 2014" "" ""
+.TH "NPMRC" "5" "January 2015" "" ""
.SH "NAME"
\fBnpmrc\fR \- The npm config files
.SH DESCRIPTION
@@ -38,6 +38,16 @@ prefix = ${HOME}/\.npm\-packages
Each of these files is loaded, and config options are resolved in
priority order\. For example, a setting in the userconfig file would
override the setting in the globalconfig file\.
+.P
+Array values are specified by adding "[]" after the key name\. For
+example:
+.P
+.RS 2
+.nf
+key[] = "first value"
+key[] = "second value"
+.fi
+.RE
.SS Per\-project config file
.P
When working locally in a project, a \fB\|\.npmrc\fR file in the root of the
diff --git a/deps/npm/man/man5/package.json.5 b/deps/npm/man/man5/package.json.5
index fa9ef95c4b..cf306294e9 100644
--- a/deps/npm/man/man5/package.json.5
+++ b/deps/npm/man/man5/package.json.5
@@ -1,4 +1,4 @@
-.TH "PACKAGE\.JSON" "5" "October 2014" "" ""
+.TH "PACKAGE\.JSON" "5" "January 2015" "" ""
.SH "NAME"
\fBpackage.json\fR \- Specifics of npm's package\.json handling
.SH DESCRIPTION
@@ -279,7 +279,7 @@ Put example scripts in here\. Someday, it might be exposed in some clever way\.
.SH repository
.P
Specify the place where your code lives\. This is helpful for people who
-want to contribute\. If the git repo is on github, then the \fBnpm docs\fR
+want to contribute\. If the git repo is on GitHub, then the \fBnpm docs\fR
command will be able to find you\.
.P
Do it like this:
@@ -421,7 +421,9 @@ The \fBcommit\-ish\fR can be any tag, sha, or branch which can be supplied as
an argument to \fBgit checkout\fR\|\. The default is \fBmaster\fR\|\.
.SH GitHub URLs
.P
-As of version 1\.1\.65, you can refer to GitHub urls as just "foo": "user/foo\-project"\. For example:
+As of version 1\.1\.65, you can refer to GitHub urls as just "foo":
+"user/foo\-project"\. Just as with git URLs, a \fBcommit\-ish\fR suffix can be
+included\. For example:
.P
.RS 2
.nf
@@ -429,7 +431,8 @@ As of version 1\.1\.65, you can refer to GitHub urls as just "foo": "user/foo\-p
"name": "foo",
"version": "0\.0\.0",
"dependencies": {
- "express": "visionmedia/express"
+ "express": "visionmedia/express",
+ "mocha": "visionmedia/mocha#4727d357ea"
}
}
.fi
@@ -510,7 +513,7 @@ run this script as well, so that you can test it easily\.
.P
In some cases, you want to express the compatibility of your package with an
host tool or library, while not necessarily doing a \fBrequire\fR of this host\.
-This is usually refered to as a \fIplugin\fR\|\. Notably, your module may be exposing
+This is usually referred to as a \fIplugin\fR\|\. Notably, your module may be exposing
a specific interface, expected and specified by the host documentation\.
.P
For example:
diff --git a/deps/npm/man/man7/npm-coding-style.7 b/deps/npm/man/man7/npm-coding-style.7
index 0dc15318ab..ebaf0386c2 100644
--- a/deps/npm/man/man7/npm-coding-style.7
+++ b/deps/npm/man/man7/npm-coding-style.7
@@ -1,4 +1,4 @@
-.TH "NPM\-CODING\-STYLE" "7" "October 2014" "" ""
+.TH "NPM\-CODING\-STYLE" "7" "January 2015" "" ""
.SH "NAME"
\fBnpm-coding-style\fR \- npm's "funny" coding style
.SH DESCRIPTION
@@ -10,7 +10,7 @@ designed to reduce visual clutter and make bugs more apparent\.
If you want to contribute to npm (which is very encouraged), you should
make your code conform to npm's style\.
.P
-Note: this concerns npm's code not the specific packages at npmjs\.org
+Note: this concerns npm's code not the specific packages that you can download from the npm registry\.
.SH Line Length
.P
Keep lines shorter than 80 characters\. It's better for lines to be
@@ -19,7 +19,7 @@ statements onto multiple lines\.
.SH Indentation
.P
Two\-spaces\. Tabs are better, but they look like hell in web browsers
-(and on github), and node uses 2 spaces, so that's that\.
+(and on GitHub), and node uses 2 spaces, so that's that\.
.P
Configure your editor appropriately\.
.SH Curly braces
diff --git a/deps/npm/man/man7/npm-config.7 b/deps/npm/man/man7/npm-config.7
index e3b4c5c6f6..d561e07473 100644
--- a/deps/npm/man/man7/npm-config.7
+++ b/deps/npm/man/man7/npm-config.7
@@ -1,4 +1,4 @@
-.TH "NPM\-CONFIG" "7" "October 2014" "" ""
+.TH "NPM\-CONFIG" "7" "January 2015" "" ""
.SH "NAME"
\fBnpm-config\fR \- More than you probably want to know about npm configuration
.SH DESCRIPTION
@@ -192,16 +192,32 @@ The browser that is called by the \fBnpm docs\fR command to open websites\.
.IP \(bu 2
Default: The npm CA certificate
.IP \(bu 2
-Type: String or null
+Type: String, Array or null
.RE
.P
The Certificate Authority signing certificate that is trusted for SSL
-connections to the registry\.
+connections to the registry\. Values should be in PEM format with newlines
+replaced by the string "\\n"\. For example:
+.P
+.RS 2
+.nf
+ca="\-\-\-\-\-BEGIN CERTIFICATE\-\-\-\-\-\\nXXXX\\nXXXX\\n\-\-\-\-\-END CERTIFICATE\-\-\-\-\-"
+.fi
+.RE
.P
Set to \fBnull\fR to only allow "known" registrars, or to a specific CA cert
to trust only that specific signing authority\.
.P
+Multiple CAs can be trusted by specifying an array of certificates:
+.P
+.RS 2
+.nf
+ca[]="\.\.\."
+ca[]="\.\.\."
+.fi
+.RE
+.P
See also the \fBstrict\-ssl\fR config\.
.SS cafile
.RS 0
@@ -504,14 +520,15 @@ The string that starts all the debugging log output\.
.SS https\-proxy
.RS 0
.IP \(bu 2
-Default: the \fBHTTPS_PROXY\fR or \fBhttps_proxy\fR or \fBHTTP_PROXY\fR or
-\fBhttp_proxy\fR environment variables\.
+Default: null
.IP \(bu 2
Type: url
.RE
.P
-A proxy to use for outgoing https requests\.
+A proxy to use for outgoing https requests\. If the \fBHTTPS_PROXY\fR or
+\fBhttps_proxy\fR or \fBHTTP_PROXY\fR or \fBhttp_proxy\fR environment variables are set,
+proxy settings will be honored by the underlying \fBrequest\fR library\.
.SS ignore\-scripts
.RS 0
.IP \(bu 2
@@ -801,13 +818,15 @@ this as true\.
.SS proxy
.RS 0
.IP \(bu 2
-Default: \fBHTTP_PROXY\fR or \fBhttp_proxy\fR environment variable, or null
+Default: null
.IP \(bu 2
Type: url
.RE
.P
-A proxy to use for outgoing http requests\.
+A proxy to use for outgoing http requests\. If the \fBHTTP_PROXY\fR or
+\fBhttp_proxy\fR environment variables are set, proxy settings will be
+honored by the underlying \fBrequest\fR library\.
.SS rebuild\-bundle
.RS 0
.IP \(bu 2
diff --git a/deps/npm/man/man7/npm-developers.7 b/deps/npm/man/man7/npm-developers.7
index bf8edb29f2..ba47e45fab 100644
--- a/deps/npm/man/man7/npm-developers.7
+++ b/deps/npm/man/man7/npm-developers.7
@@ -1,4 +1,4 @@
-.TH "NPM\-DEVELOPERS" "7" "October 2014" "" ""
+.TH "NPM\-DEVELOPERS" "7" "January 2015" "" ""
.SH "NAME"
\fBnpm-developers\fR \- Developer Guide
.SH DESCRIPTION
@@ -112,6 +112,20 @@ ignore the stuff matched by the \fB\|\.gitignore\fR file\. If you \fIwant\fR to
include something that is excluded by your \fB\|\.gitignore\fR file, you can
create an empty \fB\|\.npmignore\fR file to override it\.
.P
+\fB\|\.npmignore\fR files follow the same pattern rules \fIhttp://git\-scm\.com/book/en/v2/Git\-Basics\-Recording\-Changes\-to\-the\-Repository#Ignoring\-Files\fR
+as \fB\|\.gitignore\fR files:
+.RS 0
+.IP \(bu 2
+Blank lines or lines starting with \fB#\fR are ignored\.
+.IP \(bu 2
+Standard glob patterns work\.
+.IP \(bu 2
+You can end patterns with a forward slash \fB/\fR to specify a directory\.
+.IP \(bu 2
+You can negate a pattern by starting it with an exclamation point \fB!\fR\|\.
+
+.RE
+.P
By default, the following paths and files are ignored, so there's no
need to add them to \fB\|\.npmignore\fR explicitly:
.RS 0
diff --git a/deps/npm/man/man7/npm-disputes.7 b/deps/npm/man/man7/npm-disputes.7
index 9cf7009f62..3d67933982 100644
--- a/deps/npm/man/man7/npm-disputes.7
+++ b/deps/npm/man/man7/npm-disputes.7
@@ -1,4 +1,4 @@
-.TH "NPM\-DISPUTES" "7" "October 2014" "" ""
+.TH "NPM\-DISPUTES" "7" "January 2015" "" ""
.SH "NAME"
\fBnpm-disputes\fR \- Handling Module Name Disputes
.SH SYNOPSIS
diff --git a/deps/npm/man/man7/npm-faq.7 b/deps/npm/man/man7/npm-faq.7
index 563509a872..cf6a37cfdd 100644
--- a/deps/npm/man/man7/npm-faq.7
+++ b/deps/npm/man/man7/npm-faq.7
@@ -1,9 +1,9 @@
-.TH "NPM\-FAQ" "7" "October 2014" "" ""
+.TH "NPM\-FAQ" "7" "January 2015" "" ""
.SH "NAME"
\fBnpm-faq\fR \- Frequently Asked Questions
.SH Where can I find these docs in HTML?
.P
-https://www\.npmjs\.org/doc/, or run:
+https://docs\.npmjs\.com/, or run:
.P
.RS 2
.nf
@@ -80,7 +80,7 @@ Usually, no\. Allow npm to resolve dependencies for your packages\.
For packages you \fBdeploy\fR, such as websites and apps,
you should use npm shrinkwrap to lock down your full dependency tree:
.P
-https://www\.npmjs\.org/doc/cli/npm\-shrinkwrap\.html
+https://docs\.npmjs\.com/cli/shrinkwrap
.P
If you are paranoid about depending on the npm ecosystem,
you should run a private npm mirror or a private cache\.
@@ -148,7 +148,7 @@ In those cases, you can do this:
.P
.RS 2
.nf
-curl https://www\.npmjs\.org/install\.sh | sh
+curl https://www\.npmjs\.com/install\.sh | sh
.fi
.RE
.SH What is a \fBpackage\fR?
@@ -332,7 +332,7 @@ See npm help \fBnpm\-link\fR
See npm help 7 \fBnpm\-registry\fR\|\.
.SH I forgot my password, and can't publish\. How do I reset it?
.P
-Go to https://npmjs\.org/forgot\|\.
+Go to https://npmjs\.com/forgot\|\.
.SH I get ECONNREFUSED a lot\. What's up?
.P
Either the registry is down, or node's DNS isn't able to reach out\.
@@ -350,20 +350,48 @@ You can also often get a faster response by visiting the #npm channel
on Freenode IRC\.
.SH Why no namespaces?
.P
-Please see this discussion: https://github\.com/npm/npm/issues/798
+npm has only one global namespace\. If you want to namespace your own packages,
+you may: simply use the \fB\-\fR character to separate the names\. npm is a mostly
+anarchic system\. There is not sufficient need to impose namespace rules on
+everyone\.
.P
-tl;dr \- It doesn't actually make things better, and can make them worse\.
+As of 2\.0, npm supports scoped packages, which allow you to publish a group of
+related modules without worrying about name collisions\.
.P
-If you want to namespace your own packages, you may: simply use the
-\fB\-\fR character to separate the names\. npm is a mostly anarchic system\.
-There is not sufficient need to impose namespace rules on everyone\.
+Every npm user owns the scope associated with their username\. For example, the
+user named \fBnpm\fR owns the scope \fB@npm\fR\|\. Scoped packages are published inside a
+scope by naming them as if they were files under the scope directory, e\.g\., by
+setting \fBname\fR in \fBpackage\.json\fR to \fB@npm/npm\fR\|\.
+.P
+Scoped packages can coexist with public npm packages in a private npm registry\.
+At present (2014\-11\-04) scoped packages may NOT be published to the public npm
+registry\.
+.P
+Unscoped packages can only depend on other unscoped packages\. Scoped packages
+can depend on packages from their own scope, a different scope, or the public
+registry (unscoped)\.
+.P
+For the current documentation of scoped packages, see
+https://docs\.npmjs\.com/misc/scope
+.P
+References:
+.RS 0
+.IP 1. 3
+For the reasoning behind the "one global namespace", please see this
+discussion: https://github\.com/npm/npm/issues/798 (TL;DR: It doesn't
+actually make things better, and can make them worse\.)
+.IP 2. 3
+For the pre\-implementation discussion of the scoped package feature, see
+this discussion: https://github\.com/npm/npm/issues/5239
+
+.RE
.SH Who does npm?
.P
npm was originally written by Isaac Z\. Schlueter, and many others have
contributed to it, some of them quite substantially\.
.P
The npm open source project, The npm Registry, and the community
-website \fIhttps://www\.npmjs\.org\fR are maintained and operated by the
+website \fIhttps://www\.npmjs\.com\fR are maintained and operated by the
good folks at npm, Inc\. \fIhttp://www\.npmjs\.com\fR
.SH I have a question or request not addressed here\. Where should I put it?
.P
diff --git a/deps/npm/man/man7/npm-index.7 b/deps/npm/man/man7/npm-index.7
index 442815a2e5..056c96bc63 100644
--- a/deps/npm/man/man7/npm-index.7
+++ b/deps/npm/man/man7/npm-index.7
@@ -1,9 +1,9 @@
-.TH "NPM\-INDEX" "7" "October 2014" "" ""
+.TH "NPM\-INDEX" "7" "January 2015" "" ""
.SH "NAME"
\fBnpm-index\fR \- Index of all npm documentation
.SS npm help README
.P
-node package manager
+a JavaScript package manager
.SH Command Line Documentation
.P
Using npm on the command line
@@ -93,7 +93,7 @@ Rebuild a package
Open package repository page in the browser
.SS npm help restart
.P
-Start a package
+Restart a package
.SS npm help rm
.P
Remove a package
@@ -222,7 +222,7 @@ Rebuild a package
Open package repository page in the browser
.SS npm apihelp restart
.P
-Start a package
+Restart a package
.SS npm apihelp root
.P
Display npm root
diff --git a/deps/npm/man/man7/npm-registry.7 b/deps/npm/man/man7/npm-registry.7
index 9de209d468..f89b94507e 100644
--- a/deps/npm/man/man7/npm-registry.7
+++ b/deps/npm/man/man7/npm-registry.7
@@ -1,4 +1,4 @@
-.TH "NPM\-REGISTRY" "7" "October 2014" "" ""
+.TH "NPM\-REGISTRY" "7" "January 2015" "" ""
.SH "NAME"
\fBnpm-registry\fR \- The JavaScript Package Registry
.SH DESCRIPTION
@@ -52,7 +52,7 @@ No, but it's way easier\. Basically, yes, you do, or you have to
effectively implement the entire CouchDB API anyway\.
.SH Is there a website or something to see package docs and such?
.P
-Yes, head over to https://npmjs\.org/
+Yes, head over to https://npmjs\.com/
.SH SEE ALSO
.RS 0
.IP \(bu 2
diff --git a/deps/npm/man/man7/npm-scope.7 b/deps/npm/man/man7/npm-scope.7
index f876e4eaaa..2cae9e88c7 100644
--- a/deps/npm/man/man7/npm-scope.7
+++ b/deps/npm/man/man7/npm-scope.7
@@ -1,4 +1,4 @@
-.TH "NPM\-SCOPE" "7" "October 2014" "" ""
+.TH "NPM\-SCOPE" "7" "January 2015" "" ""
.SH "NAME"
\fBnpm-scope\fR \- Scoped packages
.SH DESCRIPTION
diff --git a/deps/npm/man/man7/npm-scripts.7 b/deps/npm/man/man7/npm-scripts.7
index 9d11f4626c..69d880d34f 100644
--- a/deps/npm/man/man7/npm-scripts.7
+++ b/deps/npm/man/man7/npm-scripts.7
@@ -1,4 +1,4 @@
-.TH "NPM\-SCRIPTS" "7" "October 2014" "" ""
+.TH "NPM\-SCRIPTS" "7" "January 2015" "" ""
.SH "NAME"
\fBnpm-scripts\fR \- How npm handles the "scripts" field
.SH DESCRIPTION
@@ -26,12 +26,6 @@ Run BEFORE the package is uninstalled\.
postuninstall:
Run AFTER the package is uninstalled\.
.IP \(bu 2
-preupdate:
-Run BEFORE the package is updated with the update command\.
-.IP \(bu 2
-update, postupdate:
-Run AFTER the package is updated with the update command\.
-.IP \(bu 2
pretest, test, posttest:
Run by the \fBnpm test\fR command\.
.IP \(bu 2
diff --git a/deps/npm/man/man7/removing-npm.7 b/deps/npm/man/man7/removing-npm.7
index b0a4fca5d7..73963fe3b3 100644
--- a/deps/npm/man/man7/removing-npm.7
+++ b/deps/npm/man/man7/removing-npm.7
@@ -1,4 +1,4 @@
-.TH "NPM\-REMOVAL" "1" "October 2014" "" ""
+.TH "NPM\-REMOVAL" "1" "January 2015" "" ""
.SH "NAME"
\fBnpm-removal\fR \- Cleaning the Slate
.SH SYNOPSIS
diff --git a/deps/npm/man/man7/semver.7 b/deps/npm/man/man7/semver.7
index a6be932b47..bf239f7e62 100644
--- a/deps/npm/man/man7/semver.7
+++ b/deps/npm/man/man7/semver.7
@@ -1,4 +1,4 @@
-.TH "SEMVER" "7" "October 2014" "" ""
+.TH "SEMVER" "7" "January 2015" "" ""
.SH "NAME"
\fBsemver\fR \- The semantic versioner for npm
.SH Usage
@@ -22,12 +22,12 @@ As a command\-line utility:
.nf
$ semver \-h
-Usage: semver [ [\.\.\.]] [\-r | \-i | \-d ]
+Usage: semver [ [\.\.\.]] [\-r | \-i | \-\-preid | \-l | \-rv]
Test if version(s) satisfy the supplied range(s), and sort them\.
Multiple versions or ranges may be supplied, unless increment
-or decrement options are specified\. In that case, only a single
-version may be used, and it is incremented by the specified level
+option is specified\. In that case, only a single version may
+be used, and it is incremented by the specified level
Program exits successfully if any valid version satisfies
all supplied ranges, and prints all satisfying versions\.
@@ -112,6 +112,35 @@ alpha/beta/rc versions\. By including a prerelease tag in the range,
the user is indicating that they are aware of the risk\. However, it
is still not appropriate to assume that they have opted into taking a
similar risk on the \fInext\fR set of prerelease versions\.
+.SS Prerelease Identifiers
+.P
+The method \fB\|\.inc\fR takes an additional \fBidentifier\fR string argument that
+will append the value of the string as a prerelease identifier:
+.P
+.RS 2
+.nf
+> semver\.inc('1\.2\.3', 'pre', 'beta')
+\|'1\.2\.4\-beta\.0'
+.fi
+.RE
+.P
+command\-line example:
+.P
+.RS 2
+.nf
+$ semver 1\.2\.3 \-i prerelease \-\-preid beta
+1\.2\.4\-beta\.0
+.fi
+.RE
+.P
+Which then can be used to increment further:
+.P
+.RS 2
+.nf
+$ semver 1\.2\.4\-beta\.0 \-i prerelease
+1\.2\.4\-beta\.1
+.fi
+.RE
.SS Advanced Range Syntax
.P
Advanced range syntax desugars to primitive comparators in
@@ -197,8 +226,6 @@ equal to \fBbeta\.2\fR\|\. So, \fB1\.2\.3\-beta\.4\fR would be allowed, but
different \fB[major, minor, patch]\fR tuple\.
.RE
-.P
-Note: this is the same as the \fB~>\fR operator in rubygems\.
.SS Caret Ranges \fB^1\.2\.3\fR \fB^0\.2\.5\fR \fB^0\.0\.4\fR
.P
Allows changes that do not modify the left\-most non\-zero digit in the
@@ -313,6 +340,10 @@ invalid comparison string is provided\.
.IP \(bu 2
\fBrcompare(v1, v2)\fR: The reverse of compare\. Sorts an array of versions
in descending order when passed to \fBArray\.sort()\fR\|\.
+.IP \(bu 2
+\fBdiff(v1, v2)\fR: Returns difference between two versions by the release type
+(\fBmajor\fR, \fBpremajor\fR, \fBminor\fR, \fBpreminor\fR, \fBpatch\fR, \fBprepatch\fR, or \fBprerelease\fR),
+or null if the versions are the same\.
.RE
.SS Ranges
diff --git a/deps/npm/node_modules/.bin/mkdirp b/deps/npm/node_modules/.bin/mkdirp
new file mode 100644
index 0000000000..ec035f397c
--- /dev/null
+++ b/deps/npm/node_modules/.bin/mkdirp
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=`dirname "$0"`
+
+case `uname` in
+ *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../mkdirp/bin/cmd.js" "$@"
+ ret=$?
+else
+ node "$basedir/../mkdirp/bin/cmd.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/deps/npm/node_modules/.bin/mkdirp.cmd b/deps/npm/node_modules/.bin/mkdirp.cmd
new file mode 100644
index 0000000000..0d2cdd7c48
--- /dev/null
+++ b/deps/npm/node_modules/.bin/mkdirp.cmd
@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+ "%~dp0\node.exe" "%~dp0\..\mkdirp\bin\cmd.js" %*
+) ELSE (
+ @SETLOCAL
+ @SET PATHEXT=%PATHEXT:;.JS;=;%
+ node "%~dp0\..\mkdirp\bin\cmd.js" %*
+)
\ No newline at end of file
diff --git a/deps/npm/node_modules/.bin/node-gyp b/deps/npm/node_modules/.bin/node-gyp
new file mode 100644
index 0000000000..8e8f30796b
--- /dev/null
+++ b/deps/npm/node_modules/.bin/node-gyp
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=`dirname "$0"`
+
+case `uname` in
+ *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../node-gyp/bin/node-gyp.js" "$@"
+ ret=$?
+else
+ node "$basedir/../node-gyp/bin/node-gyp.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/deps/npm/node_modules/.bin/node-gyp.cmd b/deps/npm/node_modules/.bin/node-gyp.cmd
new file mode 100644
index 0000000000..d97b8bfa33
--- /dev/null
+++ b/deps/npm/node_modules/.bin/node-gyp.cmd
@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+ "%~dp0\node.exe" "%~dp0\..\node-gyp\bin\node-gyp.js" %*
+) ELSE (
+ @SETLOCAL
+ @SET PATHEXT=%PATHEXT:;.JS;=;%
+ node "%~dp0\..\node-gyp\bin\node-gyp.js" %*
+)
\ No newline at end of file
diff --git a/deps/npm/node_modules/.bin/nopt b/deps/npm/node_modules/.bin/nopt
new file mode 100644
index 0000000000..6a48073874
--- /dev/null
+++ b/deps/npm/node_modules/.bin/nopt
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=`dirname "$0"`
+
+case `uname` in
+ *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../nopt/bin/nopt.js" "$@"
+ ret=$?
+else
+ node "$basedir/../nopt/bin/nopt.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/deps/npm/node_modules/.bin/nopt.cmd b/deps/npm/node_modules/.bin/nopt.cmd
new file mode 100644
index 0000000000..1626454b23
--- /dev/null
+++ b/deps/npm/node_modules/.bin/nopt.cmd
@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+ "%~dp0\node.exe" "%~dp0\..\nopt\bin\nopt.js" %*
+) ELSE (
+ @SETLOCAL
+ @SET PATHEXT=%PATHEXT:;.JS;=;%
+ node "%~dp0\..\nopt\bin\nopt.js" %*
+)
\ No newline at end of file
diff --git a/deps/npm/node_modules/.bin/opener b/deps/npm/node_modules/.bin/opener
new file mode 100644
index 0000000000..d03c07868e
--- /dev/null
+++ b/deps/npm/node_modules/.bin/opener
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=`dirname "$0"`
+
+case `uname` in
+ *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../opener/opener.js" "$@"
+ ret=$?
+else
+ node "$basedir/../opener/opener.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/deps/npm/node_modules/.bin/opener.cmd b/deps/npm/node_modules/.bin/opener.cmd
new file mode 100644
index 0000000000..d3cc65c641
--- /dev/null
+++ b/deps/npm/node_modules/.bin/opener.cmd
@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+ "%~dp0\node.exe" "%~dp0\..\opener\opener.js" %*
+) ELSE (
+ @SETLOCAL
+ @SET PATHEXT=%PATHEXT:;.JS;=;%
+ node "%~dp0\..\opener\opener.js" %*
+)
\ No newline at end of file
diff --git a/deps/npm/node_modules/.bin/rimraf b/deps/npm/node_modules/.bin/rimraf
new file mode 100644
index 0000000000..a0e698f00f
--- /dev/null
+++ b/deps/npm/node_modules/.bin/rimraf
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=`dirname "$0"`
+
+case `uname` in
+ *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../rimraf/bin.js" "$@"
+ ret=$?
+else
+ node "$basedir/../rimraf/bin.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/deps/npm/node_modules/.bin/rimraf.cmd b/deps/npm/node_modules/.bin/rimraf.cmd
new file mode 100644
index 0000000000..9333ec64e1
--- /dev/null
+++ b/deps/npm/node_modules/.bin/rimraf.cmd
@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+ "%~dp0\node.exe" "%~dp0\..\rimraf\bin.js" %*
+) ELSE (
+ @SETLOCAL
+ @SET PATHEXT=%PATHEXT:;.JS;=;%
+ node "%~dp0\..\rimraf\bin.js" %*
+)
\ No newline at end of file
diff --git a/deps/npm/node_modules/.bin/semver b/deps/npm/node_modules/.bin/semver
new file mode 100644
index 0000000000..59ddf6f280
--- /dev/null
+++ b/deps/npm/node_modules/.bin/semver
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=`dirname "$0"`
+
+case `uname` in
+ *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../semver/bin/semver" "$@"
+ ret=$?
+else
+ node "$basedir/../semver/bin/semver" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/deps/npm/node_modules/.bin/semver.cmd b/deps/npm/node_modules/.bin/semver.cmd
new file mode 100644
index 0000000000..37c00a46d9
--- /dev/null
+++ b/deps/npm/node_modules/.bin/semver.cmd
@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+ "%~dp0\node.exe" "%~dp0\..\semver\bin\semver" %*
+) ELSE (
+ @SETLOCAL
+ @SET PATHEXT=%PATHEXT:;.JS;=;%
+ node "%~dp0\..\semver\bin\semver" %*
+)
\ No newline at end of file
diff --git a/deps/npm/node_modules/.bin/which b/deps/npm/node_modules/.bin/which
new file mode 100644
index 0000000000..6877bde02c
--- /dev/null
+++ b/deps/npm/node_modules/.bin/which
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=`dirname "$0"`
+
+case `uname` in
+ *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../which/bin/which" "$@"
+ ret=$?
+else
+ node "$basedir/../which/bin/which" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/deps/npm/node_modules/.bin/which.cmd b/deps/npm/node_modules/.bin/which.cmd
new file mode 100644
index 0000000000..588f44d682
--- /dev/null
+++ b/deps/npm/node_modules/.bin/which.cmd
@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+ "%~dp0\node.exe" "%~dp0\..\which\bin\which" %*
+) ELSE (
+ @SETLOCAL
+ @SET PATHEXT=%PATHEXT:;.JS;=;%
+ node "%~dp0\..\which\bin\which" %*
+)
\ No newline at end of file
diff --git a/deps/npm/node_modules/columnify/index.js b/deps/npm/node_modules/columnify/index.js
index c44b8ca8fa..8c15c993ea 100644
--- a/deps/npm/node_modules/columnify/index.js
+++ b/deps/npm/node_modules/columnify/index.js
@@ -9,6 +9,14 @@ var splitIntoLines = utils.splitIntoLines
var splitLongWords = utils.splitLongWords
var truncateString = utils.truncateString
+var DEFAULT_HEADING_TRANSFORM = function(key) {
+ return key.toUpperCase()
+}
+
+var DEFAULT_DATA_TRANSFORM = function(cell, column, index) {
+ return cell
+}
+
var DEFAULTS = {
maxWidth: Infinity,
minWidth: 0,
@@ -18,12 +26,8 @@ var DEFAULTS = {
preserveNewLines: false,
paddingChr: ' ',
showHeaders: true,
- headingTransform: function(key) {
- return key.toUpperCase()
- },
- dataTransform: function(cell, column, index) {
- return cell
- }
+ headingTransform: DEFAULT_HEADING_TRANSFORM,
+ dataTransform: DEFAULT_DATA_TRANSFORM
}
module.exports = function(items, options) {
@@ -68,9 +72,11 @@ module.exports = function(items, options) {
// sanitize column settings
columnNames.forEach(function(columnName) {
var column = columns[columnName]
+ column.name = columnName
column.maxWidth = Math.ceil(column.maxWidth)
column.minWidth = Math.ceil(column.minWidth)
column.truncate = !!column.truncate
+ column.align = column.align || 'left'
})
// sanitize data
@@ -96,7 +102,18 @@ module.exports = function(items, options) {
columnNames.forEach(function(columnName) {
var column = columns[columnName]
items = items.map(function(item, index) {
- item[columnName] = column.dataTransform(item[columnName], column, index)
+ var col = Object.create(column)
+ item[columnName] = column.dataTransform(item[columnName], col, index)
+
+ var changedKeys = Object.keys(col)
+ // disable default heading transform if we wrote to column.name
+ if (changedKeys.indexOf('name') !== -1) {
+ if (column.headingTransform !== DEFAULT_HEADING_TRANSFORM) return
+ column.headingTransform = function(heading) {return heading}
+ }
+ changedKeys.forEach(function(key) {
+ column[key] = col[key]
+ })
return item
})
})
@@ -106,7 +123,7 @@ module.exports = function(items, options) {
if(options.showHeaders) {
columnNames.forEach(function(columnName) {
var column = columns[columnName]
- headers[columnName] = column.headingTransform(columnName)
+ headers[columnName] = column.headingTransform(column.name)
})
items.unshift(headers)
}
@@ -194,8 +211,8 @@ function createRows(items, columns, columnNames, paddingChr) {
columnNames.forEach(function(columnName) {
var column = columns[columnName]
var val = item[columnName][i] || '' // || '' ensures empty columns get padded
- if (column.align == 'right') row[i].push(padLeft(val, column.width, paddingChr))
- else if (column.align == 'center') row[i].push(padCenter(val, column.width, paddingChr))
+ if (column.align === 'right') row[i].push(padLeft(val, column.width, paddingChr))
+ else if (column.align === 'center' || column.align === 'centre') row[i].push(padCenter(val, column.width, paddingChr))
else row[i].push(padRight(val, column.width, paddingChr))
})
}
diff --git a/deps/npm/node_modules/columnify/node_modules/strip-ansi/cli.js b/deps/npm/node_modules/columnify/node_modules/strip-ansi/cli.js
index 602ae00e8f..5b9546aabf 100755
--- a/deps/npm/node_modules/columnify/node_modules/strip-ansi/cli.js
+++ b/deps/npm/node_modules/columnify/node_modules/strip-ansi/cli.js
@@ -2,38 +2,46 @@
'use strict';
var fs = require('fs');
var pkg = require('./package.json');
-var strip = require('./');
-var input = process.argv[2];
+var stripAnsi = require('./');
+var argv = process.argv.slice(2);
+var input = argv[0];
function help() {
console.log([
- pkg.description,
'',
- 'Usage',
- ' $ strip-ansi > ',
- ' $ cat | strip-ansi > ',
+ ' ' + pkg.description,
'',
- 'Example',
- ' $ strip-ansi unicorn.txt > unicorn-stripped.txt'
+ ' Usage',
+ ' strip-ansi > ',
+ ' cat | strip-ansi > ',
+ '',
+ ' Example',
+ ' strip-ansi unicorn.txt > unicorn-stripped.txt'
].join('\n'));
}
-if (process.argv.indexOf('--help') !== -1) {
+function init(data) {
+ process.stdout.write(stripAnsi(data));
+}
+
+if (argv.indexOf('--help') !== -1) {
help();
return;
}
-if (process.argv.indexOf('--version') !== -1) {
+if (argv.indexOf('--version') !== -1) {
console.log(pkg.version);
return;
}
-if (input) {
- process.stdout.write(strip(fs.readFileSync(input, 'utf8')));
- return;
-}
+if (process.stdin.isTTY) {
+ if (!input) {
+ help();
+ return;
+ }
-process.stdin.setEncoding('utf8');
-process.stdin.on('data', function (data) {
- process.stdout.write(strip(data));
-});
+ init(fs.readFileSync(input, 'utf8'));
+} else {
+ process.stdin.setEncoding('utf8');
+ process.stdin.on('data', init);
+}
diff --git a/deps/npm/node_modules/columnify/node_modules/strip-ansi/node_modules/ansi-regex/index.js b/deps/npm/node_modules/columnify/node_modules/strip-ansi/node_modules/ansi-regex/index.js
index 783c5c7bb6..2fcdd1e472 100644
--- a/deps/npm/node_modules/columnify/node_modules/strip-ansi/node_modules/ansi-regex/index.js
+++ b/deps/npm/node_modules/columnify/node_modules/strip-ansi/node_modules/ansi-regex/index.js
@@ -1,4 +1,4 @@
'use strict';
module.exports = function () {
- return /\u001b\[(?:[0-9]{1,3}(?:;[0-9]{1,3})*)?[m|K]/g;
+ return /(?:(?:\u001b\[)|\u009b)(?:(?:[0-9]{1,3})?(?:(?:;[0-9]{0,3})*)?[A-M|f-m])|\u001b[A-M]/g;
};
diff --git a/deps/npm/node_modules/columnify/node_modules/strip-ansi/node_modules/ansi-regex/package.json b/deps/npm/node_modules/columnify/node_modules/strip-ansi/node_modules/ansi-regex/package.json
index ca610250c9..ab8ea0388f 100644
--- a/deps/npm/node_modules/columnify/node_modules/strip-ansi/node_modules/ansi-regex/package.json
+++ b/deps/npm/node_modules/columnify/node_modules/strip-ansi/node_modules/ansi-regex/package.json
@@ -1,6 +1,6 @@
{
"name": "ansi-regex",
- "version": "0.2.1",
+ "version": "1.1.0",
"description": "Regular expression for matching ANSI escape codes",
"license": "MIT",
"repository": {
@@ -16,7 +16,8 @@
"node": ">=0.10.0"
},
"scripts": {
- "test": "mocha"
+ "test": "mocha test/test.js",
+ "view-supported": "node test/viewCodes.js"
},
"files": [
"index.js"
@@ -55,9 +56,9 @@
"url": "https://github.com/sindresorhus/ansi-regex/issues"
},
"homepage": "https://github.com/sindresorhus/ansi-regex",
- "_id": "ansi-regex@0.2.1",
- "_shasum": "0d8e946967a3d8143f93e24e298525fc1b2235f9",
- "_from": "ansi-regex@0.2.1",
+ "_id": "ansi-regex@1.1.0",
+ "_shasum": "67792c5d6ad05c792d6cd6057ac8f5e69ebf4357",
+ "_from": "ansi-regex@>=1.0.0 <2.0.0",
"_npmVersion": "1.4.9",
"_npmUser": {
"name": "sindresorhus",
@@ -67,12 +68,17 @@
{
"name": "sindresorhus",
"email": "sindresorhus@gmail.com"
+ },
+ {
+ "name": "jbnicolai",
+ "email": "jappelman@xebia.com"
}
],
"dist": {
- "shasum": "0d8e946967a3d8143f93e24e298525fc1b2235f9",
- "tarball": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz"
+ "shasum": "67792c5d6ad05c792d6cd6057ac8f5e69ebf4357",
+ "tarball": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.0.tgz"
},
"directories": {},
- "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz"
+ "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.0.tgz",
+ "readme": "ERROR: No README data found!"
}
diff --git a/deps/npm/node_modules/columnify/node_modules/strip-ansi/package.json b/deps/npm/node_modules/columnify/node_modules/strip-ansi/package.json
index 64c4dee52c..89d1041bd7 100644
--- a/deps/npm/node_modules/columnify/node_modules/strip-ansi/package.json
+++ b/deps/npm/node_modules/columnify/node_modules/strip-ansi/package.json
@@ -1,11 +1,8 @@
{
"name": "strip-ansi",
- "version": "1.0.0",
+ "version": "2.0.0",
"description": "Strip ANSI escape codes",
"license": "MIT",
- "bin": {
- "strip-ansi": "cli.js"
- },
"repository": {
"type": "git",
"url": "git://github.com/sindresorhus/strip-ansi"
@@ -15,6 +12,9 @@
"email": "sindresorhus@gmail.com",
"url": "http://sindresorhus.com"
},
+ "bin": {
+ "strip-ansi": "cli.js"
+ },
"engines": {
"node": ">=0.10.0"
},
@@ -51,19 +51,19 @@
"text"
],
"dependencies": {
- "ansi-regex": "^0.2.1"
+ "ansi-regex": "^1.0.0"
},
"devDependencies": {
"mocha": "*"
},
- "gitHead": "6fea2ef935f1ba10d43e4c4d9814af328803935c",
+ "gitHead": "c5e780acc07532f5d651cfb6ea035198095c6c74",
"bugs": {
"url": "https://github.com/sindresorhus/strip-ansi/issues"
},
"homepage": "https://github.com/sindresorhus/strip-ansi",
- "_id": "strip-ansi@1.0.0",
- "_shasum": "6c021321d6ece161a3c608fbab268c7328901c73",
- "_from": "strip-ansi@>=1.0.0-0 <2.0.0-0",
+ "_id": "strip-ansi@2.0.0",
+ "_shasum": "fa8d69432e97674746f55f51d076ae78b18df13f",
+ "_from": "strip-ansi@>=2.0.0 <3.0.0",
"_npmVersion": "1.4.14",
"_npmUser": {
"name": "sindresorhus",
@@ -80,9 +80,10 @@
}
],
"dist": {
- "shasum": "6c021321d6ece161a3c608fbab268c7328901c73",
- "tarball": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-1.0.0.tgz"
+ "shasum": "fa8d69432e97674746f55f51d076ae78b18df13f",
+ "tarball": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.0.tgz"
},
"directories": {},
- "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-1.0.0.tgz"
+ "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.0.tgz",
+ "readme": "ERROR: No README data found!"
}
diff --git a/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/README.md b/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/README.md
index 527743b601..d7231cfca7 100644
--- a/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/README.md
+++ b/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/README.md
@@ -21,7 +21,7 @@ var clone = require('clone');
var a, b;
-a = { foo: { bar: 'baz' } }; // inital value of a
+a = { foo: { bar: 'baz' } }; // initial value of a
b = clone(a); // clone a -> b
a.foo.bar = 'foo'; // change a
@@ -52,7 +52,7 @@ can clone dates in arrays in objects, for example.
Call `clone` with `circular` set to `false` if you are certain that `obj`
contains no circular references. This will give better performance if needed.
There is no error if `undefined` or `null` is passed as `obj`.
- * `depth` -- depth to wich the object is to be cloned (optional,
+ * `depth` -- depth to which the object is to be cloned (optional,
defaults to infinity)
`clone.clonePrototype(obj)`
diff --git a/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/clone.js b/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/clone.js
index 5d402073b3..321ffa30f5 100644
--- a/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/clone.js
+++ b/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/clone.js
@@ -72,6 +72,7 @@ function clone(parent, circular, depth, prototype) {
return parent;
var child;
+ var proto;
if (typeof parent != 'object') {
return parent;
}
@@ -88,8 +89,14 @@ function clone(parent, circular, depth, prototype) {
parent.copy(child);
return child;
} else {
- if (typeof prototype == 'undefined') child = Object.create(Object.getPrototypeOf(parent));
- else child = Object.create(prototype);
+ if (typeof prototype == 'undefined') {
+ proto = Object.getPrototypeOf(parent);
+ child = Object.create(proto);
+ }
+ else {
+ child = Object.create(prototype);
+ proto = prototype;
+ }
}
if (circular) {
@@ -103,6 +110,14 @@ function clone(parent, circular, depth, prototype) {
}
for (var i in parent) {
+ var attrs;
+ if (proto) {
+ attrs = Object.getOwnPropertyDescriptor(proto, i);
+ }
+
+ if (attrs && attrs.set == null) {
+ continue;
+ }
child[i] = _clone(parent[i], depth - 1);
}
diff --git a/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/package.json b/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/package.json
index 3c6b776470..dc56f3f191 100644
--- a/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/package.json
+++ b/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/package.json
@@ -8,7 +8,7 @@
"function",
"date"
],
- "version": "0.1.18",
+ "version": "0.1.19",
"repository": {
"type": "git",
"url": "git://github.com/pvorb/node-clone.git"
@@ -81,6 +81,11 @@
{
"name": "Nathan Zadoks",
"url": "https://github.com/nathan7"
+ },
+ {
+ "name": "Róbert Oroszi",
+ "email": "robert+gh@oroszi.net",
+ "url": "https://github.com/oroce"
}
],
"license": "MIT",
@@ -96,11 +101,11 @@
"scripts": {
"test": "nodeunit test.js"
},
- "gitHead": "17eea36140d61d97a9954c53417d0e04a00525d9",
+ "gitHead": "bb11a43363a0f69e8ac014cb5376ce215ea1f8fd",
"homepage": "https://github.com/pvorb/node-clone",
- "_id": "clone@0.1.18",
- "_shasum": "64a0d5d57eaa85a1a8af380cd1db8c7b3a895f66",
- "_from": "clone@>=0.1.5-0 <0.2.0-0",
+ "_id": "clone@0.1.19",
+ "_shasum": "613fb68639b26a494ac53253e15b1a6bd88ada85",
+ "_from": "clone@>=0.1.5 <0.2.0",
"_npmVersion": "1.4.14",
"_npmUser": {
"name": "pvorb",
@@ -113,9 +118,10 @@
}
],
"dist": {
- "shasum": "64a0d5d57eaa85a1a8af380cd1db8c7b3a895f66",
- "tarball": "http://registry.npmjs.org/clone/-/clone-0.1.18.tgz"
+ "shasum": "613fb68639b26a494ac53253e15b1a6bd88ada85",
+ "tarball": "http://registry.npmjs.org/clone/-/clone-0.1.19.tgz"
},
"directories": {},
- "_resolved": "https://registry.npmjs.org/clone/-/clone-0.1.18.tgz"
+ "_resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz",
+ "readme": "ERROR: No README data found!"
}
diff --git a/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/test.js b/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/test.js
index ee49ad893a..cb3d16631a 100644
--- a/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/test.js
+++ b/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone/test.js
@@ -269,3 +269,21 @@ exports['clone object with null children'] = function(test) {
test.deepEqual(b, a);
test.done();
}
+
+exports['clone instance with getter'] = function(test) {
+ test.expect(1);
+ function Ctor() {};
+ Object.defineProperty(Ctor.prototype, 'prop', {
+ configurable: true,
+ enumerable: true,
+ get: function() {
+ return 'value';
+ }
+ });
+
+ var a = new Ctor();
+ var b = clone(a);
+
+ test.strictEqual(b.prop, 'value');
+ test.done();
+};
\ No newline at end of file
diff --git a/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/package.json b/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/package.json
index f9243a1200..e3ee621919 100644
--- a/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/package.json
+++ b/deps/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/package.json
@@ -45,6 +45,10 @@
],
"directories": {},
"_shasum": "3ae25f44416c6c01f9809a25fcdd285912d2a6b1",
- "_from": "defaults@>=1.0.0-0 <2.0.0-0",
- "_resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.0.tgz"
+ "_resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.0.tgz",
+ "_from": "defaults@>=1.0.0 <2.0.0",
+ "bugs": {
+ "url": "https://github.com/tmpvar/defaults/issues"
+ },
+ "homepage": "https://github.com/tmpvar/defaults"
}
diff --git a/deps/npm/node_modules/columnify/node_modules/wcwidth/package.json b/deps/npm/node_modules/columnify/node_modules/wcwidth/package.json
index f12d49b789..4744d9dc3f 100644
--- a/deps/npm/node_modules/columnify/node_modules/wcwidth/package.json
+++ b/deps/npm/node_modules/columnify/node_modules/wcwidth/package.json
@@ -40,7 +40,7 @@
"gitHead": "5bc3aafd45c89f233c27b9479c18a23ca91ba660",
"_id": "wcwidth@1.0.0",
"_shasum": "02d059ff7a8fc741e0f6b5da1e69b2b40daeca6f",
- "_from": "wcwidth@>=1.0.0-0 <2.0.0-0",
+ "_from": "wcwidth@>=1.0.0 <2.0.0",
"_npmVersion": "1.4.23",
"_npmUser": {
"name": "timoxley",
diff --git a/deps/npm/node_modules/columnify/package.json b/deps/npm/node_modules/columnify/package.json
index ef307b5092..c60e1d9de6 100644
--- a/deps/npm/node_modules/columnify/package.json
+++ b/deps/npm/node_modules/columnify/package.json
@@ -1,20 +1,21 @@
{
"name": "columnify",
- "version": "1.2.1",
- "description": "Render data in text columns, supports in-column text-wrap.",
+ "version": "1.3.2",
+ "description": "Render data in text columns. supports in-column text-wrap.",
"main": "index.js",
"scripts": {
"pretest": "npm prune",
- "test": "faucet"
+ "test": "tape test/*.js | tap-spec",
+ "bench": "npm test && node bench"
},
"author": {
"name": "Tim Oxley"
},
"license": "MIT",
"devDependencies": {
- "chalk": "^0.4.0",
- "faucet": "0.0.1",
- "tape": "~2.12.3"
+ "chalk": "^0.5.1",
+ "tap-spec": "^2.1.1",
+ "tape": "^3.0.3"
},
"repository": {
"type": "git",
@@ -34,17 +35,18 @@
},
"homepage": "https://github.com/timoxley/columnify",
"dependencies": {
- "strip-ansi": "^1.0.0",
+ "strip-ansi": "^2.0.0",
"wcwidth": "^1.0.0"
},
"directories": {
"test": "test"
},
- "gitHead": "14e77bef3f57acaa3f390145915a9f2d2a4f882c",
- "_id": "columnify@1.2.1",
- "_shasum": "921ec51c178f4126d3c07e9acecd67a55c7953e4",
- "_from": "columnify@>=1.2.1-0 <2.0.0-0",
- "_npmVersion": "1.4.23",
+ "gitHead": "5c7d4363a8d6178f0d415e8bdaf692281fe71975",
+ "_id": "columnify@1.3.2",
+ "_shasum": "61bd578a9269ae6fd949ce36fff589f3702c7867",
+ "_from": "columnify@>=1.3.2 <1.4.0",
+ "_npmVersion": "2.1.10",
+ "_nodeVersion": "0.10.33",
"_npmUser": {
"name": "timoxley",
"email": "secoif@gmail.com"
@@ -56,8 +58,8 @@
}
],
"dist": {
- "shasum": "921ec51c178f4126d3c07e9acecd67a55c7953e4",
- "tarball": "http://registry.npmjs.org/columnify/-/columnify-1.2.1.tgz"
+ "shasum": "61bd578a9269ae6fd949ce36fff589f3702c7867",
+ "tarball": "http://registry.npmjs.org/columnify/-/columnify-1.3.2.tgz"
},
- "_resolved": "https://registry.npmjs.org/columnify/-/columnify-1.2.1.tgz"
+ "_resolved": "https://registry.npmjs.org/columnify/-/columnify-1.3.2.tgz"
}
diff --git a/deps/npm/node_modules/fs-vacuum/package.json b/deps/npm/node_modules/fs-vacuum/package.json
index 140536797f..559b7bf2bd 100644
--- a/deps/npm/node_modules/fs-vacuum/package.json
+++ b/deps/npm/node_modules/fs-vacuum/package.json
@@ -1,6 +1,6 @@
{
"name": "fs-vacuum",
- "version": "1.2.1",
+ "version": "1.2.5",
"description": "recursively remove empty directories -- to a point",
"main": "vacuum.js",
"scripts": {
@@ -27,16 +27,17 @@
"devDependencies": {
"mkdirp": "^0.5.0",
"tap": "^0.4.11",
- "tmp": "0.0.23"
+ "tmp": "0.0.24"
},
"dependencies": {
"graceful-fs": "^3.0.2",
+ "path-is-inside": "^1.0.1",
"rimraf": "^2.2.8"
},
"readme": "# fs-vacuum\n\nRemove the empty branches of a directory tree, optionally up to (but not\nincluding) a specified base directory. Optionally nukes the leaf directory.\n\n## Usage\n\n```javascript\nvar logger = require(\"npmlog\");\nvar vacuum = require(\"fs-vacuum\");\n\nvar options = {\n base : \"/path/to/my/tree/root\",\n purge : true,\n log : logger.silly.bind(logger, \"myCleanup\")\n};\n\n/* Assuming there are no other files or directories in \"out\", \"to\", or \"my\",\n * the final path will just be \"/path/to/my/tree/root\".\n */\nvacuum(\"/path/to/my/tree/root/out/to/my/files\", function (error) {\n if (error) console.error(\"Unable to cleanly vacuum:\", error.message);\n});\n```\n# vacuum(directory, options, callback)\n\n* `directory` {String} Leaf node to remove. **Must be a directory, symlink, or file.**\n* `options` {Object}\n * `base` {String} No directories at or above this level of the filesystem will be removed.\n * `purge` {Boolean} If set, nuke the whole leaf directory, including its contents.\n * `log` {Function} A logging function that takes `npmlog`-compatible argument lists.\n* `callback` {Function} Function to call once vacuuming is complete.\n * `error` {Error} What went wrong along the way, if anything.\n",
"readmeFilename": "README.md",
- "gitHead": "bad24b21c45d86b3da991f2c3d058ef03546d83e",
- "_id": "fs-vacuum@1.2.1",
- "_shasum": "1bc3c62da30d6272569b8b9089c9811abb0a600b",
- "_from": "fs-vacuum@>=1.2.1-0 <1.3.0-0"
+ "gitHead": "4911a38a65b6a6cb19fc980d18304e1cfca91fbf",
+ "_id": "fs-vacuum@1.2.5",
+ "_shasum": "a5cbaa844b4b3a7cff139f3cc90e7f7007e5fbb8",
+ "_from": "fs-vacuum@~1.2.5"
}
diff --git a/deps/npm/node_modules/fs-vacuum/vacuum.js b/deps/npm/node_modules/fs-vacuum/vacuum.js
index f706a4be68..e55abe9701 100644
--- a/deps/npm/node_modules/fs-vacuum/vacuum.js
+++ b/deps/npm/node_modules/fs-vacuum/vacuum.js
@@ -1,6 +1,7 @@
-var assert = require("assert")
-var dirname = require("path").dirname
-var resolve = require("path").resolve
+var assert = require("assert")
+var dirname = require("path").dirname
+var resolve = require("path").resolve
+var isInside = require("path-is-inside")
var rimraf = require("rimraf")
var lstat = require("graceful-fs").lstat
@@ -19,9 +20,10 @@ function vacuum(leaf, options, cb) {
var log = options.log ? options.log : function () {}
- var base = options.base
- if (base && resolve(leaf).indexOf(resolve(base)) !== 0) {
- return cb(new Error(resolve(leaf) + " is not a child of " + resolve(base)))
+ leaf = leaf && resolve(leaf)
+ var base = options.base && resolve(options.base)
+ if (base && !isInside(leaf, base)) {
+ return cb(new Error(leaf + " is not a child of " + base))
}
lstat(leaf, function (error, stat) {
@@ -59,8 +61,9 @@ function vacuum(leaf, options, cb) {
})
function next(branch) {
+ branch = branch && resolve(branch)
// either we've reached the base or we've reached the root
- if ((base && resolve(branch) === resolve(base)) || branch === dirname(branch)) {
+ if ((base && branch === base) || branch === dirname(branch)) {
log("finished vacuuming up to", branch)
return cb(null)
}
@@ -90,7 +93,14 @@ function vacuum(leaf, options, cb) {
var remove = stat.isDirectory() ? rmdir : unlink
remove(branch, function (error) {
if (error) {
- if (error.code === "ENOENT") return cb(null)
+ if (error.code === "ENOENT") {
+ log("quitting because lost the race to remove", branch)
+ return cb(null)
+ }
+ if (error.code === "ENOTEMPTY") {
+ log("quitting because new (racy) entries in", branch)
+ return cb(null)
+ }
log("unable to remove", branch, "due to", error.message)
return cb(error)
diff --git a/deps/npm/node_modules/fstream-npm/node_modules/fstream-ignore/package.json b/deps/npm/node_modules/fstream-npm/node_modules/fstream-ignore/package.json
index 29e508673a..161b82564b 100644
--- a/deps/npm/node_modules/fstream-npm/node_modules/fstream-ignore/package.json
+++ b/deps/npm/node_modules/fstream-npm/node_modules/fstream-ignore/package.json
@@ -6,7 +6,7 @@
},
"name": "fstream-ignore",
"description": "A thing for ignoring files based on globs",
- "version": "1.0.1",
+ "version": "1.0.2",
"repository": {
"type": "git",
"url": "git://github.com/isaacs/fstream-ignore.git"
@@ -18,7 +18,7 @@
"dependencies": {
"fstream": "^1.0.0",
"inherits": "2",
- "minimatch": "^1.0.0"
+ "minimatch": "^2.0.1"
},
"devDependencies": {
"tap": "",
@@ -26,15 +26,16 @@
"mkdirp": ""
},
"license": "ISC",
- "gitHead": "290f2b621fa4f8fe3eec97307d22527fa2065375",
+ "gitHead": "20363d39660671c0de746bd07a0d07de7090d085",
"bugs": {
"url": "https://github.com/isaacs/fstream-ignore/issues"
},
"homepage": "https://github.com/isaacs/fstream-ignore",
- "_id": "fstream-ignore@1.0.1",
- "_shasum": "153df36c4fa2cb006fb915dc71ac9d75f6a17c82",
+ "_id": "fstream-ignore@1.0.2",
+ "_shasum": "18c891db01b782a74a7bff936a0f24997741c7ab",
"_from": "fstream-ignore@>=1.0.0 <2.0.0",
- "_npmVersion": "1.4.22",
+ "_npmVersion": "2.1.11",
+ "_nodeVersion": "0.10.16",
"_npmUser": {
"name": "isaacs",
"email": "i@izs.me"
@@ -46,10 +47,9 @@
}
],
"dist": {
- "shasum": "153df36c4fa2cb006fb915dc71ac9d75f6a17c82",
- "tarball": "http://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.1.tgz"
+ "shasum": "18c891db01b782a74a7bff936a0f24997741c7ab",
+ "tarball": "http://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.2.tgz"
},
"directories": {},
- "_resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.1.tgz",
- "readme": "ERROR: No README data found!"
+ "_resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.2.tgz"
}
diff --git a/deps/npm/node_modules/fstream-npm/package.json b/deps/npm/node_modules/fstream-npm/package.json
index e7de77086a..6b2ccc99d2 100644
--- a/deps/npm/node_modules/fstream-npm/package.json
+++ b/deps/npm/node_modules/fstream-npm/package.json
@@ -25,7 +25,7 @@
"_id": "fstream-npm@1.0.1",
"scripts": {},
"_shasum": "1e35c77f0fa24f5d6367e6d447ae7d6ddb482db2",
- "_from": "fstream-npm@>=1.0.1 <1.1.0",
+ "_from": "fstream-npm@1.0.1",
"_npmVersion": "2.1.3",
"_nodeVersion": "0.10.31",
"_npmUser": {
diff --git a/deps/npm/node_modules/fstream/examples/filter-pipe.js b/deps/npm/node_modules/fstream/examples/filter-pipe.js
index c6b55b3e02..983649bb9d 100644
--- a/deps/npm/node_modules/fstream/examples/filter-pipe.js
+++ b/deps/npm/node_modules/fstream/examples/filter-pipe.js
@@ -4,8 +4,8 @@ var path = require("path")
var r = fstream.Reader({ path: path.dirname(__dirname)
, filter: function () {
return !this.basename.match(/^\./) &&
- !this.basename.match(/^node_modules$/)
- !this.basename.match(/^deep-copy$/)
+ !this.basename.match(/^node_modules$/) &&
+ !this.basename.match(/^deep-copy$/) &&
!this.basename.match(/^filter-copy$/)
}
})
diff --git a/deps/npm/node_modules/fstream/examples/pipe.js b/deps/npm/node_modules/fstream/examples/pipe.js
index 648ec84938..0bad122f9b 100644
--- a/deps/npm/node_modules/fstream/examples/pipe.js
+++ b/deps/npm/node_modules/fstream/examples/pipe.js
@@ -4,7 +4,7 @@ var path = require("path")
var r = fstream.Reader({ path: path.dirname(__dirname)
, filter: function () {
return !this.basename.match(/^\./) &&
- !this.basename.match(/^node_modules$/)
+ !this.basename.match(/^node_modules$/) &&
!this.basename.match(/^deep-copy$/)
}
})
diff --git a/deps/npm/node_modules/fstream/examples/reader.js b/deps/npm/node_modules/fstream/examples/reader.js
index 9aa1a9538d..3787ae376f 100644
--- a/deps/npm/node_modules/fstream/examples/reader.js
+++ b/deps/npm/node_modules/fstream/examples/reader.js
@@ -2,13 +2,12 @@ var fstream = require("../fstream.js")
var tap = require("tap")
var fs = require("fs")
var path = require("path")
-var children = -1
var dir = path.dirname(__dirname)
-var gotReady = false
-var ended = false
-
tap.test("reader test", function (t) {
+ var children = -1
+ var gotReady = false
+ var ended = false
var r = fstream.Reader({ path: dir
, filter: function () {
@@ -52,3 +51,18 @@ tap.test("reader test", function (t) {
})
})
+
+tap.test("reader error test", function (t) {
+ // assumes non-root on a *nix system
+ var r = fstream.Reader({ path: '/etc/shadow' })
+
+ r.once("error", function (er) {
+ t.ok(true);
+ t.end()
+ })
+
+ r.on("end", function () {
+ t.fail("reader ended without error");
+ t.end()
+ })
+})
diff --git a/deps/npm/node_modules/fstream/lib/file-reader.js b/deps/npm/node_modules/fstream/lib/file-reader.js
index b1f9861838..4720cd86a4 100644
--- a/deps/npm/node_modules/fstream/lib/file-reader.js
+++ b/deps/npm/node_modules/fstream/lib/file-reader.js
@@ -80,6 +80,10 @@ FileReader.prototype._getStream = function () {
}
})
+ stream.on("error", function (e) {
+ me.emit("error", e);
+ });
+
me._read()
}
diff --git a/deps/npm/node_modules/fstream/package.json b/deps/npm/node_modules/fstream/package.json
index d0ac58243a..f920c10036 100644
--- a/deps/npm/node_modules/fstream/package.json
+++ b/deps/npm/node_modules/fstream/package.json
@@ -6,7 +6,7 @@
},
"name": "fstream",
"description": "Advanced file system stream things",
- "version": "1.0.2",
+ "version": "1.0.3",
"repository": {
"type": "git",
"url": "git://github.com/isaacs/fstream.git"
@@ -28,30 +28,14 @@
"test": "tap examples/*.js"
},
"license": "BSD",
- "gitHead": "b3b74e92ef4a91ae206fab90b7998c7cd2e4290d",
+ "readme": "Like FS streams, but with stat on them, and supporting directories and\nsymbolic links, as well as normal files. Also, you can use this to set\nthe stats on a file, even if you don't change its contents, or to create\na symlink, etc.\n\nSo, for example, you can \"write\" a directory, and it'll call `mkdir`. You\ncan specify a uid and gid, and it'll call `chown`. You can specify a\n`mtime` and `atime`, and it'll call `utimes`. You can call it a symlink\nand provide a `linkpath` and it'll call `symlink`.\n\nNote that it won't automatically resolve symbolic links. So, if you\ncall `fstream.Reader('/some/symlink')` then you'll get an object\nthat stats and then ends immediately (since it has no data). To follow\nsymbolic links, do this: `fstream.Reader({path:'/some/symlink', follow:\ntrue })`.\n\nThere are various checks to make sure that the bytes emitted are the\nsame as the intended size, if the size is set.\n\n## Examples\n\n```javascript\nfstream\n .Writer({ path: \"path/to/file\"\n , mode: 0755\n , size: 6\n })\n .write(\"hello\\n\")\n .end()\n```\n\nThis will create the directories if they're missing, and then write\n`hello\\n` into the file, chmod it to 0755, and assert that 6 bytes have\nbeen written when it's done.\n\n```javascript\nfstream\n .Writer({ path: \"path/to/file\"\n , mode: 0755\n , size: 6\n , flags: \"a\"\n })\n .write(\"hello\\n\")\n .end()\n```\n\nYou can pass flags in, if you want to append to a file.\n\n```javascript\nfstream\n .Writer({ path: \"path/to/symlink\"\n , linkpath: \"./file\"\n , SymbolicLink: true\n , mode: \"0755\" // octal strings supported\n })\n .end()\n```\n\nIf isSymbolicLink is a function, it'll be called, and if it returns\ntrue, then it'll treat it as a symlink. If it's not a function, then\nany truish value will make a symlink, or you can set `type:\n'SymbolicLink'`, which does the same thing.\n\nNote that the linkpath is relative to the symbolic link location, not\nthe parent dir or cwd.\n\n```javascript\nfstream\n .Reader(\"path/to/dir\")\n .pipe(fstream.Writer(\"path/to/other/dir\"))\n```\n\nThis will do like `cp -Rp path/to/dir path/to/other/dir`. If the other\ndir exists and isn't a directory, then it'll emit an error. It'll also\nset the uid, gid, mode, etc. to be identical. In this way, it's more\nlike `rsync -a` than simply a copy.\n",
+ "readmeFilename": "README.md",
+ "gitHead": "d205397b27d93eee5314e9d2d87693e82b560106",
"bugs": {
"url": "https://github.com/isaacs/fstream/issues"
},
"homepage": "https://github.com/isaacs/fstream",
- "_id": "fstream@1.0.2",
- "_shasum": "56930ff1b4d4d7b1a689c8656b3a11e744ab92c6",
- "_from": "fstream@1.0.2",
- "_npmVersion": "1.4.23",
- "_npmUser": {
- "name": "isaacs",
- "email": "i@izs.me"
- },
- "maintainers": [
- {
- "name": "isaacs",
- "email": "i@izs.me"
- }
- ],
- "dist": {
- "shasum": "56930ff1b4d4d7b1a689c8656b3a11e744ab92c6",
- "tarball": "http://registry.npmjs.org/fstream/-/fstream-1.0.2.tgz"
- },
- "directories": {},
- "_resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.2.tgz",
- "readme": "ERROR: No README data found!"
+ "_id": "fstream@1.0.3",
+ "_shasum": "5ce69767710d7a39c8cd9232470d9426790195da",
+ "_from": "fstream@>=1.0.3 <1.1.0"
}
diff --git a/deps/npm/node_modules/glob/.npmignore b/deps/npm/node_modules/glob/.npmignore
deleted file mode 100644
index c34fdd597e..0000000000
--- a/deps/npm/node_modules/glob/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-.*.swp
-test/a/
-node_modules/*
diff --git a/deps/npm/node_modules/glob/README.md b/deps/npm/node_modules/glob/README.md
index 82b7ef6d61..d72bdccbe0 100644
--- a/deps/npm/node_modules/glob/README.md
+++ b/deps/npm/node_modules/glob/README.md
@@ -1,3 +1,5 @@
+[![Build Status](https://travis-ci.org/isaacs/node-glob.svg?branch=master)](https://travis-ci.org/isaacs/node-glob/) [![Dependency Status](https://david-dm.org/isaacs/node-glob.svg)](https://david-dm.org/isaacs/node-glob) [![devDependency Status](https://david-dm.org/isaacs/node-glob/dev-status.svg)](https://david-dm.org/isaacs/node-glob#info=devDependencies) [![optionalDependency Status](https://david-dm.org/isaacs/node-glob/optional-status.svg)](https://david-dm.org/isaacs/node-glob#info=optionalDependencies)
+
# Glob
Match files using the patterns the shell uses, like stars and stuff.
@@ -21,25 +23,94 @@ glob("**/*.js", options, function (er, files) {
})
```
-## Features
+## Glob Primer
+
+"Globs" are the patterns you type when you do stuff like `ls *.js` on
+the command line, or put `build/*` in a `.gitignore` file.
+
+Before parsing the path part patterns, braced sections are expanded
+into a set. Braced sections start with `{` and end with `}`, with any
+number of comma-delimited sections within. Braced sections may contain
+slash characters, so `a{/b/c,bcd}` would expand into `a/b/c` and `abcd`.
+
+The following characters have special magic meaning when used in a
+path portion:
+
+* `*` Matches 0 or more characters in a single path portion
+* `?` Matches 1 character
+* `[...]` Matches a range of characters, similar to a RegExp range.
+ If the first character of the range is `!` or `^` then it matches
+ any character not in the range.
+* `!(pattern|pattern|pattern)` Matches anything that does not match
+ any of the patterns provided.
+* `?(pattern|pattern|pattern)` Matches zero or one occurrence of the
+ patterns provided.
+* `+(pattern|pattern|pattern)` Matches one or more occurrences of the
+ patterns provided.
+* `*(a|b|c)` Matches zero or more occurrences of the patterns provided
+* `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns
+ provided
+* `**` If a "globstar" is alone in a path portion, then it matches
+ zero or more directories and subdirectories searching for matches.
+ It does not crawl symlinked directories.
+
+### Dots
+
+If a file or directory path portion has a `.` as the first character,
+then it will not match any glob pattern unless that pattern's
+corresponding path part also has a `.` as its first character.
+
+For example, the pattern `a/.*/c` would match the file at `a/.b/c`.
+However the pattern `a/*/c` would not, because `*` does not start with
+a dot character.
+
+You can make glob treat dots as normal characters by setting
+`dot:true` in the options.
+
+### Basename Matching
+
+If you set `matchBase:true` in the options, and the pattern has no
+slashes in it, then it will seek for any file anywhere in the tree
+with a matching basename. For example, `*.js` would match
+`test/simple/basic.js`.
+
+### Negation
+
+The intent for negation would be for a pattern starting with `!` to
+match everything that *doesn't* match the supplied pattern. However,
+the implementation is weird, and for the time being, this should be
+avoided. The behavior will change or be deprecated in version 5.
+
+### Empty Sets
-Please see the [minimatch
-documentation](https://github.com/isaacs/minimatch) for more details.
+If no matching files are found, then an empty array is returned. This
+differs from the shell, where the pattern itself is returned. For
+example:
-Supports these glob features:
+ $ echo a*s*d*f
+ a*s*d*f
-* Brace Expansion
-* Extended glob matching
-* "Globstar" `**` matching
+To get the bash-style behavior, set the `nonull:true` in the options.
-See:
+### See Also:
* `man sh`
-* `man bash`
+* `man bash` (Search for "Pattern Matching")
* `man 3 fnmatch`
* `man 5 gitignore`
* [minimatch documentation](https://github.com/isaacs/minimatch)
+## glob.hasMagic(pattern, [options])
+
+Returns `true` if there are any special characters in the pattern, and
+`false` otherwise.
+
+Note that the options affect the results. If `noext:true` is set in
+the options object, then `+(a|b)` will not be considered a magic
+pattern. If the pattern has a brace expansion, like `a/{b/c,x/y}`
+then that is considered magical, unless `nobrace:true` is set in the
+options.
+
## glob(pattern, [options], cb)
* `pattern` {String} Pattern to be matched
@@ -60,7 +131,7 @@ Perform a synchronous glob search.
## Class: glob.Glob
-Create a Glob object by instanting the `glob.Glob` class.
+Create a Glob object by instantiating the `glob.Glob` class.
```javascript
var Glob = require("glob").Glob
@@ -85,8 +156,6 @@ be immediately available on the `g.found` member.
* `minimatch` The minimatch object that the glob uses.
* `options` The options object passed in.
-* `error` The error encountered. When an error is encountered, the
- glob object is in an undefined state, and should be discarded.
* `aborted` Boolean which is set to true when calling `abort()`. There
is no way at this time to continue a glob search after aborting, but
you can re-use the statCache to avoid having to duplicate syscalls.
@@ -96,10 +165,14 @@ be immediately available on the `g.found` member.
values:
* `false` - Path does not exist
* `true` - Path exists
- * `1` - Path exists, and is not a directory
- * `2` - Path exists, and is a directory
+ * `'DIR'` - Path exists, and is not a directory
+ * `'FILE'` - Path exists, and is a directory
* `[file, entries, ...]` - Path exists, is a directory, and the
array value is the results of `fs.readdir`
+* `statCache` Cache of `fs.stat` results, to prevent statting the same
+ path multiple times.
+* `symlinks` A record of which paths are symbolic links, which is
+ relevant in resolving `**` patterns.
### Events
@@ -114,7 +187,9 @@ be immediately available on the `g.found` member.
### Methods
-* `abort` Stop the search.
+* `pause` Temporarily stop the search
+* `resume` Resume the search
+* `abort` Stop the search forever
### Options
@@ -124,7 +199,14 @@ or have glob-specific ramifications.
All options are false by default, unless otherwise noted.
-All options are added to the glob object, as well.
+All options are added to the Glob object, as well.
+
+If you are running many `glob` operations, you can pass a Glob object
+as the `options` argument to a subsequent operation to shortcut some
+`stat` and `readdir` calls. At the very least, you may pass in shared
+`symlinks`, `statCache`, and `cache` options, so that parallel glob
+operations will be sped up by sharing information about the
+filesystem.
* `cwd` The current working directory in which to search. Defaults
to `process.cwd()`.
@@ -142,36 +224,50 @@ All options are added to the glob object, as well.
* `nosort` Don't sort the results.
* `stat` Set to true to stat *all* results. This reduces performance
somewhat, and is completely unnecessary, unless `readdir` is presumed
- to be an untrustworthy indicator of file existence. It will cause
- ELOOP to be triggered one level sooner in the case of cyclical
- symbolic links.
-* `silent` When an unusual error is encountered
- when attempting to read a directory, a warning will be printed to
- stderr. Set the `silent` option to true to suppress these warnings.
-* `strict` When an unusual error is encountered
- when attempting to read a directory, the process will just continue on
- in search of other matches. Set the `strict` option to raise an error
- in these cases.
+ to be an untrustworthy indicator of file existence.
+* `silent` When an unusual error is encountered when attempting to
+ read a directory, a warning will be printed to stderr. Set the
+ `silent` option to true to suppress these warnings.
+* `strict` When an unusual error is encountered when attempting to
+ read a directory, the process will just continue on in search of
+ other matches. Set the `strict` option to raise an error in these
+ cases.
* `cache` See `cache` property above. Pass in a previously generated
cache object to save some fs calls.
* `statCache` A cache of results of filesystem information, to prevent
- unnecessary stat calls. While it should not normally be necessary to
- set this, you may pass the statCache from one glob() call to the
+ unnecessary stat calls. While it should not normally be necessary
+ to set this, you may pass the statCache from one glob() call to the
options object of another, if you know that the filesystem will not
change between calls. (See "Race Conditions" below.)
+* `symlinks` A cache of known symbolic links. You may pass in a
+ previously generated `symlinks` object to save `lstat` calls when
+ resolving `**` matches.
* `sync` Perform a synchronous glob search.
* `nounique` In some cases, brace-expanded patterns can result in the
same file showing up multiple times in the result set. By default,
- this implementation prevents duplicates in the result set.
- Set this flag to disable that behavior.
+ this implementation prevents duplicates in the result set. Set this
+ flag to disable that behavior.
* `nonull` Set to never return an empty set, instead returning a set
containing the pattern itself. This is the default in glob(3).
-* `nocase` Perform a case-insensitive match. Note that case-insensitive
- filesystems will sometimes result in glob returning results that are
- case-insensitively matched anyway, since readdir and stat will not
- raise an error.
+* `nocase` Perform a case-insensitive match. Note that
+ case-insensitive filesystems will sometimes result in glob returning
+ results that are case-insensitively matched anyway, since readdir
+ and stat will not raise an error.
* `debug` Set to enable debug logging in minimatch and glob.
-* `globDebug` Set to enable debug logging in glob, but not minimatch.
+* `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets.
+* `noglobstar` Do not match `**` against multiple filenames. (Ie,
+ treat it as a normal `*` instead.)
+* `noext` Do not match `+(a|b)` "extglob" patterns.
+* `nocase` Perform a case-insensitive match. Note: on
+ case-insensitive filesystems, non-magic patterns will match by
+ default, since `stat` and `readdir` will not raise errors.
+* `matchBase` Perform a basename-only match if the pattern does not
+ contain any slash characters. That is, `*.js` would be treated as
+ equivalent to `**/*.js`, matching all js files in all directories.
+* `nonegate` Suppress `negate` behavior. (See below.)
+* `nocomment` Suppress `comment` behavior. (See below.)
+* `nonull` Return the pattern when no matches are found.
+* `nodir` Do not match directories, only files.
## Comparisons to other fnmatch/glob implementations
@@ -192,10 +288,14 @@ start of a line, or set the `nocomment` flag to suppress this behavior.
The double-star character `**` is supported by default, unless the
`noglobstar` flag is set. This is supported in the manner of bsdglob
-and bash 4.1, where `**` only has special significance if it is the only
+and bash 4.3, where `**` only has special significance if it is the only
thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but
`a/**b` will not.
+Note that symlinked directories are not crawled as part of a `**`,
+though their contents may match against subsequent portions of the
+pattern. This prevents infinite loops and duplicates and the like.
+
If an escaped pattern has no matches, and the `nonull` flag is set,
then glob returns the pattern as-provided, rather than
interpreting the character escapes. For example,
@@ -239,3 +339,23 @@ calls.
Users are thus advised not to use a glob result as a guarantee of
filesystem state in the face of rapid changes. For the vast majority
of operations, this is never a problem.
+
+## Contributing
+
+Any change to behavior (including bugfixes) must come with a test.
+
+Patches that fail tests or reduce performance will be rejected.
+
+```
+# to run tests
+npm test
+
+# to re-generate test fixtures
+npm run test-regen
+
+# to benchmark against bash/zsh
+npm run bench
+
+# to profile javascript
+npm run prof
+```
diff --git a/deps/npm/node_modules/glob/common.js b/deps/npm/node_modules/glob/common.js
new file mode 100644
index 0000000000..610d1245b4
--- /dev/null
+++ b/deps/npm/node_modules/glob/common.js
@@ -0,0 +1,177 @@
+exports.alphasort = alphasort
+exports.alphasorti = alphasorti
+exports.isAbsolute = process.platform === "win32" ? absWin : absUnix
+exports.setopts = setopts
+exports.ownProp = ownProp
+exports.makeAbs = makeAbs
+exports.finish = finish
+exports.mark = mark
+
+function ownProp (obj, field) {
+ return Object.prototype.hasOwnProperty.call(obj, field)
+}
+
+var path = require("path")
+var minimatch = require("minimatch")
+var Minimatch = minimatch.Minimatch
+
+function absWin (p) {
+ if (absUnix(p)) return true
+ // pull off the device/UNC bit from a windows path.
+ // from node's lib/path.js
+ var splitDeviceRe =
+ /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/
+ var result = splitDeviceRe.exec(p)
+ var device = result[1] || ''
+ var isUnc = device && device.charAt(1) !== ':'
+ var isAbsolute = !!result[2] || isUnc // UNC paths are always absolute
+
+ return isAbsolute
+}
+
+function absUnix (p) {
+ return p.charAt(0) === "/" || p === ""
+}
+
+function alphasorti (a, b) {
+ return a.toLowerCase().localeCompare(b.toLowerCase())
+}
+
+function alphasort (a, b) {
+ return a.localeCompare(b)
+}
+
+
+function setopts (self, pattern, options) {
+ if (!options)
+ options = {}
+
+ // base-matching: just use globstar for that.
+ if (options.matchBase && -1 === pattern.indexOf("/")) {
+ if (options.noglobstar) {
+ throw new Error("base matching requires globstar")
+ }
+ pattern = "**/" + pattern
+ }
+
+ self.pattern = pattern
+ self.strict = options.strict !== false
+ self.dot = !!options.dot
+ self.mark = !!options.mark
+ self.nodir = !!options.nodir
+ if (self.nodir)
+ self.mark = true
+ self.sync = !!options.sync
+ self.nounique = !!options.nounique
+ self.nonull = !!options.nonull
+ self.nosort = !!options.nosort
+ self.nocase = !!options.nocase
+ self.stat = !!options.stat
+ self.noprocess = !!options.noprocess
+
+ self.maxLength = options.maxLength || Infinity
+ self.cache = options.cache || Object.create(null)
+ self.statCache = options.statCache || Object.create(null)
+ self.symlinks = options.symlinks || Object.create(null)
+
+ self.changedCwd = false
+ var cwd = process.cwd()
+ if (!ownProp(options, "cwd"))
+ self.cwd = cwd
+ else {
+ self.cwd = options.cwd
+ self.changedCwd = path.resolve(options.cwd) !== cwd
+ }
+
+ self.root = options.root || path.resolve(self.cwd, "/")
+ self.root = path.resolve(self.root)
+ if (process.platform === "win32")
+ self.root = self.root.replace(/\\/g, "/")
+
+ self.nomount = !!options.nomount
+
+ self.minimatch = new Minimatch(pattern, options)
+ self.options = self.minimatch.options
+}
+
+function finish (self) {
+ var nou = self.nounique
+ var all = nou ? [] : Object.create(null)
+
+ for (var i = 0, l = self.matches.length; i < l; i ++) {
+ var matches = self.matches[i]
+ if (!matches) {
+ if (self.nonull) {
+ // do like the shell, and spit out the literal glob
+ var literal = self.minimatch.globSet[i]
+ if (nou)
+ all.push(literal)
+ else
+ all[literal] = true
+ }
+ } else {
+ // had matches
+ var m = Object.keys(matches)
+ if (nou)
+ all.push.apply(all, m)
+ else
+ m.forEach(function (m) {
+ all[m] = true
+ })
+ }
+ }
+
+ if (!nou)
+ all = Object.keys(all)
+
+ if (!self.nosort)
+ all = all.sort(self.nocase ? alphasorti : alphasort)
+
+ // at *some* point we statted all of these
+ if (self.mark) {
+ for (var i = 0; i < all.length; i++) {
+ all[i] = self._mark(all[i])
+ }
+ if (self.nodir) {
+ all = all.filter(function (e) {
+ return !(/\/$/.test(e))
+ })
+ }
+ }
+
+ self.found = all
+}
+
+function mark (self, p) {
+ var c = self.cache[p]
+ var m = p
+ if (c) {
+ var isDir = c === 'DIR' || Array.isArray(c)
+ var slash = p.slice(-1) === '/'
+
+ if (isDir && !slash)
+ m += '/'
+ else if (!isDir && slash)
+ m = m.slice(0, -1)
+
+ if (m !== p) {
+ self.statCache[m] = self.statCache[p]
+ self.cache[m] = self.cache[p]
+ }
+ }
+
+ return m
+}
+
+// lotta situps...
+function makeAbs (self, f) {
+ var abs = f
+ if (f.charAt(0) === "/") {
+ abs = path.join(self.root, f)
+ } else if (exports.isAbsolute(f)) {
+ abs = f
+ } else if (self.changedCwd) {
+ abs = path.resolve(self.cwd, f)
+ }
+ return abs
+}
diff --git a/deps/npm/node_modules/glob/examples/g.js b/deps/npm/node_modules/glob/examples/g.js
deleted file mode 100644
index be122df002..0000000000
--- a/deps/npm/node_modules/glob/examples/g.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var Glob = require("../").Glob
-
-var pattern = "test/a/**/[cg]/../[cg]"
-console.log(pattern)
-
-var mg = new Glob(pattern, {mark: true, sync:true}, function (er, matches) {
- console.log("matches", matches)
-})
-console.log("after")
diff --git a/deps/npm/node_modules/glob/examples/usr-local.js b/deps/npm/node_modules/glob/examples/usr-local.js
deleted file mode 100644
index 327a425e47..0000000000
--- a/deps/npm/node_modules/glob/examples/usr-local.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var Glob = require("../").Glob
-
-var pattern = "{./*/*,/*,/usr/local/*}"
-console.log(pattern)
-
-var mg = new Glob(pattern, {mark: true}, function (er, matches) {
- console.log("matches", matches)
-})
-console.log("after")
diff --git a/deps/npm/node_modules/glob/glob.js b/deps/npm/node_modules/glob/glob.js
index 564f3b1217..8c99078218 100644
--- a/deps/npm/node_modules/glob/glob.js
+++ b/deps/npm/node_modules/glob/glob.js
@@ -1,24 +1,30 @@
// Approach:
//
// 1. Get the minimatch set
-// 2. For each pattern in the set, PROCESS(pattern)
+// 2. For each pattern in the set, PROCESS(pattern, false)
// 3. Store matches per-set, then uniq them
//
-// PROCESS(pattern)
+// PROCESS(pattern, inGlobStar)
// Get the first [n] items from pattern that are all strings
// Join these together. This is PREFIX.
// If there is no more remaining, then stat(PREFIX) and
// add to matches if it succeeds. END.
-// readdir(PREFIX) as ENTRIES
-// If fails, END
+//
+// If inGlobStar and PREFIX is symlink and points to dir
+// set ENTRIES = []
+// else readdir(PREFIX) as ENTRIES
+// If fail, END
+//
+// with ENTRIES
// If pattern[n] is GLOBSTAR
// // handle the case where the globstar match is empty
// // by pruning it out, and testing the resulting pattern
-// PROCESS(pattern[0..n] + pattern[n+1 .. $])
+// PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
// // handle other cases.
// for ENTRY in ENTRIES (not dotfiles)
// // attach globstar + tail onto the entry
-// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $])
+// // Mark that this entry is a globstar match
+// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
//
// else // not globstar
// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
@@ -32,146 +38,80 @@
// `true` for files, and [children,...] for directories, or `false` for
// things that don't exist.
-
-
module.exports = glob
-var fs = require("graceful-fs")
-, minimatch = require("minimatch")
-, Minimatch = minimatch.Minimatch
-, inherits = require("inherits")
-, EE = require("events").EventEmitter
-, path = require("path")
-, isDir = {}
-, assert = require("assert").ok
-, once = require("once")
+var fs = require("fs")
+var minimatch = require("minimatch")
+var Minimatch = minimatch.Minimatch
+var inherits = require("inherits")
+var EE = require("events").EventEmitter
+var path = require("path")
+var assert = require("assert")
+var globSync = require("./sync.js")
+var common = require("./common.js")
+var alphasort = common.alphasort
+var isAbsolute = common.isAbsolute
+var setopts = common.setopts
+var ownProp = common.ownProp
+var inflight = require("inflight")
+var util = require("util")
+
+var once = require("once")
function glob (pattern, options, cb) {
if (typeof options === "function") cb = options, options = {}
if (!options) options = {}
- if (typeof options === "number") {
- deprecated()
- return
+ if (options.sync) {
+ if (cb)
+ throw new TypeError('callback provided to sync glob')
+ return globSync(pattern, options)
}
- var g = new Glob(pattern, options, cb)
- return g.sync ? g.found : g
+ return new Glob(pattern, options, cb)
}
-glob.fnmatch = deprecated
+glob.sync = globSync
+var GlobSync = glob.GlobSync = globSync.GlobSync
-function deprecated () {
- throw new Error("glob's interface has changed. Please see the docs.")
-}
+// old api surface
+glob.glob = glob
-glob.sync = globSync
-function globSync (pattern, options) {
- if (typeof options === "number") {
- deprecated()
- return
+glob.hasMagic = function (pattern, options_) {
+ var options = util._extend({}, options_)
+ options.noprocess = true
+
+ var g = new Glob(pattern, options)
+ var set = g.minimatch.set
+ if (set.length > 1)
+ return true
+
+ for (var j = 0; j < set[0].length; j++) {
+ if (typeof set[0][j] !== 'string')
+ return true
}
- options = options || {}
- options.sync = true
- return glob(pattern, options)
+ return false
}
-this._processingEmitQueue = false
-
glob.Glob = Glob
inherits(Glob, EE)
function Glob (pattern, options, cb) {
- if (!(this instanceof Glob)) {
- return new Glob(pattern, options, cb)
- }
-
if (typeof options === "function") {
cb = options
options = null
}
- if (typeof cb === "function") {
- cb = once(cb)
- this.on("error", cb)
- this.on("end", function (matches) {
- cb(null, matches)
- })
- }
-
- options = options || {}
-
- this._endEmitted = false
- this.EOF = {}
- this._emitQueue = []
-
- this.paused = false
- this._processingEmitQueue = false
-
- this.maxDepth = options.maxDepth || 1000
- this.maxLength = options.maxLength || Infinity
- this.cache = options.cache || {}
- this.statCache = options.statCache || {}
-
- this.changedCwd = false
- var cwd = process.cwd()
- if (!options.hasOwnProperty("cwd")) this.cwd = cwd
- else {
- this.cwd = options.cwd
- this.changedCwd = path.resolve(options.cwd) !== cwd
- }
-
- this.root = options.root || path.resolve(this.cwd, "/")
- this.root = path.resolve(this.root)
- if (process.platform === "win32")
- this.root = this.root.replace(/\\/g, "/")
-
- this.nomount = !!options.nomount
-
- if (!pattern) {
- throw new Error("must provide pattern")
- }
-
- // base-matching: just use globstar for that.
- if (options.matchBase && -1 === pattern.indexOf("/")) {
- if (options.noglobstar) {
- throw new Error("base matching requires globstar")
- }
- pattern = "**/" + pattern
+ if (options && options.sync) {
+ if (cb)
+ throw new TypeError('callback provided to sync glob')
+ return new GlobSync(pattern, options)
}
- this.strict = options.strict !== false
- this.dot = !!options.dot
- this.mark = !!options.mark
- this.sync = !!options.sync
- this.nounique = !!options.nounique
- this.nonull = !!options.nonull
- this.nosort = !!options.nosort
- this.nocase = !!options.nocase
- this.stat = !!options.stat
-
- this.debug = !!options.debug || !!options.globDebug
-
- if (/\bglob\b/.test(process.env.NODE_DEBUG || ''))
- this.debug = true
-
- if (this.debug)
- this.log = console.error
-
- this.silent = !!options.silent
-
- var mm = this.minimatch = new Minimatch(pattern, options)
- this.options = mm.options
- pattern = this.pattern = mm.pattern
-
- this.error = null
- this.aborted = false
-
- // list of all the patterns that ** has resolved do, so
- // we can avoid visiting multiple times.
- this._globstars = {}
+ if (!(this instanceof Glob))
+ return new Glob(pattern, options, cb)
- EE.call(this)
+ setopts(this, pattern, options)
// process each pattern in the minimatch set
var n = this.minimatch.set.length
@@ -182,93 +122,56 @@ function Glob (pattern, options, cb) {
// Keep them as a list so we can fill in when nonull is set.
this.matches = new Array(n)
- if (this.minimatch.set.length === 0) {
- return process.nextTick(this._finish.bind(this))
- }
-
- this.minimatch.set.forEach(iterator.bind(this))
- function iterator (pattern, i, set) {
- this._process(pattern, 0, i, function (er) {
- if (er) this.emit("error", er)
- if (-- n <= 0) this._finish()
+ if (typeof cb === "function") {
+ cb = once(cb)
+ this.on("error", cb)
+ this.on("end", function (matches) {
+ cb(null, matches)
})
}
-}
-Glob.prototype.log = function () {}
+ var self = this
+ var n = this.minimatch.set.length
+ this._processing = 0
+ this.matches = new Array(n)
-Glob.prototype._finish = function () {
- assert(this instanceof Glob)
+ this._emitQueue = []
+ this._processQueue = []
+ this.paused = false
- var nou = this.nounique
- , all = nou ? [] : {}
-
- for (var i = 0, l = this.matches.length; i < l; i ++) {
- var matches = this.matches[i]
- this.log("matches[%d] =", i, matches)
- // do like the shell, and spit out the literal glob
- if (!matches) {
- if (this.nonull) {
- var literal = this.minimatch.globSet[i]
- if (nou) all.push(literal)
- else all[literal] = true
- }
- } else {
- // had matches
- var m = Object.keys(matches)
- if (nou) all.push.apply(all, m)
- else m.forEach(function (m) {
- all[m] = true
- })
- }
- }
+ if (this.noprocess)
+ return this
- if (!nou) all = Object.keys(all)
+ if (n === 0)
+ return done()
- if (!this.nosort) {
- all = all.sort(this.nocase ? alphasorti : alphasort)
+ for (var i = 0; i < n; i ++) {
+ this._process(this.minimatch.set[i], i, false, done)
}
- if (this.mark) {
- // at *some* point we statted all of these
- all = all.map(this._mark, this)
+ function done () {
+ --self._processing
+ if (self._processing <= 0)
+ self._finish()
}
-
- this.log("emitting end", all)
-
- this.EOF = this.found = all
- this.emitMatch(this.EOF)
}
-function alphasorti (a, b) {
- a = a.toLowerCase()
- b = b.toLowerCase()
- return alphasort(a, b)
-}
+Glob.prototype._finish = function () {
+ assert(this instanceof Glob)
+ if (this.aborted)
+ return
-function alphasort (a, b) {
- return a > b ? 1 : a < b ? -1 : 0
+ //console.error('FINISH', this.matches)
+ common.finish(this)
+ this.emit("end", this.found)
}
Glob.prototype._mark = function (p) {
- var c = this.cache[p]
- var m = p
- if (c) {
- var isDir = c === 2 || Array.isArray(c)
- var slash = p.slice(-1) === '/'
-
- if (isDir && !slash)
- m += '/'
- else if (!isDir && slash)
- m = m.slice(0, -1)
-
- if (m !== p) {
- this.statCache[m] = this.statCache[p]
- this.cache[m] = this.cache[p]
- }
- }
+ return common.mark(this, p)
+}
- return m
+Glob.prototype._makeAbs = function (f) {
+ return common.makeAbs(this, f)
}
Glob.prototype.abort = function () {
@@ -277,111 +180,50 @@ Glob.prototype.abort = function () {
}
Glob.prototype.pause = function () {
- if (this.paused) return
- if (this.sync)
- this.emit("error", new Error("Can't pause/resume sync glob"))
- this.paused = true
- this.emit("pause")
+ if (!this.paused) {
+ this.paused = true
+ this.emit("pause")
+ }
}
Glob.prototype.resume = function () {
- if (!this.paused) return
- if (this.sync)
- this.emit("error", new Error("Can't pause/resume sync glob"))
- this.paused = false
- this.emit("resume")
- this._processEmitQueue()
- //process.nextTick(this.emit.bind(this, "resume"))
-}
-
-Glob.prototype.emitMatch = function (m) {
- this.log('emitMatch', m)
- this._emitQueue.push(m)
- this._processEmitQueue()
-}
-
-Glob.prototype._processEmitQueue = function (m) {
- this.log("pEQ paused=%j processing=%j m=%j", this.paused,
- this._processingEmitQueue, m)
- var done = false
- while (!this._processingEmitQueue &&
- !this.paused) {
- this._processingEmitQueue = true
- var m = this._emitQueue.shift()
- this.log(">processEmitQueue", m === this.EOF ? ":EOF:" : m)
- if (!m) {
- this.log(">processEmitQueue, falsey m")
- this._processingEmitQueue = false
- break
- }
-
- if (m === this.EOF || !(this.mark && !this.stat)) {
- this.log("peq: unmarked, or eof")
- next.call(this, 0, false)
- } else if (this.statCache[m]) {
- var sc = this.statCache[m]
- var exists
- if (sc)
- exists = sc.isDirectory() ? 2 : 1
- this.log("peq: stat cached")
- next.call(this, exists, exists === 2)
- } else {
- this.log("peq: _stat, then next")
- this._stat(m, next)
+ if (this.paused) {
+ this.emit("resume")
+ this.paused = false
+ if (this._emitQueue.length) {
+ var eq = this._emitQueue.slice(0)
+ this._emitQueue.length = 0
+ for (var i = 0; i < eq.length; i ++) {
+ var e = eq[i]
+ this._emitMatch(e[0], e[1])
+ }
}
- }
- done = true
-
- function next(exists, isDir) {
- this.log("next", m, exists, isDir)
- var ev = m === this.EOF ? "end" : "match"
-
- // "end" can only happen once.
- assert(!this._endEmitted)
- if (ev === "end")
- this._endEmitted = true
-
- if (exists) {
- // Doesn't mean it necessarily doesn't exist, it's possible
- // we just didn't check because we don't care that much, or
- // this is EOF anyway.
- if (isDir && !m.match(/\/$/)) {
- m = m + "/"
- } else if (!isDir && m.match(/\/$/)) {
- m = m.replace(/\/+$/, "")
+ if (this._processQueue.length) {
+ var pq = this._processQueue.slice(0)
+ this._processQueue.length = 0
+ for (var i = 0; i < pq.length; i ++) {
+ var p = pq[i]
+ this._processing--
+ this._process(p[0], p[1], p[2], p[3])
}
}
- this.log("emit", ev, m)
- this.emit(ev, m)
- this._processingEmitQueue = false
- if (done && m !== this.EOF && !this.paused)
- this._processEmitQueue()
}
}
-Glob.prototype._process = function (pattern, depth, index, cb_) {
+Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
assert(this instanceof Glob)
+ assert(typeof cb === 'function')
- var cb = function cb (er, res) {
- assert(this instanceof Glob)
- if (this.paused) {
- if (!this._processQueue) {
- this._processQueue = []
- this.once("resume", function () {
- var q = this._processQueue
- this._processQueue = null
- q.forEach(function (cb) { cb() })
- })
- }
- this._processQueue.push(cb_.bind(this, er, res))
- } else {
- cb_.call(this, er, res)
- }
- }.bind(this)
+ if (this.aborted)
+ return
- if (this.aborted) return cb()
+ this._processing++
+ if (this.paused) {
+ this._processQueue.push([pattern, index, inGlobStar, cb])
+ return
+ }
- if (depth > this.maxDepth) return cb()
+ //console.error("PROCESS %d", this._processing, pattern)
// Get the first [n] parts of pattern that are all strings.
var n = 0
@@ -395,28 +237,7 @@ Glob.prototype._process = function (pattern, depth, index, cb_) {
switch (n) {
// if not, then this is rather simple
case pattern.length:
- prefix = pattern.join("/")
- this._stat(prefix, function (exists, isDir) {
- // either it's there, or it isn't.
- // nothing more to do, either way.
- if (exists) {
- if (prefix && isAbsolute(prefix) && !this.nomount) {
- if (prefix.charAt(0) === "/") {
- prefix = path.join(this.root, prefix)
- } else {
- prefix = path.resolve(this.root, prefix)
- }
- }
-
- if (process.platform === "win32")
- prefix = prefix.replace(/\\/g, "/")
-
- this.matches[index] = this.matches[index] || {}
- this.matches[index][prefix] = true
- this.emitMatch(prefix)
- }
- return cb()
- })
+ this._processSimple(pattern.join('/'), index, cb)
return
case 0:
@@ -429,318 +250,399 @@ Glob.prototype._process = function (pattern, depth, index, cb_) {
// pattern has some string bits in the front.
// whatever it starts with, whether that's "absolute" like /foo/bar,
// or "relative" like "../baz"
- prefix = pattern.slice(0, n)
- prefix = prefix.join("/")
+ prefix = pattern.slice(0, n).join("/")
break
}
+ var remain = pattern.slice(n)
+
// get the list of entries.
var read
- if (prefix === null) read = "."
+ if (prefix === null)
+ read = "."
else if (isAbsolute(prefix) || isAbsolute(pattern.join("/"))) {
- if (!prefix || !isAbsolute(prefix)) {
+ if (!prefix || !isAbsolute(prefix))
prefix = "/" + prefix
- }
+ read = prefix
+ } else
read = prefix
- // if (process.platform === "win32")
- // read = prefix = prefix.replace(/^[a-zA-Z]:|\\/g, "/")
+ var abs = this._makeAbs(read)
- this.log('absolute: ', prefix, this.root, pattern, read)
- } else {
- read = prefix
- }
+ var isGlobStar = remain[0] === minimatch.GLOBSTAR
+ if (isGlobStar)
+ this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
+ else
+ this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
+}
- this.log('readdir(%j)', read, this.cwd, this.root)
- return this._readdir(read, function (er, entries) {
- if (er) {
- // not a directory!
- // this means that, whatever else comes after this, it can never match
- return cb()
+Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
+ var self = this
+ this._readdir(abs, inGlobStar, function (er, entries) {
+ return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
+ })
+}
+
+Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
+
+ // if the abs isn't a dir, then nothing can match!
+ if (!entries)
+ return cb()
+
+ // It will only match dot entries if it starts with a dot, or if
+ // dot is set. Stuff like @(.foo|.bar) isn't allowed.
+ var pn = remain[0]
+ var negate = !!this.minimatch.negate
+ var rawGlob = pn._glob
+ var dotOk = this.dot || rawGlob.charAt(0) === "."
+
+ var matchedEntries = []
+ for (var i = 0; i < entries.length; i++) {
+ var e = entries[i]
+ if (e.charAt(0) !== "." || dotOk) {
+ var m
+ if (negate && !prefix) {
+ m = !e.match(pn)
+ } else {
+ m = e.match(pn)
+ }
+ if (m)
+ matchedEntries.push(e)
}
+ }
- // globstar is special
- if (pattern[n] === minimatch.GLOBSTAR) {
- // test without the globstar, and with every child both below
- // and replacing the globstar.
- var s = [ pattern.slice(0, n).concat(pattern.slice(n + 1)) ]
- entries.forEach(function (e) {
- if (e.charAt(0) === "." && !this.dot) return
- // instead of the globstar
- s.push(pattern.slice(0, n).concat(e).concat(pattern.slice(n + 1)))
- // below the globstar
- s.push(pattern.slice(0, n).concat(e).concat(pattern.slice(n)))
- }, this)
-
- s = s.filter(function (pattern) {
- var key = gsKey(pattern)
- var seen = !this._globstars[key]
- this._globstars[key] = true
- return seen
- }, this)
-
- if (!s.length)
- return cb()
-
- // now asyncForEach over this
- var l = s.length
- , errState = null
- s.forEach(function (gsPattern) {
- this._process(gsPattern, depth + 1, index, function (er) {
- if (errState) return
- if (er) return cb(errState = er)
- if (--l <= 0) return cb()
- })
- }, this)
+ //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)
+
+ var len = matchedEntries.length
+ // If there are no matched entries, then nothing matches.
+ if (len === 0)
+ return cb()
+
+ // if this is the last remaining pattern bit, then no need for
+ // an additional stat *unless* the user has specified mark or
+ // stat explicitly. We know they exist, since readdir returned
+ // them.
+
+ if (remain.length === 1 && !this.mark && !this.stat) {
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null)
+
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i]
+ if (prefix) {
+ if (prefix !== "/")
+ e = prefix + "/" + e
+ else
+ e = prefix + e
+ }
- return
+ if (e.charAt(0) === "/" && !this.nomount) {
+ e = path.join(this.root, e)
+ }
+ this._emitMatch(index, e)
}
+ // This was the last one, and no stats were needed
+ return cb()
+ }
- // not a globstar
- // It will only match dot entries if it starts with a dot, or if
- // dot is set. Stuff like @(.foo|.bar) isn't allowed.
- var pn = pattern[n]
- var negate = !!this.minimatch.negate;
- var rawGlob = pattern[n]._glob
- , dotOk = this.dot || rawGlob.charAt(0) === "."
-
- entries = entries.filter(function (e) {
- if (e.charAt(0) !== "." || dotOk) {
- if (negate && n === 0) {
- return !e.match(pattern[n]);
- } else {
- return e.match(pattern[n]);
- }
- }
+ // now test all matched entries as stand-ins for that part
+ // of the pattern.
+ remain.shift()
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i]
+ var newPattern
+ if (prefix) {
+ if (prefix !== "/")
+ e = prefix + "/" + e
+ else
+ e = prefix + e
+ }
+ this._process([e].concat(remain), index, inGlobStar, cb)
+ }
+ cb()
+}
- return null;
- })
+Glob.prototype._emitMatch = function (index, e) {
+ if (this.aborted)
+ return
- // If n === pattern.length - 1, then there's no need for the extra stat
- // *unless* the user has specified "mark" or "stat" explicitly.
- // We know that they exist, since the readdir returned them.
- if (n === pattern.length - 1 &&
- !this.mark &&
- !this.stat) {
- entries.forEach(function (e) {
- if (prefix) {
- if (prefix !== "/") e = prefix + "/" + e
- else e = prefix + e
- }
- if (e.charAt(0) === "/" && !this.nomount) {
- e = path.join(this.root, e)
- }
-
- if (process.platform === "win32")
- e = e.replace(/\\/g, "/")
-
- this.matches[index] = this.matches[index] || {}
- this.matches[index][e] = true
- this.emitMatch(e)
- }, this)
- return cb.call(this)
+ if (!this.matches[index][e]) {
+ if (this.paused) {
+ this._emitQueue.push([index, e])
+ return
}
+ if (this.nodir) {
+ var c = this.cache[this._makeAbs(e)]
+ if (c === 'DIR' || Array.isArray(c))
+ return
+ }
- // now test all the remaining entries as stand-ins for that part
- // of the pattern.
- var l = entries.length
- , errState = null
- if (l === 0) return cb() // no matches possible
- entries.forEach(function (e) {
- var p = pattern.slice(0, n).concat(e).concat(pattern.slice(n + 1))
- this._process(p, depth + 1, index, function (er) {
- if (errState) return
- if (er) return cb(errState = er)
- if (--l === 0) return cb.call(this)
- })
- }, this)
- })
+ this.matches[index][e] = true
+ if (!this.stat && !this.mark)
+ return this.emit("match", e)
+ var self = this
+ this._stat(this._makeAbs(e), function (er, c, st) {
+ self.emit("stat", e, st)
+ self.emit("match", e)
+ })
+ }
}
-function gsKey (pattern) {
- return '**' + pattern.map(function (p) {
- return (p === minimatch.GLOBSTAR) ? '**' : (''+p)
- }).join('/')
-}
+Glob.prototype._readdirInGlobStar = function (abs, cb) {
+ if (this.aborted)
+ return
-Glob.prototype._stat = function (f, cb) {
- assert(this instanceof Glob)
- var abs = f
- if (f.charAt(0) === "/") {
- abs = path.join(this.root, f)
- } else if (this.changedCwd) {
- abs = path.resolve(this.cwd, f)
- }
+ var lstatkey = "lstat\0" + abs
+ var self = this
+ var lstatcb = inflight(lstatkey, lstatcb_)
- if (f.length > this.maxLength) {
- var er = new Error("Path name too long")
- er.code = "ENAMETOOLONG"
- er.path = f
- return this._afterStat(f, abs, cb, er)
- }
+ if (lstatcb)
+ fs.lstat(abs, lstatcb)
- this.log('stat', [this.cwd, f, '=', abs])
+ function lstatcb_ (er, lstat) {
+ if (er)
+ return cb()
- if (!this.stat && this.cache.hasOwnProperty(f)) {
- var exists = this.cache[f]
- , isDir = exists && (Array.isArray(exists) || exists === 2)
- if (this.sync) return cb.call(this, !!exists, isDir)
- return process.nextTick(cb.bind(this, !!exists, isDir))
- }
+ var isSym = lstat.isSymbolicLink()
+ self.symlinks[abs] = isSym
- var stat = this.statCache[abs]
- if (this.sync || stat) {
- var er
- try {
- stat = fs.statSync(abs)
- } catch (e) {
- er = e
- }
- this._afterStat(f, abs, cb, er, stat)
- } else {
- fs.stat(abs, this._afterStat.bind(this, f, abs, cb))
+ // If it's not a symlink or a dir, then it's definitely a regular file.
+ // don't bother doing a readdir in that case.
+ if (!isSym && !lstat.isDirectory()) {
+ self.cache[abs] = 'FILE'
+ cb()
+ } else
+ self._readdir(abs, false, cb)
}
}
-Glob.prototype._afterStat = function (f, abs, cb, er, stat) {
- var exists
- assert(this instanceof Glob)
+Glob.prototype._readdir = function (abs, inGlobStar, cb) {
+ if (this.aborted)
+ return
- if (abs.slice(-1) === "/" && stat && !stat.isDirectory()) {
- this.log("should be ENOTDIR, fake it")
+ cb = inflight("readdir\0"+abs+"\0"+inGlobStar, cb)
+ if (!cb)
+ return
- er = new Error("ENOTDIR, not a directory '" + abs + "'")
- er.path = abs
- er.code = "ENOTDIR"
- stat = null
- }
+ //console.error("RD %j %j", +inGlobStar, abs)
+ if (inGlobStar && !ownProp(this.symlinks, abs))
+ return this._readdirInGlobStar(abs, cb)
- var emit = !this.statCache[abs]
- this.statCache[abs] = stat
+ if (ownProp(this.cache, abs)) {
+ var c = this.cache[abs]
+ if (!c || c === 'FILE')
+ return cb()
- if (er || !stat) {
- exists = false
- } else {
- exists = stat.isDirectory() ? 2 : 1
- if (emit)
- this.emit('stat', f, stat)
+ if (Array.isArray(c))
+ return cb(null, c)
}
- this.cache[f] = this.cache[f] || exists
- cb.call(this, !!exists, exists === 2)
-}
-Glob.prototype._readdir = function (f, cb) {
- assert(this instanceof Glob)
- var abs = f
- if (f.charAt(0) === "/") {
- abs = path.join(this.root, f)
- } else if (isAbsolute(f)) {
- abs = f
- } else if (this.changedCwd) {
- abs = path.resolve(this.cwd, f)
- }
+ var self = this
+ fs.readdir(abs, readdirCb(this, abs, cb))
+}
- if (f.length > this.maxLength) {
- var er = new Error("Path name too long")
- er.code = "ENAMETOOLONG"
- er.path = f
- return this._afterReaddir(f, abs, cb, er)
+function readdirCb (self, abs, cb) {
+ return function (er, entries) {
+ if (er)
+ self._readdirError(abs, er, cb)
+ else
+ self._readdirEntries(abs, entries.sort(alphasort), cb)
}
+}
- this.log('readdir', [this.cwd, f, abs])
- if (this.cache.hasOwnProperty(f)) {
- var c = this.cache[f]
- if (Array.isArray(c)) {
- if (this.sync) return cb.call(this, null, c)
- return process.nextTick(cb.bind(this, null, c))
- }
-
- if (!c || c === 1) {
- // either ENOENT or ENOTDIR
- var code = c ? "ENOTDIR" : "ENOENT"
- , er = new Error((c ? "Not a directory" : "Not found") + ": " + f)
- er.path = f
- er.code = code
- this.log(f, er)
- if (this.sync) return cb.call(this, er)
- return process.nextTick(cb.bind(this, er))
- }
-
- // at this point, c === 2, meaning it's a dir, but we haven't
- // had to read it yet, or c === true, meaning it's *something*
- // but we don't have any idea what. Need to read it, either way.
- }
+Glob.prototype._readdirEntries = function (abs, entries, cb) {
+ if (this.aborted)
+ return
- if (this.sync) {
- var er, entries
- try {
- entries = fs.readdirSync(abs)
- } catch (e) {
- er = e
+ // if we haven't asked to stat everything, then just
+ // assume that everything in there exists, so we can avoid
+ // having to stat it a second time.
+ if (!this.mark && !this.stat) {
+ for (var i = 0; i < entries.length; i ++) {
+ var e = entries[i]
+ if (abs === "/")
+ e = abs + e
+ else
+ e = abs + "/" + e
+ this.cache[e] = true
}
- return this._afterReaddir(f, abs, cb, er, entries)
}
- fs.readdir(abs, this._afterReaddir.bind(this, f, abs, cb))
+ this.cache[abs] = entries
+ return cb(null, entries)
}
-Glob.prototype._afterReaddir = function (f, abs, cb, er, entries) {
- assert(this instanceof Glob)
- if (entries && !er) {
- this.cache[f] = entries
- // if we haven't asked to stat everything for suresies, then just
- // assume that everything in there exists, so we can avoid
- // having to stat it a second time. This also gets us one step
- // further into ELOOP territory.
- if (!this.mark && !this.stat) {
- entries.forEach(function (e) {
- if (f === "/") e = f + e
- else e = f + "/" + e
- this.cache[e] = true
- }, this)
- }
-
- return cb.call(this, er, entries)
- }
+Glob.prototype._readdirError = function (f, er, cb) {
+ if (this.aborted)
+ return
- // now handle errors, and cache the information
- if (er) switch (er.code) {
+ // handle errors, and cache the information
+ switch (er.code) {
case "ENOTDIR": // totally normal. means it *does* exist.
- this.cache[f] = 1
- return cb.call(this, er)
+ this.cache[f] = 'FILE'
+ break
+
case "ENOENT": // not terribly unusual
case "ELOOP":
case "ENAMETOOLONG":
case "UNKNOWN":
this.cache[f] = false
- return cb.call(this, er)
+ break
+
default: // some unusual error. Treat as failure.
this.cache[f] = false
- if (this.strict) this.emit("error", er)
+ if (this.strict) return this.emit("error", er)
if (!this.silent) console.error("glob error", er)
- return cb.call(this, er)
+ break
}
+ return cb()
}
-var isAbsolute = process.platform === "win32" ? absWin : absUnix
+Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
+ var self = this
+ this._readdir(abs, inGlobStar, function (er, entries) {
+ self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
+ })
+}
+
+
+Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
+ //console.error("pgs2", prefix, remain[0], entries)
+
+ // no entries means not a dir, so it can never have matches
+ // foo.txt/** doesn't match foo.txt
+ if (!entries)
+ return cb()
+
+ // test without the globstar, and with every child both below
+ // and replacing the globstar.
+ var remainWithoutGlobStar = remain.slice(1)
+ var gspref = prefix ? [ prefix ] : []
+ var noGlobStar = gspref.concat(remainWithoutGlobStar)
+
+ // the noGlobStar pattern exits the inGlobStar state
+ this._process(noGlobStar, index, false, cb)
-function absWin (p) {
- if (absUnix(p)) return true
- // pull off the device/UNC bit from a windows path.
- // from node's lib/path.js
- var splitDeviceRe =
- /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/
- , result = splitDeviceRe.exec(p)
- , device = result[1] || ''
- , isUnc = device && device.charAt(1) !== ':'
- , isAbsolute = !!result[2] || isUnc // UNC paths are always absolute
+ var isSym = this.symlinks[abs]
+ var len = entries.length
- return isAbsolute
+ // If it's a symlink, and we're in a globstar, then stop
+ if (isSym && inGlobStar)
+ return cb()
+
+ for (var i = 0; i < len; i++) {
+ var e = entries[i]
+ if (e.charAt(0) === "." && !this.dot)
+ continue
+
+ // these two cases enter the inGlobStar state
+ var instead = gspref.concat(entries[i], remainWithoutGlobStar)
+ this._process(instead, index, true, cb)
+
+ var below = gspref.concat(entries[i], remain)
+ this._process(below, index, true, cb)
+ }
+
+ cb()
}
-function absUnix (p) {
- return p.charAt(0) === "/" || p === ""
+Glob.prototype._processSimple = function (prefix, index, cb) {
+ // XXX review this. Shouldn't it be doing the mounting etc
+ // before doing stat? kinda weird?
+ var self = this
+ this._stat(prefix, function (er, exists) {
+ self._processSimple2(prefix, index, er, exists, cb)
+ })
+}
+Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {
+
+ //console.error("ps2", prefix, exists)
+
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null)
+
+ // If it doesn't exist, then just mark the lack of results
+ if (!exists)
+ return cb()
+
+ if (prefix && isAbsolute(prefix) && !this.nomount) {
+ var trail = /[\/\\]$/.test(prefix)
+ if (prefix.charAt(0) === "/") {
+ prefix = path.join(this.root, prefix)
+ } else {
+ prefix = path.resolve(this.root, prefix)
+ if (trail)
+ prefix += '/'
+ }
+ }
+
+ if (process.platform === "win32")
+ prefix = prefix.replace(/\\/g, "/")
+
+ // Mark this as a match
+ this._emitMatch(index, prefix)
+ cb()
+}
+
+// Returns either 'DIR', 'FILE', or false
+Glob.prototype._stat = function (f, cb) {
+ var abs = f
+ if (f.charAt(0) === "/")
+ abs = path.join(this.root, f)
+ else if (this.changedCwd)
+ abs = path.resolve(this.cwd, f)
+
+
+ if (f.length > this.maxLength)
+ return cb()
+
+ if (!this.stat && ownProp(this.cache, f)) {
+ var c = this.cache[f]
+
+ if (Array.isArray(c))
+ c = 'DIR'
+
+ // It exists, but not how we need it
+ if (abs.slice(-1) === "/" && c !== 'DIR')
+ return cb()
+
+ return cb(null, c)
+ }
+
+ var exists
+ var stat = this.statCache[abs]
+ if (stat !== undefined) {
+ if (stat === false)
+ return cb(null, stat)
+ else
+ return cb(null, stat.isDirectory() ? 'DIR' : 'FILE', stat)
+ }
+
+ var self = this
+ var statcb = inflight("stat\0" + abs, statcb_)
+ if (statcb)
+ fs.stat(abs, statcb)
+
+ function statcb_ (er, stat) {
+ self._stat2(f, abs, er, stat, cb)
+ }
+}
+
+Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
+ if (er) {
+ this.statCache[abs] = false
+ return cb()
+ }
+
+ this.statCache[abs] = stat
+
+ if (abs.slice(-1) === "/" && !stat.isDirectory())
+ return cb(null, false, stat)
+
+ var c = stat.isDirectory() ? 'DIR' : 'FILE'
+ this.cache[f] = this.cache[f] || c
+ return cb(null, c, stat)
}
diff --git a/deps/npm/node_modules/glob/oh-my-glob.gif b/deps/npm/node_modules/glob/oh-my-glob.gif
deleted file mode 100644
index a1568c13ca695563f97e3910e34f1a47d5657f4e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 510360
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