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 a2561247569..6ca184d6726 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 9cf2cc4131f..07aafe2c725 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 6dfc4a0e5cc..77fb38f396c 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 3f3ae544e99..98071c601aa 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 3767a46aca5..f72789eef1e 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 a235c2baa96..76381b99ee6 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 222b90e70a8..08a9a712a37 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 aa3d7bdb0ba..ab9a7ede339 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 fbfd0cccc2d..0c76406555a 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 886d0c5acbe..c1c4bb1b3ab 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 80b14a41df3..52fe45e073a 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 43cf4f166ff..f0019130973 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 c41a31c9b4b..ffc909cbb25 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 fbf22994f6d..8a442887bb9 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 e221bab4a0f..c74f8d5a63a 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 7f6e3a5c0dd..e47afcd0c29 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 7758efa7264..e32ec4a77b7 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 ca62cb24651..c1ae15ec43f 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 9b833d0b6dd..ea7506aa4df 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 53835b35db3..226cbf35552 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 5a678ba352f..fb5adbe0d97 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 d97845e708a..de2252bd695 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 bf6c9974ea4..01284bc664f 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 8182c6ecf1b..8f0b86a1713 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 e9f2c9e732e..ed0a3002fe0 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 24a70fe7fc1..1b15510be86 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 eeb49064486..edbe173994f 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 2cf7506f03f..34e4061bed3 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 12c6c0e8fd2..9f4f3bba5a1 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 e7640ea46c6..acdd967d587 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 3759f011559..33897998b58 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 8d085892df2..72be63d7f3b 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 30419bdb0d6..ae44c1314c4 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 07a0a933d76..f62276ed84f 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 3600e087f15..adc0af02bd7 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 987ba3f792b..af2fe5c85d6 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 7b6a3c58a51..b6a8783fd99 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 dea291b4909..6610508e176 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 e1b46d21d0b..9044ed38f0a 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 4da97a70518..2b3d7586198 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 02335b4f4a1..631781c47bf 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 d7536f81fdf..ea0b1bd5db7 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 3b28aaad4d3..772a3dc8c78 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 f6b8b22dfcb..37b62915856 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 8ca2ea2a5ed..ec7df7489d1 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 f5fe720baa1..ff015526e6c 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 fbfaa6c3dc0..67dcc293873 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 d3bbde5b9d6..4608b23de54 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 7873880f415..dcc8478a7d0 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 0a3134bc82e..627463ba455 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 01638ee4daf..527581be741 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 4ac55a88525..6716c4a11cc 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 946d5fa767c..836fb63532a 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 6c5467de51f..48e7ae8d6db 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 2a3c12c148d..9771b9c505e 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 59b278e23da..293e2057a86 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 5fa7846f534..98461473550 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 6477726f495..825baab43c2 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 3b87ba0be20..69c1d06b9c8 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 a2705c40c3a..9d71b8e0f1d 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 3bd3849d2ad..e3077b3fe88 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 ec320399971..392d9c1e384 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 90e5dcaf1dc..456fd89b8c0 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 ade4fd07ec4..e77270d6049 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 9f379006f09..5600e243801 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 183ad8ea5d6..4360a1488bf 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 6c68895e073..88e64e90791 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 30d3e07cfab..a5f04aff72c 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 249d5934c9e..5f68b867860 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 b4190a1a2b1..18d1020e150 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 f59921e2e95..00a0e2a650f 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 08c8eafce24..6caf41929f6 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 1ca7d758628..60a8845a776 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 d746316f581..9c82de7168e 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 9fed0bbf110..3b81cf00ce4 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 b2a3dbd383d..4f0d466efd3 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 3028625d1bf..e8f05b097f1 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 eeea8fbc40f..3b1556041e5 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 13ff98d2c37..823c8a0b5e0 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 508003ca158..850955b8361 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 35db404d785..f0de7504a5b 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 2eae8ba0f59..98bd41f6b24 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 dbd481b380a..dd5276a751e 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 ac9fa0086ca..ce2c5dcce6f 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 3c832399ddb..c4b01c2a65e 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 199b6002b89..3a5cae1b492 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 267e570eca8..2186473373c 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 5217f019635..0cc3a21ad42 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 646fffcb378..94ab5a64514 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 df3bea83742..1e297ad77ad 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 ac386ca85e2..988920a4896 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 df3bea83742..1e297ad77ad 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 f6678d93715..6af3f79bd9a 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 732b326c997..b50b95f27f7 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 87409720b9f..d9b9dfdbe02 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 7ba880a44bc..10d0cd89198 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 6a7abca7122..7e6983ceb21 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 7fc16344f79..f42abe71591 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 6e4c0ca8004..3800cea9381 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 0031f61b10c..2a7c1601458 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 08bcbd54a5b..1e68be479be 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 691a277dc78..b078197e806 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 9693aebd389..6c8a652bea3 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 16744cd5c84..fabbbaf10e5 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 2e01ef6eeaa..7477ba45791 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 e1afb0d1578..357063551d4 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 b425d7f9118..e7d286e4fb5 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 1bd7af14486..cb5a3fa8a66 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))
- }
+ 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(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)
+ // 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))
- }
- return addRemoteTarball(tb, data, dist.shasum, cb)
+ // 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 d8f3f1cd88f..1ad925eec35 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)
+ var normalized = normalizeGitUrl(u)
+ log.silly("addRemoteGit", "normalized", normalized)
- // 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(/#.*$/, "")
+ 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)
- // ssh paths that are scp-style urls don't need the ssh://
- if (parsed.pathname.match(/^\/?:/)) {
- u = u.replace(/^ssh:\/\//, "")
- }
+ 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")
- 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
-
- log.verbose("addRemoteGit", [u, co])
-
- var p = path.join(npm.config.get("cache"), "_git-remotes", v)
-
- // 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()
+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)
- var resolved = null
- var tmp
-
- 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()
- })
- })
- }
- })
- function resolveHead () {
- git.whichAndExec(resolve, {cwd: p, env: env}, function (er, stdout, stderr) {
+ 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 (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()
- })
- }
+ cache(p, u, stdout, resolved, cb)
+ }
+ )
+}
- 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")
- })
+/**
+ * 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)
- cp.stdout.pipe(gzip).pipe(out).on("close", function() {
- addLocalTarball(tmp, null, null, function(er, data) {
- if (data) data._resolved = resolved
- cb(er, data)
- })
- })
- })
- }
+ 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 9591ba89d23..e87ac54bb1b 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 00000000000..d81e6f53d62
--- /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 00000000000..2955f6a1488
--- /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 7bd672114de..febd1049ed1 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 3b26a56c65f..07c817500f6 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 74397d0cb95..6a4abd73077 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 17dd4eab0c1..c90ad902723 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 dead3f7551c..9abe740a3c7 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 ."
-docs.completion = function (opts, 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")
, 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, auth) {
+ if (er) return cb(er)
+
+ npm.registry.get(uri, { timeout : 60000, auth : auth }, function (er, list) {
+ return cb(null, list || [])
+ })
+ })
+}
+
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 e87e839354b..96475a0691f 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 747bd5020da..07d92194969 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 925654beef7..401e700af3c 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 e539307aff3..756d12ee362 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 ed329d19e1b..eee4f2772e0 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 e933a1346cc..d03ec47b6bb 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 fdfd7624db2..fe25a8e910c 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 2fdee7adb69..7b34508337e 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 2a0fcff5a5c..f179bd42220 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
+ }
- registry.publish(registryBase, data, tarball, function (er) {
- if (er && er.code === "EPUBLISHCONFLICT"
- && npm.config.get("force") && !isRetry) {
+ var params = {
+ metadata : data,
+ body : createReadStream(tarballPath),
+ auth : auth
+ }
+
+ 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 c6db8e37b01..3db4a16bc9d 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 4495b93c48e..fd26a0c43b0 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 5dd060f829c..ad3f312e546 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 123c4ebbb44..d2e69deb94f 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 dee5c152afa..087e8d9bf20 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 47e9a8c0ac7..bc7ec918796 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 8bd6e8507f3..df57c5b3463 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 2566cd5ae62..da03b0dcc86 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 5201a15ff64..6ce2f83467d 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 95b78a8ccbe..12c6dd407b9 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 d43d0725ebb..587ad0eb1bd 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,54 +113,54 @@ 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(er)
- }
-
- cacheAndTest(resolve(path, source), path, target, cb)
- })
+ return cb(null, inside && path)
})
}
- 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 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)
+ }
+
+ // 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)
+ })
+ })
}
}
diff --git a/deps/npm/lib/utils/git.js b/deps/npm/lib/utils/git.js
index db5cc7baf07..78cb083eefa 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 c0eb83dfb1d..ccee7563087 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 cf665e4f656..bd68a26d42e 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 00000000000..953671857d0
--- /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 ede49a121ed..7656b5d9754 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 a15e2c391c8..930708676ed 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}
+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")
- // 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)
+ 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()
- }
+ // 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)
+ }
- , git.chainableExec([ "tag", "v" + data.version, flag, message ]
- , {env: process.env}) ]
- , cb )
- })
+ 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 6b45cca2ec0..bd20ab5a3f0 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 b33f93743d2..121c4336aea 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 a7cf1046f0c..4f274c5c913 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 6b85986e02e..b3abf17b68a 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 6552d6cf4d5..8f0dc2ba57f 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 09c7659c600..5acca82e2de 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 0f2184292a7..1179298c5fe 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 0748922dae2..703c795c9b8 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 c49015ae6e7..1cf1d7c7176 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 a89cc6fd5ff..4cb06491007 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 a93ebace724..716303c41b4 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 24548077e30..743a5d027d6 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 581a58948f3..95a8fd2515f 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 1e9e5c19901..1feecc263c4 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 8a19d125788..1d905d06b99 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 0211aef43e9..5f29171a9e4 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 a18a8e97a68..524081c9301 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 556eeb52ee8..0d7f1af03cf 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 3d4ed0957f5..d2b6a298d50 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 0df0197b0c5..ec355effeb6 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 62d76503f6a..86132ed1dd0 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 9cf4823c9a6..bcf9a52d15f 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 45433a814e2..a1086ad3222 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 3ed5549f71c..1c503795c6b 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 8b9408abb27..3b39d6847a4 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 b7bcac63956..2ebdaa6777f 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 1a8cc952156..7b22233d5d5 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 66572102864..0df825154b8 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 0e04b9cfbe1..1bb1e9acb3a 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 dc8428d0242..da8d6c9ad35 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 234d0aa76e9..010e8153007 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 c7f92fb52bf..94a0afa733f 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 f85ebb97085..2067f9e55d2 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 905908a7a10..65ea4ea94e1 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 4ad5a67b8c9..3f7d19bd8f1 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 fa2b313ab2b..5fa9fb16eef 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 8dbc0292ae7..ced42ecaed7 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 1762a0f08bd..d2124355c47 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 0a342ee1f1d..36f0c26bc58 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 8622d18d964..0a20b4b6d4b 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 4999ac64e91..71853335c59 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 5aace75083f..70eb323463c 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 0b4a9f4dbb3..b398e81eaf0 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 a56f8bb9187..5568b48371e 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 6cb1df7263c..7f96d4f3676 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 19adfc92765..61e1ccebac1 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 21fde3452fa..2ae02d09374 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 35ef045329e..2a279d2a799 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 34a3f04ac35..b993e0c9b53 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 a275e4728d5..aed41f88feb 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 4c76b8a0cdb..27588a2407e 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 cd8dda6ea5e..6b7503fefd1 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 1dccd8fd0c1..15a2839cce5 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 87ad3253b12..ee757dfce76 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 763e2252548..be2522cb49c 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 9b543d36d5a..d04e25d43f8 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 ad93e305bd5..4dd5a84f7e2 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 82767c8b7e1..d7c2ad4f1de 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 54948eadc17..8648eac98e3 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 8f4f346c260..a9baaf36d9e 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 d5da00dd8f6..9a2ce6bc82e 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 ec98278cad9..511791791d1 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 0c379a48c59..2d5bf77c3c1 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 61fac42ebd1..68787c89b19 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 84558abeb3a..de3d127df64 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 2bba8469fc5..9e96d44ab3f 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 101b752e9f7..35a993ba8b3 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 d9da93e33c2..7d95e575137 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 e2da6d67eda..4aaed71a734 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 48a06c97c7a..310dfe292e0 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 13dbd95f33b..28f77205c54 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 21a5aba1deb..082589b5de8 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 5638d434aec..64cc0bad698 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 be948334aa1..2cacefc5b18 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 68bac79fa03..15d5230d170 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 866f1e01f3f..59bf90d965a 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 ba0cc5f4c3b..4fffa3bd960 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 0f87c50906c..92ce7b1b2fe 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 4eabb36c444..f3330a5885e 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 aa55b84736b..551eedbc12c 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 378862a563a..95739ce3b08 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 4da13767f93..a2daa3134f7 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 f6d0f6d3f11..ff969ec023d 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 8505f399559..0cf637ca2c9 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 9b4ab467d2f..48f865db19b 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 3f40eb0db2d..eee573b2d88 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 16979247fe4..2cf7fe21534 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 e49f28d7edc..42bbf40c508 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 2d32507f513..cb320ec46ab 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 71bbc58ad09..6298c8d5e63 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 9cd3436f894..2ae88d142af 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 9cd3436f894..2ae88d142af 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 fa9ef95c4ba..cf306294e91 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 d2846869abf..fc2986b901d 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 fa9ef95c4ba..cf306294e91 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 0dc15318ab4..ebaf0386c23 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 e3b4c5c6f63..d561e074732 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 bf8edb29f23..ba47e45fabb 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 9cf7009f620..3d67933982c 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 563509a8728..cf6a37cfdde 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 442815a2e52..056c96bc635 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 9de209d468f..f89b94507e7 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 f876e4eaaa6..2cae9e88c7b 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 9d11f4626cb..69d880d34f1 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 b0a4fca5d7c..73963fe3b37 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 a6be932b474..bf239f7e621 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 00000000000..ec035f397c4
--- /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 00000000000..0d2cdd7c486
--- /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 00000000000..8e8f30796bd
--- /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 00000000000..d97b8bfa330
--- /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 00000000000..6a480738743
--- /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 00000000000..1626454b233
--- /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 00000000000..d03c07868ef
--- /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 00000000000..d3cc65c641b
--- /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 00000000000..a0e698f00fe
--- /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 00000000000..9333ec64e11
--- /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 00000000000..59ddf6f2804
--- /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 00000000000..37c00a46d9d
--- /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 00000000000..6877bde02cc
--- /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 00000000000..588f44d6821
--- /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 c44b8ca8fa9..8c15c993eaf 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 602ae00e8fc..5b9546aabf8 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 783c5c7bb69..2fcdd1e472f 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 ca610250c9e..ab8ea0388fc 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 64c4dee52c4..89d1041bd7a 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 527743b601f..d7231cfca7d 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 5d402073b36..321ffa30f5e 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 3c6b7764709..dc56f3f191f 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 ee49ad893aa..cb3d16631ab 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 f9243a12005..e3ee6219190 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 f12d49b789e..4744d9dc3f7 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 ef307b50925..c60e1d9de6b 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 140536797f8..559b7bf2bd3 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 f706a4be68c..e55abe9701b 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 29e508673a5..161b82564bc 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 e7de77086af..6b2ccc99d27 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 c6b55b3e02a..983649bb9d5 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 648ec849388..0bad122f9bd 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 9aa1a9538d6..3787ae376ff 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 b1f9861838a..4720cd86a4a 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 d0ac58243ad..f920c10036b 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 c34fdd597ee..00000000000
--- 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 82b7ef6d61d..d72bdccbe0e 100644
--- a/deps/npm/node_modules/glob/README.md
+++ b/deps/npm/node_modules/glob/README.md
@@ -1,3 +1,5 @@
+[](https://travis-ci.org/isaacs/node-glob/) [](https://david-dm.org/isaacs/node-glob) [](https://david-dm.org/isaacs/node-glob#info=devDependencies) [](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
-Please see the [minimatch
-documentation](https://github.com/isaacs/minimatch) for more details.
+"Globs" are the patterns you type when you do stuff like `ls *.js` on
+the command line, or put `build/*` in a `.gitignore` file.
-Supports these glob features:
+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`.
-* Brace Expansion
-* Extended glob matching
-* "Globstar" `**` matching
+The following characters have special magic meaning when used in a
+path portion:
-See:
+* `*` 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
+
+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:
+
+ $ echo a*s*d*f
+ a*s*d*f
+
+To get the bash-style behavior, set the `nonull:true` in the options.
+
+### 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 00000000000..610d1245b4d
--- /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 be122df0023..00000000000
--- 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 327a425e47b..00000000000
--- 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 564f3b1217c..8c990782189 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
-}
-
-glob.fnmatch = deprecated
-
-function deprecated () {
- throw new Error("glob's interface has changed. Please see the docs.")
+ return new Glob(pattern, options, cb)
}
glob.sync = globSync
-function globSync (pattern, options) {
- if (typeof options === "number") {
- deprecated()
- return
+var GlobSync = glob.GlobSync = globSync.GlobSync
+
+// old api surface
+glob.glob = glob
+
+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)
- })
+ if (options && options.sync) {
+ if (cb)
+ throw new TypeError('callback provided to sync glob')
+ return new GlobSync(pattern, options)
}
- options = options || {}
+ if (!(this instanceof Glob))
+ return new Glob(pattern, options, cb)
- 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
- }
-
- 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 = {}
-
- 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)
+
+ this._emitQueue = []
+ this._processQueue = []
+ this.paused = false
+
+ if (this.noprocess)
+ return this
+
+ if (n === 0)
+ return done()
+
+ for (var i = 0; i < n; i ++) {
+ this._process(this.minimatch.set[i], i, false, done)
+ }
+
+ function done () {
+ --self._processing
+ if (self._processing <= 0)
+ self._finish()
+ }
+}
Glob.prototype._finish = function () {
assert(this instanceof Glob)
+ if (this.aborted)
+ return
- 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 (!nou) all = Object.keys(all)
-
- if (!this.nosort) {
- all = all.sort(this.nocase ? alphasorti : alphasort)
- }
-
- if (this.mark) {
- // at *some* point we statted all of these
- all = all.map(this._mark, this)
- }
-
- 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)
-}
-
-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) === '/'
+ return common.mark(this, p)
+}
- 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 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)
- }
- }
- 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.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])
+ }
+ }
+ 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
+
+ var abs = this._makeAbs(read)
+
+ 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)
+}
+
+
+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)
}
- read = prefix
-
- // if (process.platform === "win32")
- // read = prefix = prefix.replace(/^[a-zA-Z]:|\\/g, "/")
-
- this.log('absolute: ', prefix, this.root, pattern, read)
- } else {
- read = prefix
}
- this.log('readdir(%j)', read, this.cwd, this.root)
+ //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)
- 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()
+ 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
+ }
+
+ 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()
+ }
- // 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)
+ // 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()
+}
- 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)
+Glob.prototype._emitMatch = function (index, e) {
+ if (this.aborted)
+ return
+ if (!this.matches[index][e]) {
+ if (this.paused) {
+ this._emitQueue.push([index, e])
return
}
- // 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) === "."
+ if (this.nodir) {
+ var c = this.cache[this._makeAbs(e)]
+ if (c === 'DIR' || Array.isArray(c))
+ return
+ }
- 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]);
- }
- }
+ this.matches[index][e] = true
+ if (!this.stat && !this.mark)
+ return this.emit("match", e)
- return null;
+ var self = this
+ this._stat(this._makeAbs(e), function (er, c, st) {
+ self.emit("stat", e, st)
+ self.emit("match", e)
})
-
- // 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)
- }
-
-
- // 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)
- })
-
-}
-
-function gsKey (pattern) {
- return '**' + pattern.map(function (p) {
- return (p === minimatch.GLOBSTAR) ? '**' : (''+p)
- }).join('/')
-}
-
-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)
- }
-
- 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)
- }
-
- this.log('stat', [this.cwd, f, '=', abs])
-
- 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 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))
}
}
-Glob.prototype._afterStat = function (f, abs, cb, er, stat) {
- var exists
- assert(this instanceof Glob)
+Glob.prototype._readdirInGlobStar = function (abs, cb) {
+ if (this.aborted)
+ return
- if (abs.slice(-1) === "/" && stat && !stat.isDirectory()) {
- this.log("should be ENOTDIR, fake it")
+ var lstatkey = "lstat\0" + abs
+ var self = this
+ var lstatcb = inflight(lstatkey, lstatcb_)
- er = new Error("ENOTDIR, not a directory '" + abs + "'")
- er.path = abs
- er.code = "ENOTDIR"
- stat = null
+ if (lstatcb)
+ fs.lstat(abs, lstatcb)
+
+ function lstatcb_ (er, lstat) {
+ if (er)
+ return cb()
+
+ var isSym = lstat.isSymbolicLink()
+ self.symlinks[abs] = isSym
+
+ // 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)
}
-
- var emit = !this.statCache[abs]
- this.statCache[abs] = stat
-
- if (er || !stat) {
- exists = false
- } else {
- exists = stat.isDirectory() ? 2 : 1
- if (emit)
- this.emit('stat', f, stat)
- }
- 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)
+Glob.prototype._readdir = function (abs, inGlobStar, cb) {
+ if (this.aborted)
+ return
+
+ cb = inflight("readdir\0"+abs+"\0"+inGlobStar, cb)
+ if (!cb)
+ return
+
+ //console.error("RD %j %j", +inGlobStar, abs)
+ if (inGlobStar && !ownProp(this.symlinks, abs))
+ return this._readdirInGlobStar(abs, cb)
+
+ if (ownProp(this.cache, abs)) {
+ var c = this.cache[abs]
+ if (!c || c === 'FILE')
+ return cb()
+
+ if (Array.isArray(c))
+ return cb(null, c)
}
- 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)
- }
-
- 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.
- }
-
- if (this.sync) {
- var er, entries
- try {
- entries = fs.readdirSync(abs)
- } catch (e) {
- er = e
- }
- return this._afterReaddir(f, abs, cb, er, entries)
- }
-
- fs.readdir(abs, this._afterReaddir.bind(this, f, abs, cb))
+ var self = this
+ fs.readdir(abs, readdirCb(this, abs, cb))
}
-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)
- }
+function readdirCb (self, abs, cb) {
+ return function (er, entries) {
+ if (er)
+ self._readdirError(abs, er, cb)
+ else
+ self._readdirEntries(abs, entries.sort(alphasort), cb)
+ }
+}
- return cb.call(this, er, entries)
+Glob.prototype._readdirEntries = function (abs, entries, cb) {
+ if (this.aborted)
+ return
+
+ // 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
+ }
}
- // now handle errors, and cache the information
- if (er) switch (er.code) {
+ this.cache[abs] = entries
+ return cb(null, entries)
+}
+
+Glob.prototype._readdirError = function (f, er, cb) {
+ if (this.aborted)
+ return
+
+ // 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()
+}
+
+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)
+
+ var isSym = this.symlinks[abs]
+ var len = entries.length
+
+ // 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()
+}
+
+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)
}
}
-var isAbsolute = process.platform === "win32" ? absWin : absUnix
+Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
+ if (er) {
+ this.statCache[abs] = false
+ return 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
+ this.statCache[abs] = stat
- return isAbsolute
-}
-
-function absUnix (p) {
- return p.charAt(0) === "/" || p === ""
+ 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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