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 a256124..6ca184d 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 9cf2cc4..07aafe2 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 6dfc4a0..77fb38f 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 3f3ae54..98071c6 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 3767a46..f72789e 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 a235c2b..76381b9 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 222b90e..08a9a71 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 aa3d7bd..ab9a7ed 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 fbfd0cc..0c76406 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 886d0c5..c1c4bb1 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 80b14a4..52fe45e 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 43cf4f1..f001913 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 c41a31c..ffc909c 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 fbf2299..8a44288 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 e221bab..c74f8d5 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 7f6e3a5..e47afcd 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 7758efa..e32ec4a 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 ca62cb2..c1ae15e 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 9b833d0..ea7506a 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 53835b3..226cbf3 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 5a678ba..fb5adbe 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 d97845e..de2252b 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 bf6c997..01284bc 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 8182c6e..8f0b86a 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 e9f2c9e..ed0a300 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 24a70fe..1b15510 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 eeb4906..edbe173 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 2cf7506..34e4061 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 12c6c0e..9f4f3bb 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 e7640ea..acdd967 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 3759f01..3389799 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 8d08589..72be63d 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 30419bd..ae44c13 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 07a0a93..f62276e 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 3600e08..adc0af0 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 987ba3f..af2fe5c 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 7b6a3c5..b6a8783 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 dea291b..6610508 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 e1b46d2..9044ed3 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 4da97a7..2b3d758 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 02335b4..631781c 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 d7536f8..ea0b1bd 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 3b28aaa..772a3dc 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 f6b8b22..37b6291 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 8ca2ea2..ec7df74 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 f5fe720..ff01552 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 fbfaa6c..67dcc29 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 d3bbde5..4608b23 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 7873880..dcc8478 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 0a3134b..627463b 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 01638ee..527581b 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 4ac55a8..6716c4a 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 946d5fa..836fb63 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 6c5467d..48e7ae8 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 2a3c12c..9771b9c 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 59b278e..293e205 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 5fa7846..9846147 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 6477726..825baab 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 3b87ba0..69c1d06 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 a2705c4..9d71b8e 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 3bd3849..e3077b3 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 ec32039..392d9c1 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 90e5dca..456fd89 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 ade4fd0..e77270d 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 9f37900..5600e24 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 183ad8e..4360a14 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 6c68895..88e64e9 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 30d3e07..a5f04af 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 249d593..5f68b86 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 b4190a1..18d1020 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 f59921e..00a0e2a 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 08c8eaf..6caf419 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 1ca7d75..60a8845 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 d746316..9c82de7 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 9fed0bb..3b81cf0 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 b2a3dbd..4f0d466 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 3028625..e8f05b0 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 eeea8fb..3b15560 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 13ff98d..823c8a0 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 508003c..850955b 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 35db404..f0de750 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 2eae8ba..98bd41f 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 dbd481b..dd5276a 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 ac9fa00..ce2c5dc 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 3c83239..c4b01c2 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 199b600..3a5cae1 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 267e570..2186473 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 5217f01..0cc3a21 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 646fffc..94ab5a6 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 df3bea8..1e297ad 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 ac386ca..988920a 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 df3bea8..1e297ad 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 f6678d9..6af3f79 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 732b326..b50b95f 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 8740972..d9b9dfd 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 7ba880a..10d0cd8 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 6a7abca..7e6983c 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 7fc1634..f42abe7 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 6e4c0ca..3800cea 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 0031f61..2a7c160 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 08bcbd5..1e68be4 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 691a277..b078197 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 9693aeb..6c8a652 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 16744cd..fabbbaf 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 2e01ef6..7477ba4 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 e1afb0d..3570635 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 b425d7f..e7d286e 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 1bd7af1..cb5a3fa 100644
--- a/deps/npm/lib/cache/add-named.js
+++ b/deps/npm/lib/cache/add-named.js
@@ -7,7 +7,6 @@ var path = require("path")
, readJson = require("read-package-json")
, url = require("url")
, npm = require("../npm.js")
- , registry = npm.registry
, deprCheck = require("../utils/depr-check.js")
, inflight = require("inflight")
, addRemoteTarball = require("./add-remote-tarball.js")
@@ -18,7 +17,7 @@ var path = require("path")
module.exports = addNamed
function getOnceFromRegistry (name, from, next, done) {
- mapToRegistry(name, npm.config, function (er, uri) {
+ mapToRegistry(name, npm.config, function (er, uri, auth) {
if (er) return done(er)
var key = "registry:" + uri
@@ -26,7 +25,7 @@ function getOnceFromRegistry (name, from, next, done) {
if (!next) return log.verbose(from, key, "already in flight; waiting")
else log.verbose(from, key, "not in flight; fetching")
- registry.get(uri, null, next)
+ npm.registry.get(uri, { auth : auth }, next)
})
}
@@ -169,28 +168,28 @@ function addNameVersion (name, v, data, cb) {
})
function fetchit () {
- if (!npm.config.get("registry")) {
- return cb(new Error("Cannot fetch: "+dist.tarball))
- }
-
- // Use the same protocol as the registry. https registry --> https
- // tarballs, but only if they're the same hostname, or else detached
- // tarballs may not work.
- var tb = url.parse(dist.tarball)
- var rp = url.parse(npm.config.get("registry"))
- if (tb.hostname === rp.hostname
- && tb.protocol !== rp.protocol) {
- tb.protocol = url.parse(npm.config.get("registry")).protocol
- delete tb.href
- }
- tb = url.format(tb)
-
- // Only add non-shasum'ed packages if --forced. Only ancient things
- // would lack this for good reasons nowadays.
- if (!dist.shasum && !npm.config.get("force")) {
- return cb(new Error("package lacks shasum: " + data._id))
- }
- return addRemoteTarball(tb, data, dist.shasum, cb)
+ mapToRegistry(name, npm.config, function (er, _, auth, ruri) {
+ if (er) return cb(er)
+
+ // Use the same protocol as the registry. https registry --> https
+ // tarballs, but only if they're the same hostname, or else detached
+ // tarballs may not work.
+ var tb = url.parse(dist.tarball)
+ var rp = url.parse(ruri)
+ if (tb.hostname === rp.hostname && tb.protocol !== rp.protocol) {
+ tb.protocol = rp.protocol
+ delete tb.href
+ }
+ tb = url.format(tb)
+
+ // Only add non-shasum'ed packages if --forced. Only ancient things
+ // would lack this for good reasons nowadays.
+ if (!dist.shasum && !npm.config.get("force")) {
+ return cb(new Error("package lacks shasum: " + data._id))
+ }
+
+ addRemoteTarball(tb, data, dist.shasum, auth, cb)
+ })
}
}
}
diff --git a/deps/npm/lib/cache/add-remote-git.js b/deps/npm/lib/cache/add-remote-git.js
index d8f3f1c..1ad925e 100644
--- a/deps/npm/lib/cache/add-remote-git.js
+++ b/deps/npm/lib/cache/add-remote-git.js
@@ -1,21 +1,29 @@
var mkdir = require("mkdirp")
, assert = require("assert")
, git = require("../utils/git.js")
- , once = require("once")
, fs = require("graceful-fs")
, log = require("npmlog")
, path = require("path")
, url = require("url")
, chownr = require("chownr")
- , zlib = require("zlib")
, crypto = require("crypto")
, npm = require("../npm.js")
, rm = require("../utils/gently-rm.js")
, inflight = require("inflight")
, getCacheStat = require("./get-stat.js")
- , addLocalTarball = require("./add-local-tarball.js")
- , writeStream = require("fs-write-stream-atomic")
+ , addLocal = require("./add-local.js")
+ , realizePackageSpecifier = require("realize-package-specifier")
+ , normalizeGitUrl = require("normalize-git-url")
+var remotes = path.resolve(npm.config.get("cache"), "_git-remotes")
+var templates = path.join(remotes, "_templates")
+
+var VALID_VARIABLES = [
+ "GIT_SSH",
+ "GIT_SSL_NO_VERIFY",
+ "GIT_PROXY_COMMAND",
+ "GIT_SSL_CAINFO"
+]
// 1. cacheDir = path.join(cache,'_git-remotes',sha1(u))
// 2. checkGitDir(cacheDir) ? 4. : 3. (rm cacheDir if necessary)
@@ -29,41 +37,21 @@ module.exports = function addRemoteGit (u, silent, cb) {
assert(typeof cb === "function", "must have callback")
log.verbose("addRemoteGit", "u=%j silent=%j", u, silent)
- var parsed = url.parse(u, true)
- log.silly("addRemoteGit", "parsed", parsed)
-
- // git is so tricky!
- // if the path is like ssh://foo:22/some/path then it works, but
- // it needs the ssh://
- // If the path is like ssh://foo:some/path then it works, but
- // only if you remove the ssh://
- var origUrl = u
- u = u.replace(/^git\+/, "")
- .replace(/#.*$/, "")
-
- // ssh paths that are scp-style urls don't need the ssh://
- if (parsed.pathname.match(/^\/?:/)) {
- u = u.replace(/^ssh:\/\//, "")
- }
-
- cb = inflight(u, cb)
- if (!cb) return log.verbose("addRemoteGit", u, "already in flight; waiting")
- log.verbose("addRemoteGit", u, "not in flight; cloning")
-
- // figure out what we should check out.
- var co = parsed.hash && parsed.hash.substr(1) || "master"
-
- var v = crypto.createHash("sha1").update(u).digest("hex").slice(0, 8)
- v = u.replace(/[^a-zA-Z0-9]+/g, "-")+"-"+v
+ var normalized = normalizeGitUrl(u)
+ log.silly("addRemoteGit", "normalized", normalized)
- log.verbose("addRemoteGit", [u, co])
+ var v = crypto.createHash("sha1").update(normalized.url).digest("hex").slice(0, 8)
+ v = normalized.url.replace(/[^a-zA-Z0-9]+/g, "-")+"-"+v
+ log.silly("addRemoteGit", "v", v)
- var p = path.join(npm.config.get("cache"), "_git-remotes", v)
+ var p = path.join(remotes, v)
+ cb = inflight(p, cb)
+ if (!cb) return log.verbose("addRemoteGit", p, "already in flight; waiting")
+ log.verbose("addRemoteGit", p, "not in flight; cloning")
- // we don't need global templates when cloning. use this empty dir to specify as template dir
- mkdir(path.join(npm.config.get("cache"), "_git-remotes", "_templates"), function (er) {
+ getGitDir(function (er) {
if (er) return cb(er)
- checkGitDir(p, u, co, origUrl, silent, function (er, data) {
+ checkGitDir(p, normalized.url, normalized.branch, u, silent, function (er, data) {
if (er) return cb(er, data)
addModeRecursive(p, npm.modes.file, function (er) {
@@ -73,31 +61,53 @@ module.exports = function addRemoteGit (u, silent, cb) {
})
}
+function getGitDir (cb) {
+ getCacheStat(function (er, st) {
+ if (er) return cb(er)
+
+ // We don't need global templates when cloning. Use an empty directory for
+ // the templates, creating it (and setting its permissions) if necessary.
+ mkdir(templates, function (er) {
+ if (er) return cb(er)
+
+ // Ensure that both the template and remotes directories have the correct
+ // permissions.
+ fs.chown(templates, st.uid, st.gid, function (er) {
+ if (er) return cb(er)
+
+ fs.chown(remotes, st.uid, st.gid, function (er) {
+ cb(er, st)
+ })
+ })
+ })
+ })
+}
+
function checkGitDir (p, u, co, origUrl, silent, cb) {
fs.stat(p, function (er, s) {
if (er) return cloneGitRemote(p, u, co, origUrl, silent, cb)
- if (!s.isDirectory()) return rm(p, function (er){
+ if (!s.isDirectory()) return rm(p, function (er) {
if (er) return cb(er)
cloneGitRemote(p, u, co, origUrl, silent, cb)
})
- var args = [ "config", "--get", "remote.origin.url" ]
- var env = gitEnv()
-
- // check for git
- git.whichAndExec(args, {cwd: p, env: env}, function (er, stdout, stderr) {
- var stdoutTrimmed = (stdout + "\n" + stderr).trim()
- if (er || u !== stdout.trim()) {
- log.warn( "`git config --get remote.origin.url` returned "
- + "wrong result ("+u+")", stdoutTrimmed )
- return rm(p, function (er){
- if (er) return cb(er)
- cloneGitRemote(p, u, co, origUrl, silent, cb)
- })
+ git.whichAndExec(
+ [ "config", "--get", "remote.origin.url" ],
+ { cwd : p, env : gitEnv },
+ function (er, stdout, stderr) {
+ var stdoutTrimmed = (stdout + "\n" + stderr).trim()
+ if (er || u !== stdout.trim()) {
+ log.warn( "`git config --get remote.origin.url` returned "
+ + "wrong result ("+u+")", stdoutTrimmed )
+ return rm(p, function (er){
+ if (er) return cb(er)
+ cloneGitRemote(p, u, co, origUrl, silent, cb)
+ })
+ }
+ log.verbose("git remote.origin.url", stdoutTrimmed)
+ fetchRemote(p, u, co, origUrl, cb)
}
- log.verbose("git remote.origin.url", stdoutTrimmed)
- archiveGitRemote(p, u, co, origUrl, cb)
- })
+ )
})
}
@@ -105,66 +115,68 @@ function cloneGitRemote (p, u, co, origUrl, silent, cb) {
mkdir(p, function (er) {
if (er) return cb(er)
- var args = [ "clone", "--template=" + path.join(npm.config.get("cache"),
- "_git_remotes", "_templates"), "--mirror", u, p ]
- var env = gitEnv()
-
- // check for git
- git.whichAndExec(args, {cwd: p, env: env}, function (er, stdout, stderr) {
- stdout = (stdout + "\n" + stderr).trim()
- if (er) {
- if (silent) {
- log.verbose("git clone " + u, stdout)
- } else {
- log.error("git clone " + u, stdout)
+ git.whichAndExec(
+ [ "clone", "--template=" + templates, "--mirror", u, p ],
+ { cwd : p, env : gitEnv() },
+ function (er, stdout, stderr) {
+ stdout = (stdout + "\n" + stderr).trim()
+ if (er) {
+ if (silent) {
+ log.verbose("git clone " + u, stdout)
+ } else {
+ log.error("git clone " + u, stdout)
+ }
+ return cb(er)
}
- return cb(er)
+ log.verbose("git clone " + u, stdout)
+ fetchRemote(p, u, co, origUrl, cb)
}
- log.verbose("git clone " + u, stdout)
- archiveGitRemote(p, u, co, origUrl, cb)
- })
+ )
})
}
-function archiveGitRemote (p, u, co, origUrl, cb) {
- var archive = [ "fetch", "-a", "origin" ]
- var resolve = [ "rev-list", "-n1", co ]
- var env = gitEnv()
-
- var resolved = null
- var tmp
+function fetchRemote (p, u, co, origUrl, cb) {
+ git.whichAndExec(
+ [ "fetch", "-a", "origin" ],
+ { cwd : p, env : gitEnv() },
+ function (er, stdout, stderr) {
+ stdout = (stdout + "\n" + stderr).trim()
+ if (er) {
+ log.error("git fetch -a origin ("+u+")", stdout)
+ return cb(er)
+ }
+ log.verbose("git fetch -a origin ("+u+")", stdout)
- git.whichAndExec(archive, {cwd: p, env: env}, function (er, stdout, stderr) {
- stdout = (stdout + "\n" + stderr).trim()
- if (er) {
- log.error("git fetch -a origin ("+u+")", stdout)
- return cb(er)
- }
- log.verbose("git fetch -a origin ("+u+")", stdout)
- tmp = path.join(npm.tmp, Date.now()+"-"+Math.random(), "tmp.tgz")
-
- if (process.platform === "win32") {
- log.silly("verifyOwnership", "skipping for windows")
- resolveHead()
- } else {
- getCacheStat(function(er, cs) {
- if (er) {
- log.error("Could not get cache stat")
- return cb(er)
- }
- chownr(p, cs.uid, cs.gid, function(er) {
+ if (process.platform === "win32") {
+ log.silly("verifyOwnership", "skipping for windows")
+ resolveHead(p, u, co, origUrl, cb)
+ }
+ else {
+ getGitDir(function (er, cs) {
if (er) {
- log.error("Failed to change folder ownership under npm cache for %s", p)
+ log.error("Could not get cache stat")
return cb(er)
}
- resolveHead()
+
+ chownr(p, cs.uid, cs.gid, function (er) {
+ if (er) {
+ log.error("Failed to change folder ownership under npm cache for %s", p)
+ return cb(er)
+ }
+
+ resolveHead(p, u, co, origUrl, cb)
+ })
})
- })
+ }
}
- })
+ )
+}
- function resolveHead () {
- git.whichAndExec(resolve, {cwd: p, env: env}, function (er, stdout, stderr) {
+function resolveHead (p, u, co, origUrl, cb) {
+ git.whichAndExec(
+ [ "rev-list", "-n1", co ],
+ { cwd : p, env : gitEnv() },
+ function (er, stdout, stderr) {
stdout = (stdout + "\n" + stderr).trim()
if (er) {
log.error("Failed resolving git HEAD (" + u + ")", stderr)
@@ -173,48 +185,73 @@ function archiveGitRemote (p, u, co, origUrl, cb) {
log.verbose("git rev-list -n1 " + co, stdout)
var parsed = url.parse(origUrl)
parsed.hash = stdout
- resolved = url.format(parsed)
+ var resolved = url.format(parsed)
- if (parsed.protocol !== "git:") {
- resolved = "git+" + resolved
- }
+ if (parsed.protocol !== "git:") resolved = "git+" + resolved
// https://github.com/npm/npm/issues/3224
- // node incorrectly sticks a / at the start of the path
- // We know that the host won't change, so split and detect this
+ // node incorrectly sticks a / at the start of the path We know that the
+ // host won't change, so split and detect this
var spo = origUrl.split(parsed.host)
var spr = resolved.split(parsed.host)
- if (spo[1].charAt(0) === ":" && spr[1].charAt(0) === "/")
+ if (spo[1].charAt(0) === ":" && spr[1].charAt(0) === "/") {
spr[1] = spr[1].slice(1)
+ }
resolved = spr.join(parsed.host)
log.verbose("resolved git url", resolved)
- next()
- })
- }
-
- function next () {
- mkdir(path.dirname(tmp), function (er) {
- if (er) return cb(er)
- var gzip = zlib.createGzip({ level: 9 })
- var args = ["archive", co, "--format=tar", "--prefix=package/"]
- var out = writeStream(tmp)
- var env = gitEnv()
- cb = once(cb)
- var cp = git.spawn(args, { env: env, cwd: p })
- cp.on("error", cb)
- cp.stderr.on("data", function(chunk) {
- log.silly(chunk.toString(), "git archive")
- })
+ cache(p, u, stdout, resolved, cb)
+ }
+ )
+}
- cp.stdout.pipe(gzip).pipe(out).on("close", function() {
- addLocalTarball(tmp, null, null, function(er, data) {
- if (data) data._resolved = resolved
- cb(er, data)
- })
- })
- })
- }
+/**
+ * Make an actual clone from the bare (mirrored) cache. There is no safe way to
+ * do a one-step clone to a treeish that isn't guaranteed to be a branch, so
+ * this has to be two steps.
+ */
+function cache (p, u, treeish, resolved, cb) {
+ var tmp = path.join(npm.tmp, Date.now()+"-"+Math.random(), treeish)
+ git.whichAndExec(
+ [ "clone", p, tmp ],
+ { cwd : p, env : gitEnv() },
+ function (er, stdout, stderr) {
+ stdout = (stdout + "\n" + stderr).trim()
+ if (er) {
+ log.error("Failed to clone "+resolved+" from "+u, stderr)
+ return cb(er)
+ }
+ log.verbose("git clone", "from", p)
+ log.verbose("git clone", stdout)
+
+ git.whichAndExec(
+ [ "checkout", treeish ],
+ { cwd : tmp, env : gitEnv() },
+ function (er, stdout, stderr) {
+ stdout = (stdout + "\n" + stderr).trim()
+ if (er) {
+ log.error("Failed to check out "+treeish, stderr)
+ return cb(er)
+ }
+ log.verbose("git checkout", stdout)
+
+ realizePackageSpecifier(tmp, function (er, spec) {
+ if (er) {
+ log.error("Failed to map", tmp, "to a package specifier")
+ return cb(er)
+ }
+
+ // https://github.com/npm/npm/issues/6400
+ // ensure pack logic is applied
+ addLocal(spec, null, function (er, data) {
+ if (data) data._resolved = resolved
+ cb(er, data)
+ })
+ })
+ }
+ )
+ }
+ )
}
var gitEnv_
@@ -224,7 +261,7 @@ function gitEnv () {
if (gitEnv_) return gitEnv_
gitEnv_ = {}
for (var k in process.env) {
- if (!~["GIT_PROXY_COMMAND","GIT_SSH","GIT_SSL_NO_VERIFY","GIT_SSL_CAINFO"].indexOf(k) && k.match(/^GIT/)) continue
+ if (!~VALID_VARIABLES.indexOf(k) && k.match(/^GIT/)) continue
gitEnv_[k] = process.env[k]
}
return gitEnv_
diff --git a/deps/npm/lib/cache/add-remote-tarball.js b/deps/npm/lib/cache/add-remote-tarball.js
index 9591ba8..e87ac54 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 0000000..d81e6f5
--- /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 0000000..2955f6a
--- /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 7bd6721..febd104 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 3b26a56..07c8175 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 74397d0..6a4abd7 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 17dd4ea..c90ad90 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 dead3f7..9abe740 100644
--- a/deps/npm/lib/docs.js
+++ b/deps/npm/lib/docs.js
@@ -4,23 +4,22 @@ docs.usage = "npm docs "
docs.usage += "\n"
docs.usage += "npm docs ."
+var npm = require("./npm.js")
+ , opener = require("opener")
+ , path = require("path")
+ , log = require("npmlog")
+ , mapToRegistry = require("./utils/map-to-registry.js")
+
docs.completion = function (opts, cb) {
- mapToRegistry("/-/short", npm.config, function (er, uri) {
+ mapToRegistry("/-/short", npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri, { timeout : 60000 }, function (er, list) {
+ npm.registry.get(uri, { timeout : 60000, auth : auth }, function (er, list) {
return cb(null, list || [])
})
})
}
-var npm = require("./npm.js")
- , registry = npm.registry
- , opener = require("opener")
- , path = require("path")
- , log = require("npmlog")
- , mapToRegistry = require("./utils/map-to-registry.js")
-
function url (json) {
return json.homepage ? json.homepage : "https://npmjs.org/package/" + json.name
}
@@ -28,7 +27,7 @@ function url (json) {
function docs (args, cb) {
args = args || []
var pending = args.length
- if (!pending) return getDoc('.', cb)
+ if (!pending) return getDoc(".", cb)
args.forEach(function(proj) {
getDoc(proj, function(err) {
if (err) {
@@ -40,10 +39,10 @@ function docs (args, cb) {
}
function getDoc (project, cb) {
- project = project || '.'
+ project = project || "."
var package = path.resolve(npm.localPrefix, "package.json")
- if (project === '.' || project === './') {
+ if (project === "." || project === "./") {
var json
try {
json = require(package)
@@ -57,10 +56,10 @@ function getDoc (project, cb) {
return opener(url(json), { command: npm.config.get("browser") }, cb)
}
- mapToRegistry(project, npm.config, function (er, uri) {
+ mapToRegistry(project, npm.config, function (er, uri, auth) {
if (er) return cb(er)
- registry.get(uri + "/latest", { timeout : 3600 }, next)
+ npm.registry.get(uri + "/latest", { timeout : 3600, auth : auth }, next)
})
function next (er, json) {
diff --git a/deps/npm/lib/explore.js b/deps/npm/lib/explore.js
index e87e839..96475a0 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 747bd50..07d9219 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 925654b..401e700 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 e539307..756d12e 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 ed329d1..eee4f27 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 e933a13..d03ec47 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 fdfd762..fe25a8e 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 2fdee7a..7b34508 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 2a0fcff..f179bd4 100644
--- a/deps/npm/lib/publish.js
+++ b/deps/npm/lib/publish.js
@@ -1,17 +1,17 @@
module.exports = publish
-var url = require("url")
- , npm = require("./npm.js")
+var npm = require("./npm.js")
, log = require("npmlog")
, path = require("path")
, readJson = require("read-package-json")
, lifecycle = require("./utils/lifecycle.js")
, chain = require("slide").chain
, Conf = require("./config/core.js").Conf
- , RegClient = require("npm-registry-client")
+ , CachingRegClient = require("./cache/caching-client.js")
, mapToRegistry = require("./utils/map-to-registry.js")
, cachedPackageRoot = require("./cache/cached-package-root.js")
+ , createReadStream = require("graceful-fs").createReadStream
publish.usage = "npm publish "
+ "\nnpm publish "
@@ -87,7 +87,7 @@ function publish_ (arg, data, isRetry, cachedir, cb) {
s[k] = data.publishConfig[k]
return s
}, {}))
- registry = new RegClient(config)
+ registry = new CachingRegClient(config)
}
data._npmVersion = npm.version
@@ -101,21 +101,29 @@ function publish_ (arg, data, isRetry, cachedir, cb) {
)
)
- mapToRegistry(data.name, config, function (er, registryURI) {
+ mapToRegistry(data.name, config, function (er, registryURI, auth, registryBase) {
if (er) return cb(er)
- var tarball = cachedir + ".tgz"
+ var tarballPath = cachedir + ".tgz"
// we just want the base registry URL in this case
- var registryBase = url.resolve(registryURI, ".")
log.verbose("publish", "registryBase", registryBase)
+ log.silly("publish", "uploading", tarballPath)
- var c = config.getCredentialsByURI(registryBase)
- data._npmUser = {name: c.username, email: c.email}
+ data._npmUser = {
+ name : auth.username,
+ email : auth.email
+ }
+
+ var params = {
+ metadata : data,
+ body : createReadStream(tarballPath),
+ auth : auth
+ }
- registry.publish(registryBase, data, tarball, function (er) {
- if (er && er.code === "EPUBLISHCONFLICT"
- && npm.config.get("force") && !isRetry) {
+ registry.publish(registryBase, params, function (er) {
+ if (er && er.code === "EPUBLISHCONFLICT" &&
+ npm.config.get("force") && !isRetry) {
log.warn("publish", "Forced publish over " + data._id)
return npm.commands.unpublish([data._id], function (er) {
// ignore errors. Use the force. Reach out with your feelings.
diff --git a/deps/npm/lib/repo.js b/deps/npm/lib/repo.js
index c6db8e3..3db4a16 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 4495b93..fd26a0c 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 5dd060f..ad3f312 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 123c4eb..d2e69de 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 dee5c15..087e8d9 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 47e9a8c..bc7ec91 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 8bd6e85..df57c5b 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 2566cd5..da03b0d 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 5201a15..6ce2f83 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 95b78a8..12c6dd4 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 d43d072..587ad0e 100644
--- a/deps/npm/lib/utils/gently-rm.js
+++ b/deps/npm/lib/utils/gently-rm.js
@@ -11,13 +11,19 @@ var npm = require("../npm.js")
, readlink = require("graceful-fs").readlink
, isInside = require("path-is-inside")
, vacuum = require("fs-vacuum")
- , rimraf = require("rimraf")
, some = require("async-some")
+ , asyncMap = require("slide").asyncMap
+ , normalize = require("path").normalize
+
+function gentlyRm (path, gently, base, cb) {
+ if (!cb) {
+ cb = base
+ base = undefined
+ }
-function gentlyRm (path, gently, cb) {
if (!cb) {
cb = gently
- gently = null
+ gently = false
}
// never rm the root, prefix, or bin dirs.
@@ -27,7 +33,7 @@ function gentlyRm (path, gently, cb) {
npm.globalDir, npm.globalRoot, npm.globalBin, npm.globalPrefix
]
- var resolved = resolve(path)
+ var resolved = normalize(resolve(path))
if (prefixes.indexOf(resolved) !== -1) {
log.verbose("gentlyRm", resolved, "is part of npm and can't be removed")
return cb(new Error("May not delete: "+resolved))
@@ -35,13 +41,14 @@ function gentlyRm (path, gently, cb) {
var options = {log : log.silly.bind(log, "gentlyRm")}
if (npm.config.get("force") || !gently) options.purge = true
+ if (base) options.base = normalize(base)
if (!gently) {
log.verbose("gentlyRm", "vacuuming", resolved)
return vacuum(resolved, options, cb)
}
- var parent = resolve(gently)
+ var parent = options.base = normalize(base ? base : npm.prefix)
log.verbose("gentlyRm", "verifying that", parent, "is managed by npm")
some(prefixes, isManaged(parent), function (er, matched) {
if (er) return cb(er)
@@ -56,7 +63,6 @@ function gentlyRm (path, gently, cb) {
if (isInside(resolved, parent)) {
log.silly("gentlyRm", resolved, "is under", parent)
log.verbose("gentlyRm", "vacuuming", resolved, "up to", parent)
- options.base = parent
return vacuum(resolved, options, cb)
}
@@ -94,7 +100,7 @@ function gentlyRm (path, gently, cb) {
if (matched) {
log.silly("gentlyRm", source, "is under", matched)
log.verbose("gentlyRm", "removing", resolved)
- rimraf(resolved, cb)
+ vacuum(resolved, options, cb)
}
log.verbose("gentlyRm", source, "is not managed by npm")
@@ -107,55 +113,55 @@ function gentlyRm (path, gently, cb) {
var resolvedPaths = {}
function isManaged (target) {
- return predicate
-
- function predicate (path, cb) {
+ return function predicate (path, cb) {
if (!path) {
log.verbose("isManaged", "no path")
return cb(null, false)
}
- path = resolve(path)
-
- // if the path has already been memoized, return immediately
- var resolved = resolvedPaths[path]
- if (resolved) {
- var inside = isInside(target, resolved)
- log.silly("isManaged", target, inside ? "is" : "is not", "inside", resolved)
-
- return cb(null, inside && path)
- }
-
- // otherwise, check the path
- lstat(path, function (er, stat) {
+ asyncMap([path, target], resolveSymlink, function (er, results) {
if (er) {
if (er.code === "ENOENT") return cb(null, false)
return cb(er)
}
- // if it's not a link, cache & test the path itself
- if (!stat.isSymbolicLink()) return cacheAndTest(path, path, target, cb)
+ var path = results[0]
+ var target = results[1]
+ var inside = isInside(target, path)
+ log.silly("isManaged", target, inside ? "is" : "is not", "inside", path)
- // otherwise, cache & test the link's source
- readlink(path, function (er, source) {
- if (er) {
- if (er.code === "ENOENT") return cb(null, false)
+ return cb(null, inside && path)
+ })
+ }
- return cb(er)
- }
+ function resolveSymlink (toResolve, cb) {
+ var resolved = resolve(toResolve)
+
+ // if the path has already been memoized, return immediately
+ var cached = resolvedPaths[resolved]
+ if (cached) return cb(null, cached)
+
+ // otherwise, check the path
+ lstat(resolved, function (er, stat) {
+ if (er) return cb(er)
+
+ // if it's not a link, cache & return the path itself
+ if (!stat.isSymbolicLink()) {
+ resolvedPaths[resolved] = resolved
+ return cb(null, resolved)
+ }
- cacheAndTest(resolve(path, source), path, target, cb)
+ // otherwise, cache & return the link's source
+ readlink(resolved, function (er, source) {
+ if (er) return cb(er)
+
+ resolved = resolve(resolved, source)
+ resolvedPaths[resolved] = resolved
+ cb(null, resolved)
})
})
}
-
- function cacheAndTest (resolved, source, target, cb) {
- resolvedPaths[source] = resolved
- var inside = isInside(target, resolved)
- log.silly("cacheAndTest", target, inside ? "is" : "is not", "inside", resolved)
- cb(null, inside && source)
- }
}
function clobberFail (p, g, cb) {
diff --git a/deps/npm/lib/utils/git.js b/deps/npm/lib/utils/git.js
index db5cc7b..78cb083 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 c0eb83d..ccee756 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 cf665e4..bd68a26 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 0000000..9536718
--- /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 ede49a1..7656b5d 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 a15e2c3..9307086 100644
--- a/deps/npm/lib/version.js
+++ b/deps/npm/lib/version.js
@@ -2,16 +2,15 @@
module.exports = version
-var exec = require("child_process").execFile
- , semver = require("semver")
+var semver = require("semver")
, path = require("path")
, fs = require("graceful-fs")
, writeFileAtomic = require("write-file-atomic")
, chain = require("slide").chain
, log = require("npmlog")
- , which = require("which")
, npm = require("./npm.js")
, git = require("./utils/git.js")
+ , assert = require("assert")
version.usage = "npm version [ | major | minor | patch | prerelease | preminor | premajor ]\n"
+ "\n(run in package dir)\n"
@@ -24,104 +23,156 @@ version.usage = "npm version [ | major | minor | patch | prerelease
function version (args, silent, cb_) {
if (typeof cb_ !== "function") cb_ = silent, silent = false
if (args.length > 1) return cb_(version.usage)
- fs.readFile(path.join(npm.localPrefix, "package.json"), function (er, data) {
- if (!args.length) {
- var v = {}
- Object.keys(process.versions).forEach(function (k) {
- v[k] = process.versions[k]
- })
- v.npm = npm.version
- try {
- data = JSON.parse(data.toString())
- } catch (er) {
- data = null
- }
- if (data && data.name && data.version) {
- v[data.name] = data.version
- }
- if (npm.config.get("json")) {
- v = JSON.stringify(v, null, 2)
- }
- console.log(v)
- return cb_()
+
+ var packagePath = path.join(npm.localPrefix, "package.json")
+ fs.readFile(packagePath, function (er, data) {
+ function cb (er) {
+ if (!er && !silent) console.log("v" + data.version)
+ cb_(er)
+ }
+
+ if (data) data = data.toString()
+ try {
+ data = JSON.parse(data)
+ }
+ catch (er) {
+ log.error("version", "Bad package.json data", data)
+ return cb_(er)
}
+ if (!args.length && data) return dump(data.name, data.version, cb_)
+
if (er) {
log.error("version", "No package.json found")
return cb_(er)
}
+ var newVersion = semver.valid(args[0])
+ if (!newVersion) newVersion = semver.inc(data.version, args[0])
+ if (!newVersion) return cb_(version.usage)
+ if (data.version === newVersion) return cb_(new Error("Version not changed"))
+ data.version = newVersion
+
+ checkGit(function (er, hasGit) {
+ if (er) return cb_(er)
+
+ write(data, "package.json", function (er) {
+ if (er) return cb_(er)
+
+ updateShrinkwrap(newVersion, function (er, hasShrinkwrap) {
+ if (er || !hasGit) return cb(er)
+
+ commit(data.version, hasShrinkwrap, cb)
+ })
+ })
+ })
+ })
+}
+
+function updateShrinkwrap (newVersion, cb) {
+ fs.readFile(path.join(npm.localPrefix, "npm-shrinkwrap.json"), function (er, data) {
+ if (er && er.code === "ENOENT") return cb(null, false)
+
try {
+ data = data.toString()
data = JSON.parse(data)
- } catch (er) {
- log.error("version", "Bad package.json data")
- return cb_(er)
+ }
+ catch (er) {
+ log.error("version", "Bad npm-shrinkwrap.json data")
+ return cb(er)
}
- var newVer = semver.valid(args[0])
- if (!newVer) newVer = semver.inc(data.version, args[0])
- if (!newVer) return cb_(version.usage)
- if (data.version === newVer) return cb_(new Error("Version not changed"))
- data.version = newVer
-
- fs.stat(path.join(npm.localPrefix, ".git"), function (er, s) {
- function cb (er) {
- if (!er && !silent) console.log("v" + newVer)
- cb_(er)
+ data.version = newVersion
+ write(data, "npm-shrinkwrap.json", function (er) {
+ if (er) {
+ log.error("version", "Bad npm-shrinkwrap.json data")
+ return cb(er)
}
-
- var tags = npm.config.get('git-tag-version')
- var doGit = !er && s.isDirectory() && tags
- if (!doGit) return write(data, cb)
- else checkGit(data, cb)
+ cb(null, true)
})
})
}
-function checkGit (data, cb) {
- var args = [ "status", "--porcelain" ]
- var options = {env: process.env}
-
- // check for git
- git.whichAndExec(args, options, function (er, stdout) {
- if (er && er.code === "ENOGIT") {
- log.warn(
- "version",
- "This is a Git checkout, but the git command was not found.",
- "npm could not create a Git tag for this release!"
- )
- return write(data, cb)
+function dump (name, version, cb) {
+ assert(typeof name === "string", "package name must be passed to version dump")
+ assert(typeof version === "string", "package version must be passed to version dump")
+
+ var v = {}
+
+ if (name) v[name] = version
+ v.npm = npm.version
+ Object.keys(process.versions).forEach(function (k) {
+ v[k] = process.versions[k]
+ })
+
+ if (npm.config.get("json")) v = JSON.stringify(v, null, 2)
+
+ console.log(v)
+ cb()
+}
+
+function checkGit (cb) {
+ fs.stat(path.join(npm.localPrefix, ".git"), function (er, s) {
+ var doGit = !er && s.isDirectory() && npm.config.get("git-tag-version")
+ if (!doGit) {
+ if (er) log.verbose("version", "error checking for .git", er)
+ log.verbose("version", "not tagging in git")
+ return cb(null, false)
}
- var lines = stdout.trim().split("\n").filter(function (line) {
- return line.trim() && !line.match(/^\?\? /)
- }).map(function (line) {
- return line.trim()
- })
- if (lines.length) return cb(new Error(
- "Git working directory not clean.\n"+lines.join("\n")))
- write(data, function (er) {
- if (er) return cb(er)
- var message = npm.config.get("message").replace(/%s/g, data.version)
- , sign = npm.config.get("sign-git-tag")
- , flag = sign ? "-sm" : "-am"
- chain
- ( [ git.chainableExec([ "add", "package.json" ], {env: process.env})
- , git.chainableExec([ "commit", "-m", message ], {env: process.env})
- , sign && function (cb) {
- npm.spinner.stop()
- cb()
- }
-
- , git.chainableExec([ "tag", "v" + data.version, flag, message ]
- , {env: process.env}) ]
- , cb )
- })
+ // check for git
+ git.whichAndExec(
+ [ "status", "--porcelain" ],
+ { env : process.env },
+ function (er, stdout) {
+ if (er && er.code === "ENOGIT") {
+ log.warn(
+ "version",
+ "This is a Git checkout, but the git command was not found.",
+ "npm could not create a Git tag for this release!"
+ )
+ return cb(null, false)
+ }
+
+ var lines = stdout.trim().split("\n").filter(function (line) {
+ return line.trim() && !line.match(/^\?\? /)
+ }).map(function (line) {
+ return line.trim()
+ })
+ if (lines.length) return cb(new Error(
+ "Git working directory not clean.\n"+lines.join("\n")
+ ))
+
+ cb(null, true)
+ }
+ )
})
}
-function write (data, cb) {
- writeFileAtomic( path.join(npm.localPrefix, "package.json")
- , new Buffer(JSON.stringify(data, null, 2) + "\n")
- , cb )
+function commit (version, hasShrinkwrap, cb) {
+ var options = { env : process.env }
+ var message = npm.config.get("message").replace(/%s/g, version)
+ var sign = npm.config.get("sign-git-tag")
+ var flag = sign ? "-sm" : "-am"
+ chain(
+ [
+ git.chainableExec([ "add", "package.json" ], options),
+ hasShrinkwrap && git.chainableExec([ "add", "npm-shrinkwrap.json" ] , options),
+ git.chainableExec([ "commit", "-m", message ], options),
+ git.chainableExec([ "tag", "v" + version, flag, message ], options)
+ ],
+ cb
+ )
+}
+
+function write (data, file, cb) {
+ assert(data && typeof data === "object", "must pass data to version write")
+ assert(typeof file === "string", "must pass filename to write to version write")
+
+ log.verbose("version.write", "data", data, "to", file)
+ writeFileAtomic(
+ path.join(npm.localPrefix, file),
+ new Buffer(JSON.stringify(data, null, 2) + "\n"),
+ cb
+ )
}
diff --git a/deps/npm/lib/view.js b/deps/npm/lib/view.js
index 6b45cca..bd20ab5 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 b33f937..121c433 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 a7cf104..4f274c5 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 6b85986..b3abf17 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 6552d6c..8f0dc2b 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 09c7659..5acca82 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 0f21842..1179298 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 0748922..703c795 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 c49015a..1cf1d7c 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 a89cc6f..4cb0649 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 a93ebac..716303c 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 2454807..743a5d0 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 581a589..95a8fd2 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 1e9e5c1..1feecc2 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 8a19d12..1d905d0 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 0211aef..5f29171 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 a18a8e9..524081c 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 556eeb5..0d7f1af 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 3d4ed09..d2b6a29 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 0df0197..ec355ef 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 62d7650..86132ed 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 9cf4823..bcf9a52 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 45433a8..a1086ad 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 3ed5549..1c50379 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 8b9408a..3b39d68 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 b7bcac6..2ebdaa6 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 1a8cc95..7b22233 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 6657210..0df8251 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 0e04b9c..1bb1e9a 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 dc8428d..da8d6c9 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 234d0aa..010e815 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 c7f92fb..94a0afa 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 f85ebb9..2067f9e 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 905908a..65ea4ea 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 4ad5a67..3f7d19b 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 fa2b313..5fa9fb1 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 8dbc029..ced42ec 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 1762a0f..d212435 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 0a342ee..36f0c26 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 8622d18..0a20b4b 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 4999ac6..7185333 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 5aace75..70eb323 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 0b4a9f4..b398e81 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 a56f8bb..5568b48 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 6cb1df7..7f96d4f 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 19adfc9..61e1cce 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 21fde34..2ae02d0 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 35ef045..2a279d2 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 34a3f04..b993e0c 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 a275e47..aed41f8 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 4c76b8a..27588a2 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 cd8dda6..6b7503f 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 1dccd8f..15a2839 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 87ad325..ee757df 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 763e225..be2522c 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 9b543d3..d04e25d 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 ad93e30..4dd5a84 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 82767c8..d7c2ad4 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 54948ea..8648eac 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 8f4f346..a9baaf3 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 d5da00d..9a2ce6b 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 ec98278..5117917 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 0c379a4..2d5bf77 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 61fac42..68787c8 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 84558ab..de3d127 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 2bba846..9e96d44 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 101b752..35a993b 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 d9da93e..7d95e57 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 e2da6d6..4aaed71 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 48a06c9..310dfe2 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 13dbd95..28f7720 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 21a5aba..082589b 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 5638d43..64cc0ba 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 be94833..2cacefc 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 68bac79..15d5230 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 866f1e0..59bf90d 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 ba0cc5f..4fffa3b 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 0f87c50..92ce7b1 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 4eabb36..f3330a5 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 aa55b84..551eedb 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 378862a..95739ce 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 4da1376..a2daa31 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 f6d0f6d..ff969ec 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 8505f39..0cf637c 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 9b4ab46..48f865d 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 3f40eb0..eee573b 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 1697924..2cf7fe2 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 e49f28d..42bbf40 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 2d32507..cb320ec 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 71bbc58..6298c8d 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 9cd3436..2ae88d1 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 9cd3436..2ae88d1 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 fa9ef95..cf30629 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 d284686..fc2986b 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 fa9ef95..cf30629 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 0dc1531..ebaf038 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 e3b4c5c..d561e07 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 bf8edb2..ba47e45 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 9cf7009..3d67933 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 563509a..cf6a37c 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 442815a..056c96b 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 9de209d..f89b945 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 f876e4e..2cae9e8 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 9d11f46..69d880d 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 b0a4fca..73963fe 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 a6be932..bf239f7 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 0000000..ec035f3
--- /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 0000000..0d2cdd7
--- /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 0000000..8e8f307
--- /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 0000000..d97b8bf
--- /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 0000000..6a48073
--- /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 0000000..1626454
--- /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 0000000..d03c078
--- /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 0000000..d3cc65c
--- /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 0000000..a0e698f
--- /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 0000000..9333ec6
--- /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 0000000..59ddf6f
--- /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 0000000..37c00a4
--- /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 0000000..6877bde
--- /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 0000000..588f44d
--- /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 c44b8ca..8c15c99 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 602ae00..5b9546a 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 783c5c7..2fcdd1e 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 ca61025..ab8ea03 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 64c4dee..89d1041 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 527743b..d7231cf 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 5d40207..321ffa3 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 3c6b776..dc56f3f 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 ee49ad8..cb3d166 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 f9243a1..e3ee621 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 f12d49b..4744d9d 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 ef307b5..c60e1d9 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 1405367..559b7bf 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 f706a4b..e55abe9 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 29e5086..161b825 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 e7de770..6b2ccc9 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 c6b55b3..983649b 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 648ec84..0bad122 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 9aa1a95..3787ae3 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 b1f9861..4720cd8 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 d0ac582..f920c10 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 c34fdd5..0000000
--- 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 82b7ef6..d72bdcc 100644
--- a/deps/npm/node_modules/glob/README.md
+++ b/deps/npm/node_modules/glob/README.md
@@ -1,3 +1,5 @@
+[![Build Status](https://travis-ci.org/isaacs/node-glob.svg?branch=master)](https://travis-ci.org/isaacs/node-glob/) [![Dependency Status](https://david-dm.org/isaacs/node-glob.svg)](https://david-dm.org/isaacs/node-glob) [![devDependency Status](https://david-dm.org/isaacs/node-glob/dev-status.svg)](https://david-dm.org/isaacs/node-glob#info=devDependencies) [![optionalDependency Status](https://david-dm.org/isaacs/node-glob/optional-status.svg)](https://david-dm.org/isaacs/node-glob#info=optionalDependencies)
+
# Glob
Match files using the patterns the shell uses, like stars and stuff.
@@ -21,25 +23,94 @@ glob("**/*.js", options, function (er, files) {
})
```
-## Features
+## Glob Primer
+
+"Globs" are the patterns you type when you do stuff like `ls *.js` on
+the command line, or put `build/*` in a `.gitignore` file.
+
+Before parsing the path part patterns, braced sections are expanded
+into a set. Braced sections start with `{` and end with `}`, with any
+number of comma-delimited sections within. Braced sections may contain
+slash characters, so `a{/b/c,bcd}` would expand into `a/b/c` and `abcd`.
+
+The following characters have special magic meaning when used in a
+path portion:
+
+* `*` Matches 0 or more characters in a single path portion
+* `?` Matches 1 character
+* `[...]` Matches a range of characters, similar to a RegExp range.
+ If the first character of the range is `!` or `^` then it matches
+ any character not in the range.
+* `!(pattern|pattern|pattern)` Matches anything that does not match
+ any of the patterns provided.
+* `?(pattern|pattern|pattern)` Matches zero or one occurrence of the
+ patterns provided.
+* `+(pattern|pattern|pattern)` Matches one or more occurrences of the
+ patterns provided.
+* `*(a|b|c)` Matches zero or more occurrences of the patterns provided
+* `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns
+ provided
+* `**` If a "globstar" is alone in a path portion, then it matches
+ zero or more directories and subdirectories searching for matches.
+ It does not crawl symlinked directories.
+
+### Dots
+
+If a file or directory path portion has a `.` as the first character,
+then it will not match any glob pattern unless that pattern's
+corresponding path part also has a `.` as its first character.
+
+For example, the pattern `a/.*/c` would match the file at `a/.b/c`.
+However the pattern `a/*/c` would not, because `*` does not start with
+a dot character.
+
+You can make glob treat dots as normal characters by setting
+`dot:true` in the options.
+
+### Basename Matching
+
+If you set `matchBase:true` in the options, and the pattern has no
+slashes in it, then it will seek for any file anywhere in the tree
+with a matching basename. For example, `*.js` would match
+`test/simple/basic.js`.
+
+### Negation
+
+The intent for negation would be for a pattern starting with `!` to
+match everything that *doesn't* match the supplied pattern. However,
+the implementation is weird, and for the time being, this should be
+avoided. The behavior will change or be deprecated in version 5.
+
+### Empty Sets
-Please see the [minimatch
-documentation](https://github.com/isaacs/minimatch) for more details.
+If no matching files are found, then an empty array is returned. This
+differs from the shell, where the pattern itself is returned. For
+example:
-Supports these glob features:
+ $ echo a*s*d*f
+ a*s*d*f
-* Brace Expansion
-* Extended glob matching
-* "Globstar" `**` matching
+To get the bash-style behavior, set the `nonull:true` in the options.
-See:
+### See Also:
* `man sh`
-* `man bash`
+* `man bash` (Search for "Pattern Matching")
* `man 3 fnmatch`
* `man 5 gitignore`
* [minimatch documentation](https://github.com/isaacs/minimatch)
+## glob.hasMagic(pattern, [options])
+
+Returns `true` if there are any special characters in the pattern, and
+`false` otherwise.
+
+Note that the options affect the results. If `noext:true` is set in
+the options object, then `+(a|b)` will not be considered a magic
+pattern. If the pattern has a brace expansion, like `a/{b/c,x/y}`
+then that is considered magical, unless `nobrace:true` is set in the
+options.
+
## glob(pattern, [options], cb)
* `pattern` {String} Pattern to be matched
@@ -60,7 +131,7 @@ Perform a synchronous glob search.
## Class: glob.Glob
-Create a Glob object by instanting the `glob.Glob` class.
+Create a Glob object by instantiating the `glob.Glob` class.
```javascript
var Glob = require("glob").Glob
@@ -85,8 +156,6 @@ be immediately available on the `g.found` member.
* `minimatch` The minimatch object that the glob uses.
* `options` The options object passed in.
-* `error` The error encountered. When an error is encountered, the
- glob object is in an undefined state, and should be discarded.
* `aborted` Boolean which is set to true when calling `abort()`. There
is no way at this time to continue a glob search after aborting, but
you can re-use the statCache to avoid having to duplicate syscalls.
@@ -96,10 +165,14 @@ be immediately available on the `g.found` member.
values:
* `false` - Path does not exist
* `true` - Path exists
- * `1` - Path exists, and is not a directory
- * `2` - Path exists, and is a directory
+ * `'DIR'` - Path exists, and is not a directory
+ * `'FILE'` - Path exists, and is a directory
* `[file, entries, ...]` - Path exists, is a directory, and the
array value is the results of `fs.readdir`
+* `statCache` Cache of `fs.stat` results, to prevent statting the same
+ path multiple times.
+* `symlinks` A record of which paths are symbolic links, which is
+ relevant in resolving `**` patterns.
### Events
@@ -114,7 +187,9 @@ be immediately available on the `g.found` member.
### Methods
-* `abort` Stop the search.
+* `pause` Temporarily stop the search
+* `resume` Resume the search
+* `abort` Stop the search forever
### Options
@@ -124,7 +199,14 @@ or have glob-specific ramifications.
All options are false by default, unless otherwise noted.
-All options are added to the glob object, as well.
+All options are added to the Glob object, as well.
+
+If you are running many `glob` operations, you can pass a Glob object
+as the `options` argument to a subsequent operation to shortcut some
+`stat` and `readdir` calls. At the very least, you may pass in shared
+`symlinks`, `statCache`, and `cache` options, so that parallel glob
+operations will be sped up by sharing information about the
+filesystem.
* `cwd` The current working directory in which to search. Defaults
to `process.cwd()`.
@@ -142,36 +224,50 @@ All options are added to the glob object, as well.
* `nosort` Don't sort the results.
* `stat` Set to true to stat *all* results. This reduces performance
somewhat, and is completely unnecessary, unless `readdir` is presumed
- to be an untrustworthy indicator of file existence. It will cause
- ELOOP to be triggered one level sooner in the case of cyclical
- symbolic links.
-* `silent` When an unusual error is encountered
- when attempting to read a directory, a warning will be printed to
- stderr. Set the `silent` option to true to suppress these warnings.
-* `strict` When an unusual error is encountered
- when attempting to read a directory, the process will just continue on
- in search of other matches. Set the `strict` option to raise an error
- in these cases.
+ to be an untrustworthy indicator of file existence.
+* `silent` When an unusual error is encountered when attempting to
+ read a directory, a warning will be printed to stderr. Set the
+ `silent` option to true to suppress these warnings.
+* `strict` When an unusual error is encountered when attempting to
+ read a directory, the process will just continue on in search of
+ other matches. Set the `strict` option to raise an error in these
+ cases.
* `cache` See `cache` property above. Pass in a previously generated
cache object to save some fs calls.
* `statCache` A cache of results of filesystem information, to prevent
- unnecessary stat calls. While it should not normally be necessary to
- set this, you may pass the statCache from one glob() call to the
+ unnecessary stat calls. While it should not normally be necessary
+ to set this, you may pass the statCache from one glob() call to the
options object of another, if you know that the filesystem will not
change between calls. (See "Race Conditions" below.)
+* `symlinks` A cache of known symbolic links. You may pass in a
+ previously generated `symlinks` object to save `lstat` calls when
+ resolving `**` matches.
* `sync` Perform a synchronous glob search.
* `nounique` In some cases, brace-expanded patterns can result in the
same file showing up multiple times in the result set. By default,
- this implementation prevents duplicates in the result set.
- Set this flag to disable that behavior.
+ this implementation prevents duplicates in the result set. Set this
+ flag to disable that behavior.
* `nonull` Set to never return an empty set, instead returning a set
containing the pattern itself. This is the default in glob(3).
-* `nocase` Perform a case-insensitive match. Note that case-insensitive
- filesystems will sometimes result in glob returning results that are
- case-insensitively matched anyway, since readdir and stat will not
- raise an error.
+* `nocase` Perform a case-insensitive match. Note that
+ case-insensitive filesystems will sometimes result in glob returning
+ results that are case-insensitively matched anyway, since readdir
+ and stat will not raise an error.
* `debug` Set to enable debug logging in minimatch and glob.
-* `globDebug` Set to enable debug logging in glob, but not minimatch.
+* `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets.
+* `noglobstar` Do not match `**` against multiple filenames. (Ie,
+ treat it as a normal `*` instead.)
+* `noext` Do not match `+(a|b)` "extglob" patterns.
+* `nocase` Perform a case-insensitive match. Note: on
+ case-insensitive filesystems, non-magic patterns will match by
+ default, since `stat` and `readdir` will not raise errors.
+* `matchBase` Perform a basename-only match if the pattern does not
+ contain any slash characters. That is, `*.js` would be treated as
+ equivalent to `**/*.js`, matching all js files in all directories.
+* `nonegate` Suppress `negate` behavior. (See below.)
+* `nocomment` Suppress `comment` behavior. (See below.)
+* `nonull` Return the pattern when no matches are found.
+* `nodir` Do not match directories, only files.
## Comparisons to other fnmatch/glob implementations
@@ -192,10 +288,14 @@ start of a line, or set the `nocomment` flag to suppress this behavior.
The double-star character `**` is supported by default, unless the
`noglobstar` flag is set. This is supported in the manner of bsdglob
-and bash 4.1, where `**` only has special significance if it is the only
+and bash 4.3, where `**` only has special significance if it is the only
thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but
`a/**b` will not.
+Note that symlinked directories are not crawled as part of a `**`,
+though their contents may match against subsequent portions of the
+pattern. This prevents infinite loops and duplicates and the like.
+
If an escaped pattern has no matches, and the `nonull` flag is set,
then glob returns the pattern as-provided, rather than
interpreting the character escapes. For example,
@@ -239,3 +339,23 @@ calls.
Users are thus advised not to use a glob result as a guarantee of
filesystem state in the face of rapid changes. For the vast majority
of operations, this is never a problem.
+
+## Contributing
+
+Any change to behavior (including bugfixes) must come with a test.
+
+Patches that fail tests or reduce performance will be rejected.
+
+```
+# to run tests
+npm test
+
+# to re-generate test fixtures
+npm run test-regen
+
+# to benchmark against bash/zsh
+npm run bench
+
+# to profile javascript
+npm run prof
+```
diff --git a/deps/npm/node_modules/glob/common.js b/deps/npm/node_modules/glob/common.js
new file mode 100644
index 0000000..610d124
--- /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 be122df..0000000
--- 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 327a425..0000000
--- 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 564f3b1..8c99078 100644
--- a/deps/npm/node_modules/glob/glob.js
+++ b/deps/npm/node_modules/glob/glob.js
@@ -1,24 +1,30 @@
// Approach:
//
// 1. Get the minimatch set
-// 2. For each pattern in the set, PROCESS(pattern)
+// 2. For each pattern in the set, PROCESS(pattern, false)
// 3. Store matches per-set, then uniq them
//
-// PROCESS(pattern)
+// PROCESS(pattern, inGlobStar)
// Get the first [n] items from pattern that are all strings
// Join these together. This is PREFIX.
// If there is no more remaining, then stat(PREFIX) and
// add to matches if it succeeds. END.
-// readdir(PREFIX) as ENTRIES
-// If fails, END
+//
+// If inGlobStar and PREFIX is symlink and points to dir
+// set ENTRIES = []
+// else readdir(PREFIX) as ENTRIES
+// If fail, END
+//
+// with ENTRIES
// If pattern[n] is GLOBSTAR
// // handle the case where the globstar match is empty
// // by pruning it out, and testing the resulting pattern
-// PROCESS(pattern[0..n] + pattern[n+1 .. $])
+// PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
// // handle other cases.
// for ENTRY in ENTRIES (not dotfiles)
// // attach globstar + tail onto the entry
-// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $])
+// // Mark that this entry is a globstar match
+// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
//
// else // not globstar
// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
@@ -32,146 +38,80 @@
// `true` for files, and [children,...] for directories, or `false` for
// things that don't exist.
-
-
module.exports = glob
-var fs = require("graceful-fs")
-, minimatch = require("minimatch")
-, Minimatch = minimatch.Minimatch
-, inherits = require("inherits")
-, EE = require("events").EventEmitter
-, path = require("path")
-, isDir = {}
-, assert = require("assert").ok
-, once = require("once")
+var fs = require("fs")
+var minimatch = require("minimatch")
+var Minimatch = minimatch.Minimatch
+var inherits = require("inherits")
+var EE = require("events").EventEmitter
+var path = require("path")
+var assert = require("assert")
+var globSync = require("./sync.js")
+var common = require("./common.js")
+var alphasort = common.alphasort
+var isAbsolute = common.isAbsolute
+var setopts = common.setopts
+var ownProp = common.ownProp
+var inflight = require("inflight")
+var util = require("util")
+
+var once = require("once")
function glob (pattern, options, cb) {
if (typeof options === "function") cb = options, options = {}
if (!options) options = {}
- if (typeof options === "number") {
- deprecated()
- return
+ if (options.sync) {
+ if (cb)
+ throw new TypeError('callback provided to sync glob')
+ return globSync(pattern, options)
}
- var g = new Glob(pattern, options, cb)
- return g.sync ? g.found : g
+ return new Glob(pattern, options, cb)
}
-glob.fnmatch = deprecated
+glob.sync = globSync
+var GlobSync = glob.GlobSync = globSync.GlobSync
-function deprecated () {
- throw new Error("glob's interface has changed. Please see the docs.")
-}
+// old api surface
+glob.glob = glob
-glob.sync = globSync
-function globSync (pattern, options) {
- if (typeof options === "number") {
- deprecated()
- return
+glob.hasMagic = function (pattern, options_) {
+ var options = util._extend({}, options_)
+ options.noprocess = true
+
+ var g = new Glob(pattern, options)
+ var set = g.minimatch.set
+ if (set.length > 1)
+ return true
+
+ for (var j = 0; j < set[0].length; j++) {
+ if (typeof set[0][j] !== 'string')
+ return true
}
- options = options || {}
- options.sync = true
- return glob(pattern, options)
+ return false
}
-this._processingEmitQueue = false
-
glob.Glob = Glob
inherits(Glob, EE)
function Glob (pattern, options, cb) {
- if (!(this instanceof Glob)) {
- return new Glob(pattern, options, cb)
- }
-
if (typeof options === "function") {
cb = options
options = null
}
- if (typeof cb === "function") {
- cb = once(cb)
- this.on("error", cb)
- this.on("end", function (matches) {
- cb(null, matches)
- })
- }
-
- options = options || {}
-
- this._endEmitted = false
- this.EOF = {}
- this._emitQueue = []
-
- this.paused = false
- this._processingEmitQueue = false
-
- this.maxDepth = options.maxDepth || 1000
- this.maxLength = options.maxLength || Infinity
- this.cache = options.cache || {}
- this.statCache = options.statCache || {}
-
- this.changedCwd = false
- var cwd = process.cwd()
- if (!options.hasOwnProperty("cwd")) this.cwd = cwd
- else {
- this.cwd = options.cwd
- this.changedCwd = path.resolve(options.cwd) !== cwd
- }
-
- this.root = options.root || path.resolve(this.cwd, "/")
- this.root = path.resolve(this.root)
- if (process.platform === "win32")
- this.root = this.root.replace(/\\/g, "/")
-
- this.nomount = !!options.nomount
-
- if (!pattern) {
- throw new Error("must provide pattern")
- }
-
- // base-matching: just use globstar for that.
- if (options.matchBase && -1 === pattern.indexOf("/")) {
- if (options.noglobstar) {
- throw new Error("base matching requires globstar")
- }
- pattern = "**/" + pattern
+ if (options && options.sync) {
+ if (cb)
+ throw new TypeError('callback provided to sync glob')
+ return new GlobSync(pattern, options)
}
- this.strict = options.strict !== false
- this.dot = !!options.dot
- this.mark = !!options.mark
- this.sync = !!options.sync
- this.nounique = !!options.nounique
- this.nonull = !!options.nonull
- this.nosort = !!options.nosort
- this.nocase = !!options.nocase
- this.stat = !!options.stat
-
- this.debug = !!options.debug || !!options.globDebug
-
- if (/\bglob\b/.test(process.env.NODE_DEBUG || ''))
- this.debug = true
-
- if (this.debug)
- this.log = console.error
-
- this.silent = !!options.silent
-
- var mm = this.minimatch = new Minimatch(pattern, options)
- this.options = mm.options
- pattern = this.pattern = mm.pattern
-
- this.error = null
- this.aborted = false
-
- // list of all the patterns that ** has resolved do, so
- // we can avoid visiting multiple times.
- this._globstars = {}
+ if (!(this instanceof Glob))
+ return new Glob(pattern, options, cb)
- EE.call(this)
+ setopts(this, pattern, options)
// process each pattern in the minimatch set
var n = this.minimatch.set.length
@@ -182,93 +122,56 @@ function Glob (pattern, options, cb) {
// Keep them as a list so we can fill in when nonull is set.
this.matches = new Array(n)
- if (this.minimatch.set.length === 0) {
- return process.nextTick(this._finish.bind(this))
- }
-
- this.minimatch.set.forEach(iterator.bind(this))
- function iterator (pattern, i, set) {
- this._process(pattern, 0, i, function (er) {
- if (er) this.emit("error", er)
- if (-- n <= 0) this._finish()
+ if (typeof cb === "function") {
+ cb = once(cb)
+ this.on("error", cb)
+ this.on("end", function (matches) {
+ cb(null, matches)
})
}
-}
-Glob.prototype.log = function () {}
+ var self = this
+ var n = this.minimatch.set.length
+ this._processing = 0
+ this.matches = new Array(n)
-Glob.prototype._finish = function () {
- assert(this instanceof Glob)
+ this._emitQueue = []
+ this._processQueue = []
+ this.paused = false
- var nou = this.nounique
- , all = nou ? [] : {}
-
- for (var i = 0, l = this.matches.length; i < l; i ++) {
- var matches = this.matches[i]
- this.log("matches[%d] =", i, matches)
- // do like the shell, and spit out the literal glob
- if (!matches) {
- if (this.nonull) {
- var literal = this.minimatch.globSet[i]
- if (nou) all.push(literal)
- else all[literal] = true
- }
- } else {
- // had matches
- var m = Object.keys(matches)
- if (nou) all.push.apply(all, m)
- else m.forEach(function (m) {
- all[m] = true
- })
- }
- }
+ if (this.noprocess)
+ return this
- if (!nou) all = Object.keys(all)
+ if (n === 0)
+ return done()
- if (!this.nosort) {
- all = all.sort(this.nocase ? alphasorti : alphasort)
+ for (var i = 0; i < n; i ++) {
+ this._process(this.minimatch.set[i], i, false, done)
}
- if (this.mark) {
- // at *some* point we statted all of these
- all = all.map(this._mark, this)
+ function done () {
+ --self._processing
+ if (self._processing <= 0)
+ self._finish()
}
-
- this.log("emitting end", all)
-
- this.EOF = this.found = all
- this.emitMatch(this.EOF)
}
-function alphasorti (a, b) {
- a = a.toLowerCase()
- b = b.toLowerCase()
- return alphasort(a, b)
-}
+Glob.prototype._finish = function () {
+ assert(this instanceof Glob)
+ if (this.aborted)
+ return
-function alphasort (a, b) {
- return a > b ? 1 : a < b ? -1 : 0
+ //console.error('FINISH', this.matches)
+ common.finish(this)
+ this.emit("end", this.found)
}
Glob.prototype._mark = function (p) {
- var c = this.cache[p]
- var m = p
- if (c) {
- var isDir = c === 2 || Array.isArray(c)
- var slash = p.slice(-1) === '/'
-
- if (isDir && !slash)
- m += '/'
- else if (!isDir && slash)
- m = m.slice(0, -1)
-
- if (m !== p) {
- this.statCache[m] = this.statCache[p]
- this.cache[m] = this.cache[p]
- }
- }
+ return common.mark(this, p)
+}
- return m
+Glob.prototype._makeAbs = function (f) {
+ return common.makeAbs(this, f)
}
Glob.prototype.abort = function () {
@@ -277,111 +180,50 @@ Glob.prototype.abort = function () {
}
Glob.prototype.pause = function () {
- if (this.paused) return
- if (this.sync)
- this.emit("error", new Error("Can't pause/resume sync glob"))
- this.paused = true
- this.emit("pause")
+ if (!this.paused) {
+ this.paused = true
+ this.emit("pause")
+ }
}
Glob.prototype.resume = function () {
- if (!this.paused) return
- if (this.sync)
- this.emit("error", new Error("Can't pause/resume sync glob"))
- this.paused = false
- this.emit("resume")
- this._processEmitQueue()
- //process.nextTick(this.emit.bind(this, "resume"))
-}
-
-Glob.prototype.emitMatch = function (m) {
- this.log('emitMatch', m)
- this._emitQueue.push(m)
- this._processEmitQueue()
-}
-
-Glob.prototype._processEmitQueue = function (m) {
- this.log("pEQ paused=%j processing=%j m=%j", this.paused,
- this._processingEmitQueue, m)
- var done = false
- while (!this._processingEmitQueue &&
- !this.paused) {
- this._processingEmitQueue = true
- var m = this._emitQueue.shift()
- this.log(">processEmitQueue", m === this.EOF ? ":EOF:" : m)
- if (!m) {
- this.log(">processEmitQueue, falsey m")
- this._processingEmitQueue = false
- break
- }
-
- if (m === this.EOF || !(this.mark && !this.stat)) {
- this.log("peq: unmarked, or eof")
- next.call(this, 0, false)
- } else if (this.statCache[m]) {
- var sc = this.statCache[m]
- var exists
- if (sc)
- exists = sc.isDirectory() ? 2 : 1
- this.log("peq: stat cached")
- next.call(this, exists, exists === 2)
- } else {
- this.log("peq: _stat, then next")
- this._stat(m, next)
+ if (this.paused) {
+ this.emit("resume")
+ this.paused = false
+ if (this._emitQueue.length) {
+ var eq = this._emitQueue.slice(0)
+ this._emitQueue.length = 0
+ for (var i = 0; i < eq.length; i ++) {
+ var e = eq[i]
+ this._emitMatch(e[0], e[1])
+ }
}
- }
- done = true
-
- function next(exists, isDir) {
- this.log("next", m, exists, isDir)
- var ev = m === this.EOF ? "end" : "match"
-
- // "end" can only happen once.
- assert(!this._endEmitted)
- if (ev === "end")
- this._endEmitted = true
-
- if (exists) {
- // Doesn't mean it necessarily doesn't exist, it's possible
- // we just didn't check because we don't care that much, or
- // this is EOF anyway.
- if (isDir && !m.match(/\/$/)) {
- m = m + "/"
- } else if (!isDir && m.match(/\/$/)) {
- m = m.replace(/\/+$/, "")
+ if (this._processQueue.length) {
+ var pq = this._processQueue.slice(0)
+ this._processQueue.length = 0
+ for (var i = 0; i < pq.length; i ++) {
+ var p = pq[i]
+ this._processing--
+ this._process(p[0], p[1], p[2], p[3])
}
}
- this.log("emit", ev, m)
- this.emit(ev, m)
- this._processingEmitQueue = false
- if (done && m !== this.EOF && !this.paused)
- this._processEmitQueue()
}
}
-Glob.prototype._process = function (pattern, depth, index, cb_) {
+Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
assert(this instanceof Glob)
+ assert(typeof cb === 'function')
- var cb = function cb (er, res) {
- assert(this instanceof Glob)
- if (this.paused) {
- if (!this._processQueue) {
- this._processQueue = []
- this.once("resume", function () {
- var q = this._processQueue
- this._processQueue = null
- q.forEach(function (cb) { cb() })
- })
- }
- this._processQueue.push(cb_.bind(this, er, res))
- } else {
- cb_.call(this, er, res)
- }
- }.bind(this)
+ if (this.aborted)
+ return
- if (this.aborted) return cb()
+ this._processing++
+ if (this.paused) {
+ this._processQueue.push([pattern, index, inGlobStar, cb])
+ return
+ }
- if (depth > this.maxDepth) return cb()
+ //console.error("PROCESS %d", this._processing, pattern)
// Get the first [n] parts of pattern that are all strings.
var n = 0
@@ -395,28 +237,7 @@ Glob.prototype._process = function (pattern, depth, index, cb_) {
switch (n) {
// if not, then this is rather simple
case pattern.length:
- prefix = pattern.join("/")
- this._stat(prefix, function (exists, isDir) {
- // either it's there, or it isn't.
- // nothing more to do, either way.
- if (exists) {
- if (prefix && isAbsolute(prefix) && !this.nomount) {
- if (prefix.charAt(0) === "/") {
- prefix = path.join(this.root, prefix)
- } else {
- prefix = path.resolve(this.root, prefix)
- }
- }
-
- if (process.platform === "win32")
- prefix = prefix.replace(/\\/g, "/")
-
- this.matches[index] = this.matches[index] || {}
- this.matches[index][prefix] = true
- this.emitMatch(prefix)
- }
- return cb()
- })
+ this._processSimple(pattern.join('/'), index, cb)
return
case 0:
@@ -429,318 +250,399 @@ Glob.prototype._process = function (pattern, depth, index, cb_) {
// pattern has some string bits in the front.
// whatever it starts with, whether that's "absolute" like /foo/bar,
// or "relative" like "../baz"
- prefix = pattern.slice(0, n)
- prefix = prefix.join("/")
+ prefix = pattern.slice(0, n).join("/")
break
}
+ var remain = pattern.slice(n)
+
// get the list of entries.
var read
- if (prefix === null) read = "."
+ if (prefix === null)
+ read = "."
else if (isAbsolute(prefix) || isAbsolute(pattern.join("/"))) {
- if (!prefix || !isAbsolute(prefix)) {
+ if (!prefix || !isAbsolute(prefix))
prefix = "/" + prefix
- }
+ read = prefix
+ } else
read = prefix
- // if (process.platform === "win32")
- // read = prefix = prefix.replace(/^[a-zA-Z]:|\\/g, "/")
+ var abs = this._makeAbs(read)
- this.log('absolute: ', prefix, this.root, pattern, read)
- } else {
- read = prefix
- }
+ var isGlobStar = remain[0] === minimatch.GLOBSTAR
+ if (isGlobStar)
+ this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
+ else
+ this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
+}
- this.log('readdir(%j)', read, this.cwd, this.root)
- return this._readdir(read, function (er, entries) {
- if (er) {
- // not a directory!
- // this means that, whatever else comes after this, it can never match
- return cb()
+Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
+ var self = this
+ this._readdir(abs, inGlobStar, function (er, entries) {
+ return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
+ })
+}
+
+Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
+
+ // if the abs isn't a dir, then nothing can match!
+ if (!entries)
+ return cb()
+
+ // It will only match dot entries if it starts with a dot, or if
+ // dot is set. Stuff like @(.foo|.bar) isn't allowed.
+ var pn = remain[0]
+ var negate = !!this.minimatch.negate
+ var rawGlob = pn._glob
+ var dotOk = this.dot || rawGlob.charAt(0) === "."
+
+ var matchedEntries = []
+ for (var i = 0; i < entries.length; i++) {
+ var e = entries[i]
+ if (e.charAt(0) !== "." || dotOk) {
+ var m
+ if (negate && !prefix) {
+ m = !e.match(pn)
+ } else {
+ m = e.match(pn)
+ }
+ if (m)
+ matchedEntries.push(e)
}
+ }
- // globstar is special
- if (pattern[n] === minimatch.GLOBSTAR) {
- // test without the globstar, and with every child both below
- // and replacing the globstar.
- var s = [ pattern.slice(0, n).concat(pattern.slice(n + 1)) ]
- entries.forEach(function (e) {
- if (e.charAt(0) === "." && !this.dot) return
- // instead of the globstar
- s.push(pattern.slice(0, n).concat(e).concat(pattern.slice(n + 1)))
- // below the globstar
- s.push(pattern.slice(0, n).concat(e).concat(pattern.slice(n)))
- }, this)
-
- s = s.filter(function (pattern) {
- var key = gsKey(pattern)
- var seen = !this._globstars[key]
- this._globstars[key] = true
- return seen
- }, this)
-
- if (!s.length)
- return cb()
-
- // now asyncForEach over this
- var l = s.length
- , errState = null
- s.forEach(function (gsPattern) {
- this._process(gsPattern, depth + 1, index, function (er) {
- if (errState) return
- if (er) return cb(errState = er)
- if (--l <= 0) return cb()
- })
- }, this)
+ //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)
+
+ var len = matchedEntries.length
+ // If there are no matched entries, then nothing matches.
+ if (len === 0)
+ return cb()
+
+ // if this is the last remaining pattern bit, then no need for
+ // an additional stat *unless* the user has specified mark or
+ // stat explicitly. We know they exist, since readdir returned
+ // them.
+
+ if (remain.length === 1 && !this.mark && !this.stat) {
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null)
+
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i]
+ if (prefix) {
+ if (prefix !== "/")
+ e = prefix + "/" + e
+ else
+ e = prefix + e
+ }
- return
+ if (e.charAt(0) === "/" && !this.nomount) {
+ e = path.join(this.root, e)
+ }
+ this._emitMatch(index, e)
}
+ // This was the last one, and no stats were needed
+ return cb()
+ }
- // not a globstar
- // It will only match dot entries if it starts with a dot, or if
- // dot is set. Stuff like @(.foo|.bar) isn't allowed.
- var pn = pattern[n]
- var negate = !!this.minimatch.negate;
- var rawGlob = pattern[n]._glob
- , dotOk = this.dot || rawGlob.charAt(0) === "."
-
- entries = entries.filter(function (e) {
- if (e.charAt(0) !== "." || dotOk) {
- if (negate && n === 0) {
- return !e.match(pattern[n]);
- } else {
- return e.match(pattern[n]);
- }
- }
+ // now test all matched entries as stand-ins for that part
+ // of the pattern.
+ remain.shift()
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i]
+ var newPattern
+ if (prefix) {
+ if (prefix !== "/")
+ e = prefix + "/" + e
+ else
+ e = prefix + e
+ }
+ this._process([e].concat(remain), index, inGlobStar, cb)
+ }
+ cb()
+}
- return null;
- })
+Glob.prototype._emitMatch = function (index, e) {
+ if (this.aborted)
+ return
- // If n === pattern.length - 1, then there's no need for the extra stat
- // *unless* the user has specified "mark" or "stat" explicitly.
- // We know that they exist, since the readdir returned them.
- if (n === pattern.length - 1 &&
- !this.mark &&
- !this.stat) {
- entries.forEach(function (e) {
- if (prefix) {
- if (prefix !== "/") e = prefix + "/" + e
- else e = prefix + e
- }
- if (e.charAt(0) === "/" && !this.nomount) {
- e = path.join(this.root, e)
- }
-
- if (process.platform === "win32")
- e = e.replace(/\\/g, "/")
-
- this.matches[index] = this.matches[index] || {}
- this.matches[index][e] = true
- this.emitMatch(e)
- }, this)
- return cb.call(this)
+ if (!this.matches[index][e]) {
+ if (this.paused) {
+ this._emitQueue.push([index, e])
+ return
}
+ if (this.nodir) {
+ var c = this.cache[this._makeAbs(e)]
+ if (c === 'DIR' || Array.isArray(c))
+ return
+ }
- // now test all the remaining entries as stand-ins for that part
- // of the pattern.
- var l = entries.length
- , errState = null
- if (l === 0) return cb() // no matches possible
- entries.forEach(function (e) {
- var p = pattern.slice(0, n).concat(e).concat(pattern.slice(n + 1))
- this._process(p, depth + 1, index, function (er) {
- if (errState) return
- if (er) return cb(errState = er)
- if (--l === 0) return cb.call(this)
- })
- }, this)
- })
+ this.matches[index][e] = true
+ if (!this.stat && !this.mark)
+ return this.emit("match", e)
+ var self = this
+ this._stat(this._makeAbs(e), function (er, c, st) {
+ self.emit("stat", e, st)
+ self.emit("match", e)
+ })
+ }
}
-function gsKey (pattern) {
- return '**' + pattern.map(function (p) {
- return (p === minimatch.GLOBSTAR) ? '**' : (''+p)
- }).join('/')
-}
+Glob.prototype._readdirInGlobStar = function (abs, cb) {
+ if (this.aborted)
+ return
-Glob.prototype._stat = function (f, cb) {
- assert(this instanceof Glob)
- var abs = f
- if (f.charAt(0) === "/") {
- abs = path.join(this.root, f)
- } else if (this.changedCwd) {
- abs = path.resolve(this.cwd, f)
- }
+ var lstatkey = "lstat\0" + abs
+ var self = this
+ var lstatcb = inflight(lstatkey, lstatcb_)
- if (f.length > this.maxLength) {
- var er = new Error("Path name too long")
- er.code = "ENAMETOOLONG"
- er.path = f
- return this._afterStat(f, abs, cb, er)
- }
+ if (lstatcb)
+ fs.lstat(abs, lstatcb)
- this.log('stat', [this.cwd, f, '=', abs])
+ function lstatcb_ (er, lstat) {
+ if (er)
+ return cb()
- if (!this.stat && this.cache.hasOwnProperty(f)) {
- var exists = this.cache[f]
- , isDir = exists && (Array.isArray(exists) || exists === 2)
- if (this.sync) return cb.call(this, !!exists, isDir)
- return process.nextTick(cb.bind(this, !!exists, isDir))
- }
+ var isSym = lstat.isSymbolicLink()
+ self.symlinks[abs] = isSym
- var stat = this.statCache[abs]
- if (this.sync || stat) {
- var er
- try {
- stat = fs.statSync(abs)
- } catch (e) {
- er = e
- }
- this._afterStat(f, abs, cb, er, stat)
- } else {
- fs.stat(abs, this._afterStat.bind(this, f, abs, cb))
+ // If it's not a symlink or a dir, then it's definitely a regular file.
+ // don't bother doing a readdir in that case.
+ if (!isSym && !lstat.isDirectory()) {
+ self.cache[abs] = 'FILE'
+ cb()
+ } else
+ self._readdir(abs, false, cb)
}
}
-Glob.prototype._afterStat = function (f, abs, cb, er, stat) {
- var exists
- assert(this instanceof Glob)
+Glob.prototype._readdir = function (abs, inGlobStar, cb) {
+ if (this.aborted)
+ return
- if (abs.slice(-1) === "/" && stat && !stat.isDirectory()) {
- this.log("should be ENOTDIR, fake it")
+ cb = inflight("readdir\0"+abs+"\0"+inGlobStar, cb)
+ if (!cb)
+ return
- er = new Error("ENOTDIR, not a directory '" + abs + "'")
- er.path = abs
- er.code = "ENOTDIR"
- stat = null
- }
+ //console.error("RD %j %j", +inGlobStar, abs)
+ if (inGlobStar && !ownProp(this.symlinks, abs))
+ return this._readdirInGlobStar(abs, cb)
- var emit = !this.statCache[abs]
- this.statCache[abs] = stat
+ if (ownProp(this.cache, abs)) {
+ var c = this.cache[abs]
+ if (!c || c === 'FILE')
+ return cb()
- if (er || !stat) {
- exists = false
- } else {
- exists = stat.isDirectory() ? 2 : 1
- if (emit)
- this.emit('stat', f, stat)
+ if (Array.isArray(c))
+ return cb(null, c)
}
- this.cache[f] = this.cache[f] || exists
- cb.call(this, !!exists, exists === 2)
-}
-Glob.prototype._readdir = function (f, cb) {
- assert(this instanceof Glob)
- var abs = f
- if (f.charAt(0) === "/") {
- abs = path.join(this.root, f)
- } else if (isAbsolute(f)) {
- abs = f
- } else if (this.changedCwd) {
- abs = path.resolve(this.cwd, f)
- }
+ var self = this
+ fs.readdir(abs, readdirCb(this, abs, cb))
+}
- if (f.length > this.maxLength) {
- var er = new Error("Path name too long")
- er.code = "ENAMETOOLONG"
- er.path = f
- return this._afterReaddir(f, abs, cb, er)
+function readdirCb (self, abs, cb) {
+ return function (er, entries) {
+ if (er)
+ self._readdirError(abs, er, cb)
+ else
+ self._readdirEntries(abs, entries.sort(alphasort), cb)
}
+}
- this.log('readdir', [this.cwd, f, abs])
- if (this.cache.hasOwnProperty(f)) {
- var c = this.cache[f]
- if (Array.isArray(c)) {
- if (this.sync) return cb.call(this, null, c)
- return process.nextTick(cb.bind(this, null, c))
- }
-
- if (!c || c === 1) {
- // either ENOENT or ENOTDIR
- var code = c ? "ENOTDIR" : "ENOENT"
- , er = new Error((c ? "Not a directory" : "Not found") + ": " + f)
- er.path = f
- er.code = code
- this.log(f, er)
- if (this.sync) return cb.call(this, er)
- return process.nextTick(cb.bind(this, er))
- }
-
- // at this point, c === 2, meaning it's a dir, but we haven't
- // had to read it yet, or c === true, meaning it's *something*
- // but we don't have any idea what. Need to read it, either way.
- }
+Glob.prototype._readdirEntries = function (abs, entries, cb) {
+ if (this.aborted)
+ return
- if (this.sync) {
- var er, entries
- try {
- entries = fs.readdirSync(abs)
- } catch (e) {
- er = e
+ // if we haven't asked to stat everything, then just
+ // assume that everything in there exists, so we can avoid
+ // having to stat it a second time.
+ if (!this.mark && !this.stat) {
+ for (var i = 0; i < entries.length; i ++) {
+ var e = entries[i]
+ if (abs === "/")
+ e = abs + e
+ else
+ e = abs + "/" + e
+ this.cache[e] = true
}
- return this._afterReaddir(f, abs, cb, er, entries)
}
- fs.readdir(abs, this._afterReaddir.bind(this, f, abs, cb))
+ this.cache[abs] = entries
+ return cb(null, entries)
}
-Glob.prototype._afterReaddir = function (f, abs, cb, er, entries) {
- assert(this instanceof Glob)
- if (entries && !er) {
- this.cache[f] = entries
- // if we haven't asked to stat everything for suresies, then just
- // assume that everything in there exists, so we can avoid
- // having to stat it a second time. This also gets us one step
- // further into ELOOP territory.
- if (!this.mark && !this.stat) {
- entries.forEach(function (e) {
- if (f === "/") e = f + e
- else e = f + "/" + e
- this.cache[e] = true
- }, this)
- }
-
- return cb.call(this, er, entries)
- }
+Glob.prototype._readdirError = function (f, er, cb) {
+ if (this.aborted)
+ return
- // now handle errors, and cache the information
- if (er) switch (er.code) {
+ // handle errors, and cache the information
+ switch (er.code) {
case "ENOTDIR": // totally normal. means it *does* exist.
- this.cache[f] = 1
- return cb.call(this, er)
+ this.cache[f] = 'FILE'
+ break
+
case "ENOENT": // not terribly unusual
case "ELOOP":
case "ENAMETOOLONG":
case "UNKNOWN":
this.cache[f] = false
- return cb.call(this, er)
+ break
+
default: // some unusual error. Treat as failure.
this.cache[f] = false
- if (this.strict) this.emit("error", er)
+ if (this.strict) return this.emit("error", er)
if (!this.silent) console.error("glob error", er)
- return cb.call(this, er)
+ break
}
+ return cb()
}
-var isAbsolute = process.platform === "win32" ? absWin : absUnix
+Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
+ var self = this
+ this._readdir(abs, inGlobStar, function (er, entries) {
+ self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
+ })
+}
+
+
+Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
+ //console.error("pgs2", prefix, remain[0], entries)
+
+ // no entries means not a dir, so it can never have matches
+ // foo.txt/** doesn't match foo.txt
+ if (!entries)
+ return cb()
+
+ // test without the globstar, and with every child both below
+ // and replacing the globstar.
+ var remainWithoutGlobStar = remain.slice(1)
+ var gspref = prefix ? [ prefix ] : []
+ var noGlobStar = gspref.concat(remainWithoutGlobStar)
+
+ // the noGlobStar pattern exits the inGlobStar state
+ this._process(noGlobStar, index, false, cb)
-function absWin (p) {
- if (absUnix(p)) return true
- // pull off the device/UNC bit from a windows path.
- // from node's lib/path.js
- var splitDeviceRe =
- /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/
- , result = splitDeviceRe.exec(p)
- , device = result[1] || ''
- , isUnc = device && device.charAt(1) !== ':'
- , isAbsolute = !!result[2] || isUnc // UNC paths are always absolute
+ var isSym = this.symlinks[abs]
+ var len = entries.length
- return isAbsolute
+ // If it's a symlink, and we're in a globstar, then stop
+ if (isSym && inGlobStar)
+ return cb()
+
+ for (var i = 0; i < len; i++) {
+ var e = entries[i]
+ if (e.charAt(0) === "." && !this.dot)
+ continue
+
+ // these two cases enter the inGlobStar state
+ var instead = gspref.concat(entries[i], remainWithoutGlobStar)
+ this._process(instead, index, true, cb)
+
+ var below = gspref.concat(entries[i], remain)
+ this._process(below, index, true, cb)
+ }
+
+ cb()
}
-function absUnix (p) {
- return p.charAt(0) === "/" || p === ""
+Glob.prototype._processSimple = function (prefix, index, cb) {
+ // XXX review this. Shouldn't it be doing the mounting etc
+ // before doing stat? kinda weird?
+ var self = this
+ this._stat(prefix, function (er, exists) {
+ self._processSimple2(prefix, index, er, exists, cb)
+ })
+}
+Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {
+
+ //console.error("ps2", prefix, exists)
+
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null)
+
+ // If it doesn't exist, then just mark the lack of results
+ if (!exists)
+ return cb()
+
+ if (prefix && isAbsolute(prefix) && !this.nomount) {
+ var trail = /[\/\\]$/.test(prefix)
+ if (prefix.charAt(0) === "/") {
+ prefix = path.join(this.root, prefix)
+ } else {
+ prefix = path.resolve(this.root, prefix)
+ if (trail)
+ prefix += '/'
+ }
+ }
+
+ if (process.platform === "win32")
+ prefix = prefix.replace(/\\/g, "/")
+
+ // Mark this as a match
+ this._emitMatch(index, prefix)
+ cb()
+}
+
+// Returns either 'DIR', 'FILE', or false
+Glob.prototype._stat = function (f, cb) {
+ var abs = f
+ if (f.charAt(0) === "/")
+ abs = path.join(this.root, f)
+ else if (this.changedCwd)
+ abs = path.resolve(this.cwd, f)
+
+
+ if (f.length > this.maxLength)
+ return cb()
+
+ if (!this.stat && ownProp(this.cache, f)) {
+ var c = this.cache[f]
+
+ if (Array.isArray(c))
+ c = 'DIR'
+
+ // It exists, but not how we need it
+ if (abs.slice(-1) === "/" && c !== 'DIR')
+ return cb()
+
+ return cb(null, c)
+ }
+
+ var exists
+ var stat = this.statCache[abs]
+ if (stat !== undefined) {
+ if (stat === false)
+ return cb(null, stat)
+ else
+ return cb(null, stat.isDirectory() ? 'DIR' : 'FILE', stat)
+ }
+
+ var self = this
+ var statcb = inflight("stat\0" + abs, statcb_)
+ if (statcb)
+ fs.stat(abs, statcb)
+
+ function statcb_ (er, stat) {
+ self._stat2(f, abs, er, stat, cb)
+ }
+}
+
+Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
+ if (er) {
+ this.statCache[abs] = false
+ return cb()
+ }
+
+ this.statCache[abs] = stat
+
+ if (abs.slice(-1) === "/" && !stat.isDirectory())
+ return cb(null, false, stat)
+
+ var c = stat.isDirectory() ? 'DIR' : 'FILE'
+ this.cache[f] = this.cache[f] || c
+ return cb(null, c, stat)
}
diff --git a/deps/npm/node_modules/glob/oh-my-glob.gif b/deps/npm/node_modules/glob/oh-my-glob.gif
deleted file mode 100644
index a1568c13ca695563f97e3910e34f1a47d5657f4e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 510360
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