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. Start a package Restart a package 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 npm can restart multiple packages. Just specify multiple packages in
+the 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 This runs a package's "start" script, if one was provided. npm can run tests on multiple packages. Just specify multiple packages
-in the npm can start multiple packages. Just specify multiple packages in the
+ 2.1.6 2.1.18 This is the API documentation for npm.
To find documentation of the command line
@@ -109,5 +109,5 @@ npm
npm
SYNOPSIS
Other Sorts of Unices
paths, etc.) then read on.
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 @@
Fancy Install (Unix)
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 @@
Using npm Programmatically
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
Legal Stuff
assertion expressed or implied as to the quality, fitness for a
specific purpose, or lack of malice in any given npm package.
BUGS
npm-debug.log
file is also helpful to provide.SEE ALSO
-
+
diff --git a/deps/npm/html/doc/api/npm-bin.html b/deps/npm/html/doc/api/npm-bin.html
index a25612475695ce..6ca184d67268e2 100644
--- a/deps/npm/html/doc/api/npm-bin.html
+++ b/deps/npm/html/doc/api/npm-bin.html
@@ -28,5 +28,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-bugs.html b/deps/npm/html/doc/api/npm-bugs.html
index 9cf2cc4131fc22..07aafe2c725061 100644
--- a/deps/npm/html/doc/api/npm-bugs.html
+++ b/deps/npm/html/doc/api/npm-bugs.html
@@ -33,5 +33,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-cache.html b/deps/npm/html/doc/api/npm-cache.html
index 6dfc4a0e5cc3bf..77fb38f396c511 100644
--- a/deps/npm/html/doc/api/npm-cache.html
+++ b/deps/npm/html/doc/api/npm-cache.html
@@ -42,5 +42,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-commands.html b/deps/npm/html/doc/api/npm-commands.html
index 3f3ae544e99c43..98071c601aae18 100644
--- a/deps/npm/html/doc/api/npm-commands.html
+++ b/deps/npm/html/doc/api/npm-commands.html
@@ -36,5 +36,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/api/npm-config.html b/deps/npm/html/doc/api/npm-config.html
index 3767a46aca5fb8..f72789eef1e7b4 100644
--- a/deps/npm/html/doc/api/npm-config.html
+++ b/deps/npm/html/doc/api/npm-config.html
@@ -57,5 +57,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/api/npm-deprecate.html b/deps/npm/html/doc/api/npm-deprecate.html
index a235c2baa96a33..76381b99ee6f3a 100644
--- a/deps/npm/html/doc/api/npm-deprecate.html
+++ b/deps/npm/html/doc/api/npm-deprecate.html
@@ -47,5 +47,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/api/npm-docs.html b/deps/npm/html/doc/api/npm-docs.html
index 222b90e70a811a..08a9a712a3780f 100644
--- a/deps/npm/html/doc/api/npm-docs.html
+++ b/deps/npm/html/doc/api/npm-docs.html
@@ -33,5 +33,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-edit.html b/deps/npm/html/doc/api/npm-edit.html
index aa3d7bdb0ba566..ab9a7ede3399a3 100644
--- a/deps/npm/html/doc/api/npm-edit.html
+++ b/deps/npm/html/doc/api/npm-edit.html
@@ -36,5 +36,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-explore.html b/deps/npm/html/doc/api/npm-explore.html
index fbfd0cccc2d3ac..0c76406555a9d4 100644
--- a/deps/npm/html/doc/api/npm-explore.html
+++ b/deps/npm/html/doc/api/npm-explore.html
@@ -31,5 +31,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-help-search.html b/deps/npm/html/doc/api/npm-help-search.html
index 886d0c5acbe779..c1c4bb1b3abff7 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 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-init.html b/deps/npm/html/doc/api/npm-init.html
index 80b14a41df3b67..52fe45e073a003 100644
--- a/deps/npm/html/doc/api/npm-init.html
+++ b/deps/npm/html/doc/api/npm-init.html
@@ -39,5 +39,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/api/npm-install.html b/deps/npm/html/doc/api/npm-install.html
index 43cf4f166ff958..f0019130973dff 100644
--- a/deps/npm/html/doc/api/npm-install.html
+++ b/deps/npm/html/doc/api/npm-install.html
@@ -32,5 +32,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-link.html b/deps/npm/html/doc/api/npm-link.html
index c41a31c9b4b89c..ffc909cbb25ac2 100644
--- a/deps/npm/html/doc/api/npm-link.html
+++ b/deps/npm/html/doc/api/npm-link.html
@@ -42,5 +42,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-load.html b/deps/npm/html/doc/api/npm-load.html
index fbf22994f6d808..8a442887bb9657 100644
--- a/deps/npm/html/doc/api/npm-load.html
+++ b/deps/npm/html/doc/api/npm-load.html
@@ -37,5 +37,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-ls.html b/deps/npm/html/doc/api/npm-ls.html
index e221bab4a0f152..c74f8d5a63a24e 100644
--- a/deps/npm/html/doc/api/npm-ls.html
+++ b/deps/npm/html/doc/api/npm-ls.html
@@ -49,7 +49,7 @@ global
global
-
+
diff --git a/deps/npm/html/doc/api/npm-outdated.html b/deps/npm/html/doc/api/npm-outdated.html
index 91fafce32974f5..896bb241996101 100644
--- a/deps/npm/html/doc/api/npm-outdated.html
+++ b/deps/npm/html/doc/api/npm-outdated.html
@@ -28,5 +28,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-owner.html b/deps/npm/html/doc/api/npm-owner.html
index 878a9e59d865d8..02d19f331d6091 100644
--- a/deps/npm/html/doc/api/npm-owner.html
+++ b/deps/npm/html/doc/api/npm-owner.html
@@ -47,5 +47,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/api/npm-pack.html b/deps/npm/html/doc/api/npm-pack.html
index 1e146e41f4fb49..f1e21945d50820 100644
--- a/deps/npm/html/doc/api/npm-pack.html
+++ b/deps/npm/html/doc/api/npm-pack.html
@@ -33,5 +33,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-prefix.html b/deps/npm/html/doc/api/npm-prefix.html
index bd406009c5afc9..afe49dc11576af 100644
--- a/deps/npm/html/doc/api/npm-prefix.html
+++ b/deps/npm/html/doc/api/npm-prefix.html
@@ -29,5 +29,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-prune.html b/deps/npm/html/doc/api/npm-prune.html
index 0e446c26f588ea..dd783500dc547c 100644
--- a/deps/npm/html/doc/api/npm-prune.html
+++ b/deps/npm/html/doc/api/npm-prune.html
@@ -30,5 +30,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-publish.html b/deps/npm/html/doc/api/npm-publish.html
index 0e41c2ad0ef60c..1259ce0f75afdc 100644
--- a/deps/npm/html/doc/api/npm-publish.html
+++ b/deps/npm/html/doc/api/npm-publish.html
@@ -46,5 +46,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/api/npm-rebuild.html b/deps/npm/html/doc/api/npm-rebuild.html
index f5d2e6a6629b37..2461cd361ff72c 100644
--- a/deps/npm/html/doc/api/npm-rebuild.html
+++ b/deps/npm/html/doc/api/npm-rebuild.html
@@ -30,5 +30,5 @@ CONFIGURATION
-
+
diff --git a/deps/npm/html/doc/api/npm-repo.html b/deps/npm/html/doc/api/npm-repo.html
index 024e7279b76cdf..2364fb5b45a790 100644
--- a/deps/npm/html/doc/api/npm-repo.html
+++ b/deps/npm/html/doc/api/npm-repo.html
@@ -33,5 +33,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-restart.html b/deps/npm/html/doc/api/npm-restart.html
index 29d1a566708ff0..3c43780c976b4b 100644
--- a/deps/npm/html/doc/api/npm-restart.html
+++ b/deps/npm/html/doc/api/npm-restart.html
@@ -9,16 +9,32 @@
npm-restart
npm-restart
SYNOPSIS
npm.commands.restart(packages, callback)
DESCRIPTION
-
+
packages
parameter.packages
parameter.NOTE
+npm
major version 2. A change in this
+behavior will be accompanied by an increase in major version numberSEE ALSO
SEE ALSO
-
+
diff --git a/deps/npm/html/doc/api/npm-root.html b/deps/npm/html/doc/api/npm-root.html
index b639a33e7d8bba..071743e152768f 100644
--- a/deps/npm/html/doc/api/npm-root.html
+++ b/deps/npm/html/doc/api/npm-root.html
@@ -29,5 +29,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-run-script.html b/deps/npm/html/doc/api/npm-run-script.html
index 26707808009501..bc70d936d0e0e1 100644
--- a/deps/npm/html/doc/api/npm-run-script.html
+++ b/deps/npm/html/doc/api/npm-run-script.html
@@ -41,5 +41,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/api/npm-search.html b/deps/npm/html/doc/api/npm-search.html
index 903aa521eb59be..075e49c52da9b9 100644
--- a/deps/npm/html/doc/api/npm-search.html
+++ b/deps/npm/html/doc/api/npm-search.html
@@ -53,5 +53,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-shrinkwrap.html b/deps/npm/html/doc/api/npm-shrinkwrap.html
index eed523cdc5fcaa..cabe6195ee6472 100644
--- a/deps/npm/html/doc/api/npm-shrinkwrap.html
+++ b/deps/npm/html/doc/api/npm-shrinkwrap.html
@@ -33,5 +33,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-start.html b/deps/npm/html/doc/api/npm-start.html
index 23678bc9ec1e74..7c7586cce14de1 100644
--- a/deps/npm/html/doc/api/npm-start.html
+++ b/deps/npm/html/doc/api/npm-start.html
@@ -14,8 +14,8 @@ SYNOPSIS
npm.commands.start(packages, callback)
DESCRIPTION
packages
parameter.packages
parameter.SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-stop.html b/deps/npm/html/doc/api/npm-stop.html
index ed3b714f07985e..143a2f3eb1e997 100644
--- a/deps/npm/html/doc/api/npm-stop.html
+++ b/deps/npm/html/doc/api/npm-stop.html
@@ -28,5 +28,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-submodule.html b/deps/npm/html/doc/api/npm-submodule.html
index d70ee36d49f992..35364403c35ce4 100644
--- a/deps/npm/html/doc/api/npm-submodule.html
+++ b/deps/npm/html/doc/api/npm-submodule.html
@@ -42,5 +42,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/api/npm-tag.html b/deps/npm/html/doc/api/npm-tag.html
index b4a326161e1758..d7c188dbcdebee 100644
--- a/deps/npm/html/doc/api/npm-tag.html
+++ b/deps/npm/html/doc/api/npm-tag.html
@@ -36,5 +36,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-test.html b/deps/npm/html/doc/api/npm-test.html
index 78168084c2dfe1..fdda16c0ac297f 100644
--- a/deps/npm/html/doc/api/npm-test.html
+++ b/deps/npm/html/doc/api/npm-test.html
@@ -30,5 +30,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-uninstall.html b/deps/npm/html/doc/api/npm-uninstall.html
index 962ff879c3ddf9..690a1503ce6e4a 100644
--- a/deps/npm/html/doc/api/npm-uninstall.html
+++ b/deps/npm/html/doc/api/npm-uninstall.html
@@ -30,5 +30,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-unpublish.html b/deps/npm/html/doc/api/npm-unpublish.html
index 2b9a5c58f61bf7..ae2459a2d8ac3d 100644
--- a/deps/npm/html/doc/api/npm-unpublish.html
+++ b/deps/npm/html/doc/api/npm-unpublish.html
@@ -33,5 +33,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-update.html b/deps/npm/html/doc/api/npm-update.html
index f60e83de3f54ca..b9d4c410de7758 100644
--- a/deps/npm/html/doc/api/npm-update.html
+++ b/deps/npm/html/doc/api/npm-update.html
@@ -27,5 +27,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-version.html b/deps/npm/html/doc/api/npm-version.html
index c4ce078a4820d6..72e63f308e7611 100644
--- a/deps/npm/html/doc/api/npm-version.html
+++ b/deps/npm/html/doc/api/npm-version.html
@@ -32,5 +32,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm-view.html b/deps/npm/html/doc/api/npm-view.html
index 75c75fdbb478b4..3297e83bcb6f61 100644
--- a/deps/npm/html/doc/api/npm-view.html
+++ b/deps/npm/html/doc/api/npm-view.html
@@ -81,5 +81,5 @@ RETURN VALUE
-
+
diff --git a/deps/npm/html/doc/api/npm-whoami.html b/deps/npm/html/doc/api/npm-whoami.html
index 4ed6d79a42818a..e5a317bbb1e57a 100644
--- a/deps/npm/html/doc/api/npm-whoami.html
+++ b/deps/npm/html/doc/api/npm-whoami.html
@@ -29,5 +29,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/api/npm.html b/deps/npm/html/doc/api/npm.html
index 67ff3d32f8ad5d..3d9912a9307d50 100644
--- a/deps/npm/html/doc/api/npm.html
+++ b/deps/npm/html/doc/api/npm.html
@@ -23,7 +23,7 @@ SYNOPSIS
npm.commands.install(["package"], cb)
})
VERSION
-DESCRIPTION
ABBREVS
-
+
diff --git a/deps/npm/html/doc/cli/npm-adduser.html b/deps/npm/html/doc/cli/npm-adduser.html
index 84f0ac389efbdd..5a575a6762999d 100644
--- a/deps/npm/html/doc/cli/npm-adduser.html
+++ b/deps/npm/html/doc/cli/npm-adduser.html
@@ -17,11 +17,12 @@ SYNOPSIS
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.
npm 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.
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.
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 @@
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 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-outdated.html b/deps/npm/html/doc/cli/npm-outdated.html
index 07a0a933d76035..f62276ed84f3ab 100644
--- a/deps/npm/html/doc/cli/npm-outdated.html
+++ b/deps/npm/html/doc/cli/npm-outdated.html
@@ -67,5 +67,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-owner.html b/deps/npm/html/doc/cli/npm-owner.html
index 3600e087f15049..adc0af02bd7e21 100644
--- a/deps/npm/html/doc/cli/npm-owner.html
+++ b/deps/npm/html/doc/cli/npm-owner.html
@@ -49,5 +49,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-pack.html b/deps/npm/html/doc/cli/npm-pack.html
index 987ba3f792b9cb..af2fe5c85d6be5 100644
--- a/deps/npm/html/doc/cli/npm-pack.html
+++ b/deps/npm/html/doc/cli/npm-pack.html
@@ -41,5 +41,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-prefix.html b/deps/npm/html/doc/cli/npm-prefix.html
index 7b6a3c58a51e57..b6a8783fd99b28 100644
--- a/deps/npm/html/doc/cli/npm-prefix.html
+++ b/deps/npm/html/doc/cli/npm-prefix.html
@@ -38,5 +38,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-prune.html b/deps/npm/html/doc/cli/npm-prune.html
index dea291b4909bc8..6610508e176d29 100644
--- a/deps/npm/html/doc/cli/npm-prune.html
+++ b/deps/npm/html/doc/cli/npm-prune.html
@@ -39,5 +39,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-publish.html b/deps/npm/html/doc/cli/npm-publish.html
index e1b46d21d0b3f3..9044ed38f0aae9 100644
--- a/deps/npm/html/doc/cli/npm-publish.html
+++ b/deps/npm/html/doc/cli/npm-publish.html
@@ -59,5 +59,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-rebuild.html b/deps/npm/html/doc/cli/npm-rebuild.html
index 4da97a70518b19..2b3d7586198ea2 100644
--- a/deps/npm/html/doc/cli/npm-rebuild.html
+++ b/deps/npm/html/doc/cli/npm-rebuild.html
@@ -38,5 +38,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-repo.html b/deps/npm/html/doc/cli/npm-repo.html
index 02335b4f4a19e7..631781c47bfd46 100644
--- a/deps/npm/html/doc/cli/npm-repo.html
+++ b/deps/npm/html/doc/cli/npm-repo.html
@@ -42,5 +42,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-restart.html b/deps/npm/html/doc/cli/npm-restart.html
index d7536f81fdfe00..ea0b1bd5db7cc4 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 @@ SEE ALSO
- npm-test(1)
- npm-start(1)
- npm-stop(1)
+- npm-restart(3)
@@ -35,5 +53,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-rm.html b/deps/npm/html/doc/cli/npm-rm.html
index 3b28aaad4d3e8d..772a3dc8c788ea 100644
--- a/deps/npm/html/doc/cli/npm-rm.html
+++ b/deps/npm/html/doc/cli/npm-rm.html
@@ -39,5 +39,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-root.html b/deps/npm/html/doc/cli/npm-root.html
index f6b8b22dfcba96..37b629158567ae 100644
--- a/deps/npm/html/doc/cli/npm-root.html
+++ b/deps/npm/html/doc/cli/npm-root.html
@@ -35,5 +35,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-run-script.html b/deps/npm/html/doc/cli/npm-run-script.html
index 8ca2ea2a5ed4e9..ec7df7489d1dcf 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 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-search.html b/deps/npm/html/doc/cli/npm-search.html
index f5fe720baa11c0..ff015526e6cf3a 100644
--- a/deps/npm/html/doc/cli/npm-search.html
+++ b/deps/npm/html/doc/cli/npm-search.html
@@ -49,5 +49,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-shrinkwrap.html b/deps/npm/html/doc/cli/npm-shrinkwrap.html
index fbfaa6c3dc00a3..67dcc293873ee1 100644
--- a/deps/npm/html/doc/cli/npm-shrinkwrap.html
+++ b/deps/npm/html/doc/cli/npm-shrinkwrap.html
@@ -164,5 +164,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-star.html b/deps/npm/html/doc/cli/npm-star.html
index d3bbde5b9d696f..4608b23de54ac5 100644
--- a/deps/npm/html/doc/cli/npm-star.html
+++ b/deps/npm/html/doc/cli/npm-star.html
@@ -36,5 +36,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-stars.html b/deps/npm/html/doc/cli/npm-stars.html
index 7873880f4159e3..dcc8478a7d09dd 100644
--- a/deps/npm/html/doc/cli/npm-stars.html
+++ b/deps/npm/html/doc/cli/npm-stars.html
@@ -37,5 +37,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-start.html b/deps/npm/html/doc/cli/npm-start.html
index 0a3134bc82e3e1..627463ba4558ac 100644
--- a/deps/npm/html/doc/cli/npm-start.html
+++ b/deps/npm/html/doc/cli/npm-start.html
@@ -34,5 +34,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-stop.html b/deps/npm/html/doc/cli/npm-stop.html
index 01638ee4daf773..527581be741c62 100644
--- a/deps/npm/html/doc/cli/npm-stop.html
+++ b/deps/npm/html/doc/cli/npm-stop.html
@@ -34,5 +34,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-submodule.html b/deps/npm/html/doc/cli/npm-submodule.html
index 4ac55a88525bfa..6716c4a11cce24 100644
--- a/deps/npm/html/doc/cli/npm-submodule.html
+++ b/deps/npm/html/doc/cli/npm-submodule.html
@@ -27,7 +27,7 @@ SYNOPSIS
dependencies into the submodule folder.
SEE ALSO
-- package.json(5)
+- package.json(5)
- git help submodule
@@ -42,5 +42,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-tag.html b/deps/npm/html/doc/cli/npm-tag.html
index 946d5fa767c8c5..836fb63532a552 100644
--- a/deps/npm/html/doc/cli/npm-tag.html
+++ b/deps/npm/html/doc/cli/npm-tag.html
@@ -44,5 +44,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-test.html b/deps/npm/html/doc/cli/npm-test.html
index 6c5467de51fdd0..48e7ae8d6db8a7 100644
--- a/deps/npm/html/doc/cli/npm-test.html
+++ b/deps/npm/html/doc/cli/npm-test.html
@@ -37,5 +37,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-uninstall.html b/deps/npm/html/doc/cli/npm-uninstall.html
index 2a3c12c148d050..9771b9c505eeca 100644
--- a/deps/npm/html/doc/cli/npm-uninstall.html
+++ b/deps/npm/html/doc/cli/npm-uninstall.html
@@ -57,5 +57,5 @@ SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/cli/npm-unpublish.html b/deps/npm/html/doc/cli/npm-unpublish.html
index 59b278e23da596..293e2057a86c36 100644
--- a/deps/npm/html/doc/cli/npm-unpublish.html
+++ b/deps/npm/html/doc/cli/npm-unpublish.html
@@ -47,5 +47,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-update.html b/deps/npm/html/doc/cli/npm-update.html
index 5fa7846f5348ef..98461473550318 100644
--- a/deps/npm/html/doc/cli/npm-update.html
+++ b/deps/npm/html/doc/cli/npm-update.html
@@ -40,5 +40,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-version.html b/deps/npm/html/doc/cli/npm-version.html
index 6477726f495f07..825baab43c2826 100644
--- a/deps/npm/html/doc/cli/npm-version.html
+++ b/deps/npm/html/doc/cli/npm-version.html
@@ -14,7 +14,7 @@ SYNOPSIS
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 @@
SYNOPSIS
-
+
diff --git a/deps/npm/html/doc/cli/npm-view.html b/deps/npm/html/doc/cli/npm-view.html
index 3b87ba0be205aa..69c1d06b9c8cca 100644
--- a/deps/npm/html/doc/cli/npm-view.html
+++ b/deps/npm/html/doc/cli/npm-view.html
@@ -82,5 +82,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm-whoami.html b/deps/npm/html/doc/cli/npm-whoami.html
index a2705c40c3a95a..9d71b8e0f1d3b2 100644
--- a/deps/npm/html/doc/cli/npm-whoami.html
+++ b/deps/npm/html/doc/cli/npm-whoami.html
@@ -33,5 +33,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/cli/npm.html b/deps/npm/html/doc/cli/npm.html
index 3bd3849d2ad257..e3077b3fe88e56 100644
--- a/deps/npm/html/doc/cli/npm.html
+++ b/deps/npm/html/doc/cli/npm.html
@@ -13,7 +13,7 @@ npm
node package manager
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 @@
CONTRIBUTIONS
the issues list or ask on the mailing list.
BUGS
When you find issues, please report them:
@@ -118,7 +118,7 @@ BUGS
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 @@ AUTHOR
Isaac Z. Schlueter ::
isaacs ::
@izs ::
-i@izs.me
+i@izs.me
SEE ALSO
- npm-help(1)
@@ -154,5 +154,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/files/npm-folders.html b/deps/npm/html/doc/files/npm-folders.html
index ec320399971e4a..392d9c1e3845af 100644
--- a/deps/npm/html/doc/files/npm-folders.html
+++ b/deps/npm/html/doc/files/npm-folders.html
@@ -184,5 +184,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/files/npm-global.html b/deps/npm/html/doc/files/npm-global.html
index 90e5dcaf1dc3c6..456fd89b8c0e68 100644
--- a/deps/npm/html/doc/files/npm-global.html
+++ b/deps/npm/html/doc/files/npm-global.html
@@ -184,5 +184,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/files/npm-json.html b/deps/npm/html/doc/files/npm-json.html
index ade4fd07ec4d01..e77270d6049cf4 100644
--- a/deps/npm/html/doc/files/npm-json.html
+++ b/deps/npm/html/doc/files/npm-json.html
@@ -181,7 +181,7 @@ directories.example
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 URLs as Dependencies
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 @@ devDependencies
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 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/files/npmrc.html b/deps/npm/html/doc/files/npmrc.html
index 9f379006f09515..5600e2438014f2 100644
--- a/deps/npm/html/doc/files/npmrc.html
+++ b/deps/npm/html/doc/files/npmrc.html
@@ -31,7 +31,11 @@ FILES
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 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/files/package.json.html b/deps/npm/html/doc/files/package.json.html
index 183ad8ea5d6a4f..4360a1488bffa2 100644
--- a/deps/npm/html/doc/files/package.json.html
+++ b/deps/npm/html/doc/files/package.json.html
@@ -181,7 +181,7 @@ directories.example
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 URLs as Dependencies
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 @@ devDependencies
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 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/index.html b/deps/npm/html/doc/index.html
index 6c68895e073001..88e64e90791da1 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 @@ semver(
-
+
diff --git a/deps/npm/html/doc/misc/npm-coding-style.html b/deps/npm/html/doc/misc/npm-coding-style.html
index 30d3e07cfab492..a5f04aff72c79f 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 @@ DESCRIPTION
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 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/misc/npm-config.html b/deps/npm/html/doc/misc/npm-config.html
index 249d5934c9eb76..5f68b867860c53 100644
--- a/deps/npm/html/doc/misc/npm-config.html
+++ b/deps/npm/html/doc/misc/npm-config.html
@@ -118,13 +118,18 @@ browser
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 @@ heading
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 @@ proprietary-attribs
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 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/misc/npm-developers.html b/deps/npm/html/doc/misc/npm-developers.html
index b4190a1a2b17e0..18d1020e150254 100644
--- a/deps/npm/html/doc/misc/npm-developers.html
+++ b/deps/npm/html/doc/misc/npm-developers.html
@@ -94,6 +94,14 @@ Keeping files out of your pa
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 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/misc/npm-disputes.html b/deps/npm/html/doc/misc/npm-disputes.html
index f59921e2e95b22..00a0e2a650fe3c 100644
--- a/deps/npm/html/doc/misc/npm-disputes.html
+++ b/deps/npm/html/doc/misc/npm-disputes.html
@@ -13,7 +13,7 @@ npm-disputes
Handling Module
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 @@ DESCRIPTION
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 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/misc/npm-faq.html b/deps/npm/html/doc/misc/npm-faq.html
index 08c8eafce242a2..6caf41929f6bdd 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 @@ Should I check my 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 @@
How do I update npm?
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 @@ 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 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/misc/npm-index.html b/deps/npm/html/doc/misc/npm-index.html
index 1ca7d7586284a8..60a8845a7768ad 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 @@ s
-
+
diff --git a/deps/npm/html/doc/misc/npm-registry.html b/deps/npm/html/doc/misc/npm-registry.html
index d746316f581413..9c82de7168e037 100644
--- a/deps/npm/html/doc/misc/npm-registry.html
+++ b/deps/npm/html/doc/misc/npm-registry.html
@@ -49,7 +49,7 @@ Do I
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
@@ -70,5 +70,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/misc/npm-scope.html b/deps/npm/html/doc/misc/npm-scope.html
index 9fed0bbf110fea..3b81cf00ce40bd 100644
--- a/deps/npm/html/doc/misc/npm-scope.html
+++ b/deps/npm/html/doc/misc/npm-scope.html
@@ -78,5 +78,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/misc/npm-scripts.html b/deps/npm/html/doc/misc/npm-scripts.html
index b2a3dbd383d3a9..4f0d466efd3bea 100644
--- a/deps/npm/html/doc/misc/npm-scripts.html
+++ b/deps/npm/html/doc/misc/npm-scripts.html
@@ -27,10 +27,6 @@ DESCRIPTION
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 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/misc/removing-npm.html b/deps/npm/html/doc/misc/removing-npm.html
index 3028625d1bf0c1..e8f05b097f1f2c 100644
--- a/deps/npm/html/doc/misc/removing-npm.html
+++ b/deps/npm/html/doc/misc/removing-npm.html
@@ -57,5 +57,5 @@ SEE ALSO
-
+
diff --git a/deps/npm/html/doc/misc/semver.html b/deps/npm/html/doc/misc/semver.html
index eeea8fbc40f68f..3b1556041e501a 100644
--- a/deps/npm/html/doc/misc/semver.html
+++ b/deps/npm/html/doc/misc/semver.html
@@ -22,12 +22,12 @@ Usage
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 @@ Prerelease Tags
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 @@ Tilde Ranges ~1.2.3
~1.2
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 @@
Comparison
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 @@ Ranges
-
+
diff --git a/deps/npm/html/partial/doc/README.html b/deps/npm/html/partial/doc/README.html
index 13ff98d2c3756d..823c8a0b5e0ba8 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 @@ Other Sorts of Unices
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 @@ Fancy Install (Unix)
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 @@ Using npm Programmatically
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 @@ Legal Stuff
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 @@ BUGS
- 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 508003ca158d43..850955b836120b 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 @@ global
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 35db404d78567d..f0de7504a5b925 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 2eae8ba0f5903e..98bd41f6b24d87 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 @@ SYNOPSIS
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 dbd481b380a9eb..dd5276a751eb1e 100644
--- a/deps/npm/html/partial/doc/api/npm.html
+++ b/deps/npm/html/partial/doc/api/npm.html
@@ -12,7 +12,7 @@ SYNOPSIS
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 ac9fa0086ca7d2..ce2c5dcce6f36b 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 @@
SYNOPSIS
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 @@ always-auth
npm 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 3c832399ddbb28..c4b01c2a65e451 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 @@ SYNOPSIS
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 199b6002b89446..3a5cae1b492dbd 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 @@
SYNOPSIS
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 267e570eca8ce6..2186473373c513 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 @@ SEE ALSO
- 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 5217f019635445..0cc3a21ad42844 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 @@ SYNOPSIS
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 646fffcb378ff1..94ab5a64514804 100644
--- a/deps/npm/html/partial/doc/cli/npm.html
+++ b/deps/npm/html/partial/doc/cli/npm.html
@@ -2,7 +2,7 @@
npm
node package manager
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 @@
CONTRIBUTIONS
the issues list or ask on the mailing list.
BUGS
When you find issues, please report them:
@@ -107,7 +107,7 @@ BUGS
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 @@ AUTHOR
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 df3bea83742d76..1e297ad77ad917 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 @@ directories.example
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 URLs as Dependencies
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 @@ devDependencies
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 ac386ca85e2e23..988920a4896283 100644
--- a/deps/npm/html/partial/doc/files/npmrc.html
+++ b/deps/npm/html/partial/doc/files/npmrc.html
@@ -20,7 +20,11 @@ FILES
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 df3bea83742d76..1e297ad77ad917 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 @@ directories.example
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 URLs as Dependencies
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 @@ devDependencies
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 f6678d937154d2..6af3f79bd9a34d 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-rebuild(1)
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-rebuild(3)
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 732b326c997763..b50b95f27f7e45 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 @@ DESCRIPTION
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 87409720b9fcfa..d9b9dfdbe0269a 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 @@ browser
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 @@ heading
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 @@ proprietary-attribs
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 7ba880a44bc0a9..10d0cd89198a3f 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 @@ Keeping files out of your pa
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 6a7abca71227d8..7e6983ceb21283 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 @@ npm-disputes
Handling Module
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 @@ DESCRIPTION
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 7fc16344f79604..f42abe71591152 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 @@ Should I check my 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 @@
How do I update npm?
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 @@ 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 6e4c0ca80046fb..3800cea93817f3 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-rebuild(1)
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-rebuild(3)
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 0031f61b10c984..2a7c16014586b6 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 @@ Do I
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 08bcbd54a5b096..1e68be479be707 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 @@ DESCRIPTION
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 691a277dc78442..b078197e8063b9 100644
--- a/deps/npm/html/partial/doc/misc/semver.html
+++ b/deps/npm/html/partial/doc/misc/semver.html
@@ -11,12 +11,12 @@
Usage
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 @@ Prerelease Tags
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 @@ Tilde Ranges ~1.2.3
~1.2
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 @@
Comparison
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 9693aebd389bf0..6c8a652bea36c4 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 16744cd5c84e31..fabbbaf10e5065 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 2e01ef6eeaa432..7477ba45791f52 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 e1afb0d1578713..357063551d4987 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 b425d7f911847d..e7d286e4fb5d40 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 1bd7af1448684c..cb5a3fa8a66e5b 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 d8f3f1cd88f924..1ad925eec35fae 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 9591ba89d23177..e87ac54bb1b6da 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 00000000000000..d81e6f53d6285c
--- /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 00000000000000..2955f6a1488feb
--- /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 7bd672114deb8c..febd1049ed1608 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 3b26a56c65f1cc..07c817500f6fbe 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 74397d0cb95792..6a4abd730771ac 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 17dd4eab0c1326..c90ad9027231c0 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 dead3f7551c2fd..9abe740a3c77f0 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 e87e839354b6b9..96475a0691f987 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 747bd5020da99e..07d92194969d55 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 925654beef7f96..401e700af3cde2 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 e539307aff3404..756d12ee3621ac 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 ed329d19e1bb9a..eee4f2772e0918 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 e933a1346cc85c..d03ec47b6bbb99 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 fdfd7624db25fe..fe25a8e910c2d0 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 2fdee7adb69ab9..7b34508337ea48 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 2a0fcff5a5c972..f179bd42220e2f 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 c6db8e37b012a4..3db4a16bc9de1f 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 4495b93c48ef17..fd26a0c43b036a 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 5dd060f829c47f..ad3f312e546890 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 123c4ebbb44e35..d2e69deb94f1e2 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 dee5c152afa5ec..087e8d9bf20422 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 47e9a8c0ac7a29..bc7ec918796dc3 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 8bd6e8507f31f7..df57c5b3463138 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 2566cd5ae62644..da03b0dcc86948 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 5201a15ff64754..6ce2f83467d012 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 95b78a8ccbeb4a..12c6dd407b91be 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 d43d0725ebb2d8..587ad0eb1bdeff 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 db5cc7baf0726b..78cb083eefaa4d 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 c0eb83dfb1d524..ccee7563087009 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 cf665e4f656087..bd68a26d42ef8e 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 00000000000000..953671857d0cdb
--- /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 ede49a121edebf..7656b5d9754a3a 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 a15e2c391c80bc..930708676edd4b 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 6b45cca2ec0beb..bd20ab5a3f0ae6 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 b33f93743d2bb4..121c4336aeab5c 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 a7cf1046f0c0df..4f274c5c913c3e 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 6b85986e02ee69..b3abf17b68a1d5 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 6552d6cf4d52ce..8f0dc2ba57f9f0 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 09c7659c600f6f..5acca82e2de7b8 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 0f2184292a750f..1179298c5fecf9 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 0748922dae2d57..703c795c9b8e6f 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 c49015ae6e72de..1cf1d7c71767e1 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 a89cc6fd5ff01b..4cb06491007b20 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 a93ebace724097..716303c41b4b58 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 24548077e30e42..743a5d027d6ac9 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 581a58948f3c8d..95a8fd2515f033 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 1e9e5c19901e25..1feecc263c4e12 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 8a19d12578839f..1d905d06b993de 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 0211aef43e9edd..5f29171a9e410c 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 a18a8e97a68a95..524081c93015a6 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 556eeb52ee8f4f..0d7f1af03cfb69 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 3d4ed0957f5966..d2b6a298d50e22 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 0df0197b0c5fb8..ec355effeb655d 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 62d76503f6abb3..86132ed1dd00e5 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 9cf4823c9a6be3..bcf9a52d15fc9e 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 45433a814e2b16..a1086ad3222191 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 3ed5549f71c6a6..1c503795c6bcea 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 8b9408abb275cd..3b39d6847a40a3 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 b7bcac63956a07..2ebdaa6777f614 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 1a8cc952156069..7b22233d5d59f2 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 665721028648df..0df825154b87a1 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 0e04b9cfbe1d2c..1bb1e9acb3a5b4 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 dc8428d0242605..da8d6c9ad35bfc 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 234d0aa76e9c04..010e8153007a5a 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 c7f92fb52bf4f3..94a0afa733f27a 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 f85ebb97085e0e..2067f9e55d2b97 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 905908a7a10cd8..65ea4ea94e18ce 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 4ad5a67b8c9587..3f7d19bd8f129c 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 fa2b313ab2bf97..5fa9fb16eeff05 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 8dbc0292ae7774..ced42ecaed737b 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 1762a0f08bd4e1..d2124355c4750f 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 0a342ee1f1d0cb..36f0c26bc5855b 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 8622d18d9640d3..0a20b4b6d4b208 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 4999ac64e91cca..71853335c59984 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 5aace75083fa59..70eb323463ced1 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 0b4a9f4dbb3994..b398e81eaf02c6 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 a56f8bb9187a8b..5568b48371e57f 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 6cb1df7263cc1c..7f96d4f3676d40 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 19adfc92765b4a..61e1ccebac1f28 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 21fde3452faf2f..2ae02d093747a4 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 35ef045329e315..2a279d2a799b9d 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 34a3f04ac35d6d..b993e0c9b53f92 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 a275e4728d5a54..aed41f88feb114 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 4c76b8a0cdb672..27588a2407ed0f 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 cd8dda6ea5e49b..6b7503fefd11e3 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 1dccd8fd0c1acf..15a2839cce5a9f 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 87ad3253b12d6f..ee757dfce766fc 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 763e2252548ba5..be2522cb49c9c7 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 9b543d36d5a2f5..d04e25d43f8220 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 ad93e305bd5956..4dd5a84f7e2284 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 82767c8b7e1cf0..d7c2ad4f1de0a0 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 54948eadc17095..8648eac98e3f4d 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 8f4f346c260197..a9baaf36d9e986 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 d5da00dd8f6d97..9a2ce6bc82e8fa 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 ec98278cad9ba2..511791791d1645 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 0c379a48c5927c..2d5bf77c3c12c4 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 61fac42ebd1fcf..68787c89b1917b 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 84558abeb3a2b3..de3d127df64e75 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 2bba8469fc5eef..9e96d44ab3f737 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 101b752e9f7bc4..35a993ba8b3003 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 d9da93e33c2536..7d95e575137871 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 e2da6d67eda9e9..4aaed71a734928 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 48a06c97c7ad53..310dfe292e0baa 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 13dbd95f33bd53..28f77205c5450e 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 21a5aba1deb816..082589b5de8878 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 5638d434aec737..64cc0bad698e8e 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 be948334aa1443..2cacefc5b18d3b 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 68bac79fa036a3..15d5230d170c72 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 866f1e01f3f315..59bf90d965ab64 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 ba0cc5f4c3b1c4..4fffa3bd960fc2 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 0f87c50906cd75..92ce7b1b2fea99 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 4eabb36c444b21..f3330a5885e5b3 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 aa55b84736bffc..551eedbc12c908 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 378862a563a944..95739ce3b08428 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 4da13767f93f89..a2daa3134f78c7 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 f6d0f6d3f115e0..ff969ec023d414 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 8505f399559bc4..0cf637ca2c9462 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 9b4ab467d2f9ba..48f865db19b2e8 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 3f40eb0db2da3c..eee573b2d88bbd 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 16979247fe4d43..2cf7fe21534e7f 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 e49f28d7edc993..42bbf40c508faa 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 2d32507f513a9c..cb320ec46ab29f 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 71bbc58ad09e03..6298c8d5e63d06 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 9cd3436f894a08..2ae88d142af438 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 9cd3436f894a08..2ae88d142af438 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 fa9ef95c4ba2d2..cf306294e91752 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 d2846869abf75b..fc2986b901df55 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 fa9ef95c4ba2d2..cf306294e91752 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 0dc15318ab4587..ebaf0386c23207 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 e3b4c5c6f639c3..d561e074732c1c 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 bf8edb29f23893..ba47e45fabb1e1 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 9cf7009f6206bb..3d67933982cdc1 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 563509a8728b9b..cf6a37cfdde22b 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 442815a2e52029..056c96bc635811 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 9de209d468fc32..f89b94507e7e3a 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 f876e4eaaa65fd..2cae9e88c7bb27 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 9d11f4626cbf1d..69d880d34f19c0 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 b0a4fca5d7cc49..73963fe3b37787 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 a6be932b4747f9..bf239f7e621aff 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 00000000000000..ec035f397c46fb
--- /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 00000000000000..0d2cdd7c486b75
--- /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 00000000000000..8e8f30796bd6f0
--- /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 00000000000000..d97b8bfa330db8
--- /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 00000000000000..6a480738743cc2
--- /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 00000000000000..1626454b2339d5
--- /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 00000000000000..d03c07868efc04
--- /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 00000000000000..d3cc65c641b353
--- /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 00000000000000..a0e698f00fef60
--- /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 00000000000000..9333ec64e11c74
--- /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 00000000000000..59ddf6f28040a0
--- /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 00000000000000..37c00a46d9d6e6
--- /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 00000000000000..6877bde02cc651
--- /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 00000000000000..588f44d6821c0d
--- /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 c44b8ca8fa962c..8c15c993eaf1be 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 602ae00e8fc902..5b9546aabf8a2e 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 783c5c7bb69eec..2fcdd1e472f961 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 ca610250c9e9b0..ab8ea0388fc635 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 64c4dee52c4d75..89d1041bd7a8b8 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 527743b601fd20..d7231cfca7daa7 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 5d402073b3653f..321ffa30f5e2ab 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 3c6b77647092c0..dc56f3f191f7fb 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 ee49ad893aac1d..cb3d16631ab87f 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 f9243a12005532..e3ee62191906fb 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 f12d49b789e4c4..4744d9dc3f7f7b 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 ef307b50925c5d..c60e1d9de6bbe6 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 140536797f8881..559b7bf2bd3766 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 f706a4be68ca81..e55abe9701b6df 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 29e508673a50fa..161b82564bc540 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 e7de77086af5e5..6b2ccc99d270da 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 c6b55b3e02a979..983649bb9d5814 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 648ec849388e2b..0bad122f9bd6cc 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 9aa1a9538d65a4..3787ae376ffe1e 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 b1f9861838ad7d..4720cd86a4aa38 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 d0ac58243ad2f6..f920c10036b75d 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 c34fdd597ee0c7..00000000000000
--- 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 82b7ef6d61d69d..d72bdccbe0e078 100644
--- a/deps/npm/node_modules/glob/README.md
+++ b/deps/npm/node_modules/glob/README.md
@@ -1,3 +1,5 @@
+[](https://travis-ci.org/isaacs/node-glob/) [](https://david-dm.org/isaacs/node-glob) [](https://david-dm.org/isaacs/node-glob#info=devDependencies) [](https://david-dm.org/isaacs/node-glob#info=optionalDependencies)
+
# Glob
Match files using the patterns the shell uses, like stars and stuff.
@@ -21,25 +23,94 @@ glob("**/*.js", options, function (er, files) {
})
```
-## Features
+## Glob Primer
+
+"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 00000000000000..610d1245b4de26
--- /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 be122df0023908..00000000000000
--- 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 327a425e47b763..00000000000000
--- 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 564f3b1217cce7..8c990782189bb7 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
zcmbrE^;Z-A_s5si28?bbM%U=p(W66BYBWel3kb3eHX7*`M|X%QpnwC35zz;e>x%Y9eiK(%Mrq>ye6ZoS6fJA5$EL&@HHCZifS!``%
zqGJM$(t!YAcSm=kZ5zR|5doJ-3$0ZZwQ^RAMOa#rTslZM?q+3V*X0<(BvlA@4R?v=
z`VuY)c2(86${InT2wO`NBMe5;H_jqG{%W9)7DBTUx?xEoG%qCGifgU%xI+FxB9(3o*$zRrZOuO^dUOnR`ATZB{9A)yYmN
zm{s-4Ehksv)kili;;IW&(*3-=4U*D=OyRb+QFcW!c9jX11q8dQTLC%K6SF+FwuvtF
z{4Op$7S^|Hi}GW2Qe5hBu7S&QE0fP=>}6wOENcU;GjbwKB^a)Z4Nt__)_G_p+;X{#
z_i$!4FqoTOHWKs=Hz5i>P)oHA0veLN0W?*J1exo{9wxYZ;$+9Qe(~954{>kGftfrX6tM`*!
z+F+)bO#6=70tHVGY>Z14ipg|*Y?%A9p$e0IB~iI9S0>6em%+$5#EFOvD;huP(p16Xv?H
zyj`8EAXw#YKm{aZ>8xjF
zW@3#B<1JeSUA&SkYm;mn2@WmsMs-NfYY9ee@s_pRTs-cU*W+y)x!j$TEIT0<76jYY
zB-@&J+u9_DCXz#Ib*^rbLk+>UE6KDG@6efK+DdZhinr{HcOb|A_rSL6%a7rk(Mo
zjU?Nac+;ADndsyu$
z$yO~%R!zxPP5*rd@c%o)KOqph|0IO}!K{qzuNvst7%9o4z`*~mWdEo9zc2yNT>#$5
z@?g5jBPn!j(r(o5nrCSUzTM`Bsk>{AsnQ*RjxuiD@4PTw`}>)d)0_x1hOOkbDhAm4Pps0sNP3)(NRdFRkD
z`T)`^U;YGHe!4$hrV#vSRx|4Gd9^``;NOAXz~y>tS8@M2{tu8bJE+grV^u}hhfyE4
zpFipQ@|qGXqX+#M7N}Q&`^l
zXwHfSZeM!0mFAiFZ75(r@jPdNSQ!21$6k@WRs2rz(z@iT7jvx_OzY`!En}E;Nzg%g
z;A3M8mMh`5V1>?gf4=gdm+O35r8`Qg$nLy+!yH}E^d1?%p&D2WWNLNG|G0P)S!lX_
z*nHdlSVF9}%>OZ0NtJlq77ZVw1R`57=#?ec$L^B_Dp@;v-*ypOn=+T7+K<%}6zq-l
z&glN0$t3rV|En>$J49bVbAPM(s0VbKUKXENU+R%~E;c|dG}o%QSLp6G{jskiGP5BE
z5<(fJv7oSyA~+<;IcW#vHce4k9jt6W
z=TtOSyKI3SrxkAwin`lUPq0!vS|9+Cb+UjHELF<+bR`jgUA0*TQ7%}x7W;g=@XURt
zqtCu{X!S*4Q-|6Hsix|)q(QxRhT2T8*4dU?9h=1kN_+)vN<$S=)u6-Tx=30z#WLNw~lBTSJ9tFbmVt!%Xi8=C~e$T5XGPnf~h
zR|vd@8==h%&xqcfU_Bjm36mXpCiv?(?c(xSIl>P*Cdd?#UfONQT1quw-PU*P!?GYa
z$zUa&Pr#{2$2b~p^k`z5O*$*~0^s{FGDIl&U499#?!?6J7#Qx?-aURG5+dZ@#7~ui
z!!Qm+Z<`u@zF%ZoS}6>igmR>`T1s05W<{6P(Qr~pFy$TnFbJNe#D)_3F4|B>>ZH(I
zCr#2sb6Vsyuc%q&t(0wiZnWDjC$gw?aUnljQCTc~&B|Mw2QZ`rsZ0tBFFIg{D
zwkS`%wY^aK&~!dw<7@Smi$5>uqM}Blx-*DtaWya_Ad|ex8+(TH0{uJGF;Zhn@nM;S
zp^?;L29simIQJMltR?M=VW`cUb(XkXdV$Y@0p85iYY9CqNRyoBl@Y)ujetxG?SvC}
z)4~YoB^u6VBMf^QFKH;_EN*Ub){L=iwJS}q7c=u$FYPvB#0mk-h7ml#=Qs|A(p-mc
z3!EhY8E4}3N>4>`aVI;YT&EX^$RlAqhqQ^qm@N;qW6h`D81&Y^Sn3*zNLK1-!+wgR
zIl_8FU^aSCi=E}Eb5eVYMWOAy+4{5{XT;-yRQlV;Ik-pNL~5KDKfKj6v|hBm`IE43
zdFyoJBhFgup^LFuUu_=gwNZ#&4S3di4Ea7)Y)2
zHG64vllj(r&{c(HmeEUCMX*y@9XI#R_(&p~_0;ay!FQH7Snf^p-SraXtN9xesB8n0
zNW|UrHVVD{V#f2#Oq}DNUzcWFKEv^m5dC;Dw>xbm*Y(!kYo7-0MeR|sBb*4fIbjZD
zx*kNDJtcKtwL#~%`7SG0gwmIGMn$2Y9;T0ui3;pE4MQ}Tja%=jhT8pHYl~NcGoh4&
zexe*>1kLLu6+g^2dfIK0ApWYjVzJ=$ggE~e!*UUdC}*uHQnM_LPGJyud3Zz8;6Uk1
zf101wgNusQ*#osFKc9y;!kNFqUW%hfK($oTDK^9bNC%+NmISrUZ63sPZWM)H4h^mK
zqG>Yy6k}?9N-eSoG8KJq%uMm|%#?xf>IOp---=s&3Vd5GXiWE37;uTz9Kyup2n+RFZ<`dIX%0cWv&8bcNmwx=k@V01TjY!6CB7aFcUJ>T<{W|8r!?BbNJdJ3G%NjKmzhuRWr;X#C7jufavBPm^Pkr
z(U#N1V6lkM^VXYY5SuKr`nse!t>WS9QTn7}QAZ{Yz~(H`%s=$RS4D&wmb!q(_yQ+?
z>poa2ojVJXxWD>Hl0XMYW4w}8+loZf&_lXocxZ*;t2wlUC>P!T9sv;ZI|nD!4`C#VBuYd;^w|{jo
z&w<-+{9UiPv1<;g+kjsgk(+r&`}jfCxg0H)m6TjM{_6FQgiGtYzm){$@>7_>;SB5)
zC3}?e{!JWRb8J70<8!iptxb$PdqN%UwZ_R9Bmk^x13}cw?3LnAr)^6?MC9G;7s5782e
z7tdqp-N9R(Cl=xP9+4SWDBf$w-mFyp%RBm)yJMP48QoBjo)|{{^VB0TU86zy>l-PZn{F*Y4fb;aUh4+<9>-biL?)$+8l+3o
zJIZTO)7~DW^_OKmrpvOAv|{XqP8`Fs`r(I&$hx@fL$Lt57hoS0uuKC#y9cI{Ggu`7
zV#hiXSf)pL4EgEV-&BYtHtI2K8LN44MKmxU1pvIe8M7F=%b9hh;HE#j^sP0mC+TVB
z69l#tdS3ucx*PfwfPEtwy6v2|%;_jj23$gz9z%0BByuX8LAM=2&kJeqHIw=rGHF__
z&2+<~m*F#jf|)#s?o}ouKxQi_Af4LAf#)nU$+<3D6b}Mvq58
z2J*`SvdzcRKYWYM76a`9JgMjiwz7=NHXxRtMPfGe-^Fg%p5tLZZd9zoONDaXr($0?
z!ShhyZZvKB2yLZ7;V*Sdl>#BfmXbmex6?C_MP8~zo{cU$d>*SpSt|XtUyA!#O5iC=
zl`5mTi8)v(%>(ir+@xpuW^-V|XgCne=#-=a03*?+wdnk+f%2tyjCi(+C2oy)8*qMH
z>~lxH=5gsGiu6zvJrM1Ge-$pgFYJPb8lg4Gk^FUgxzF{}7KBsOF)3nTRiZ|6cuVqO
zq&z-?A(7&4hNTZzk|{lgr?gm0(a5x3jQHOaEgN7_M%Egpl-RUIy7t*ZZhmLPeRcUL
z#UMMzNCn(GozmwKGVl!m=@#ERAGr6EzB-_k=ZPNXsyjatD^C;8Tcwr26@YgDhTc>`vNG%M%X0}+72|oS->m(Sflm?HojAf`c<30
z&euyRd+EYw!r@?M2=)OmRZQul-&gBzRFfNYin_s;+J%LMix@7cHAPn3Ro>u@
z;mr$W(6PU6&<`|yeT+Lct-nZ}uBKvXU+*Ze7a5+8hCI^40$t#gLfuHMmhNa+Z@7L1
zukY((1ADE8?~&3i6grM>8rTAqp$9}2iAupI%jA{BHKoax-MOrhis8KB113qc~U3=p}88NMIU
z65k_U*<-=0U_X7)V^FUFYV;OVdeE`hthgtf?FZ3ykO9AV@Y<|?`JAyC3w1<5L?}@0
zW1ttd^JoKNywKSt9xMN=lk2RV0@fdlAYXGO-!BsBCDUj5wnii9Z@%q@*)hEYN^?yl
zr+QgT3QIHSa~}uXS351?X}f=g4h=yA83FWG8~`0d!{3fY1C7DL;@(3e(S;cX48`|0
zedvD~ix@9JjL={eY^N>-S}+!H#k{^|Rj1-z^*R>FiS9LlLHDP7jTRu;F?{c^_D2iN
zvkX|#BHhLC+~nFw7A?`QbS56rX`DWSv88=XOa^8SLZk{uuk?+|x`{bQ)9~S(9dLXd<)$gH0qtz-HdV9AKL#<8ykh3!
z;^9ol0(fB-&=Me`iXC&yqm35=`7Dgpn~#Hbvgi7XKnr>1ElEs2aif2pIt65$s@5B3
zGUAmd2nLU>b|4~owBOr$b#1`!uS1j#BqUiMjJz?J)Pf7`1eRfMM&EQ2_Y+u*ane&l
zT3|UcXX(GdX|0!2?!c$=b;Qin0DR~hi$OS}v#Ewu55Sh$TcUXVCSTLiRU=$y*B_uZ
zZcGo|`v}goLoRZNS)^1gj(yB?iX-xE4SZ}VCv#Nb4aT=|6LcXL(D)s3BQ#&`uV;-&
zv&v0O+HZp+1fx_qcEVTClE!ik|40%pDfJCtY6Ht`2Od|gWaQa4cI2{sTmwx4`VWS0r|{6<=FwpQl7d>=IHa*Pr#QV8J9#pRo7%B
z6^$`&y$@j90ll<{tpM^1mRfJL^EDPR^`mGf6z8PAw#F^`!s-PM^;W`hD<*&Es`A#W
zx?M#={A}(H+I4VAL7%muNx-T0<|L2`R>m$H?)z6iI47f$%2ck)YO~9*I1l<~%o^zn{^7`|XzYaZ5_)ZL=eZHz)7t^<*f$M8tf}cay%R9CzI)MIO
z-N!%HYyOHJEYZM@X`=j_nk{vDjKDTn8BQAz4`TC*bj4-#tL^aD2|2HjL$5Bj2Cgt%
z^O+5p4%t-20ewXjHbd5CLJf&``Q$3$0sz=NEBA^nS6-+Ivkk0b>y6;>mIgrd>`&OP
z?l#0*;Osl3bARbW62?4^esJN%m!TQG>FUdQufJ+G{~Ov%WmvtDGaGApFVb{kQlC^=k|0y@1ZwdpK@sM*w9mVKsIRb
z(92Cgt1#?>54+S@wB5*M2=C*f&yl0Lim0ZJ(7Io|*>dOjRBGh+c|9PkFS_O+IJc0p
z;nlI&HDrsi8s1N}{}9nB-V!-b#Cbt+dGKVOTgIQ3rBvHyp^-=ln+Th1{i5jlk=1P
zqeKI@-vjjlp`T%O?}Y(ieo(7$U+%;Inz^2(V8KYRZg_x3*vAC92vR1Tta%d0RPns?
zITd!Fn7xPz48+V+{T{e!;`fdZg+;{3{l=fQTtrpn(Jnq>5-smqN-qsNo3u
ze?Mp=VJoL|ZB5lu--n}Q;-jR4f@F07mi{*nQ)R()^br4!D{9Kdb$t3o5ooDt-qRk{
zN@#1S%;qtp#~`uX`Fn(WGpP7`4CA}fxEQ9X0S5>A+8suveV})fOyq)=YFsX|xVf
zx4xBTx31M6Y0PJ%9l-RScj5D6^+9xG&8>VaJttS8f~eJBIa!TlgXg*D!vqzPI5Z(q
zn)29J1KV$_&ygLmofz*je}lL7+e2GMi3M;`bG1i1@wUfz;&ja57ouC!BIV!W0w#jh
zG=jaKxEx5kjfE~mRT^D@W%nf4BFIH1;BOAk`Y2u<2lL5GdZ?r3^
zCXpI7_nwCC+YQdxnH*a&kp(tdepv=|vt*)Ukz_^G2U^
zz<)WF`=mxM;~?zp+)J-W(w9#+lD+uN9tJ38Sqw5P
zm5g>Ec882Znl33|XD=ucwdv&7>~yE4W9iYSTcrh;!6o}@
z`C**bE(H?#oIbm8UO$}pWR{D5`6Owzwd1!_ICj+gg?|!SXsX~LWaAf+-{o|FSe9SA
zu__**Df~9I`$7X8JSWZOVpslPe1_978o{hOwM!guoGMtyB8jZRF*FyzS9_Fv&7s
zQF~%D&Thc`K%r99+M}RxDo1S~ep4bPWNJHl1@cLbxh1Is`#)9uAYyfA*)fZInZH>{y>sc|Y8M
zS>Y=)<>#sNp`69s`7Dd`HcD7kI>be;cAGzeQTH@#EQ0(h>?)newdUg;FqiDHFj7=q
zi)rAk4WU!Blx%LQ^;QWnMeDmu-AfT^RZL^}633!2xmKlhM=Cn-=UdLGOaKJ|np?O&
z_I!WuBJ<9b3shD{9|OBBdiZ>-t*vh%Ay~hU4ogt%9|QH;n%v(Arc4>L+si<%)KTCf
z6n+NdsK7Uh0=COMbZUy$M%PVVC7eAkuwHF{lNKUQnPAHAW)T9jR%Jz+N;O^0b&_zY
zZE*%RiVEkkiiZO;c{4H4*|d69+82tI1eT$%vID*kJ=+HWC2V`M!MNwt_#NQovu8ji
zMipFLyV0d@Gu8=5{ED4p)B5(dfERWjI&{B?mCe(>SNg%uiM7R-y`b>FW3`F5m^KdX
zcpE_@dLX?+^*$_!Uj1cKRVvt}r<>QBbh1o_y&gJe_B`%UWLKCc^&8mkg9+4Nr
zWx`4i#WvKT3#LXuFtSE;*z9>j;T^H<7dSSnods)|NBXiF@}`#>dfNc>s6Nj~GueEZ
zUZ7Q5=u?K!%Fuzm##>=eKEzgHBN2iCHh~15{R-|%v%`YrbhU@}wJDb!_OdlUbBp9j
z9G1A|=^9Ng^IgYzXVZ&I(mR!!C}beLtZ)2`f?54xjm^mW1;L1
zzq?w{>7~)I$=;mj5KK>ffAbAyH15$kQswoN;YQhy55$(+J{oo$4&VCnls4Ih@L~f8
zjaSF{ktDp^zt`BuDnvzWMn&uFQAHmklmGshRNH^iDW%Vd_5v>C;~@2-0y7te_uI;I
za>bBXPOj_d6!Bh+keu`#^c=9~=L^iulLup()wbE*NHTnPgFzNKqe%B&%)c@@jL|L~t6jxg1o&j<`*3XV=(h(_x)
zO)%i|9ZuF~hq@mI=KtEt3b!#BKa|DiM*krow6HV&C_P;C8wq!@-FYcb%|%dtpn_Y3
zm=Pbx3~dOx?$Q=oa}H&e6u(k0K+KlAL`g+bM&V{;;x4b|)hv28smH+ezsSD%01Uih
zDZ6E1&I`u8LWyES(5gpq%y|gsX&uTizA$Q`LJS-!^tgLjP3
zPEh^IgXZ$b_|3l+N0su9FUvd3(l2Og0p^h7Y)(m2lhF*TCMEjT#yVD$jSOHE;+gR2
zSq?{xvdhNxVl}N#&UDZXUMS8Bm`G+0*w8niaHU%j|TmnrV*|QRG4T1Q`F`tD}&I4
zWOO&4G3h{GNGU8+bh#Mgwc;6-(V3~NJaa)f@d77e?kNUFGM29K
zW|%#C_^CY9w&Bfn_ci{fC|a%X8X5)!?h02cEaD$4H_yzP_1Io;4eaGE=1p-8U*I#)
z0-9)Fw$o0_64}`1eC1ip;5k1x4xj9mSW?Q
zaBf8l8;G#qp17Lc*3rZt7GTjjEk5v&Ei5HXdyZfp3Id;6aYFhd=UYfy0C
zw*GN#`N8QKMrw$0C=M*zgNC?P(F9>Csm)`TV|$)n^X?-67l;XnNn%2gw$F
zd;2QsqtkpeXB7d&m~M=^t(U43a6a-)rb?tM-3uP|n`?FQLZR9E@5h_Tzq#g~-xBz|
zb({95T1lTy!e6UT*nI_V25LHB7=J!45j0B`!ZRC=Dw!qjaF#BpmoKxtIv)n9pbuXS
zrsXx6FQj@l1Gs;d?|4Z@<0TV$F2B_7yp%B1nXb#_s@3(ga085(5gM5hLXfU;)1pYS
zLZrkePpGDi+(n!`*&_mPh@O%({3|2;`y&D?dQn(4)x|*~c{rV{=jW~Fz1IKonm&y-
zqnHXUoPska1GywG@OfyOyC{h;s{Ze+0yS1BK)Fc?MsH6|5h0hzzvsU6aRd@=@QOl|
zat4Uo2>(HI)xh$8qPWaO1dop@SRsZ8ma&AIBEz5Peu^+l6GvWZ&}z^qocthORddOfv$f4bvjI_=}L!EobTxZWKV
zc@Q_y83m9G$qC8kKiz3(ekFSj_yzAG1e-xRyX6$R7@kdHfvLNF%fgoPQ^s7
zVGt_jJXsKiyi_?1BVk%uD`jS&Xod@d5s;dGayB`zT-!^?H+hWW#Q{Bki!Ul!j3QBq
zhOCLb1VOsFT$VZc9+B;$4)b=L%X!Du{^p)+tqkA1(?7Er?2A1EsAN_n)
z#~g&YBt}*C*+nrf=l`jvvuojG3a0zp&bXs8y$&dsj#Oql$Aw^RBD}4lMokaTlyWI1
z63zJcy>n&D(luw+uXYyxw2!$0QrQ>qSJ4Oy9K6w7cqTB9Msq&ST-eNOp2vOO_!&dz
z8sOZ}@T6#dAid$A5CC~C#Wk-90I;cW)gYyGZA$W&6g~QosE{diVe_RTN1CAq4eAj=
z0DX^DMOkJKvNPzQ8M#7N^ZF<0$0sjf=t=g4!8*I%*8gk?2nYnUpt&L9~0ApgC1#
zC(*j}ie8tkc@%tWa`%|#2Dxs@mi~_910}iTTW9#hv0ROFoGNr$jkv6?n?8L8_UQ*O
zXh8Y+0NGX5x<-clIl3z=W~;8xb)f8~^z(*aE6`((>`y4LGZ;s4Ry%nyd`ov%m=Chv
zwig98UwibocWjDvE~T=4q4hZZ9
zvkDo6A#n7^54~?Wct4xeSOba**~#+G$tKvXP^)qu4hkqzEIHO+3DI0x06A0eJG<3G
zfs3afsq8~&-eTK`hV{JKLiQfV0qV=ULzGLFj+I-sjcnIiVD_~f*M_LoKxh0Afyj?>
z;`enjSJ6&Qae~yZwk64>0hM?G#Dybq#kSl^glpx_)HOLE41s4}1OAH?t%l3BX0Cw@
zXhPQT;$@eU>oq;1&7t+zTHo4BiLOKbgV$>i@#E^#5Es4%E{-8;od8Q6akHk_t=8xz
zpM&kjEwOudVK<<9fkRoHl&if$w3nR$7eYd$XpFePfKGdoT-ytqC%*3La9z9*iC2i+
z^}@*+>RfFokt+%G4F}R+Cjd^X6vgDy-81$i3yOvCkBfD($2YA0y8hV6cSRA{Q4sdx
zm$O7ihsRuvu8vjXo1KfBH#*z`;WNG}#=A$^^3FJQ6v*6$&4$r|n75jS(iU9w{Bo_>
zJeu29if{>$7B;%o|Cdh5LX`Lrp!+N1;dKIv4g?E))kvU!%keS(HovuLoIog^~L;LF#og_*!80OJR{Qh^8$=AYM*m>t{^yiy`yhFf(&}}E8akmH(+Qq2*k?`<_1{2r%d53w++z`
zAPYN=BdG1MLBatY$CqM{3!E0gXinK43E1tJztz{9^H2n
zPES2^AvOs~I^DMiLA|xJwx(4m=KWARVUnF2lVatITz~}787uh?2;!zgAM-VXZzrXE;}TbgZn8d=n;cd767Q
zH0B_nME$bPie;b|h~8H(*XxC^wV#JS*Er>2T)IxM2
z;st}+)qFIK^aY;&;yQ>sL!vT@&Vvk;NAWaBOGqz1T{2A-!YI3zG(}PUqSxNi$UF`B
z`ZiVa5G&{+IFQ=#Mw8Xxz;~F7{lC?u%Y1qAv;}HM1;$5(-*x|Usw;w?d`c6aP3ODm
z8*XseWAOg*55#)bv*h0qrH{KWeP|U%n%p%Dh}qVORikCYq)EH6Dn@0v*LZUsXDk~r
z28+TB#Wei&_D!pezXkgEt=uA?)LYG5dvk8dGCn{Wu
zU6oXpdGql;vw-wYII#NTs>lgm2B`+4BfJC-f@dGu8PkSDiO5{S#`HNKKJv6gKs;4OjpJdQiqZl@wwuhKMzwexes~xH9qp
z=tNQ^EmNaKqr|HS7PjVeN(x^mr??-BXL|j6>~E&@cioxxaKY}Odr!xUD%4ep3wQ23
zvPd|$2jC2ZY_*%E$$htqGm5?xP7pj-6iEs;z47^=GuqoM4Ky1q_^(@htI7SsDgC2i
znm2}c83oq11hJE1PIW6k#7AB_-A-=ea#5gNa!-MDf6EX(4kVo4YgL={N>}tGd8Wy3
zIipo?bPY51_Y_3O6O=V1D4<@arz`1I%`fiKg@s^BbbjFk`@P*fJn9K3DD9PdI&Rl@nE?L+jT~WX{`}=EA)lzhc7)lx!BdqrD{#J)6A2
zXl@SB|M75z;fEOxk9xN@mlk~c*X6YQ)ectelSF=y1_zAWy`kKsM+UIb9^})QQ~5M;C})3MlXi`YJwGC7~O(
zhTdT(a*i!DnEB0BHPoBVD~7)BZLw>xzH8j^IHY_DP*NtJbW!n{RVy0HQ{lrM`>~-X
zs7;y!rntM(7&Nt{d;LeJ81(4u^dURII{(r-#`jp*44nZNgIIL;h+43T9;B~}_)Bp+
zNA-?-#
zE$b)dWs1vpwM)4>?EB@zB%PG^Q)pkfbT1tJ)s8Dt_L?3HyUUONEasGY
z%#Nb1{#^)sb{bMljov^a&!2O=u6S
z)O!DbSL;!#Dqm_J{@c2oRl=i6u_1gcSERf6Dx3gYQWBRdEpic04*I_88=bU|##^f{
zo}o3Phi^($i!PqA#EY}!Ns!~hCN7i`h*zZkx3Sl?ii7AkZgajb@vLVmuVfF2UoR-t%xc{2
zbZ$-XgUMCEm1$*9+||*se`DDtDLbEj+Fe+H|G6;1K8m?9-P&IK8GiS0acVJMDC5l5
zO!+P{HQ{A3+v`ag3Mkd%3+aWVT?vY}*pW_cEN`H+rvcz-=EYswRMh|#nb&So-L;=O
zc=^>@&1wsZE-wkieZ_BVF
z1WSL=X}h!O`16yC)RUx0`?f~5gVipOu7Xyt)!xOL(p^q
z=sV+x3BnbxTK+O2G?W&>x)ot_bL&1^Z2O+x=k7FJ{qr&t8gl-f=5C_g7(ZODX@L6_
zdHIAzfX?((o8vOhQ+8kYX&G5x_;xCkc`Y?odbLpO_CAoE9{?mvYFl7IaiZ^_jE~24
z_md7BOdh0u&FoV;5)-?P-4|?!H|wYf61n=q>-e58s?G;av99(zboKzj^37fJ3_A>3
z>9*NFTke~jwY_$4-oZ1oUj!xpc?INdsh?2R%ES=|kpY>&99dLKcuFlBa4uYXogRO)
z0q&LvAz1S?Uci)pV#%O(`VpO)$Rif5sd=Bgy
zhR^)tBc%kVPpmFt!OL@GPR;>m|4E4lgZz}Ag>>P`
z?%D_L^UKXspmZx$?=Si>al*P;+U4S&!#sw|0foY
zI4=-0<_z-}CKC`=Q|=8}GA(M6^;fvH4it2(IlD?mcDjs9E7jD?3<}Y-yn9mo@~lBX
z(VyAro%tQ1hfSAbYC@A;x~nh8#7ZiPNwuxp=eFa@FJ&1b)fSd4LkMtEoP0E64cH(W
z50|$D#TIrO2DPH-EifSQg!BwDcM40zJ3hMw*rTrZjlrLbMH63}ug_Jfss~xV{H}4!
zIgU5{*2Ua=J(kpl(r7qTz}@^BR=aIzR~JST@=8xycA4kcHcpZwtbhn>Up$l6sOBsn
zabi#0m5y0sWs{^bul`y3Nch1%7Bdy9%6d=Ffo)=7=zdrV@9g$Or`Xm{MXSiu`QMP#-_1RQ=vg`lQ+o{`2mW8V@Z*EHLnlfm7N@4HFz
zS>=M8(;#htXTX6m4@f<6)V-YMgY
zMjR7%i{|~~=yA#Iu_H9SPpLiIpSk%;>;Fr`j)p#uP)SE3!jQSJ|8ws05rG<8R
zF*-Dl@=^YhB9;M+Xuv4He>mQ@o;-!A4(lRP)9mahaAP4Fj)`^;`PlpISibyb&B9*w
zzK5m`(_LKmAcq>FFXex<2lR#20H*E9)f{&iwJ>l@Rbk9
zh*V}&k(mgy=Iqf+D?3_L_m~FFaQ6&EiBbWw2*dFZE~kXHVVR^gel7Otp7E5u0Wszo
z!T%1^@F-vVhHvpgTQfQ`tsw86!BkqxM+AC
zXsc&@Os11jRFXpXG8`)36AlKGp8x^})1JX~5#m{gwMP4`R
zl(nKN(mIqLg&Q*^)PRxZ-s~II;C>FpbO|_^>sj+};ViFgUv2~Xv1T+h+ZGrI-({q6
ze)dQKogOU1!^yt$Q0<|%&*i(mPriTA8i~&Shrhp5wB3-hu6mEB-JL}eD33&=_K9K(
zpvbBekSru}5RTg?g6zp4XMK=8KwbxkgzIt4;(6*RAnx@`7f7INIIf#+s@YWVShec4
z(EQhSr&DLU%P!o94J?5;58;gMcMfj%I5wTp8P1RrmNk7S;u%WvnMaiY3POpD-kdQK
zrhcR1GR(v5jZw!}S)6IEE-a36Y?2m*PU!O#k#D$A>wsy1=(*k{!xY6o1jTxgpTImx
z0Qxt?K}D!YG5ylt9Rh7*B~LctiP-ifY+g=H+Fv=A2Sk1>2i
zutksLtGt9{P;1_K;^?cPuwydpQ6XN&?m8wJf$IFZkuMihPP
z7h=k-S<~4FuqQchjViF$eM=Pn-kzx>FPdhUaiMHRuX4=`@R!i@2jt{lrz&2gAmVs}
z1JYqBo??s&>|nRI-tUM;&~VQm9AK6>A6lC&kvJ|k${5tN67^#4%?|hI&XSp~2wWJR
z{j(q^CRN3h&9Qt-au&@2AC*1_HpUw(a*8UN`QBM8uNxyN8XC~fQ9vp<*1SD65>njM
zC*b3_Uxu0DABQ`Vb)@cnqm
z8SSu&cQ#Q6%7>k83A>|idxtQK1MF);po>6f%
zz*#5|Lbv3(XdPf-YB=}y&zg&A$pwD^(un^QWWZyfc#a2Baf&v2oNIo-`@TAh`^vwl
z%4*R6tjj`zI%)D+O8dAfiu(IE`iC_-?KCV%(i(=-D0y3_ounC_JLrC@C2Wm9!Iaq6
zr>KTwIcCv?M>usO7LI%ajs_D9|E?p`?B#1FS4e*FH%ua76mbk68(FOIIS!7+vHl^O
z`e$e^I)wQ)u34;oKXU;o9)xCI;nXm@w{q@yj_VofTR))S_^^(RHc;Y
zXYx7-K@Y|~*bC}=1MIj1fx>}-YvT&OBN`j}(t(6%#54X>3J4<>>!r_HHaTKwW9n=b
z9@%{5V(;GBB^Yv5{M=2>5y*0m|6N}nH$n1`GcID^H(k|UgOR<{iTLLXCjdCbySs%sQkeBIyKxg{s8rTbAa
zNbm!6`09lVG{p@?clDf4%Uzm)%Jg#~5X5m}&M7SWI6B@@b4Ifpzx+v&Z%Ir6VQ;Pe
zi2*O2Z%WSMMbP>L;W7gUw<%TeDpMI($fdg8d0T(H@5uD`dJxY^Gr(nju}He%`}M4f
z*49X4>CI72ZrrjvMSsq^Kw7r7@qLT8>}1$S?`<*Dgo$Rzv%*aO`=6hW=*uMc&g%Of
zmFvs=;Ai}*V}zGPqa*=$3{&I+Q$RW+LS^`sPuS8E-sv9EO{L8Eo%A+T@z_ssaOOJ>>bC&m5o-gbUr*nEuOoI*
zMM9-*9$Zh@{*;T@lY{Fs$x?ujFa>V3(gL&JR_L?FfXT=ZE49xrHRSg%ckUnTKRToH
zR5IY1c*o>u)FUm!cQOgx6_~ZKc8mLb__$-$ICIn31ivuq<}#|ZHmcD7hF(Vinz;HQ
zaJC;5FhFPsO_~L~0~EGUo-~5=#jsd+ESp+tNmxtFwwPysfM;~5M`{NiGq&0eofh;n
z_+(5lQh1*!t&pvt;0#hl-AMKT{X7*LVK~~F4&6SGb{c8Aq=DYq{sK&0HoOepy$CEa
zlm}RU-n%9W^r-`Kp+J|qL0ok}v1jywBkXjIzfs*lDWk)%)@d!QuKO40#hk1IMb?ho
z2}(dY?bK`9V?o|U;=UsaXahwo0NFkwiQK;Fo^AZ`b2a4pmG`5jfe^N#)DoW2g6AU$
zoe|Fyi4qzL`0{wku*dA+Y>BaAsnz|dp2L#uivj{5zVP)kD=L9ecT^PasOS|&CoMG*ca%9(IvNI*xn{C^y$^O{YeEg9
zc6aq@?W1-)0Q@(z_~-Ad$$VD76{Vrj*pCcSVh024ze=J(swMZ`+=O&~Ke+O&Q)g0z
zYwv-%Ym8&xEHWjm{?DSRPte&lIz{v|>Ddvw&qvH17dBQMhDOUpOCB#|=P5#P5X+!7
z$lefC^w1O>Rl*d@N*l}GbY|bJG8`M@_&}vhCB@$?rhbLSDp^(wWdJ@t1FE12p%doA
z3W4fUMVv9pqVjgZQ*t^$y5lntH%@V3)c0Pi_K!($!b5YP7#|rm!dmQ=fN$Se)6vRC
zF6LbxG~
zsOC!5L|Q_N@czMg#g(%UwlSf}F+QvCTNi0lp%1c&X>wv*bn)h2h=D=Q$Y*?LF`hhw
zs2}%ALLt$=i*gxXO=3&up97H2DNr@VtJw@#=DzsChhFy>9Kyeu&nw@!lun|>C0-t;o_paxe
zQ@h*Op*pZMSQ@$G>q&Lo%b1l{MUJyk%EGQv?)^!OJY6+^-l{g)1ub%$J
zH2sd=B%^rzmIjtK_2iSu6_-LxkCDU$#0k~u)$RQaodnE!rGI+c=<
z?!#S!mWv3k!Ng%F%ENq!W;S44xGpwAJW4>?#UdvF!t=}{knbDy{XjhIYWeL|^;-*>
zRz<^O!xHShXk|h7FlOF|KVnE``0x{QwnnY$CL*Xkxpey{2Y}wjPTmWcQ3BWKmES`*b3?Bd*uev^r%>&l7d7~M?wRh=1>n@&uvAT9SdJnKO0H1Jpm~w56r^vjnNF}Y
zm`QcdB4ys~ZWdm<4AIr(H>x_9%ye2TBM4^xR-5UpUoEGsLP)i*52$-tZzUCT1uuf9I&~+Hz#&wMAtHi}@I{N!^<>0wi9r~i$a^3lUTfw}B0sNsnv?*yQ*UPV>q0f_=a#bO{%&jCB+WZc
zt94fypNzR{i21M^SQT&>MVvep@58V_VunBW2cyZKaq{Y=&1CbH3fkhNO3Bq}?DLuz
z{m_VvwsH6Y@Bvl=9tgly%j9BiM*|`80R?yCb
z*x$Ec{qda{^IGw58V0jD+<*n9IAA)$=0kYi_P%6vi=7QVJAEt!s=gM>o^`E{^$cDc
zE@e=WE5bdiI6P7(@bTACW{TWTUP0A)*)^}8t+pO4&JEyHRv
z+A_7L%n#cCo*wkHf3?NIhA0O{C>_cUqH?hyci3F^bBMR79Gt}O88`sQ`@vTUAu2&Pl
z#z!q7Mmsq~HmX&q7{`&K?avrd
zff)^;{V2nfYty!&Et8|5kIDli>ulAz3wLzyml4XkR@Hu95w`X*n0quIF8la+W=f9T
zE!*tk9pKtp$ZqZyY4D-aZR+i>FFdh*@!|(naaQKn1FcuRE#};KdQ_zPC5-9e#KA~_
zcM%K9%Nr`7rpb;*P*uhgxN=2Pmd3F6VkF5uKk>Qi-=%i*ClTI|RheAd`c~sQDD(Xa
z_Cp#`u*9SSG&f8j_|d-3-gD9Mi+`^Lk%^Df0?^jtFlyrs65k6t&@QPz-jy}+J0x}Q
z);r;9KgyE}nr7zw8&
z1rj9~8c0%e16uR@!hedObp9U0j)C@MJ!Re{?6Y|DVk8oI-p{m=`vPLan8kq+t-eOX|v6|#WOrmWQI1vDVhJ{;=9`O
z1CFrn;R{PhMkW(Z-5g1h)4n_@VF>_84Eewz_YZ#Jgd!G6i{jN|q83ct9{LYT80{A8
zqSg1FGEAWYmOjTONw!}JKN}v-Ocw%BGes?_9wQKRXCAC@34LsjC^$r4I?a^(Obd#Jh@Yl(P72zb-ZyboGHP(c7A5vuhd_DiE
zL0<|HuDD1m(T-&jK#`QH(>QS}h!L-H=l__?(|rP{|Y@`!zcA?HgmByH4#n5nb
zIAAK~e%KPJwmRhcI2XV6=_?FTuzIo%-&)*xJ3_mdgUKuAg>&o*s7p`c#6rtCYzqEb
zsW0i^L)cF*t$ic!Vpi62v^Jk%3}&^;mSy+5d~75z!t3luNg)=Km4GR6hlh`d~^
zP;*5{>axMTs)G}^72Fz5la77<&>(<++x05Qx2K3m1#BtH^8^npoqh!^Q+n&abD+J6
z@-W}qd~{%2`J*i2-GX%V!)MMx*1Tb<``p_>(w+NU;Y_=K?yujA
zprtU2|5}I|RT3rsei39DUbZ(IDSH`pi_Gt{{-!nMYd;;%P{W8%mnb1gob}b9mb+v)
z)>OuRPE92^%R#i+6z(`B7`$ljAlbgj#=+MjVmj6D<2y=89EcIXjh19d+A*B@ZMOw$
zur8}z3<}a+yB(w~JQkj&nst}b5_~(DD22knjkQ(qdQpJopp-YvelS~`GGeXY96WUr
zC~Q7%`o+7ES`nJun)HsAiW?J_nRSJSM+?BfBx9i(>6wuomq01h2XxadF2iIF@ExMr
zrZ9P2I*Vl-fSq|Ot`*-!wAnD(n6XINKVE;h=6TJ~7ikb{_N_19lm$2-HO$?4dmcRM
zrjkIuUM@&FxP>WG6XrtT_cNTj3V^}P8TPNThc{F;bKURESTTun!XC?1TI!qD0sS(ljYkS62OeT}3Uv
zt?A(K5#(TCi=o0}ifBFwJ6aic6Vm;VIZ4=ePTMK3O}y$eF?(6P;o2@pI#8#*buKcTl;gG!+RvtH)a}LWYdJrlykH>769(^JH@p@*e=IA@lXR}63quI3y0hf|F
z>KT*-!Z|yh=li4M_k!u;*Ue}vJ+uuB>rZ`g&TK)Z2k%rY43a=qvrjyQ!mH7pCvMs6
zPXcbTcmk^Ti{=UpYgog}f6rX7q}T2;v-E=JF*{*w@Kl`DNFi300Q_PAiLcd#=L=AfgzfM&)}#_to;qR3qbPgx`FA)cqK
z$?R2=wEsTAI&hz_1r(BHcM<0E^
z97^QHJbSUU5iwx*qBwkzaA%((f(d}*eS!GTObdgKo6)F*pZx70C0GY`9!DL_!CsBubnByl|8tJWE9PaG$cGo@##y(f?&eULmIC_vF5@LPzg
z$cvI2fJHw@4xOP59HedV+8t>ykYQGWkI?+O;^u7U=3c(%zvr$C*YRcHeoT;QTf*D~
zsrURx`*x6OtOcZ{B{|1In01}8!1QECN>+LEo0(6HPgs2Pkon$gc1(foLh?Q82`Z
zx1pNC4NHjTP+^NRscAfS2A^VTAEO9hlvql}!$`%wk6(ns(m_DMC_o1aNLzwQbhW<%
zkd-b0d&5CP_h>9FB<0sO`_p@9Iuq^`>KTfywdX(acRuj8I9FzapyYcP*as{gPMu8^>(p*S5IojVXSuOg1PI&SZle3R|7
zldy>9C0+oVlBj~Nh=ZVpq5_MdBt2iRvPQ5>|pY(oVF3B*r@+CORNlVU%5O2d{JxNg=gA?StsUv=sM=
zZT3O5aFAUIejWmp2&CpmNcRfBnU|M@#srHD)#ruw9!V7<9(0b6bbLkhnL4!f`N-a}
zC<>y50X5c&L5dd*HjKMS75N8)5JlijDTV?Zw_=3uSvYz%xb6@*mVoGtHD)h5n6h
z3UE*n0+fdWpdLuFn}}!uU@!t2k9Z41;h}k{_C=}MM6BXU@O0ofNEC3Y1k(ntb!mvB
zgCq_{QQDBQ$=hjwM1?ZPZ7BWoT_azRcj%ld@i2-hFs;1|8x{{#RDAAhBHp2>p7m0B
zRek#ink-M43h~+^VYV`ocz>bnW?<(?ZY%iG(6)nPnq%p}O)@m&@*Qp^b*0j@9+b}Gy22SA~jz4
zXb8FqZqy<3J^~pEqjlO9rlW89^&;6C?
z_H%v-@)4!+>S7yX=5TxOlmPYSSu^Hym`7)Ty3^n_qF#kiqZYsX0z<)`A*DC>SCbK|ef|4TE^a6zIC;SUca*bjVo+cuU6ED!x?GzEpf}Xy}}2x7eToMB+0$
z0`yjVUm36>3>}<1k<~K}X-e}WLykc&(=~i{nKU9u~jmgW^G~AtI)~TL-3oP#v
zO#Kn$XA+Yn4{9pGvzn-L(g=y8l+#e;)y8Du28FUrJc~gR%OKw5JL=UYDP$Y+IGK1w
z{P4J^c&GkSe3n`1r36yZj+1x!rD&J8=nrpgW*_nQ5wa^b%s;X8NR*A!>~-IN9r+@&
z-{U8+93e00Z=@ahhQixeLhh@gGI6fl(V-coq#P0|e25u1fNq03m?Wfh^SV>U$ScLL
zRAN9=D0#KGOr6E;MS9h^p?QhpCIJz-
z!ribWY2$J~Dj)T4Npup5Uvd&WOM$*9#+M|dTE?PitMJ4A&HP;?cl0A9{;>u>-B9*t
zK}x5I_}t&S&C+&-w9lsUewnM0ovKZGm
zOL;^FDfQNp1x)f^G1us7D@)KYk*upZWv+_k8(b%)M|7l-Zt7Hs7%&yOOSIUE
zlCJV$WitpfZ%h%O=K+S*St%odMh*aD$Q|8I($>BzJ+K|gYN6(0=}Bs
zKyFN(i{GEt?RbvZDY;9YiSgmnar
z69w(aGPim6BqjYI0Fv;ksFa6)CX}>3pq)JaVr;yXR?JAB3eJeb7)Gf-s6y^DNi{f#KL|)a
zNN}*5@@t+l=jowwn~T$NS5u%?K)>(Nf5I{ioy$C!F(%AC3TfQzhspJ)8?{v*6)X}u
zS+R0Pc*@@wA)njwp&SJPPdhL@-b+USi~qNEhU)2(k4W%%L`%G9jfsl6hc{XeW82hWrnbbHT{
z+P_?~rgbQ#*qAS^iGPOvVElb9>Z=We<^0BqN7mR6!h3BL@O5EwT`R&`Ty@J!q
zT|qkf{bc%wj%4>{rs5k#qCfTNya$v}4}wVIh`U-V*QW~z9Yc`Ne@1rtQZ}F2!k%5#
zYcR(H48bxZbNkrM#}a78eT#>)Jq!5I>Ah8=N*upDBQ$ZRW)1shu|D8*7|S8dLY`6X
z#B0%Ik>l`IA4h$hobG|@&m-$!=*tQU`jQ=?&tB;Oir6J)zqgNma@Uu;x0|l#Mi_n2
z0@@(A*T~z+Ascjh&jVBs`$({a(sll0Oc*8JJqaxwXy^npe2e)jf#~`2wM`>?)AN@h
z!o$G-j9UTZOH@cv0BIF#4uoAj97NaabHb{j^EwmM@r;1nz!K>L;YN$SD;k=|D
z#g0I+_V`|{HP)ZVtTnv$sa9)e*lZK66~0m{w6n}>NHAtM%b=c(^9urvghyfFWrPGK
z*6a=>(n$Lk7<;I_0##{IjS^UU$=3R)skGUAdh11GM&ZtFKC;yK
zL_@X9hTioGxkk^LUrtOlM=Y^P3w!VV$K`{y!v*PZ@fLW((?_}}g#Qw~ZNAH%
zoFx53yTbB0<=}-r_zl0wAVE)jsHAT>h9Gz}yt6xg$1b}X#k3j;e#^ovn18*GscC_#w~H-9}@8S%X6
zh((1ITVgX&5Bj6jZA@Z0j5P=G9xFcfgM>rT=i0MfwFzrAquk+J3HBgzrwB75${iap
zx?EF|>M$?Dp9~J5PFuDAS3;@#BAFZf^{lGwb#1i+BQTB~8LBZxtFKinFVD&;wz5#T
zn-za<8=5`7lq8w1ep*otozj;gueimgY$CP=3yy$=7x{Fnq%114&9=W7m3y0U)fBr+
ze@&7=_vBUxHBEiBwRGSj5fmKBql?F4JSJ6k?~H0L`7qSuk_016DEH+0gO#Z&edW@i
zlKZj*DT)U%kQbyXGBB@Li5E#sEmHPh`Q&Vc?didsAmjNlGB1I<_lUgvi@RZ@jT4w-cOT+to+QV@y$&
zn}iF7fxZrW4mMw_WhqYTsQuv(-Dbm0F@4AOiS_2+91DP}KyJ5kv9Qoxk#75%<2~O~
z9P=##|BLN5N{j42SoJzeQdRrqL8kH(0n2*z(LD47?(`udU$KVN)2Wz`DXLaCR`R@5
znsWICyjjHm(r&xxa+`ZTnZnE^<|~5~5V@$ihb18bSJ3+T=XSk2WXorjp2GO2W!7_@
z?4zRb>fTc?$tI~UgFQ{#Up~Jt4uXAkd5aFO#9e=TeiTrQeuNAVK{W@lN(#cnx-Vjf}uQoZ8@0YS2h#VyV(0`dwNgU5I(Ce6>y8nom<$BN^#NnQi__Wq|
zX)Hrzd7e?+Puo*g1_Q^lY9Xqn#lIIgq@J9K-bs#>{7=oA5$}5Oj7sb_;$70?&j;x@6I*ysRw!cU);#
zyc|*|ar4UFLK%5Gtj|B>8MSyPizAX2*t;Jme5=UoUnG`scaK9N=~qgMLuxGP;*Ddu
z$^3asIZf^AMgh@e6_Ioo+CF*Gvz5ctj7a6ZbYoR8+FdUtM9Fn?gBdma9~n~RaDqub
zd!Nko%u}irGb=JOxcX}Pk*1eCYx`aWfqNY??|_=(z3D)Xiqebx!3#mjGBkv
zoJRPnPV1}^Sv1o&s6{w$x>{lp3v(_4P6Nv(KCU<-Ev~dbf%b0V1Nt|DziKE1~`O>$Z=B__NCF@-WzkdF^wGdZpQ2)kjdV7K`Fr@j2&69!F
z0*@w>nyd*HMfE6I`M4U?xt#9voO>o=O(;>Eywx&08U)ZoB&QD?V*ge#?N1FD8zd7<
z(sUhOd>z;^O5T(b_uIDe>jU>;hZCoBg594vbV}$c-VKW?ZtvEe-rI)JSCM+>ih
zXNoM($WKoQkonJ2g|STS=lzS;!OkNudA+CvAxNwWAi%PR(LW_%{L7c7?0xdqxMe&i
zttgV5eGQ+8PpmsU=$}oKZXIQVD|`YUlLqu~US+<*wZE;s=P7vmuh+DGrWaziQi1bL
zj!*sT)8d4iAh50e3|C*!gP=M6xUD?I)Y#qk@VmW&Rg8@L_1Y+xm_ry6b@2{-nqv6iz=&p%TqY(s4uNAX{A2l(tl?E@kqfa}2N
zkiCbd?tyEsjkXGd9=+M{)c_FVz$T^^~YP5!@}-OtwtdguDbU!(+o$g1}-
zf>53&dh`>X>}r394&3qqb(BG$4~5)2wy2bU4QEvuY)2Ii;=7;k{<8Y9QalV90bpW_
zr^@%(Djb<}{~GST3Q|@5F^}e(_s{eChg#iGxXEGYza5+Wf<3$gtvbyH^Q+9)bfP{N61#ax)}HK~_c81=>#i
z#n2y=yA6AdNp5RZZrkbZ%$R{$6-J}t8i-L@d_3r#p`HXT_eXNlGV8FcYP*H%Fq)b$
zqio}jg
z-dlM!%|7wSHzy&8AAZFOWQW4m6jewq6Fu@SHk{EHIuns?Duf@_G|5cDXxe>nDeY}W
z!)(=bcUYtCCf*>9-k^mjq>F4|zG2c|P9%TW2rViy3bg>9?Ry2cN37ew%L;$jw&IOa
zi9PBJcp^ozizDAr0LqwN-Bcn8{j8paha-NnW#F+J;yIIY`rCPhm5~^0b@`T0_*V4j
zf~zzh4D7R_quFbs#{-PH6s0%xNuXiU{_BFiYB7rjz*Ta5dPjL_i4bqc5Fj8j8LCC`
z!`i{oD<&|6|3?THg~UR+;cCwFOuPiGFNUcbhUKG4rIoLV(nGsOI4EMn-aEWGt4Us4
zk8}K~_;E4*VVI*D*N#8Us!Sn4t(C?rHpC}Zz;8o%t%MLzf~j=_h&iy~`w|oPLRn$r
zEfJUd+{8PZ4zy;;Ivc@4l6}NK)CGId(7)_&VE&NE&V(Tgew<*n(C|$ZN08Djo-a?W
zw_q)Mb+;<(OPB7PkPce~et8w4N$!XUl5Qj@d=PieH+3^io~M&oH`@{@8D&T@3l+KI|`sTKM>l5N5zC{3QJf%4)^
zm-$lSN+8dpxtWQ(3^D(e?P8i$@1KDP8l`+BrN?I(
zg{7X^LyT0V0E!lyXDHkXXL+EMz}*t_7wde6M==8G;>}2VQL|D>$MWY>a6SBrH0z)?
zNtOrvV#7ttlYLh5n_NqHUVcf8KUVo&8}SZPJ~+5UaVvXYJqIT~i^!~~xBPX%P$fG0
z!Pl~mrW>n@>nDw4T?#0#;GI$N)i2RQTOxCmR~kZ9eZSa{yId%~60}w5Stl(amG9J6
zF1{scsfvuwqZlzY70BUdW~y~0pmAxFZd8y)wbQr&^01KaIop7Nwaigrby0%lrc%|Z
zQ#B8{<>`V|r|DH+L`#>eDx6I9x$k2ewyL1`=@uGgu8;MbSoDRj`QCeCa(C(b9~B!(
zaS*iDd7I_XE+?<|79C<`D45l3^;QZ=N+*&iuGV>HI#(|%Hmz{eJ55H7B|
zd$+>Qn|2;6rMBA}AKMeH%SRyX(ElKYOMsFO_;2%E%kfKiggE>Si7*mKVLjPAlkJMZ
z?Mnt7M)~dV-z`?=wFv3f5Ah|zLR~5$_%i?u03$vK4wOn2SNBY<43_utmf;cte1QQ3
zc)Fa;+l9{so2a{FG&_(k#Yj*@zd`H0MrmbRyTF~K5F@4s0E+@f&;kH?yD;;l%5a6(
z`Lkka?RRrocT(rKMD}$)K`N?#cbb}a9c}d#+?Mu0ijIaLb7&;c2!@%?h%bf2#F^Au
zoN6;X?`@{(5maxFtZ$kKX=s%0qjYJF2MsLq6n}tp2-<)M5Jbmtuzom58;0xt+vG(E
zGvPs7pm%>P4VOuN|0Yd+Z+owymjs#1faULxQTaVT`+9yzmo3=Ee6Rs^A&8_0VgEW+
ziU=GKBfgd%M+c;QtnX8rH2bvq0Fil9<|yU2gh8sE!B+EzMG%!!tt!xh`&5tk6ct<{
zFK7Vn)Y>rSZ24pOHi`0G*s=BJz#I^6rA3
zhYp^_bMcD2wJYc2KWZ0I5HdO#(Ze4_^AsB-emX0WeVN$xY}#0R#
z%@VnAp&Y`S|Av>$egT9FpZn4ekko4r+hKX_YB2qjYEK4d(y;T$nvR0Fjlr?hHF0@i
zy(C`jiv6lloC|Ah!;;IBT@RBube4?HXneu}YYbJr-*$<=4{^w}oj$QztLKE&txaP>
zY!RM7E=K$>p#abVhz>a?zX-C@BjCGS5?cVB(N2e2i#%@?IUTjNs#->jEfYhX?R<)G
z`+UB+&YK>&7PgVi>48Bq82NAn$9g5~Z4o|F1ywXyWE
zp+**wRaKJ2rQ>)MIej7NJ{5py0mP>Vz-z(fww#|oLbEh>
z`pa@*%l3p&>B|jS!p(|re8NmCkD4nX81o~q5*m3kX3p&REi5v`4e
zDVIB`gcedNVgfHVZ@o63V~E{*5p@9wxfcKq$Qe*yk-OHO*&msPq?C>SNKr3a^i;Qr
z*&N!UjR|XXu$0#-vZA|pB`Fp_czQd3EeVzx@dyDp?D9JUZvX?xoxU)L`-`OApZiz;
zR$-z>|LqE{|6v}?^dCcj^=yeWQt^$5_bzvvtTo0pHS|jg_QKltM7|?+J3Ov-WpDW$
z2H}Ka$%m#Up+fH4U#Dm&7BB<=`-=QPCIkkX*M5Zd9Bt#A(xIx>w|%W|a|UzDlQT?l
zto)R7wBbHP|48a+ttB@6eOw_F9n&HSME%Q6zXfUXYIj7MXw~s$fdyS0|F<5u4c@i%
z8pa<3w)pmITv()%3mD7)>Oxik!hNW^&Iay{@C;!>3VmFx@t)_CLq@}w&$kX;OmvT9
zU~x}y_CC~X_PE?Cl8W4>QtoUpFDG~P
zf3nK09|Y&;NzRey_{tY&>3>k}8?p6Js28o|y6Vv)pCu
zH_KVttG@WGWFq%*qRZ)~tIMm^(yX#@QTH_SvLs2y>%W9MtZx9c`*)+ec%U0T)ZWrj
zD5m`a003VCcmfe6_h(;TGtA$gC;!-pte5}GTD)|lRd-38YDo3h^zP|7g}@~j|E=zG
zdb(oc2Kq0?DQQNpei?th2QXj+0KVJ2nu|bx=0gCas=kjE?uRo1L*S>tkL!HI7}!PD
zLFj8k+3a7P%|FVr_?9+Qg(!L7GH@Xo8k9d>BGMj&&wifenqmz+=)9|kk$jVL_-(-O
zr=k+j<#{*y2jkFUj?fdh`w4)3^EsRtqr&KMKo3y=_cLSxz{vPV2Io)r^FIyr+^G1;
z{&!;^J(y6%($79!l18O5ViBKU;IT?9Amk%)$=U6C7OaOOfvj>O5{qR@VP_alM{0tH
zDyh^=MJ%REN9q~x$t>E)Q0Y^e?=eOSxH2j=bNF60t>6pOO{GhE-O&aw8#L>yXR&8_
zqRygR2>j<1dJUbI!%q0=TIzhwj9UT}Dhx`pPUrFkT$;3b$lT`J-M>KCIAJ_`>1d{J
z{zv(9*RN1v*w5H4Hg2p(;>iCJnts2kB;ZIkZL2_D*r((&y*}=j{BLBIg2Rmc&8C;)
zM@HGh(flSii;d>(j}^0b5SR7VgT0sgNX!j=+9IfIH6o0#C4&grI!XT1r#_tjqROh{
z(foX~)g#7P+{3cJkdUAK)!tLkL%4c`F7dC8S8JTIW7V%df1FHZFu4AV_Y?i+_TkY3
zjsa?D2FoK|4v^Rm@?3>DR{+gy%qe&b>q*J-O%yh7y+@PgTcHJ1pNcD=ESZ7ftxWpU
zl7^Bmvn@{H_FU=hn5JjHpqy{;!>uY~1ev$mzxCktIBmwt3w8GQJ0vjdGPEI}JO-&S
zE;JPXu-Lq$A*?&$>%a++sHVnCZvc&9odbkJX7m(KB^Le@VE!O-*(TLay9DD4n`xbA
zFedZWQ^0H|nJBiA38SJ>e|`6YBMZw{U*osT(!82*)C291tClwt&u<#Ap2DD3#tdc$
z%xJcW2!I+FAIx(|k+lkJLXw^Cv`oV|Y;br{pRV&1sE24t}sS<4SzO6%mW)vaR1onvxvhUB~`tns&o^#Xf
z9<@#F@3kP!aIX(i9-(w=(t6c#{cKsI&gi}!f$8Iy`$i%B-Iw}%D&%0zw~^a!>e>9E
z9!qTBe?O1|Q+|Cl*BBSOWeB2O8*zLivf#Ij-Dt6sBuKPn>nk^3U^TW%z7E~#zFK!!
z$=B8ObHK%YfckvwqQ7W))=eki3puq~z8*NCcw!y>Oj3!~>^FWM`hES?yU?F;1MmBH
z&9Uj#EMV&e0gO?`(m{EA9{SThR=`=G8YLrb&*RgA6s(_ojlWKV*EILm>%<4}-x8XU
z_%i+^!{Hh_y#|;<4w9Y%p7;8JkW}iO71F*Gs?7PXh#v+k5L#7Q5
zhgvVV><~+>UBe(+M15ZbJ9)6&mf&5?1U(xg5RI2WS!stW`MhdL;Itnnl7lZkWrr8H3Ndn2m_5OD{Q8sSZ$K9(2K>R$!T%f*I6K6iZc
zfL*iBkWDI@DZ;iSB9*^)S5&=wBC@qg?a7P*#&z23i(tfpV1Sz38RgB7O0Zu6r^Btt
zRnfD8C8s@MP;juGH?TD`BmUW5&!(!!*3D~)nNrE(pRnO1eznxs)zVqH{gU8T9_&+P
zJbuq5D^Gx=8t*cn>yc8}*1Rf(8W*nX>t!p>#u$+Ho?`7!?dLfxbz|phFYX
zuE(nz6mD^ReUllnC=ayzZUk`mPxPz8hFt!nRy%7K=-N7g
zpUKDv%iR^Jveb^RTwdDWZy&TE)mf_LvZ6Gz*07ZbIQIKdmPZ&hTEAoJTGO55T?W=(
zS)aVbq*hF2E-OeS7-3krQijKmB)vwKrEyh?0qVY_IKdT59^%?+wx#3Lj)fW5bt*7i
zm0Sx7+5j1-mB8=$v42tUtyO@1XH_MgvI8?ot{qnUEUBGoJj;hAr8M;-l4k(}+m<)c
z?A?cS0xs|@^3Az5)6cbPfx^N>*eK(V1_VgV;1_Fq{FQ(!?%_-<<{jtWOTegdme9^`
z%X=%V!Tnh`ifW!tYc+Na)a1J6
z#NN;PTpm%}RSlvU25Ejf4R07tr_
z|75i(ZZpA#z8|PXFF(%49I7K}3WK6MOAM%}Th54e?gsRsKHqS2?Rp
zcGvF5*rvU&n0FLkhNIFuv(=L0tCG@C>*&+dg~`VqA=H?EZQHUaYUaRZ9#;8{4kX6NYElmsKL{g$J!SCfDY>R8AOmC@V
zSKfnuaMR7~U_DAo>B|$^I#;shS?;g4_`~8uxA|iQLa&4V{vM%t`%R`=7p7+ObjtrU
zlA-$MKKC8MiSV=4v)%NK*CLMfo9OSU^J<$aw4wXI>7Nd-|J*dvF&q}N{3#6jeP8(Z
z?GFLkW`JS=!+CKT)X(GlX7`_9rf|!jAk@Xs@p3&Q5O{!)k?|1U(dbmwfY4a_j&?iWG|(A+
zPhR3+;Mm}VV)Tw;jH_BPONtK}IOUY=wG6($o$5V6)m`bMwN}4#W^ZJLvcTDd+lX?i
zMaPkO|KA*`47E=`H)7j`>mT6h%?V1dPvYO-g6Be6HIv25Q-V5{0m{?x5nN|GlTjXE-dmg6t6hGVAC
zyHL%{ipkr1mC+ov0#=m-R+XwJm8KQppv0*HS54D~shmg+X-QE#!xWGDa&%hAC#05E
zT!--HIZ3IDilVhlA`$X|Fd`G&nOKP%Ha2&pb;vvS@wZl5h1#O4=F-ztRfBTIP09xu
zjV~QKl{2zKu7rmVUBeAM%l|3d?r6r@4VSVGVPd3&_hbJ6Oihc-_i1VW%G7)eon9@_
zj*rA^X-GeyC3Bt8MP~L*Sm+c~Oik8~#axhI3rqR2%=dzy?MnZ%&2|E_X2P`q#SO^)
zjw!SVSx>|Kucw9M2F(R5z33b%u87HWSoUAu1whioXp81o+8IovWG$Hvuz8RA_|33d
zMashn$UsIpmUVng6Wn3WrlEyHrH75@q|fn2pEF6Ht5Bc2QJ-f(pLbTDuTtO969?}`
zAGWJ67^N>jXCN%Q%qfc_lC%VKGvNQDFX6Y$VYJL$X~1W+%#pJ!v1=fHX(0E<;5nfo
zoX$|v(m?E+0YBl2wUeR+-ZJ~_zn8Jq@bCctSD(xKPnG-sapkhmW8pNEG_m!9J8Lio
zsjw^<6vO{tSFRmSSk-JEanaFEZ9B(&v0TJeB)p?$v0N>K`CEo_G%KyAC+}j!p-m%O
z=Y!hLROh)u?Z2~xEx@?9F^=KbbF4OrY0(O#h%+^`e-4c8j)my~TFANL%`Q
zqi?sqa)g~j7!&&ued?hwqu>X^u?(8$GyNa#`>-I-0&h;{%g)_Y5}n#P|M5xohtUZX
zpPZE5^J_vC*MIj9{Qhy1&*M1rpFD&heSvj4ol&!H?SEalSWpRs8y-97HeVCDEs>z^
zLzN=rnW5So0Hs`Q;eG3Ox)(iY6kr*|nyj}M$XQiG7yNZI>wOGtjPuZXJS)RQGMUix
zGiN;K3oYoU3fs6aC8+aJnwpKnWV)8v*-?g`kTa1$*M?99-{edylIS%FvcOX;Jn%5l
z4nsvJ=jh0umSN34;J-NTF?{-j3&EGig@HpkRY^1pl~7&>aQeU82ib4}#u;nvX<4G!
z*VFXV1si;vh?*8QBAS*GraZ>uGp;;p>h3{ISG2WFoOhMRiIu?Hum4=R5pMf7#p1SpFi4P{EMrO_8HeYhWhB~Pox4NH04$>6Bzb`8M~GDSvKca~%9&&uKlVHHOREd4
zZ*sisIm%|?v7%Ywj-y&2^GU*wgz{YXKL|a7_&Q2_rc;zezL-P46bJ%3SF`Imx;BZ%
zal1d)Q8p#`QS*A`wz0oF#|XQ7ogmh=lO9$2Et=QkHEZ$9w%44+4Q-RW)jM}n{Q37F
zsjAZZ=~+rw!3Ym6HBHZI(vUn0-wHEFo8kQ`W5;@VaYEbTIFc58USZe41bp@z1s|y{
z1moTM@K7lJtX+!R_i3lThOQ0gZC4$s6IM@QscgGe0uNB?EdcF}C(Y-ZXSJqESErU=
zEmBYNyRiq6q>M{viM663DzfhBnvkv--WU`%q7?^}>hDpRw$Jv1RvxET+2pcyQD$J1
zNN1#tQ^&P|i2}B<8uqK?GoSRPxy5#v3BFXbp?!Q`J-xp=*(dVw!Pk;{1
z70Pm2^I0UGDJ&*yVjKmu45t*Wktd~80yic#g#qf81meShYKa(7*=@s|M>4qXK&%s}
ze3-dkIp#W3HR|M+VOb-m|I4X8rj!sPi9!I?x%EF+Zr-Am1HUx}=Tiv|`9;BNq*|W&
z#(xxl2T{ZTIFQyN)<0g7g7BWKu;`X4YKTT2^gBQ%*6l@5sSSf9t7A0Z!mNnJJrn6a
z)d*8CfDHDJ=N~OGzF5FQcltAhFHtXwuhw2*T9PH#Od0u~R*W{+${fhpsUP}BH!Z=DyLrmw{i!);VvPZlTsgGl#vYtSRF{Bbxdb)6%JfRe=2%D3{zJ8!ODJV5UT_!A6
zs>)^~-Y%!dN+%Kf0}Jv^4j=&s98PdzqW^8~c1p5pOf=gGgN%0{6XaQnUma&GD$J6P
z<@C&s9T}ZHky<5k(3CUQzl=F`3vh2-kQqTIR)5~_)@0v@L(&5k-TAHKzVbO2RLT$v
zXenaq;h~5&J%MEZV*FmrE26D~V5vH#ULz4eRGIx8?_ZdfZ4yXiE1?aiQ
zM7XoQ_1p~pSs55SX3sC5;Ie?i{zuEe8X3fAxTewjTi$q#q63R?()
z3uGK7AnjD96{s_up2X1$I&h9)4s1sXS0x$TXv|zpff=|P91E_>^W;;
ztdKY)x$u2-zLQ8wDk8vQP>M>+_viQb`SYH0&*Qv5@7L=|CNnq<
z3@}QHcYSZtQJgJJvo=FR%IIYo?yw|ipmI=2Y=XCC>j9XPJ7;;+7|j5=$l@sV!lak$
zAd=zAjztM94h<$b{~dVySB_to7|RGHx?50b<2;T1r*x_4h4-09{aT@)q~~c0nR?eW
z%`SW`u1qaAQ9Z}5MlS~E@=jR^y%p9VE+(gO7{@@p#=(OI$&d0Sl!34HY@ic<7j`?uKh9K{F7$Vk9-j30zAxd&
zP;_5gM+B4HyS*<0BZ&Q37~s`8bmLrsq@2~X;M3xRG8W=FqD(SFO~FK9@1W^9<_%?8Re(tO&`sTm`
z$a|^`xbwpAEAO4j5y3B?J$(_q-g_uf*AgGB6PQU*NG=HVOJDy_FFnlY!9BH51!R
z1l5itG{9pT?AM*kw3_R_&gn8j=OawL)2-$DX5e17mvC+$(({mmZ$=tT(sQ&)ypjX3v?xOeXHGHApC;Nv$MAM`Ww
z`8N0>HsNfI>86UAR+D7-MmT?*2m4IWXAAD$Bf70dXmAOr1I5tK8U?DLr0jBg^+%+&
zfc{gae?h|(+a?uGtLAf|nL`=7fwUj4DpDU-rX6ZJRK`Vaa1PcPmNq
z>O)q!cw~Dp^X2@cMU{+q3-Ow(kP35%y|!x?r_qKzAuo;@j%EnQ;Yf0dGM3E#nb1~Z
z%JE62?Bi3eO(FwBKKGxKl$f>H2mK}rjR>8_fQl^Hu?3!pIo_&pBZgJpypX`u?Yj##
zX#uDll6jzdV}>XSC>sfZ{ow7UBAIX?LxQ?!XL{6Ex*s7aN4uHFD)*1Pb*C(|lnYQM
zwEIq@m;MZc^8u@&;J_RKHEzZ1zOu{iR(R#%NQ-M3ekl4J>K%J`#ynz)S~t2RQLt`TeBCtUIoGhXW=OEKE6ani=2nh=v&YDxS(Psdg66
zJW<4l;QVfed!$uAgTaiB2!?x@cuWoc5*4gAg;G?_z1;-$6Td&BTI_R;v1=iQI1mwb
z>hs|CvlQiPsqI({t;~Wq;jR{$x5Hakct?d0&x%-?4yLBhjh;m3+BX&JLu_3lkWe@FRpx9?Ae+g-UxU%BF+js
znAbf)4oTyQ)N+vQAQ2>f*4|!HMs@?Qw4UWm$Ui#MRBgeLhfIRzP#l-nq^REj&g+|U
zQ0&(;1TmKxQOf2k5O1JeA)XihlH#icaIBhG2TRe`^Ksli7H2^qO!)a0a=rVv(
zmRgW)OH|aFAjbm=m)dQVZ`S##C~qu%D%FRX&8UTnh_p*Ob4UNLk75%{&7m#|Rh%{!
z5AjI<2ep+BwP*0>MF6HwgUJv;W-m#KV}*|l0?iIVijCE8gzRBHW%R=CA8~}?U{E7V
zZhWcGSC#w00A0qax_H4^`Z#Zir;@2g#1IgRGe>roVvJr^y5}PlS>Wbq@Rdf$#Y50H
zwT6o<_>%_>zkTbDoYkso~GE?&ACvIR?k8Jvf@Pc`DFTFmxZ4EDfS0?7JR@F)-oIRN{)1YvWmuSu>&t+ts?RY@C#7tc2LyD{{!0Ow+vb#OIlBq7$U
zrZ)Wue>WlCSc=(me`Vv_To5rwbEL_QcI_nQmG2NNEts9k)byQc;gD&S%CrhFj{?st
z{&YSnWXjt17DfY@U{Alqd?&~9M`HKv9KlHaRxNe7JJ8@nt?N*0aHTf<;Kd&~K-lY)
zYAL*VM~v4Fb6kJ5)4WT0E%~BBDsHDYg5^!C8+tKgE7E_x|2%pa!j
z5i*@mXhCD1mkLA7xgYd%Q+^6^W@dVlZN&3>R0?FQ-Jwfp1tE#v3U_Ae)ZGH^kVPt!
zN?Xzcl>ue77vJ{6PR@6A8&)rkhH2ueRk_HlUajrwpw(5TZeE%o8czW$k7hFGl`y;@
z_=f{m&1cj7-7XFdT@#AvG5ZnouZCOp5coExQ3`SM
zgOw`!q0zx9yZ~JTUB~_JeJO=O$_3oxigX8-XD^;JvVx~-t=8u!sA22wT_vBI!cN)l
zS6%fZy;5C{jLBhYU4Iz^W05}BZ)aTj+sZ>kay1S<3cLKvjhBJIa24>SbciNuUxg5J
zXBg;gL?3)5_f(n$VPExRQg3+qGhF;LR%iiIED7%ZJ+PtdQ@G&wbKFnkX8sGQdp`{C
zG^e=Jy^0KX@EjW-2QAYc;Egk@c?YP>cRB!i-_Z93HO1nkrOQt))OQH{71RO