From 1a2a4dac232673987fcea4471b19bb82502f0205 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Mon, 23 Feb 2015 11:23:53 -0500 Subject: [PATCH 01/13] net: allow port 0 in connect() The added validation allows non-negative numbers and numeric strings. All other values result in a thrown exception. Fixes: https://github.com/joyent/node/issues/9194 PR-URL: https://github.com/joyent/node/pull/9268 Reviewed-By: Julien Gilli Reviewed-By: Trevor Norris Reviewed-By: James M Snell --- lib/net.js | 14 +++- src/tcp_wrap.cc | 4 +- test/simple/test-net-create-connection.js | 82 ++++++++++++++++++++--- test/simple/test-net-localerror.js | 30 +++------ 4 files changed, 97 insertions(+), 33 deletions(-) diff --git a/lib/net.js b/lib/net.js index 61cb4209522..6d12a70aee0 100644 --- a/lib/net.js +++ b/lib/net.js @@ -892,7 +892,7 @@ Socket.prototype.connect = function(options, cb) { } else { var dns = require('dns'); var host = options.host || 'localhost'; - var port = options.port | 0; + var port = 0; var localAddress = options.localAddress; var localPort = options.localPort; var dnsopts = { @@ -906,8 +906,16 @@ Socket.prototype.connect = function(options, cb) { if (localPort && !util.isNumber(localPort)) throw new TypeError('localPort should be a number: ' + localPort); - if (port <= 0 || port > 65535) - throw new RangeError('port should be > 0 and < 65536: ' + port); + if (typeof options.port === 'number') + port = options.port; + else if (typeof options.port === 'string') + port = options.port.trim() === '' ? -1 : +options.port; + else if (options.port !== undefined) + throw new TypeError('port should be a number or string: ' + options.port); + + if (port < 0 || port > 65535 || isNaN(port)) + throw new RangeError('port should be >= 0 and < 65536: ' + + options.port); if (dnsopts.family !== 4 && dnsopts.family !== 6) dnsopts.hints = dns.ADDRCONFIG | dns.V4MAPPED; diff --git a/src/tcp_wrap.cc b/src/tcp_wrap.cc index 6b2408c9890..4d66c291268 100644 --- a/src/tcp_wrap.cc +++ b/src/tcp_wrap.cc @@ -428,7 +428,7 @@ void TCPWrap::Connect(const FunctionCallbackInfo& args) { assert(args[0]->IsObject()); assert(args[1]->IsString()); - assert(args[2]->Uint32Value()); + assert(args[2]->IsUint32()); Local req_wrap_obj = args[0].As(); node::Utf8Value ip_address(args[1]); @@ -460,7 +460,7 @@ void TCPWrap::Connect6(const FunctionCallbackInfo& args) { assert(args[0]->IsObject()); assert(args[1]->IsString()); - assert(args[2]->Uint32Value()); + assert(args[2]->IsUint32()); Local req_wrap_obj = args[0].As(); node::Utf8Value ip_address(args[1]); diff --git a/test/simple/test-net-create-connection.js b/test/simple/test-net-create-connection.js index 12f7f0be6d7..2dee0296659 100644 --- a/test/simple/test-net-create-connection.js +++ b/test/simple/test-net-create-connection.js @@ -24,33 +24,99 @@ var assert = require('assert'); var net = require('net'); var tcpPort = common.PORT; +var expectedConnections = 7; var clientConnected = 0; var serverConnected = 0; var server = net.createServer(function(socket) { socket.end(); - if (++serverConnected === 4) { + if (++serverConnected === expectedConnections) { server.close(); } }); + server.listen(tcpPort, 'localhost', function() { function cb() { ++clientConnected; } + function fail(opts, errtype, msg) { + assert.throws(function() { + var client = net.createConnection(opts, cb); + }, function (err) { + return err instanceof errtype && msg === err.message; + }); + } + net.createConnection(tcpPort).on('connect', cb); net.createConnection(tcpPort, 'localhost').on('connect', cb); net.createConnection(tcpPort, cb); net.createConnection(tcpPort, 'localhost', cb); + net.createConnection(tcpPort + '', 'localhost', cb); + net.createConnection({port: tcpPort + ''}).on('connect', cb); + net.createConnection({port: '0x' + tcpPort.toString(16)}, cb); + + fail({ + port: true + }, TypeError, 'port should be a number or string: true'); + + fail({ + port: false + }, TypeError, 'port should be a number or string: false'); + + fail({ + port: [] + }, TypeError, 'port should be a number or string: '); + + fail({ + port: {} + }, TypeError, 'port should be a number or string: [object Object]'); + + fail({ + port: null + }, TypeError, 'port should be a number or string: null'); + + fail({ + port: '' + }, RangeError, 'port should be >= 0 and < 65536: '); + + fail({ + port: ' ' + }, RangeError, 'port should be >= 0 and < 65536: '); - assert.throws(function () { - net.createConnection({ - port: 'invalid!' - }, cb); - }); + fail({ + port: '0x' + }, RangeError, 'port should be >= 0 and < 65536: 0x'); + + fail({ + port: '-0x1' + }, RangeError, 'port should be >= 0 and < 65536: -0x1'); + + fail({ + port: NaN + }, RangeError, 'port should be >= 0 and < 65536: NaN'); + + fail({ + port: Infinity + }, RangeError, 'port should be >= 0 and < 65536: Infinity'); + + fail({ + port: -1 + }, RangeError, 'port should be >= 0 and < 65536: -1'); + + fail({ + port: 65536 + }, RangeError, 'port should be >= 0 and < 65536: 65536'); }); -process.on('exit', function() { - assert.equal(clientConnected, 4); +// Try connecting to random ports, but do so once the server is closed +server.on('close', function() { + function nop() {} + + net.createConnection({port: 0}).on('error', nop); + net.createConnection({port: undefined}).on('error', nop); }); +process.on('exit', function() { + assert.equal(clientConnected, expectedConnections); +}); diff --git a/test/simple/test-net-localerror.js b/test/simple/test-net-localerror.js index d04d9c70720..cf113d499a8 100644 --- a/test/simple/test-net-localerror.js +++ b/test/simple/test-net-localerror.js @@ -23,27 +23,17 @@ var common = require('../common'); var assert = require('assert'); var net = require('net'); - connect({ - host: 'localhost', - port: common.PORT, - localPort: 'foobar', - }, 'localPort should be a number: foobar'); +connect({ + host: 'localhost', + port: common.PORT, + localPort: 'foobar', +}, 'localPort should be a number: foobar'); - connect({ - host: 'localhost', - port: common.PORT, - localAddress: 'foobar', - }, 'localAddress should be a valid IP: foobar'); - - connect({ - host: 'localhost', - port: 65536 - }, 'port should be > 0 and < 65536: 65536'); - - connect({ - host: 'localhost', - port: 0 - }, 'port should be > 0 and < 65536: 0'); +connect({ + host: 'localhost', + port: common.PORT, + localAddress: 'foobar', +}, 'localAddress should be a valid IP: foobar'); function connect(opts, msg) { assert.throws(function() { From 8bcd0a4c4a8e3d748bea53d036985609ea634b8d Mon Sep 17 00:00:00 2001 From: Florin-Cristian Gavrila Date: Tue, 13 Jan 2015 18:40:05 +0000 Subject: [PATCH 02/13] http: fix performance regression for GET requests A significant performance regressions has been introduced in 1fddc1f for GET requests which send data through response.end(). The number of requests per second dropped to somewhere around 6% of their previous level. The fix consists of removing a part of the lines added by 1fddc1f, lines which were supposed to affect only HEAD requests, but interfered with GET requests instead. The lines removed would not have affected the behaviour in the case of a HEAD request as this._hasBody would always be false. Therefore, they were not required to fix the issue reported in #8361. Fixes #8940. PR: #9026 PR-URL: https://github.com/joyent/node/pull/9026 Reviewed-By: Julien Gilli --- lib/http.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/http.js b/lib/http.js index 6f640d1af37..f4e8db7de44 100644 --- a/lib/http.js +++ b/lib/http.js @@ -946,10 +946,6 @@ OutgoingMessage.prototype.end = function(data, encoding) { if (encoding === 'hex' || encoding === 'base64') hot = false; - // Transfer-encoding: chunked responses to HEAD requests - if (this._hasBody && this.chunkedEncoding) - hot = false; - if (hot) { // Hot path. They're doing // res.writeHead(); From dcff5d565c000904cabf48c627534a779a40527a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C3=BAl=20Ibarra=20Corretg=C3=A9?= Date: Tue, 24 Feb 2015 11:05:39 +0100 Subject: [PATCH 03/13] deps: update libuv to 0.10.36 PR: #9274 PR-URL: https://github.com/joyent/node/pull/9274 Reviewed-By: Julien Gilli --- deps/uv/AUTHORS | 3 + deps/uv/ChangeLog | 70 ++++++++- deps/uv/build.mk | 2 + deps/uv/checksparse.sh | 1 + deps/uv/config-unix.mk | 4 +- deps/uv/include/uv-private/uv-win.h | 5 +- deps/uv/src/unix/async.c | 43 ++---- deps/uv/src/unix/atomic-ops.h | 60 ++++++++ deps/uv/src/unix/internal.h | 15 ++ deps/uv/src/unix/linux-core.c | 40 +++-- deps/uv/src/unix/linux-syscalls.c | 6 +- deps/uv/src/unix/linux-syscalls.h | 2 +- deps/uv/src/unix/process.c | 15 ++ deps/uv/src/unix/stream.c | 13 ++ deps/uv/src/version.c | 2 +- deps/uv/src/win/dl.c | 35 ++++- deps/uv/src/win/fs.c | 4 +- deps/uv/src/win/internal.h | 4 +- deps/uv/src/win/poll.c | 40 +++-- deps/uv/src/win/winsock.c | 12 +- deps/uv/test/test-dlerror.c | 19 +-- deps/uv/test/test-list.h | 10 ++ deps/uv/test/test-loop-configure.c | 40 +++++ .../test-poll-close-doesnt-corrupt-stack.c | 114 +++++++++++++++ deps/uv/test/test-tcp-oob.c | 137 ++++++++++++++++++ deps/uv/uv.gyp | 4 + 26 files changed, 595 insertions(+), 105 deletions(-) create mode 100644 deps/uv/src/unix/atomic-ops.h create mode 100644 deps/uv/test/test-loop-configure.c create mode 100644 deps/uv/test/test-poll-close-doesnt-corrupt-stack.c create mode 100644 deps/uv/test/test-tcp-oob.c diff --git a/deps/uv/AUTHORS b/deps/uv/AUTHORS index 48a74db32f6..1123dd8ec4c 100644 --- a/deps/uv/AUTHORS +++ b/deps/uv/AUTHORS @@ -132,3 +132,6 @@ Javier Hernández Tonis Tiigi Michael Hudson-Doyle Helge Deller +Logan Rosen +Kenneth Perry +Michael Penick diff --git a/deps/uv/ChangeLog b/deps/uv/ChangeLog index 4ba348d571b..bd03d53b5c3 100644 --- a/deps/uv/ChangeLog +++ b/deps/uv/ChangeLog @@ -1,4 +1,72 @@ -2014.12.10, Version 0.10.30 (Stable) +2015.02.27, Version 0.10.36 (Stable) + +Changes since version 0.10.35: + +* stream: ignore EINVAL for SO_OOBINLINE on OS X (Fedor Indutny) + + +2015.02.25, Version 0.10.35 (Stable), 4dc978825d870643bbaa4660f71d22975efba29e + +Changes since version 0.10.34: + +* stream: use SO_OOBINLINE on OS X (Fedor Indutny) + + +2015.02.21, Version 0.10.34 (Stable), 37aa4aa9b9712c778d7b249563e868cabfdb8332 + +Changes since version 0.10.33: + +* unix: add atomic-ops.h (Ben Noordhuis) + +* unix: fix for uv_async data race (Michael Penick) + +* unix: call setgoups before calling setuid/setgid (Saúl Ibarra Corretgé) + + +2015.01.29, Version 0.10.33 (Stable), 7a2253d33ad8215a26c1b34f1952aee7242dd687 + +Changes since version 0.10.32: + +* linux: fix epoll_pwait() regression with < 2.6.19 (Ben Noordhuis) + +* test: back-port uv_loop_configure() test (Ben Noordhuis) + + +2015.01.06, Version 0.10.32 (Stable), 378de30c59aef5fdb6d130fa5cfcb0a68fce571c + +Changes since version 0.10.31: + +* linux: fix epoll_pwait() sigmask size calculation (Ben Noordhuis) + + +2014.12.25, Version 0.10.31 (Stable), 4dbd27e2219069a6daa769fb37f98673b77b4261 + +Changes since version 0.10.30: + +* test: test that closing a poll handle doesn't corrupt the stack (Bert Belder) + +* win: fix compilation of tests (Marc Schlaich) + +* Revert "win: keep a reference to AFD_POLL_INFO in cancel poll" (Bert Belder) + +* win: avoid stack corruption when closing a poll handle (Bert Belder) + +* gitignore: ignore Visual Studio files (Marc Schlaich) + +* win: set fallback message if FormatMessage fails (Marc Schlaich) + +* win: fall back to default language in uv_dlerror (Marc Schlaich) + +* test: improve compatibility for dlerror test (Marc Schlaich) + +* test: check dlerror is "no error" in no error case (Marc Schlaich) + +* build: link against -pthread (Logan Rosen) + +* win: scandir use 'ls' for formatting long strings (Kenneth Perry) + + +2014.12.10, Version 0.10.30 (Stable), 5a63f5e9546dca482eeebc3054139b21f509f21f Changes since version 0.10.29: diff --git a/deps/uv/build.mk b/deps/uv/build.mk index a2fdac7d453..efa42e1bcc8 100644 --- a/deps/uv/build.mk +++ b/deps/uv/build.mk @@ -91,6 +91,7 @@ TESTS= \ test/test-ipc-send-recv.o \ test/test-loop-handles.o \ test/test-loop-stop.o \ + test/test-loop-configure.o \ test/test-multiple-listen.o \ test/test-mutexes.o \ test/test-osx-select.o \ @@ -126,6 +127,7 @@ TESTS= \ test/test-tcp-connect-timeout.o \ test/test-tcp-flags.o \ test/test-tcp-open.o \ + test/test-tcp-oob.o \ test/test-tcp-read-stop.o \ test/test-tcp-shutdown-after-write.o \ test/test-tcp-unexpected-read.o \ diff --git a/deps/uv/checksparse.sh b/deps/uv/checksparse.sh index 01fac07a39f..d2b1d5e05d3 100755 --- a/deps/uv/checksparse.sh +++ b/deps/uv/checksparse.sh @@ -145,6 +145,7 @@ test/test-tcp-open.c test/test-tcp-read-stop.c test/test-tcp-shutdown-after-write.c test/test-tcp-unexpected-read.c +test/test-tcp-oob.c test/test-tcp-write-error.c test/test-tcp-write-to-half-open-connection.c test/test-tcp-writealot.c diff --git a/deps/uv/config-unix.mk b/deps/uv/config-unix.mk index 37c4a72f6ee..db21daa0ba5 100644 --- a/deps/uv/config-unix.mk +++ b/deps/uv/config-unix.mk @@ -22,7 +22,7 @@ E= CSTDFLAG=--std=c89 -pedantic -Wall -Wextra -Wno-unused-parameter CFLAGS += -g CPPFLAGS += -I$(SRCDIR)/src -LDFLAGS=-lm +LDFLAGS=-lm -pthread CPPFLAGS += -D_LARGEFILE_SOURCE CPPFLAGS += -D_FILE_OFFSET_BITS=64 @@ -186,7 +186,7 @@ src/.buildstamp src/unix/.buildstamp test/.buildstamp: mkdir -p $(@D) touch $@ -src/unix/%.o src/unix/%.pic.o: src/unix/%.c include/uv.h include/uv-private/uv-unix.h src/unix/internal.h src/unix/.buildstamp $(DTRACE_HEADER) +src/unix/%.o src/unix/%.pic.o: src/unix/%.c include/uv.h include/uv-private/uv-unix.h src/unix/atomic-ops.h src/unix/internal.h src/unix/.buildstamp $(DTRACE_HEADER) $(CC) $(CSTDFLAG) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ src/%.o src/%.pic.o: src/%.c include/uv.h include/uv-private/uv-unix.h src/.buildstamp diff --git a/deps/uv/include/uv-private/uv-win.h b/deps/uv/include/uv-private/uv-win.h index e5f2f3b4c8b..c9ec38ef4ca 100644 --- a/deps/uv/include/uv-private/uv-win.h +++ b/deps/uv/include/uv-private/uv-win.h @@ -474,10 +474,7 @@ RB_HEAD(uv_timer_tree_s, uv_timer_s); /* Used in fast mode */ \ SOCKET peer_socket; \ AFD_POLL_INFO afd_poll_info_1; \ - union { \ - AFD_POLL_INFO* afd_poll_info_ptr; \ - AFD_POLL_INFO afd_poll_info; \ - } afd_poll_info_2; \ + AFD_POLL_INFO afd_poll_info_2; \ /* Used in fast and slow mode. */ \ uv_req_t poll_req_1; \ uv_req_t poll_req_2; \ diff --git a/deps/uv/src/unix/async.c b/deps/uv/src/unix/async.c index 43f54ed4b28..8adf046a697 100644 --- a/deps/uv/src/unix/async.c +++ b/deps/uv/src/unix/async.c @@ -24,6 +24,7 @@ #include "uv.h" #include "internal.h" +#include "atomic-ops.h" #include #include @@ -34,7 +35,6 @@ static void uv__async_event(uv_loop_t* loop, struct uv__async* w, unsigned int nevents); -static int uv__async_make_pending(int* pending); static int uv__async_eventfd(void); @@ -54,7 +54,11 @@ int uv_async_init(uv_loop_t* loop, uv_async_t* handle, uv_async_cb async_cb) { int uv_async_send(uv_async_t* handle) { - if (uv__async_make_pending(&handle->pending) == 0) + /* Do a cheap read first. */ + if (ACCESS_ONCE(int, handle->pending) != 0) + return 0; + + if (cmpxchgi(&handle->pending, 0, 1) == 0) uv__async_send(&handle->loop->async_watcher); return 0; @@ -75,41 +79,12 @@ static void uv__async_event(uv_loop_t* loop, ngx_queue_foreach(q, &loop->async_handles) { h = ngx_queue_data(q, uv_async_t, queue); - if (!h->pending) continue; - h->pending = 0; - h->async_cb(h, 0); - } -} + if (cmpxchgi(&h->pending, 1, 0) == 0) + continue; -static int uv__async_make_pending(int* pending) { - /* Do a cheap read first. */ - if (ACCESS_ONCE(int, *pending) != 0) - return 1; - - /* Micro-optimization: use atomic memory operations to detect if we've been - * preempted by another thread and don't have to make an expensive syscall. - * This speeds up the heavily contended case by about 1-2% and has little - * if any impact on the non-contended case. - * - * Use XCHG instead of the CMPXCHG that __sync_val_compare_and_swap() emits - * on x86, it's about 4x faster. It probably makes zero difference in the - * grand scheme of things but I'm OCD enough not to let this one pass. - */ -#if defined(__i386__) || defined(__x86_64__) - { - unsigned int val = 1; - __asm__ __volatile__ ("xchgl %0, %1" - : "+r" (val) - : "m" (*pending)); - return val != 0; + h->async_cb(h, 0); } -#elif defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ > 0) - return __sync_val_compare_and_swap(pending, 0, 1) != 0; -#else - ACCESS_ONCE(int, *pending) = 1; - return 0; -#endif } diff --git a/deps/uv/src/unix/atomic-ops.h b/deps/uv/src/unix/atomic-ops.h new file mode 100644 index 00000000000..7e4e64beda1 --- /dev/null +++ b/deps/uv/src/unix/atomic-ops.h @@ -0,0 +1,60 @@ +/* Copyright (c) 2013, Ben Noordhuis + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef UV_ATOMIC_OPS_H_ +#define UV_ATOMIC_OPS_H_ + +#include "internal.h" /* UV_UNUSED */ + +UV_UNUSED(static int cmpxchgi(int* ptr, int oldval, int newval)); +UV_UNUSED(static long cmpxchgl(long* ptr, long oldval, long newval)); +UV_UNUSED(static void cpu_relax(void)); + +/* Prefer hand-rolled assembly over the gcc builtins because the latter also + * issue full memory barriers. + */ +UV_UNUSED(static int cmpxchgi(int* ptr, int oldval, int newval)) { +#if defined(__i386__) || defined(__x86_64__) + int out; + __asm__ __volatile__ ("lock; cmpxchg %2, %1;" + : "=a" (out), "+m" (*(volatile int*) ptr) + : "r" (newval), "0" (oldval) + : "memory"); + return out; +#else + return __sync_val_compare_and_swap(ptr, oldval, newval); +#endif +} + +UV_UNUSED(static long cmpxchgl(long* ptr, long oldval, long newval)) { +#if defined(__i386__) || defined(__x86_64__) + long out; + __asm__ __volatile__ ("lock; cmpxchg %2, %1;" + : "=a" (out), "+m" (*(volatile long*) ptr) + : "r" (newval), "0" (oldval) + : "memory"); + return out; +#else + return __sync_val_compare_and_swap(ptr, oldval, newval); +#endif +} + +UV_UNUSED(static void cpu_relax(void)) { +#if defined(__i386__) || defined(__x86_64__) + __asm__ __volatile__ ("rep; nop"); /* a.k.a. PAUSE */ +#endif +} + +#endif /* UV_ATOMIC_OPS_H_ */ diff --git a/deps/uv/src/unix/internal.h b/deps/uv/src/unix/internal.h index 003e1a5093b..af360539ed6 100644 --- a/deps/uv/src/unix/internal.h +++ b/deps/uv/src/unix/internal.h @@ -66,6 +66,21 @@ } \ while (0) +/* The __clang__ and __INTEL_COMPILER checks are superfluous because they + * define __GNUC__. They are here to convey to you, dear reader, that these + * macros are enabled when compiling with clang or icc. + */ +#if defined(__clang__) || \ + defined(__GNUC__) || \ + defined(__INTEL_COMPILER) || \ + defined(__SUNPRO_C) +# define UV_DESTRUCTOR(declaration) __attribute__((destructor)) declaration +# define UV_UNUSED(declaration) __attribute__((unused)) declaration +#else +# define UV_DESTRUCTOR(declaration) declaration +# define UV_UNUSED(declaration) declaration +#endif + #if defined(__linux__) # define UV__POLLIN UV__EPOLLIN # define UV__POLLOUT UV__EPOLLOUT diff --git a/deps/uv/src/unix/linux-core.c b/deps/uv/src/unix/linux-core.c index 47938f2b202..6cd5a7f003f 100644 --- a/deps/uv/src/unix/linux-core.c +++ b/deps/uv/src/unix/linux-core.c @@ -33,7 +33,6 @@ #include #include #include -#include #include #include @@ -126,13 +125,15 @@ void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { void uv__io_poll(uv_loop_t* loop, int timeout) { + static int no_epoll_pwait; + static int no_epoll_wait; struct uv__epoll_event events[1024]; struct uv__epoll_event* pe; struct uv__epoll_event e; ngx_queue_t* q; uv__io_t* w; - sigset_t* pset; - sigset_t set; + sigset_t sigset; + uint64_t sigmask; uint64_t base; uint64_t diff; int nevents; @@ -141,7 +142,6 @@ void uv__io_poll(uv_loop_t* loop, int timeout) { int fd; int op; int i; - static int no_epoll_wait; if (loop->nfds == 0) { assert(ngx_queue_empty(&loop->watcher_queue)); @@ -183,11 +183,11 @@ void uv__io_poll(uv_loop_t* loop, int timeout) { w->events = w->pevents; } - pset = NULL; + sigmask = 0; if (loop->flags & UV_LOOP_BLOCK_SIGPROF) { - pset = &set; - sigemptyset(pset); - sigaddset(pset, SIGPROF); + sigemptyset(&sigset); + sigaddset(&sigset, SIGPROF); + sigmask |= 1 << (SIGPROF - 1); } assert(timeout >= -1); @@ -195,23 +195,31 @@ void uv__io_poll(uv_loop_t* loop, int timeout) { count = 48; /* Benchmarks suggest this gives the best throughput. */ for (;;) { - if (no_epoll_wait || pset != NULL) { + if (sigmask != 0 && no_epoll_pwait != 0) + if (pthread_sigmask(SIG_BLOCK, &sigset, NULL)) + abort(); + + if (sigmask != 0 && no_epoll_pwait == 0) { nfds = uv__epoll_pwait(loop->backend_fd, events, ARRAY_SIZE(events), timeout, - pset); + sigmask); + if (nfds == -1 && errno == ENOSYS) + no_epoll_pwait = 1; } else { nfds = uv__epoll_wait(loop->backend_fd, events, ARRAY_SIZE(events), timeout); - if (nfds == -1 && errno == ENOSYS) { + if (nfds == -1 && errno == ENOSYS) no_epoll_wait = 1; - continue; - } } + if (sigmask != 0 && no_epoll_pwait != 0) + if (pthread_sigmask(SIG_UNBLOCK, &sigset, NULL)) + abort(); + /* Update loop->time unconditionally. It's tempting to skip the update when * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the * operating system didn't reschedule our process while in the syscall. @@ -224,6 +232,12 @@ void uv__io_poll(uv_loop_t* loop, int timeout) { } if (nfds == -1) { + if (errno == ENOSYS) { + /* epoll_wait() or epoll_pwait() failed, try the other system call. */ + assert(no_epoll_wait == 0 || no_epoll_pwait == 0); + continue; + } + if (errno != EINTR) abort(); diff --git a/deps/uv/src/unix/linux-syscalls.c b/deps/uv/src/unix/linux-syscalls.c index c9945438f49..267915d879b 100644 --- a/deps/uv/src/unix/linux-syscalls.c +++ b/deps/uv/src/unix/linux-syscalls.c @@ -291,15 +291,15 @@ int uv__epoll_pwait(int epfd, struct uv__epoll_event* events, int nevents, int timeout, - const sigset_t* sigmask) { + uint64_t sigmask) { #if defined(__NR_epoll_pwait) return syscall(__NR_epoll_pwait, epfd, events, nevents, timeout, - sigmask, - _NSIG / 8); + &sigmask, + sizeof(sigmask)); #else return errno = ENOSYS, -1; #endif diff --git a/deps/uv/src/unix/linux-syscalls.h b/deps/uv/src/unix/linux-syscalls.h index 62eb5c5a368..7be73bb6e46 100644 --- a/deps/uv/src/unix/linux-syscalls.h +++ b/deps/uv/src/unix/linux-syscalls.h @@ -130,7 +130,7 @@ int uv__epoll_pwait(int epfd, struct uv__epoll_event* events, int nevents, int timeout, - const sigset_t* sigmask); + uint64_t sigmask); int uv__eventfd2(unsigned int count, int flags); int uv__inotify_init(void); int uv__inotify_init1(int flags); diff --git a/deps/uv/src/unix/process.c b/deps/uv/src/unix/process.c index 19686a291f0..d1f9440c53d 100644 --- a/deps/uv/src/unix/process.c +++ b/deps/uv/src/unix/process.c @@ -40,6 +40,10 @@ extern char **environ; #endif +#ifdef __linux__ +# include +#endif + static ngx_queue_t* uv__process_queue(uv_loop_t* loop, int pid) { assert(pid > 0); @@ -331,6 +335,17 @@ static void uv__process_child_init(uv_process_options_t options, _exit(127); } + if (options.flags & (UV_PROCESS_SETUID | UV_PROCESS_SETGID)) { + /* When dropping privileges from root, the `setgroups` call will + * remove any extraneous groups. If we don't call this, then + * even though our uid has dropped, we may still have groups + * that enable us to do super-user things. This will fail if we + * aren't root, so don't bother checking the return value, this + * is just done as an optimistic privilege dropping function. + */ + SAVE_ERRNO(setgroups(0, NULL)); + } + if ((options.flags & UV_PROCESS_SETGID) && setgid(options.gid)) { uv__write_int(error_fd, errno); _exit(127); diff --git a/deps/uv/src/unix/stream.c b/deps/uv/src/unix/stream.c index 81933e6462f..a8802c85a5b 100644 --- a/deps/uv/src/unix/stream.c +++ b/deps/uv/src/unix/stream.c @@ -403,6 +403,10 @@ int uv__stream_try_select(uv_stream_t* stream, int* fd) { int uv__stream_open(uv_stream_t* stream, int fd, int flags) { +#if defined(__APPLE__) + int enable; +#endif + assert(fd >= 0); stream->flags |= flags; @@ -415,6 +419,15 @@ int uv__stream_open(uv_stream_t* stream, int fd, int flags) { return uv__set_sys_error(stream->loop, errno); } +#if defined(__APPLE__) + enable = 1; + if (setsockopt(fd, SOL_SOCKET, SO_OOBINLINE, &enable, sizeof(enable)) && + errno != ENOTSOCK && + errno != EINVAL) { + return uv__set_sys_error(stream->loop, errno); + } +#endif + stream->io_watcher.fd = fd; return 0; diff --git a/deps/uv/src/version.c b/deps/uv/src/version.c index 1b5a1e4cdbb..55408660640 100644 --- a/deps/uv/src/version.c +++ b/deps/uv/src/version.c @@ -34,7 +34,7 @@ #define UV_VERSION_MAJOR 0 #define UV_VERSION_MINOR 10 -#define UV_VERSION_PATCH 30 +#define UV_VERSION_PATCH 36 #define UV_VERSION_IS_RELEASE 1 diff --git a/deps/uv/src/win/dl.c b/deps/uv/src/win/dl.c index d5b8f7c7d31..f7fca81ca26 100644 --- a/deps/uv/src/win/dl.c +++ b/deps/uv/src/win/dl.c @@ -69,17 +69,44 @@ const char* uv_dlerror(uv_lib_t* lib) { } +static void uv__format_fallback_error(uv_lib_t* lib, int errorno){ + DWORD_PTR args[1] = { (DWORD_PTR) errorno }; + LPSTR fallback_error = "error: %1!d!"; + + FormatMessageA(FORMAT_MESSAGE_FROM_STRING | + FORMAT_MESSAGE_ARGUMENT_ARRAY | + FORMAT_MESSAGE_ALLOCATE_BUFFER, + fallback_error, 0, 0, + (LPSTR) &lib->errmsg, + 0, (va_list*) args); +} + + + static int uv__dlerror(uv_lib_t* lib, int errorno) { + DWORD res; + if (lib->errmsg) { LocalFree((void*)lib->errmsg); lib->errmsg = NULL; } if (errorno) { - FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno, - MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), - (LPSTR)&lib->errmsg, 0, NULL); + res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno, + MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), + (LPSTR) &lib->errmsg, 0, NULL); + if (!res && GetLastError() == ERROR_MUI_FILE_NOT_FOUND) { + res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno, + 0, (LPSTR) &lib->errmsg, 0, NULL); + } + + if (!res) { + uv__format_fallback_error(lib, errorno); + } } return errorno ? -1 : 0; diff --git a/deps/uv/src/win/fs.c b/deps/uv/src/win/fs.c index 7f3704e8aad..c5a4b2b7034 100644 --- a/deps/uv/src/win/fs.c +++ b/deps/uv/src/win/fs.c @@ -732,9 +732,9 @@ void fs__readdir(uv_fs_t* req) { if (len == 0) { fmt = L"./*"; } else if (pathw[len - 1] == L'/' || pathw[len - 1] == L'\\') { - fmt = L"%s*"; + fmt = L"%ls*"; } else { - fmt = L"%s\\*"; + fmt = L"%ls\\*"; } /* Figure out whether path is a file or a directory. */ diff --git a/deps/uv/src/win/internal.h b/deps/uv/src/win/internal.h index 9920f704ab0..f32d24a7789 100644 --- a/deps/uv/src/win/internal.h +++ b/deps/uv/src/win/internal.h @@ -332,8 +332,8 @@ int WSAAPI uv_wsarecvfrom_workaround(SOCKET socket, WSABUF* buffers, int* addr_len, WSAOVERLAPPED *overlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine); -int WSAAPI uv_msafd_poll(SOCKET socket, AFD_POLL_INFO* info, - OVERLAPPED* overlapped); +int WSAAPI uv_msafd_poll(SOCKET socket, AFD_POLL_INFO* info_in, + AFD_POLL_INFO* info_out, OVERLAPPED* overlapped); /* Whether there are any non-IFS LSPs stacked on TCP */ extern int uv_tcp_non_ifs_lsp_ipv4; diff --git a/deps/uv/src/win/poll.c b/deps/uv/src/win/poll.c index 5c5c7d80f0d..37242792787 100644 --- a/deps/uv/src/win/poll.c +++ b/deps/uv/src/win/poll.c @@ -46,6 +46,8 @@ typedef struct uv_single_fd_set_s { static OVERLAPPED overlapped_dummy_; static uv_once_t overlapped_dummy_init_guard_ = UV_ONCE_INIT; +static AFD_POLL_INFO afd_poll_info_dummy_; + static void uv__init_overlapped_dummy(void) { HANDLE event; @@ -65,6 +67,11 @@ static OVERLAPPED* uv__get_overlapped_dummy() { } +static AFD_POLL_INFO* uv__get_afd_poll_info_dummy() { + return &afd_poll_info_dummy_; +} + + static void uv__fast_poll_submit_poll_req(uv_loop_t* loop, uv_poll_t* handle) { uv_req_t* req; AFD_POLL_INFO* afd_poll_info; @@ -79,7 +86,7 @@ static void uv__fast_poll_submit_poll_req(uv_loop_t* loop, uv_poll_t* handle) { handle->mask_events_2 = handle->events; } else if (handle->submitted_events_2 == 0) { req = &handle->poll_req_2; - afd_poll_info = &handle->afd_poll_info_2.afd_poll_info_ptr[0]; + afd_poll_info = &handle->afd_poll_info_2; handle->submitted_events_2 = handle->events; handle->mask_events_1 = handle->events; handle->mask_events_2 = 0; @@ -107,6 +114,7 @@ static void uv__fast_poll_submit_poll_req(uv_loop_t* loop, uv_poll_t* handle) { memset(&req->overlapped, 0, sizeof req->overlapped); result = uv_msafd_poll((SOCKET) handle->peer_socket, + afd_poll_info, afd_poll_info, &req->overlapped); if (result != 0 && WSAGetLastError() != WSA_IO_PENDING) { @@ -118,19 +126,19 @@ static void uv__fast_poll_submit_poll_req(uv_loop_t* loop, uv_poll_t* handle) { static int uv__fast_poll_cancel_poll_req(uv_loop_t* loop, uv_poll_t* handle) { - AFD_POLL_INFO* afd_poll_info; + AFD_POLL_INFO afd_poll_info; DWORD result; - afd_poll_info = &handle->afd_poll_info_2.afd_poll_info_ptr[1]; - afd_poll_info->Exclusive = TRUE; - afd_poll_info->NumberOfHandles = 1; - afd_poll_info->Timeout.QuadPart = INT64_MAX; - afd_poll_info->Handles[0].Handle = (HANDLE) handle->socket; - afd_poll_info->Handles[0].Status = 0; - afd_poll_info->Handles[0].Events = AFD_POLL_ALL; + afd_poll_info.Exclusive = TRUE; + afd_poll_info.NumberOfHandles = 1; + afd_poll_info.Timeout.QuadPart = INT64_MAX; + afd_poll_info.Handles[0].Handle = (HANDLE) handle->socket; + afd_poll_info.Handles[0].Status = 0; + afd_poll_info.Handles[0].Events = AFD_POLL_ALL; result = uv_msafd_poll(handle->socket, - afd_poll_info, + &afd_poll_info, + uv__get_afd_poll_info_dummy(), uv__get_overlapped_dummy()); if (result == SOCKET_ERROR) { @@ -155,7 +163,7 @@ static void uv__fast_poll_process_poll_req(uv_loop_t* loop, uv_poll_t* handle, handle->submitted_events_1 = 0; mask_events = handle->mask_events_1; } else if (req == &handle->poll_req_2) { - afd_poll_info = &handle->afd_poll_info_2.afd_poll_info_ptr[0]; + afd_poll_info = &handle->afd_poll_info_2; handle->submitted_events_2 = 0; mask_events = handle->mask_events_2; } else { @@ -552,12 +560,6 @@ int uv_poll_init_socket(uv_loop_t* loop, uv_poll_t* handle, handle->poll_req_2.type = UV_POLL_REQ; handle->poll_req_2.data = handle; - handle->afd_poll_info_2.afd_poll_info_ptr = malloc(sizeof(*handle->afd_poll_info_2.afd_poll_info_ptr) * 2); - if (handle->afd_poll_info_2.afd_poll_info_ptr == NULL) { - uv__set_artificial_error(loop, UV_ENOMEM); - return -1; - } - return 0; } @@ -611,9 +613,5 @@ void uv_poll_endgame(uv_loop_t* loop, uv_poll_t* handle) { assert(handle->submitted_events_1 == 0); assert(handle->submitted_events_2 == 0); - if (handle->afd_poll_info_2.afd_poll_info_ptr) { - free(handle->afd_poll_info_2.afd_poll_info_ptr); - handle->afd_poll_info_2.afd_poll_info_ptr = NULL; - } uv__handle_close(handle); } diff --git a/deps/uv/src/win/winsock.c b/deps/uv/src/win/winsock.c index cf6d0318918..b91a237338b 100644 --- a/deps/uv/src/win/winsock.c +++ b/deps/uv/src/win/winsock.c @@ -467,8 +467,8 @@ int WSAAPI uv_wsarecvfrom_workaround(SOCKET socket, WSABUF* buffers, } -int WSAAPI uv_msafd_poll(SOCKET socket, AFD_POLL_INFO* info, - OVERLAPPED* overlapped) { +int WSAAPI uv_msafd_poll(SOCKET socket, AFD_POLL_INFO* info_in, + AFD_POLL_INFO* info_out, OVERLAPPED* overlapped) { IO_STATUS_BLOCK iosb; IO_STATUS_BLOCK* iosb_ptr; HANDLE event = NULL; @@ -506,10 +506,10 @@ int WSAAPI uv_msafd_poll(SOCKET socket, AFD_POLL_INFO* info, apc_context, iosb_ptr, IOCTL_AFD_POLL, - info, - sizeof *info, - info, - sizeof *info); + info_in, + sizeof *info_in, + info_out, + sizeof *info_out); if (overlapped == NULL) { /* If this is a blocking operation, wait for the event to become */ diff --git a/deps/uv/test/test-dlerror.c b/deps/uv/test/test-dlerror.c index 877ebf3712a..091200edbed 100644 --- a/deps/uv/test/test-dlerror.c +++ b/deps/uv/test/test-dlerror.c @@ -26,31 +26,28 @@ TEST_IMPL(dlerror) { const char* path = "test/fixtures/load_error.node"; + const char* dlerror_no_error = "no error"; const char* msg; uv_lib_t lib; int r; -#ifdef __linux__ - const char* dlerror_desc = "file too short"; -#elif defined (__sun__) - const char* dlerror_desc = "unknown file type"; -#elif defined (_WIN32) - const char* dlerror_desc = "%1 is not a valid Win32 application"; -#else - const char* dlerror_desc = ""; -#endif + lib.errmsg = NULL; + lib.handle = NULL; + msg = uv_dlerror(&lib); + ASSERT(msg != NULL); + ASSERT(strstr(msg, dlerror_no_error) != NULL); r = uv_dlopen(path, &lib); ASSERT(r == -1); msg = uv_dlerror(&lib); ASSERT(msg != NULL); - ASSERT(strstr(msg, dlerror_desc) != NULL); + ASSERT(strstr(msg, dlerror_no_error) == NULL); /* Should return the same error twice in a row. */ msg = uv_dlerror(&lib); ASSERT(msg != NULL); - ASSERT(strstr(msg, dlerror_desc) != NULL); + ASSERT(strstr(msg, dlerror_no_error) == NULL); uv_dlclose(&lib); diff --git a/deps/uv/test/test-list.h b/deps/uv/test/test-list.h index 47444258821..0bfb9e41e0d 100644 --- a/deps/uv/test/test-list.h +++ b/deps/uv/test/test-list.h @@ -24,6 +24,7 @@ TEST_DECLARE (callback_order) TEST_DECLARE (run_once) TEST_DECLARE (run_nowait) TEST_DECLARE (loop_stop) +TEST_DECLARE (loop_configure) TEST_DECLARE (barrier_1) TEST_DECLARE (barrier_2) TEST_DECLARE (barrier_3) @@ -64,7 +65,10 @@ TEST_DECLARE (tcp_connect_error_fault) TEST_DECLARE (tcp_connect_timeout) TEST_DECLARE (tcp_close_while_connecting) TEST_DECLARE (tcp_close) +#ifndef _WIN32 TEST_DECLARE (tcp_close_accept) +TEST_DECLARE (tcp_oob) +#endif TEST_DECLARE (tcp_flags) TEST_DECLARE (tcp_write_to_half_open_connection) TEST_DECLARE (tcp_unexpected_read) @@ -215,6 +219,7 @@ TEST_DECLARE (poll_duplex) TEST_DECLARE (poll_unidirectional) TEST_DECLARE (poll_close) #ifdef _WIN32 +TEST_DECLARE (poll_close_doesnt_corrupt_stack) TEST_DECLARE (poll_closesocket) TEST_DECLARE (spawn_detect_pipe_name_collisions_on_windows) TEST_DECLARE (argument_escaping) @@ -249,6 +254,7 @@ TASK_LIST_START TEST_ENTRY (run_once) TEST_ENTRY (run_nowait) TEST_ENTRY (loop_stop) + TEST_ENTRY (loop_configure) TEST_ENTRY (barrier_1) TEST_ENTRY (barrier_2) TEST_ENTRY (barrier_3) @@ -308,7 +314,10 @@ TASK_LIST_START TEST_ENTRY (tcp_connect_timeout) TEST_ENTRY (tcp_close_while_connecting) TEST_ENTRY (tcp_close) +#ifndef _WIN32 TEST_ENTRY (tcp_close_accept) + TEST_ENTRY (tcp_oob) +#endif TEST_ENTRY (tcp_flags) TEST_ENTRY (tcp_write_to_half_open_connection) TEST_ENTRY (tcp_unexpected_read) @@ -451,6 +460,7 @@ TASK_LIST_START TEST_ENTRY (kill) #ifdef _WIN32 + TEST_ENTRY (poll_close_doesnt_corrupt_stack) TEST_ENTRY (poll_closesocket) TEST_ENTRY (spawn_detect_pipe_name_collisions_on_windows) TEST_ENTRY (argument_escaping) diff --git a/deps/uv/test/test-loop-configure.c b/deps/uv/test/test-loop-configure.c new file mode 100644 index 00000000000..9fefc592019 --- /dev/null +++ b/deps/uv/test/test-loop-configure.c @@ -0,0 +1,40 @@ +/* Copyright (c) 2014, Ben Noordhuis + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "uv.h" +#include "task.h" + +static void timer_cb(uv_timer_t* handle, int status) { + uv_close((uv_handle_t*) handle, NULL); +} + + +TEST_IMPL(loop_configure) { + uv_timer_t timer_handle; + uv_loop_t* loop; + + loop = uv_default_loop(); +#ifdef _WIN32 + ASSERT(UV_ENOSYS == uv_loop_configure(loop, UV_LOOP_BLOCK_SIGNAL, 0)); +#else + ASSERT(0 == uv_loop_configure(loop, UV_LOOP_BLOCK_SIGNAL, SIGPROF)); +#endif + ASSERT(0 == uv_timer_init(loop, &timer_handle)); + ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 10, 0)); + ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); + + MAKE_VALGRIND_HAPPY(); + return 0; +} diff --git a/deps/uv/test/test-poll-close-doesnt-corrupt-stack.c b/deps/uv/test/test-poll-close-doesnt-corrupt-stack.c new file mode 100644 index 00000000000..eb10507ac13 --- /dev/null +++ b/deps/uv/test/test-poll-close-doesnt-corrupt-stack.c @@ -0,0 +1,114 @@ +/* Copyright Bert Belder, and other libuv contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifdef _WIN32 + +#include +#include + +#include "uv.h" +#include "task.h" + +#ifdef _MSC_VER /* msvc */ +# define NO_INLINE __declspec(noinline) +#else /* gcc */ +# define NO_INLINE __attribute__ ((noinline)) +#endif + + +uv_os_sock_t sock; +uv_poll_t handle; + +static int close_cb_called = 0; + + +static void close_cb(uv_handle_t* h) { + close_cb_called++; +} + + +static void poll_cb(uv_poll_t* h, int status, int events) { + ASSERT(0 && "should never get here"); +} + + +static void NO_INLINE close_socket_and_verify_stack() { + const uint32_t MARKER = 0xDEADBEEF; + const int VERIFY_AFTER = 10; /* ms */ + int r; + + volatile uint32_t data[65536]; + size_t i; + + for (i = 0; i < ARRAY_SIZE(data); i++) + data[i] = MARKER; + + r = closesocket(sock); + ASSERT(r == 0); + + uv_sleep(VERIFY_AFTER); + + for (i = 0; i < ARRAY_SIZE(data); i++) + ASSERT(data[i] == MARKER); +} + + +TEST_IMPL(poll_close_doesnt_corrupt_stack) { + struct WSAData wsa_data; + int r; + unsigned long on; + struct sockaddr_in addr; + + r = WSAStartup(MAKEWORD(2, 2), &wsa_data); + ASSERT(r == 0); + + sock = socket(AF_INET, SOCK_STREAM, 0); + ASSERT(sock != INVALID_SOCKET); + on = 1; + r = ioctlsocket(sock, FIONBIO, &on); + ASSERT(r == 0); + + addr = uv_ip4_addr("127.0.0.1", TEST_PORT); + ASSERT(r == 0); + + r = connect(sock, (const struct sockaddr*) &addr, sizeof addr); + ASSERT(r != 0); + ASSERT(WSAGetLastError() == WSAEWOULDBLOCK); + + r = uv_poll_init_socket(uv_default_loop(), &handle, sock); + ASSERT(r == 0); + r = uv_poll_start(&handle, UV_READABLE | UV_WRITABLE, poll_cb); + ASSERT(r == 0); + + uv_close((uv_handle_t*) &handle, close_cb); + + close_socket_and_verify_stack(); + + r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); + ASSERT(r == 0); + + ASSERT(close_cb_called == 1); + + MAKE_VALGRIND_HAPPY(); + return 0; +} + +#endif /* _WIN32 */ diff --git a/deps/uv/test/test-tcp-oob.c b/deps/uv/test/test-tcp-oob.c new file mode 100644 index 00000000000..35a24204166 --- /dev/null +++ b/deps/uv/test/test-tcp-oob.c @@ -0,0 +1,137 @@ +/* Copyright Fedor Indutny. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#if !defined(_WIN32) + +#include "uv.h" +#include "task.h" + +#include +#include +#include + +static uv_tcp_t server_handle; +static uv_tcp_t client_handle; +static uv_tcp_t peer_handle; +static uv_idle_t idle; +static uv_connect_t connect_req; +static int ticks; +static const int kMaxTicks = 10; + + +static void set_nonblocking(int fd, int set) { + int r; + int flags = fcntl(fd, F_GETFL, 0); + ASSERT(flags >= 0); + if (set) + flags |= O_NONBLOCK; + else + flags &= ~O_NONBLOCK; + r = fcntl(fd, F_SETFL, flags); + ASSERT(r >= 0); +} + + +static uv_buf_t alloc_cb(uv_handle_t* handle, size_t size) { + static char storage[1024]; + return uv_buf_init(storage, sizeof(storage)); +} + + +static void idle_cb(uv_idle_t* idle, int status) { + ASSERT(status == 0); + if (++ticks < kMaxTicks) + return; + + uv_close((uv_handle_t*) &server_handle, NULL); + uv_close((uv_handle_t*) &client_handle, NULL); + uv_close((uv_handle_t*) &peer_handle, NULL); + uv_close((uv_handle_t*) idle, NULL); +} + + +static void read_cb(uv_stream_t* tcp, ssize_t nread, uv_buf_t buf) { + ASSERT(nread > 0); + ASSERT(0 == uv_idle_start(&idle, idle_cb)); +} + + +static void connect_cb(uv_connect_t* req, int status) { + ASSERT(req->handle == (uv_stream_t*) &client_handle); + ASSERT(0 == status); +} + + +static void connection_cb(uv_stream_t* handle, int status) { + int r; + int fd; + + ASSERT(0 == status); + ASSERT(0 == uv_accept(handle, (uv_stream_t*) &peer_handle)); + ASSERT(0 == uv_read_start((uv_stream_t*) &peer_handle, alloc_cb, read_cb)); + + /* Send some OOB data */ + fd = client_handle.io_watcher.fd; + set_nonblocking(fd, 0); + + /* The problem triggers only on a second message, it seem that xnu is not + * triggering `kevent()` for the first one + */ + do { + r = send(fd, "hello", 5, MSG_OOB); + } while (r < 0 && errno == EINTR); + ASSERT(5 == r); + + do { + r = send(fd, "hello", 5, MSG_OOB); + } while (r < 0 && errno == EINTR); + ASSERT(5 == r); + + set_nonblocking(fd, 1); +} + + +TEST_IMPL(tcp_oob) { + uv_loop_t* loop; + loop = uv_default_loop(); + + ASSERT(0 == uv_tcp_init(loop, &server_handle)); + ASSERT(0 == uv_tcp_init(loop, &client_handle)); + ASSERT(0 == uv_tcp_init(loop, &peer_handle)); + ASSERT(0 == uv_idle_init(loop, &idle)); + ASSERT(0 == uv_tcp_bind(&server_handle, uv_ip4_addr("127.0.0.1", TEST_PORT))); + ASSERT(0 == uv_listen((uv_stream_t*) &server_handle, 1, connection_cb)); + + /* Ensure two separate packets */ + ASSERT(0 == uv_tcp_nodelay(&client_handle, 1)); + + ASSERT(0 == uv_tcp_connect(&connect_req, + &client_handle, + uv_ip4_addr("127.0.0.1", TEST_PORT), + connect_cb)); + ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); + + ASSERT(ticks == kMaxTicks); + + MAKE_VALGRIND_HAPPY(); + return 0; +} +#endif diff --git a/deps/uv/uv.gyp b/deps/uv/uv.gyp index 5af99bd59cd..d5d0f940783 100644 --- a/deps/uv/uv.gyp +++ b/deps/uv/uv.gyp @@ -133,6 +133,7 @@ 'include/uv-private/uv-darwin.h', 'include/uv-private/uv-bsd.h', 'src/unix/async.c', + 'src/unix/atomic-ops.h', 'src/unix/core.c', 'src/unix/dl.c', 'src/unix/error.c', @@ -311,6 +312,7 @@ 'test/test-list.h', 'test/test-loop-handles.c', 'test/test-loop-stop.c', + 'test/test-loop-configure.c', 'test/test-walk-handles.c', 'test/test-watcher-cross-stop.c', 'test/test-multiple-listen.c', @@ -323,6 +325,7 @@ 'test/test-platform-output.c', 'test/test-poll.c', 'test/test-poll-close.c', + 'test/test-poll-close-doesnt-corrupt-stack.c', 'test/test-poll-closesocket.c', 'test/test-process-title.c', 'test/test-ref.c', @@ -352,6 +355,7 @@ 'test/test-tcp-write-to-half-open-connection.c', 'test/test-tcp-writealot.c', 'test/test-tcp-unexpected-read.c', + 'test/test-tcp-oob.c', 'test/test-tcp-read-stop.c', 'test/test-threadpool.c', 'test/test-threadpool-cancel.c', From a5be84fe9b6862b9d132f87bcc915285e40432e2 Mon Sep 17 00:00:00 2001 From: Julien Gilli Date: Fri, 20 Feb 2015 14:00:32 -0800 Subject: [PATCH 04/13] url: revert reslove urls with . and .. This reverts commit ad0684807c474db5cda7d28592e34e19910eb7ab. Initially, this bug fix targeted master, and I pushed to have it included in v0.10. In retrospect, I'm not sure it should have made into v0.10 as it seems it could break a lot of existing working code. In my opinion, this change is still a bug fix, and it is not backward incompatible per se. However, I'm not sure that taking the risk to break a lot of users with a new 0.10.x release that would include this fix is reasonable, especially now that 0.10.x releases are entering maintenance mode. PR-URL: https://github.com/joyent/node/pull/9257 Reviewed-by: Trevor Norris Reviewed-By: Colin Ihrig --- lib/url.js | 4 ++-- test/simple/test-url.js | 8 -------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/lib/url.js b/lib/url.js index e991f6d63f9..d5948e450b1 100644 --- a/lib/url.js +++ b/lib/url.js @@ -600,8 +600,8 @@ Url.prototype.resolveObject = function(relative) { // then it must NOT get a trailing slash. var last = srcPath.slice(-1)[0]; var hasTrailingSlash = ( - (result.host || relative.host || srcPath.length > 1) && - (last === '.' || last === '..') || last === ''); + (result.host || relative.host) && (last === '.' || last === '..') || + last === ''); // strip single dots, resolve double dots to parent dir // if the path tries to go above the root, `up` ends up > 0 diff --git a/test/simple/test-url.js b/test/simple/test-url.js index 6c807930b58..95f50a23c39 100644 --- a/test/simple/test-url.js +++ b/test/simple/test-url.js @@ -1087,14 +1087,6 @@ var relativeTests = [ ['/foo/bar/baz/', 'quux/baz', '/foo/bar/baz/quux/baz'], ['/foo/bar/baz', '../../../../../../../../quux/baz', '/quux/baz'], ['/foo/bar/baz', '../../../../../../../quux/baz', '/quux/baz'], - ['/foo', '.', '/'], - ['/foo', '..', '/'], - ['/foo/', '.', '/foo/'], - ['/foo/', '..', '/'], - ['/foo/bar', '.', '/foo/'], - ['/foo/bar', '..', '/'], - ['/foo/bar/', '.', '/foo/bar/'], - ['/foo/bar/', '..', '/foo/'], ['foo/bar', '../../../baz', '../../baz'], ['foo/bar/', '../../../baz', '../baz'], ['http://example.com/b//c//d;p?q#blarg', 'https:#hash2', 'https:///#hash2'], From cc6ee3f010fe8b6f5d92097b56311e566bb2a8ac Mon Sep 17 00:00:00 2001 From: Forrest L Norvell Date: Fri, 6 Mar 2015 03:09:26 -0600 Subject: [PATCH 05/13] deps: upgrade npm to 2.7.0 PR: #9347 PR-URL: https://github.com/joyent/node/pull/9347 Reviewed-By: Julien Gilli --- deps/npm/CHANGELOG.md | 156 ++++++++++++ deps/npm/bin/node-gyp-bin/node-gyp | 6 +- deps/npm/bin/node-gyp-bin/node-gyp.cmd | 6 +- deps/npm/doc/api/npm-update.md | 11 +- deps/npm/doc/cli/npm-init.md | 10 + deps/npm/doc/cli/npm-install.md | 7 +- deps/npm/doc/cli/npm-ls.md | 14 ++ deps/npm/doc/cli/npm-run-script.md | 20 +- deps/npm/doc/cli/npm-update.md | 127 +++++++++- deps/npm/doc/cli/npm-version.md | 15 +- deps/npm/doc/misc/npm-config.md | 13 +- deps/npm/doc/misc/npm-scripts.md | 45 ++-- deps/npm/html/doc/README.html | 4 +- deps/npm/html/doc/api/npm-bin.html | 2 +- deps/npm/html/doc/api/npm-bugs.html | 2 +- deps/npm/html/doc/api/npm-cache.html | 2 +- deps/npm/html/doc/api/npm-commands.html | 2 +- deps/npm/html/doc/api/npm-config.html | 2 +- deps/npm/html/doc/api/npm-deprecate.html | 2 +- deps/npm/html/doc/api/npm-docs.html | 2 +- deps/npm/html/doc/api/npm-edit.html | 2 +- deps/npm/html/doc/api/npm-explore.html | 2 +- deps/npm/html/doc/api/npm-help-search.html | 2 +- deps/npm/html/doc/api/npm-init.html | 2 +- deps/npm/html/doc/api/npm-install.html | 2 +- deps/npm/html/doc/api/npm-link.html | 2 +- deps/npm/html/doc/api/npm-load.html | 2 +- deps/npm/html/doc/api/npm-ls.html | 2 +- deps/npm/html/doc/api/npm-outdated.html | 2 +- deps/npm/html/doc/api/npm-owner.html | 2 +- deps/npm/html/doc/api/npm-pack.html | 2 +- deps/npm/html/doc/api/npm-prefix.html | 2 +- deps/npm/html/doc/api/npm-prune.html | 2 +- deps/npm/html/doc/api/npm-publish.html | 2 +- deps/npm/html/doc/api/npm-rebuild.html | 2 +- deps/npm/html/doc/api/npm-repo.html | 2 +- deps/npm/html/doc/api/npm-restart.html | 2 +- deps/npm/html/doc/api/npm-root.html | 2 +- deps/npm/html/doc/api/npm-run-script.html | 2 +- deps/npm/html/doc/api/npm-search.html | 2 +- deps/npm/html/doc/api/npm-shrinkwrap.html | 2 +- deps/npm/html/doc/api/npm-start.html | 2 +- deps/npm/html/doc/api/npm-stop.html | 2 +- deps/npm/html/doc/api/npm-tag.html | 2 +- deps/npm/html/doc/api/npm-test.html | 2 +- deps/npm/html/doc/api/npm-uninstall.html | 2 +- deps/npm/html/doc/api/npm-unpublish.html | 2 +- deps/npm/html/doc/api/npm-update.html | 12 +- deps/npm/html/doc/api/npm-version.html | 2 +- deps/npm/html/doc/api/npm-view.html | 2 +- deps/npm/html/doc/api/npm-whoami.html | 2 +- deps/npm/html/doc/api/npm.html | 4 +- deps/npm/html/doc/cli/npm-access.html | 2 +- deps/npm/html/doc/cli/npm-adduser.html | 2 +- deps/npm/html/doc/cli/npm-bin.html | 2 +- deps/npm/html/doc/cli/npm-bugs.html | 2 +- deps/npm/html/doc/cli/npm-build.html | 2 +- deps/npm/html/doc/cli/npm-bundle.html | 2 +- deps/npm/html/doc/cli/npm-cache.html | 2 +- deps/npm/html/doc/cli/npm-completion.html | 2 +- deps/npm/html/doc/cli/npm-config.html | 2 +- deps/npm/html/doc/cli/npm-dedupe.html | 2 +- deps/npm/html/doc/cli/npm-deprecate.html | 2 +- deps/npm/html/doc/cli/npm-dist-tag.html | 2 +- deps/npm/html/doc/cli/npm-docs.html | 2 +- deps/npm/html/doc/cli/npm-edit.html | 2 +- deps/npm/html/doc/cli/npm-explore.html | 2 +- deps/npm/html/doc/cli/npm-help-search.html | 2 +- deps/npm/html/doc/cli/npm-help.html | 2 +- deps/npm/html/doc/cli/npm-init.html | 10 +- deps/npm/html/doc/cli/npm-install.html | 9 +- deps/npm/html/doc/cli/npm-link.html | 2 +- deps/npm/html/doc/cli/npm-logout.html | 2 +- deps/npm/html/doc/cli/npm-ls.html | 16 +- deps/npm/html/doc/cli/npm-outdated.html | 2 +- deps/npm/html/doc/cli/npm-owner.html | 2 +- deps/npm/html/doc/cli/npm-pack.html | 2 +- deps/npm/html/doc/cli/npm-prefix.html | 2 +- deps/npm/html/doc/cli/npm-prune.html | 2 +- deps/npm/html/doc/cli/npm-publish.html | 2 +- deps/npm/html/doc/cli/npm-rebuild.html | 2 +- deps/npm/html/doc/cli/npm-repo.html | 2 +- deps/npm/html/doc/cli/npm-restart.html | 2 +- deps/npm/html/doc/cli/npm-rm.html | 2 +- deps/npm/html/doc/cli/npm-root.html | 2 +- deps/npm/html/doc/cli/npm-run-script.html | 20 +- deps/npm/html/doc/cli/npm-search.html | 2 +- deps/npm/html/doc/cli/npm-shrinkwrap.html | 2 +- deps/npm/html/doc/cli/npm-star.html | 2 +- deps/npm/html/doc/cli/npm-stars.html | 2 +- deps/npm/html/doc/cli/npm-start.html | 2 +- deps/npm/html/doc/cli/npm-stop.html | 2 +- deps/npm/html/doc/cli/npm-tag.html | 2 +- deps/npm/html/doc/cli/npm-test.html | 2 +- deps/npm/html/doc/cli/npm-uninstall.html | 2 +- deps/npm/html/doc/cli/npm-unpublish.html | 2 +- deps/npm/html/doc/cli/npm-update.html | 81 ++++++- deps/npm/html/doc/cli/npm-version.html | 18 +- deps/npm/html/doc/cli/npm-view.html | 2 +- deps/npm/html/doc/cli/npm-whoami.html | 2 +- deps/npm/html/doc/cli/npm.html | 10 +- deps/npm/html/doc/files/npm-folders.html | 2 +- deps/npm/html/doc/files/npm-global.html | 2 +- deps/npm/html/doc/files/npm-json.html | 2 +- deps/npm/html/doc/files/npmrc.html | 2 +- deps/npm/html/doc/files/package.json.html | 2 +- deps/npm/html/doc/index.html | 2 +- deps/npm/html/doc/misc/npm-coding-style.html | 2 +- deps/npm/html/doc/misc/npm-config.html | 14 +- deps/npm/html/doc/misc/npm-developers.html | 2 +- deps/npm/html/doc/misc/npm-disputes.html | 8 +- deps/npm/html/doc/misc/npm-faq.html | 4 +- deps/npm/html/doc/misc/npm-index.html | 2 +- deps/npm/html/doc/misc/npm-registry.html | 2 +- deps/npm/html/doc/misc/npm-scope.html | 2 +- deps/npm/html/doc/misc/npm-scripts.html | 41 ++-- deps/npm/html/doc/misc/removing-npm.html | 2 +- deps/npm/html/doc/misc/semver.html | 2 +- deps/npm/html/partial/doc/README.html | 2 +- deps/npm/html/partial/doc/api/npm-update.html | 10 +- deps/npm/html/partial/doc/api/npm.html | 2 +- deps/npm/html/partial/doc/cli/npm-init.html | 8 + .../npm/html/partial/doc/cli/npm-install.html | 7 +- deps/npm/html/partial/doc/cli/npm-ls.html | 14 +- .../html/partial/doc/cli/npm-run-script.html | 18 +- deps/npm/html/partial/doc/cli/npm-update.html | 79 +++++- .../npm/html/partial/doc/cli/npm-version.html | 16 +- deps/npm/html/partial/doc/cli/npm.html | 8 +- .../npm/html/partial/doc/misc/npm-config.html | 12 +- .../html/partial/doc/misc/npm-disputes.html | 6 +- deps/npm/html/partial/doc/misc/npm-faq.html | 2 +- .../html/partial/doc/misc/npm-scripts.html | 39 +-- deps/npm/lib/bugs.js | 11 +- deps/npm/lib/cache/add-remote-git.js | 4 +- deps/npm/lib/cache/maybe-github.js | 2 +- deps/npm/lib/config/defaults.js | 2 + deps/npm/lib/docs.js | 10 +- deps/npm/lib/help.js | 22 +- deps/npm/lib/install.js | 70 ++++-- deps/npm/lib/ls.js | 16 ++ deps/npm/lib/npm.js | 2 +- deps/npm/lib/owner.js | 9 +- deps/npm/lib/repo.js | 11 +- deps/npm/lib/run-script.js | 49 +++- deps/npm/lib/star.js | 14 +- deps/npm/lib/uninstall.js | 5 +- deps/npm/lib/utils/completion.sh | 4 +- deps/npm/lib/utils/error-handler.js | 8 +- deps/npm/lib/utils/git.js | 9 +- deps/npm/lib/view.js | 8 +- deps/npm/man/man1/npm-README.1 | 2 +- deps/npm/man/man1/npm-access.1 | 2 +- deps/npm/man/man1/npm-adduser.1 | 2 +- deps/npm/man/man1/npm-bin.1 | 2 +- deps/npm/man/man1/npm-bugs.1 | 2 +- deps/npm/man/man1/npm-build.1 | 2 +- deps/npm/man/man1/npm-bundle.1 | 2 +- deps/npm/man/man1/npm-cache.1 | 2 +- deps/npm/man/man1/npm-completion.1 | 2 +- deps/npm/man/man1/npm-config.1 | 2 +- deps/npm/man/man1/npm-dedupe.1 | 2 +- deps/npm/man/man1/npm-deprecate.1 | 2 +- deps/npm/man/man1/npm-dist-tag.1 | 2 +- deps/npm/man/man1/npm-docs.1 | 2 +- deps/npm/man/man1/npm-edit.1 | 2 +- deps/npm/man/man1/npm-explore.1 | 2 +- deps/npm/man/man1/npm-help-search.1 | 2 +- deps/npm/man/man1/npm-help.1 | 2 +- deps/npm/man/man1/npm-init.1 | 15 +- deps/npm/man/man1/npm-install.1 | 9 +- deps/npm/man/man1/npm-link.1 | 2 +- deps/npm/man/man1/npm-logout.1 | 2 +- deps/npm/man/man1/npm-ls.1 | 24 +- deps/npm/man/man1/npm-outdated.1 | 2 +- deps/npm/man/man1/npm-owner.1 | 2 +- deps/npm/man/man1/npm-pack.1 | 2 +- deps/npm/man/man1/npm-prefix.1 | 2 +- deps/npm/man/man1/npm-prune.1 | 2 +- deps/npm/man/man1/npm-publish.1 | 2 +- deps/npm/man/man1/npm-rebuild.1 | 2 +- deps/npm/man/man1/npm-repo.1 | 2 +- deps/npm/man/man1/npm-restart.1 | 2 +- deps/npm/man/man1/npm-rm.1 | 2 +- deps/npm/man/man1/npm-root.1 | 2 +- deps/npm/man/man1/npm-run-script.1 | 22 +- deps/npm/man/man1/npm-search.1 | 2 +- deps/npm/man/man1/npm-shrinkwrap.1 | 2 +- deps/npm/man/man1/npm-star.1 | 2 +- deps/npm/man/man1/npm-stars.1 | 2 +- deps/npm/man/man1/npm-start.1 | 2 +- deps/npm/man/man1/npm-stop.1 | 2 +- deps/npm/man/man1/npm-tag.1 | 2 +- deps/npm/man/man1/npm-test.1 | 2 +- deps/npm/man/man1/npm-uninstall.1 | 2 +- deps/npm/man/man1/npm-unpublish.1 | 2 +- deps/npm/man/man1/npm-update.1 | 139 ++++++++++- deps/npm/man/man1/npm-version.1 | 21 +- deps/npm/man/man1/npm-view.1 | 2 +- deps/npm/man/man1/npm-whoami.1 | 2 +- deps/npm/man/man1/npm.1 | 4 +- deps/npm/man/man3/npm-bin.3 | 2 +- deps/npm/man/man3/npm-bugs.3 | 2 +- deps/npm/man/man3/npm-cache.3 | 2 +- deps/npm/man/man3/npm-commands.3 | 2 +- deps/npm/man/man3/npm-config.3 | 2 +- deps/npm/man/man3/npm-deprecate.3 | 2 +- deps/npm/man/man3/npm-docs.3 | 2 +- deps/npm/man/man3/npm-edit.3 | 2 +- deps/npm/man/man3/npm-explore.3 | 2 +- deps/npm/man/man3/npm-help-search.3 | 2 +- deps/npm/man/man3/npm-init.3 | 2 +- deps/npm/man/man3/npm-install.3 | 2 +- deps/npm/man/man3/npm-link.3 | 2 +- deps/npm/man/man3/npm-load.3 | 2 +- deps/npm/man/man3/npm-ls.3 | 2 +- deps/npm/man/man3/npm-outdated.3 | 2 +- deps/npm/man/man3/npm-owner.3 | 2 +- deps/npm/man/man3/npm-pack.3 | 2 +- deps/npm/man/man3/npm-prefix.3 | 2 +- deps/npm/man/man3/npm-prune.3 | 2 +- deps/npm/man/man3/npm-publish.3 | 2 +- deps/npm/man/man3/npm-rebuild.3 | 2 +- deps/npm/man/man3/npm-repo.3 | 2 +- deps/npm/man/man3/npm-restart.3 | 2 +- deps/npm/man/man3/npm-root.3 | 2 +- deps/npm/man/man3/npm-run-script.3 | 2 +- deps/npm/man/man3/npm-search.3 | 2 +- deps/npm/man/man3/npm-shrinkwrap.3 | 2 +- deps/npm/man/man3/npm-start.3 | 2 +- deps/npm/man/man3/npm-stop.3 | 2 +- deps/npm/man/man3/npm-tag.3 | 2 +- deps/npm/man/man3/npm-test.3 | 2 +- deps/npm/man/man3/npm-uninstall.3 | 2 +- deps/npm/man/man3/npm-unpublish.3 | 2 +- deps/npm/man/man3/npm-update.3 | 16 +- deps/npm/man/man3/npm-version.3 | 2 +- deps/npm/man/man3/npm-view.3 | 2 +- deps/npm/man/man3/npm-whoami.3 | 2 +- deps/npm/man/man3/npm.3 | 4 +- deps/npm/man/man5/npm-folders.5 | 2 +- deps/npm/man/man5/npm-global.5 | 2 +- deps/npm/man/man5/npm-json.5 | 2 +- deps/npm/man/man5/npmrc.5 | 2 +- deps/npm/man/man5/package.json.5 | 2 +- deps/npm/man/man7/npm-coding-style.7 | 2 +- deps/npm/man/man7/npm-config.7 | 18 +- deps/npm/man/man7/npm-developers.7 | 2 +- deps/npm/man/man7/npm-disputes.7 | 2 +- deps/npm/man/man7/npm-faq.7 | 2 +- deps/npm/man/man7/npm-index.7 | 2 +- deps/npm/man/man7/npm-registry.7 | 2 +- deps/npm/man/man7/npm-scope.7 | 2 +- deps/npm/man/man7/npm-scripts.7 | 48 ++-- deps/npm/man/man7/removing-npm.7 | 2 +- deps/npm/man/man7/semver.7 | 2 +- deps/npm/node_modules/glob/package.json | 17 +- deps/npm/node_modules/glob/sync.js | 6 +- deps/npm/node_modules/inflight/.eslintrc | 17 -- .../init-package-json/default-input.js | 3 + .../init-package-json/package.json | 34 +-- .../init-package-json/test/npm-defaults.js | 2 +- .../init-package-json/test/scope.js | 35 +++ .../node_modules/normalize-git-url/.eslintrc | 19 -- .../@npm/npm-registry-client/cache.json | 1 - .../test/fixtures/underscore/1.3.3/cache.json | 1 - .../fixtures/underscore/1.3.3/package.tgz | Bin 58692 -> 0 bytes .../test/fixtures/underscore/cache.json | 1 - .../readdir-scoped-modules/.eslintrc | 17 -- deps/npm/node_modules/request/.eslintrc | 22 -- .../request/node_modules/bl/.jshintrc | 59 ----- .../request/node_modules/isstream/.jshintrc | 59 ----- .../request/node_modules/qs/.jshintrc | 10 - .../node_modules/tunnel-agent/.jshintrc | 5 - deps/npm/node_modules/semver/package.json | 25 +- deps/npm/node_modules/which/package.json | 21 +- deps/npm/node_modules/which/which.js | 2 + deps/npm/package.json | 12 +- deps/npm/test/common-tap.js | 1 + .../disabled/outdated-depth-integer/README.md | 1 - .../disabled/outdated-depth-integer/index.js | 1 - .../outdated-depth-integer/package.json | 10 - deps/npm/test/tap/add-remote-git-file.js | 91 +++++++ deps/npm/test/tap/build-already-built.js | 2 +- deps/npm/test/tap/graceful-restart.js | 118 +++++++++ deps/npm/test/tap/lifecycle-signal.js | 7 - deps/npm/test/tap/ls-env.js | 77 ++++++ .../outdated-depth-integer.js | 49 +++- deps/npm/test/tap/run-script.js | 228 ++++++++++++++---- deps/npm/test/tap/run-script/package.json | 13 - .../npm/test/tap/shrinkwrap-dev-dependency.js | 2 +- deps/npm/test/tap/update-examples.js | 188 +++++++++++++++ 291 files changed, 2102 insertions(+), 906 deletions(-) delete mode 100644 deps/npm/node_modules/inflight/.eslintrc create mode 100644 deps/npm/node_modules/init-package-json/test/scope.js delete mode 100644 deps/npm/node_modules/normalize-git-url/.eslintrc delete mode 100644 deps/npm/node_modules/npm-registry-client/test/fixtures/@npm/npm-registry-client/cache.json delete mode 100644 deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/1.3.3/cache.json delete mode 100644 deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/1.3.3/package.tgz delete mode 100644 deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/cache.json delete mode 100644 deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/.eslintrc delete mode 100644 deps/npm/node_modules/request/.eslintrc delete mode 100644 deps/npm/node_modules/request/node_modules/bl/.jshintrc delete mode 100644 deps/npm/node_modules/request/node_modules/isstream/.jshintrc delete mode 100644 deps/npm/node_modules/request/node_modules/qs/.jshintrc delete mode 100644 deps/npm/node_modules/request/node_modules/tunnel-agent/.jshintrc delete mode 100644 deps/npm/test/disabled/outdated-depth-integer/README.md delete mode 100644 deps/npm/test/disabled/outdated-depth-integer/index.js delete mode 100644 deps/npm/test/disabled/outdated-depth-integer/package.json create mode 100644 deps/npm/test/tap/add-remote-git-file.js create mode 100644 deps/npm/test/tap/graceful-restart.js create mode 100644 deps/npm/test/tap/ls-env.js rename deps/npm/test/{disabled => tap}/outdated-depth-integer.js (53%) delete mode 100644 deps/npm/test/tap/run-script/package.json create mode 100644 deps/npm/test/tap/update-examples.js diff --git a/deps/npm/CHANGELOG.md b/deps/npm/CHANGELOG.md index aebf1444c8a..006eb06ff23 100644 --- a/deps/npm/CHANGELOG.md +++ b/deps/npm/CHANGELOG.md @@ -1,3 +1,159 @@ +### v2.7.0 (2015-02-26): + +#### SOMETIMES SEMVER MEANS "SUBJECTIVE-EMPATHETIC VERSIONING" + +For a very long time (maybe forever?), the documentation for `npm run-script` +has said that `npm restart` will only call `npm stop` and `npm start` when +there is no command defined as `npm restart` in `package.json`. The problem +with this documentation is that `npm run-script` was apparently never wired up +to actually work this way. + +Until now. + +If the patch below were landed on its own, free of context, it would be a +breaking change. But, since the "new" behavior is how the documentation claims +this feature has always worked, I'm classifying it as a patch-level bug fix. I +apologize in advance if this breaks anybody's deployment scripts, and if it +turns out to be a significant regression in practics, we can revert this change +and move it to `npm@3`, which is allowed to make breaking changes due to being +a new major version of semver. + +* [`2f6a1df`](https://github.com/npm/npm/commit/2f6a1df3e1e3e0a3bc4abb69e40f59a64204e7aa) + [#1999](https://github.com/npm/npm/issues/1999) Only run `stop` and `start` + scripts (plus their pre- and post- scripts) when there's no `restart` script + defined. This makes it easier to support graceful restarts of services + managed by npm. ([@watilde](https://github.com/watilde) / + [@scien](https://github.com/scien)) + +#### A SMALL FEATURE WITH BIG IMPLICATIONS + +* [`145af65`](https://github.com/npm/npm/commit/145af6587f45de135cc876be2027ed818ed4ca6a) + [#4887](https://github.com/npm/npm/issues/4887) Replace calls to the + `node-gyp` script bundled with npm by passing the + `--node-gyp=/path/to/node-gyp` option to npm. Swap in `pangyp` or a version + of `node-gyp` modified to work better with io.js without having to touch + npm's code! ([@ackalker](https://github.com/ackalker)) + +#### [@WATILDE'S](https://github.com/watilde) NPM USABILITY CORNER + +Following `npm@2.6.1`'s unexpected fix of many of the issues with `npm update +-g` simply by making `--depth=0` the default for `npm outdated`, friend of npm +[@watilde](https://github.com/watilde) has made several modest changes to npm's +behavior that together justify bumping npm's minor version, as well as making +npm significantly more pleasant to use: + +* [`448efd0`](https://github.com/npm/npm/commit/448efd0eaa6f97af0889bf47efc543a1ea2f8d7e) + [#2853](https://github.com/npm/npm/issues/2853) Add support for `--dev` and + `--prod` to `npm ls`, so that you can list only the trees of production or + development dependencies, as desired. + ([@watilde](https://github.com/watilde)) +* [`a0a8777`](https://github.com/npm/npm/commit/a0a87777af8bee180e4e9321699f050c29ed5ac4) + [#7463](https://github.com/npm/npm/issues/7463) Split the list printed by + `npm run-script` into lifecycle scripts and scripts directly invoked via `npm + run-script`. ([@watilde](https://github.com/watilde)) +* [`a5edc17`](https://github.com/npm/npm/commit/a5edc17d5ef1435b468a445156a4a109df80f92b) + [#6749](https://github.com/npm/npm/issues/6749) `init-package-json@1.3.1`: + Support for passing scopes to `npm init` so packages are initialized as part + of that scope / organization / team. ([@watilde](https://github.com/watilde)) + +#### SMALLER FEATURES AND FIXES + +It turns out that quite a few pull requests had piled up on npm's issue +tracker, and they included some nice small features and fixes: + +* [`f33e8b8`](https://github.com/npm/npm/commit/f33e8b8ff2de094071c5976be95e35110cf2ab1a) + [#7354](https://github.com/npm/npm/issues/7354) Add `--if-present` flag to + allow e.g. CI systems to call (semi-) standard build tasks defined in + `package.json`, but don't raise an error if no such script is defined. + ([@jussi](https://github.com/jussi)-kalliokoski) +* [`7bf85cc`](https://github.com/npm/npm/commit/7bf85cc372ab5698593b01e139c383fa62c92516) + [#4005](https://github.com/npm/npm/issues/4005) + [#6248](https://github.com/npm/npm/issues/6248) Globally unlink a package + when `npm rm` / `npm unlink` is called with no arguments. + ([@isaacs](https://github.com/isaacs)) +* [`a2e04bd`](https://github.com/npm/npm/commit/a2e04bd921feab8f9e40a27e180ca9308eb709d7) + [#7294](https://github.com/npm/npm/issues/7294) Ensure that when depending on + `git+` URLs, npm doesn't keep tacking additional `git+` prefixes onto + the front. ([@twhid](https://github.com/twhid)) +* [`0f87f5e`](https://github.com/npm/npm/commit/0f87f5ed28960d962f34977953561d22983da4f9) + [#6422](https://github.com/npm/npm/issues/6422) When depending on GitHub + private repositories, make sure we construct the Git URLS correctly. + ([@othiym23](https://github.com/othiym23)) +* [`50f461d`](https://github.com/npm/npm/commit/50f461d248c4d22e881a9535dccc1d57d994dbc7) + [#4595](https://github.com/npm/npm/issues/4595) Support finding compressed + manpages. It's still up to the system to figure out how to display them, + though. ([@pshevtsov](https://github.com/pshevtsov)) +* [`44da664`](https://github.com/npm/npm/commit/44da66456b530c049ff50953f78368460df87461) + [#7465](https://github.com/npm/npm/issues/7465) When calling git, log the + **full** command, with all arguments, on error. + ([@thriqon](https://github.com/thriqon)) +* [`9748d5c`](https://github.com/npm/npm/commit/9748d5cd195d0269b32caf45129a93d29359a796) + Add parent to error on `ETARGET` error. + ([@davglass](https://github.com/davglass)) +* [`37038d7`](https://github.com/npm/npm/commit/37038d7db47a986001f77ac17b3e164000fc8ff3) + [#4663](https://github.com/npm/npm/issues/4663) Remove hackaround for Linux + tests, as it's evidently no longer necessary. + ([@mmalecki](https://github.com/mmalecki)) +* [`d7b7853`](https://github.com/npm/npm/commit/d7b785393dffce93bb70317fbc039a6428ca37c5) + [#2612](https://github.com/npm/npm/issues/2612) Add support for path + completion on `npm install`, which narrows completion to only directories + containing `package.json` files. ([@deestan](https://github.com/deestan)) +* [`628fcdb`](https://github.com/npm/npm/commit/628fcdb0be4e14c0312085a50dc2ae01dc713fa6) + Remove all command completion calls to `-/short`, because it's been removed + from the primary registry for quite some time, and is generally a poor idea + on any registry with more than a few hundred packages. + ([@othiym23](https://github.com/othiym23)) +* [`3f6061d`](https://github.com/npm/npm/commit/3f6061d75650441ee690472d1fa9c8dd7a7b1b28) + [#6659](https://github.com/npm/npm/issues/6659) Instead of removing zsh + completion global, make it a local instead. + ([@othiym23](https://github.com/othiym23)) + +#### DOCUMENTATION TWEAKS + +* [`5bc70e6`](https://github.com/npm/npm/commit/5bc70e6cfb3598da433806c6f447fc94c8e1d35d) + [#7417](https://github.com/npm/npm/issues/7417) Provide concrete examples of + how the new `npm update` defaults work in practice, tied to actual test + cases. Everyone interested in using `npm update -g` now that it's been fixed + should read these documents, as should anyone interested in writing + documentation for npm. ([@smikes](https://github.com/smikes)) +* [`8ac6f21`](https://github.com/npm/npm/commit/8ac6f2123a6af13dc9447fad96ec9cb583c45a71) + [#6543](https://github.com/npm/npm/issues/6543) Clarify `npm-scripts` + warnings to de-emphasize dangers of using `install` scripts. + ([@zeke](https://github.com/zeke)) +* [`ebe3b37`](https://github.com/npm/npm/commit/ebe3b37098efdada41dcc4c52a291e29296ea242) + [#6711](https://github.com/npm/npm/issues/6711) Note that git tagging of + versions can be disabled via `--no-git-tag-verson`. + ([@smikes](https://github.com/smikes)) +* [`2ef5771`](https://github.com/npm/npm/commit/2ef5771632006e6cee8cf17f836c0f98ab494bd1) + [#6711](https://github.com/npm/npm/issues/6711) Document `git-tag-version` + configuration option. ([@KenanY](https://github.com/KenanY)) +* [`95e59b2`](https://github.com/npm/npm/commit/95e59b287c9517780318e145371a859e8ebb2d20) + Document that `NODE_ENV=production` behaves analogously to `--production` on + `npm install`. ([@stefaneg](https://github.com/stefaneg)) +* [`687117a`](https://github.com/npm/npm/commit/687117a5bcd6a838cd1532ea7020ec6fcf0c33c0) + [#7463](https://github.com/npm/npm/issues/7463) Document the new script + grouping behavior in the man page for `npm run-script`. + ([@othiym23](https://github.com/othiym23)) +* [`536b2b6`](https://github.com/npm/npm/commit/536b2b6f55c349247b3e79b5d11b4c033ef5a3df) + Rescue one of the the disabled tests and make it work properly. + ([@smikes](https://github.com/smikes)) + +#### DEPENDENCY UPDATES + +* [`89fc6a4`](https://github.com/npm/npm/commit/89fc6a4e7ff8c524675fcc14493ca0a1e3a76d38) + `which@1.0.9`: Test for being run as root, as well as the current user. + ([@isaacs](https://github.com/isaacs)) +* [`5d0612f`](https://github.com/npm/npm/commit/5d0612f31e226cba32a05351c47b055c0ab6c557) + `glob@4.4.1`: Better error message to explain why calling sync glob with a + callback results in an error. ([@isaacs](https://github.com/isaacs)) +* [`64b07f6`](https://github.com/npm/npm/commit/64b07f6caf6cb07e4102f1e4e5f2ff2b944e452e) + `tap@0.7.1`: More accurate counts of pending & skipped tests. + ([@rmg](https://github.com/rmg)) +* [`8fda451`](https://github.com/npm/npm/commit/8fda45195dae1d6f792be556abe87f7763fab09b) + `semver@4.3.1`: Make official the fact that `node-semver` has moved from + [@isaacs](https://github.com/isaacs)'s organization to + [@npm](https://github.com/npm)'s. ([@isaacs](https://github.com/isaacs)) + ### v2.6.1 (2015-02-19): * [`8b98f0e`](https://github.com/npm/npm/commit/8b98f0e709d77a8616c944aebd48ab726f726f76) diff --git a/deps/npm/bin/node-gyp-bin/node-gyp b/deps/npm/bin/node-gyp-bin/node-gyp index 345f07a18fd..70efb6f339f 100755 --- a/deps/npm/bin/node-gyp-bin/node-gyp +++ b/deps/npm/bin/node-gyp-bin/node-gyp @@ -1,2 +1,6 @@ #!/usr/bin/env sh -node "`dirname "$0"`/../../node_modules/node-gyp/bin/node-gyp.js" "$@" +if [ "x$npm_config_node_gyp" = "x" ]; then + node "`dirname "$0"`/../../node_modules/node-gyp/bin/node-gyp.js" "$@" +else + "$npm_config_node_gyp" "$@" +fi diff --git a/deps/npm/bin/node-gyp-bin/node-gyp.cmd b/deps/npm/bin/node-gyp-bin/node-gyp.cmd index c2563ea11df..a8c18cdb0a0 100755 --- a/deps/npm/bin/node-gyp-bin/node-gyp.cmd +++ b/deps/npm/bin/node-gyp-bin/node-gyp.cmd @@ -1 +1,5 @@ -node "%~dp0\..\..\node_modules\node-gyp\bin\node-gyp.js" %* +if not defined npm_config_node_gyp ( + node "%~dp0\..\..\node_modules\node-gyp\bin\node-gyp.js" %* +) else ( + %npm_config_node_gyp% %* +) diff --git a/deps/npm/doc/api/npm-update.md b/deps/npm/doc/api/npm-update.md index bf02fd3c845..52d7ec343c0 100644 --- a/deps/npm/doc/api/npm-update.md +++ b/deps/npm/doc/api/npm-update.md @@ -2,10 +2,17 @@ npm-update(3) -- Update a package ================================= ## SYNOPSIS + npm.commands.update(packages, callback) # DESCRIPTION -Updates a package, upgrading it to the latest version. It also installs any missing packages. +Updates a package, upgrading it to the latest version. It also installs any +missing packages. + +The `packages` argument is an array of packages to update. The `callback` +parameter will be called when done or when an error occurs. + +## SEE ALSO -The 'packages' argument is an array of packages to update. The 'callback' parameter will be called when done or when an error occurs. +* npm-update(1) diff --git a/deps/npm/doc/cli/npm-init.md b/deps/npm/doc/cli/npm-init.md index 08e517d79a4..ec4c25bedaa 100644 --- a/deps/npm/doc/cli/npm-init.md +++ b/deps/npm/doc/cli/npm-init.md @@ -21,8 +21,18 @@ without a really good reason to do so. If you invoke it with `-f`, `--force`, `-y`, or `--yes`, it will use only defaults and not prompt you for any options. +## CONFIGURATION + +### scope + +* Default: none +* Type: String + +The scope under which the new module should be created. + ## SEE ALSO * * package.json(5) * npm-version(1) +* npm-scope(7) diff --git a/deps/npm/doc/cli/npm-install.md b/deps/npm/doc/cli/npm-install.md index 2d427163730..6b2ac7778c2 100644 --- a/deps/npm/doc/cli/npm-install.md +++ b/deps/npm/doc/cli/npm-install.md @@ -43,9 +43,10 @@ after packing it up into a tarball (b). it installs the current package context (ie, the current working directory) as a global package. - By default, `npm install` will install all modules listed as - dependencies. With the `--production` flag, - npm will not install modules listed in `devDependencies`. + By default, `npm install` will install all modules listed as dependencies. + With the `--production` flag (or when the `NODE_ENV` environment variable + is set to `production`), npm will not install modules listed in + `devDependencies`. * `npm install `: diff --git a/deps/npm/doc/cli/npm-ls.md b/deps/npm/doc/cli/npm-ls.md index 0f0d79489ae..318cdd8fd64 100644 --- a/deps/npm/doc/cli/npm-ls.md +++ b/deps/npm/doc/cli/npm-ls.md @@ -67,6 +67,20 @@ project. Max display depth of the dependency tree. +### prod / production + +* Type: Boolean +* Default: false + +Display only the dependency tree for packages in `dependencies`. + +### dev + +* Type: Boolean +* Default: false + +Display only the dependency tree for packages in `devDependencies`. + ## SEE ALSO * npm-config(1) diff --git a/deps/npm/doc/cli/npm-run-script.md b/deps/npm/doc/cli/npm-run-script.md index c218c845f53..9e6e17e1d02 100644 --- a/deps/npm/doc/cli/npm-run-script.md +++ b/deps/npm/doc/cli/npm-run-script.md @@ -8,16 +8,11 @@ npm-run-script(1) -- Run arbitrary package scripts ## DESCRIPTION -This runs an arbitrary command from a package's `"scripts"` object. -If no package name is provided, it will search for a `package.json` -in the current folder and use its `"scripts"` object. If no `"command"` -is provided, it will list the available top level scripts. The `env` command -can be used to list environment variables that will be available to the script -at runtime. If an "env" command is defined in your package it will have -precedence instead. - -`run[-script]` is used by the test, start, restart, and stop commands, but can -be called directly, as well. +This runs an arbitrary command from a package's `"scripts"` object. If no +`"command"` is provided, it will list the available scripts. `run[-script]` is +used by the test, start, restart, and stop commands, but can be called +directly, as well. When the scripts in the package are printed out, they're +separated into lifecycle (test, start, restart) and directly-run scripts. As of [`npm@2.0.0`](http://blog.npmjs.org/post/98131109725/npm-2-0-0), you can use custom arguments when executing scripts. The special option `--` is used by @@ -29,6 +24,11 @@ all the arguments after the `--` directly to your script: The arguments will only be passed to the script specified after ```npm run``` and not to any pre or post script. +The `env` script is a special built-in command that can be used to list +environment variables that will be available to the script at runtime. If an +"env" command is defined in your package it will take precedence over the +built-in. + ## SEE ALSO * npm-scripts(7) diff --git a/deps/npm/doc/cli/npm-update.md b/deps/npm/doc/cli/npm-update.md index 2aa0f366bc2..ce31c28910f 100644 --- a/deps/npm/doc/cli/npm-update.md +++ b/deps/npm/doc/cli/npm-update.md @@ -8,7 +8,7 @@ npm-update(1) -- Update a package ## DESCRIPTION This command will update all the packages listed to the latest version -(specified by the `tag` config). +(specified by the `tag` config), respecting semver. It will also install missing packages. As with all commands that install packages, the `--dev` flag will cause `devDependencies` to be processed @@ -20,10 +20,135 @@ packages. If no package name is specified, all packages in the specified location (global or local) will be updated. +As of `npm@2.6.1`, the `npm update` will only inspect top-level packages. +Prior versions of `npm` would also recursively inspect all dependencies. +To get the old behavior, use `npm --depth 9999 update`, but be warned that +simultaneous asynchronous update of all packages, including `npm` itself +and packages that `npm` depends on, often causes problems up to and including +the uninstallation of `npm` itself. + +To restore a missing `npm`, use the command: + +``` +curl -L https://npmjs.com/install.sh | sh +``` + +## EXAMPLES + +IMPORTANT VERSION NOTE: these examples assume `npm@2.6.1` or later. For +older versions of `npm`, you must specify `--depth 0` to get the behavior +described below. + +For the examples below, assume that the current package is `app` and it depends +on dependencies, `dep1` (`dep2`, .. etc.). The published versions of `dep1` are: + +``` +{ + dist-tags: { latest: "1.2.2" }, + versions: { "1.2.2", + "1.2.1", + "1.2.0", + "1.1.2", + "1.1.1", + "1.0.0", + "0.4.1", + "0.4.0", + "0.2.0" + } +} +``` + +### Caret Dependencies + +If `app`'s `package.json` contains: + +``` +dependencies: { + dep1: "^1.1.1" +} +``` + +Then `npm update` will install `dep1@1.2.2`, because `1.2.2` is `latest` and +`1.2.2` satisfies `^1.1.1`. + +### Tilde Dependencies + +However, if `app`'s `package.json` contains: + +``` +dependencies: { + dep1: "~1.1.1" +} +``` + +In this case, running `npm update` will install `dep1@1.1.2`. Even though the `latest` +tag points to `1.2.2`, this version does not satisfy `~1.1.1`, which is equivalent +to `>=1.1.1 <1.2.0`. So the highest-sorting version that satisfies `~1.1.1` is used, +which is `1.1.2`. + +### Caret Dependencies below 1.0.0 + +Suppose `app` has a caret dependency on a version below `1.0.0`, for example: + +``` +dependencies: { + dep1: "^0.2.0" +} +``` + +`npm update` will install `dep1@0.2.0`, because there are no other +versions which satisfy `^0.2.0`. + +If the dependence were on `^0.4.0`: + +``` +dependencies: { + dep1: "^0.4.0" +} +``` + +Then `npm update` will install `dep1@0.4.1`, because that is the highest-sorting +version that satisfies `^0.4.0` (`>= 0.4.0 <0.5.0`) + +### Recording Updates with `--save` + +When you want to update a package and save the new version as +the minimum required dependency in `package.json`, you can use +`npm update --save`. For example if `package.json` contains + +``` +dependencies: { + dep1: "^1.1.1" +} +``` + +Then `npm update --save` will install `dep1@1.2.2` (i.e., `latest`), +and `package.json` will be modified: + +``` +dependencies: { + dep1: "^1.2.2" +} +``` + +Note that `npm` will only write an updated version to `package.json` +if it installs a new package. + +### Updating Globally-Installed Packages + +`npm update -g` will apply the `update` action to each globally- installed +package that is `outdated` -- that is, has a version that is different from +`latest`. + +NOTE: If a package has been upgraded to a version newer than `latest`, it will +be _downgraded_. + + ## SEE ALSO * npm-install(1) * npm-outdated(1) +* npm-shrinkwrap(1) * npm-registry(7) * npm-folders(5) * npm-ls(1) diff --git a/deps/npm/doc/cli/npm-version.md b/deps/npm/doc/cli/npm-version.md index 69f3581bfcb..545bce6b6bf 100644 --- a/deps/npm/doc/cli/npm-version.md +++ b/deps/npm/doc/cli/npm-version.md @@ -15,8 +15,10 @@ valid second argument to semver.inc (one of "patch", "minor", "major", "prepatch", "preminor", "premajor", "prerelease"). In the second case, the existing version will be incremented by 1 in the specified field. -If run in a git repo, it will also create a version commit and tag, and -fail if the repo is not clean. +If run in a git repo, it will also create a version commit and tag, and fail if +the repo is not clean. This behavior is controlled by `git-tag-version` (see +below), and can be disabled on the command line by running `npm +--no-git-tag-version version` If supplied with `--message` (shorthand: `-m`) config option, npm will use it as a commit message when creating a version commit. If the @@ -38,9 +40,18 @@ in your git config for this to work properly. For example: Enter passphrase: +## CONFIGURATION + +### git-tag-version + +* Default: true +* Type: Boolean + +Commit and tag the version change. ## SEE ALSO * npm-init(1) * package.json(5) * semver(7) +* config(7) diff --git a/deps/npm/doc/misc/npm-config.md b/deps/npm/doc/misc/npm-config.md index 7e4c10af293..e727e16664c 100644 --- a/deps/npm/doc/misc/npm-config.md +++ b/deps/npm/doc/misc/npm-config.md @@ -243,7 +243,7 @@ If true, then only prints color codes for tty file descriptors. * Default: Infinity * Type: Number -The depth to go when recursing directories for `npm ls`, +The depth to go when recursing directories for `npm ls`, `npm cache ls`, and `npm outdated`. For `npm outdated`, a setting of `Infinity` will be treated as `0` @@ -390,6 +390,17 @@ 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. +### if-present + +* Default: false +* Type: Boolean + +If true, npm will not exit with an error code when `run-script` is invoked for +a script that isn't defined in the `scripts` section of `package.json`. This +option can be used when it's desirable to optionally run a script when it's +present and fail if the script fails. This is useful, for example, when running +scripts that may only apply for some builds in an otherwise generic CI setup. + ### ignore-scripts * Default: false diff --git a/deps/npm/doc/misc/npm-scripts.md b/deps/npm/doc/misc/npm-scripts.md index 3be4af377f2..e1380d1ed74 100644 --- a/deps/npm/doc/misc/npm-scripts.md +++ b/deps/npm/doc/misc/npm-scripts.md @@ -34,46 +34,24 @@ run-script `. *Pre* and *post* commands with matching names will be run for those as well (e.g. `premyscript`, `myscript`, `postmyscript`). -## NOTE: INSTALL SCRIPTS ARE AN ANTIPATTERN - -**tl;dr** Don't use `install`. Use a `.gyp` file for compilation, and -`prepublish` for anything else. - -You should almost never have to explicitly set a `preinstall` or -`install` script. If you are doing this, please consider if there is -another option. - -The only valid use of `install` or `preinstall` scripts is for -compilation which must be done on the target architecture. In early -versions of node, this was often done using the `node-waf` scripts, or -a standalone `Makefile`, and early versions of npm required that it be -explicitly set in package.json. This was not portable, and harder to -do properly. - -In the current version of node, the standard way to do this is using a -`.gyp` file. If you have a file with a `.gyp` extension in the root -of your package, then npm will run the appropriate `node-gyp` commands -automatically at install time. This is the only officially supported -method for compiling binary addons, and does not require that you add -anything to your package.json file. - -If you have to do other things before your package is used, in a way +## COMMON USES + +If you need to perform operations on your package before it is used, in a way that is not dependent on the operating system or architecture of the -target system, then use a `prepublish` script instead. This includes +target system, use a `prepublish` script. This includes tasks such as: -* Compile CoffeeScript source code into JavaScript. -* Create minified versions of JavaScript source code. +* Compiling CoffeeScript source code into JavaScript. +* Creating minified versions of JavaScript source code. * Fetching remote resources that your package will use. -The advantage of doing these things at `prepublish` time instead of -`preinstall` or `install` time is that they can be done once, in a -single place, and thus greatly reduce complexity and variability. +The advantage of doing these things at `prepublish` time is that they can be done once, in a +single place, thus reducing complexity and variability. Additionally, this means that: * You can depend on `coffee-script` as a `devDependency`, and thus your users don't need to have it installed. -* You don't need to include the minifiers in your package, reducing +* You don't need to include minifiers in your package, reducing the size for your users. * You don't need to rely on your users having `curl` or `wget` or other system tools on the target machines. @@ -234,6 +212,11 @@ above. * Don't prefix your script commands with "sudo". If root permissions are required for some reason, then it'll fail with that error, and the user will sudo the npm command in question. +* Don't use `install`. Use a `.gyp` file for compilation, and `prepublish` + for anything else. You should almost never have to explicitly set a + preinstall or install script. If you are doing this, please consider if + there is another option. The only valid use of `install` or `preinstall` + scripts is for compilation which must be done on the target architecture. ## SEE ALSO diff --git a/deps/npm/html/doc/README.html b/deps/npm/html/doc/README.html index e8e1351f5f8..a85c865b090 100644 --- a/deps/npm/html/doc/README.html +++ b/deps/npm/html/doc/README.html @@ -126,7 +126,7 @@

If you have a complaint about a package in the public npm registry, 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.

@@ -169,5 +169,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/api/npm-bin.html b/deps/npm/html/doc/api/npm-bin.html index 7fc52f8ecc1..40b07e5d7fe 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 6f4ca0926f2..d39cf2440d4 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 f3a0feb91dd..4f0c96be740 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 dbf22817bb7..ebf5b0e74ee 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 8aa8c840078..11877eb6c00 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 4d61806e948..a8d8753152b 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 ccfe64eb443..f3fce38b78d 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 a03d00bc9db..1b8b2264d44 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 e35e36ff7c2..b26c04af59a 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 305cf6f306b..99f7a5e5566 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 170501131ba..ffeae2c3ad3 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 dabe66989df..a2267a58fde 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 b985388d582..67caab6b898 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 a5eebc6c673..e3b6641bb65 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 7998d6cbdde..1040339764b 100644 --- a/deps/npm/html/doc/api/npm-ls.html +++ b/deps/npm/html/doc/api/npm-ls.html @@ -63,5 +63,5 @@

global

       - + diff --git a/deps/npm/html/doc/api/npm-outdated.html b/deps/npm/html/doc/api/npm-outdated.html index 4911ba2fe88..2fbda56fa74 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 0ba57490005..3a86a8b0266 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 c5e0ffe56c0..7dbdf463e23 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 e87d6021282..62c91d8c748 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 1202feab94c..ae9cf1c4dd1 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 8a46be54bf1..d0ae43fa390 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 515d55b67b6..4ae5944032b 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 65b66413511..60b8a9aebba 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 75804ea5c24..b657e5e9b1d 100644 --- a/deps/npm/html/doc/api/npm-restart.html +++ b/deps/npm/html/doc/api/npm-restart.html @@ -52,5 +52,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/api/npm-root.html b/deps/npm/html/doc/api/npm-root.html index 1854926bff7..a40933007fa 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 e4b8168a5bd..5e3eaf840ba 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 2c16352653e..9e5a72e97ff 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 af8a1f74c38..47bba84e1d6 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 b0521e1e5d3..cca572f4956 100644 --- a/deps/npm/html/doc/api/npm-start.html +++ b/deps/npm/html/doc/api/npm-start.html @@ -28,5 +28,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-stop.html b/deps/npm/html/doc/api/npm-stop.html index bf8cb600d5a..cb2ae75494d 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-tag.html b/deps/npm/html/doc/api/npm-tag.html index 70da6950781..14dfbd32aa2 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 78e2b83c95d..e60d561e811 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 3c0de6d7f44..3eea11c6f43 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 4ba1a5275d6..f9abc239ecf 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 4faf76f40e1..851fbdae2c0 100644 --- a/deps/npm/html/doc/api/npm-update.html +++ b/deps/npm/html/doc/api/npm-update.html @@ -13,8 +13,14 @@

npm-update

Update a package

SYNOPSIS

npm.commands.update(packages, callback)
 

DESCRIPTION

-

Updates a package, upgrading it to the latest version. It also installs any missing packages.

-

The 'packages' argument is an array of packages to update. The 'callback' parameter will be called when done or when an error occurs.

+

Updates a package, upgrading it to the latest version. It also installs any +missing packages.

+

The packages argument is an array of packages to update. The callback +parameter will be called when done or when an error occurs.

+

SEE ALSO

+ @@ -27,5 +33,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-version.html b/deps/npm/html/doc/api/npm-version.html index 30025b8f9ec..0277a274124 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 48a9d4b4e9a..f68cec8d580 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 95389135bb0..8eac49bcb47 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 5a0afacf204..69585f5c988 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

-

2.6.1

+

2.7.0

DESCRIPTION

This is the API documentation for npm. To find documentation of the command line @@ -109,5 +109,5 @@

ABBREVS

       - + diff --git a/deps/npm/html/doc/cli/npm-access.html b/deps/npm/html/doc/cli/npm-access.html index 683fdd267f3..836ef8c4da8 100644 --- a/deps/npm/html/doc/cli/npm-access.html +++ b/deps/npm/html/doc/cli/npm-access.html @@ -75,5 +75,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-adduser.html b/deps/npm/html/doc/cli/npm-adduser.html index 75e6d90c222..93818e9aef8 100644 --- a/deps/npm/html/doc/cli/npm-adduser.html +++ b/deps/npm/html/doc/cli/npm-adduser.html @@ -68,5 +68,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-bin.html b/deps/npm/html/doc/cli/npm-bin.html index 8c5b9e53afc..c9b43ad0c4a 100644 --- a/deps/npm/html/doc/cli/npm-bin.html +++ b/deps/npm/html/doc/cli/npm-bin.html @@ -35,5 +35,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-bugs.html b/deps/npm/html/doc/cli/npm-bugs.html index c108f74a1c3..f19b04c837e 100644 --- a/deps/npm/html/doc/cli/npm-bugs.html +++ b/deps/npm/html/doc/cli/npm-bugs.html @@ -54,5 +54,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-build.html b/deps/npm/html/doc/cli/npm-build.html index e973ef516c5..21d010e9a8f 100644 --- a/deps/npm/html/doc/cli/npm-build.html +++ b/deps/npm/html/doc/cli/npm-build.html @@ -38,5 +38,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-bundle.html b/deps/npm/html/doc/cli/npm-bundle.html index f36b495d38d..35b09036a4b 100644 --- a/deps/npm/html/doc/cli/npm-bundle.html +++ b/deps/npm/html/doc/cli/npm-bundle.html @@ -31,5 +31,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-cache.html b/deps/npm/html/doc/cli/npm-cache.html index e9e2e9ee4ad..516e7690216 100644 --- a/deps/npm/html/doc/cli/npm-cache.html +++ b/deps/npm/html/doc/cli/npm-cache.html @@ -81,5 +81,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-completion.html b/deps/npm/html/doc/cli/npm-completion.html index 73b5ac9b474..58548888a62 100644 --- a/deps/npm/html/doc/cli/npm-completion.html +++ b/deps/npm/html/doc/cli/npm-completion.html @@ -42,5 +42,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-config.html b/deps/npm/html/doc/cli/npm-config.html index 370e5eab8ed..4b55be25e9a 100644 --- a/deps/npm/html/doc/cli/npm-config.html +++ b/deps/npm/html/doc/cli/npm-config.html @@ -66,5 +66,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-dedupe.html b/deps/npm/html/doc/cli/npm-dedupe.html index 5ef2995e58b..1c06741d37e 100644 --- a/deps/npm/html/doc/cli/npm-dedupe.html +++ b/deps/npm/html/doc/cli/npm-dedupe.html @@ -63,5 +63,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-deprecate.html b/deps/npm/html/doc/cli/npm-deprecate.html index aee4d4b2eac..64113295702 100644 --- a/deps/npm/html/doc/cli/npm-deprecate.html +++ b/deps/npm/html/doc/cli/npm-deprecate.html @@ -38,5 +38,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-dist-tag.html b/deps/npm/html/doc/cli/npm-dist-tag.html index adb4a0b3fa7..0b679b856dd 100644 --- a/deps/npm/html/doc/cli/npm-dist-tag.html +++ b/deps/npm/html/doc/cli/npm-dist-tag.html @@ -76,5 +76,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-docs.html b/deps/npm/html/doc/cli/npm-docs.html index c697e3b3232..3ea861db29f 100644 --- a/deps/npm/html/doc/cli/npm-docs.html +++ b/deps/npm/html/doc/cli/npm-docs.html @@ -56,5 +56,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-edit.html b/deps/npm/html/doc/cli/npm-edit.html index ddd3b1b7b3b..d3d535dc9d8 100644 --- a/deps/npm/html/doc/cli/npm-edit.html +++ b/deps/npm/html/doc/cli/npm-edit.html @@ -49,5 +49,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-explore.html b/deps/npm/html/doc/cli/npm-explore.html index ce4b159463b..835290f5c8b 100644 --- a/deps/npm/html/doc/cli/npm-explore.html +++ b/deps/npm/html/doc/cli/npm-explore.html @@ -49,5 +49,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-help-search.html b/deps/npm/html/doc/cli/npm-help-search.html index ee61caea188..17b3f5dec94 100644 --- a/deps/npm/html/doc/cli/npm-help-search.html +++ b/deps/npm/html/doc/cli/npm-help-search.html @@ -46,5 +46,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-help.html b/deps/npm/html/doc/cli/npm-help.html index 686ab9280e9..5c0efe03e51 100644 --- a/deps/npm/html/doc/cli/npm-help.html +++ b/deps/npm/html/doc/cli/npm-help.html @@ -52,5 +52,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-init.html b/deps/npm/html/doc/cli/npm-init.html index 5b047702036..3aa29a8106e 100644 --- a/deps/npm/html/doc/cli/npm-init.html +++ b/deps/npm/html/doc/cli/npm-init.html @@ -22,11 +22,19 @@

SYNOPSIS

without a really good reason to do so.

If you invoke it with -f, --force, -y, or --yes, it will use only defaults and not prompt you for any options.

+

CONFIGURATION

+

scope

+
    +
  • Default: none
  • +
  • Type: String
  • +
+

The scope under which the new module should be created.

SEE ALSO

@@ -40,5 +48,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-install.html b/deps/npm/html/doc/cli/npm-install.html index 4c4d3e18430..e43c2d05f02 100644 --- a/deps/npm/html/doc/cli/npm-install.html +++ b/deps/npm/html/doc/cli/npm-install.html @@ -44,9 +44,10 @@

SYNOPSIS

In global mode (ie, with -g or --global appended to the command), it installs the current package context (ie, the current working directory) as a global package.

-

By default, npm install will install all modules listed as - dependencies. With the --production flag, - npm will not install modules listed in devDependencies.

+

By default, npm install will install all modules listed as dependencies. + With the --production flag (or when the NODE_ENV environment variable + is set to production), npm will not install modules listed in + devDependencies.

  • npm install <folder>:

    Install a package that is sitting in a folder on the filesystem.

    @@ -239,5 +240,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/cli/npm-link.html b/deps/npm/html/doc/cli/npm-link.html index 0c54bdfe11e..818d660ec04 100644 --- a/deps/npm/html/doc/cli/npm-link.html +++ b/deps/npm/html/doc/cli/npm-link.html @@ -71,5 +71,5 @@

    SYNOPSIS

           - + diff --git a/deps/npm/html/doc/cli/npm-logout.html b/deps/npm/html/doc/cli/npm-logout.html index 581809fb886..4a77e01c595 100644 --- a/deps/npm/html/doc/cli/npm-logout.html +++ b/deps/npm/html/doc/cli/npm-logout.html @@ -55,5 +55,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/cli/npm-ls.html b/deps/npm/html/doc/cli/npm-ls.html index e68131fb99c..861aad23100 100644 --- a/deps/npm/html/doc/cli/npm-ls.html +++ b/deps/npm/html/doc/cli/npm-ls.html @@ -22,7 +22,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.6.1 /path/to/npm
    +
    npm@2.7.0 /path/to/npm
     └─┬ init-package-json@0.0.4
       └── promzard@0.1.5
     

    It will print out extraneous, missing, and invalid packages.

    @@ -61,6 +61,18 @@

    depth

  • Type: Int
  • Max display depth of the dependency tree.

    +

    prod / production

    +
      +
    • Type: Boolean
    • +
    • Default: false
    • +
    +

    Display only the dependency tree for packages in dependencies.

    +

    dev

    +
      +
    • Type: Boolean
    • +
    • Default: false
    • +
    +

    Display only the dependency tree for packages in devDependencies.

    SEE ALSO

    • npm-config(1)
    • @@ -85,5 +97,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-outdated.html b/deps/npm/html/doc/cli/npm-outdated.html index d8418a45d58..10df0aacd3d 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 58cc89584d3..01b8380c9aa 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 e61d4330816..b3f70935a01 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 23f77c039c1..caef5516d64 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 579f0b31490..fbf0aaf84ca 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 6e48c16093e..3cd7406fc11 100644 --- a/deps/npm/html/doc/cli/npm-publish.html +++ b/deps/npm/html/doc/cli/npm-publish.html @@ -66,5 +66,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-rebuild.html b/deps/npm/html/doc/cli/npm-rebuild.html index 5d303f40f56..898d904a1cb 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 14affbe4d60..50840d500df 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 f94762e8d23..c09e1039ed2 100644 --- a/deps/npm/html/doc/cli/npm-restart.html +++ b/deps/npm/html/doc/cli/npm-restart.html @@ -53,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 ed20e046d4b..09ef1100ffc 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 327bc76d134..39b6e6ca88e 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 ae7cced851b..ca0f575cfc8 100644 --- a/deps/npm/html/doc/cli/npm-run-script.html +++ b/deps/npm/html/doc/cli/npm-run-script.html @@ -14,15 +14,11 @@

      SYNOPSIS

      npm run-script [command] [-- <args>]
       npm run [command] [-- <args>]
       

      DESCRIPTION

      -

      This runs an arbitrary command from a package's "scripts" object. -If no package name is provided, it will search for a package.json -in the current folder and use its "scripts" object. If no "command" -is provided, it will list the available top level scripts. The env command -can be used to list environment variables that will be available to the script -at runtime. If an "env" command is defined in your package it will have -precedence instead.

      -

      run[-script] is used by the test, start, restart, and stop commands, but can -be called directly, as well.

      +

      This runs an arbitrary command from a package's "scripts" object. If no +"command" is provided, it will list the available scripts. run[-script] is +used by the test, start, restart, and stop commands, but can be called +directly, as well. When the scripts in the package are printed out, they're +separated into lifecycle (test, start, restart) and directly-run scripts.

      As of npm@2.0.0, you can use custom arguments when executing scripts. The special option -- is used by getopt to delimit the end of the options. npm will pass @@ -30,6 +26,10 @@

      SYNOPSIS

      npm run test -- --grep="pattern"
       

      The arguments will only be passed to the script specified after npm run and not to any pre or post script.

      +

      The env script is a special built-in command that can be used to list +environment variables that will be available to the script at runtime. If an +"env" command is defined in your package it will take precedence over the +built-in.

      SEE ALSO

      • npm-scripts(7)
      • @@ -50,5 +50,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-search.html b/deps/npm/html/doc/cli/npm-search.html index d158f06b237..eb4c522e55d 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 6930d098caf..3676105b2c6 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 d56f711f1da..0a31eb69909 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 ce95dac976a..3d893db2658 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 f4b720077d3..5a163f6a070 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 8c41f7c18a0..8b401e7c58e 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-tag.html b/deps/npm/html/doc/cli/npm-tag.html index c26dacd4188..dae1ecc4df2 100644 --- a/deps/npm/html/doc/cli/npm-tag.html +++ b/deps/npm/html/doc/cli/npm-tag.html @@ -62,5 +62,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-test.html b/deps/npm/html/doc/cli/npm-test.html index 3e8f43ffced..8ae25dd8af5 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 29ba5fecc4a..9cd72c7055c 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 baf7c0562e0..e363c0a618d 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 9912bcacc66..2a132bbf8a1 100644 --- a/deps/npm/html/doc/cli/npm-update.html +++ b/deps/npm/html/doc/cli/npm-update.html @@ -14,7 +14,7 @@

        SYNOPSIS

        npm update [-g] [<name> [<name> ...]]
         

        DESCRIPTION

        This command will update all the packages listed to the latest version -(specified by the tag config).

        +(specified by the tag config), respecting semver.

        It will also install missing packages. As with all commands that install packages, the --dev flag will cause devDependencies to be processed as well.

        @@ -22,10 +22,87 @@

        SYNOPSIS

        packages.

        If no package name is specified, all packages in the specified location (global or local) will be updated.

        +

        As of npm@2.6.1, the npm update will only inspect top-level packages. +Prior versions of npm would also recursively inspect all dependencies. +To get the old behavior, use npm --depth 9999 update, but be warned that +simultaneous asynchronous update of all packages, including npm itself +and packages that npm depends on, often causes problems up to and including +the uninstallation of npm itself.

        +

        To restore a missing npm, use the command:

        +
        curl -L https://npmjs.com/install.sh | sh
        +

        EXAMPLES

        +

        IMPORTANT VERSION NOTE: these examples assume npm@2.6.1 or later. For +older versions of npm, you must specify --depth 0 to get the behavior +described below.

        +

        For the examples below, assume that the current package is app and it depends +on dependencies, dep1 (dep2, .. etc.). The published versions of dep1 are:

        +
        {
        +  dist-tags: { latest: "1.2.2" },
        +  versions: { "1.2.2",
        +              "1.2.1",
        +              "1.2.0",
        +              "1.1.2",
        +              "1.1.1",
        +              "1.0.0",
        +              "0.4.1",
        +              "0.4.0",
        +              "0.2.0"
        +  }
        +}
        +

        Caret Dependencies

        +

        If app's package.json contains:

        +
        dependencies: {
        +  dep1: "^1.1.1"
        +}
        +

        Then npm update will install dep1@1.2.2, because 1.2.2 is latest and +1.2.2 satisfies ^1.1.1.

        +

        Tilde Dependencies

        +

        However, if app's package.json contains:

        +
        dependencies: {
        +  dep1: "~1.1.1"
        +}
        +

        In this case, running npm update will install dep1@1.1.2. Even though the latest +tag points to 1.2.2, this version does not satisfy ~1.1.1, which is equivalent +to >=1.1.1 <1.2.0. So the highest-sorting version that satisfies ~1.1.1 is used, +which is 1.1.2.

        +

        Caret Dependencies below 1.0.0

        +

        Suppose app has a caret dependency on a version below 1.0.0, for example:

        +
        dependencies: {
        +  dep1: "^0.2.0"
        +}
        +

        npm update will install dep1@0.2.0, because there are no other +versions which satisfy ^0.2.0.

        +

        If the dependence were on ^0.4.0:

        +
        dependencies: {
        +  dep1: "^0.4.0"
        +}
        +

        Then npm update will install dep1@0.4.1, because that is the highest-sorting +version that satisfies ^0.4.0 (>= 0.4.0 <0.5.0)

        +

        Recording Updates with --save

        +

        When you want to update a package and save the new version as +the minimum required dependency in package.json, you can use +npm update --save. For example if package.json contains

        +
        dependencies: {
        +  dep1: "^1.1.1"
        +}
        +

        Then npm update --save will install dep1@1.2.2 (i.e., latest), +and package.json will be modified:

        +
        dependencies: {
        +  dep1: "^1.2.2"
        +}
        +

        Note that npm will only write an updated version to package.json +if it installs a new package.

        +

        Updating Globally-Installed Packages

        +

        npm update -g will apply the update action to each globally- installed +package that is outdated -- that is, has a version that is different from +latest.

        +

        NOTE: If a package has been upgraded to a version newer than latest, it will +be downgraded.

        SEE ALSO

        • npm-install(1)
        • npm-outdated(1)
        • +
        • npm-shrinkwrap(1)
        • npm-registry(7)
        • npm-folders(5)
        • npm-ls(1)
        • @@ -42,5 +119,5 @@

          SEE ALSO

                 - + diff --git a/deps/npm/html/doc/cli/npm-version.html b/deps/npm/html/doc/cli/npm-version.html index 9a512cab183..d167770d0c7 100644 --- a/deps/npm/html/doc/cli/npm-version.html +++ b/deps/npm/html/doc/cli/npm-version.html @@ -19,8 +19,10 @@

          SYNOPSIS

          valid second argument to semver.inc (one of "patch", "minor", "major", "prepatch", "preminor", "premajor", "prerelease"). In the second case, the existing version will be incremented by 1 in the specified field.

          -

          If run in a git repo, it will also create a version commit and tag, and -fail if the repo is not clean.

          +

          If run in a git repo, it will also create a version commit and tag, and fail if +the repo is not clean. This behavior is controlled by git-tag-version (see +below), and can be disabled on the command line by running npm +--no-git-tag-version version

          If supplied with --message (shorthand: -m) config option, npm will use it as a commit message when creating a version commit. If the message config contains %s then that will be replaced with the @@ -37,11 +39,19 @@

          SYNOPSIS

          2048-bit RSA key, ID 6C481CF6, created 2010-08-31 Enter passphrase: -

    SEE ALSO

    +

    CONFIGURATION

    +

    git-tag-version

    +
      +
    • Default: true
    • +
    • Type: Boolean
    • +
    +

    Commit and tag the version change.

    +

    SEE ALSO

    @@ -55,5 +65,5 @@

    SYNOPSIS

           - + diff --git a/deps/npm/html/doc/cli/npm-view.html b/deps/npm/html/doc/cli/npm-view.html index e7c5d8bf1c2..99ffc892e60 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 fd484f142f7..d284a41aa19 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 c3408419b2b..8b67cacba66 100644 --- a/deps/npm/html/doc/cli/npm.html +++ b/deps/npm/html/doc/cli/npm.html @@ -13,7 +13,7 @@

    npm

    javascript package manager

    SYNOPSIS

    npm <command> [args]
     

    VERSION

    -

    2.6.1

    +

    2.7.0

    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

    -

    The depth to go when recursing directories for npm ls, +

    The depth to go when recursing directories for npm ls, npm cache ls, and npm outdated.

    For npm outdated, a setting of Infinity will be treated as 0 since that gives more useful information. To show the outdated status @@ -336,6 +336,16 @@

    https-proxy

    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.

    +

    if-present

    +
      +
    • Default: false
    • +
    • Type: Boolean
    • +
    +

    If true, npm will not exit with an error code when run-script is invoked for +a script that isn't defined in the scripts section of package.json. This +option can be used when it's desirable to optionally run a script when it's +present and fail if the script fails. This is useful, for example, when running +scripts that may only apply for some builds in an otherwise generic CI setup.

    ignore-scripts

    • Default: false
    • @@ -778,5 +788,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/misc/npm-developers.html b/deps/npm/html/doc/misc/npm-developers.html index 33810525f21..e91f9f38902 100644 --- a/deps/npm/html/doc/misc/npm-developers.html +++ b/deps/npm/html/doc/misc/npm-developers.html @@ -189,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 c707bbc0750..b4efe49d8f2 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

      1. Get the author email with npm owner ls <pkgname>
      2. -
      3. Email the author, CC support@npmjs.com
      4. +
      5. Email the author, CC support@npmjs.com
      6. 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 bc6af670450..cfc8ef69e8c 100644 --- a/deps/npm/html/doc/misc/npm-faq.html +++ b/deps/npm/html/doc/misc/npm-faq.html @@ -236,7 +236,7 @@

      I get ECONNREFUSED a lot. What'

      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.

      @@ -307,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 bfda7debb00..dd0540ec586 100644 --- a/deps/npm/html/doc/misc/npm-index.html +++ b/deps/npm/html/doc/misc/npm-index.html @@ -236,5 +236,5 @@

      s        - + diff --git a/deps/npm/html/doc/misc/npm-registry.html b/deps/npm/html/doc/misc/npm-registry.html index 52a2d9e9c05..f1751c889fc 100644 --- a/deps/npm/html/doc/misc/npm-registry.html +++ b/deps/npm/html/doc/misc/npm-registry.html @@ -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 21a2ea6c3ba..f1aef4a8e3c 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 12ed3f2b49c..e2b675beb86 100644 --- a/deps/npm/html/doc/misc/npm-scripts.html +++ b/deps/npm/html/doc/misc/npm-scripts.html @@ -41,41 +41,23 @@

      DESCRIPTION

      run-script <pkg> <stage>. Pre and post commands with matching names will be run for those as well (e.g. premyscript, myscript, postmyscript).

      -

      NOTE: INSTALL SCRIPTS ARE AN ANTIPATTERN

      -

      tl;dr Don't use install. Use a .gyp file for compilation, and -prepublish for anything else.

      -

      You should almost never have to explicitly set a preinstall or -install script. If you are doing this, please consider if there is -another option.

      -

      The only valid use of install or preinstall scripts is for -compilation which must be done on the target architecture. In early -versions of node, this was often done using the node-waf scripts, or -a standalone Makefile, and early versions of npm required that it be -explicitly set in package.json. This was not portable, and harder to -do properly.

      -

      In the current version of node, the standard way to do this is using a -.gyp file. If you have a file with a .gyp extension in the root -of your package, then npm will run the appropriate node-gyp commands -automatically at install time. This is the only officially supported -method for compiling binary addons, and does not require that you add -anything to your package.json file.

      -

      If you have to do other things before your package is used, in a way +

      COMMON USES

      +

      If you need to perform operations on your package before it is used, in a way that is not dependent on the operating system or architecture of the -target system, then use a prepublish script instead. This includes +target system, use a prepublish script. This includes tasks such as:

        -
      • Compile CoffeeScript source code into JavaScript.
      • -
      • Create minified versions of JavaScript source code.
      • +
      • Compiling CoffeeScript source code into JavaScript.
      • +
      • Creating minified versions of JavaScript source code.
      • Fetching remote resources that your package will use.
      -

      The advantage of doing these things at prepublish time instead of -preinstall or install time is that they can be done once, in a -single place, and thus greatly reduce complexity and variability. +

      The advantage of doing these things at prepublish time is that they can be done once, in a +single place, thus reducing complexity and variability. Additionally, this means that:

      • You can depend on coffee-script as a devDependency, and thus your users don't need to have it installed.
      • -
      • You don't need to include the minifiers in your package, reducing +
      • You don't need to include minifiers in your package, reducing the size for your users.
      • You don't need to rely on your users having curl or wget or other system tools on the target machines.
      • @@ -196,6 +178,11 @@

        BEST PRACTICES

      • Don't prefix your script commands with "sudo". If root permissions are required for some reason, then it'll fail with that error, and the user will sudo the npm command in question.
      • +
      • Don't use install. Use a .gyp file for compilation, and prepublish +for anything else. You should almost never have to explicitly set a +preinstall or install script. If you are doing this, please consider if +there is another option. The only valid use of install or preinstall +scripts is for compilation which must be done on the target architecture.

      SEE ALSO

      Max display depth of the dependency tree.

      +

      prod / production

      +
        +
      • Type: Boolean
      • +
      • Default: false
      • +
      +

      Display only the dependency tree for packages in dependencies.

      +

      dev

      +
        +
      • Type: Boolean
      • +
      • Default: false
      • +
      +

      Display only the dependency tree for packages in devDependencies.

      SEE ALSO

      • npm-config(1)
      • diff --git a/deps/npm/html/partial/doc/cli/npm-run-script.html b/deps/npm/html/partial/doc/cli/npm-run-script.html index 13ff259638e..5ee76440784 100644 --- a/deps/npm/html/partial/doc/cli/npm-run-script.html +++ b/deps/npm/html/partial/doc/cli/npm-run-script.html @@ -3,15 +3,11 @@

        SYNOPSIS

        npm run-script [command] [-- <args>]
         npm run [command] [-- <args>]
         

        DESCRIPTION

        -

        This runs an arbitrary command from a package's "scripts" object. -If no package name is provided, it will search for a package.json -in the current folder and use its "scripts" object. If no "command" -is provided, it will list the available top level scripts. The env command -can be used to list environment variables that will be available to the script -at runtime. If an "env" command is defined in your package it will have -precedence instead.

        -

        run[-script] is used by the test, start, restart, and stop commands, but can -be called directly, as well.

        +

        This runs an arbitrary command from a package's "scripts" object. If no +"command" is provided, it will list the available scripts. run[-script] is +used by the test, start, restart, and stop commands, but can be called +directly, as well. When the scripts in the package are printed out, they're +separated into lifecycle (test, start, restart) and directly-run scripts.

        As of npm@2.0.0, you can use custom arguments when executing scripts. The special option -- is used by getopt to delimit the end of the options. npm will pass @@ -19,6 +15,10 @@

        SYNOPSIS

        npm run test -- --grep="pattern"
         

        The arguments will only be passed to the script specified after npm run and not to any pre or post script.

        +

        The env script is a special built-in command that can be used to list +environment variables that will be available to the script at runtime. If an +"env" command is defined in your package it will take precedence over the +built-in.

        SEE ALSO

        • npm-scripts(7)
        • diff --git a/deps/npm/html/partial/doc/cli/npm-update.html b/deps/npm/html/partial/doc/cli/npm-update.html index 6e35abd4517..ecc6640f21d 100644 --- a/deps/npm/html/partial/doc/cli/npm-update.html +++ b/deps/npm/html/partial/doc/cli/npm-update.html @@ -3,7 +3,7 @@

          SYNOPSIS

          npm update [-g] [<name> [<name> ...]]
           

          DESCRIPTION

          This command will update all the packages listed to the latest version -(specified by the tag config).

          +(specified by the tag config), respecting semver.

          It will also install missing packages. As with all commands that install packages, the --dev flag will cause devDependencies to be processed as well.

          @@ -11,10 +11,87 @@

          SYNOPSIS

          packages.

          If no package name is specified, all packages in the specified location (global or local) will be updated.

          +

          As of npm@2.6.1, the npm update will only inspect top-level packages. +Prior versions of npm would also recursively inspect all dependencies. +To get the old behavior, use npm --depth 9999 update, but be warned that +simultaneous asynchronous update of all packages, including npm itself +and packages that npm depends on, often causes problems up to and including +the uninstallation of npm itself.

          +

          To restore a missing npm, use the command:

          +
          curl -L https://npmjs.com/install.sh | sh
          +

          EXAMPLES

          +

          IMPORTANT VERSION NOTE: these examples assume npm@2.6.1 or later. For +older versions of npm, you must specify --depth 0 to get the behavior +described below.

          +

          For the examples below, assume that the current package is app and it depends +on dependencies, dep1 (dep2, .. etc.). The published versions of dep1 are:

          +
          {
          +  dist-tags: { latest: "1.2.2" },
          +  versions: { "1.2.2",
          +              "1.2.1",
          +              "1.2.0",
          +              "1.1.2",
          +              "1.1.1",
          +              "1.0.0",
          +              "0.4.1",
          +              "0.4.0",
          +              "0.2.0"
          +  }
          +}
          +

          Caret Dependencies

          +

          If app's package.json contains:

          +
          dependencies: {
          +  dep1: "^1.1.1"
          +}
          +

          Then npm update will install dep1@1.2.2, because 1.2.2 is latest and +1.2.2 satisfies ^1.1.1.

          +

          Tilde Dependencies

          +

          However, if app's package.json contains:

          +
          dependencies: {
          +  dep1: "~1.1.1"
          +}
          +

          In this case, running npm update will install dep1@1.1.2. Even though the latest +tag points to 1.2.2, this version does not satisfy ~1.1.1, which is equivalent +to >=1.1.1 <1.2.0. So the highest-sorting version that satisfies ~1.1.1 is used, +which is 1.1.2.

          +

          Caret Dependencies below 1.0.0

          +

          Suppose app has a caret dependency on a version below 1.0.0, for example:

          +
          dependencies: {
          +  dep1: "^0.2.0"
          +}
          +

          npm update will install dep1@0.2.0, because there are no other +versions which satisfy ^0.2.0.

          +

          If the dependence were on ^0.4.0:

          +
          dependencies: {
          +  dep1: "^0.4.0"
          +}
          +

          Then npm update will install dep1@0.4.1, because that is the highest-sorting +version that satisfies ^0.4.0 (>= 0.4.0 <0.5.0)

          +

          Recording Updates with --save

          +

          When you want to update a package and save the new version as +the minimum required dependency in package.json, you can use +npm update --save. For example if package.json contains

          +
          dependencies: {
          +  dep1: "^1.1.1"
          +}
          +

          Then npm update --save will install dep1@1.2.2 (i.e., latest), +and package.json will be modified:

          +
          dependencies: {
          +  dep1: "^1.2.2"
          +}
          +

          Note that npm will only write an updated version to package.json +if it installs a new package.

          +

          Updating Globally-Installed Packages

          +

          npm update -g will apply the update action to each globally- installed +package that is outdated -- that is, has a version that is different from +latest.

          +

          NOTE: If a package has been upgraded to a version newer than latest, it will +be downgraded.

          SEE ALSO

          • npm-install(1)
          • npm-outdated(1)
          • +
          • npm-shrinkwrap(1)
          • npm-registry(7)
          • npm-folders(5)
          • npm-ls(1)
          • diff --git a/deps/npm/html/partial/doc/cli/npm-version.html b/deps/npm/html/partial/doc/cli/npm-version.html index 0cc3a21ad42..e446006b056 100644 --- a/deps/npm/html/partial/doc/cli/npm-version.html +++ b/deps/npm/html/partial/doc/cli/npm-version.html @@ -8,8 +8,10 @@

            SYNOPSIS

            valid second argument to semver.inc (one of "patch", "minor", "major", "prepatch", "preminor", "premajor", "prerelease"). In the second case, the existing version will be incremented by 1 in the specified field.

            -

            If run in a git repo, it will also create a version commit and tag, and -fail if the repo is not clean.

            +

            If run in a git repo, it will also create a version commit and tag, and fail if +the repo is not clean. This behavior is controlled by git-tag-version (see +below), and can be disabled on the command line by running npm +--no-git-tag-version version

            If supplied with --message (shorthand: -m) config option, npm will use it as a commit message when creating a version commit. If the message config contains %s then that will be replaced with the @@ -26,10 +28,18 @@

            SYNOPSIS

            2048-bit RSA key, ID 6C481CF6, created 2010-08-31 Enter passphrase: -

            SEE ALSO

            +

            CONFIGURATION

            +

            git-tag-version

            +
              +
            • Default: true
            • +
            • Type: Boolean
            • +
            +

            Commit and tag the version change.

            +

            SEE ALSO

            diff --git a/deps/npm/html/partial/doc/cli/npm.html b/deps/npm/html/partial/doc/cli/npm.html index 224c7e0ab54..a290535ece8 100644 --- a/deps/npm/html/partial/doc/cli/npm.html +++ b/deps/npm/html/partial/doc/cli/npm.html @@ -2,7 +2,7 @@

            npm

            javascript package manager

            SYNOPSIS

            npm <command> [args]
             

            VERSION

            -

            2.6.1

            +

            2.7.0

            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/misc/npm-config.html b/deps/npm/html/partial/doc/misc/npm-config.html index bd2299cf57a..0c334591db8 100644 --- a/deps/npm/html/partial/doc/misc/npm-config.html +++ b/deps/npm/html/partial/doc/misc/npm-config.html @@ -195,7 +195,7 @@

            depth

          • Default: Infinity
          • Type: Number
          -

          The depth to go when recursing directories for npm ls, +

          The depth to go when recursing directories for npm ls, npm cache ls, and npm outdated.

          For npm outdated, a setting of Infinity will be treated as 0 since that gives more useful information. To show the outdated status @@ -325,6 +325,16 @@

          https-proxy

          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.

          +

          if-present

          +
            +
          • Default: false
          • +
          • Type: Boolean
          • +
          +

          If true, npm will not exit with an error code when run-script is invoked for +a script that isn't defined in the scripts section of package.json. This +option can be used when it's desirable to optionally run a script when it's +present and fail if the script fails. This is useful, for example, when running +scripts that may only apply for some builds in an otherwise generic CI setup.

          ignore-scripts

          • Default: false
          • diff --git a/deps/npm/html/partial/doc/misc/npm-disputes.html b/deps/npm/html/partial/doc/misc/npm-disputes.html index 5cd1848d30b..2a9cb8246fc 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

            1. Get the author email with npm owner ls <pkgname>
            2. -
            3. Email the author, CC support@npmjs.com
            4. +
            5. Email the author, CC support@npmjs.com
            6. 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 e4976465c49..60db91f90b2 100644 --- a/deps/npm/html/partial/doc/misc/npm-faq.html +++ b/deps/npm/html/partial/doc/misc/npm-faq.html @@ -225,7 +225,7 @@

            I get ECONNREFUSED a lot. What'

            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.

            diff --git a/deps/npm/html/partial/doc/misc/npm-scripts.html b/deps/npm/html/partial/doc/misc/npm-scripts.html index 1e68be479be..8a152f3ef18 100644 --- a/deps/npm/html/partial/doc/misc/npm-scripts.html +++ b/deps/npm/html/partial/doc/misc/npm-scripts.html @@ -30,41 +30,23 @@

            DESCRIPTION

            run-script <pkg> <stage>. Pre and post commands with matching names will be run for those as well (e.g. premyscript, myscript, postmyscript).

            -

            NOTE: INSTALL SCRIPTS ARE AN ANTIPATTERN

            -

            tl;dr Don't use install. Use a .gyp file for compilation, and -prepublish for anything else.

            -

            You should almost never have to explicitly set a preinstall or -install script. If you are doing this, please consider if there is -another option.

            -

            The only valid use of install or preinstall scripts is for -compilation which must be done on the target architecture. In early -versions of node, this was often done using the node-waf scripts, or -a standalone Makefile, and early versions of npm required that it be -explicitly set in package.json. This was not portable, and harder to -do properly.

            -

            In the current version of node, the standard way to do this is using a -.gyp file. If you have a file with a .gyp extension in the root -of your package, then npm will run the appropriate node-gyp commands -automatically at install time. This is the only officially supported -method for compiling binary addons, and does not require that you add -anything to your package.json file.

            -

            If you have to do other things before your package is used, in a way +

            COMMON USES

            +

            If you need to perform operations on your package before it is used, in a way that is not dependent on the operating system or architecture of the -target system, then use a prepublish script instead. This includes +target system, use a prepublish script. This includes tasks such as:

              -
            • Compile CoffeeScript source code into JavaScript.
            • -
            • Create minified versions of JavaScript source code.
            • +
            • Compiling CoffeeScript source code into JavaScript.
            • +
            • Creating minified versions of JavaScript source code.
            • Fetching remote resources that your package will use.
            -

            The advantage of doing these things at prepublish time instead of -preinstall or install time is that they can be done once, in a -single place, and thus greatly reduce complexity and variability. +

            The advantage of doing these things at prepublish time is that they can be done once, in a +single place, thus reducing complexity and variability. Additionally, this means that:

            • You can depend on coffee-script as a devDependency, and thus your users don't need to have it installed.
            • -
            • You don't need to include the minifiers in your package, reducing +
            • You don't need to include minifiers in your package, reducing the size for your users.
            • You don't need to rely on your users having curl or wget or other system tools on the target machines.
            • @@ -185,6 +167,11 @@

              BEST PRACTICES

            • Don't prefix your script commands with "sudo". If root permissions are required for some reason, then it'll fail with that error, and the user will sudo the npm command in question.
            • +
            • Don't use install. Use a .gyp file for compilation, and prepublish +for anything else. You should almost never have to explicitly set a +preinstall or install script. If you are doing this, please consider if +there is another option. The only valid use of install or preinstall +scripts is for compilation which must be done on the target architecture.

            SEE ALSO

              diff --git a/deps/npm/lib/bugs.js b/deps/npm/lib/bugs.js index fabbbaf10e5..306d9bb4bfc 100644 --- a/deps/npm/lib/bugs.js +++ b/deps/npm/lib/bugs.js @@ -13,14 +13,9 @@ var npm = require("./npm.js") , mapToRegistry = require("./utils/map-to-registry.js") bugs.completion = function (opts, cb) { - if (opts.conf.argv.remain.length > 2) return cb() - mapToRegistry("-/short", npm.config, function (er, uri, auth) { - if (er) return cb(er) - - npm.registry.get(uri, { timeout : 60000, auth : auth }, function (er, list) { - return cb(null, list || []) - }) - }) + // FIXME: there used to be registry completion here, but it stopped making + // sense somewhere around 50,000 packages on the registry + cb() } function bugs (args, cb) { diff --git a/deps/npm/lib/cache/add-remote-git.js b/deps/npm/lib/cache/add-remote-git.js index c829a4fe6d5..974c158f9c3 100644 --- a/deps/npm/lib/cache/add-remote-git.js +++ b/deps/npm/lib/cache/add-remote-git.js @@ -188,7 +188,9 @@ function resolveHead (p, u, co, origUrl, cb) { parsed.hash = stdout var resolved = url.format(parsed) - if (parsed.protocol !== "git:") resolved = "git+" + resolved + if (!/^git[+:]/.test(parsed.protocol)) { + resolved = "git+" + resolved + } // https://github.com/npm/npm/issues/3224 // node incorrectly sticks a / at the start of the path We know that the diff --git a/deps/npm/lib/cache/maybe-github.js b/deps/npm/lib/cache/maybe-github.js index 5ecdb691552..e24099115da 100644 --- a/deps/npm/lib/cache/maybe-github.js +++ b/deps/npm/lib/cache/maybe-github.js @@ -11,7 +11,7 @@ module.exports = function maybeGithub (p, cb) { return addRemoteGit(u, true, function (er, data) { if (er) { - var upriv = "git+ssh://git@github.com:" + p + var upriv = "ssh://git@github.com:" + p log.info("maybeGithub", "Attempting %s from %s", p, upriv) return addRemoteGit(upriv, false, function (er, data) { diff --git a/deps/npm/lib/config/defaults.js b/deps/npm/lib/config/defaults.js index a46e74b5ba3..e49ce210b33 100644 --- a/deps/npm/lib/config/defaults.js +++ b/deps/npm/lib/config/defaults.js @@ -160,6 +160,7 @@ Object.defineProperty(exports, "defaults", {get: function () { , group : process.platform === "win32" ? 0 : process.env.SUDO_GID || (process.getgid && process.getgid()) , heading: "npm" + , "if-present": false , "ignore-scripts": false , "init-module": path.resolve(home, ".npm-init.js") , "init-author-name" : "" @@ -262,6 +263,7 @@ exports.types = , "https-proxy" : [null, url] , "user-agent" : String , "heading": String + , "if-present": Boolean , "ignore-scripts": Boolean , "init-module": path , "init-author-name" : String diff --git a/deps/npm/lib/docs.js b/deps/npm/lib/docs.js index 9abe740a3c7..0de2349ddc9 100644 --- a/deps/npm/lib/docs.js +++ b/deps/npm/lib/docs.js @@ -11,13 +11,9 @@ var npm = require("./npm.js") , mapToRegistry = require("./utils/map-to-registry.js") docs.completion = function (opts, cb) { - mapToRegistry("/-/short", npm.config, function (er, uri, auth) { - if (er) return cb(er) - - npm.registry.get(uri, { timeout : 60000, auth : auth }, function (er, list) { - return cb(null, list || []) - }) - }) + // FIXME: there used to be registry completion here, but it stopped making + // sense somewhere around 50,000 packages on the registry + cb() } function url (json) { diff --git a/deps/npm/lib/help.js b/deps/npm/lib/help.js index 07d92194969..cb1d5715f9d 100644 --- a/deps/npm/lib/help.js +++ b/deps/npm/lib/help.js @@ -59,19 +59,23 @@ function help (args, cb) { var manroot = path.resolve(__dirname, "..", "man") // legacy - if (section === "global") - section = "folders" - else if (section === "json") - section = "package.json" + if (section === "global") section = "folders" + else if (section === "json") section = "package.json" // find either /section.n or /npm-section.n - var f = "+(npm-" + section + "|" + section + ").[0-9]" + var compext = "\\.+(gz|bz2|lzma|[FYzZ]|xz)$" + var f = "+(npm-" + section + "|" + section + ").[0-9]?(" + compext + ")" return glob(manroot + "/*/" + f, function (er, mans) { - if (er) - return cb(er) + if (er) return cb(er) + + if (!mans.length) return npm.commands["help-search"](args, cb) - if (!mans.length) - return npm.commands["help-search"](args, cb) + mans = mans.map(function (man) { + var ext = path.extname(man) + if (man.match(new RegExp(compext))) man = path.basename(man, ext) + + return man + }) viewMan(pickMan(mans, pref), cb) }) diff --git a/deps/npm/lib/install.js b/deps/npm/lib/install.js index 7fa9058f3e2..73580e5afa8 100644 --- a/deps/npm/lib/install.js +++ b/deps/npm/lib/install.js @@ -32,38 +32,58 @@ install.completion = function (opts, cb) { // install can complete to a folder with a package.json, or any package. // 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. - mapToRegistry("-/short", npm.config, function (er, uri, auth) { - if (er) return cb(er) - - var options = { auth : auth } - npm.registry.get(uri, options, function (er, pkgs) { - if (er) return cb() - if (!opts.partialWord) return cb(null, pkgs) + if (/^https?:\/\//.test(opts.partialWord)) { + // do not complete to URLs + return cb(null, []) + } - var name = npa(opts.partialWord).name - pkgs = pkgs.filter(function (p) { - return p.indexOf(name) === 0 + if (/\//.test(opts.partialWord)) { + // Complete fully to folder if there is exactly one match and it + // is a folder containing a package.json file. If that is not the + // case we return 0 matches, which will trigger the default bash + // complete. + var lastSlashIdx = opts.partialWord.lastIndexOf("/") + var partialName = opts.partialWord.slice(lastSlashIdx + 1) + var partialPath = opts.partialWord.slice(0, lastSlashIdx) + if (partialPath === "") partialPath = "/" + + function annotatePackageDirMatch (sibling, cb) { + var fullPath = path.join(partialPath, sibling) + if (sibling.slice(0, partialName.length) !== partialName) { + return cb(null, null) // not name match + } + fs.readdir(fullPath, function (err, contents) { + if (err) return cb(null, { isPackage: false }) + + cb( + null, + { + fullPath: fullPath, + isPackage: contents.indexOf("package.json") !== -1 + } + ) }) + } - if (pkgs.length !== 1 && opts.partialWord === name) { - return cb(null, pkgs) - } + return fs.readdir(partialPath, function (err, siblings) { + if (err) return cb(null, []) // invalid dir: no matching - mapToRegistry(pkgs[0], npm.config, function (er, uri) { - if (er) return cb(er) + asyncMap(siblings, annotatePackageDirMatch, function (err, matches) { + if (err) return cb(err) - 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 || {})) - .map(function (t) { - return pkgs[0] + "@" + t - })) - }) + var cleaned = matches.filter(function (x) { return x !== null }) + if (cleaned.length !== 1) return cb(null, []) + if (!cleaned[0].isPackage) return cb(null, []) + + // Success - only one match and it is a package dir + return cb(null, [cleaned[0].fullPath]) }) }) - }) + } + + // FIXME: there used to be registry completion here, but it stopped making + // sense somewhere around 50,000 packages on the registry + cb() } var npm = require("./npm.js") diff --git a/deps/npm/lib/ls.js b/deps/npm/lib/ls.js index eee4f2772e0..05166ee6ab0 100644 --- a/deps/npm/lib/ls.js +++ b/deps/npm/lib/ls.js @@ -40,6 +40,7 @@ function ls (args, silent, cb) { var opt = { depth: depth, log: log.warn, dev: true } readInstalled(dir, opt, function (er, data) { pruneNestedExtraneous(data) + filterByEnv(data) var bfs = bfsify(data, args) , lite = getLite(bfs) @@ -88,6 +89,21 @@ function pruneNestedExtraneous (data, visited) { } } +function filterByEnv (data) { + var dev = npm.config.get("dev") + var production = npm.config.get("production") + if (dev === production) return + var dependencies = {} + var devDependencies = data.devDependencies || [] + Object.keys(data.dependencies).forEach(function (name) { + var keys = Object.keys(devDependencies) + if (production && keys.indexOf(name) !== -1) return + if (dev && keys.indexOf(name) === -1) return + dependencies[name] = data.dependencies[name] + }) + data.dependencies = dependencies +} + function alphasort (a, b) { a = a.toLowerCase() b = b.toLowerCase() diff --git a/deps/npm/lib/npm.js b/deps/npm/lib/npm.js index 25b7feab6a7..3cd21cac1d9 100644 --- a/deps/npm/lib/npm.js +++ b/deps/npm/lib/npm.js @@ -224,7 +224,7 @@ Object.keys(abbrevs).concat(plumbing).forEach(function addCommand (c) { }) return commandCache[a] - }, enumerable: fullList.indexOf(c) !== -1 }) + }, enumerable: fullList.indexOf(c) !== -1, configurable: true }) // make css-case commands callable via camelCase as well if (c.match(/\-([a-z])/)) { diff --git a/deps/npm/lib/owner.js b/deps/npm/lib/owner.js index 3d33a932a3b..c9adb792249 100644 --- a/deps/npm/lib/owner.js +++ b/deps/npm/lib/owner.js @@ -26,12 +26,9 @@ owner.completion = function (opts, cb) { var byUser, theUser switch (argv[2]) { case "ls": - if (argv.length > 3) return cb() - return mapToRegistry("-/short", npm.config, function (er, uri, auth) { - if (er) return cb(er) - - npm.registry.get(uri, { auth : auth }, cb) - }) + // FIXME: there used to be registry completion here, but it stopped + // making sense somewhere around 50,000 packages on the registry + return cb() case "rm": if (argv.length > 3) { diff --git a/deps/npm/lib/repo.js b/deps/npm/lib/repo.js index 3db4a16bc9d..1b0454773d7 100644 --- a/deps/npm/lib/repo.js +++ b/deps/npm/lib/repo.js @@ -15,14 +15,9 @@ var npm = require("./npm.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 || []) - }) - }) + // FIXME: there used to be registry completion here, but it stopped making + // sense somewhere around 50,000 packages on the registry + cb() } function repo (args, cb) { diff --git a/deps/npm/lib/run-script.js b/deps/npm/lib/run-script.js index ce8ea0f13a7..b6aa5fe7e84 100644 --- a/deps/npm/lib/run-script.js +++ b/deps/npm/lib/run-script.js @@ -84,31 +84,56 @@ function runScript (args, cb) { function list(cb) { var json = path.join(npm.localPrefix, "package.json") + var cmdList = [ "publish", "install", "uninstall" + , "test", "stop", "start", "restart" + ].reduce(function (l, p) { + return l.concat(["pre" + p, p, "post" + p]) + }, []) return readJson(json, function(er, d) { if (er && er.code !== "ENOENT" && er.code !== "ENOTDIR") return cb(er) if (er) d = {} - var scripts = Object.keys(d.scripts || {}) + var allScripts = Object.keys(d.scripts || {}) + var scripts = [] + var runScripts = [] + allScripts.forEach(function (script) { + if (cmdList.indexOf(script) !== -1) scripts.push(script) + else runScripts.push(script) + }) if (log.level === "silent") { - return cb(null, scripts) + return cb(null, allScripts) } if (npm.config.get("json")) { console.log(JSON.stringify(d.scripts || {}, null, 2)) - return cb(null, scripts) + return cb(null, allScripts) + } + + if (npm.config.get("parseable")) { + allScripts.forEach(function(script) { + console.log(script + ":" + d.scripts[script]) + }) + return cb(null, allScripts) } - var s = ":" - var prefix = "" - if (!npm.config.get("parseable")) { - s = "\n " - prefix = " " - console.log("Available scripts in the %s package:", d.name) + var s = "\n " + var prefix = " " + if (scripts.length) { + console.log("Lifecycle scripts included in %s:", d.name) } scripts.forEach(function(script) { console.log(prefix + script + s + d.scripts[script]) }) - return cb(null, scripts) + if (!scripts.length && runScripts.length) { + console.log("Scripts available in %s via `npm run-script`:", d.name) + } + else if (runScripts.length) { + console.log("\navailable via `npm run-script`:") + } + runScripts.forEach(function(script) { + console.log(prefix + script + s + d.scripts[script]) + }) + return cb(null, allScripts) }) } @@ -116,7 +141,7 @@ function run (pkg, wd, cmd, args, cb) { if (!pkg.scripts) pkg.scripts = {} var cmds - if (cmd === "restart") { + if (cmd === "restart" && !pkg.scripts.restart) { cmds = [ "prestop", "stop", "poststop", "restart", @@ -134,6 +159,8 @@ function run (pkg, wd, cmd, args, cb) { log.verbose("run-script using default platform env: env (Unix)") pkg.scripts[cmd] = "env" } + } else if (npm.config.get("if-present")) { + return cb(null); } else { return cb(new Error("missing script: " + cmd)) } diff --git a/deps/npm/lib/star.js b/deps/npm/lib/star.js index d2e69deb94f..1f324336c0c 100644 --- a/deps/npm/lib/star.js +++ b/deps/npm/lib/star.js @@ -10,17 +10,9 @@ star.usage = "npm star [pkg, pkg, ...]\n" + "npm unstar [pkg, pkg, ...]" star.completion = function (opts, cb) { - mapToRegistry("-/short", npm.config, function (er, uri, auth) { - if (er) return cb(er) - - var params = { - timeout : 60000, - auth : auth - } - npm.registry.get(uri, params, function (er, list) { - return cb(null, list || []) - }) - }) + // FIXME: there used to be registry completion here, but it stopped making + // sense somewhere around 50,000 packages on the registry + cb() } function star (args, cb) { diff --git a/deps/npm/lib/uninstall.js b/deps/npm/lib/uninstall.js index 68869f57902..600c6819740 100644 --- a/deps/npm/lib/uninstall.js +++ b/deps/npm/lib/uninstall.js @@ -28,12 +28,11 @@ function uninstall (args, cb) { if (args.length) return uninstall_(args, nm, cb) // remove this package from the global space, if it's installed there - if (npm.config.get("global")) return cb(uninstall.usage) - readJson(path.resolve(npm.prefix, "package.json"), function (er, pkg) { + readJson(path.resolve(npm.localPrefix, "package.json"), function (er, pkg) { if (er && er.code !== "ENOENT" && er.code !== "ENOTDIR") return cb(er) if (er) return cb(uninstall.usage) uninstall_( [pkg.name] - , npm.dir + , npm.globalDir , cb ) }) diff --git a/deps/npm/lib/utils/completion.sh b/deps/npm/lib/utils/completion.sh index d0275905978..3c7a3590d80 100755 --- a/deps/npm/lib/utils/completion.sh +++ b/deps/npm/lib/utils/completion.sh @@ -21,10 +21,10 @@ if type complete &>/dev/null; then 2>/dev/null)) || return $? IFS="$si" } - complete -F _npm_completion npm + complete -o default -F _npm_completion npm elif type compdef &>/dev/null; then _npm_completion() { - si=$IFS + local si=$IFS compadd -- $(COMP_CWORD=$((CURRENT-1)) \ COMP_LINE=$BUFFER \ COMP_POINT=0 \ diff --git a/deps/npm/lib/utils/error-handler.js b/deps/npm/lib/utils/error-handler.js index 12c6dd407b9..de12c63632e 100644 --- a/deps/npm/lib/utils/error-handler.js +++ b/deps/npm/lib/utils/error-handler.js @@ -304,11 +304,15 @@ function errorHandler (er) { break case "ETARGET": - log.error("notarget", [er.message + var msg = [er.message ,"This is most likely not a problem with npm itself." ,"In most cases you or one of your dependencies are requesting" ,"a package version that doesn't exist." - ].join("\n")) + ] + if (er.parent) { + msg.push("\nIt was specified as a dependency of '"+er.parent+"'\n") + } + log.error("notarget", msg.join("\n")) break case "ENOTSUP": diff --git a/deps/npm/lib/utils/git.js b/deps/npm/lib/utils/git.js index 78cb083eefa..a312770a882 100644 --- a/deps/npm/lib/utils/git.js +++ b/deps/npm/lib/utils/git.js @@ -18,8 +18,13 @@ function prefixGitArgs () { } function execGit (args, options, cb) { - log.info("git", args) - return exec(git, prefixGitArgs().concat(args || []), options, cb) + log.info('git', args) + var fullArgs = prefixGitArgs().concat(args || []) + return exec(git, fullArgs, options, function (err) { + if (err) log.error('git', fullArgs.join(' ')) + + cb.apply(null, arguments) + }) } function spawnGit (args, options) { diff --git a/deps/npm/lib/view.js b/deps/npm/lib/view.js index bd20ab5a3f0..47da39b642c 100644 --- a/deps/npm/lib/view.js +++ b/deps/npm/lib/view.js @@ -14,11 +14,9 @@ var npm = require("./npm.js") view.completion = function (opts, cb) { if (opts.conf.argv.remain.length <= 2) { - return mapToRegistry("-/short", npm.config, function (er, uri, auth) { - if (er) return cb(er) - - npm.registry.get(uri, { auth : auth }, cb) - }) + // FIXME: there used to be registry completion here, but it stopped making + // sense somewhere around 50,000 packages on the registry + return cb() } // have the package, get the fields. var tag = npm.config.get("tag") diff --git a/deps/npm/man/man1/npm-README.1 b/deps/npm/man/man1/npm-README.1 index aa6c29787a5..6f1d12f777c 100644 --- a/deps/npm/man/man1/npm-README.1 +++ b/deps/npm/man/man1/npm-README.1 @@ -1,4 +1,4 @@ -.TH "NPM" "1" "February 2015" "" "" +.TH "NPM" "1" "March 2015" "" "" .SH "NAME" \fBnpm\fR \- a JavaScript package manager .P diff --git a/deps/npm/man/man1/npm-access.1 b/deps/npm/man/man1/npm-access.1 index 2ea011be609..a8ac57e3d50 100644 --- a/deps/npm/man/man1/npm-access.1 +++ b/deps/npm/man/man1/npm-access.1 @@ -1,4 +1,4 @@ -.TH "NPM\-ACCESS" "1" "February 2015" "" "" +.TH "NPM\-ACCESS" "1" "March 2015" "" "" .SH "NAME" \fBnpm-access\fR \- Set access level on published packages .SH SYNOPSIS diff --git a/deps/npm/man/man1/npm-adduser.1 b/deps/npm/man/man1/npm-adduser.1 index df4372e26d6..ed2a8bc5e9e 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" "February 2015" "" "" +.TH "NPM\-ADDUSER" "1" "March 2015" "" "" .SH "NAME" \fBnpm-adduser\fR \- Add a registry user account .SH SYNOPSIS diff --git a/deps/npm/man/man1/npm-bin.1 b/deps/npm/man/man1/npm-bin.1 index 26d14dfa8c9..5b604fafa33 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" "February 2015" "" "" +.TH "NPM\-BIN" "1" "March 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 94eec9f6ace..a0fdc0d3468 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" "February 2015" "" "" +.TH "NPM\-BUGS" "1" "March 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 42f084d72c2..4653cccf89e 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" "February 2015" "" "" +.TH "NPM\-BUILD" "1" "March 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 4da29437910..a8b2e21ec75 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" "February 2015" "" "" +.TH "NPM\-BUNDLE" "1" "March 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 5ebf49d2549..4beaf5d4103 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" "February 2015" "" "" +.TH "NPM\-CACHE" "1" "March 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 22110a3b6db..42142acfbc9 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" "February 2015" "" "" +.TH "NPM\-COMPLETION" "1" "March 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 0b14aef1f60..0c9334f2ef0 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" "February 2015" "" "" +.TH "NPM\-CONFIG" "1" "March 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 3ffdf836feb..0f0f8d17ba8 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" "February 2015" "" "" +.TH "NPM\-DEDUPE" "1" "March 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 d2a6c893975..936713e4ae0 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" "February 2015" "" "" +.TH "NPM\-DEPRECATE" "1" "March 2015" "" "" .SH "NAME" \fBnpm-deprecate\fR \- Deprecate a version of a package .SH SYNOPSIS diff --git a/deps/npm/man/man1/npm-dist-tag.1 b/deps/npm/man/man1/npm-dist-tag.1 index 28c3c3da4bc..18335297180 100644 --- a/deps/npm/man/man1/npm-dist-tag.1 +++ b/deps/npm/man/man1/npm-dist-tag.1 @@ -1,4 +1,4 @@ -.TH "NPM\-DIST\-TAG" "1" "February 2015" "" "" +.TH "NPM\-DIST\-TAG" "1" "March 2015" "" "" .SH "NAME" \fBnpm-dist-tag\fR \- Modify package distribution tags .SH SYNOPSIS diff --git a/deps/npm/man/man1/npm-docs.1 b/deps/npm/man/man1/npm-docs.1 index 2835d042470..3b6dfa0782a 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" "February 2015" "" "" +.TH "NPM\-DOCS" "1" "March 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 c260554e6d9..e5ca2b3fc1c 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" "February 2015" "" "" +.TH "NPM\-EDIT" "1" "March 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 527a9f221a8..e1fd0a053db 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" "February 2015" "" "" +.TH "NPM\-EXPLORE" "1" "March 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 3c95739336d..17a5346a19d 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" "February 2015" "" "" +.TH "NPM\-HELP\-SEARCH" "1" "March 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 3a43adc4857..eddc08b8384 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" "February 2015" "" "" +.TH "NPM\-HELP" "1" "March 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 c145287358c..1161f17c340 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" "February 2015" "" "" +.TH "NPM\-INIT" "1" "March 2015" "" "" .SH "NAME" \fBnpm-init\fR \- Interactively create a package\.json file .SH SYNOPSIS @@ -23,6 +23,17 @@ without a really good reason to do so\. .P If you invoke it with \fB\-f\fR, \fB\-\-force\fR, \fB\-y\fR, or \fB\-\-yes\fR, it will use only defaults and not prompt you for any options\. +.SH CONFIGURATION +.SS scope +.RS 0 +.IP \(bu 2 +Default: none +.IP \(bu 2 +Type: String + +.RE +.P +The scope under which the new module should be created\. .SH SEE ALSO .RS 0 .IP \(bu 2 @@ -31,6 +42,8 @@ https://github\.com/isaacs/init\-package\-json npm help 5 package\.json .IP \(bu 2 npm help version +.IP \(bu 2 +npm help 7 scope .RE diff --git a/deps/npm/man/man1/npm-install.1 b/deps/npm/man/man1/npm-install.1 index db564b23f58..3f01a6085fd 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" "February 2015" "" "" +.TH "NPM\-INSTALL" "1" "March 2015" "" "" .SH "NAME" \fBnpm-install\fR \- Install a package .SH SYNOPSIS @@ -52,9 +52,10 @@ after packing it up into a tarball (b)\. In global mode (ie, with \fB\-g\fR or \fB\-\-global\fR appended to the command), it installs the current package context (ie, the current working directory) as a global package\. - By default, \fBnpm install\fR will install all modules listed as - dependencies\. With the \fB\-\-production\fR flag, - npm will not install modules listed in \fBdevDependencies\fR\|\. + By default, \fBnpm install\fR will install all modules listed as dependencies\. + With the \fB\-\-production\fR flag (or when the \fBNODE_ENV\fR environment variable + is set to \fBproduction\fR), npm will not install modules listed in + \fBdevDependencies\fR\|\. .IP \(bu 2 \fBnpm install \fR: Install a package that is sitting in a folder on the filesystem\. diff --git a/deps/npm/man/man1/npm-link.1 b/deps/npm/man/man1/npm-link.1 index 6c4f04fb877..57bd6d92229 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" "February 2015" "" "" +.TH "NPM\-LINK" "1" "March 2015" "" "" .SH "NAME" \fBnpm-link\fR \- Symlink a package folder .SH SYNOPSIS diff --git a/deps/npm/man/man1/npm-logout.1 b/deps/npm/man/man1/npm-logout.1 index 9d56285ad3c..1ad6b900a9e 100644 --- a/deps/npm/man/man1/npm-logout.1 +++ b/deps/npm/man/man1/npm-logout.1 @@ -1,4 +1,4 @@ -.TH "NPM\-LOGOUT" "1" "February 2015" "" "" +.TH "NPM\-LOGOUT" "1" "March 2015" "" "" .SH "NAME" \fBnpm-logout\fR \- Log out of the registry .SH SYNOPSIS diff --git a/deps/npm/man/man1/npm-ls.1 b/deps/npm/man/man1/npm-ls.1 index 553afb68fed..4f0b0e98c7e 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" "February 2015" "" "" +.TH "NPM\-LS" "1" "March 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.6.1 /path/to/npm +npm@2.7.0 /path/to/npm └─┬ init\-package\-json@0\.0\.4 └── promzard@0\.1\.5 .fi @@ -86,6 +86,26 @@ Type: Int .RE .P Max display depth of the dependency tree\. +.SS prod / production +.RS 0 +.IP \(bu 2 +Type: Boolean +.IP \(bu 2 +Default: false + +.RE +.P +Display only the dependency tree for packages in \fBdependencies\fR\|\. +.SS dev +.RS 0 +.IP \(bu 2 +Type: Boolean +.IP \(bu 2 +Default: false + +.RE +.P +Display only the dependency tree for packages in \fBdevDependencies\fR\|\. .SH SEE ALSO .RS 0 .IP \(bu 2 diff --git a/deps/npm/man/man1/npm-outdated.1 b/deps/npm/man/man1/npm-outdated.1 index 002fe8887e9..c510fea9715 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" "February 2015" "" "" +.TH "NPM\-OUTDATED" "1" "March 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 adb6d9d47b3..7ceaddce6e3 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" "February 2015" "" "" +.TH "NPM\-OWNER" "1" "March 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 b52ee1cf958..96e6f705f7a 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" "February 2015" "" "" +.TH "NPM\-PACK" "1" "March 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 d22601a16a9..339896aac8b 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" "February 2015" "" "" +.TH "NPM\-PREFIX" "1" "March 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 31d1c5cc533..7a34afe6f6e 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" "February 2015" "" "" +.TH "NPM\-PRUNE" "1" "March 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 0ffb5284fa7..c763aa660e7 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" "February 2015" "" "" +.TH "NPM\-PUBLISH" "1" "March 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 b5b89c94234..e6cb6c1029a 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" "February 2015" "" "" +.TH "NPM\-REBUILD" "1" "March 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 d9cd8441345..5097e109ec7 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" "February 2015" "" "" +.TH "NPM\-REPO" "1" "March 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 a769e212fca..0cdde8b201a 100644 --- a/deps/npm/man/man1/npm-restart.1 +++ b/deps/npm/man/man1/npm-restart.1 @@ -1,4 +1,4 @@ -.TH "NPM\-RESTART" "1" "February 2015" "" "" +.TH "NPM\-RESTART" "1" "March 2015" "" "" .SH "NAME" \fBnpm-restart\fR \- Restart a package .SH SYNOPSIS diff --git a/deps/npm/man/man1/npm-rm.1 b/deps/npm/man/man1/npm-rm.1 index e2441e445cd..26f4dad0337 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" "February 2015" "" "" +.TH "NPM\-RM" "1" "March 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 43f28d4203b..10855e1c7f6 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" "February 2015" "" "" +.TH "NPM\-ROOT" "1" "March 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 879fccad2de..b095ddb65fe 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" "February 2015" "" "" +.TH "NPM\-RUN\-SCRIPT" "1" "March 2015" "" "" .SH "NAME" \fBnpm-run-script\fR \- Run arbitrary package scripts .SH SYNOPSIS @@ -11,16 +11,11 @@ npm run [command] [\-\- ] .RE .SH DESCRIPTION .P -This runs an arbitrary command from a package's \fB"scripts"\fR object\. -If no package name is provided, it will search for a \fBpackage\.json\fR -in the current folder and use its \fB"scripts"\fR object\. If no \fB"command"\fR -is provided, it will list the available top level scripts\. The \fBenv\fR command -can be used to list environment variables that will be available to the script -at runtime\. If an "env" command is defined in your package it will have -precedence instead\. -.P -\fBrun[\-script]\fR is used by the test, start, restart, and stop commands, but can -be called directly, as well\. +This runs an arbitrary command from a package's \fB"scripts"\fR object\. If no +\fB"command"\fR is provided, it will list the available scripts\. \fBrun[\-script]\fR is +used by the test, start, restart, and stop commands, but can be called +directly, as well\. When the scripts in the package are printed out, they're +separated into lifecycle (test, start, restart) and directly\-run scripts\. .P As of \fBnpm@2\.0\.0\fR \fIhttp://blog\.npmjs\.org/post/98131109725/npm\-2\-0\-0\fR, you can use custom arguments when executing scripts\. The special option \fB\-\-\fR is used by @@ -35,6 +30,11 @@ npm run test \-\- \-\-grep="pattern" .P The arguments will only be passed to the script specified after \fBnpm run\fR and not to any pre or post script\. +.P +The \fBenv\fR script is a special built\-in command that can be used to list +environment variables that will be available to the script at runtime\. If an +"env" command is defined in your package it will take precedence over the +built\-in\. .SH SEE ALSO .RS 0 .IP \(bu 2 diff --git a/deps/npm/man/man1/npm-search.1 b/deps/npm/man/man1/npm-search.1 index 316060d12c7..04989533ca1 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" "February 2015" "" "" +.TH "NPM\-SEARCH" "1" "March 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 5d3649e4c38..d416f6666cc 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" "February 2015" "" "" +.TH "NPM\-SHRINKWRAP" "1" "March 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 091271293cf..b249df62b77 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" "February 2015" "" "" +.TH "NPM\-STAR" "1" "March 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 8aa6ae2bad2..2320a0c4605 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" "February 2015" "" "" +.TH "NPM\-STARS" "1" "March 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 574281b500c..5cd7012563b 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" "February 2015" "" "" +.TH "NPM\-START" "1" "March 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 f0fb715c6d1..6f4de89fa85 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" "February 2015" "" "" +.TH "NPM\-STOP" "1" "March 2015" "" "" .SH "NAME" \fBnpm-stop\fR \- Stop a package .SH SYNOPSIS diff --git a/deps/npm/man/man1/npm-tag.1 b/deps/npm/man/man1/npm-tag.1 index eb0549e9240..91530fc076b 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" "February 2015" "" "" +.TH "NPM\-TAG" "1" "March 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 c0b873fb0bc..0a4e9e0c516 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" "February 2015" "" "" +.TH "NPM\-TEST" "1" "March 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 d79721bfbfd..29fe20a72b1 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" "February 2015" "" "" +.TH "NPM\-RM" "1" "March 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 906f63069aa..463e925aaa7 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" "February 2015" "" "" +.TH "NPM\-UNPUBLISH" "1" "March 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 b200ad94c10..a8ee566e080 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" "February 2015" "" "" +.TH "NPM\-UPDATE" "1" "March 2015" "" "" .SH "NAME" \fBnpm-update\fR \- Update a package .SH SYNOPSIS @@ -11,7 +11,7 @@ npm update [\-g] [ [ \.\.\.]] .SH DESCRIPTION .P This command will update all the packages listed to the latest version -(specified by the \fBtag\fR config)\. +(specified by the \fBtag\fR config), respecting semver\. .P It will also install missing packages\. As with all commands that install packages, the \fB\-\-dev\fR flag will cause \fBdevDependencies\fR to be processed @@ -22,6 +22,139 @@ packages\. .P If no package name is specified, all packages in the specified location (global or local) will be updated\. +.P +As of \fBnpm@2\.6\.1\fR, the \fBnpm update\fR will only inspect top\-level packages\. +Prior versions of \fBnpm\fR would also recursively inspect all dependencies\. +To get the old behavior, use \fBnpm \-\-depth 9999 update\fR, but be warned that +simultaneous asynchronous update of all packages, including \fBnpm\fR itself +and packages that \fBnpm\fR depends on, often causes problems up to and including +the uninstallation of \fBnpm\fR itself\. +.P +To restore a missing \fBnpm\fR, use the command: +.P +.RS 2 +.nf +curl \-L https://npmjs\.com/install\.sh | sh +.fi +.RE +.SH EXAMPLES +.P +IMPORTANT VERSION NOTE: these examples assume \fBnpm@2\.6\.1\fR or later\. For +older versions of \fBnpm\fR, you must specify \fB\-\-depth 0\fR to get the behavior +described below\. +.P +For the examples below, assume that the current package is \fBapp\fR and it depends +on dependencies, \fBdep1\fR (\fBdep2\fR, \.\. etc\.)\. The published versions of \fBdep1\fR are: +.P +.RS 2 +.nf +{ + dist\-tags: { latest: "1\.2\.2" }, + versions: { "1\.2\.2", + "1\.2\.1", + "1\.2\.0", + "1\.1\.2", + "1\.1\.1", + "1\.0\.0", + "0\.4\.1", + "0\.4\.0", + "0\.2\.0" + } +} +.fi +.RE +.SS Caret Dependencies +.P +If \fBapp\fR\|'s \fBpackage\.json\fR contains: +.P +.RS 2 +.nf +dependencies: { + dep1: "^1\.1\.1" +} +.fi +.RE +.P +Then \fBnpm update\fR will install \fBdep1@1\.2\.2\fR, because \fB1\.2\.2\fR is \fBlatest\fR and +\fB1\.2\.2\fR satisfies \fB^1\.1\.1\fR\|\. +.SS Tilde Dependencies +.P +However, if \fBapp\fR\|'s \fBpackage\.json\fR contains: +.P +.RS 2 +.nf +dependencies: { + dep1: "~1\.1\.1" +} +.fi +.RE +.P +In this case, running \fBnpm update\fR will install \fBdep1@1\.1\.2\fR\|\. Even though the \fBlatest\fR +tag points to \fB1\.2\.2\fR, this version does not satisfy \fB~1\.1\.1\fR, which is equivalent +to \fB>=1\.1\.1 <1\.2\.0\fR\|\. So the highest\-sorting version that satisfies \fB~1\.1\.1\fR is used, +which is \fB1\.1\.2\fR\|\. +.SS Caret Dependencies below 1\.0\.0 +.P +Suppose \fBapp\fR has a caret dependency on a version below \fB1\.0\.0\fR, for example: +.P +.RS 2 +.nf +dependencies: { + dep1: "^0\.2\.0" +} +.fi +.RE +.P +\fBnpm update\fR will install \fBdep1@0\.2\.0\fR, because there are no other +versions which satisfy \fB^0\.2\.0\fR\|\. +.P +If the dependence were on \fB^0\.4\.0\fR: +.P +.RS 2 +.nf +dependencies: { + dep1: "^0\.4\.0" +} +.fi +.RE +.P +Then \fBnpm update\fR will install \fBdep1@0\.4\.1\fR, because that is the highest\-sorting +version that satisfies \fB^0\.4\.0\fR (\fB>= 0\.4\.0 <0\.5\.0\fR) +.SS Recording Updates with \fB\-\-save\fR +.P +When you want to update a package and save the new version as +the minimum required dependency in \fBpackage\.json\fR, you can use +\fBnpm update \-\-save\fR\|\. For example if \fBpackage\.json\fR contains +.P +.RS 2 +.nf +dependencies: { + dep1: "^1\.1\.1" +} +.fi +.RE +.P +Then \fBnpm update \-\-save\fR will install \fBdep1@1\.2\.2\fR (i\.e\., \fBlatest\fR), +and \fBpackage\.json\fR will be modified: +.P +.RS 2 +.nf +dependencies: { + dep1: "^1\.2\.2" +} +.fi +.RE +.P +Note that \fBnpm\fR will only write an updated version to \fBpackage\.json\fR +if it installs a new package\. +.SS Updating Globally\-Installed Packages +.P +\fBnpm update \-g\fR will apply the \fBupdate\fR action to each globally\- installed +package that is \fBoutdated\fR \-\- that is, has a version that is different from +\fBlatest\fR\|\. +.P +NOTE: If a package has been upgraded to a version newer than \fBlatest\fR, it will +be \fIdowngraded\fR\|\. .SH SEE ALSO .RS 0 .IP \(bu 2 @@ -29,6 +162,8 @@ npm help install .IP \(bu 2 npm help outdated .IP \(bu 2 +npm help shrinkwrap +.IP \(bu 2 npm help 7 registry .IP \(bu 2 npm help 5 folders diff --git a/deps/npm/man/man1/npm-version.1 b/deps/npm/man/man1/npm-version.1 index bbe6784cd6d..78921acfd54 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" "February 2015" "" "" +.TH "NPM\-VERSION" "1" "March 2015" "" "" .SH "NAME" \fBnpm-version\fR \- Bump a package version .SH SYNOPSIS @@ -18,8 +18,10 @@ valid second argument to semver\.inc (one of "patch", "minor", "major", "prepatch", "preminor", "premajor", "prerelease")\. In the second case, the existing version will be incremented by 1 in the specified field\. .P -If run in a git repo, it will also create a version commit and tag, and -fail if the repo is not clean\. +If run in a git repo, it will also create a version commit and tag, and fail if +the repo is not clean\. This behavior is controlled by \fBgit\-tag\-version\fR (see +below), and can be disabled on the command line by running \fBnpm +\-\-no\-git\-tag\-version version\fR .P If supplied with \fB\-\-message\fR (shorthand: \fB\-m\fR) config option, npm will use it as a commit message when creating a version commit\. If the @@ -48,6 +50,17 @@ user: "isaacs (http://blog\.izs\.me/) " Enter passphrase: .fi .RE +.SH CONFIGURATION +.SS git\-tag\-version +.RS 0 +.IP \(bu 2 +Default: true +.IP \(bu 2 +Type: Boolean + +.RE +.P +Commit and tag the version change\. .SH SEE ALSO .RS 0 .IP \(bu 2 @@ -56,6 +69,8 @@ npm help init npm help 5 package\.json .IP \(bu 2 npm help 7 semver +.IP \(bu 2 +npm help 7 config .RE diff --git a/deps/npm/man/man1/npm-view.1 b/deps/npm/man/man1/npm-view.1 index 187c215d6ca..372696f0a42 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" "February 2015" "" "" +.TH "NPM\-VIEW" "1" "March 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 fe2af1ec038..0d50afb6651 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" "February 2015" "" "" +.TH "NPM\-WHOAMI" "1" "March 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 bf47dee787a..4dc37963e92 100644 --- a/deps/npm/man/man1/npm.1 +++ b/deps/npm/man/man1/npm.1 @@ -1,4 +1,4 @@ -.TH "NPM" "1" "February 2015" "" "" +.TH "NPM" "1" "March 2015" "" "" .SH "NAME" \fBnpm\fR \- javascript package manager .SH SYNOPSIS @@ -10,7 +10,7 @@ npm [args] .RE .SH VERSION .P -2.6.1 +2.7.0 .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 667f7188040..ac236ad6ee8 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" "February 2015" "" "" +.TH "NPM\-BIN" "3" "March 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 eb8eff117a5..7b4597e2bac 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" "February 2015" "" "" +.TH "NPM\-BUGS" "3" "March 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 88a6c8ca2ca..bdd43226a68 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" "February 2015" "" "" +.TH "NPM\-CACHE" "3" "March 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 e9725c97135..61ce8a1f472 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" "February 2015" "" "" +.TH "NPM\-COMMANDS" "3" "March 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 e0f838af916..bd1ab1a1175 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" "February 2015" "" "" +.TH "NPM\-CONFIG" "3" "March 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 fbbaa693f68..2abbb245cab 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" "February 2015" "" "" +.TH "NPM\-DEPRECATE" "3" "March 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 d772f53fa84..e33b3562d41 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" "February 2015" "" "" +.TH "NPM\-DOCS" "3" "March 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 763c78a6bae..faae5eb25c6 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" "February 2015" "" "" +.TH "NPM\-EDIT" "3" "March 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 4d55360803f..042b8a5aabf 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" "February 2015" "" "" +.TH "NPM\-EXPLORE" "3" "March 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 68d29f5e4c9..c10fd683a08 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" "February 2015" "" "" +.TH "NPM\-HELP\-SEARCH" "3" "March 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 90336149ae3..340cf3ff05b 100644 --- a/deps/npm/man/man3/npm-init.3 +++ b/deps/npm/man/man3/npm-init.3 @@ -1,4 +1,4 @@ -.TH "NPM" "" "February 2015" "" "" +.TH "NPM" "" "March 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 b69cbf97b3b..6c140102cc0 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" "February 2015" "" "" +.TH "NPM\-INSTALL" "3" "March 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 9db043993ef..86fef62a436 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" "February 2015" "" "" +.TH "NPM\-LINK" "3" "March 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 c5ca93a6223..fd57800a40f 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" "February 2015" "" "" +.TH "NPM\-LOAD" "3" "March 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 df41a3ab826..eb3eb53bccc 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" "February 2015" "" "" +.TH "NPM\-LS" "3" "March 2015" "" "" .SH "NAME" \fBnpm-ls\fR \- List installed packages .SH SYNOPSIS diff --git a/deps/npm/man/man3/npm-outdated.3 b/deps/npm/man/man3/npm-outdated.3 index 2efa2358590..49211088c6e 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" "February 2015" "" "" +.TH "NPM\-OUTDATED" "3" "March 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 238f3c5da7d..f95c79aef52 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" "February 2015" "" "" +.TH "NPM\-OWNER" "3" "March 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 13fc83a3a21..1a0f5910e80 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" "February 2015" "" "" +.TH "NPM\-PACK" "3" "March 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 68c9f1042b7..5289c9e8981 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" "February 2015" "" "" +.TH "NPM\-PREFIX" "3" "March 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 614a551789c..b50fc9e8fe0 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" "February 2015" "" "" +.TH "NPM\-PRUNE" "3" "March 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 cf2be78692b..2ca3987226e 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" "February 2015" "" "" +.TH "NPM\-PUBLISH" "3" "March 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 b79d99604c0..f0bf76155fd 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" "February 2015" "" "" +.TH "NPM\-REBUILD" "3" "March 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 bd0d915a63b..e36b160e92c 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" "February 2015" "" "" +.TH "NPM\-REPO" "3" "March 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 5c24f61e282..8027bd49ede 100644 --- a/deps/npm/man/man3/npm-restart.3 +++ b/deps/npm/man/man3/npm-restart.3 @@ -1,4 +1,4 @@ -.TH "NPM\-RESTART" "3" "February 2015" "" "" +.TH "NPM\-RESTART" "3" "March 2015" "" "" .SH "NAME" \fBnpm-restart\fR \- Restart a package .SH SYNOPSIS diff --git a/deps/npm/man/man3/npm-root.3 b/deps/npm/man/man3/npm-root.3 index 5c64d99f849..0932b771890 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" "February 2015" "" "" +.TH "NPM\-ROOT" "3" "March 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 e87405309db..411ffeedd7e 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" "February 2015" "" "" +.TH "NPM\-RUN\-SCRIPT" "3" "March 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 895e8ec1e4e..071cab9f48b 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" "February 2015" "" "" +.TH "NPM\-SEARCH" "3" "March 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 042e394128b..da7134c1e74 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" "February 2015" "" "" +.TH "NPM\-SHRINKWRAP" "3" "March 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 bba1166e4df..fee38728b0d 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" "February 2015" "" "" +.TH "NPM\-START" "3" "March 2015" "" "" .SH "NAME" \fBnpm-start\fR \- Start a package .SH SYNOPSIS diff --git a/deps/npm/man/man3/npm-stop.3 b/deps/npm/man/man3/npm-stop.3 index e1e536316b0..c17766074a3 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" "February 2015" "" "" +.TH "NPM\-STOP" "3" "March 2015" "" "" .SH "NAME" \fBnpm-stop\fR \- Stop a package .SH SYNOPSIS diff --git a/deps/npm/man/man3/npm-tag.3 b/deps/npm/man/man3/npm-tag.3 index ef7e8351a34..4aec0b138dc 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" "February 2015" "" "" +.TH "NPM\-TAG" "3" "March 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 0e9dfdc41ab..71d40fa8eb8 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" "February 2015" "" "" +.TH "NPM\-TEST" "3" "March 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 7920b0188fb..dacca6337fd 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" "February 2015" "" "" +.TH "NPM\-UNINSTALL" "3" "March 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 17c3228a118..073435f083d 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" "February 2015" "" "" +.TH "NPM\-UNPUBLISH" "3" "March 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 81e86907bc3..f5d6885853d 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" "February 2015" "" "" +.TH "NPM\-UPDATE" "3" "March 2015" "" "" .SH "NAME" \fBnpm-update\fR \- Update a package .SH SYNOPSIS @@ -8,11 +8,19 @@ npm\.commands\.update(packages, callback) .fi .RE -.TH "DESCRIPTION" "" "February 2015" "" "" +.TH "DESCRIPTION" "" "March 2015" "" "" .SH "NAME" \fBDESCRIPTION\fR .P -Updates a package, upgrading it to the latest version\. It also installs any missing packages\. +Updates a package, upgrading it to the latest version\. It also installs any +missing packages\. .P -The 'packages' argument is an array of packages to update\. The 'callback' parameter will be called when done or when an error occurs\. +The \fBpackages\fR argument is an array of packages to update\. The \fBcallback\fR +parameter will be called when done or when an error occurs\. +.SH SEE ALSO +.RS 0 +.IP \(bu 2 +npm help update + +.RE diff --git a/deps/npm/man/man3/npm-version.3 b/deps/npm/man/man3/npm-version.3 index be5def85553..e032f966d0b 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" "February 2015" "" "" +.TH "NPM\-VERSION" "3" "March 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 cbd2dae4355..1267ff23f3c 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" "February 2015" "" "" +.TH "NPM\-VIEW" "3" "March 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 81cda1b89c5..6e427004b1e 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" "February 2015" "" "" +.TH "NPM\-WHOAMI" "3" "March 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 dbb61b04a27..cd71b115110 100644 --- a/deps/npm/man/man3/npm.3 +++ b/deps/npm/man/man3/npm.3 @@ -1,4 +1,4 @@ -.TH "NPM" "3" "February 2015" "" "" +.TH "NPM" "3" "March 2015" "" "" .SH "NAME" \fBnpm\fR \- javascript package manager .SH SYNOPSIS @@ -20,7 +20,7 @@ npm\.load([configObject, ]function (er, npm) { .RE .SH VERSION .P -2.6.1 +2.7.0 .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 2a945b168c9..b01d9245ec8 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" "February 2015" "" "" +.TH "NPM\-FOLDERS" "5" "March 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 2a945b168c9..b01d9245ec8 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" "February 2015" "" "" +.TH "NPM\-FOLDERS" "5" "March 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 fcdfa167d57..61420dee335 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" "February 2015" "" "" +.TH "PACKAGE\.JSON" "5" "March 2015" "" "" .SH "NAME" \fBpackage.json\fR \- Specifics of npm's package\.json handling .SH DESCRIPTION diff --git a/deps/npm/man/man5/npmrc.5 b/deps/npm/man/man5/npmrc.5 index a6b00e811c2..150729dcab5 100644 --- a/deps/npm/man/man5/npmrc.5 +++ b/deps/npm/man/man5/npmrc.5 @@ -1,4 +1,4 @@ -.TH "NPMRC" "5" "February 2015" "" "" +.TH "NPMRC" "5" "March 2015" "" "" .SH "NAME" \fBnpmrc\fR \- The npm config files .SH DESCRIPTION diff --git a/deps/npm/man/man5/package.json.5 b/deps/npm/man/man5/package.json.5 index fcdfa167d57..61420dee335 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" "February 2015" "" "" +.TH "PACKAGE\.JSON" "5" "March 2015" "" "" .SH "NAME" \fBpackage.json\fR \- Specifics of npm's package\.json handling .SH DESCRIPTION diff --git a/deps/npm/man/man7/npm-coding-style.7 b/deps/npm/man/man7/npm-coding-style.7 index 3607b86598f..bbe6dcc4986 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" "February 2015" "" "" +.TH "NPM\-CODING\-STYLE" "7" "March 2015" "" "" .SH "NAME" \fBnpm-coding-style\fR \- npm's "funny" coding style .SH DESCRIPTION diff --git a/deps/npm/man/man7/npm-config.7 b/deps/npm/man/man7/npm-config.7 index 77e554f3ebc..591da2c321a 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" "February 2015" "" "" +.TH "NPM\-CONFIG" "7" "March 2015" "" "" .SH "NAME" \fBnpm-config\fR \- More than you probably want to know about npm configuration .SH DESCRIPTION @@ -340,7 +340,7 @@ Type: Number .RE .P -The depth to go when recursing directories for \fBnpm ls\fR, +The depth to go when recursing directories for \fBnpm ls\fR, \fBnpm cache ls\fR, and \fBnpm outdated\fR\|\. .P For \fBnpm outdated\fR, a setting of \fBInfinity\fR will be treated as \fB0\fR @@ -545,6 +545,20 @@ Type: url 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 if\-present +.RS 0 +.IP \(bu 2 +Default: false +.IP \(bu 2 +Type: Boolean + +.RE +.P +If true, npm will not exit with an error code when \fBrun\-script\fR is invoked for +a script that isn't defined in the \fBscripts\fR section of \fBpackage\.json\fR\|\. This +option can be used when it's desirable to optionally run a script when it's +present and fail if the script fails\. This is useful, for example, when running +scripts that may only apply for some builds in an otherwise generic CI setup\. .SS ignore\-scripts .RS 0 .IP \(bu 2 diff --git a/deps/npm/man/man7/npm-developers.7 b/deps/npm/man/man7/npm-developers.7 index 76eda3cde23..9b55e2a921c 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" "February 2015" "" "" +.TH "NPM\-DEVELOPERS" "7" "March 2015" "" "" .SH "NAME" \fBnpm-developers\fR \- Developer Guide .SH DESCRIPTION diff --git a/deps/npm/man/man7/npm-disputes.7 b/deps/npm/man/man7/npm-disputes.7 index 136d670b621..de9b873978e 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" "February 2015" "" "" +.TH "NPM\-DISPUTES" "7" "March 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 45daad65dba..39958c3f512 100644 --- a/deps/npm/man/man7/npm-faq.7 +++ b/deps/npm/man/man7/npm-faq.7 @@ -1,4 +1,4 @@ -.TH "NPM\-FAQ" "7" "February 2015" "" "" +.TH "NPM\-FAQ" "7" "March 2015" "" "" .SH "NAME" \fBnpm-faq\fR \- Frequently Asked Questions .SH Where can I find these docs in HTML? diff --git a/deps/npm/man/man7/npm-index.7 b/deps/npm/man/man7/npm-index.7 index c1491c918b2..a923d53e887 100644 --- a/deps/npm/man/man7/npm-index.7 +++ b/deps/npm/man/man7/npm-index.7 @@ -1,4 +1,4 @@ -.TH "NPM\-INDEX" "7" "February 2015" "" "" +.TH "NPM\-INDEX" "7" "March 2015" "" "" .SH "NAME" \fBnpm-index\fR \- Index of all npm documentation .SS npm help README diff --git a/deps/npm/man/man7/npm-registry.7 b/deps/npm/man/man7/npm-registry.7 index 8e53a12a558..761248031e8 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" "February 2015" "" "" +.TH "NPM\-REGISTRY" "7" "March 2015" "" "" .SH "NAME" \fBnpm-registry\fR \- The JavaScript Package Registry .SH DESCRIPTION diff --git a/deps/npm/man/man7/npm-scope.7 b/deps/npm/man/man7/npm-scope.7 index 5a32862abbe..0a68fc31966 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" "February 2015" "" "" +.TH "NPM\-SCOPE" "7" "March 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 b90484d2f4c..bdd08132875 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" "February 2015" "" "" +.TH "NPM\-SCRIPTS" "7" "March 2015" "" "" .SH "NAME" \fBnpm-scripts\fR \- How npm handles the "scripts" field .SH DESCRIPTION @@ -45,53 +45,31 @@ Additionally, arbitrary scripts can be executed by running \fBnpm run\-script \fR\|\. \fIPre\fR and \fIpost\fR commands with matching names will be run for those as well (e\.g\. \fBpremyscript\fR, \fBmyscript\fR, \fBpostmyscript\fR)\. -.SH NOTE: INSTALL SCRIPTS ARE AN ANTIPATTERN -.P -\fBtl;dr\fR Don't use \fBinstall\fR\|\. Use a \fB\|\.gyp\fR file for compilation, and -\fBprepublish\fR for anything else\. -.P -You should almost never have to explicitly set a \fBpreinstall\fR or -\fBinstall\fR script\. If you are doing this, please consider if there is -another option\. -.P -The only valid use of \fBinstall\fR or \fBpreinstall\fR scripts is for -compilation which must be done on the target architecture\. In early -versions of node, this was often done using the \fBnode\-waf\fR scripts, or -a standalone \fBMakefile\fR, and early versions of npm required that it be -explicitly set in package\.json\. This was not portable, and harder to -do properly\. -.P -In the current version of node, the standard way to do this is using a -\fB\|\.gyp\fR file\. If you have a file with a \fB\|\.gyp\fR extension in the root -of your package, then npm will run the appropriate \fBnode\-gyp\fR commands -automatically at install time\. This is the only officially supported -method for compiling binary addons, and does not require that you add -anything to your package\.json file\. -.P -If you have to do other things before your package is used, in a way +.SH COMMON USES +.P +If you need to perform operations on your package before it is used, in a way that is not dependent on the operating system or architecture of the -target system, then use a \fBprepublish\fR script instead\. This includes +target system, use a \fBprepublish\fR script\. This includes tasks such as: .RS 0 .IP \(bu 2 -Compile CoffeeScript source code into JavaScript\. +Compiling CoffeeScript source code into JavaScript\. .IP \(bu 2 -Create minified versions of JavaScript source code\. +Creating minified versions of JavaScript source code\. .IP \(bu 2 Fetching remote resources that your package will use\. .RE .P -The advantage of doing these things at \fBprepublish\fR time instead of -\fBpreinstall\fR or \fBinstall\fR time is that they can be done once, in a -single place, and thus greatly reduce complexity and variability\. +The advantage of doing these things at \fBprepublish\fR time is that they can be done once, in a +single place, thus reducing complexity and variability\. Additionally, this means that: .RS 0 .IP \(bu 2 You can depend on \fBcoffee\-script\fR as a \fBdevDependency\fR, and thus your users don't need to have it installed\. .IP \(bu 2 -You don't need to include the minifiers in your package, reducing +You don't need to include minifiers in your package, reducing the size for your users\. .IP \(bu 2 You don't need to rely on your users having \fBcurl\fR or \fBwget\fR or @@ -275,6 +253,12 @@ probably set it up that way for a reason\. Don't prefix your script commands with "sudo"\. If root permissions are required for some reason, then it'll fail with that error, and the user will sudo the npm command in question\. +.IP \(bu 2 +Don't use \fBinstall\fR\|\. Use a \fB\|\.gyp\fR file for compilation, and \fBprepublish\fR +for anything else\. You should almost never have to explicitly set a +preinstall or install script\. If you are doing this, please consider if +there is another option\. The only valid use of \fBinstall\fR or \fBpreinstall\fR +scripts is for compilation which must be done on the target architecture\. .RE .SH SEE ALSO diff --git a/deps/npm/man/man7/removing-npm.7 b/deps/npm/man/man7/removing-npm.7 index e3f8b027608..a63c66b9b1a 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" "February 2015" "" "" +.TH "NPM\-REMOVAL" "1" "March 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 d15e0de43ed..7378be98627 100644 --- a/deps/npm/man/man7/semver.7 +++ b/deps/npm/man/man7/semver.7 @@ -1,4 +1,4 @@ -.TH "SEMVER" "7" "February 2015" "" "" +.TH "SEMVER" "7" "March 2015" "" "" .SH "NAME" \fBsemver\fR \- The semantic versioner for npm .SH Usage diff --git a/deps/npm/node_modules/glob/package.json b/deps/npm/node_modules/glob/package.json index c5032684b20..8c11fbb77e8 100644 --- a/deps/npm/node_modules/glob/package.json +++ b/deps/npm/node_modules/glob/package.json @@ -6,7 +6,7 @@ }, "name": "glob", "description": "a little globber", - "version": "4.4.0", + "version": "4.4.1", "repository": { "type": "git", "url": "git://github.com/isaacs/node-glob.git" @@ -42,14 +42,14 @@ "benchclean": "bash benchclean.sh" }, "license": "ISC", - "gitHead": "57e6b293108b48d9771a05e2b9a6a1b12cb81c12", + "gitHead": "a10b0294183788c0e9f56fc3ac88832e2c3513bc", "bugs": { "url": "https://github.com/isaacs/node-glob/issues" }, "homepage": "https://github.com/isaacs/node-glob", - "_id": "glob@4.4.0", - "_shasum": "91d63dc1ed1d82b52ba2cb76044852ccafc2130f", - "_from": "glob@>=4.4.0 <4.5.0", + "_id": "glob@4.4.1", + "_shasum": "8395b16d01f4a58f0bf3f6359174997b78d74197", + "_from": "glob@>=4.4.1 <4.5.0", "_npmVersion": "2.6.0", "_nodeVersion": "1.1.0", "_npmUser": { @@ -63,10 +63,9 @@ } ], "dist": { - "shasum": "91d63dc1ed1d82b52ba2cb76044852ccafc2130f", - "tarball": "http://registry.npmjs.org/glob/-/glob-4.4.0.tgz" + "shasum": "8395b16d01f4a58f0bf3f6359174997b78d74197", + "tarball": "http://registry.npmjs.org/glob/-/glob-4.4.1.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/glob/-/glob-4.4.0.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/glob/-/glob-4.4.1.tgz" } diff --git a/deps/npm/node_modules/glob/sync.js b/deps/npm/node_modules/glob/sync.js index 686f2c36945..7aa0d07c590 100644 --- a/deps/npm/node_modules/glob/sync.js +++ b/deps/npm/node_modules/glob/sync.js @@ -18,7 +18,8 @@ var childrenIgnored = common.childrenIgnored function globSync (pattern, options) { if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob') + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') return new GlobSync(pattern, options).found } @@ -28,7 +29,8 @@ function GlobSync (pattern, options) { throw new Error('must provide pattern') if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob') + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') if (!(this instanceof GlobSync)) return new GlobSync(pattern, options) diff --git a/deps/npm/node_modules/inflight/.eslintrc b/deps/npm/node_modules/inflight/.eslintrc deleted file mode 100644 index b7a1550efc2..00000000000 --- a/deps/npm/node_modules/inflight/.eslintrc +++ /dev/null @@ -1,17 +0,0 @@ -{ - "env" : { - "node" : true - }, - "rules" : { - "semi": [2, "never"], - "strict": 0, - "quotes": [1, "single", "avoid-escape"], - "no-use-before-define": 0, - "curly": 0, - "no-underscore-dangle": 0, - "no-lonely-if": 1, - "no-unused-vars": [2, {"vars" : "all", "args" : "after-used"}], - "no-mixed-requires": 0, - "space-infix-ops": 0 - } -} diff --git a/deps/npm/node_modules/init-package-json/default-input.js b/deps/npm/node_modules/init-package-json/default-input.js index 1b7d2c0638d..95c799ebb79 100644 --- a/deps/npm/node_modules/init-package-json/default-input.js +++ b/deps/npm/node_modules/init-package-json/default-input.js @@ -39,6 +39,9 @@ function readDeps (test) { return function (cb) { }} var name = package.name || basename +if (config.get('scope')) { + name = '@' + config.get('scope') + '/' + name +} exports.name = yes ? name : prompt('name', name) var version = package.version || diff --git a/deps/npm/node_modules/init-package-json/package.json b/deps/npm/node_modules/init-package-json/package.json index f3cadb45e77..34e10ef861b 100644 --- a/deps/npm/node_modules/init-package-json/package.json +++ b/deps/npm/node_modules/init-package-json/package.json @@ -1,6 +1,6 @@ { "name": "init-package-json", - "version": "1.2.0", + "version": "1.3.0", "main": "init-package-json.js", "scripts": { "test": "tap test/*.js" @@ -38,34 +38,14 @@ "prompt", "start" ], - "gitHead": "6c0743199706494a190c0b47d2e2567dc86055a3", + "readme": "# init-package-json\n\nA node module to get your node module started.\n\n## Usage\n\n```javascript\nvar init = require('init-package-json')\nvar path = require('path')\n\n// a path to a promzard module. In the event that this file is\n// not found, one will be provided for you.\nvar initFile = path.resolve(process.env.HOME, '.npm-init')\n\n// the dir where we're doin stuff.\nvar dir = process.cwd()\n\n// extra stuff that gets put into the PromZard module's context.\n// In npm, this is the resolved config object. Exposed as 'config'\n// Optional.\nvar configData = { some: 'extra stuff' }\n\n// Any existing stuff from the package.json file is also exposed in the\n// PromZard module as the `package` object. There will also be free\n// vars for:\n// * `filename` path to the package.json file\n// * `basename` the tip of the package dir\n// * `dirname` the parent of the package dir\n\ninit(dir, initFile, configData, function (er, data) {\n // the data's already been written to {dir}/package.json\n // now you can do stuff with it\n})\n```\n\nOr from the command line:\n\n```\n$ npm-init\n```\n\nSee [PromZard](https://github.com/isaacs/promzard) for details about\nwhat can go in the config file.\n", + "readmeFilename": "README.md", + "gitHead": "53273513f3fbaa017435ca6254d717cc27a85ddc", "bugs": { "url": "https://github.com/isaacs/init-package-json/issues" }, "homepage": "https://github.com/isaacs/init-package-json", - "_id": "init-package-json@1.2.0", - "_shasum": "b9f027514403b3b3f582c148592ab75214003348", - "_from": "init-package-json@>=1.2.0 <1.3.0", - "_npmVersion": "2.3.0", - "_nodeVersion": "0.10.35", - "_npmUser": { - "name": "othiym23", - "email": "ogd@aoaioxxysz.net" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - }, - { - "name": "othiym23", - "email": "ogd@aoaioxxysz.net" - } - ], - "dist": { - "shasum": "b9f027514403b3b3f582c148592ab75214003348", - "tarball": "http://registry.npmjs.org/init-package-json/-/init-package-json-1.2.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.2.0.tgz" + "_id": "init-package-json@1.3.0", + "_shasum": "6bb76ed69dd1359581a6f1507d37d309658074d6", + "_from": "init-package-json@>=1.3.0 <1.4.0" } diff --git a/deps/npm/node_modules/init-package-json/test/npm-defaults.js b/deps/npm/node_modules/init-package-json/test/npm-defaults.js index 666e9a1c496..f65f6463161 100644 --- a/deps/npm/node_modules/init-package-json/test/npm-defaults.js +++ b/deps/npm/node_modules/init-package-json/test/npm-defaults.js @@ -14,7 +14,7 @@ var EXPECTED = { test : 'echo "Error: no test specified" && exit 1' }, keywords : [], - author : "npmbot (http://npm.im/)", + author : "npmbot (http://npm.im)", license : "WTFPL" } diff --git a/deps/npm/node_modules/init-package-json/test/scope.js b/deps/npm/node_modules/init-package-json/test/scope.js new file mode 100644 index 00000000000..7049a4db40a --- /dev/null +++ b/deps/npm/node_modules/init-package-json/test/scope.js @@ -0,0 +1,35 @@ +var tap = require('tap') +var init = require('../') +var rimraf = require('rimraf') + +tap.test('the scope', function (t) { + var i = __dirname + '/basic.input' + var dir = __dirname + init(dir, i, {scope: 'foo'}, function (er, data) { + if (er) throw er + var expect = + { name: '@foo/test', + version: '1.2.5', + description: 'description', + author: 'me (http://url)', + scripts: { test: 'make test' }, + main: 'main.js', + config: { scope: 'foo' }, + package: {} } + t.same(data, expect) + t.end() + }) + setTimeout(function () { + process.stdin.emit('data', '@foo/test\n') + }, 50) + setTimeout(function () { + process.stdin.emit('data', 'description\n') + }, 100) + setTimeout(function () { + process.stdin.emit('data', 'yes\n') + }, 150) +}) + +tap.test('teardown', function (t) { + rimraf(__dirname + '/package.json', t.end.bind(t)) +}) diff --git a/deps/npm/node_modules/normalize-git-url/.eslintrc b/deps/npm/node_modules/normalize-git-url/.eslintrc deleted file mode 100644 index b54e30fd2aa..00000000000 --- a/deps/npm/node_modules/normalize-git-url/.eslintrc +++ /dev/null @@ -1,19 +0,0 @@ -{ - "env" : { - "node" : true - }, - "rules" : { - "semi": [2, "never"], - "strict": 0, - "quotes": [1, "double", "avoid-escape"], - "no-use-before-define": 0, - "curly": 0, - "no-underscore-dangle": 0, - "no-lonely-if": 1, - "no-unused-vars": [2, {"vars" : "all", "args" : "after-used"}], - "no-mixed-requires": 0, - "space-infix-ops": 0, - "key-spacing": 0, - "no-multi-spaces": 0 - } -} diff --git a/deps/npm/node_modules/npm-registry-client/test/fixtures/@npm/npm-registry-client/cache.json b/deps/npm/node_modules/npm-registry-client/test/fixtures/@npm/npm-registry-client/cache.json deleted file mode 100644 index 4561db502b1..00000000000 --- a/deps/npm/node_modules/npm-registry-client/test/fixtures/@npm/npm-registry-client/cache.json +++ /dev/null @@ -1 +0,0 @@ -{"_id":"@npm%2fnpm-registry-client","_rev":"213-0a1049cf56172b7d9a1184742c6477b9","name":"@npm/npm-registry-client","description":"Client for the npm registry","dist-tags":{"latest":"2.0.4","v2.0":"2.0.3"},"versions":{"0.0.1":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.1","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"engines":{"node":"*"},"_npmUser":{"name":"isaacs","email":"i@izs.me"},"_id":"@npm%2fnpm-registry-client@0.0.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.7.10-pre","_defaultsLoaded":true,"dist":{"shasum":"693a08f6d2faea22bbd2bf412508a63d3e6229a7","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.1.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.2":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.2","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"engines":{"node":"*"},"_npmUser":{"name":"isaacs","email":"i@izs.me"},"_id":"@npm%2fnpm-registry-client@0.0.2","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.7.10-pre","_defaultsLoaded":true,"dist":{"shasum":"b48c0ec5563c6a6fdc253454fc56d2c60c5a26f4","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.2.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.3":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.3","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"engines":{"node":"*"},"_npmUser":{"name":"isaacs","email":"i@izs.me"},"_id":"@npm%2fnpm-registry-client@0.0.3","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.7.10-pre","_defaultsLoaded":true,"dist":{"shasum":"ccc0254c2d59e3ea9b9050e2b16edef78df1a1e8","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.3.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.4":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.4","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"engines":{"node":"*"},"_npmUser":{"name":"isaacs","email":"i@izs.me"},"_id":"@npm%2fnpm-registry-client@0.0.4","_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.7.10-pre","_defaultsLoaded":true,"dist":{"shasum":"faabd25ef477521c74ac21e0f4cf3a2f66d18fb3","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.4.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.5":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.5","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"engines":{"node":"*"},"_id":"@npm%2fnpm-registry-client@0.0.5","dist":{"shasum":"85219810c9d89ae8d28ea766e7cf74efbd9f1e52","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.5.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.6":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"The code that npm uses to talk to the registry","version":"0.0.6","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"engines":{"node":"*"},"_id":"@npm%2fnpm-registry-client@0.0.6","dist":{"shasum":"cc6533b3b41df65e6e9db2601fbbf1a509a7e94c","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.6.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.7":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"The code that npm uses to talk to the registry","version":"0.0.7","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"engines":{"node":"*"},"_id":"@npm%2fnpm-registry-client@0.0.7","dist":{"shasum":"0cee1d1c61f1c8e483774fe1f7bbb81c4f394a3a","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.7.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.8":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.8","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.0.8","dist":{"shasum":"1b7411c3f7310ec2a96b055b00e7ca606e47bd07","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.8.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.9":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.9","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.0.9","dist":{"shasum":"6d5bfde431559ac9e2e52a7db85f5839b874f022","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.9.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.10":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.10","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.0.10","dist":{"shasum":"0c8b6a4615bce82aa6cc04a0d1f7dc89921f7a38","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.10.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.11":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.11","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.0.11","dist":{"shasum":"afab40be5bed1faa946d8e1827844698f2ec1db7","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.11.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.1.0":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.1.0","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.1.0","dist":{"shasum":"1077d6bbb5e432450239dc6622a59474953ffbea","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.1.0.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.1.1":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.1.1","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.1.1","dist":{"shasum":"759765361d09b715270f59cf50f10908e4e9c5fc","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.1.1.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.1.2":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.1.2","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.1.2","dist":{"shasum":"541ce93abb3d35f5c325545c718dd3bbeaaa9ff0","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.1.2.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.1.3":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.1.3","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.1.3","dist":{"shasum":"e9a40d7031e8f809af5fd85aa9aac979e17efc97","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.1.3.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.1.4":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.1.4","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.1.4","dist":{"shasum":"b211485b046191a1085362376530316f0cab0420","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.1.4.tgz"},"_npmVersion":"1.1.48","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.0":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.0","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.0","dist":{"shasum":"6508a4b4d96f31057d5200ca5779531bafd2b840","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.0.tgz"},"_npmVersion":"1.1.49","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.1":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.1","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.1","dist":{"shasum":"1bc8c4576c368cd88253d8a52daf40c55b89bb1a","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.1.tgz"},"_npmVersion":"1.1.49","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.5":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.5","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.5","dist":{"shasum":"2f55d675dfb977403b1ad0d96874c1d30e8058d7","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.5.tgz"},"_npmVersion":"1.1.51","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.6":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.6","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.6","dist":{"shasum":"f05df6695360360ad220e6e13a6a7bace7165fbe","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.6.tgz"},"_npmVersion":"1.1.56","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.7":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.7","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.7","dist":{"shasum":"867bad8854cae82ed89ee3b7f1d391af59491671","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.7.tgz"},"_npmVersion":"1.1.59","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.8":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.8","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.8","dist":{"shasum":"ef194cdb70f1ea03a576cff2c97392fa96e36563","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.8.tgz"},"_npmVersion":"1.1.62","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.9":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.9","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.9","dist":{"shasum":"3cec10431dfed1594adaf99c50f482ee56ecf9e4","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.9.tgz"},"_npmVersion":"1.1.59","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.10":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.10","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.10","dist":{"shasum":"1e69726dae0944e78562fd77243f839c6a2ced1e","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.10.tgz"},"_npmVersion":"1.1.64","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.11":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.11","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.11","dist":{"shasum":"d92f33c297eb1bbd57fd597c3d8f5f7e9340a0b5","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.11.tgz"},"_npmVersion":"1.1.70","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.12":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.12","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.12","dist":{"shasum":"3bfb6fc0e4b131d665580cd1481c341fe521bfd3","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.12.tgz"},"_from":".","_npmVersion":"1.2.2","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.13":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.13","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.13","dist":{"shasum":"e03f2a4340065511b7184a3e2862cd5d459ef027","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.13.tgz"},"_from":".","_npmVersion":"1.2.4","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.14":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.14","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.14","dist":{"shasum":"186874a7790417a340d582b1cd4a7c338087ee12","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.14.tgz"},"_from":".","_npmVersion":"1.2.10","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.15":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.15","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.15","dist":{"shasum":"f71f32b7185855f1f8b7a5ef49e49d2357c2c552","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.15.tgz"},"_from":".","_npmVersion":"1.2.10","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.16":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.16","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.16","dist":{"shasum":"3331323b5050fc5afdf77c3a35913c16f3e43964","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.16.tgz"},"_from":".","_npmVersion":"1.2.10","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.17":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.17","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.17","dist":{"shasum":"1df2bbecac6751f5d9600fb43722aef96d956773","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.17.tgz"},"_from":".","_npmVersion":"1.2.11","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.18":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.18","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.18","dist":{"shasum":"198c8d15ed9b1ed546faf6e431eb63a6b18193ad","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.18.tgz"},"_from":".","_npmVersion":"1.2.13","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.19":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.19","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.16","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.19","dist":{"shasum":"106da826f0d2007f6e081f2b68fb6f26fa951b20","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.19.tgz"},"_from":".","_npmVersion":"1.2.14","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.20":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.20","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.16","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.20","dist":{"shasum":"3fff194331e26660be2cf8ebf45ddf7d36add5f6","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.20.tgz"},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.21":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.21","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.16","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"_id":"@npm%2fnpm-registry-client@0.2.21","dist":{"shasum":"d85dd32525f193925c46ff9eb0e0f529dfd1b254","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.21.tgz"},"_from":".","_npmVersion":"1.2.18","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.22":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.22","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.20.0","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"_id":"@npm%2fnpm-registry-client@0.2.22","dist":{"shasum":"caa22ff40a1ccd632a660b8b80c333c8f92d5a17","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.22.tgz"},"_from":".","_npmVersion":"1.2.18","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.23":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.23","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.20.0","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"_id":"@npm%2fnpm-registry-client@0.2.23","dist":{"shasum":"a320ab2b1d048b4f7b88e40bd86974ca322b4c24","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.23.tgz"},"_from":".","_npmVersion":"1.2.19","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.24":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.24","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.20.0","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"_id":"@npm%2fnpm-registry-client@0.2.24","dist":{"shasum":"e12f644338619319ee7f233363a1714a87f3c72d","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.24.tgz"},"_from":".","_npmVersion":"1.2.22","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.25":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.25","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.20.0","graceful-fs":"~1.2.0","semver":"~2.0.5","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"_id":"@npm%2fnpm-registry-client@0.2.25","dist":{"shasum":"c2caeb1dcf937d6fcc4a187765d401f5e2f54027","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.25.tgz"},"_from":".","_npmVersion":"1.2.32","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.26":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.26","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.20.0","graceful-fs":"~1.2.0","semver":"~2.0.5","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"_id":"@npm%2fnpm-registry-client@0.2.26","dist":{"shasum":"4c5a2b3de946e383032f10fa497d0c15ee5f4c60","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.26.tgz"},"_from":".","_npmVersion":"1.3.1","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.27":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.27","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.20.0","graceful-fs":"~2.0.0","semver":"~2.0.5","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"_id":"@npm%2fnpm-registry-client@0.2.27","dist":{"shasum":"8f338189d32769267886a07ad7b7fd2267446adf","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.27.tgz"},"_from":".","_npmVersion":"1.3.2","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.28":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.28","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"~2.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"_id":"@npm%2fnpm-registry-client@0.2.28","dist":{"shasum":"959141fc0180d7b1ad089e87015a8a2142a8bffc","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.28.tgz"},"_from":".","_npmVersion":"1.3.6","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.29":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.29","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.2.29","dist":{"shasum":"66ff2766f0c61d41e8a6139d3692d8833002c686","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.29.tgz"},"_from":".","_npmVersion":"1.3.12","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.30":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.30","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.2.30","dist":{"shasum":"f01cae5c51aa0a1c5dc2516cbad3ebde068d3eaa","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.30.tgz"},"_from":".","_npmVersion":"1.3.14","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.31":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.31","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.2.31","dist":{"shasum":"24a23e24e43246677cb485f8391829e9536563d4","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.31.tgz"},"_from":".","_npmVersion":"1.3.17","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.3.0":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.3.0","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.3.0","dist":{"shasum":"66eab02a69be67f232ac14023eddfb8308c2eccd","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.3.0.tgz"},"_from":".","_npmVersion":"1.3.18","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.3.1":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.3.1","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.3.1","dist":{"shasum":"16dba07cc304442edcece378218672d0a1258ef8","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.3.1.tgz"},"_from":".","_npmVersion":"1.3.18","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.3.2":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.3.2","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.3.2","dist":{"shasum":"ea3060bd0a87fb1d97b87433b50f38f7272b1686","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.3.2.tgz"},"_from":".","_npmVersion":"1.3.20","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.3.3":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.3.3","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.3.3","dist":{"shasum":"da08bb681fb24aa5c988ca71f8c10f27f09daf4a","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.3.3.tgz"},"_from":".","_npmVersion":"1.3.21","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.3.4":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.3.4","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.3.4","dist":{"shasum":"25d771771590b1ca39277aea4506af234c5f4342","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.3.4.tgz"},"_from":".","_npmVersion":"1.3.25","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.3.5":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.3.5","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.3.5","dist":{"shasum":"98ba1ac851a3939a3fb9917c28fa8da522dc635f","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.3.5.tgz"},"_from":".","_npmVersion":"1.3.25","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.3.6":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.3.6","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.3.6","dist":{"shasum":"c48a2a03643769acc49672860f7920ec6bffac6e","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.3.6.tgz"},"_from":".","_npmVersion":"1.3.26","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.4.0":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.0","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.0","dist":{"shasum":"30d0c178b7f2e54183a6a3fc9fe4071eb10290bf","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.0.tgz"},"_from":".","_npmVersion":"1.3.26","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.4.1":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.1","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.1","dist":{"shasum":"9c49b3e44558e2072158fb085be8a083c5f83537","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.1.tgz"},"_from":".","_npmVersion":"1.4.0","_npmUser":{"name":"npm-www","email":"npm@npmjs.com"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.4.2":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.2","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.2","dist":{"shasum":"d9568a9413bee14951201ce73f3b3992ec6658c0","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.2.tgz"},"_from":".","_npmVersion":"1.4.1","_npmUser":{"name":"npm-www","email":"npm@npmjs.com"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.4.3":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.3","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.3","dist":{"shasum":"aa188fc5067158e991a57f4697c54994108f5389","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.3.tgz"},"_from":".","_npmVersion":"1.4.2","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.4.4":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.4","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.4","dist":{"shasum":"f9dbc383a49069d8c7f67755a3ff6e424aff584f","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.4.tgz"},"_from":".","_npmVersion":"1.4.2","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.4.5":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.5","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.5","dist":{"shasum":"7d6fdca46139470715f9477ddb5ad3e770d4de7b","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.5.tgz"},"_from":".","_npmVersion":"1.4.4","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.4.6":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.6","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.6","_from":".","_npmVersion":"1.4.6","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"657f69a79543fc4cc264c3b2de958bd15f7140fe","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.6.tgz"},"directories":{}},"0.4.7":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.7","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.7","dist":{"shasum":"f4369b59890da7882527eb7c427dd95d43707afb","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.7.tgz"},"_from":".","_npmVersion":"1.4.6","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.4.8":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.8","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.8","_shasum":"a6685a161033101be6064b7af887ab440e8695d0","_from":".","_npmVersion":"1.4.8","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"a6685a161033101be6064b7af887ab440e8695d0","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.8.tgz"},"directories":{}},"0.4.9":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.9","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.9","_shasum":"304d3d4726a58e33d8cc965afdc9ed70b996580c","_from":".","_npmVersion":"1.4.10","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"304d3d4726a58e33d8cc965afdc9ed70b996580c","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.9.tgz"},"directories":{}},"0.4.10":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.10","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.10","_shasum":"ab7bf1be3ba07d769eaf74dee3c9347e02283116","_from":".","_npmVersion":"1.4.10","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"ab7bf1be3ba07d769eaf74dee3c9347e02283116","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.10.tgz"},"directories":{}},"0.4.11":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.11","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"2 >=2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.11","_shasum":"032e9b6b050ed052ee9441841a945a184ea6bc33","_from":".","_npmVersion":"1.4.10","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"032e9b6b050ed052ee9441841a945a184ea6bc33","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.11.tgz"},"directories":{}},"0.4.12":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.12","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"2 >=2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.12","_shasum":"34303422f6a3da93ca3a387a2650d707c8595b99","_from":".","_npmVersion":"1.4.10","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"34303422f6a3da93ca3a387a2650d707c8595b99","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.12.tgz"},"directories":{}},"1.0.0":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"1.0.0","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"~2.0.0","mkdirp":"~0.3.3","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@1.0.0","_shasum":"2a6f9dfdce5f8ebf4b9af4dbfd738384d25014e5","_from":".","_npmVersion":"1.4.10","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"2a6f9dfdce5f8ebf4b9af4dbfd738384d25014e5","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-1.0.0.tgz"},"directories":{}},"1.0.1":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"1.0.1","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"~2.0.0","mkdirp":"~0.3.3","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"98b1278c230cf6c159f189e2f8c69daffa727ab8","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@1.0.1","_shasum":"c5f6a87d285f2005a35d3f67d9c724bce551b0f1","_from":".","_npmVersion":"1.4.13","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"c5f6a87d285f2005a35d3f67d9c724bce551b0f1","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-1.0.1.tgz"},"directories":{}},"2.0.0":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"2.0.0","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"~2.0.0","mkdirp":"~0.3.3","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"47a98069b6a34e751cbd5b84ce92858cae5abe70","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@2.0.0","_shasum":"88810dac2d534c0df1d905c79e723392fcfc791a","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"88810dac2d534c0df1d905c79e723392fcfc791a","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-2.0.0.tgz"},"directories":{}},"2.0.1":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"2.0.1","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"~0.3.3","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"123e40131f83f7265f66ecd2a558cce44a3aea86","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@2.0.1","_shasum":"611c7cb7c8f7ff22be2ebc6398423b5de10db0e2","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"611c7cb7c8f7ff22be2ebc6398423b5de10db0e2","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-2.0.1.tgz"},"directories":{}},"2.0.2":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"2.0.2","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"~0.3.3","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"6ecc311c9dd4890f2d9b6bae60447070a3321e12","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@2.0.2","_shasum":"a82b000354c7f830114fb18444764bc477d5740f","_from":".","_npmVersion":"1.4.15","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"a82b000354c7f830114fb18444764bc477d5740f","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-2.0.2.tgz"},"directories":{}},"3.0.0":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"3.0.0","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"~0.3.3","normalize-package-data":"^0.4.0","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"6bb1aec1e85fa82ee075bd997d6fb9f2dbb7f643","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@3.0.0","_shasum":"4febc5cdb274e9fa06bc3008910e3fa1ec007994","_from":".","_npmVersion":"1.5.0-pre","_npmUser":{"name":"othiym23","email":"ogd@aoaioxxysz.net"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"4febc5cdb274e9fa06bc3008910e3fa1ec007994","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-3.0.0.tgz"},"directories":{}},"3.0.1":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"3.0.1","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"~0.3.3","normalize-package-data":"^0.4.0","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"fe8382dde609ea1e3580fcdc5bc3d0bba119cfc6","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@3.0.1","_shasum":"5f3ee362ce5c237cfb798fce22c77875fc1a63c2","_from":".","_npmVersion":"1.5.0-alpha-1","_npmUser":{"name":"othiym23","email":"ogd@aoaioxxysz.net"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"5f3ee362ce5c237cfb798fce22c77875fc1a63c2","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-3.0.1.tgz"},"directories":{}},"2.0.3":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"2.0.3","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"~0.3.3","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"2578fb9a807d77417554ba235ba8fac39405e832","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@2.0.3","_shasum":"93dad3d9a162c99404badb71739c622c0f3b9a72","_from":".","_npmVersion":"1.5.0-alpha-1","_npmUser":{"name":"othiym23","email":"ogd@aoaioxxysz.net"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"93dad3d9a162c99404badb71739c622c0f3b9a72","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-2.0.3.tgz"},"directories":{}},"3.0.2":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"3.0.2","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"~0.3.3","normalize-package-data":"^0.4.0","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"15343019160ace0b9874cf0ec186b3425dbc7301","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@3.0.2","_shasum":"5dd0910157ce55f4286a1871d39f9a2128cd3c99","_from":".","_npmVersion":"1.5.0-alpha-2","_npmUser":{"name":"othiym23","email":"ogd@aoaioxxysz.net"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"5dd0910157ce55f4286a1871d39f9a2128cd3c99","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-3.0.2.tgz"},"directories":{}},"3.0.3":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"3.0.3","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"~0.3.3","normalize-package-data":"^0.4.0","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1 || 3.x","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"b18a780d1185f27c06c27812147b83aba0d4a2f5","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@3.0.3","_shasum":"2377dc1cf69b4d374b3a95fb7feba8c804d8cb30","_from":".","_npmVersion":"2.0.0-alpha-5","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"2377dc1cf69b4d374b3a95fb7feba8c804d8cb30","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-3.0.3.tgz"},"directories":{}},"3.0.4":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"3.0.4","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"~0.5.0","normalize-package-data":"^0.4.0","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1 || 3.x","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"54900fe4b2eb5b99ee6dfe173f145732fdfae80e","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@3.0.4","_shasum":"d4a177d1f25615cfaef9b6844fa366ffbf5f578a","_from":".","_npmVersion":"2.0.0-alpha-5","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"d4a177d1f25615cfaef9b6844fa366ffbf5f578a","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-3.0.4.tgz"},"directories":{}},"3.0.5":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"3.0.5","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"0.5","normalize-package-data":"0.4","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"2","semver":"2 >=2.2.1 || 3.x","slide":"^1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"635db1654346bc86473df7b39626601425f46177","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@3.0.5","_shasum":"cdabaefa399b81ac8a86a48718aefd80e7b19ff3","_from":".","_npmVersion":"2.0.0-alpha-5","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"cdabaefa399b81ac8a86a48718aefd80e7b19ff3","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-3.0.5.tgz"},"directories":{}},"3.0.6":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"3.0.6","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"^0.5.0","normalize-package-data":"0.4","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"2","semver":"2 >=2.2.1 || 3.x","slide":"^1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"ISC","gitHead":"eba30fadd724ed5cad1aec95ac3ee907a59b7317","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@3.0.6","_shasum":"14a17d9a60ed2a80b04edcbc596dbce0d96540ee","_from":".","_npmVersion":"1.4.22","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"14a17d9a60ed2a80b04edcbc596dbce0d96540ee","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-3.0.6.tgz"},"directories":{}},"2.0.4":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"2.0.4","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"^0.5.0","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"ISC","gitHead":"a10f621d9cdc813b9d3092a14b661f65bfa6d40d","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@2.0.4","_shasum":"528e08900d7655c12096d1637d1c3a7a5b451019","_from":".","_npmVersion":"1.4.22","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"528e08900d7655c12096d1637d1c3a7a5b451019","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-2.0.4.tgz"},"directories":{}}},"readme":"# npm-registry-client\u000a\u000aThe code that npm uses to talk to the registry.\u000a\u000aIt handles all the caching and HTTP calls.\u000a\u000a## Usage\u000a\u000a```javascript\u000avar RegClient = require('npm-registry-client')\u000avar client = new RegClient(config)\u000avar uri = \"npm://registry.npmjs.org/npm\"\u000avar options = {timeout: 1000}\u000a\u000aclient.get(uri, options, function (error, data, raw, res) {\u000a // error is an error if there was a problem.\u000a // data is the parsed data object\u000a // raw is the json string\u000a // res is the response from couch\u000a})\u000a```\u000a\u000a# Registry URLs\u000a\u000aThe registry calls take either a full URL pointing to a resource in the\u000aregistry, or a base URL for the registry as a whole (for the base URL, any path\u000awill be ignored). In addition to `http` and `https`, `npm` URLs are allowed.\u000a`npm` URLs are `https` URLs with the additional restrictions that they will\u000aalways include authorization credentials, and the response is always registry\u000ametadata (and not tarballs or other attachments).\u000a\u000a# Configuration\u000a\u000aThis program is designed to work with\u000a[npmconf](https://npmjs.org/package/npmconf), but you can also pass in\u000aa plain-jane object with the appropriate configs, and it'll shim it\u000afor you. Any configuration thingie that has get/set/del methods will\u000aalso be accepted.\u000a\u000a* `cache` **Required** {String} Path to the cache folder\u000a* `always-auth` {Boolean} Auth even for GET requests.\u000a* `auth` {String} A base64-encoded `username:password`\u000a* `email` {String} User's email address\u000a* `tag` {String} The default tag to use when publishing new packages.\u000a Default = `\"latest\"`\u000a* `ca` {String} Cerficate signing authority certificates to trust.\u000a* `cert` {String} Client certificate (PEM encoded). Enable access\u000a to servers that require client certificates\u000a* `key` {String} Private key (PEM encoded) for client certificate 'cert'\u000a* `strict-ssl` {Boolean} Whether or not to be strict with SSL\u000a certificates. Default = `true`\u000a* `user-agent` {String} User agent header to send. Default =\u000a `\"node/{process.version} {process.platform} {process.arch}\"`\u000a* `log` {Object} The logger to use. Defaults to `require(\"npmlog\")` if\u000a that works, otherwise logs are disabled.\u000a* `fetch-retries` {Number} Number of times to retry on GET failures.\u000a Default=2\u000a* `fetch-retry-factor` {Number} `factor` setting for `node-retry`. Default=10\u000a* `fetch-retry-mintimeout` {Number} `minTimeout` setting for `node-retry`.\u000a Default=10000 (10 seconds)\u000a* `fetch-retry-maxtimeout` {Number} `maxTimeout` setting for `node-retry`.\u000a Default=60000 (60 seconds)\u000a* `proxy` {URL} The url to proxy requests through.\u000a* `https-proxy` {URL} The url to proxy https requests through.\u000a Defaults to be the same as `proxy` if unset.\u000a* `_auth` {String} The base64-encoded authorization header.\u000a* `username` `_password` {String} Username/password to use to generate\u000a `_auth` if not supplied.\u000a* `_token` {Object} A token for use with\u000a [couch-login](https://npmjs.org/package/couch-login)\u000a\u000a# client.request(method, uri, options, cb)\u000a\u000a* `method` {String} HTTP method\u000a* `uri` {String} URI pointing to the resource to request\u000a* `options` {Object} Object containing optional per-request properties.\u000a * `what` {Stream | Buffer | String | Object} The request body. Objects\u000a that are not Buffers or Streams are encoded as JSON.\u000a * `etag` {String} The cached ETag\u000a * `follow` {Boolean} Follow 302/301 responses (defaults to true)\u000a* `cb` {Function}\u000a * `error` {Error | null}\u000a * `data` {Object} the parsed data object\u000a * `raw` {String} the json\u000a * `res` {Response Object} response from couch\u000a\u000aMake a request to the registry. All the other methods are wrappers around\u000a`request`.\u000a\u000a# client.adduser(base, username, password, email, cb)\u000a\u000a* `base` {String} Base registry URL\u000a* `username` {String}\u000a* `password` {String}\u000a* `email` {String}\u000a* `cb` {Function}\u000a\u000aAdd a user account to the registry, or verify the credentials.\u000a\u000a# client.deprecate(uri, version, message, cb)\u000a\u000a* `uri` {String} Full registry URI for the deprecated package\u000a* `version` {String} Semver version range\u000a* `message` {String} The message to use as a deprecation warning\u000a* `cb` {Function}\u000a\u000aDeprecate a version of a package in the registry.\u000a\u000a# client.bugs(uri, cb)\u000a\u000a* `uri` {String} Full registry URI for the package\u000a* `cb` {Function}\u000a\u000aGet the url for bugs of a package\u000a\u000a# client.get(uri, options, cb)\u000a\u000a* `uri` {String} The complete registry URI to fetch\u000a* `options` {Object} Object containing optional per-request properties.\u000a * `timeout` {Number} Duration before the request times out.\u000a * `follow` {Boolean} Follow 302/301 responses (defaults to true)\u000a * `staleOk` {Boolean} If there's cached data available, then return that\u000a to the callback quickly, and update the cache the background.\u000a\u000aFetches data from the registry via a GET request, saving it in the cache folder\u000awith the ETag.\u000a\u000a# client.publish(uri, data, tarball, cb)\u000a\u000a* `uri` {String} The registry URI to publish to\u000a* `data` {Object} Package data\u000a* `tarball` {String | Stream} Filename or stream of the package tarball\u000a* `cb` {Function}\u000a\u000aPublish a package to the registry.\u000a\u000aNote that this does not create the tarball from a folder. However, it can\u000aaccept a gzipped tar stream or a filename to a tarball.\u000a\u000a# client.star(uri, starred, cb)\u000a\u000a* `uri` {String} The complete registry URI to star\u000a* `starred` {Boolean} True to star the package, false to unstar it.\u000a* `cb` {Function}\u000a\u000aStar or unstar a package.\u000a\u000aNote that the user does not have to be the package owner to star or unstar a\u000apackage, though other writes do require that the user be the package owner.\u000a\u000a# client.stars(base, username, cb)\u000a\u000a* `base` {String} The base URL for the registry\u000a* `username` {String} Name of user to fetch starred packages for.\u000a* `cb` {Function}\u000a\u000aView your own or another user's starred packages.\u000a\u000a# client.tag(uri, version, tag, cb)\u000a\u000a* `uri` {String} The complete registry URI to tag\u000a* `version` {String} Version to tag\u000a* `tag` {String} Tag name to apply\u000a* `cb` {Function}\u000a\u000aMark a version in the `dist-tags` hash, so that `pkg@tag` will fetch the\u000aspecified version.\u000a\u000a# client.unpublish(uri, [ver], cb)\u000a\u000a* `uri` {String} The complete registry URI to unpublish\u000a* `ver` {String} version to unpublish. Leave blank to unpublish all\u000a versions.\u000a* `cb` {Function}\u000a\u000aRemove a version of a package (or all versions) from the registry. When the\u000alast version us unpublished, the entire document is removed from the database.\u000a\u000a# client.upload(uri, file, [etag], [nofollow], cb)\u000a\u000a* `uri` {String} The complete registry URI to upload to\u000a* `file` {String | Stream} Either the filename or a readable stream\u000a* `etag` {String} Cache ETag\u000a* `nofollow` {Boolean} Do not follow 301/302 responses\u000a* `cb` {Function}\u000a\u000aUpload an attachment. Mostly used by `client.publish()`.\u000a","maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"time":{"modified":"2014-07-31T21:59:52.896Z","created":"2012-06-07T04:43:36.581Z","0.0.1":"2012-06-07T04:43:38.123Z","0.0.2":"2012-06-07T05:35:05.937Z","0.0.3":"2012-06-09T00:55:25.861Z","0.0.4":"2012-06-11T03:53:26.548Z","0.0.5":"2012-06-11T23:48:11.235Z","0.0.6":"2012-06-17T06:23:27.320Z","0.0.7":"2012-06-18T19:19:38.315Z","0.0.8":"2012-06-28T20:40:20.563Z","0.0.9":"2012-07-10T03:28:04.651Z","0.0.10":"2012-07-11T17:03:45.151Z","0.0.11":"2012-07-17T14:06:37.489Z","0.1.0":"2012-07-23T18:17:38.007Z","0.1.1":"2012-07-23T21:21:28.196Z","0.1.2":"2012-07-24T06:14:12.831Z","0.1.3":"2012-08-07T02:02:20.564Z","0.1.4":"2012-08-15T03:04:52.822Z","0.1.5":"2012-08-17T21:59:33.310Z","0.2.0":"2012-08-17T22:00:18.081Z","0.2.1":"2012-08-17T22:07:28.827Z","0.2.2":"2012-08-17T22:37:24.352Z","0.2.3":"2012-08-19T19:16:44.808Z","0.2.4":"2012-08-19T19:18:51.792Z","0.2.5":"2012-08-20T16:54:50.794Z","0.2.6":"2012-08-22T00:25:04.766Z","0.2.7":"2012-08-27T19:07:34.829Z","0.2.8":"2012-10-02T19:53:50.661Z","0.2.9":"2012-10-03T22:09:50.766Z","0.2.10":"2012-10-25T14:55:54.216Z","0.2.11":"2012-12-21T16:26:38.094Z","0.2.12":"2013-01-18T22:22:41.668Z","0.2.13":"2013-02-06T00:16:35.939Z","0.2.14":"2013-02-10T02:44:02.764Z","0.2.15":"2013-02-11T19:18:55.678Z","0.2.16":"2013-02-15T17:09:03.249Z","0.2.17":"2013-02-16T03:47:13.898Z","0.2.18":"2013-03-06T22:09:23.536Z","0.2.19":"2013-03-20T06:27:39.128Z","0.2.20":"2013-03-28T00:43:07.558Z","0.2.21":"2013-04-29T15:46:54.094Z","0.2.22":"2013-04-29T15:51:02.178Z","0.2.23":"2013-05-11T00:28:14.198Z","0.2.24":"2013-05-24T21:27:50.693Z","0.2.25":"2013-06-20T15:36:46.277Z","0.2.26":"2013-07-06T17:12:54.670Z","0.2.27":"2013-07-11T07:14:45.740Z","0.2.28":"2013-08-02T20:27:41.732Z","0.2.29":"2013-10-28T18:23:24.477Z","0.2.30":"2013-11-18T23:12:00.540Z","0.2.31":"2013-12-16T08:36:43.044Z","0.3.0":"2013-12-17T07:03:10.699Z","0.3.1":"2013-12-17T16:53:27.867Z","0.3.2":"2013-12-17T22:25:14.882Z","0.3.3":"2013-12-21T16:07:06.773Z","0.3.4":"2014-01-29T15:24:05.163Z","0.3.5":"2014-01-31T01:53:19.656Z","0.3.6":"2014-02-07T00:17:21.362Z","0.4.0":"2014-02-13T01:17:18.973Z","0.4.1":"2014-02-13T23:47:37.892Z","0.4.2":"2014-02-14T00:29:13.086Z","0.4.3":"2014-02-16T03:40:54.640Z","0.4.4":"2014-02-16T03:41:48.856Z","0.4.5":"2014-03-12T05:09:17.474Z","0.4.6":"2014-03-29T19:44:15.041Z","0.4.7":"2014-04-02T19:41:07.149Z","0.4.8":"2014-05-01T22:24:54.980Z","0.4.9":"2014-05-12T21:52:55.127Z","0.4.10":"2014-05-13T16:44:29.801Z","0.4.11":"2014-05-13T20:33:04.738Z","0.4.12":"2014-05-14T06:14:22.842Z","1.0.0":"2014-05-14T23:04:37.188Z","1.0.1":"2014-06-03T00:55:54.448Z","2.0.0":"2014-06-06T04:23:46.579Z","2.0.1":"2014-06-06T06:25:14.419Z","2.0.2":"2014-06-14T00:33:10.205Z","3.0.0":"2014-07-02T00:30:29.154Z","3.0.1":"2014-07-14T23:29:05.057Z","2.0.3":"2014-07-15T00:09:36.043Z","3.0.2":"2014-07-17T06:30:02.659Z","3.0.3":"2014-07-23T21:20:42.406Z","3.0.4":"2014-07-25T00:27:26.007Z","3.0.5":"2014-07-25T00:28:48.007Z","3.0.6":"2014-07-31T21:57:49.043Z","2.0.4":"2014-07-31T21:59:52.896Z"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"repository":{"url":"git://github.com/isaacs/npm-registry-client"},"users":{"fgribreau":true,"fengmk2":true},"readmeFilename":"README.md","homepage":"https://github.com/isaacs/npm-registry-client","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"license":"ISC","_attachments":{}} diff --git a/deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/1.3.3/cache.json b/deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/1.3.3/cache.json deleted file mode 100644 index 01da3002763..00000000000 --- a/deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/1.3.3/cache.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.3.3","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"underscore@1.3.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"47ac53683daf832bfa952e1774417da47817ae42","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.3.3.tgz"},"readme":" __ \n /\\ \\ __ \n __ __ ___ \\_\\ \\ __ _ __ ____ ___ ___ _ __ __ /\\_\\ ____ \n /\\ \\/\\ \\ /' _ `\\ /'_ \\ /'__`\\/\\ __\\/ ,__\\ / ___\\ / __`\\/\\ __\\/'__`\\ \\/\\ \\ /',__\\ \n \\ \\ \\_\\ \\/\\ \\/\\ \\/\\ \\ \\ \\/\\ __/\\ \\ \\//\\__, `\\/\\ \\__//\\ \\ \\ \\ \\ \\//\\ __/ __ \\ \\ \\/\\__, `\\\n \\ \\____/\\ \\_\\ \\_\\ \\___,_\\ \\____\\\\ \\_\\\\/\\____/\\ \\____\\ \\____/\\ \\_\\\\ \\____\\/\\_\\ _\\ \\ \\/\\____/\n \\/___/ \\/_/\\/_/\\/__,_ /\\/____/ \\/_/ \\/___/ \\/____/\\/___/ \\/_/ \\/____/\\/_//\\ \\_\\ \\/___/ \n \\ \\____/ \n \\/___/\n \nUnderscore.js is a utility-belt library for JavaScript that provides \nsupport for the usual functional suspects (each, map, reduce, filter...) \nwithout extending any core JavaScript objects.\n\nFor Docs, License, Tests, and pre-packed downloads, see:\nhttp://documentcloud.github.com/underscore/\n\nMany thanks to our contributors:\nhttps://github.com/documentcloud/underscore/contributors\n","maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}} \ No newline at end of file diff --git a/deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/1.3.3/package.tgz b/deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/1.3.3/package.tgz deleted file mode 100644 index 19da9baa7fb191637b058d52d7f1c94a67e2196e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58692 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ÃI;>WePy3^COVU>l<1G#2mJg{#h<-54}62@OySqT(3m4{3Px!Rm?*X(81X z?|{7cI5cu(R9roRs`xl|VOh~(b&xNvf~ zMU}<7R@RiLxc1^hzZ&-Sv*(DYxWA^=XP&@n;MB#(4ayhq?8$CP!^hL@x>gvRwe~uH z!t2h0yxgh=;Jomxi_z&3c;9GyyEtS${X4$%mZmYhxx&W6XW zH}CMJ&Y^W)qi{@pIcFJ&3R8vBOmtxYuSrFwahWs=O!Yoo4WES;G6?GM@|abFo=bniL8j?G$PAp(Rl0ghXO;EL;^ltUM7 zIE8Thxbrle0INcMF^6Xk89FD^PCalX^-%X_1X2OudaMRoeaQLhJujmM)!QD# z+Tc?gYu*1cF!>Cylp*JRP*nbbcA@o_o`5h+z8h#@snLkay%%Xm^?#zi4s%RC2hr-i z7rX+s+a6>_V99Rji>dGG+&+RHJ&*h@M(azWEZoqweOYbwP`?u zIjZl!ky_fo+rSUTPiqg(z&pSU{7lBA^x%{hLiO%p-R<4iia}%lfyNi;dm$;1v)5PJ zfB5%Q80>N1e<)qGK0osUr3I}XflLleE!m%ve}ygDUyaFS405LU?1ZQxUDt)um^7T) zqj4HHb7W@`5|{5ls1s?`^PA}*c!v8q(@j&yW86nz8>*6tPow|Oz&X$A_%ud%-Tjo- zSIw8E0TRd)Df#@Ry}={^x5ObUa%@p_|_ ze-;bh(?|)xxFWsR1s{d{aG?)5nx+EBBr`xPiAr3z55#$4p{o};`qy8>CxHF6&M3kc zH%tTd{$I-?J0e`T6cFh{n63tS*#w?`mQXJs)Q7-Z_58evD?K{Cb$2JQRz)xHNjRc< zcSj?jKRRCh?1@QiVA`+h%NMTxFRzc!k(!7$ib~n(k*2PXQVLV!W=v*uwYtNb*fkVN zXms^oPh9=i6US9YS6Lg9*i`=^KcmK1yMgQ2+N(W%L2D20)cE{?{XZfr>hN@dCaxc$ zB0>J9wtp0}7NCF~{oJPVcF~`p8c2Y8RfE;|5^<^1;Oi&mj@|U1t9&_*h^pOjC%GZ^MAF-SSsC#~bNT2FtV`rRkZZa>{E0l8f0 zn~NppwE?iJztsbW5XY}55Vei~FCvZoPc%oMfVu+iFOa9%7W9--?FcX{pxN$+VFwBj zOW^+2FML)y2EcXzISkd%w`#`#Y#ll#6-hSE8(2!lI`2UXi_!jjYjbJmOSI#t$ z064vixAd@bSa4XqeB1(vdxw0|e9R5K4+Rg^Le?&*;ZWr`C!*f^MYoN}$d2G|QIlF9 zNu#t9_en}I1Xf7#!|o&qq;p|PFAS{T@fJ?&d7_oIUAL(%>5Y=H-%cP-f-@GunNPI{ zawampjmxrX^a{)_Xv~pENVq4{n}P#unyrrRag%cuw{oOUZf{}z|LP!vH`y5u>u}<~ zh~g_pcKnO@qV(BKV?|S!E!op*yDCGK>;eX$Nues7LA2P*nbm|B%9AY;v!YSvvbF9y zm^-V_B)5Dw8F^Bn%DBPNVg&_U6E{mZ*JSN7gTo!o%v`I^O=wk;%Z!cPu(SRM@~TfP zgZ^{dULnqRv$>o;rHz2~BeU@-yR%W2Mv&)Zt^--t3u?b4vRgu;iE`Ykn|%s);uWz6 zWjX`K*pxCyR=!+cXpk>u8b7kACJ(}u&gy8UC`T`ni_j(eT?)c-fI0zGd063YJ78fV zE;5{7ogs+ajY%pC!`Fp|^*T@pe4tN#Mq*gaXUT9k#_~5FBmhU6M_Pg=cWQy?yL*Pv zVus$mKABa-?--*$H9If+uy;BLOA@rhio+_>e=NyMneD7S1b!tqNF+zVoj5=<&*B$j zg!;s^B(gP^#qyn6&upcP3~M0c;8uIkF=`*hZxt@?s^+PkNpBgKpr(`qPQ#fSEppPt zxbMuFpzI3;5+}R|qRNq+Val)dG65Nhbkcp_kyD64wF>;8%Uu<2wr*q`WC>-TMu>m% zZJOm$I&exlch@d9=5RtM`#kArvtp8|5BT?tZ^GP%kGhv}n97>;vnE7}InX3dEyxEk zWsGrIx3Brz@Z~bSA;4QZxJm!Xlq&wT?)@!wRM`~SVNTU$^9|xs`iiq&eg_|o61c}p zE!*_Wg7HS@EUf4mSs1FE;W4 z#Q9iex3*z0_ig)F9q!uVPzwi$MZg7e8YL1a5{t4J2Zaf>YC%O`Gu?+imH8-Q)s~Pd zN@WZt=dZ&G@mbIhyOC??-q3Qg+rL}evqnQ(JFuEELsCAfVd2Elm|#i#*!Zl6qgqnK zZ?!d$Xc}T~MF4AADpo(gf-gx{3GY7_8G`i$MWaGb1E@oldMw{tP`SvjA#R!YUaZK> z?;i@~!Fb80#y~JATa{4j_hVXGez_+{fw$Y~d|xu5Ov+4N_Ky=xm>Q|f)fXnjNDGRB z3==%%3!0nHYV@7s8HiTI@|J{~F@A%y&KHjjObhjXHDbNCL7)PokI4WAu@q0$rE(zY ziLMx-bw}O%mXzk!joEU#EEs&>YENsV0A1zjMD0tM!cq~=NG>jDD)hgJsBz3;P5%w5 zjoKaJzn!;2rRh?@I_xJZU}74pq}UXk<4Xz$g$_OJzown64wiSnhlE2Z^($^AMEwiL zT5cDGayy&2edC9|x-WXf90cpP!*f+EYYfVDoa_10rIgA9JI*XJ34z2A(=q~_MK7A> z;+~S(y*TO>KVMi%cRI{*)5SlO&`>QfV9+$U2lN>wX1yXRl$` zD$Ae9HsepHqe3LV+|B4v@N_m%()A_<$T-_9IAfY%Q&rwpXF82NF80!V=h8@-2w(0> zctfSDZz%{2f_U0sd7wdKXM80jF1Isc)AvTr*TqJA!J3&dr%mj-!-#)68C{5!fL=KR z)}Um!tw)716+g>%+4L?@y_bGS91236e2eZHe6o4@K+bte0#i-4`lgY(TNB|Y#1HfQ zWVnZE7K9B2et8_&+FNLNHrFIKpAX(3eI+<~6K>#5((8P`vXC4!nXyF#KM$?Jf0MAB+`CLj|+gDfXq+ zN3~5bwk0(+B)fGHverp<{a2HzH;D$5CvQ#Cv0gVEFeJJ!YQ2}EegV(=wa=W&lleo8cC?8G}M}bn4d=r)SC#XoQz@G=`<&Q#bV*`PE?ndDoI0&X$$@#W9gPst)tVpqkAo3% z+$0L-uHP0(Sob7+`%Ue=NZq{orrG!}C2!Yio-KdDeQnyVb4M0r%-0=LebyUxnr${1 zcGzuwtgi4R^ufBrXv}3sZ7VbAF`G+`+f--PqS2e#|B_(V1i^w@#9x^^V?YlOAL|Ac zpKLn*<+gGsOTw|(F=OQAJ+)@kXzPuDQt`l@;V@%zFbu&}f_ji($)JCoiksu8rC4gz zcIZAZU*^s1v^HN(b)>j5KZVmpyxo{YCHVBR!f8E0GFwa0QZbjy zWH(#WA2X-FM`N{_s-P||i^*cKo~r1LiQSa3uftOMAH+ZCm6`3@imn_kyV**Ll8VHC zOr1*c+IHPc7K_bP4Rv$bKZcR8xh#z&_5abGqUCd*@&7N9qU1A)(`w!$uJEtw|IY?I zbGg~o|5vg8m_+SPrx(Pk&r7r6IR8+IX6XCSyV_isVLH#u`jp+S`dJ>0$UlFMrj^&2Ql z4hA2C1(GanT2$y+BGzUt`%g=>XT(v@hIULPx|fhL14x2R>HP*?HTbU_0| zRnm228j4DhS#-$}r_hR`eWXn|?~t7`LLE6ayzRrSiF_VXdRmQosF0Bkgi%3!(d6ar z#wLm-qCt4atD0EK>1bDw1?ir$w%0zM$Ae@&l~%F^hdAZw4I2I3pD%5mj!u_*>DWz@ zY=654|7Z@)nyrB&gdj?eJL)K_eil7oc3UULpXgd{6-w@{Tl&Y^(w1LfaAO5$DMx zW>8D5?YXT1q<=7eNx%$9f70u)meB-(b^E5a#LQ8K4bPr)zP6u(XYwvCRi;lNB$kJR zJsvT~VFiC%HuMZcD~lrKc-tjr;}h_j174Wxw8pgc8YAj@^%1pw z`l!*m?NM}SoqbHz+iiAW4=wb+x^-knt?w`02U-Yuin$r-=|2=M>)77ftNTax7>V?z ze~twVk95&K=zEK(+ikR&JjDI+7nuN_*ai3VqcxGo*=F^NJ&7~HBZ2P)=7s%!wkz~V z$vNg7>jh#m5z6`dN&u~vgb2B4*+lr{-$|Dvr~7&GA4o~e8Tcc zr;`B*Ekh+Z$$v3!`&mQNhyET9A#@_-{0$l6QzmJ?y|gkMAs+tA>JBTi{Dml>FgTvi zsiG<5(gKQ<>R1Bk+K_@+Ce&@q<$I%o(I2 znHH}DB=)n!F|mwnbACAfW}%Dm!PoYf&DVcQCpYw_9{St4$hj`cMLN|Pf}L{OA;}Y2 z+#mGY7o?k81lo(eN7iRU9se8#7rf@1=<6{@Q-MC78;6 zGNbyKC1rj6U5P=$noAAi$0vHr>EEYEpH@w0i2e$Rgj=wFe}>VH^6dV zUbqg5qNUsS#bBcI=r_MV`~rIgVI?TW{d^IHhF8{9L^08b_0M)9>SZA}VlOjcbX0eC zNe^{UpHC4yGM4hW*NS$<{ zVgmcX6lbn5I8ISOZDo9WJqDv+ZZ)|8}2f-{*0)IV3^l zfl8EvcYkg8heXX+ba%WbP>Iua_@VZ(0Kt7+%epP6B*}aSqc!M8XU*w-RNk$}WfOpT z#5$HS1=nFi;tP}b5!vpdQGPI!+U=J6_MMA7L$F8pv}XX+2LB7f>bE_EX&#=#i#Us5 zv3x#Ll#egGW2>9@WIsObsp{{ZO~uo`6f#z1^V>tmCva6?vE5E_u{21}n?Uq%Y}vKFkHt*YWcehR~xO z-h7+E>nZwlTtrR3`KC~4-NWX%x%8{Ld_?rczZkF|Yd45H5cHCzOiAWhT8Ws(Yx7*9 z!^<`q;9sNd4d{NEy*{QhFaWUJbwrsH84`HDy@TGLhtsKtvZmvXLlP^S7*+I6A62v`Eury^CUPVYbbqcwGXUc-7QFj0)NGG)2CgMMG7E&<*x z+rKh(7W-POE&*?CwxU4Q%7Qn-{*MCzavQX*EZW9>1^-o*zxtmhHQHivLO``8P%=Vf zZI)t#-O2*g)cfz&|8e`)%5p&k1(dn{{n=BMx;VhFT%W!^MdkES8oS|dvSPc_TWN6^ zCr5wie4Vcav!DcSsPF`)qeG5R!Q5_x5tW)VFh(b@N`RY){s_7kFy*$hQmCS2=@-2a2k}vF?Hd)??aq{-V!uQ`Gx+j$sO2mJj)r!%P_h}cUjycg(<_~Yd6hV)N%6;g@wzSvR z*@c5KRXY5&HXUZx%+QOcj9&zN_>)|QmK?>HEQi{BZcLd{xK0z3StnVqjk*lIWv%Ra zQO9>_t(v5%@$E4pmoNKin$|t+4(MgAeg4p-pnme#^VXdyX;T&;rKSufh^H=xv9%pu_ zW?u#|{cGy8)%v9LSM*np3ELR(R(4%|U7d*U%vVILCUFXu{J$DM%$GnwcP7NkvBf2~ z(qdXyd@e-z*^`)OM}A_pH_2w4AsVGDS3qqx+997YRH0Hi5_b==RF_I@W8!LRv1GRi zVOteQhpA-BUXZ*KO_q$c_Q}$uPsx?cGO0Jx8W9F=zPT(kbh1_3wXNc-aQrP9OWL$& zwTTruL849j!G6O$z6?tSZ5=}zG&Lnf-qMlDS|gSw0?RJ!fU6TyO0zEeC?_(?5sDO@ zuU$3?Gd^^;U}RG=86i>Js5mxrd{-(TU95CCktju5BB5=fmykd69gQvVqaj+kgQ3{W zz;>n~NhVE5{MM1lq-5EgZw1qZ#dtA;7ChUwu_>Df?4#dwlIa~o)p<$Oos1N61N55- zXhI{Y6mRJyj2j^nOBSwN%Sd3$GXi^N^r(yM09~A`*lmoH1X~X! z2RF|~$Jn{A$>F_bdi%=U`*TC4Q>r$Bo_$UHV1FY!&w^ub!6n`^P4KSek!;{2rM*-s zT3KStr7lCrwq2Y(Pl|i%*3fPuTI|~R^E`!2OxmKD^~S)rqkbkkzI-8_JT~TE{sROy zY_RXk@Q6lf53U#y>l1kPx&-2D&|aWVRMOGhrjW(If0{6%#kP~5jZW&3&Ccq5tDq5J zVu2|^HG8b{l;O!IL@(w*TOBS|k{VMN4>*_042fN=_`&T7ffK(9CoYMi^Mo;E-uP`# zcmjla%&GWyBZZ6*RKd9;!dGOth+bh`u{o)YacHbzfUw1piD3XfJx|;HjBBbFvz$_;QGY<@&0Hap-jx8*oZ9xGk$SKsK~IV8LhG*hAGZP zvD;`)7tV(988xFeGC4lCH-=QEG-qfRmre|kxLDKTc19|qL$tZhQ>e<~u;lPtaY_Nb zl}>tTaW_?|-Vb%x02!=RvuC2`R0Z=px1O_Ft+BvH!WBy zcpL|j_-mu*Sb05UUzdLSkdI`2P5kT8gOycyhoAYByN5WtKk3WIW^YArhlhMRJYs)x z4&VGtH2dp3?2`3&aBAu1)_pPL<3x-jCmK#}A5dY2a{-4eY4>6I6Ujw{Vm4%xi;wuq zT1<`y3=I{!4=cuwNJN37yYEL9Z(h_XI*IU~?ojNo!jt}@-Iy~+s+oYcKOy1lfNGnL z<4?KnxAv<|T)Ps=#zg7ikb&=Kgu~e7Rq!8LrZ!S z_jqcPvgQRd&cpPAvThefk`rAstz>#9_s1>N$xV;IX?&T?p^?b|0YbJB83cPN4zF^j z$asFbJA4o>4LE!XNLgf&p3ENM`8Cq`&~V`}!eG!KgZZ@O_zPE7#uJm8i=sH&YlDe8 zNg?cDH_=aTUA4GiDnbru+1>R)DoJ~;nfo|raLU58KqnZAg#mdcj&ktyi0^w_(gK<* zxm*i}Oe#JS<|&&`boI7+I@mXa?5*G-7>RilG8c$S9&DT79V#KbvYq(emSMJc#9EBf zON9o9e4%l#6-)$e8Rm$ikf5?cab}8n+ywD>dSpsHbB|QTlLv_?`o;bU(#ZOkU9j&Z zvMPu6n=m|Td*?@#1NlQXaZYIE6eT|)reuMS^Iv2;-uM=Xdq2$|V2qs%Wy$1E{ z*t!Z?k`@p2yY5O*R;wxoU8t*kgq(z674@{xUF##GI>o??vgL|K9h0YCi+>MRyb^c1RGO(n#StGaWRsG!{U9_k#xu>b!F!O>U z?suLfLUuIFYJw%Bzzv|We40pHnpKX5SOLulY)h;V9{Ck9Vx%Tkj8C|^P-3`L;K-h- zw7ixwyzecLQxumHdwMV$NLADX35_~KX`G#N3yb7R&=tjJwg0i9ZZE<$2`D=%K(ZY| zT97VYl>3(6&OPTEMf_nD*B9v;%j2DA4)HC%iaBj!T&@aWvlncr;&y8p7Nho#2NzpMy8*5pFD2R9rSN2h&7_ zy09zI7W|cj-S(EgqHTC0)(DY+-WQ?SD<$yv&ndz^Zn1~9BbbXP*g5rZBkioY)0t;H z-qVT{ov`A@M_|;Fi7R4#bQXOP+zR62@QQIwP+UY*czjoBYv{>xoX%vY`?j?DwiA8B zA^W3GZTHrr+9NM-8ZqvV3?k@s*g23H+IOj#p93Y!yK&^ohVAF`F^MtdW7#6phIwe9 z)$B3Jt@}aGhS;Cz>^bh?R?&N-_EhTZF(~3aeUuS;goA~$zg1^;g^04>2!l;;&EV4- z$6S+9WzQB-Mr$S!=NqDe>L~|?EKNp3guX$&JCc}pIZZ6Z zhYiJUhYL%`9MFpRm7r9Cnd_=474Ob7fO#YfxDI0QaKOM}^)D>KM#2J=>Ul%in9ku* zqcDXD_W9Qee%{P)631puORm*MyN()l@$lei*K+B7!$ z8#>17AjK0HDd;AOOnDdTF8)1G!>lE^11xyIS)g|*yUI4XGC*TA5OJ72@OwO5ife%4 zoW`BaHbR^bnKhlo#AQMy(OP)U4l*q%t9E5{=SLs9Ll5yFY~Zah&g3Zm=Bxn2uh2(^ zFUiUd%dF*fhWKUACH5AIzF)O~aI%-;&kSuW#F&FxF$)yjjROLk}?}+)a}R&P=PmZmsmYctTSgG z0UY+w6&%T768Q+I-_A*Y$?Riq+Z}{1#r=hTA}R@3@ne`7c&Su1 zs~NDd4} zlfCHib4V@hZgDm1IS{sO3)E8A-uo)VF^!@x zX?+l?Jad-Y=>=;CD&DS;)H)ia3wBSi9=e~=xkaSChZf0l`IvP4dSpFI&*==3V=_HQ zY^Ny7GhImGY{YJqA201M^b!Y|xqXGDYja30ZL!rxW1JIqn6dCy^lk$I|80##v>bHN ziOz&3er`5^RhG>J0d53;hHB5z$b&g48C=P z9gGc;kcbdRtB=5!yJB0D2s=q|iZW4Whc43d5G`z`8n!tSXF6WOMJDY?Y~1BZSE7ud zlJ=_g_}ecL<#a9UI82YjAE(nD6R~gZ+~B6%>_ww`=7Ia@@YzEo7(a0KT35Ab!i3ub zJeaZZoVMUbFj5iI>tZ-(*Gh!9z#=8q7WCgl_?x;XN>n zzYj!>Lx759yJxLMdf`l$k)p=q7$&o<8diT6?yBO+`Lo2~$9A?V{&ut$;WplJF1S0{mgVzWTcM*DE5aBF&@)cv;j|(~{?t4*2l9pqi zDMp-(qFDZ-(&})Y{cCAr|SUB3E^#j_k~@Z3p=*O?8t`9Xi=XuA~t_? zHs+Y|1~sO;Ef!86*Rz0Sm&kA+fhL{D@Nl89jsT6h0@w_B_(+}#fkwIs zIP=zF{1ywAsMto1QXOJO!1Yq7YZ@tlvC9lV@2C~Y!YDCr2MBx$RQHSV+GmK_*o3qT z7w_?^@>jfw+N200#44yo3a`)!uI3cLPiQlKqmUvVTdhj+uWxTPy8Zz13m0x57Gy9% zKdi#~U6xQyL!>_b+JEo+?7qlyX)L1;C+~j zEJP#rNA>;b$#xDXUF~&}Dmx-cabhJr4K~meHfaZX%y|Knc#o1!OokjdESbZP9zGRf zGC4m?kB{Y?Ko)asye8E}427oE`Z}zbpZB97aq$}|mVf?OUsO!j$)O#UNs(;1$OWy% z&=sR-6lgpvmNpWvK?~W5u~7=LF{z=`Bf}QIYTU5;lM;sqmDGsF_mkSvHt~EQVwiC% zS~6~;p>?=GGZlwM%}P>B6EnmlNI6v`s)0sWKR^2V0$iGw)-68*29{<97FKk-13;ugAHrc2y-9PsD$6PZie@aie zwq$rrDg4r=dB5&ud)@cS807oU@`&ml45N92ri`f_b+)TNGMn36UYxf|YBkGGN zxv^-hpR&1QuxBNZv(Ku8rn1&r9jx#+vUj!wJAD1l=%qBe+S24HJndJ~XT#84vU<4@ zMtxgak8^AHO#zOFyS=eCxA~5T%Fm50%sD~hvL;-x29slsNPW(+`@Y$`ZE*fe4o@9f zf_3(Mcme}4sCY%DRNM&!TufXz{6g8An07nee~|P5|#-)k`uHEIGI*p8<{IK_EB{b~}>t(~q(|Tsrnie)Fs>8#{&`#MR!#2_7kp z&GXg;_dk+~?2=yn_DtOo%z)#9)X({A^vw?=&r)84Am=nDG-%CGE{LhaaTnqOBNCe@ zreW-UtoU};*Oe;BKvB;1TsbRg%%i4zmB4NYJAdQea7z01L)`9M8ApB>g4h&fET!Sc zx(z|6yHTW3^}yB}-b-6uZ;oYCU`$3#_cIb%_NXE~{ef+9toz;A@hIZAUv?~PUGK&X zpKQ9?*1=B5Q70Tuh%DFCVU`=9Ycm%-G8%_{rPZPWvs8+jH}+<+PHa8H8VhQu4UTtg zEtbEkFNuuC_+U2Y?hDH@dTYSElQD~68eT|NTjkg&%b0Ve!<~#VPJ+~ou>7M`iXA!R zhLydftWDqrPO}VUd$+)3o3Ej_yQMus>FYM0-4VBBNbCBTZLB0&i`}eDuT%`m62Gm& z5TTDvoynw)%>K+|ZRL_JAp{#4e%!S;v4F<=g$4=$c_HXKb1iXdc)i|0>^$9ZpV$3> zeOq)~J-3h@bfo*$D?ikO!bz1YEyHxb7laRJ;|uN5UxLnC$v>@seqT@Je+vyLoeK~r zMdfcA3izzdZ*4kk0JRvntuJ#i+~u+1f)5MO*yF?boc)l+`BZafK=`WS z!aorpC?l+^UuUZ@2}xwXLqNGMK3b-${q-;oZ$CwfS^Ed4)Q~b2E!=*1b3vFESAmc~ zB!HMTJV-=~6ZR6FWem}j9J@IfZDDlloD(Ud#S|~5KXuANtAPs% zz6|LKf9YpBg*7UL-Y{0FTKk{NB;$FDcfibjMdq~ijQn85i83C4M8STd3Ez1Mg>q#} zn2~YHbM@H zmP}?-Qry+F7QHSCI*?-}^`0M0MBjCJJeI+tqFls#8o0ENXz0AJ33w08dcVi_nDu%E zgYlCnOsCmh>?{t?$9OR4lu;O|8m;^^w8V-ivXaqCYn%{P!4K(5AbqKsv=;3};WU8- ze;mS5Ohykc8n@m7?%^%Qxijjie2mcljs-ps;GB9SjGdHpK$TH_>;7GOSYyLaeMXO0 zr}b&YKL49bYWI51gm>nGfX)d`E2yG#YSVGTb?@8J+(Oe>#5o$@9>od@L+WTM+SE74 zOb%O0W$4h6tB_Z_V?;>d02^a7@UpI%=DCF&hFNu~>@(qJv@1HDHdahYvL0KljJ!o7 z$Kky)LN=B=Th`dKX{}+vC-fUjxGHHKqM7Uh1#UAnTgfB9&StSKHZX^-bS-K1pb*i?{DTebserUkOyh|`;j zGc7XhLX+^WciO#8}77y=`trRkBH{4k3AkS~ zn?Ggp!2mXnW$ARTMY%KvbeFq>@E4#VEs(KX7n{6(745dww-bDr$EZ*xcn9JglI2~D zPn0UA6MT(CG3paRiLRsgkRoc&8Cj(}0bFiU=fR{g{Pr~2Ztmp4m$`=iQ(}g zI?QH7Q4DP3FM2ErMdHJ2(8rhaDA+0zS!_)b3*|AEOheVlPQ$L~PIqE$*Qv_)7@Ol9 zX+85eXH|ThKQyELMJ4(1i_3d_vZ#$O*etf1dH54;QW#-1u{>_epk8d<0~t(@&JyXx zECc=GR8X#@hCLLiPF}EHJcLwCyJ4@K41X>9=vMjt%<=kZNBcL_{w24mR{S0JE`k}Y!B9~!+F#C!JG3EbDa znrrg*Ii#(TWrjSqx;kD)tQYg9-TDig1LP^FqlX;&(xp?OmAs161`d!0HhO_FVQV>; zY&aOoVyKo@aZGz@$RjX_i$_|}p~&DwqS?r1Q!$HiF!x}v1#zpFk;taB{mIn9B)WlA zBr-!)YE;*}C0IDvghxn7<~k7zhLuM)IHEoQp{Z9_O4wocQljE5;gJ_+h3LjioZ=x) zV4+oZorSOWVUK-x*s}7T6!k-lbCbZL#E`BjRXXHhWS3t+4}S55r-Ne_H~?v2ZWAXj zAjatNn%P{7)|0RdBm%NCJFh>)_z=(V(~hy!S}Z*4yOErzQZ-d>P~FOl8?_?!<&H^{ z>Kcz3m5~#dF_EO)gW^jnNKP*?tDFhBH*i>3`ity%@x>J} zf8f|S(+8U1@xb_@qATQtRm&a0PMeEKq!&H+K za1DsL5fn;h92e{lj+sDCwokwp$8FM%8#y0YtCTOggjZI)plL2!v^*6pM5l%U^EgPQ zN6ar*Y$1}16-UIDDw^pLDt1or3d+>tCc6v#NAMI|#v3+vd@?KLg~f{{D%N2J9H^X@ zFb$lIByCO*8xee|jk1N`idDxLxL{kJFOm~OVu1!PN~J0n*MKR5(1c3YW`vh;a_9EX=tER-y~loRb*BHX~t{hmYtrC|8h;IQH04yCc_ti?mVbY?Avv^iUl= zx*8X(#AXUG2%M+#I4#zOfKWpcP7pV`a5cdz^Q-7+0aivB5 z!zwlj_{j3D1lQp50-o^|CsYMGi=$d|gw-tY3GmL`>mIZ^MoesuRVE!98*_VLw$Te{ zU`W_06RnBP&zvwG+*4)x4)|o8hW%?XdreqSoYvu|F{{x{W2hE~g6`fG1>3cGQKd^* z74^JnpF6@jo z0MV7#uHeeq^*C6_uEx0=s8~_k*W~~MxNZunMTOF%FQPU_a{{kbu0#bJim8rW-#TI1 z?dy54!;YRl?BU|D=IWOCc{C)IdS0#FtdviHEN(t&f^L=N6VL`PDxY{SO{#%UDrA%E zm`m2a=uFbjE`7p1JZhKO*z>EPiua6d%JLF%I!g*`c=1zh>-q+@gFzQbY0JQALpW`@ zhKK(-lxTf`=HVR3PC>}QqH;8~ajke(JUfBv5 zsYUCVB}a3B99z``4zn{41j5boZ&1O$ zN*l38F{%V3{V>Q2Y0s3Ekrb1g>{u$Fh_kweX&|VHH{WR46wYp-j&Yd5;4B6PGHzyC zutDGoD~WGN$(lwcHs)v%eq)Y%^r+IN#?rMYUCY!rkvhl%0>(g&=&l7?1NVOC!7&R= zLK7BTOG|kNY1~3ZPP3Qu>~-s0VkSn9Ry+Wu!Tzsxk}1Ee=V)ME%c*E_Y#_nCfglcH zrVe`5wK0N0yD@a>L2<+6Do6cv+6V^l0;z%S0FJsB<80kVk8eT*7(MEQ(C142ID+m4 zM6X9wsv2RDoQagz7ux4JkX)*^ay8*BRdk#CRhwOXw=c=_Ol$4y@_Z(SU!5mfkoloW zdN7!78j6KRoO23k;hb(g9OQY}ZF!u_^{%aXx?Mx>;iG#=4*%Ndu-=vqcM^Kr%(*sm z>`B&$<1JBrjV!ioS#sGj?Vy!N*gGCJ;7(Q>*ZA&L5bp*MUJ^J&L!E~3qQIdRx-+_L z*=XL##G&@sm>Jv8>Vlz69fZ1as6q~=GW*%i>ku{Y_HG3>j^d6Lvwb$hJCoVmKx9$bRA!S z=49D~?{xPel;GRS$>XIAt++f{ zP&rB2ugEtorkrzGrI&uthAyTMzVHdbE0leGV39$`@>IgpTvpl-QvY;ZW*vz z$9zaU(g~x?Z^r>vaIZLeu;WD}G|Z0Cktjk_+->SZ(-ryS-7Rp8D9f~MJVJ=N$)fNdpivmzayhkJgmHM5vTHmA`0_tH6oe8)56aLc zo3eZnOT7E9>>#@@W#x31u46}hinfo<`~l;59*^)EIkOqhj!8Q}W89tYjA1N$0-VwK zgqR?}h%-k&tWBiyP=X(2N~LqWGPYX+Q$A3nbnkXF1yj7Samm&RyD@@`CO%NnWT`UY z%=Yu9{SygqJd)UJcpHj40{(S4_m(;j`x+9B4xvzt((R&51`O5#1NR=?)Ji3p zYtOcPatBkk57}ay43FwwtF?#hPI-2RZDHY^a>PYzDvp%%#XpD&*K=#u#6q9&2mq52 z&{K>v4R?xTI6sTwx4AIoQEEkkNN?!fC%F|^W7h&#gSl&K z3ltfivl=#Y2T{nlSIBB9LRD*WiBY3{>u@6tIKi_m{8&p%hkesV*3RjoBv0GwV#dj=e2`bT0>AI*`;BppB zd`4~$&MR=#9W`o`8iNVg;NZ;0aLoZzY?aGq4}2ja3b`i`B@M{)ID`lDS+|QNB2KCE zgUcw4#at*Ane zcARy(x!D&DN7%~5}`!otaeIibx;1LuN^<>eLPM!uE8@1({RbIVuo6ApAzopPY(c+a(uThXFb>?IGB%~o}T{h@gobj1JOioNsvxB z=Cx0yX*@&Od2Nhpy6uwkr1X`#0kj5pl#P@xo_EQNgMGD zI(TXW-rGPOKM~%V?Vci0yFE7vIvXxZE7HhDaatCgm8mALGjAKNh|UYI!#VOi424{D zY@ZXo`+3dgK7309Y<;k-jC&nl~Rn;3<z49O_4*4+50dgU2C$|=u#WVaD*^>_zqoVk*WJCKZPIm_s?~4@w)a;Xn0*)bg|*f z5e~gDktMrEyxSVUYa;flA!CRuKO5v9Bs!L_0aJQ#RuS=gVEd6v&lKFKG)moinvjbd z@hF6jRAF5ahL7?79CLJU;JLU%mUvMqHW(!sD3341?rV5KwL*gMdj0URAwib& z0)t3;uf?BpQG#7kC?2$zwsfrz$rgwjFBHnrt-9n!W1OLdh4VR?a9~FO69%r}w_axe z0wTMw1#)QPJBmlC1b`rgZ$^p2BTalxqixi0h`lQ^2;pmk-e@p><752)ChCvbW=7Q^ zx?PTeUI;oW0)doeP!|In-}F{}jBLq+W)H2A{#}tZ||^Sk1{eRE?tx_}i>lK2ZMc(60Xa5WDxE6rbDX1t&+t|aWRzXaEBSQ_169OW}*vASdt1FWF(?E&%xSj)2W+v z$$R$f-d|NaGRVM<<_-kSFIu;x%Q5&wN^b$)rnvULOSXURss`__Ale;2TF>oz|3JhB zZj&y(j7*|9qoQ0ft4V%d9^=bO?oyBSY-%+!NDU`B9c(-jbmF0BlusJ?0VglN0mbC* zUPVNbtV`qK<|dyNunoj~vTA#%qp~VWhh!@=cLk(_IP83OMRpI6L$aAFua-41w;~6G zbI^bA;ANeGKZAlT54o`7^Dz9sIS)H-mfJDQqq4n7P6>7#wssN~D$>^sLmzgSwjrlv zn-f&Z-{(_u4-fP;r;&!3qTvSB-gRvw zPFi=(h^(w6ap+7_>rsFr*|IV+N85R&&U#L;uuU7dkxc*$3R(js9~{ayR$4EbbBzz& z(D>u(7LN{s4#nLW*(uz0i8uJPnxRSLk}`spa=wYJk-Hl@EL7svonzB49NhvQ2Tcya z9W%D|oIuXw*1G4{95gvtbm?!o@s9>=CQ(LeLwhrz+n8F2lQNa6GJSc-iDTUTkeGS{ zRkONLf2}A$PL=J^AeR++t^}`-s>%CEhL=iO#O6V8>=3BPxDiP)2gzg9;QpCy9;jLj zRLk!Q+C91uw(y3Q;TL}t=ev(070QqWdO?>@bmzPx!XZH9-yI0)Hx{;{BzgE4ReMK~ z;J&w&CBl~v4&-%G4EC_sofEE!C8CwTjw|P^(T)W$)kQ8o7iEUSw`6Du_$%^{%|Z7% zq<|a~5b;xT;`2pOj2B_17X;T5@pLhlp)FMoc2gz?*A&KJ~Z@e#k9f8quBb z))`r1Q>ds_*6TWWuq~kXxZiffCTSaXf;wVP5ZoHC1UF?Lw%`(Q5mdgT!enh_EGtyS zMKGg7ZT`Y6NAi#q*zG4Zy4ZGe6q9NF9cR281a2_cA@T$2UG`eHV8g_5$O_6 zV$O@fNcR`U_WmX#2m?i zU9pw3R>4W#LU5wu$Uwb`Vkc&7IkYJ(&tM!LIo#i>bi%Q0O=Qz_dSd(9I}>8N5#JA)|p!V;f7Lq=UBsWl#Gu^eSdH?9;!z;=Elp>IpK5ac+v1mEluvK6hFA--$Ek`tT;3plY5M`RmK4l$1Mgg#7;bw1xv#Nl-5frFkWIp%XmEScof481wVc>M5v zvu=&!ap`>GNRy6bU#4Y)zAH(V!K^M);Kir;l`gf`3`Kutq1cYKm{uA~(TxT}--N*dr_!sw;R- zn*zW;J$*ih+xh%_Ecdn($sL(uJvnRy*xx6K7)!xl$T9sncusVj#_k z#q>T9c~;)ThZ!=&OnN3EDUergl%y4? zE2@E*EGjk+>lMbLsh!ILhJurK4DYO9R^#0-cTqX!I}fdpgpHA>mRhOMcrYGWTZhBi zViHt5(JG{3X1t2=tL)XdJu@a1WmO*3`Q*79^`O@ zh2`#QVH2c6=Z{zD?wMjd>O{76qoW%ctHUsyBw%SMt# zpPI?%zGmc)N)=wHW%%0HxVS2-I)9EcrPkrQ7gk&beL~1oWJ0_!T&-s(%FtlluYrOD1pl)T1{9 z=hUK1q#&;luTZn*Q1z2$L=D|Z)JK_H46;)gn9h$dZzQMjWoSGY`4FiqdHbHj`V4U$ z=`@12Uajod#~>h@G>cQ4&GLM)jyY0L$||yGtDPZ>f5*cSHwY=*yx>DBCL1&teJQZB zBv#S!LOjOHBhXJTweg>z8jc;S8(BF}Qh5wac|}Qper+A928M3(2)<#?E_)#@t&riC z(|$TZf|QNCr`!&1oO{qmn!39dVSiTvl=W9R$ogs=5Vo#Lj)Xu*lqsI*;5X5?`;3(P z`^RxV(G)4R=O)K)HtaA@Y$A>!y0KhXVIu!OY+F6z(X~7Q2F8wa6x@d=c+&#=PYwZD z06gi|iRi3kM^DGviMvC*gKb+{hCrrnDp7n!#8EhlZD&ynlBsEA8FVm7uj<89VtKjGj0z|?Jj-a)n73P zvaFJvh!?A3Z_9(W;z{y-ZBVyVJ*gbye6TG&3!H3xB20W+L*vUr9DS_9yh{;U6Y7H> zTd=a^+t)v8aL+Scy9C;8)Qs=!5DX+kWm(PgpUAiIM4ah1j47KZdlXqT(4O&SFk?go zuVi+bH6^Z)wZ@pCfQW?7ii@#yuITmC=9+UsC8v-QYtKeNF{VVel!pw|4#t0G%h%@{ zN8P$&>BUyM*@_sdio+a`yK1)UkHE#HMi8{@>|?hYi9>{-R;N2NnbaNHm!*_l%6m_Ef%c zrBH(&H;qPlx8xd#+v0T8P`N5wWsZU6_)}Ruugc4LFf;!%&}k*(*1szwHZSE;Tr_KOtt(GS4^D zY!R+E>hb%Ze*7z&xfa#jx!mR4Hj1^YoolV8?@H5s`C(M&i+MK9_YS`}1l~OTBD+}} zr|$9B{1}7_|MbuN^eTS3%TNEls^aGF(t)LT|*nVm9yE5 zi&SGLuV24WV+lIB+~)JS=6-(P$^IM}`P+dv&bW{JH&DJ4hWn}dS&GZzFT>>G6#rL` z1^V2dR3Ze)s`gStWr2e4$s=b%MpA%lofjx8HGBsS#MJFvS(hMyRv6AoqE<1ps?^1d z6f4Bl(G8)=a$ZJv3sAVr!m`5fi}1U>t!fs*1#S-8FCX@?`O~C`GY$XcgVMO6-`f>t z1O4v5{&LVPKOjZtLho2OdX6>{GPX^xDIC>Yx!K>55J8(u9A~4!_}QGy;Uv<9u7vW* zOKQ((nm2*y#!_j{qnuiIH2-If5R-vr`ZIhfof`SDY z8k7^3h9aMVDR8s!+hVnp3?PrxLV>fK)2%YM8n)C!*sApGEPYD=*hp+BmU$be`SxqN^Q%6GY@hsGP8kxIMx3b=STu5);X*I zPu}6#*hMb2ugd6+J$k9WEAN(f`~tNf;0uCAOeiGaz84RM z9ue>^AvGS|!unLnYKDrd87J&gjz_8Ms5M1TJJ1chbxq?VyDV*4K7$(~)KDPQ5$R*N zp7&DHAF^LFaZ0@@rge27Cy18W!0AW10dVYx>beBZuqm$6rd7*X$!H)=p$`BBmvqkR zNwFl#>gf|%Q){%_lQUhj$hgKl`p%a#cQ+{(BWIDDcaWnfGX_>frXn|F;;caW%7#Yr z6ktstXTgtc&z^$xhyGPv@~2__VkAN<3WdZNX(jtA)|~l;-KA?{q-E>fftOpEUD&e{ zi3bG=g@i6y>vRX#Ekh;vMyX;D4%*pdUQK^-J|JrSO?EFX7W*eDrpZCb2;La3t--XO z#85~`pc6$kY8G7V2JMa&sLH4UY=ta#vDzO9H{x!(e^x4|yN4@K5XceQPj&~;B;9?$ zH2j_Pd*|}0bFj{Da zXazV3hkcO;lj@GGNV^*ZgiG`Wy4! zSuSoMx+SDA$_4x*uBySzfKYUC``GColcWo0>h2?7{AP>3a}T^ij(CVWyAQkkhTYaI zq^6)?K^2_@1Q^l88PcWb5#_YQBGn}RYF|LKxeKHIiOqQwHr(cpJG}u|h?J>dM0-op zd&LUX5y&_lsVGZ!$;WTkMPssZk>XfpVz^N8Mnjb7zMvPkXiGU~IJInf&;KOSl87?B zs+%Cwx?2*?nnrZSQKUtv(~!0N9-ROuT;K{#gs)$-6o3vb(5(t?*A>;U3T) z`HUQ$cT8KC&v7n6B~V%PEzg@m=X>0Zbv3<8fng%vqcLwrNb{_P8C>Q##!hu2#j8JS z3g!j7V!M;Lt-PTVk^Q7tTJ|AT9gvtLy*V&#Lsq{8@S?dcu$YSci~;g~Q`>QW481)U zhjk%gY5F1q(%X`vGaQPIzUx8B*4d3TkffE^yBM^)BcGK@Gia^r3i}}4#c8^z7D&F) z{|Nt=vd;LCU_l?Mn*YZD0QyM)m7ceC9Z~iULV^>X${XA#-lOB+w}IhcMSG%K!o$fn z$ZvglJt8+WY1iX?M9U$yKd+Q{6??>hARCgmjSq5SdTk+0o4 zW&L;W$=9*b4D(1wIs30oi9|ZSJ~qxt^{8D-LKr(jc$~!jATUAzoqzfK_xbPh-{-&2 RfB#SZ{s)0Zq*MTO1pt4+z1;u+ diff --git a/deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/cache.json b/deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/cache.json deleted file mode 100644 index d899f11922a..00000000000 --- a/deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/cache.json +++ /dev/null @@ -1 +0,0 @@ -{"_id":"underscore","_rev":"72-47f2986bfd8e8b55068b204588bbf484","name":"underscore","description":"JavaScript's functional programming helper library.","dist-tags":{"latest":"1.3.3","stable":"1.3.3"},"versions":{"1.0.3":{"name":"underscore","description":"Functional programming aid for JavaScript. Works well with jQuery.","url":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"lib":".","main":"underscore","version":"1.0.3","_id":"underscore@1.0.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/underscore/-/underscore-1.0.3.tgz"},"directories":{},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"1.0.4":{"name":"underscore","description":"Functional programming aid for JavaScript. Works well with jQuery.","url":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"lib":".","main":"underscore","version":"1.0.4","_id":"underscore@1.0.4","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/underscore/-/underscore-1.0.4.tgz"},"directories":{},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"1.1.0":{"name":"underscore","description":"Functional programming aid for JavaScript. Works well with jQuery.","url":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"lib":".","main":"underscore","version":"1.1.0","_id":"underscore@1.1.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/underscore/-/underscore-1.1.0.tgz"},"directories":{},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"1.1.1":{"name":"underscore","description":"Functional programming aid for JavaScript. Works well with jQuery.","url":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"lib":".","main":"underscore","version":"1.1.1","_id":"underscore@1.1.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/underscore/-/underscore-1.1.1.tgz"},"directories":{},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"1.1.2":{"name":"underscore","description":"Functional programming aid for JavaScript. Works well with jQuery.","url":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"lib":".","main":"underscore","version":"1.1.2","_id":"underscore@1.1.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/underscore/-/underscore-1.1.2.tgz"},"directories":{},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"1.1.3":{"name":"underscore","description":"Functional programming aid for JavaScript. Works well with jQuery.","url":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"lib":".","main":"underscore","version":"1.1.3","_id":"underscore@1.1.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.2.5","dist":{"tarball":"http://registry.npmjs.org/underscore/-/underscore-1.1.3.tgz"},"directories":{},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"1.1.4":{"name":"underscore","description":"Functional programming aid for JavaScript. Works well with jQuery.","url":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"lib":".","main":"underscore.js","version":"1.1.4","_id":"underscore@1.1.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.9","_nodeVersion":"v0.5.0-pre","dist":{"shasum":"9e82274902865625b3a6d4c315a38ffd80047dae","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.1.4.tgz"},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}},"1.1.5":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.1.5","_id":"underscore@1.1.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.16","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"23601d62c75619998b2f0db24938102793336a56","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.1.5.tgz"},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"1.1.6":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.1.6","_id":"underscore@1.1.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"6868da1bdd72d75285be0b4e50f228e70d001a2c","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.1.6.tgz"},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"1.1.7":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.1.7","devDependencies":{},"_id":"underscore@1.1.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"40bab84bad19d230096e8d6ef628bff055d83db0","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.1.7.tgz"},"scripts":{},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}},"1.2.0":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.2.0","_npmJsonOpts":{"file":"/Users/jashkenas/.npm/underscore/1.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"underscore@1.2.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"b32ce32c8c118caa8031c10b54c7f65ab3b557fd","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.2.0.tgz"},"scripts":{},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"directories":{}},"1.2.1":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.2.1","_npmJsonOpts":{"file":"/Users/jashkenas/.npm/underscore/1.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"underscore@1.2.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"fc5c6b0765673d92a2d4ac8b4dc0aa88702e2bd4","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.2.1.tgz"},"scripts":{},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"directories":{}},"1.2.2":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.2.2","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"underscore@1.2.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"74dd40e9face84e724eb2edae945b8aedc233ba3","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.2.2.tgz"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}},"1.2.3":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.2.3","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"underscore@1.2.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"11b874da70f4683d7d48bba2b44be1e600d2f6cf","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.2.3.tgz"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}},"1.2.4":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.2.4","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"underscore@1.2.4","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"e8da6241aa06f64df2473bb2590b8c17c84c3c7e","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.2.4.tgz"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}},"1.3.0":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.3.0","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"underscore@1.3.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"253b2d79b7bb67943ced0fc744eb18267963ede8","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.3.0.tgz"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}},"1.3.1":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.3.1","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"underscore@1.3.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"6cb8aad0e77eb5dbbfb54b22bcd8697309cf9641","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.3.1.tgz"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}},"1.3.2":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.3.2","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"underscore@1.3.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"1b4e455089ab1d1d38ab6794ffe6cf08f764394a","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.3.2.tgz"},"readme":" __ \n /\\ \\ __ \n __ __ ___ \\_\\ \\ __ _ __ ____ ___ ___ _ __ __ /\\_\\ ____ \n /\\ \\/\\ \\ /' _ `\\ /'_ \\ /'__`\\/\\ __\\/ ,__\\ / ___\\ / __`\\/\\ __\\/'__`\\ \\/\\ \\ /',__\\ \n \\ \\ \\_\\ \\/\\ \\/\\ \\/\\ \\ \\ \\/\\ __/\\ \\ \\//\\__, `\\/\\ \\__//\\ \\ \\ \\ \\ \\//\\ __/ __ \\ \\ \\/\\__, `\\\n \\ \\____/\\ \\_\\ \\_\\ \\___,_\\ \\____\\\\ \\_\\\\/\\____/\\ \\____\\ \\____/\\ \\_\\\\ \\____\\/\\_\\ _\\ \\ \\/\\____/\n \\/___/ \\/_/\\/_/\\/__,_ /\\/____/ \\/_/ \\/___/ \\/____/\\/___/ \\/_/ \\/____/\\/_//\\ \\_\\ \\/___/ \n \\ \\____/ \n \\/___/\n \nUnderscore.js is a utility-belt library for JavaScript that provides \nsupport for the usual functional suspects (each, map, reduce, filter...) \nwithout extending any core JavaScript objects.\n\nFor Docs, License, Tests, and pre-packed downloads, see:\nhttp://documentcloud.github.com/underscore/\n\nMany thanks to our contributors:\nhttps://github.com/documentcloud/underscore/contributors\n","maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}},"1.3.3":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.3.3","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"underscore@1.3.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"47ac53683daf832bfa952e1774417da47817ae42","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.3.3.tgz"},"readme":" __ \n /\\ \\ __ \n __ __ ___ \\_\\ \\ __ _ __ ____ ___ ___ _ __ __ /\\_\\ ____ \n /\\ \\/\\ \\ /' _ `\\ /'_ \\ /'__`\\/\\ __\\/ ,__\\ / ___\\ / __`\\/\\ __\\/'__`\\ \\/\\ \\ /',__\\ \n \\ \\ \\_\\ \\/\\ \\/\\ \\/\\ \\ \\ \\/\\ __/\\ \\ \\//\\__, `\\/\\ \\__//\\ \\ \\ \\ \\ \\//\\ __/ __ \\ \\ \\/\\__, `\\\n \\ \\____/\\ \\_\\ \\_\\ \\___,_\\ \\____\\\\ \\_\\\\/\\____/\\ \\____\\ \\____/\\ \\_\\\\ \\____\\/\\_\\ _\\ \\ \\/\\____/\n \\/___/ \\/_/\\/_/\\/__,_ /\\/____/ \\/_/ \\/___/ \\/____/\\/___/ \\/_/ \\/____/\\/_//\\ \\_\\ \\/___/ \n \\ \\____/ \n \\/___/\n \nUnderscore.js is a utility-belt library for JavaScript that provides \nsupport for the usual functional suspects (each, map, reduce, filter...) \nwithout extending any core JavaScript objects.\n\nFor Docs, License, Tests, and pre-packed downloads, see:\nhttp://documentcloud.github.com/underscore/\n\nMany thanks to our contributors:\nhttps://github.com/documentcloud/underscore/contributors\n","maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}}},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"time":{"1.0.3":"2011-12-07T15:12:18.045Z","1.0.4":"2011-12-07T15:12:18.045Z","1.1.0":"2011-12-07T15:12:18.045Z","1.1.1":"2011-12-07T15:12:18.045Z","1.1.2":"2011-12-07T15:12:18.045Z","1.1.3":"2011-12-07T15:12:18.045Z","1.1.4":"2011-12-07T15:12:18.045Z","1.1.5":"2011-12-07T15:12:18.045Z","1.1.6":"2011-12-07T15:12:18.045Z","1.1.7":"2011-12-07T15:12:18.045Z","1.2.0":"2011-12-07T15:12:18.045Z","1.2.1":"2011-12-07T15:12:18.045Z","1.2.2":"2011-11-14T20:28:47.115Z","1.2.3":"2011-12-07T15:12:18.045Z","1.2.4":"2012-01-09T17:23:14.818Z","1.3.0":"2012-01-11T16:41:38.459Z","1.3.1":"2012-01-23T22:57:36.474Z","1.3.2":"2012-04-09T18:38:14.345Z","1.3.3":"2012-04-10T14:43:48.089Z"},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"users":{"vesln":true,"mvolkmann":true,"lancehunt":true,"mikl":true,"linus":true,"vasc":true,"bat":true,"dmalam":true,"mbrevoort":true,"danielr":true,"rsimoes":true,"thlorenz":true}} \ No newline at end of file diff --git a/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/.eslintrc b/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/.eslintrc deleted file mode 100644 index ba331504210..00000000000 --- a/deps/npm/node_modules/read-installed/node_modules/readdir-scoped-modules/.eslintrc +++ /dev/null @@ -1,17 +0,0 @@ -{ - "env" : { - "node" : true - }, - "rules" : { - "semi": [2, "never"], - "strict": 0, - "quotes": [1, "double", "avoid-escape"], - "no-use-before-define": 0, - "curly": 0, - "no-underscore-dangle": 0, - "no-lonely-if": 1, - "no-unused-vars": [2, {"vars" : "all", "args" : "after-used"}], - "no-mixed-requires": 0, - "space-infix-ops": 0 - } -} diff --git a/deps/npm/node_modules/request/.eslintrc b/deps/npm/node_modules/request/.eslintrc deleted file mode 100644 index 9c3350d6bb7..00000000000 --- a/deps/npm/node_modules/request/.eslintrc +++ /dev/null @@ -1,22 +0,0 @@ -{ - "env": { - "node": true - }, - "rules": { - // Disallow semi-colons, unless needed to disambiguate statement - "semi": [2, "never"], - // Require strings to use single quotes - "quotes": [2, "single"], - // Require curly braces for all control statements - "curly": 2, - // Disallow using variables and functions before they've been defined - "no-use-before-define": 2, - // Allow any case for variable naming - "camelcase": 0, - // Disallow unused variables, except as function arguments - "no-unused-vars": [2, {"args":"none"}], - // Allow leading underscores for method names - // REASON: we use underscores to denote private methods - "no-underscore-dangle": 0 - } -} diff --git a/deps/npm/node_modules/request/node_modules/bl/.jshintrc b/deps/npm/node_modules/request/node_modules/bl/.jshintrc deleted file mode 100644 index c8ef3ca4097..00000000000 --- a/deps/npm/node_modules/request/node_modules/bl/.jshintrc +++ /dev/null @@ -1,59 +0,0 @@ -{ - "predef": [ ] - , "bitwise": false - , "camelcase": false - , "curly": false - , "eqeqeq": false - , "forin": false - , "immed": false - , "latedef": false - , "noarg": true - , "noempty": true - , "nonew": true - , "plusplus": false - , "quotmark": true - , "regexp": false - , "undef": true - , "unused": true - , "strict": false - , "trailing": true - , "maxlen": 120 - , "asi": true - , "boss": true - , "debug": true - , "eqnull": true - , "esnext": true - , "evil": true - , "expr": true - , "funcscope": false - , "globalstrict": false - , "iterator": false - , "lastsemic": true - , "laxbreak": true - , "laxcomma": true - , "loopfunc": true - , "multistr": false - , "onecase": false - , "proto": false - , "regexdash": false - , "scripturl": true - , "smarttabs": false - , "shadow": false - , "sub": true - , "supernew": false - , "validthis": true - , "browser": true - , "couch": false - , "devel": false - , "dojo": false - , "mootools": false - , "node": true - , "nonstandard": true - , "prototypejs": false - , "rhino": false - , "worker": true - , "wsh": false - , "nomen": false - , "onevar": false - , "passfail": false -} \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/isstream/.jshintrc b/deps/npm/node_modules/request/node_modules/isstream/.jshintrc deleted file mode 100644 index c8ef3ca4097..00000000000 --- a/deps/npm/node_modules/request/node_modules/isstream/.jshintrc +++ /dev/null @@ -1,59 +0,0 @@ -{ - "predef": [ ] - , "bitwise": false - , "camelcase": false - , "curly": false - , "eqeqeq": false - , "forin": false - , "immed": false - , "latedef": false - , "noarg": true - , "noempty": true - , "nonew": true - , "plusplus": false - , "quotmark": true - , "regexp": false - , "undef": true - , "unused": true - , "strict": false - , "trailing": true - , "maxlen": 120 - , "asi": true - , "boss": true - , "debug": true - , "eqnull": true - , "esnext": true - , "evil": true - , "expr": true - , "funcscope": false - , "globalstrict": false - , "iterator": false - , "lastsemic": true - , "laxbreak": true - , "laxcomma": true - , "loopfunc": true - , "multistr": false - , "onecase": false - , "proto": false - , "regexdash": false - , "scripturl": true - , "smarttabs": false - , "shadow": false - , "sub": true - , "supernew": false - , "validthis": true - , "browser": true - , "couch": false - , "devel": false - , "dojo": false - , "mootools": false - , "node": true - , "nonstandard": true - , "prototypejs": false - , "rhino": false - , "worker": true - , "wsh": false - , "nomen": false - , "onevar": false - , "passfail": false -} \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/qs/.jshintrc b/deps/npm/node_modules/request/node_modules/qs/.jshintrc deleted file mode 100644 index 997b3f7d45e..00000000000 --- a/deps/npm/node_modules/request/node_modules/qs/.jshintrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "node": true, - - "curly": true, - "latedef": true, - "quotmark": true, - "undef": true, - "unused": true, - "trailing": true -} diff --git a/deps/npm/node_modules/request/node_modules/tunnel-agent/.jshintrc b/deps/npm/node_modules/request/node_modules/tunnel-agent/.jshintrc deleted file mode 100644 index 4c1c8d49723..00000000000 --- a/deps/npm/node_modules/request/node_modules/tunnel-agent/.jshintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "node": true, - "asi": true, - "laxcomma": true -} diff --git a/deps/npm/node_modules/semver/package.json b/deps/npm/node_modules/semver/package.json index 466de0e19a3..cbd761b48e5 100644 --- a/deps/npm/node_modules/semver/package.json +++ b/deps/npm/node_modules/semver/package.json @@ -1,6 +1,6 @@ { "name": "semver", - "version": "4.3.0", + "version": "4.3.1", "description": "The semantic version parser used by npm.", "main": "semver.js", "browser": "semver.browser.js", @@ -16,20 +16,20 @@ "license": "BSD", "repository": { "type": "git", - "url": "git://github.com/isaacs/node-semver.git" + "url": "git://github.com/npm/node-semver.git" }, "bin": { "semver": "./bin/semver" }, - "gitHead": "12c0304de19c3d01ae2524b70592e9c49a76ff9d", + "gitHead": "fa9be2b231666f7485e832f84d2fe99afc033e22", "bugs": { - "url": "https://github.com/isaacs/node-semver/issues" + "url": "https://github.com/npm/node-semver/issues" }, - "homepage": "https://github.com/isaacs/node-semver", - "_id": "semver@4.3.0", - "_shasum": "3757ceed2b91afefe0ba2c3b6bda49c688b0257a", - "_from": "semver@>=4.3.0 <4.4.0", - "_npmVersion": "2.5.1", + "homepage": "https://github.com/npm/node-semver", + "_id": "semver@4.3.1", + "_shasum": "beb0129575b95f76110b29af08d370fd9eeb34bf", + "_from": "semver@>=4.3.1 <4.4.0", + "_npmVersion": "2.6.0", "_nodeVersion": "1.1.0", "_npmUser": { "name": "isaacs", @@ -46,9 +46,10 @@ } ], "dist": { - "shasum": "3757ceed2b91afefe0ba2c3b6bda49c688b0257a", - "tarball": "http://registry.npmjs.org/semver/-/semver-4.3.0.tgz" + "shasum": "beb0129575b95f76110b29af08d370fd9eeb34bf", + "tarball": "http://registry.npmjs.org/semver/-/semver-4.3.1.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/semver/-/semver-4.3.0.tgz" + "_resolved": "https://registry.npmjs.org/semver/-/semver-4.3.1.tgz", + "readme": "ERROR: No README data found!" } diff --git a/deps/npm/node_modules/which/package.json b/deps/npm/node_modules/which/package.json index 079989abc0c..d2b7b166fc7 100644 --- a/deps/npm/node_modules/which/package.json +++ b/deps/npm/node_modules/which/package.json @@ -6,7 +6,7 @@ }, "name": "which", "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.", - "version": "1.0.8", + "version": "1.0.9", "repository": { "type": "git", "url": "git://github.com/isaacs/node-which.git" @@ -16,17 +16,17 @@ "which": "./bin/which" }, "license": "ISC", - "gitHead": "681a9ebbc447cb428232ddf6c0983006d89e7755", + "gitHead": "df3d52a0ecd5f366d550e0f14d67ca4d5e621bad", "bugs": { "url": "https://github.com/isaacs/node-which/issues" }, "homepage": "https://github.com/isaacs/node-which", - "_id": "which@1.0.8", + "_id": "which@1.0.9", "scripts": {}, - "_shasum": "c2ff319534ac4a1fa45df2221b56c36279903ded", - "_from": "which@>=1.0.8 <1.1.0", - "_npmVersion": "2.1.11", - "_nodeVersion": "0.10.16", + "_shasum": "460c1da0f810103d0321a9b633af9e575e64486f", + "_from": "which@>=1.0.9 <1.1.0", + "_npmVersion": "2.6.0", + "_nodeVersion": "1.1.0", "_npmUser": { "name": "isaacs", "email": "i@izs.me" @@ -38,9 +38,10 @@ } ], "dist": { - "shasum": "c2ff319534ac4a1fa45df2221b56c36279903ded", - "tarball": "http://registry.npmjs.org/which/-/which-1.0.8.tgz" + "shasum": "460c1da0f810103d0321a9b633af9e575e64486f", + "tarball": "http://registry.npmjs.org/which/-/which-1.0.9.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/which/-/which-1.0.8.tgz" + "_resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", + "readme": "ERROR: No README data found!" } diff --git a/deps/npm/node_modules/which/which.js b/deps/npm/node_modules/which/which.js index f19dd335bc5..2a45417dace 100644 --- a/deps/npm/node_modules/which/which.js +++ b/deps/npm/node_modules/which/which.js @@ -16,7 +16,9 @@ if (process.platform == "win32") { //console.error("isExe?", (mod & 0111).toString(8)) var ret = (mod & 0001) || (mod & 0010) && process.getgid && gid === process.getgid() + || (mod & 0010) && process.getuid && 0 === process.getuid() || (mod & 0100) && process.getuid && uid === process.getuid() + || (mod & 0100) && process.getuid && 0 === process.getuid() //console.error("isExe?", ret) return ret } diff --git a/deps/npm/package.json b/deps/npm/package.json index 55a4ea72e3f..9a7a13b33d3 100644 --- a/deps/npm/package.json +++ b/deps/npm/package.json @@ -1,5 +1,5 @@ { - "version": "2.6.1", + "version": "2.7.0", "name": "npm", "description": "a package manager for JavaScript", "keywords": [ @@ -53,12 +53,12 @@ "fstream-npm": "~1.0.1", "github-url-from-git": "~1.4.0", "github-url-from-username-repo": "~1.0.2", - "glob": "~4.4.0", + "glob": "~4.4.1", "graceful-fs": "~3.0.5", "inflight": "~1.0.4", "inherits": "~2.0.1", "ini": "~1.3.3", - "init-package-json": "~1.2.0", + "init-package-json": "~1.3.0", "lockfile": "~1.0.0", "lru-cache": "~2.5.0", "minimatch": "~2.0.1", @@ -85,7 +85,7 @@ "request": "~2.53.0", "retry": "~0.6.1", "rimraf": "~2.2.8", - "semver": "~4.3.0", + "semver": "~4.3.1", "sha": "~1.3.0", "slide": "~1.1.6", "sorted-object": "~1.0.0", @@ -93,7 +93,7 @@ "text-table": "~0.2.0", "uid-number": "0.0.6", "umask": "~1.1.0", - "which": "~1.0.8", + "which": "~1.0.9", "wrappy": "~1.0.1", "write-file-atomic": "~1.1.0" }, @@ -172,7 +172,7 @@ "npm-registry-mock": "~1.0.0", "require-inject": "~1.1.0", "sprintf-js": "~1.0.2", - "tap": "~0.6.0" + "tap": "~0.7.1" }, "scripts": { "test-legacy": "node ./test/run.js", diff --git a/deps/npm/test/common-tap.js b/deps/npm/test/common-tap.js index 40367082866..b33d3cb1652 100644 --- a/deps/npm/test/common-tap.js +++ b/deps/npm/test/common-tap.js @@ -8,6 +8,7 @@ process.env.npm_config_loglevel = "error" var npm_config_cache = path.resolve(__dirname, "npm_cache") process.env.npm_config_cache = exports.npm_config_cache = npm_config_cache process.env.npm_config_userconfig = exports.npm_config_userconfig = path.join(__dirname, "fixtures", "config", "userconfig") +process.env.npm_config_globalconfig = exports.npm_config_globalconfig = path.join(__dirname, "fixtures", "config", "globalconfig") process.env.random_env_var = "foo" var bin = exports.bin = require.resolve("../bin/npm-cli.js") diff --git a/deps/npm/test/disabled/outdated-depth-integer/README.md b/deps/npm/test/disabled/outdated-depth-integer/README.md deleted file mode 100644 index aca67ff17d2..00000000000 --- a/deps/npm/test/disabled/outdated-depth-integer/README.md +++ /dev/null @@ -1 +0,0 @@ -# just a test diff --git a/deps/npm/test/disabled/outdated-depth-integer/index.js b/deps/npm/test/disabled/outdated-depth-integer/index.js deleted file mode 100644 index 33c1891f81e..00000000000 --- a/deps/npm/test/disabled/outdated-depth-integer/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = true diff --git a/deps/npm/test/disabled/outdated-depth-integer/package.json b/deps/npm/test/disabled/outdated-depth-integer/package.json deleted file mode 100644 index df269dc725e..00000000000 --- a/deps/npm/test/disabled/outdated-depth-integer/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "whatever", - "description": "yeah idk", - "version": "1.2.3", - "main": "index.js", - "dependencies": { - "underscore": "1.3.1" - }, - "repository": "git://github.com/luk-/whatever" -} diff --git a/deps/npm/test/tap/add-remote-git-file.js b/deps/npm/test/tap/add-remote-git-file.js new file mode 100644 index 00000000000..ca4a33cfc8e --- /dev/null +++ b/deps/npm/test/tap/add-remote-git-file.js @@ -0,0 +1,91 @@ +var fs = require('fs') +var resolve = require('path').resolve +var url = require('url') + +var chain = require('slide').chain +var osenv = require('osenv') +var mkdirp = require('mkdirp') +var rimraf = require('rimraf') +var test = require('tap').test + +var npm = require('../../lib/npm.js') +var common = require('../common-tap.js') + +var pkg = resolve(__dirname, 'add-remote-git-file') +var repo = resolve(__dirname, 'add-remote-git-file-repo') + +var git +var cloneURL = 'git+file://' + resolve(pkg, 'child.git') + +test('setup', function (t) { + bootstrap() + setup(function (er, r) { + t.ifError(er, 'git started up successfully') + + t.end() + }) +}) + +test('cache from repo', function (t) { + process.chdir(pkg) + var addRemoteGit = require('../../lib/cache/add-remote-git.js') + addRemoteGit(cloneURL, false, function (er, data) { + t.ifError(er, 'cached via git') + t.equal( + url.parse(data._resolved).protocol, + 'git+file:', + 'npm didn\'t go crazy adding git+git+git+git' + ) + + t.end() + }) +}) + +test('clean', function (t) { + cleanup() + t.end() +}) + +var pjChild = JSON.stringify({ + name: 'child', + version: '1.0.3' +}, null, 2) + '\n' + +function bootstrap () { + cleanup() + mkdirp.sync(pkg) +} + +function setup (cb) { + mkdirp.sync(repo) + fs.writeFileSync(resolve(repo, 'package.json'), pjChild) + npm.load({ registry: common.registry, loglevel: 'silent' }, function () { + git = require('../../lib/utils/git.js') + + var opts = { + cwd: repo, + env: process.env + } + + chain( + [ + git.chainableExec(['init'], opts), + git.chainableExec(['config', 'user.name', 'PhantomFaker'], opts), + git.chainableExec(['config', 'user.email', 'nope@not.real'], opts), + git.chainableExec(['add', 'package.json'], opts), + git.chainableExec(['commit', '-m', 'stub package'], opts), + git.chainableExec( + ['clone', '--bare', repo, 'child.git'], + { cwd: pkg, env: process.env } + ) + ], + cb + ) + }) +} + +function cleanup () { + process.chdir(osenv.tmpdir()) + rimraf.sync(repo) + rimraf.sync(pkg) +} diff --git a/deps/npm/test/tap/build-already-built.js b/deps/npm/test/tap/build-already-built.js index 1de5929f434..8e5546fe4dd 100644 --- a/deps/npm/test/tap/build-already-built.js +++ b/deps/npm/test/tap/build-already-built.js @@ -10,7 +10,7 @@ var requireInject = require("require-inject") var npm = require("../../lib/npm.js") -var PKG_DIR = path.resolve(__dirname, "build-alread-built") +var PKG_DIR = path.resolve(__dirname, "build-already-built") var fakePkg = "foo" test("setup", function (t) { diff --git a/deps/npm/test/tap/graceful-restart.js b/deps/npm/test/tap/graceful-restart.js new file mode 100644 index 00000000000..bd1f3114418 --- /dev/null +++ b/deps/npm/test/tap/graceful-restart.js @@ -0,0 +1,118 @@ +var fs = require('fs') +var resolve = require('path').resolve + +var osenv = require('osenv') +var mkdirp = require('mkdirp') +var rimraf = require('rimraf') +var test = require('tap').test + +var common = require('../common-tap.js') + +var pkg = resolve(__dirname, 'graceful-restart') + +test('setup', function (t) { + bootstrap() + t.end() +}) + +test('graceless restart', function (t) { + fs.writeFileSync(resolve(pkg, 'package.json'), pjGraceless) + createChild(['run-script', 'restart'], function (err, code, out) { + t.ifError(err, 'restart finished successfully') + t.equal(code, 0, 'npm run-script exited with code') + t.equal(out, outGraceless, 'expected all scripts to run') + t.end() + }) +}) + +test('graceful restart', function (t) { + fs.writeFileSync(resolve(pkg, 'package.json'), pjGraceful) + createChild(['run-script', 'restart'], function (err, code, out) { + t.ifError(err, 'restart finished successfully') + t.equal(code, 0, 'npm run-script exited with code') + t.equal(out, outGraceful, 'expected only *restart scripts to run') + t.end() + }) +}) + +test('clean', function (t) { + cleanup() + t.end() +}) + +var outGraceless = [ + 'prerestart', + 'prestop', + 'stop', + 'poststop', + 'prestart', + 'start', + 'poststart', + 'postrestart', + '' +].join('\n') + +var outGraceful = [ + 'prerestart', + 'restart', + 'postrestart', + '' +].join('\n') + +var pjGraceless = JSON.stringify({ + name: 'graceless', + version: '1.2.3', + scripts: { + 'prestop': 'echo prestop', + 'stop': 'echo stop', + 'poststop': 'echo poststop', + 'prerestart': 'echo prerestart', + 'postrestart': 'echo postrestart', + 'prestart': 'echo prestart', + 'start': 'echo start', + 'poststart': 'echo poststart' + } +}, null, 2) + '\n' + +var pjGraceful = JSON.stringify({ + name: 'graceful', + version: '1.2.3', + scripts: { + 'prestop': 'echo prestop', + 'stop': 'echo stop', + 'poststop': 'echo poststop', + 'prerestart': 'echo prerestart', + 'restart': 'echo restart', + 'postrestart': 'echo postrestart', + 'prestart': 'echo prestart', + 'start': 'echo start', + 'poststart': 'echo poststart' + } +}, null, 2) + '\n' + +function bootstrap () { + mkdirp.sync(pkg) +} + +function cleanup () { + process.chdir(osenv.tmpdir()) + rimraf.sync(pkg) +} + +function createChild (args, cb) { + var env = { + HOME: process.env.HOME, + Path: process.env.PATH, + PATH: process.env.PATH, + 'npm_config_loglevel': 'silent' + } + + if (process.platform === 'win32') + env.npm_config_cache = '%APPDATA%\\npm-cache' + + return common.npm(args, { + cwd: pkg, + stdio: ['ignore', 'pipe', 'ignore'], + env: env + }, cb) +} diff --git a/deps/npm/test/tap/lifecycle-signal.js b/deps/npm/test/tap/lifecycle-signal.js index 9d88fbd79b8..ee56e9afc52 100644 --- a/deps/npm/test/tap/lifecycle-signal.js +++ b/deps/npm/test/tap/lifecycle-signal.js @@ -13,13 +13,6 @@ test("lifecycle signal abort", function (t) { cwd: pkg }) child.on("close", function (code, signal) { - // GNU shell returns a code, no signal - if (process.platform === "linux") { - t.equal(code, 1) - t.equal(signal, null) - return t.end() - } - t.equal(code, null) t.equal(signal, "SIGSEGV") t.end() diff --git a/deps/npm/test/tap/ls-env.js b/deps/npm/test/tap/ls-env.js new file mode 100644 index 00000000000..5ff0618f43d --- /dev/null +++ b/deps/npm/test/tap/ls-env.js @@ -0,0 +1,77 @@ +var common = require('../common-tap') +var test = require('tap').test +var path = require('path') +var rimraf = require('rimraf') +var osenv = require('osenv') +var mkdirp = require('mkdirp') +var pkg = path.resolve(__dirname, 'ls-depth') +var mr = require('npm-registry-mock') +var opts = {cwd: pkg} + +function cleanup () { + process.chdir(osenv.tmpdir()) + rimraf.sync(pkg + '/cache') + rimraf.sync(pkg + '/tmp') + rimraf.sync(pkg + '/node_modules') +} + +test('setup', function (t) { + cleanup() + mkdirp.sync(pkg + '/cache') + mkdirp.sync(pkg + '/tmp') + mr({port: common.port}, function (er, s) { + common.npm( + [ + 'install', + '--registry', common.registry + ], + opts, + function (er, c) { + t.ifError(er, 'install ran without issue') + t.equal(c, 0) + s.close() + t.end() + } + ) + }) +}) + +test('npm ls --dev', function (t) { + common.npm(['ls', '--dev'], opts, function (er, code, stdout) { + t.ifError(er, 'ls --dev ran without issue') + t.equal(code, 0) + t.has(stdout, /(empty)/, 'output contains (empty)') + t.end() + }) +}) + +test('npm ls --production', function (t) { + common.npm(['ls', '--production'], opts, function (er, code, stdout) { + t.ifError(er, 'ls --production ran without issue') + t.notOk(code, 'npm exited ok') + t.has( + stdout, + /test-package-with-one-dep@0\.0\.0/, + 'output contains test-package-with-one-dep@0.0.0' + ) + t.end() + }) +}) + +test('npm ls --prod', function (t) { + common.npm(['ls', '--prod'], opts, function (er, code, stdout) { + t.ifError(er, 'ls --prod ran without issue') + t.notOk(code, 'npm exited ok') + t.has( + stdout, + /test-package-with-one-dep@0\.0\.0/, + 'output contains test-package-with-one-dep@0.0.0' + ) + t.end() + }) +}) + +test('cleanup', function (t) { + cleanup() + t.end() +}) diff --git a/deps/npm/test/disabled/outdated-depth-integer.js b/deps/npm/test/tap/outdated-depth-integer.js similarity index 53% rename from deps/npm/test/disabled/outdated-depth-integer.js rename to deps/npm/test/tap/outdated-depth-integer.js index 4cad5e69301..485e84e30f2 100644 --- a/deps/npm/test/disabled/outdated-depth-integer.js +++ b/deps/npm/test/tap/outdated-depth-integer.js @@ -3,28 +3,53 @@ var common = require('../common-tap') , rimraf = require('rimraf') , npm = require('../../') , mr = require('npm-registry-mock') - , pkg = __dirname + '/outdated-depth' + , pkg = __dirname + '/outdated-depth-integer' + +var osenv = require("osenv") +var mkdirp = require("mkdirp") +var fs = require("fs") + +var pj = JSON.stringify({ + "name": "whatever", + "description": "yeah idk", + "version": "1.2.3", + "main": "index.js", + "dependencies": { + "underscore": "1.3.1" + }, + "repository": "git://github.com/luk-/whatever" +}, null, 2); function cleanup () { - rimraf.sync(pkg + '/node_modules') - rimraf.sync(pkg + '/cache') + process.chdir(osenv.tmpdir()) + rimraf.sync(pkg) +} + +function setup () { + mkdirp.sync(pkg) + process.chdir(pkg) + fs.writeFileSync("package.json", pj) } +test("setup", function (t) { + cleanup() + setup() + t.end() +}) + test('outdated depth integer', function (t) { // todo: update with test-package-with-one-dep once the new // npm-registry-mock is published - var expected = [ + var expected = [[ pkg, 'underscore', - '1.3.1', - '1.3.1', - '1.5.1', + undefined, // no version installed + '1.3.1', // wanted + '1.5.1', // latest '1.3.1' - ] - - process.chdir(pkg) + ]] - mr({port : common.port}, function (s) { + mr({port : common.port}, function (er, s) { npm.load({ cache: pkg + '/cache' , loglevel: 'silent' @@ -36,7 +61,7 @@ test('outdated depth integer', function (t) { if (er) throw new Error(er) npm.outdated(function (err, d) { if (err) throw new Error(err) - t.deepEqual(d[0], expected) + t.deepEqual(d, expected) s.close() t.end() }) diff --git a/deps/npm/test/tap/run-script.js b/deps/npm/test/tap/run-script.js index 6b5ce26aa48..35790684f54 100644 --- a/deps/npm/test/tap/run-script.js +++ b/deps/npm/test/tap/run-script.js @@ -1,12 +1,17 @@ -var common = require("../common-tap") - , test = require("tap").test - , path = require("path") - , rimraf = require("rimraf") - , mkdirp = require("mkdirp") - , pkg = path.resolve(__dirname, "run-script") - , cache = path.resolve(pkg, "cache") - , tmp = path.resolve(pkg, "tmp") - , opts = { cwd: pkg } +var fs = require('fs') +var path = require('path') + +var mkdirp = require('mkdirp') +var test = require('tap').test +var rimraf = require('rimraf') + +var common = require('../common-tap') + +var pkg = path.resolve(__dirname, 'run-script') +var cache = path.resolve(pkg, 'cache') +var tmp = path.resolve(pkg, 'tmp') + +var opts = { cwd: pkg } function testOutput (t, command, er, code, stdout, stderr) { var lines @@ -15,95 +20,216 @@ function testOutput (t, command, er, code, stdout, stderr) { throw er if (stderr) - throw new Error("npm " + command + " stderr: " + stderr.toString()) + throw new Error('npm ' + command + ' stderr: ' + stderr.toString()) - lines = stdout.trim().split("\n") - stdout = lines.filter(function(line) { - return line.trim() !== "" && line[0] !== ">" - }).join(";") + lines = stdout.trim().split('\n') + stdout = lines.filter(function (line) { + return line.trim() !== '' && line[0] !== '>' + }).join(';') t.equal(stdout, command) t.end() } +function writeMetadata (object) { + fs.writeFileSync( + path.resolve(pkg, 'package.json'), + JSON.stringify(object, null, 2) + '\n' + ) +} + function cleanup () { - rimraf.sync(cache) - rimraf.sync(tmp) + rimraf.sync(pkg) } -test("setup", function (t) { +test('setup', function (t) { cleanup() mkdirp.sync(cache) mkdirp.sync(tmp) + writeMetadata(fullyPopulated) t.end() }) -test("npm run-script", function (t) { - common.npm(["run-script", "start"], opts, testOutput.bind(null, t, "start")) +var fullyPopulated = { + 'name': 'runscript', + 'version': '1.2.3', + 'scripts': { + 'start': 'node -e "console.log(process.argv[1] || \'start\')"', + 'prewith-pre': 'node -e "console.log(process.argv[1] || \'pre\')"', + 'with-pre': 'node -e "console.log(process.argv[1] || \'main\')"', + 'with-post': 'node -e "console.log(process.argv[1] || \'main\')"', + 'postwith-post': 'node -e "console.log(process.argv[1] || \'post\')"', + 'prewith-both': 'node -e "console.log(process.argv[1] || \'pre\')"', + 'with-both': 'node -e "console.log(process.argv[1] || \'main\')"', + 'postwith-both': 'node -e "console.log(process.argv[1] || \'post\')"', + 'stop': 'node -e "console.log(process.argv[1] || \'stop\')"' + } +} + +var lifecycleOnly = { + name: 'scripted', + version: '1.2.3', + scripts: { + 'prestart': 'echo prestart' + } +} + +var directOnly = { + name: 'scripted', + version: '1.2.3', + scripts: { + 'whoa': 'echo whoa' + } +} + +var both = { + name: 'scripted', + version: '1.2.3', + scripts: { + 'prestart': 'echo prestart', + 'whoa': 'echo whoa' + } +} + +test('npm run-script start', function (t) { + common.npm(['run-script', 'start'], opts, testOutput.bind(null, t, 'start')) +}) + +test('npm run-script with args', function (t) { + common.npm(['run-script', 'start', '--', 'stop'], opts, testOutput.bind(null, t, 'stop')) }) -test("npm run-script with args", function (t) { - common.npm(["run-script", "start", "--", "stop"], opts, testOutput.bind(null, t, "stop")) +test('npm run-script with args that contain spaces', function (t) { + common.npm(['run-script', 'start', '--', 'hello world'], opts, testOutput.bind(null, t, 'hello world')) }) -test("npm run-script with args that contain spaces", function (t) { - common.npm(["run-script", "start", "--", "hello world"], opts, testOutput.bind(null, t, "hello world")) +test('npm run-script with args that contain single quotes', function (t) { + common.npm(['run-script', 'start', '--', 'they"re awesome'], opts, testOutput.bind(null, t, 'they"re awesome')) }) -test("npm run-script with args that contain single quotes", function (t) { - common.npm(["run-script", "start", "--", "they're awesome"], opts, testOutput.bind(null, t, "they're awesome")) +test('npm run-script with args that contain double quotes', function (t) { + common.npm(['run-script', 'start', '--', 'what"s "up"?'], opts, testOutput.bind(null, t, 'what"s "up"?')) }) -test("npm run-script with args that contain double quotes", function (t) { - common.npm(["run-script", "start", "--", "what's \"up\"?"], opts, testOutput.bind(null, t, "what's \"up\"?")) +test('npm run-script with pre script', function (t) { + common.npm(['run-script', 'with-post'], opts, testOutput.bind(null, t, 'main;post')) }) -test("npm run-script with pre script", function (t) { - common.npm(["run-script", "with-post"], opts, testOutput.bind(null, t, "main;post")) +test('npm run-script with post script', function (t) { + common.npm(['run-script', 'with-pre'], opts, testOutput.bind(null, t, 'pre;main')) }) -test("npm run-script with post script", function (t) { - common.npm(["run-script", "with-pre"], opts, testOutput.bind(null, t, "pre;main")) +test('npm run-script with both pre and post script', function (t) { + common.npm(['run-script', 'with-both'], opts, testOutput.bind(null, t, 'pre;main;post')) }) -test("npm run-script with both pre and post script", function (t) { - common.npm(["run-script", "with-both"], opts, testOutput.bind(null, t, "pre;main;post")) +test('npm run-script with both pre and post script and with args', function (t) { + common.npm(['run-script', 'with-both', '--', 'an arg'], opts, testOutput.bind(null, t, 'pre;an arg;post')) }) -test("npm run-script with both pre and post script and with args", function (t) { - common.npm(["run-script", "with-both", "--", "an arg"], opts, testOutput.bind(null, t, "pre;an arg;post")) +test('npm run-script explicitly call pre script with arg', function (t) { + common.npm(['run-script', 'prewith-pre', '--', 'an arg'], opts, testOutput.bind(null, t, 'an arg')) }) -test("npm run-script explicitly call pre script with arg", function (t) { - common.npm(["run-script", "prewith-pre", "--", "an arg"], opts, testOutput.bind(null, t, "an arg")) +test('npm run-script test', function (t) { + common.npm(['run-script', 'test'], opts, function (er, code, stdout, stderr) { + t.ifError(er, 'npm run-script test ran without issue') + t.notOk(stderr, 'should not generate errors') + t.end() + }) +}) + +test('npm run-script env', function (t) { + common.npm(['run-script', 'env'], opts, function (er, code, stdout, stderr) { + t.ifError(er, 'using default env script') + t.notOk(stderr, 'should not generate errors') + t.ok(stdout.indexOf('npm_config_init_version') > 0, 'expected values in var list') + t.end() + }) +}) + +test('npm run-script nonexistent-script', function (t) { + common.npm(['run-script', 'nonexistent-script'], opts, function (er, code, stdout, stderr) { + t.ifError(er, 'npm run-script nonexistent-script did not cause npm to explode') + t.ok(stderr, 'should generate errors') + t.end() + }) +}) + +test('npm run-script restart when there isn\'t restart', function (t) { + common.npm(['run-script', 'restart'], opts, testOutput.bind(null, t, 'stop;start')) +}) + +test('npm run-script nonexistent-script with --if-present flag', function (t) { + common.npm(['run-script', '--if-present', 'nonexistent-script'], opts, function (er, code, stdout, stderr) { + t.ifError(er, 'npm run-script --if-present non-existent-script ran without issue') + t.notOk(stderr, 'should not generate errors') + t.end() + }) }) -test("npm run-script test", function (t) { - common.npm(["run-script", "test"], opts, function (er, code, stdout, stderr) { - t.ifError(er, "npm run-script test ran without issue") - t.notOk(stderr, "should not generate errors") +test('npm run-script no-params (lifecycle only)', function (t) { + var expected = [ + 'Lifecycle scripts included in scripted:', + ' prestart', + ' echo prestart', + '' + ].join('\n') + + writeMetadata(lifecycleOnly) + + common.npm(['run-script'], opts, function (err, code, stdout, stderr) { + t.ifError(err, 'ran run-script without parameters without crashing') + t.notOk(code, 'npm exited without error code') + t.notOk(stderr, 'npm printed nothing to stderr') + t.equal(stdout, expected, 'got expected output') t.end() }) }) -test("npm run-script env", function (t) { - common.npm(["run-script", "env"], opts, function (er, code, stdout, stderr) { - t.ifError(er, "using default env script") - t.notOk(stderr, "should not generate errors") - t.ok( stdout.indexOf("npm_config_init_version") > 0, "expected values in var list" ) +test('npm run-script no-params (direct only)', function (t) { + var expected = [ + 'Scripts available in scripted via `npm run-script`:', + ' whoa', + ' echo whoa', + '' + ].join('\n') + + writeMetadata(directOnly) + + common.npm(['run-script'], opts, function (err, code, stdout, stderr) { + t.ifError(err, 'ran run-script without parameters without crashing') + t.notOk(code, 'npm exited without error code') + t.notOk(stderr, 'npm printed nothing to stderr') + t.equal(stdout, expected, 'got expected output') t.end() }) }) -test("npm run-script nonexistent-script", function (t) { - common.npm(["run-script", "nonexistent-script"], opts, function (er, code, stdout, stderr) { - t.ifError(er, "npm run-script nonexistent-script did not cause npm to explode") - t.ok(stderr, "should generate errors") +test('npm run-script no-params (direct only)', function (t) { + var expected = [ + 'Lifecycle scripts included in scripted:', + ' prestart', + ' echo prestart', + '', + 'available via `npm run-script`:', + ' whoa', + ' echo whoa', + '' + ].join('\n') + + writeMetadata(both) + + common.npm(['run-script'], opts, function (err, code, stdout, stderr) { + t.ifError(err, 'ran run-script without parameters without crashing') + t.notOk(code, 'npm exited without error code') + t.notOk(stderr, 'npm printed nothing to stderr') + t.equal(stdout, expected, 'got expected output') t.end() }) }) -test("cleanup", function (t) { +test('cleanup', function (t) { cleanup() t.end() }) diff --git a/deps/npm/test/tap/run-script/package.json b/deps/npm/test/tap/run-script/package.json deleted file mode 100644 index ebaffefe029..00000000000 --- a/deps/npm/test/tap/run-script/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{"name":"runscript" -,"version":"1.2.3" -,"scripts":{ - "start":"node -e \"console.log(process.argv[1] || 'start')\"", - "prewith-pre":"node -e \"console.log(process.argv[1] || 'pre')\"", - "with-pre":"node -e \"console.log(process.argv[1] || 'main')\"", - "with-post":"node -e \"console.log(process.argv[1] || 'main')\"", - "postwith-post":"node -e \"console.log(process.argv[1] || 'post')\"", - "prewith-both":"node -e \"console.log(process.argv[1] || 'pre')\"", - "with-both":"node -e \"console.log(process.argv[1] || 'main')\"", - "postwith-both":"node -e \"console.log(process.argv[1] || 'post')\"" - } -} diff --git a/deps/npm/test/tap/shrinkwrap-dev-dependency.js b/deps/npm/test/tap/shrinkwrap-dev-dependency.js index 379a0d908c3..14eebf19f16 100644 --- a/deps/npm/test/tap/shrinkwrap-dev-dependency.js +++ b/deps/npm/test/tap/shrinkwrap-dev-dependency.js @@ -14,7 +14,7 @@ test("shrinkwrap doesn't strip out the dependency", function (t) { t.plan(1) mr({port : common.port}, function (er, s) { - setup({ production: true }, function (err) { + setup({}, function (err) { if (err) return t.fail(err) npm.install(".", function (err) { diff --git a/deps/npm/test/tap/update-examples.js b/deps/npm/test/tap/update-examples.js new file mode 100644 index 00000000000..2349e253291 --- /dev/null +++ b/deps/npm/test/tap/update-examples.js @@ -0,0 +1,188 @@ +var common = require('../common-tap.js') +var test = require('tap').test +var npm = require('../../lib/npm.js') +var mkdirp = require('mkdirp') +var rimraf = require('rimraf') +var path = require('path') +var mr = require('npm-registry-mock') + +var osenv = require('osenv') + +var requireInject = require('require-inject') + +var PKG_DIR = path.resolve(__dirname, 'update-examples') +var CACHE_DIR = path.resolve(PKG_DIR, 'cache') + +// ** constant templates for mocks ** +var DEFAULT_PKG = { + 'name': 'update-examples', + 'version': '1.2.3', + 'dependencies': { + 'dep1': '*' + } +} + +var DEP_PKG = { + name: 'dep1', + version: '1.1.1', + _from: '^1.1.1' +} + +var INSTALLED = { + dependencies: { + 'dep1': '1.1.1' + } +} + +var DEP1_REGISTRY = { name: 'dep1', + 'dist-tags': { latest: '1.2.2' }, + versions: { + '1.2.2': { version: '1.2.2' }, + '1.2.1': { version: '1.2.1' }, + '1.2.0': { version: '1.2.0' }, + '1.1.2': { version: '1.1.2' }, + '1.1.1': { version: '1.1.1' }, + '1.0.0': { version: '1.0.0' }, + '0.4.1': { version: '0.4.1' }, + '0.4.0': { version: '0.4.0' }, + '0.2.0': { version: '0.2.0' } + } +} + +var registryMocks = { + 'get': { + '/dep1': [200, DEP1_REGISTRY] + } +} + +// ** dynamic mocks, cloned from templates and modified ** +var mockServer +var mockDepJson = clone(DEP_PKG) +var mockInstalled = clone(INSTALLED) +var mockParentJson = clone(DEFAULT_PKG) + +// target +var installAskedFor + +function clone (a) { + return extend({}, a) +} + +function extend (a, b) { + for (var key in b) { + a[key] = b[key] + } + return a +} + +function resetPackage (options) { + rimraf.sync(CACHE_DIR) + mkdirp.sync(CACHE_DIR) + + installAskedFor = undefined + + mockParentJson = clone(DEFAULT_PKG) + mockInstalled = clone(INSTALLED) + mockDepJson = clone(DEP_PKG) + + if (options.wanted) { + mockParentJson.dependencies.dep1 = options.wanted + mockDepJson._from = options.wanted + } + + if (options.installed) { + mockInstalled.dependencies.dep1 = options.installed + mockDepJson.version = options.installed + } +} + +function mockReadInstalled (dir, opts, cb) { + cb(null, mockInstalled) +} + +function mockReadJson (file, cb) { + cb(null, file.match(/dep1/) ? mockDepJson : mockParentJson) +} + +function mockCommand (npm, name, fn) { + delete npm.commands[name] + npm.commands[name] = fn +} + +test('setup', function (t) { + process.chdir(osenv.tmpdir()) + mkdirp.sync(PKG_DIR) + process.chdir(PKG_DIR) + + resetPackage({}) + + mr({ port: common.port, mocks: registryMocks }, function (er, server) { + npm.load({ cache: CACHE_DIR, + registry: common.registry, + cwd: PKG_DIR }, function (err) { + t.ifError(err, 'started server') + mockServer = server + + mockCommand(npm, 'install', function mockInstall (where, what, cb) { + installAskedFor = what + cb(null) + }) + + mockCommand(npm, 'outdated', requireInject('../../lib/outdated', { + 'read-installed': mockReadInstalled, + 'read-package-json': mockReadJson + })) + + t.end() + }) + }) +}) + +test('update caret dependency to latest', function (t) { + resetPackage({ wanted: '^1.1.1' }) + + npm.commands.update([], function (err) { + t.ifError(err) + t.equal('dep1@1.2.2', installAskedFor, 'should want to install dep@1.2.2') + t.end() + }) +}) + +test('update tilde dependency to latest', function (t) { + resetPackage({ wanted: '~1.1.1' }) + + npm.commands.update([], function (err) { + t.ifError(err) + t.equal('dep1@1.1.2', installAskedFor, 'should want to install dep@1.1.2') + t.end() + }) +}) + +test('update old caret dependency with no newer', function (t) { + resetPackage({ wanted: '^0.2.0', installed: '^0.2.0' }) + + npm.commands.update([], function (err) { + t.ifError(err) + t.equal('dep1@0.2.0', installAskedFor, 'should want to install dep@0.2.0') + t.end() + }) +}) + +test('update old caret dependency with newer', function (t) { + resetPackage({ wanted: '^0.4.0', installed: '^0.4.0' }) + + npm.commands.update([], function (err) { + t.ifError(err) + t.equal('dep1@0.4.1', installAskedFor, 'should want to install dep@0.4.1') + t.end() + }) +}) + +test('cleanup', function (t) { + mockServer.close() + + process.chdir(osenv.tmpdir()) + rimraf.sync(PKG_DIR) + + t.end() +}) From 51fe319faf4399fd027f8b32d1c425200b911e44 Mon Sep 17 00:00:00 2001 From: Tyler Anton Date: Sat, 7 Mar 2015 21:52:18 -0500 Subject: [PATCH 06/13] docs: add return value for sync fs functions Clarify that synchronous functions in fs with no return value return undefined. Specify that fs.openSync() returns an integer and fs.existsSync() returns true or false. Fixes #9313 PR: #9359 PR-URL: https://github.com/joyent/node/pull/9359 Reviewed-By: Julien Gilli --- doc/api/fs.markdown | 53 ++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/doc/api/fs.markdown b/doc/api/fs.markdown index f886b73dc7e..56d66ba4e96 100644 --- a/doc/api/fs.markdown +++ b/doc/api/fs.markdown @@ -77,7 +77,7 @@ to the completion callback. ## fs.renameSync(oldPath, newPath) -Synchronous rename(2). +Synchronous rename(2). Returns `undefined`. ## fs.ftruncate(fd, len, callback) @@ -86,7 +86,7 @@ given to the completion callback. ## fs.ftruncateSync(fd, len) -Synchronous ftruncate(2). +Synchronous ftruncate(2). Returns `undefined`. ## fs.truncate(path, len, callback) @@ -95,7 +95,7 @@ given to the completion callback. ## fs.truncateSync(path, len) -Synchronous truncate(2). +Synchronous truncate(2). Returns `undefined`. ## fs.chown(path, uid, gid, callback) @@ -104,7 +104,7 @@ to the completion callback. ## fs.chownSync(path, uid, gid) -Synchronous chown(2). +Synchronous chown(2). Returns `undefined`. ## fs.fchown(fd, uid, gid, callback) @@ -113,7 +113,7 @@ to the completion callback. ## fs.fchownSync(fd, uid, gid) -Synchronous fchown(2). +Synchronous fchown(2). Returns `undefined`. ## fs.lchown(path, uid, gid, callback) @@ -122,7 +122,7 @@ to the completion callback. ## fs.lchownSync(path, uid, gid) -Synchronous lchown(2). +Synchronous lchown(2). Returns `undefined`. ## fs.chmod(path, mode, callback) @@ -131,7 +131,7 @@ to the completion callback. ## fs.chmodSync(path, mode) -Synchronous chmod(2). +Synchronous chmod(2). Returns `undefined`. ## fs.fchmod(fd, mode, callback) @@ -140,7 +140,7 @@ are given to the completion callback. ## fs.fchmodSync(fd, mode) -Synchronous fchmod(2). +Synchronous fchmod(2). Returns `undefined`. ## fs.lchmod(path, mode, callback) @@ -151,7 +151,7 @@ Only available on Mac OS X. ## fs.lchmodSync(path, mode) -Synchronous lchmod(2). +Synchronous lchmod(2). Returns `undefined`. ## fs.stat(path, callback) @@ -191,7 +191,7 @@ the completion callback. ## fs.linkSync(srcpath, dstpath) -Synchronous link(2). +Synchronous link(2). Returns `undefined`. ## fs.symlink(srcpath, dstpath, [type], callback) @@ -204,7 +204,7 @@ Note that Windows junction points require the destination path to be absolute. ## fs.symlinkSync(srcpath, dstpath, [type]) -Synchronous symlink(2). +Synchronous symlink(2). Returns `undefined`. ## fs.readlink(path, callback) @@ -241,7 +241,7 @@ to the completion callback. ## fs.unlinkSync(path) -Synchronous unlink(2). +Synchronous unlink(2). Returns `undefined`. ## fs.rmdir(path, callback) @@ -250,7 +250,7 @@ to the completion callback. ## fs.rmdirSync(path) -Synchronous rmdir(2). +Synchronous rmdir(2). Returns `undefined`. ## fs.mkdir(path, [mode], callback) @@ -259,7 +259,7 @@ to the completion callback. `mode` defaults to `0777`. ## fs.mkdirSync(path, [mode]) -Synchronous mkdir(2). +Synchronous mkdir(2). Returns `undefined`. ## fs.readdir(path, callback) @@ -279,7 +279,7 @@ to the completion callback. ## fs.closeSync(fd) -Synchronous close(2). +Synchronous close(2). Returns `undefined`. ## fs.open(path, flags, [mode], callback) @@ -340,19 +340,27 @@ the end of the file. ## fs.openSync(path, flags, [mode]) -Synchronous version of `fs.open()`. +Synchronous version of `fs.open()`. Returns an integer representing the file +descriptor. ## fs.utimes(path, atime, mtime, callback) -## fs.utimesSync(path, atime, mtime) Change file timestamps of the file referenced by the supplied path. +## fs.utimesSync(path, atime, mtime) + +Synchronous version of `fs.utimes()`. Returns `undefined`. + + ## fs.futimes(fd, atime, mtime, callback) -## fs.futimesSync(fd, atime, mtime) Change the file timestamps of a file referenced by the supplied file descriptor. +## fs.futimesSync(fd, atime, mtime) + +Synchronous version of `fs.futimes()`. Returns `undefined`. + ## fs.fsync(fd, callback) Asynchronous fsync(2). No arguments other than a possible exception are given @@ -360,7 +368,7 @@ to the completion callback. ## fs.fsyncSync(fd) -Synchronous fsync(2). +Synchronous fsync(2). Returns `undefined`. ## fs.write(fd, buffer, offset, length, position, callback) @@ -461,7 +469,7 @@ Example: ## fs.writeFileSync(filename, data, [options]) -The synchronous version of `fs.writeFile`. +The synchronous version of `fs.writeFile`. Returns `undefined`. ## fs.appendFile(filename, data, [options], callback) @@ -485,7 +493,7 @@ Example: ## fs.appendFileSync(filename, data, [options]) -The synchronous version of `fs.appendFile`. +The synchronous version of `fs.appendFile`. Returns `undefined`. ## fs.watchFile(filename, [options], listener) @@ -605,7 +613,8 @@ and handle the error when it's not there. ## fs.existsSync(path) -Synchronous version of `fs.exists`. +Synchronous version of `fs.exists()`. Returns `true` if the file exists, +`false` otherwise. ## Class: fs.Stats From f2a45caf2e1b73fea01fa9a941bc61096a999664 Mon Sep 17 00:00:00 2001 From: Jonas Dohse Date: Mon, 9 Mar 2015 15:27:04 -0700 Subject: [PATCH 07/13] domains: fix stack clearing after error handled caeb67735baa8e069902e23f21d01033907c4f33 introduced a regression where the domains stack would not be cleared after an error had been handled by the top-level domain. This change clears the domains stack regardless of the position of the active domain in the stack. PR: #9364 PR-URL: https://github.com/joyent/node/pull/9364 Reviewed-By: Trevor Norris Reviewed-By: Julien Gilli --- src/node.js | 20 +++++---- ...in-top-level-error-handler-clears-stack.js | 41 +++++++++++++++++++ 2 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 test/simple/test-domain-top-level-error-handler-clears-stack.js diff --git a/src/node.js b/src/node.js index e95a01fb492..ab560405fa4 100644 --- a/src/node.js +++ b/src/node.js @@ -216,6 +216,14 @@ return startup._lazyConstants; }; + function _clearDomainsStack() { + var domainModule = NativeModule.require('domain'); + var domainStack = domainModule._stack; + domainStack.length = 0; + domainModule.active = null; + process.domain = null; + } + startup.processFatal = function() { // call into the active domain, or emit uncaughtException, // and exit if there are no listeners. @@ -268,13 +276,6 @@ // If caught is false after this, then there's no need to exit() // the domain, because we're going to crash the process anyway. caught = domain.emit('error', er); - - // Exit all domains on the stack. Uncaught exceptions end the - // current tick and no domains should be left on the stack - // between ticks. - var domainModule = NativeModule.require('domain'); - domainStack.length = 0; - domainModule.active = process.domain = null; } catch (er2) { // The domain error handler threw! oh no! // See if another domain can catch THIS error, @@ -291,6 +292,11 @@ } } } + + // Exit all domains on the stack. Uncaught exceptions end the + // current tick and no domains should be left on the stack + // between ticks. + _clearDomainsStack(); } else { caught = process.emit('uncaughtException', er); } diff --git a/test/simple/test-domain-top-level-error-handler-clears-stack.js b/test/simple/test-domain-top-level-error-handler-clears-stack.js new file mode 100644 index 00000000000..f95864da64e --- /dev/null +++ b/test/simple/test-domain-top-level-error-handler-clears-stack.js @@ -0,0 +1,41 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var assert = require('assert'); +var domain = require('domain'); + +/* + * Make sure that the domains stack is cleared after a top-level domain + * error handler exited gracefully. + */ +var d = domain.create(); + +d.on('error', function() { + process.nextTick(function() { + if (domain._stack.length !== 1) { + process.exit(1); + } + }); +}); + +d.run(function() { + throw new Error('Error from domain'); +}); From a33f23cbbcd68c0f534d874052311672d0dcaf5d Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Wed, 11 Mar 2015 07:28:05 -0700 Subject: [PATCH 08/13] buffer: align chunks on 8-byte boundary When slicing global pool - ensure that the underlying buffer's data ptr is 8-byte alignment to do not ruin expectations of 3rd party C++ addons. NOTE: 0.10 node.js always returned aligned pointers and v0.12 should do this too for compatibility. PR-URL: https://github.com/joyent/node/pull/9375 Reviewed-By: Trevor Norris --- lib/buffer.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/buffer.js b/lib/buffer.js index dd6f7a37abe..1a9f7caeb5a 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -86,6 +86,12 @@ function Buffer(subject, encoding) { poolOffset, poolOffset + this.length); poolOffset += this.length; + + // Ensure aligned slices + if (poolOffset & 0x7) { + poolOffset |= 0x7; + poolOffset++; + } } else { alloc(this, this.length); } From 219c80d0996304ebb98383eb7eeead2135e37f15 Mon Sep 17 00:00:00 2001 From: Julien Gilli Date: Wed, 11 Mar 2015 11:45:57 -0700 Subject: [PATCH 09/13] build: allow custom PackageMaker path Make PACKAGEMAKER customizable because PackageMaker is not necessarily installed in /Developer on OSX anymore. PR: #9377 PR-URL: https://github.com/joyent/node/pull/9377 Reviewed-By: Timothy J Fontaine --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index e1af3c81d08..ceb4ef76671 100644 --- a/Makefile +++ b/Makefile @@ -223,7 +223,7 @@ TARBALL=$(TARNAME).tar.gz BINARYNAME=$(TARNAME)-$(PLATFORM)-$(ARCH) BINARYTAR=$(BINARYNAME).tar.gz PKG=out/$(TARNAME).pkg -packagemaker=/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker +PACKAGEMAKER ?= /Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker PKGSRC=nodejs-$(DESTCPU)-$(RAWVER).tgz ifdef NIGHTLY @@ -273,7 +273,7 @@ $(PKG): release-only -create mv $(PKGDIR)/usr/local/bin/node-universal $(PKGDIR)/usr/local/bin/node rm -rf $(PKGDIR)/32 - $(packagemaker) \ + $(PACKAGEMAKER) \ --id "org.nodejs.Node" \ --doc tools/osx-pkg.pmdoc \ --out $(PKG) From 7d6b5b1d5ba726331f9ccaaae59af7cd53eee82e Mon Sep 17 00:00:00 2001 From: Julien Gilli Date: Wed, 11 Mar 2015 11:31:30 -0700 Subject: [PATCH 10/13] 2015.03.11, Version 0.10.37 (Maintenance) * uv: update to 0.10.36 (CVE-2015-0278) * domains: fix stack clearing after error handled (Jonas Dohse) * buffer: reword Buffer.concat error message (Chris Dickinson) * console: allow Object.prototype fields as labels (Julien Gilli) * V8: log version in profiler log file (Ben Noordhuis) * http: fix performance regression for GET requests (Florin-Cristian Gavrila) --- AUTHORS | 4 ++++ ChangeLog | 17 ++++++++++++++++- src/node_version.h | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index a3071d1f80a..aab71df334e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -526,3 +526,7 @@ Saúl Ibarra Corretgé silverwind Steven R. Loomis James M Snell +Amir Saboury +Florin-Cristian Gavrila +Tyler Anton +Jonas Dohse diff --git a/ChangeLog b/ChangeLog index 9d5cae1b552..0bdd5e45e23 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,19 @@ -2015.01.26, Version 0.10.36 (Stable) +2015.03.11, Version 0.10.37 (Maintenance) + +* uv: update to 0.10.36 (CVE-2015-0278) + +* domains: fix stack clearing after error handled (Jonas Dohse) + +* buffer: reword Buffer.concat error message (Chris Dickinson) + +* console: allow Object.prototype fields as labels (Julien Gilli) + +* V8: log version in profiler log file (Ben Noordhuis) + +* http: fix performance regression for GET requests (Florin-Cristian Gavrila) + + +2015.01.26, Version 0.10.36 (Stable), 09b482886bdd3d863c3d4e7d71264eac0daaf9e1 * openssl: update to 1.0.1l diff --git a/src/node_version.h b/src/node_version.h index 6baad291a9c..684d7ec5d56 100644 --- a/src/node_version.h +++ b/src/node_version.h @@ -26,7 +26,7 @@ #define NODE_MINOR_VERSION 10 #define NODE_PATCH_VERSION 37 -#define NODE_VERSION_IS_RELEASE 0 +#define NODE_VERSION_IS_RELEASE 1 #ifndef NODE_TAG # define NODE_TAG "" From 4332c77bf7fd5f780fcdac5cac24a876883d8840 Mon Sep 17 00:00:00 2001 From: Julien Gilli Date: Wed, 11 Mar 2015 21:13:15 -0700 Subject: [PATCH 11/13] Now working on 0.10.38 --- src/node_version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/node_version.h b/src/node_version.h index 684d7ec5d56..7ff6b5f28d1 100644 --- a/src/node_version.h +++ b/src/node_version.h @@ -24,9 +24,9 @@ #define NODE_MAJOR_VERSION 0 #define NODE_MINOR_VERSION 10 -#define NODE_PATCH_VERSION 37 +#define NODE_PATCH_VERSION 38 -#define NODE_VERSION_IS_RELEASE 1 +#define NODE_VERSION_IS_RELEASE 0 #ifndef NODE_TAG # define NODE_TAG "" From e8b21095670543ad6ee8e24e0a1b096b908e20b1 Mon Sep 17 00:00:00 2001 From: Alexis Campailla Date: Tue, 10 Mar 2015 13:25:31 +0100 Subject: [PATCH 12/13] test: update flaky test definitions test-fs-watch is flaky on OSX. --- test/simple/simple.status | 1 + 1 file changed, 1 insertion(+) diff --git a/test/simple/simple.status b/test/simple/simple.status index 8a0cbfb3cb8..4915a029b68 100644 --- a/test/simple/simple.status +++ b/test/simple/simple.status @@ -14,5 +14,6 @@ test-stdin-script-child : PASS,FLAKY test-util-debug : PASS,FLAKY [$system==macos] +test-fs-watch : PASS,FLAKY [$system==solaris] From 588c009781d84a523fd84bb5feb66fa074849427 Mon Sep 17 00:00:00 2001 From: Julien Gilli Date: Mon, 17 Nov 2014 12:00:11 -0800 Subject: [PATCH 13/13] make: remove node_dtrace from cpplint excludes Reviewed-By: Fedor Indutny PR-URL: https://github.com/joyent/node/pull/8741 --- Makefile | 2 -- src/node_dtrace.cc | 11 +++++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 6c148eb2cda..c241480dfc5 100644 --- a/Makefile +++ b/Makefile @@ -425,8 +425,6 @@ jslint: PYTHONPATH=tools/closure_linter/ $(PYTHON) tools/closure_linter/closure_linter/gjslint.py --unix_mode --strict --nojsdoc -r lib/ -r src/ --exclude_files lib/punycode.js CPPLINT_EXCLUDE ?= -CPPLINT_EXCLUDE += src/node_dtrace.cc -CPPLINT_EXCLUDE += src/node_dtrace.cc CPPLINT_EXCLUDE += src/node_root_certs.h CPPLINT_EXCLUDE += src/node_win32_perfctr_provider.cc CPPLINT_EXCLUDE += src/queue.h diff --git a/src/node_dtrace.cc b/src/node_dtrace.cc index 6e5e31083f3..8acff394717 100644 --- a/src/node_dtrace.cc +++ b/src/node_dtrace.cc @@ -19,16 +19,11 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. - -#include "util.h" +#include "node_dtrace.h" #ifdef HAVE_DTRACE -#include "node_dtrace.h" #include "node_provider.h" -#include #elif HAVE_ETW -#include "node_dtrace.h" -#include #include "node_win32_etw_provider.h" #include "node_win32_etw_provider-inl.h" #else @@ -55,6 +50,10 @@ #include "env.h" #include "env-inl.h" +#include "util.h" + +#include + namespace node { using v8::FunctionCallbackInfo;